使用C ++在Windows中获取OSVersion

问题描述 投票:0回答:4

我必须得到我的OSVersion系统的Windows8(版本应该是NT 6.2)才能在C ++应用程序中使用。我尝试使用GetVersion函数调用。但它给了我像602931718这样的原始价值。是否有某种方法可以获得列出的here版本或如何将此原始值转换为可读形式?

c++ windows version
4个回答
3
投票

你看过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


8
投票

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

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


1
投票

我在Windows 7上使用Dev-C ++编译了这个程序员。该程序与本问题的答案相同但在Dev-C ++上OSVERSIONINFOEX信息需要在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);

}

1
投票

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

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,还是与非服务器版本相同有争议。我会把那个留给你决定。

© www.soinside.com 2019 - 2024. All rights reserved.