很多时候,应用程序需要判断用户所运行的Windows系统的版本。
BOOL GetVersionEx(POSVERSIONINFOEX pVersionInformation);
这个函数要求你在自己的应用程序中分配一个OSVERSIONINFOEX结构,并把此结构的地址传给GetVersionEx。OSVERSIONINFOEX结构如下所示:
typedef struct {
DWORD dwOSVersionInfoSize;
DWORD dwMajorVersion;
DWORD dwMinorVersion;
DWORD dwBuildNumber;
DWORD dwPlatformId;
TCHAR szCSDVersion[128];
WORD wServicePackMajor;
WORD wServicePackMinor;
WORD wSuiteMask;
BYTE wProductType;
BYTE wReserved;
} OSVERSIONINFOEX, *POSVERSIONINFOEX;
为了进一步简化编程,从Windows Vista之后还提供了VerifyVersionInfo函数,它能比较主机系统的版 本和应用程序要求的版本,如下所示:
BOOL VerifyVersionInfo(
POSVERSIONINFOEX pVersionInformation,
DWORD dwTypeMask,
DWORDLONG dwlConditionMask);
要使用此函数,必须分配一个OSVERSIONINFOEX结构,将它的dwOSVersionInfoSize成员初始化为结构的大小,然后初始化结构中对你的应用程序而言很重要的其他任何成员。调用VerifyVersionInfo时,dwTypeMask参数指出你初始化了此结构中的哪些成员。dwTypeMask参数是以下任何标志通过按位OR运算组合起来的结果: VER_MINORVERSION ,VER_MAJORVERSION ,VER_BUILDNUMBER ,VER_PLATFORMID ,VER_SERVICEPACKMINOR ,VER_SERVICEPACKMAJOR ,VER_SUITENAME 和 VER_PRODUCT_TYPE 。最后一个参数是dwlConditionMask,它是一个64位值,决定了函数 如何将系统的版本信息与你希望的版本信息进行比较。
dwlConditionMask使用一套复杂的位组合对比较方式进行了描述。为了创建恰当的位组合,可 以使用VER_SET_CONDITION宏:
VER_SET_CONDITION(
DWORDLONG dwlConditionMask,
ULONG dwTypeBitMask,
ULONG dwConditionMask)
第一个参数dwlConditionMask表示你正在对它的位进行操纵的变量。注意,不要传入这个变量 的地址,因为VER_SET_CONDITION是一个宏,而不是一个函数。dwTypeBitMask参数指出 OSVERSIONINFOEX 结构中想比较的一个成员。为了比较多个成员,必须多次调用 VER_SET_CONDITION ,为每个成员都调用一次。向VerifyVersionInfo 的参数(VER_MINORVERSION 、 VER_BUILDNUMBER 等等 ) 传递的标志与你为 VER_SET_CONDITION的dwTypeBitMask参数使用的标志是一样的。
VER_SET_CONDITION 的最后一个参数是dwConditionMask,它指出你想如何进行比较。它 可以是下面这些值之一:VER_EQUAL ,VER_GREATER ,VER_GREATER_EQUAL,VER_LESS或VER_LESS_EQUAL 。注意,在比较VER_PRODUCT_TYPE信息的时候,你可 以使用这些值。例如, VER_NT_WORKSTATION 小于VER_NT_SERVER 。不过,对于 VER_SUITENAME信息,就不能执行这种测试。相反,必须使用VER_AND (所有suite产品都必须安装)或VER_OR(至少安装了其中的一个suite产品)。
建立了一组条件之后,就可以调用VerifyVersionInfo 。如果成功(主机系统满足你的应用程序 的所有要求),它将返回一个非零的值。如果VerifyVersionInfo返回0,就表明主机系统不符合 要求,或者表明调用函数的方式不正确。可以通过调用GetLastError来判断函数为什么返回0。如果GetLastError返回ERROR_OLD_WIN_VERSION,表明函数调用是正确的,但系统不符合应用程序的要求。
下面的例子展示了如何测试主机系统是不是Windows xp sp3:
#include <windows.h>
#include <stdio.h>
#include <TCHAR.h>
int main(void)
{
OSVERSIONINFOEX osver;
osver.dwOSVersionInfoSize = sizeof(osver);
osver.dwMajorVersion = 5;
osver.dwMinorVersion = 1;
osver.dwPlatformId = VER_PLATFORM_WIN32_NT;
osver.wServicePackMajor = 3;
osver.wServicePackMinor = 0;
int op = VER_EQUAL;
DWORDLONG dwlConditionMask = 0;
VER_SET_CONDITION(dwlConditionMask, VER_MAJORVERSION, op);
VER_SET_CONDITION(dwlConditionMask, VER_MINORVERSION, op);
VER_SET_CONDITION(dwlConditionMask, VER_PLATFORMID, op);
VER_SET_CONDITION(dwlConditionMask, VER_SERVICEPACKMAJOR, op);
VER_SET_CONDITION(dwlConditionMask, VER_SERVICEPACKMINOR ,op);
if (VerifyVersionInfo(&osver, VER_MAJORVERSION | VER_MINORVERSION | VER_PLATFORMID |VER_SERVICEPACKMAJOR|VER_SERVICEPACKMINOR,
dwlConditionMask)) {
_tprintf(TEXT("xp sp3\n"));
}
else {
_tprintf(TEXT("not xp sp3\n"));
}
system("pause");
return 0;
}