直接来干货,说到获取Windows版本,在XP和windows7时代,通常使用的做法如下:
OSVERSIONINFOEX os;
os.dwOSVersionInfoSize=sizeof(OSVERSIONINFOEX);
if(GetVersionEx((OSVERSIONINFO *)&os))
{
double i = os.dwMajorVersion + os.dwMinorVersion * 0.1;
if(i < 6) //WIN7以下的系统
//do something....
}
这里其实是通过os.dwMajorVersion和os.dwMinorVersion来判断版本号的,XP的版本号是5.1,win7是6.1。
本身这种方法也没什么问题,但是到了win8和win10时代,抓瞎了,通过这种方式获取出来的版本号,win7及以上都是6.1了,于是微软告诉你,我们提供了新的API来识别版本号,这个API存在于windowsSDK8.1里面,新的API的名字叫:
IsWindowsXPOrGreater();
IsWindowsXPSP1OrGreater();
IsWindowsXPSP2OrGreater();
IsWindowsXPSP3OrGreater();
IsWindowsVistaOrGreater();
IsWindows7OrGreater();
IsWindows7SP1OrGreater();
IsWindows8OrGreater();
……..
从名字上来看,确实通俗易懂,使用起来非常方便,这些API都存在于VersionHelpers.h这个头文件里面,加入就可以调用了,然而,你以为这样就完了?太天真了!这个头文件在XP下根本无法调用,也就是说,如果你想你的程序可以在XP下运行,根本就不能使用这些API!编译的时候就会报错,如下:
fatal error C1083: 无法打开包括文件: “VersionHelpers.h”: No such file or directory
怎么办?别急,我们继续往下看,分析下新的API到底是调用的什么函数,通过查看SDK,发下:
IsWindows7OrGreater()
{
return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN7), LOBYTE(_WIN32_WINNT_WIN7), 0); //调用的IsWindowsVersionOrGreater函数
}
IsWindowsVersionOrGreater(WORD wMajorVersion, WORD wMinorVersion, WORD wServicePackMajor)
{
OSVERSIONINFOEXW osvi = { sizeof(osvi), 0, 0, 0, 0, {0}, 0, 0 };
DWORDLONG const dwlConditionMask = VerSetConditionMask(
VerSetConditionMask(
VerSetConditionMask(
0, VER_MAJORVERSION, VER_GREATER_EQUAL),
VER_MINORVERSION, VER_GREATER_EQUAL),
VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL);
osvi.dwMajorVersion = wMajorVersion;
osvi.dwMinorVersion = wMinorVersion;
osvi.wServicePackMajor = wServicePackMajor;
return VerifyVersionInfoW(&osvi, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR, dwlConditionMask) != FALSE;
} //调用的VerifyVersionInfoW函数
//
再查VerifyVersionInfoW,发现Windows7.1和windows8.1的SDK均包含这个函数,也就是说,可以直接通过调用这个函数来实现同样的功能。(此函数只能通过入参来判断当前的Windows版本是否和输入的参数需要的版本值一致,返回为BOOL类型)
这个函数的详细参数和用法就参见微软的官方说明了:
VerifyVersionInfo function
这里给出一个调用示例:
OSVERSIONINFOEXW osvi = {0};
DWORDLONG dwlConditionMask = 0;
ZeroMemory(&osvi, sizeof(osvi));
osvi.dwOSVersionInfoSize = sizeof(osvi);
osvi.dwMajorVersion = 6; //win主版本号
osvi.dwMinorVersion = 1; //次版本号
VER_SET_CONDITION(dwlConditionMask, VER_MAJORVERSION, VER_EQUAL);
VER_SET_CONDITION(dwlConditionMask, VER_MINORVERSION, VER_EQUAL);
if(::VerifyVersionInfoW(&osvi, VER_MAJORVERSION | VER_MINORVERSION, dwlConditionMask)) //判断返回值是否为win7,返回真为win7,否则返回0
//do something...
else
//do something...
这里给出主流版本的主版本号和此版本号对照:
Operating system Version number
Windows 10 10.0*
Windows Server 2016 10.0*
Windows 8.1 6.3*
Windows Server 2012 R2 6.3*
Windows 8 6.2
Windows Server 2012 6.2
Windows 7 6.1
Windows Server 2008 R2 6.1
Windows Server 2008 6.0
Windows Vista 6.0
Windows Server 2003 R2 5.2
Windows Server 2003 5.2
Windows XP 64-Bit Edition 5.2
Windows XP 5.1
Windows 2000 5.0