使用 C++ 在 Windows 中获取 OSVersion

Posted

技术标签:

【中文标题】使用 C++ 在 Windows 中获取 OSVersion【英文标题】:Get OSVersion in Windows using C++ 【发布时间】:2015-07-08 19:10:07 【问题描述】:

我必须获得我的Windows8 系统的OSVersion(版本应该是NT 6.2)才能在C++ 应用程序中使用。我尝试使用GetVersion 函数调用。但它返回了一个原始值,例如602931718。有什么方法可以让我获得here 列出的版本,或者如何将这个原始值转换为可读形式?

【问题讨论】:

据我了解,您链接的页面正是您所需要的...... 如果您愿意使用许多 if 语句,您也许可以执行类似 this 的操作。 为什么现在的新程序员只阅读任何文档页面的第一个,比如六个字?阅读全部内容。你需要的一切都在那里。上帝。 来自MajorVersionNumberMinorVersionNumber 我会得到6.2。但是NT呢? @Jackz 它在页面底部的 cmets 中。 【参考方案1】:

你看过GetVersionEx()函数和OSVERSIONINFOEX结构吗?

可能的用法:

void print_os_info()

    OSVERSIONINFOEX info;
    ZeroMemory(&info, sizeof(OSVERSIONINFOEX));
    info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);

    GetVersionEx(&info);

    printf("Windows version: %u.%u\n", info.dwMajorVersion, info.dwMinorVersion);

我不明白,NT 是什么意思。根据MSDN:

从 Windows XP 开始,所有版本都隐含为NT 版本。如果要针对服务器版本进行测试,请检查 info.wProductType 的值:

if(info.dwMajorVersion == 6)

    if (info.dwMinorVersion == 0)
    
        if (info.wProductType == VER_NT_WORKSTATION)
            //Windows Vista;
        else
            //Windows Server 2008
    
    else if (info.dwMinorVersion == 1)
    
        if (info.wProductType == VER_NT_WORKSTATION)
            //Windows 7
        else
            //Windows Server 2008 R2
    
    else if (...) //etc...

还有一件事:您还可以检查info.dwBuildNumber 的值。允许的值之一是VER_PLATFORM_WIN32_NT

【讨论】:

从 Windows 8.1 开始不推荐使用【参考方案2】:

请注意,GetVersion 和 GetVersionEx 函数已被弃用。这也反映在他们的文档中。页面说(这个是从 GetVersion 复制的):

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

【讨论】:

遗憾的是,replacement 方法VerifyVersionInfo 在语义上并没有扮演同样的角色。它回答问题Is the current version good enough? 而不是问题What is the current version? 还有办法获取当前版本吗? 在 Windows 10 中,the VerifyVersionInfo function has also been deprecated。 您可以使用内核函数RtlGetVersion 来获得正确的版本,而无需依赖您的应用程序的表现方式,详见此处***.com/a/36545162/9423231【参考方案3】:

我已经在 Windows 7 上使用 Dev-C++ 编译了这个程序员。程序与这个问题的 Ist 答案相同,但在 Dev-C++ 上,在 GetVersionEx() 中调用 OSVERSIONINFOEX 信息时需要进行类型转换。所以这里是代码

#include<windows.h>
#include<stdio.h>
int main()

     OSVERSIONINFOEX info;
     ZeroMemory(&info, sizeof(OSVERSIONINFOEX));
     info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
     GetVersionEx((LPOSVERSIONINFO)&info);//info requires typecasting

     printf("Windows version: %u.%u\n", info.dwMajorVersion, info.dwMinorVersion);


【讨论】:

【参考方案4】:

如果你想让它更方便,你可以尝试转换为浮点数而不是检查两个整数:

double GetOsVersion() 
    OSVERSIONINFOEX info;
    ZeroMemory(&info, sizeof(OSVERSIONINFOEX));
    info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
    GetVersionEx(&info);

    double version;

    version = info.dwMajorVersion 
            + (info.dwMinorVersion / 10.0)
            - (info.wProductType == VER_NT_WORKSTATION) ? 0.5 : 0.0;

    return ver;


// Windows 10             : 10.0
// Windows 8.1            : 6.3
// Windows 8.0            : 6.2
// Windows Server 2012    : 6.15
// Windows 7              : 6.1
// Windows Server 2008 R2 : 6.05
// Windows Vista          : 6.0

关于添加创建浮动版本的最后一个术语,特别是“使用 VER_NT_WORKSTATION”,我对服务器版本应该是 +0.05 还是 -0.05,还是与非服务器版本相同存在一些争论。我会留给你决定。

【讨论】:

这是个糟糕的建议,因为 6.3 和 6.2 或 6.05 无法使用 double 类型精确表示,因此它们将近似为稍小或稍大的值。因此,用于检测 Windows 7 或更高版本的 GetOsVersion() &gt;= 6.1 等测试可能会在 Windows 7 上失败。【参考方案5】:
    我已尝试上述答案,但似乎无法正常获取高于 8 的 Windows 操作系统版本。 所以经过长时间的努力,我找到了源代码示例,并且它正在正确返回版本。 在 'GetProcAddress' 的帮助下,获取操作系统版本非常容易。此外,我已经尝试了以下示例链接,它对我来说效果很好。

Get OS version c++ source code

    如果有人在获取操作系统版本时遇到问题,请随时分享您的想法。

【讨论】:

这对我很有用,谢谢。出于某种原因,除了您的示例中的包含之外,还必须包含 #include &lt;winternl.h&gt;

以上是关于使用 C++ 在 Windows 中获取 OSVersion的主要内容,如果未能解决你的问题,请参考以下文章

使用 C++ 在 Windows 中获取 OSVersion

如何使用 C++ 在 Windows 中获取应用程序数据路径?

如何在 C++ 中获取 Windows 下的内存使用情况

如何使用 C++ 在 Windows 中获取 MAC 地址? [关闭]

使用 gcc c++ 获取 Windows 版本

如何在windows c++中的cmd中运行命令后获取退出代码