检查Windows版本

问题描述 投票:0回答:8

如何在 C++ 中检查计算机上安装的 Windows 版本是否为 Windows Vista 及更高版本 (Windows 7)?

c++ windows version
8个回答
30
投票

本线程中的所有答案都指向您使用

GetVersion
GetVersionEx
进行此测试,这是不正确。看似有效,但有风险。 Windows 操作系统升级的应用程序兼容性问题的主要根源来自于基于
GetVersion
结果的编写不当的测试,以及错误的假设或错误的比较。

进行此测试的正确方法是使用

VerifyVersionInfo
,而不是
GetVersion
GetVersionEx

如果您使用的是 VS 2013 编译器工具集和 Windows 8.1 SDK,则可以使用

VersionHelpers.h
并只需调用
IsWindowsVistaOrGreater

如果您使用 VS 2013

v120_xp
平台工具集来针对 Windows XP,那么您实际上使用的是 Windows 7.1A SDK,因此您需要直接使用
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

VerifyVersionInfo
也受到相同的基于清单的行为的影响(即,如果没有 Windows 10 的 GUID 元素,VVI 的行为就好像操作系统版本号是 6.2 而不是 10.0。也就是说,大多数现实世界即使没有清单,诸如
IsWindowsVistaOrGreater
IsWindows7OrGreater
IsWindows7SP1OrGreater
IsWindows8OrGreater
之类的测试也能正常工作,只有当您使用
IsWindows8Point1OrGreater
IsWindows10OrGreater
时,基于清单的行为才重要。 .

另请参阅this堆栈溢出线程。


20
投票

使用kernel32.dll中定义的

GetVersionEx
API函数:

bool IsWindowsVistaOrHigher() {
   OSVERSIONINFO osvi;
   ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
   osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
   GetVersionEx(&osvi);
   return osvi.dwMajorVersion >= 6;
}

18
投票

与检查 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)

13
投票

在 Visual Studio 2013 或更高版本中,您还可以使用新的 Version Helper 函数。

有适用于许多不同 Windows 版本的方法。示例:

#include <VersionHelpers.h>

if (!IsWindowsVistaOrGreater())
{
   MessageBox(NULL, "You need at least Windows Vista", "Version Not Supported", MB_OK);
}

更多信息这里


6
投票

我认为您正在寻找 GetVersionEx 函数。


4
投票

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;

1
投票

您可以使用kernel32.dll中的GetVersion()或GetVersionEx()函数。这两个功能仅在 Windows 2000 或更高版本上可用。

要了解有关此内容的更多信息,请访问 http://msdn.microsoft.com/en-us/library/ms724451%28VS.85%29.aspx.


0
投票

我知道这是一个旧线程,但如果今天有人读到这篇文章,有一种未记录的(但可靠的)方法可以在 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 
© www.soinside.com 2019 - 2024. All rights reserved.