首页 > 解决方案 > GetVersionEx Windows 10 被检测为 Windows 8

问题描述

我正在使用 GetVersionEx 来获取操作系统。但我不知道它为什么将 Windows 10 报告为 Windows 8?我知道它已被弃用,但我找不到其他解决方案。

switch (osinfo.dwMajorVersion)
    {
    case 5:
        if (osinfo.dwMinorVersion == 0)
        {
            sysinfo = "Windows 2000 ";
        }
        else if (osinfo.dwMinorVersion == 1)
        {
            sysinfo = "Windows XP ";
        }
        else if (osinfo.dwMinorVersion == 2)
        {
            sysinfo = "Windows XP ";
        }
        break;
    case 6:
        if (osinfo.dwMinorVersion == 3)
        { 
            sysinfo = "Windows 8.1 ";
        }
        else if (osinfo.dwMinorVersion == 2)
        {
            sysinfo = "Windows 8 ";
        }
        else if (osinfo.dwMinorVersion == 1)
        {
            sysinfo = "Windows 7 ";
        }
        else {
            sysinfo = "Windows Vista ";
        }
        break;
    case 10:
        sysinfo = "Windows 10 ";
        break;
    default:
        sysinfo = "Unknown OS ";
    }

标签: c++

解决方案


文档中:

GetVersionExA 函数

[GetVersionEx 可能会更改或无法用于 Windows 8.1 之后的版本。相反,使用 Version Helper 函数]

随着 Windows 8.1 的发布,GetVersionEx API 的行为发生了变化,它将为操作系统版本返回的值。GetVersionEx 函数返回的值现在取决于应用程序的显示方式。

未针对 Windows 8.1 或 Windows 10 显示的应用程序将返回 Windows 8 操作系统版本值 (6.2)。一旦针对给定的操作系统版本显示应用程序,GetVersionEx 将始终返回应用程序在未来版本中显示的版本。要为 Windows 8.1 或 Windows 10 显示您的应用程序,请参阅为 Windows 定位您的应用程序。

这里有很多细节,但有点难以通过。在底部,它提出了获取操作系统版本并不是一件好事的概念:

评论

识别当前操作系统通常不是确定是否存在特定操作系统功能的最佳方式。这是因为操作系统可能在可再发行的 DLL 中添加了新功能。不要使用 GetVersionEx 来确定操作系统平台或版本号,而是测试功能本身是否存在。有关详细信息,请参阅操作系统版本

该链接建议BOOL IsOS(DWORD dwOS)参数是大约 40 个选项之一的函数,例如OS_WIN95ORGREATER、OS_WIN2000TERMINAL、OS_PROFESSIONAL等。

或者有GetProductInfo()一个似乎有详细的结果。


推荐阅读