C++如何获取Windows系统版本号_C++调用VerifyVersionInfo接口【系统】-C++

VerifyVersionInfoW 优于 VerifyVersionInfoA,因后者受 ANSI 编码和区域设置影响;但二者均需配合 VerSetConditionMask 且受 manifest 限制,推荐优先使用不受限的 RtlGetVersion 获取真实系统版本。

VerifyVersionInfoA 和 VerifyVersionInfoW 的区别与选择

Windows 提供的 VerifyVersionInfoA 和 VerifyVersionInfoW 是同一 API 的 ANSI/Unicode 版本,但实际使用中几乎没人直接调用它们——因为从 Windows 8.1 开始,微软明确要求必须配合 VerSetConditionMask 使用,且 OSVERSIONINFOEX 结构体字段需严格初始化,否则返回 FALSE 即使系统满足条件。

更关键的是:自 Windows 10 1607 起,VerifyVersionInfo 在应用未声明兼容性时会被系统静默降级为 Windows 8.1 版本号(即返回 dwMajorVersion=6, dwMinorVersion=3),哪怕你真在 Win11 上跑。

  • 必须在 manifest 中声明支持目标系统,例如添加 (Win10)或对应 Win11 GUID
  • dwOSVersionInfoSize 字段必须设为 sizeof(OSVERSIONINFOEX),漏设会导致调用失败
  • 推荐优先用 VerifyVersionInfoW,避免 ANSI 编码路径下区域设置引发的不可靠比较

比 VerifyVersionInfo 更可靠的做法:RtlGetVersion

RtlGetVersion 是内核导出函数,不走 UAC 兼容层,也不受 manifest 限制,返回真实内核版本。它在 ntdll.dll 中,无需 manifest 声明,且从 Windows XP 到 Windows 11 全系可用。

注意它不是公开 Win32 API,头文件不声明,需手动 GetProcAddress 获取函数指针:

立即学习“C++免费学习笔记(深入)”;

typedef NTSTATUS(NTAPI* RtlGetVersionPtr)(PRTL_OSVERSIONINFOW);
HMODULE hNtDll = GetModuleHandleA("ntdll.dll");
RtlGetVersionPtr pRtlGetVersion = (RtlGetVersionPtr)GetProcAddress(hNtDll, "RtlGetVersion");
RTL_OSVERSIONINFOW osvi = {0};
osvi.dwOSVersionInfoSize = sizeof(osvi);
if (pRtlGetVersion && pRtlGetVersion(&osvi) == 0) {
    // osvi.dwMajorVersion, osvi.dwMinorVersion, osvi.dwBuildNumber 可信
}
  • 返回值为 NTSTATUS,成功是 0(STATUS_SUCCESS),不是布尔值
  • RTL_OSVERSIONINFOW 和 OSVERSIONINFOW 字段布局一致,但前者是 ntdll 内部结构,不能混用 typedef
  • 不需要 #include 或链接 ntdll.lib,纯运行时绑定即可

获取带具体版本名(如 “Windows 11”)的字符串

RtlGetVersion 只给数字版号,要转成用户可读名称,得查表匹配:dwMajorVersion + dwMinorVersion + dwBuildNumber 组合决定具体 SKU。

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » C++如何获取Windows系统版本号_C++调用VerifyVersionInfo接口【系统】-C++
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4006878+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4006879+
  • 本周更新: 0+
  • 最后更新: 2026-03-16