找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 3700|回复: 0

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

[复制链接]
发表于 2012-3-17 22:41:38 | 显示全部楼层 |阅读模式

很多时候,应用程序需要判断用户所运行的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;

}

您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-23 16:20 , Processed in 0.013169 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表