winston 发表于 2012-3-17 22:41:38

《Windows核心编程》学习笔记(7)– 系统版本

很多时候,应用程序需要判断用户所运行的Windows系统的版本。BOOL GetVersionEx(POSVERSIONINFOEX pVersionInformation);这个函数要求你在自己的应用程序中分配一个OSVERSIONINFOEX结构,并把此结构的地址传给GetVersionEx。OSVERSIONINFOEX结构如下所示:typedef struct {   DWORD dwOSVersionInfoSize;   DWORD dwMajorVersion;   DWORD dwMinorVersion;   DWORD dwBuildNumber;   DWORD dwPlatformId;   TCHAR szCSDVersion;   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;}
页: [1]
查看完整版本: 《Windows核心编程》学习笔记(7)– 系统版本