检查Windows版本

时间:2009-12-26 18:32:29

标签: c++ windows version

如果计算机上安装的Windows版本是Windows Vista及更高版本(Windows 7),我如何签入C ++?

7 个答案:

答案 0 :(得分:27)

此主题中的所有答案都指向您使用GetVersionGetVersionEx进行此测试,不正确。它似乎有效,但它有风险。 Windows操作系统升级的appcompat问题的主要来源是基于GetVersion结果的错误编写的测试,其中包含错误的假设或错误的比较。

执行此测试的正确方法是使用VerifyVersionInfo,而不是GetVersionGetVersionEx

如果您使用的是VS 2013编译器工具集和Windows 8.1 SDK,则可以使用VersionHelpers.h并致电IsWindowsVistaOrGreater

  

如果您使用VS 2013 v120_xp平台工具集来定位Windows XP,那么您实际上正在使用Windows 7.1A SDK,因此您需要直接使用VeriyVersionInfo

否则,请使用:

bool IsWindowsVistaOrGreater()
{
OSVERSIONINFOEXW osvi = { sizeof(osvi), 0, 0, 0, 0, {0}, 0, 0 };
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上运行此测试 - 并且您使用的编译器工具集足够大,可以在该平台上实际运行,那么您可以使用显式而非隐式链接执行相同的测试。 What's in a version number?

此外,默认情况下,使用GetVersionGetVersionEx会在Windows 8.1和Windows 10上获取错误版本。请参阅Manifest Madness

  

请注意,对于Windows 10,VerifyVersionInfo也受到相同的基于清单的行为的影响(即,没有Windows 10的GUID元素,VVI就像操作系统版本号是6.2而不是10.0一样。那就是说,大多数真实世界的测试,例如IsWindowsVistaOrGreaterIsWindows7OrGreaterIsWindows7SP1OrGreaterIsWindows8OrGreater即使没有清单,也都可以正常运行。只有当你是使用IsWindows8Point1OrGreaterIsWindows10OrGreater基于清单的行为甚至是重要的。

另见this堆栈溢出线程。

答案 1 :(得分:20)

使用kernel32.dll中定义的GetVersionEx API函数:

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

答案 2 :(得分:17)

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

答案 3 :(得分:12)

在Visual Studio 2013或更高版本中,您还可以使用新的版本助手功能。

有许多不同Windows版本的方法。例如:

#include <VersionHelpers.h>

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

更多信息here

答案 4 :(得分:6)

我认为您正在寻找GetVersionEx功能。

答案 5 :(得分:3)

Microsoft support page为您提供旧版本的详细信息。

  

要确定在给定系统上运行的操作系统,需要以下数据:

              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;

答案 6 :(得分:1)

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

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