使用 C++ 在 Windows 中获取 OSVersion

Get OSVersion in Windows using C++

我必须获得 OSVersion 我的 Windows8 系统(版本应该是 NT 6.2)才能在 C++ 应用程序中使用。我尝试使用 GetVersion function call. but it returned me a raw value like 602931718. Is there some way by which I can get the versions as listed here 或如何将此原始值转换为可读形式?

你看过GetVersionEx() function and 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.

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

"With the release of Windows 8.1, the behavior of the GetVersion API has changed in the value it will return for the operating system version. The value returned by the GetVersion function now depends on how the application is manifested."

我已经编译 This programmer With Dev-C++ on Windows 7.The Program is same as the Ist answer on This Question But On Dev-C++ OSVERSIONINFOEX info requires typecasting when called in GetVersionEx( ). 所以这是代码

#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);

}

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

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

关于为创建浮动版本而添加的最后一项,具体来说,"using VER_NT_WORKSTATION",我曾争论过服务器版本应该是+0.05 还是-0.05,还是与非服务器版本相同。我会把那个留给你决定。

  1. 我已经尝试了上面的答案,但似乎无法正常获得 8 以上的 windows OS 版本。
  2. 经过长时间的努力,我找到了源代码示例并且它正确地返回了版本。
  3. 借助 'GetProcAddress' ,获取 OS 的版本非常容易。此外,我已经尝试了以下示例 link,它对我来说效果很好。

Get OS version c++ source code

  1. 如果有人在获取 OS 版本时遇到问题,请随时分享您的想法。