【发布时间】:2015-08-25 00:42:17
【问题描述】:
我正在针对特定操作系统制作应用程序,但我似乎无法缩小 Windows 10 的范围,它以 Windows 8 的形式出现。我已经在 Window 10 Pro 上对其进行了测试,结果是 Major: 6 Min:2。还有其他方法可以更有效地检查它是否是 Windows 10?
编辑:发现一个正常工作的 API RtlGetVersion() 适用于所有操作系统!
#include "windows.h"
#include <iostream>
using namespace std;
BOOL EqualsMajorVersion(DWORD majorVersion)
{
OSVERSIONINFOEX osVersionInfo;
::ZeroMemory(&osVersionInfo, sizeof(OSVERSIONINFOEX));
osVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
osVersionInfo.dwMajorVersion = majorVersion;
ULONGLONG maskCondition = ::VerSetConditionMask(0, VER_MAJORVERSION, VER_EQUAL);
return ::VerifyVersionInfo(&osVersionInfo, VER_MAJORVERSION, maskCondition);
}
BOOL EqualsMinorVersion(DWORD minorVersion)
{
OSVERSIONINFOEX osVersionInfo;
::ZeroMemory(&osVersionInfo, sizeof(OSVERSIONINFOEX));
osVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
osVersionInfo.dwMinorVersion = minorVersion;
ULONGLONG maskCondition = ::VerSetConditionMask(0, VER_MINORVERSION, VER_EQUAL);
return ::VerifyVersionInfo(&osVersionInfo, VER_MINORVERSION, maskCondition);
}
int main()
{
if (EqualsMajorVersion(7) && EqualsMinorVersion(1))
printf("Maj:7 Min:1");
else if (EqualsMajorVersion(7) && EqualsMinorVersion(0))
printf("Maj:7 Min:0");
else if (EqualsMajorVersion(6) && EqualsMinorVersion(7))
printf("Maj:6 Min:7");
else if (EqualsMajorVersion(6) && EqualsMinorVersion(6))
printf("Maj:6 Min:6");
else if (EqualsMajorVersion(6) && EqualsMinorVersion(5))
printf("Maj:6 Min:5");
else if (EqualsMajorVersion(6) && EqualsMinorVersion(4))
printf("Maj:6 Min:4");
else if (EqualsMajorVersion(6) && EqualsMinorVersion(3))
printf("Maj:6 Min:3");
else if (EqualsMajorVersion(6) && EqualsMinorVersion(2))
printf("Maj:6 Min:2");
else if (EqualsMajorVersion(6) && EqualsMinorVersion(1))
printf("Maj:6 Min:1");
else if (EqualsMajorVersion(6) && EqualsMinorVersion(0))
printf("Maj:6 Min:0");
else if (EqualsMajorVersion(5) && EqualsMinorVersion(2))
printf("Maj:5 Min:2");
else if (EqualsMajorVersion(5) && EqualsMinorVersion(1))
printf("Maj:5 Min:1");
else
printf("OS not on list...");
getchar();
}
【问题讨论】:
-
需要考虑的事情:微软表示,较新版本的 Windows 将模仿旧版本,因为程序清单声称它是用它构建的。无论是通过兼容性库还是虚拟机来完成,未来都是开放的。但正因为如此,我不确定您是否可以再从应用程序中找到操作系统版本。
-
使用
GetVersionEx怎么样?这也允许你缓存结构,你只需要调用一次。 -
嘿,我找到了我记得的内容:“未针对 Windows 8.1 或 Windows 10 显示的应用程序将返回 Windows 8 操作系统版本值 (6.2)。一旦针对给定操作系统版本显示应用程序,GetVersionEx将始终返回应用程序在未来版本中体现的版本。” -- msdn.microsoft.com/en-us/library/windows/desktop/…
-
我想知道你打算用
RtlGetVersion做什么。在未来的 2025 版本的 Windows 中,如果微软按照他们的计划进行,你的程序将在虚拟机中运行。询问真实版本的 Windows 就像询问虚拟机的主机操作系统一样。毫无意义的信息,因为没有任何 API、设备驱动程序、文件系统等看起来像 2025 年的 Windows。 -
@ZanLynx 一个原因可能是 显示 当前的 Windows 版本,而不是忍受
GetVersionEx提供的“优点”,尤其是在弃用警告和“唯一" 编号对最终用户确实没有帮助。我可以理解 MS 对人们得到版本 checks 错误感到恼火。但是检索 Windows 版本的用途比版本检查更多。
标签: c++ windows operating-system windows-10