检查Windows版本

Mat*_*tej 27 c++ windows version

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

Chu*_*urn 28

此主题中的所有答案都指向您使用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;
}
Run Code Online (Sandbox Code Playgroud)

此代码适用于Windows 2000或更高版本,并为您提供强大的结果.如果你真的需要在Windows 98或Windows ME上运行这个测试 - 并且你使用的编译器工具集足够大,可以在该平台上实际运行,你可以使用显式而非隐式链接进行相同的测试.什么是版本号?

此外,在Windows 8.1和Windows 10上使用GetVersionGetVersionEx默认会获得错误的版本.请参阅Manifest Madness.

需要注意的是与Windows 10 VerifyVersionInfo也受到相同的基于清单行为(即没有为Windows 10的GUID元素,VVI行为,如果操作系统的版本号是6.2,而不是10.0.这就是说,最现实世界的测试,如IsWindowsVistaOrGreater,IsWindows7OrGreater,即使没有清单IsWindows7SP1OrGreater,IsWindows8OrGreater所有工作都会正常工作.只有当你使用IsWindows8Point1OrGreaterIsWindows10OrGreater基于清单的行为甚至重要时才会工作.

又见堆栈溢出线程.


Meh*_*ari 20

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

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


wal*_*lyk 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)
Run Code Online (Sandbox Code Playgroud)

  • 64位Windows的平台ID为VER_PLATFORM_WIN32_NT (4认同)
  • 为什么平台必须是32位? (2认同)
  • 这不再是真的.除非您将应用程序显示为Windows-8.1(及更高版本) - 感知,否则`GetVersionEx`将骗你.这在[Chuck Walbourn的回答](http://stackoverflow.com/a/27324801/1889329)中有所概述. (2认同)

小智 13

在Visual Studio 2013或更高版本中,您还可以使用新的版本帮助程序功能.

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

#include <VersionHelpers.h>

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

更多信息在这里


Ada*_*ras 6

我想你正在寻找GetVersionEx功能.