我必须得到我的OSVersion
系统的Windows8
(版本应该是NT 6.2
)才能在C ++应用程序中使用。我尝试使用GetVersion
函数调用。但它给了我像602931718
这样的原始价值。是否有某种方法可以获得列出的here版本或如何将此原始值转换为可读形式?
你看过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
。
请注意,已弃用函数GetVersion和GetVersionEx。这也反映在他们的文档中。页面说(这个从GetVersion复制):
“随着Windows 8.1的发布,GetVersion API的行为已经改变了它将为操作系统版本返回的值.GetVersion函数返回的值现在取决于应用程序的显示方式。”
我在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);
}
如果你想让它更方便,你可以尝试转换为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,还是与非服务器版本相同有争议。我会把那个留给你决定。