如何在 C++ 中检查计算机上安装的 Windows 版本是否为 Windows Vista 及更高版本 (Windows 7)?
本线程中的所有答案都指向您使用
GetVersion
或 GetVersionEx
进行此测试,这是不正确。看似有效,但有风险。 Windows 操作系统升级的应用程序兼容性问题的主要根源来自于基于 GetVersion
结果的编写不当的测试,以及错误的假设或错误的比较。
进行此测试的正确方法是使用
VerifyVersionInfo
,而不是 GetVersion
或 GetVersionEx
。
如果您使用的是 VS 2013 编译器工具集和 Windows 8.1 SDK,则可以使用
VersionHelpers.h
并只需调用 IsWindowsVistaOrGreater
。
如果您使用 VS 2013
平台工具集来针对 Windows XP,那么您实际上使用的是 Windows 7.1A SDK,因此您需要直接使用v120_xp
。VeriyVersionInfo
否则,请使用:
bool IsWindowsVistaOrGreater()
{
OSVERSIONINFOEXW osvi = {};
osvi.dwOSVersionInfoSize = sizeof(osvi);
DWORDLONG const dwlConditionMask = VerSetConditionMask(
VerSetConditionMask(
VerSetConditionMask(
0, VER_MAJORVERSION, VER_GREATER_EQUAL),
VER_MINORVERSION, VER_GREATER_EQUAL),
VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL);
osvi.dwMajorVersion = HIBYTE(_WIN32_WINNT_VISTA);
osvi.dwMinorVersion = LOBYTE(_WIN32_WINNT_VISTA);
osvi.wServicePackMajor = 0;
return VerifyVersionInfoW(&osvi, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR, dwlConditionMask) != FALSE;
}
此代码适用于 Windows 2000 或更高版本,并为您提供可靠的结果。如果您确实需要在 Windows 98 或 Windows ME 上运行此测试,并且您使用的编译器工具集足够老,可以在该平台上实际运行,那么您将执行相同的测试,但使用显式链接而不是隐式链接。 版本号包含什么?
此外,在 Windows 8.1 和 Windows 10 上使用
GetVersion
或 GetVersionEx
默认情况下会获得错误版本。请参阅Manifest Madness。
请注意,对于 Windows 10
也受到相同的基于清单的行为的影响(即,如果没有 Windows 10 的 GUID 元素,VVI 的行为就好像操作系统版本号是 6.2 而不是 10.0。也就是说,大多数现实世界即使没有清单,诸如VerifyVersionInfo
、IsWindowsVistaOrGreater
、IsWindows7OrGreater
、IsWindows7SP1OrGreater
之类的测试也能正常工作,只有当您使用IsWindows8OrGreater
或IsWindows8Point1OrGreater
时,基于清单的行为才重要。 .IsWindows10OrGreater
另请参阅this堆栈溢出线程。
使用kernel32.dll
中定义的
GetVersionExAPI函数:
bool IsWindowsVistaOrHigher() {
OSVERSIONINFO osvi;
ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&osvi);
return osvi.dwMajorVersion >= 6;
}
与检查 Windows NT 版本的其他测试类似:
OSVERSIONINFO vi;
memset (&vi, 0, sizeof vi);
vi .dwOSVersionInfoSize = sizeof vi;
GetVersionEx (&vi);
if (vi.dwPlatformId == VER_PLATFORM_WIN32_NT && vi.dwMajorVersion >= 6)
在 Visual Studio 2013 或更高版本中,您还可以使用新的 Version Helper 函数。
有适用于许多不同 Windows 版本的方法。示例:
#include <VersionHelpers.h>
if (!IsWindowsVistaOrGreater())
{
MessageBox(NULL, "You need at least Windows Vista", "Version Not Supported", MB_OK);
}
更多信息这里
我认为您正在寻找 GetVersionEx 函数。
此 Microsoft 支持页面 为您提供旧版本的详细信息。
要确定给定系统上运行的操作系统,需要以下数据:
95 98 ME NT 4 2000 XP PlatformID 1 1 1 2 2 2 Major version 4 4 4 4 5 5 Minor version 0 10 90 0 0 1
您可以实现代码并在 Vista 和 Windows-7 计算机上运行它以检查返回的值。
要获取操作系统版本信息,请进行以下调用:
System::OperatingSystem *osInfo = System::Environment::OSVersion;
您可以使用kernel32.dll中的GetVersion()或GetVersionEx()函数。这两个功能仅在 Windows 2000 或更高版本上可用。
要了解有关此内容的更多信息,请访问 http://msdn.microsoft.com/en-us/library/ms724451%28VS.85%29.aspx.
我知道这是一个旧线程,但如果今天有人读到这篇文章,有一种未记录的(但可靠的)方法可以在 Windows 中获取版本号,而无需调用 GetVersionEx。它基于名为 KUSER_SHARED_DATA 的数据结构,该数据结构映射到每个进程到同一虚拟地址 (0x7FFE0000)。 Windows 版本号是此共享结构的一部分,具有相同的偏移量。这是显示 Windows 版本号的另一种方法:
auto userData = (BYTE*)0x7FFE0000;
printf("Version: %d.%d.%d\n",
*(ULONG*)(userData + 0x26c), // major version offset
*(ULONG*)(userData + 0x270), // minor version offset
*(ULONG*)(userData + 0x260)); // build number offset