检测 Windows 10 版本

新手上路,请多包涵

我的目标是在我的代码中检测 Windows 10,它必须跨平台以及跨不同版本的 Windows(至少 7 及更高版本)工作。 Windows 提供了 IsWindows10OrGreater() 来解决这个问题,但是它还有一个问题,这个功能在以前的windows 版本中是不存在的。

您会发现无数关于此的博客和 SO 问题,以及像 this 和 getversion 等函数返回一些不同版本而不是正确版本的明显疯狂。

例如在我的机器上 - 方法 IsWindows10OrGreater() 无法编译(我必须安装 Win10 SDK),并且 IsWindowsVersionOrGreater() 报告 6 作为主要版本。

那么有没有一种理智的多版本方法可以解决这个问题?

原文由 hg_git 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

检索真实操作系统版本的最直接方法是调用 RtlGetVersion 。这是 GetVersionExVerifyVersionInfo 调用的,但不使用兼容性垫片。

您可以使用 DDK(通过 #include 并从内核模式链接到 NtosKrnl.lib,或从用户模式链接到 ntdll.lib),或者使用运行时动态链接,如下面的代码片段所示:

 typedef LONG NTSTATUS, *PNTSTATUS;
#define STATUS_SUCCESS (0x00000000)

typedef NTSTATUS (WINAPI* RtlGetVersionPtr)(PRTL_OSVERSIONINFOW);

RTL_OSVERSIONINFOW GetRealOSVersion() {
    HMODULE hMod = ::GetModuleHandleW(L"ntdll.dll");
    if (hMod) {
        RtlGetVersionPtr fxPtr = (RtlGetVersionPtr)::GetProcAddress(hMod, "RtlGetVersion");
        if (fxPtr != nullptr) {
            RTL_OSVERSIONINFOW rovi = { 0 };
            rovi.dwOSVersionInfoSize = sizeof(rovi);
            if ( STATUS_SUCCESS == fxPtr(&rovi) ) {
                return rovi;
            }
        }
    }
    RTL_OSVERSIONINFOW rovi = { 0 };
    return rovi;
}

如果您需要其他信息,您可以传递 RTL_OSVERSIONINFOEXW 结构来代替 RTL_OSVERSIONINFOW 结构(正确分配 dwOSVersionInfoSize 成员)。

即使没有附加清单,这也会在 Windows 10 上返回预期结果。


顺便说一句,它被普遍认为是一种更好的解决方案,可以根据可用 功能 而不是操作系统版本提供不同的实现。

原文由 IInspectable 发布,翻译遵循 CC BY-SA 3.0 许可协议

IsWindows10OrGreater() 来自 VersionHelpers.h

查看 MSDN 上 Version Helper 函数 的注释

文件 VersionHelpers.h 随 Windows 10 SDK 一起提供,但它也适用于以前的版本。只需将其复制到您的开发环境即可。

它只是一个仅在头文件中定义的小库,它使用 VerSetConditionMaskVerifyVersionInfoW 函数,自 Windows 2000 起在 WinAPI 中都可用。

Upd 如果您的源代码中不能包含清单文件,您可以使用简单的 hack:只需获取任何系统 dll 的版本,例如 kernel32.dll 使用 GetFileVersionInfo 函数。

原文由 vladon 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏