使用 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 的操作。
为什么现在的新程序员只阅读任何文档页面的第一个,比如六个字?阅读全部内容。你需要的一切都在那里。上帝。
来自MajorVersionNumber
和MinorVersionNumber
我会得到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() >= 6.1
等测试可能会在 Windows 7 上失败。【参考方案5】:
-
我已尝试上述答案,但似乎无法正常获取高于 8 的 Windows 操作系统版本。
所以经过长时间的努力,我找到了源代码示例,并且它正在正确返回版本。
在 'GetProcAddress' 的帮助下,获取操作系统版本非常容易。此外,我已经尝试了以下示例链接,它对我来说效果很好。
Get OS version c++ source code
-
如果有人在获取操作系统版本时遇到问题,请随时分享您的想法。
【讨论】:
这对我很有用,谢谢。出于某种原因,除了您的示例中的包含之外,还必须包含#include <winternl.h>
。以上是关于使用 C++ 在 Windows 中获取 OSVersion的主要内容,如果未能解决你的问题,请参考以下文章
使用 C++ 在 Windows 中获取 OSVersion
如何使用 C++ 在 Windows 中获取应用程序数据路径?