您的位置:首页 > 其它

win32程序判断windows系统(是否为win7或是更高版本)

2015-10-20 23:58 731 查看
首先还是要介绍一个基本姿势。首先是结构体:OSVERSIONINFOEX

该结构体包括了操作系统版本信息。

Contains operating system version information. The information includes major and minor version numbers, a build number, a platform identifier, and information about product suites and the latest Service Pack installed on the system.


语法如下:

typedef struct {

DWORD dwOSVersionInfoSize;       //在使用GetVersionEx之前要将此初始化
//为结构的大小
DWORD dwMajorVersion;               //系统主版本号

DWORD dwMinorVersion;               //系统次版本号

DWORD dwBuildNumber;               //系统构建号

DWORD dwPlatformId;                  //系统支持的平台(详见附1)

TCHAR szCSDVersion[128];          //系统补丁包的名称

WORD wServicePackMajor;            //系统补丁包的主版本

WORD wServicePackMinor;            //系统补丁包的次版本

WORD wSuiteMask;                      //标识系统上的程序组(详见附2)

BYTE wProductType;                    //标识系统类型(详见附3)

BYTE wReserved;                         //保留,未使用

} OSVERSIONINFOEX, *POSVERSIONINFOEX;OSVERSIONINFOEX,


这样,还是同样的原则,你不可能记住所有的参数,你只要知道这个结构体是干嘛的,以及几个重要的参数就可以了:



可以看到 XP的:

dwMajorVersion = 5;

dwMinorVersion = 1;

wServicePackMajor = 2;

wServicePackMinor = 0;

而这个结构体主要是用于 GetVersionEx 和 VerifyVersionInfo 函数。

那就看看VerifyVersionInfo函数:

使用VerifyVersionInfo来进行版本判断,这个API声明在winbase.h里面,从Windows2000系统就已经开始提供了,但是我们可能很少使用,说实话,使用起来不是特别方便。我们先看看是怎么使用的,它本质是进行版本比较。

BOOL WINAPI VerifyVersionInfo(

In LPOSVERSIONINFOEX lpVersionInfo,

In DWORD dwTypeMask,

In DWORDLONG dwlConditionMask

);

第一个参数是熟悉的OSVERSIONINFOEX,但是这里是做为传入参数使用;

第二个参数dwTypeMask用于指定要比较哪些项,可以比较主版本,次版本,Build号等等,可以使用位组合。

第三个参数则是比较的方法,是>、=还是<,或者>=,<=等等,可以通过VER_SET_CONDITION来设置,可以进行各种组合来判断,还是比较灵活的。

那么VER_SET_CONDITION又是什么呢?其实就是一个宏定义而已。

ULONGLONG VER_SET_CONDITION(
ULONGLONG dwlConditionMask,
DWORD     dwTypeBitMask,
BYTE      dwConditionMask
);


最后上一个win32的代码,来判断本机是不是win7或是更高的版本!!!

#include <windows.h>
#include <stdio.h>

BOOL Is_WinXP_SP2_or_Later()
{
OSVERSIONINFOEX osvi;
DWORDLONG dwlConditionMask = 0;
int op = VER_GREATER_EQUAL;

// Initialize the OSVERSIONINFOEX structure.

ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
osvi.dwMajorVersion = 5;
osvi.dwMinorVersion = 1;
osvi.wServicePackMajor = 2;
osvi.wServicePackMinor = 0;

// Initialize the condition mask.

VER_SET_CONDITION(dwlConditionMask, VER_MAJORVERSION, op);
VER_SET_CONDITION(dwlConditionMask, VER_MINORVERSION, op);
VER_SET_CONDITION(dwlConditionMask, VER_SERVICEPACKMAJOR, op);
VER_SET_CONDITION(dwlConditionMask, VER_SERVICEPACKMINOR, op);

// Perform the test.

return VerifyVersionInfo(&osvi,
VER_MAJORVERSION | VER_MINORVERSION |
VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
dwlConditionMask);
}

int _stdcall WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
)
{
if (Is_WinXP_SP2_or_Later())
::MessageBox(NULL,  ("The system meets the requirements"), NULL, NULL);
else
::MessageBox(NULL, ("The system does not meet the requirements"), NULL, NULL);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: