我需要获取我的Windows8系统的OS版本(版本应为NT 6.2),以在C++应用程序中使用。我尝试使用GetVersion函数调用
GetVersion
,但它返回了一个原始值,如602931718。是否有办法可以像这里列出的那样获取版本?或者如何将此原始值转换为可读形式?GetVersion
,但它返回了一个原始值,如602931718。是否有办法可以像这里列出的那样获取版本?或者如何将此原始值转换为可读形式?VerifyVersionInfo
在语义上并不扮演相同的角色。它回答的问题是“当前版本足够好吗?”,而不是“当前版本是什么?” - Jesse ChisholmRtlGetVersion
来获取正确的版本,而不需要依赖应用程序的清单文件中的信息。详细信息请参考https://dev59.com/sFoV5IYBdhLWcg3wN8hD#36545162。 - frido#include <winternl.h>
,除了您的示例之外。 - Skewjo我在Windows 7上使用Dev-C++编译了这个程序。该程序与此问题的第一个答案相同,但在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);
}
您是否查看过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的说法:
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
。
如果你想让它更方便,可以尝试将其转换为浮点数而不是检查两个整数:
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
GetOsVersion()>=6.1
这样的测试可能会失败。 - sam hocevar
if
语句,你可能可以像这样做些什么。 - Javia1492