在Windows平台开发中,获取准确的系统版本号是很多场景下的基础需求,比如程序需要根据系统版本开启不同的功能特性,或者做兼容性适配。早期开发者常通过GetVersionEx接口获取版本信息,但该接口在Windows 10之后返回的结果可能不符合预期,而VerifyVersionInfo是微软官方推荐的版本校验接口,能够准确获取系统版本相关信息。

VerifyVersionInfo接口基本介绍
VerifyVersionInfo是Windows API中用于验证系统版本信息的函数,定义在winbase.h头文件中,对应的导入库是kernel32.lib,需要包含windows.h头文件才能使用。它的核心作用是对比传入的版本信息和当前系统的真实版本信息,同时可以获取完整的系统版本细节。
该函数的原型如下:
BOOL VerifyVersionInfo( LPOSVERSIONINFOEXW lpVersionInformation, DWORD dwTypeMask, DWORDLONG dwlConditionMask );
参数说明:
- lpVersionInformation:指向OSVERSIONINFOEX结构体的指针,该结构体用于存储需要校验的版本信息,调用后也会返回系统实际的版本信息
- dwTypeMask:指定需要校验的版本信息类型,比如主版本号、次版本号、构建号等
- dwlConditionMask:条件掩码,用于指定版本对比的规则,比如大于等于、等于等
相关结构体与辅助函数说明
OSVERSIONINFOEX结构体
OSVERSIONINFOEX是扩展的系统版本信息结构体,相比基础的OSVERSIONINFO,它包含了更多的版本相关字段,定义如下:
typedef struct _OSVERSIONINFOEXW {
DWORD dwOSVersionInfoSize; // 结构体大小,必须初始化
DWORD dwMajorVersion; // 系统主版本号
DWORD dwMinorVersion; // 系统次版本号
DWORD dwBuildNumber; // 系统构建号
DWORD dwPlatformId; // 平台标识,Windows NT系列为VER_PLATFORM_WIN32_NT
WCHAR szCSDVersion[128]; // 补丁包信息,比如Service Pack版本
WORD wServicePackMajor; // 补丁包主版本号
WORD wServicePackMinor; // 补丁包次版本号
WORD wSuiteMask; // 系统套件掩码
BYTE wProductType; // 产品类型,比如工作站、服务器
BYTE wReserved; // 保留字段
} OSVERSIONINFOEXW, *POSVERSIONINFOEXW, *LPOSVERSIONINFOEXW;
VerSetConditionMask辅助函数
VerSetConditionMask函数用于生成条件掩码dwlConditionMask,它的原型如下:
DWORDLONG VerSetConditionMask( DWORDLONG dwlConditionMask, DWORD dwTypeBitMask, BYTE dwConditionMask );
参数说明:
- dwlConditionMask:初始条件掩码,第一次调用时传入0即可
- dwTypeBitMask:需要设置条件的版本类型,和VerifyVersionInfo的dwTypeMask对应
- dwConditionMask:条件类型,可选值有VER_EQUAL(等于)、VER_GREATER(大于)、VER_GREATER_EQUAL(大于等于)等
C++调用VerifyVersionInfo获取系统版本完整示例
下面是完整的C++代码示例,演示如何调用VerifyVersionInfo获取当前Windows系统的版本信息:
#include <windows.h>
#include <iostream>
using namespace std;
int main() {
// 初始化OSVERSIONINFOEX结构体
OSVERSIONINFOEX osvi = { 0 };
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
// 设置需要获取的版本信息类型,这里获取主版本、次版本、构建号、平台ID
DWORD dwTypeMask = VER_MAJORVERSION | VER_MINORVERSION | VER_BUILDNUMBER | VER_PLATFORMID;
// 生成条件掩码,这里设置条件为大于等于0,目的是获取系统真实版本信息,不做对比校验
DWORDLONG dwlConditionMask = 0;
dwlConditionMask = VerSetConditionMask(dwlConditionMask, VER_MAJORVERSION, VER_GREATER_EQUAL);
dwlConditionMask = VerSetConditionMask(dwlConditionMask, VER_MINORVERSION, VER_GREATER_EQUAL);
dwlConditionMask = VerSetConditionMask(dwlConditionMask, VER_BUILDNUMBER, VER_GREATER_EQUAL);
dwlConditionMask = VerSetConditionMask(dwlConditionMask, VER_PLATFORMID, VER_GREATER_EQUAL);
// 调用VerifyVersionInfo获取版本信息
if (VerifyVersionInfo(&osvi, dwTypeMask, dwlConditionMask)) {
// 输出系统版本信息
cout << "系统平台ID: " << osvi.dwPlatformId << endl;
cout << "主版本号: " << osvi.dwMajorVersion << endl;
cout << "次版本号: " << osvi.dwMinorVersion << endl;
cout << "构建号: " << osvi.dwBuildNumber << endl;
cout << "补丁包信息: " << osvi.szCSDVersion << endl;
cout << "补丁包主版本: " << osvi.wServicePackMajor << endl;
cout << "补丁包次版本: " << osvi.wServicePackMinor << endl;
} else {
// 获取失败,输出错误码
DWORD errCode = GetLastError();
cout << "获取系统版本失败,错误码: " << errCode << endl;
}
system("pause");
return 0;
}
常见问题与注意事项
1. 结构体大小初始化问题
OSVERSIONINFOEX的dwOSVersionInfoSize字段必须设置为结构体的实际大小,否则VerifyVersionInfo调用会失败,返回错误码ERROR_INVALID_PARAMETER。
2. 条件掩码的设置逻辑
如果只需要获取系统版本信息,不需要做版本对比校验,可以将所有条件设置为大于等于0,这样无论系统版本是多少,都能正确获取到信息。如果要做版本判断,比如判断系统是否是Windows 10及以上,可以设置主版本号为10,条件为大于等于即可。
3. 系统版本对应关系
常见的Windows系统版本号对应关系如下:
| 系统版本 | 主版本号 | 次版本号 | 构建号范围 |
|---|---|---|---|
| Windows 7 | 6 | 1 | 7600及以上 |
| Windows 8 | 6 | 2 | 9200及以上 |
| Windows 8.1 | 6 | 3 | 9600及以上 |
| Windows 10 | 10 | 0 | 10240及以上 |
| Windows 11 | 10 | 0 | 22000及以上 |
4. 权限问题
VerifyVersionInfo接口调用不需要特殊权限,普通用户权限即可正常获取系统版本信息,不需要以管理员身份运行程序。
总结
通过调用VerifyVersionInfo接口,结合OSVERSIONINFOEX结构体和VerSetConditionMask辅助函数,C++程序可以准确获取Windows系统的完整版本信息,避免了旧接口在Windows 10及以上版本获取结果不准确的问题。实际开发中可以根据获取到的版本号做对应的兼容性处理,提升程序的适配能力。
C++获取系统版本VerifyVersionInfoWindows系统版本OSVERSIONINFOEX修改时间:2026-07-18 03:06:42