如何准确地检测Visual 2012.3中本机(C/C++)项目上当前Windows操作系统的情况?
我已经在MS推荐下看过VersionHelperAPI了,但是这个解决方案只适用于VS2013。
以前我们使用过GetVersionEx()
,但是我想要一种更稳定、更有前途的解决方案。看起来,微软计划在未来不再支持这一点。
发布于 2015-12-17 03:14:31
重要的是在清单文件中包含兼容性标志:
以下是有关部分:
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- Windows 10 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
<!-- Windows 8.1 -->
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
<!-- Windows Vista -->
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
<!-- Windows 7 -->
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
<!-- Windows 8 -->
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
</application>
</compatibility>
如果没有上面的标记,当运行在Windows10上时,GetVersionEx
和VerifyVersionInfoW
将看到Windows8
微软坚持认为你应该使用VerifyVersionInfoW
而不是GetVersionEx
。
有些助手函数在早期版本中是不可用的。但在您的计算机上,您可以在以下目录中找到它们:
"C:\Program Files (x86)\Windows Kits\8.1\Include\um\VersionHelpers.h"
下面是它们的特点(我稍微修改了它们,因为它们太长了,并且测试了Windows 10,您应该反复检查旧版本的Windows )。
#define _WIN32_WINNT_NT4 0x0400
#define _WIN32_WINNT_WIN2K 0x0500
#define _WIN32_WINNT_WINXP 0x0501
#define _WIN32_WINNT_WS03 0x0502
#define _WIN32_WINNT_WIN6 0x0600
#define _WIN32_WINNT_VISTA 0x0600
#define _WIN32_WINNT_WS08 0x0600
#define _WIN32_WINNT_LONGHORN 0x0600
#define _WIN32_WINNT_WIN7 0x0601
#define _WIN32_WINNT_WIN8 0x0602
#define _WIN32_WINNT_WINBLUE 0x0603
#define _WIN32_WINNT_WIN10 0x0A00
BOOL IsWinVersionOrGreater(DWORD id, WORD wServicePackMajor)
{
WORD wMajorVersion = HIBYTE(id);
WORD wMinorVersion = LOBYTE(id);
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 = wMajorVersion;
osvi.dwMinorVersion = wMinorVersion;
osvi.wServicePackMajor = wServicePackMajor;
return VerifyVersionInfoW(&osvi, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR, dwlConditionMask) != FALSE;
}
BOOL IsWindowsXPOrGreater() { return IsWinVersionOrGreater(_WIN32_WINNT_WINXP, 0);}
BOOL IsWindowsXPSP1OrGreater() { return IsWinVersionOrGreater(_WIN32_WINNT_WINXP, 1);}
BOOL IsWindowsXPSP2OrGreater() { return IsWinVersionOrGreater(_WIN32_WINNT_WINXP, 2);}
BOOL IsWindowsXPSP3OrGreater() { return IsWinVersionOrGreater(_WIN32_WINNT_WINXP, 3);}
BOOL IsWindowsVistaOrGreater() { return IsWinVersionOrGreater(_WIN32_WINNT_VISTA, 0);}
BOOL IsWindowsVistaSP1OrGreater(){ return IsWinVersionOrGreater(_WIN32_WINNT_VISTA, 1);}
BOOL IsWindowsVistaSP2OrGreater(){ return IsWinVersionOrGreater(_WIN32_WINNT_VISTA, 2);}
BOOL IsWindows7OrGreater() { return IsWinVersionOrGreater(_WIN32_WINNT_WIN7, 0);}
BOOL IsWindows7SP1OrGreater() { return IsWinVersionOrGreater(_WIN32_WINNT_WIN7, 1);}
BOOL IsWindows8OrGreater() { return IsWinVersionOrGreater(_WIN32_WINNT_WIN8, 0);}
BOOL IsWindows8Point1OrGreater() { return IsWinVersionOrGreater(_WIN32_WINNT_WINBLUE, 0); }
BOOL IsWindows10OrGreater() { return IsWinVersionOrGreater(_WIN32_WINNT_WIN10, 0); }
BOOL IsWindowsServer()
{
OSVERSIONINFOEXW osvi = { sizeof(osvi), 0, 0, 0, 0,{ 0 }, 0, 0, 0, VER_NT_WORKSTATION };
DWORDLONG const dwlConditionMask = VerSetConditionMask(0, VER_PRODUCT_TYPE, VER_EQUAL);
return !VerifyVersionInfoW(&osvi, VER_PRODUCT_TYPE, dwlConditionMask);
}
https://stackoverflow.com/questions/34235151
复制相似问题