->GetVersionEx只适应于Win8及之前的系统
从Windows8.1之后,GetVersionEx这个API被微软明文给废弃了,也就是说从Windows8.1开始之后(包括Windows10),这个API常规情况下就是返回6.2了。
void GetWinOS(CString& strOsName)
{
OSVERSIONINFO osvi;
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
if (GetVersionEx(&osvi))
{
// 主版本号 osv.dwMajorVersion
// 次版本号 osv.dwMinorVersion
if (osvi.dwMajorVersion == 5L)
{
if (osvi.dwMinorVersion == 0L)
strOsName = _T("Windows 2000");
else if (osvi.dwMinorVersion == 1L)
strOsName = _T("Windows XP");
}
else if (osvi.dwMajorVersion == 6L)
{
if (osvi.dwMinorVersion == 0L)
strOsName = _T("Windows Vista");
else if (osvi.dwMinorVersion == 1L)
strOsName = _T("Windows 7");
else if (osvi.dwMinorVersion == 2L)
strOsName = _T("Windows 8 OR Later");
}
}
}
->VerifyVersionInfo 微软推荐使用
本质是拿指定的版本号和当前系统实际的版本号进行比较,比较繁琐,没有GetVersionEx用起来方便
// 是否和指定版本号相等
BOOL IsWinVerEqualTo(DWORD dwMajorVersion, DWORD dwMinorVersion)
{
OSVERSIONINFOEX osvi;
DWORDLONG dwlConditionMask = 0;
// 初始化系统版本信息数据结构
ZeroMemory(&osvi, sizeof(osvi));
osvi.dwOSVersionInfoSize = sizeof(osvi);
osvi.dwMajorVersion = dwMajorVersion;
osvi.dwMinorVersion = dwMinorVersion;
// 初始化条件掩码
VER_SET_CONDITION(dwlConditionMask, VER_MAJORVERSION, VER_EQUAL);
VER_SET_CONDITION(dwlConditionMask, VER_MINORVERSION, VER_EQUAL);
return VerifyVersionInfo(&osvi, VER_MAJORVERSION | VER_MINORVERSION, dwlConditionMask);
}
// 是否大于指定版本号
BOOL IsWinVerGreaterThan(DWORD dwMajorVersion, DWORD dwMinorVersion)
{
OSVERSIONINFOEX osvi;
DWORDLONG dwlConditionMask = 0;
// 初始化系统版本信息数据结构
ZeroMemory(&osvi, sizeof(osvi));
osvi.dwOSVersionInfoSize = sizeof(osvi);
osvi.dwMajorVersion = dwMajorVersion;
osvi.dwMinorVersion = dwMinorVersion;
// 初始化条件掩码
VER_SET_CONDITION(dwlConditionMask, VER_MAJORVERSION, VER_GREATER);
// 主板号判断
if (VerifyVersionInfo(&osvi, VER_MAJORVERSION, dwlConditionMask))
{
return TRUE;
}
// 初始化条件掩码
VER_SET_CONDITION(dwlConditionMask, VER_MAJORVERSION, VER_EQUAL);
VER_SET_CONDITION(dwlConditionMask, VER_MINORVERSION, VER_GREATER);
// 次版本号判断
return VerifyVersionInfo(&osvi, VER_MAJORVERSION | VER_MINORVERSION, dwlConditionMask);
}
// 是否小于指定版本号
BOOL IsWinVerLessThan(DWORD dwMajorVersion, DWORD dwMinorVersion)
{
OSVERSIONINFOEX osvi;
DWORDLONG dwlConditionMask = 0;
// 初始化系统版本信息数据结构
ZeroMemory(&osvi, sizeof(osvi));
osvi.dwOSVersionInfoSize = sizeof(osvi);
osvi.dwMajorVersion = dwMajorVersion;
osvi.dwMinorVersion = dwMinorVersion;
// 初始化条件掩码
VER_SET_CONDITION(dwlConditionMask, VER_MAJORVERSION, VER_LESS);
// 主板号判断
if (VerifyVersionInfo(&osvi, VER_MAJORVERSION, dwlConditionMask))
{
return TRUE;
}
// 初始化条件掩码
VER_SET_CONDITION(dwlConditionMask, VER_MAJORVERSION, VER_EQUAL);
VER_SET_CONDITION(dwlConditionMask, VER_MINORVERSION, VER_LESS);
// 次版本号判断
return VerifyVersionInfo(&osvi, VER_MAJORVERSION | VER_MINORVERSION, dwlConditionMask);
}
// 系统版本判断
void GetWinOS(CString& strOsName)
{
if (IsWinVerEqualTo(5, 1))
{
strOsName = _T("Windows XP");
}
else if(IsWinVerEqualTo(6, 0))
{
strOsName = _T("Windows Vista");
}
else if(IsWinVerEqualTo(6, 1))
{
strOsName = _T("Windows 7");
}
else if (IsWinVerEqualTo(6, 2))
{
strOsName = _T("Windows 8");
}
else if (IsWinVerEqualTo(6, 3))
{
strOsName = _T("Windows 8.1");
}
else if (IsWinVerEqualTo(10, 0))
{
strOsName = _T("Windows 10");
}
else
{
strOsName = _T("UNKNOMN");
}
}
当然如果不更改manifest文件,Win8.1和Win10 返回的版本号还是6.2,只需在<application></application>
中添加各系统ID即可,如下所示
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
<assemblyIdentity
type="win32"
name="Test.exe"
version="1.0.0.0"
processorArchitecture="X86"
/>
<description> my exe </description>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel
level="asInvoker"
uiAccess="false"
/>
</requestedPrivileges>
</security>
</trustInfo>
<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>
</assembly>
->NetWkstaGetInfo 最好的方法
头文件: Lmwksta.h (include Lm.h)
LIB: Netapi32.lib
DLL: Netapi32.dll
void GetWinOS(CString& strOsName)
{
DWORD dwLevel = 100;
LPWKSTA_INFO_100 pBuf = NULL;
NET_API_STATUS nStatus;
DWORD dwMajVer, dwMinVer;
nStatus = NetWkstaGetInfo(NULL,dwLevel,(LPBYTE *)&pBuf);
//
// 如果调用成功,取得版本信息
//
if (nStatus == NERR_Success)
{
dwMajVer = pBuf->wki100_ver_major;
dwMinVer = pBuf->wki100_ver_minor;
// 根据版本号得到系统名称
if (dwMajVer == 5L)
{
if (dwMinVer == 1L)
strOsName = _T("Windows XP");
}
else if (dwMajVer == 6L)
{
if (dwMinVer == 0L)
strOsName = _T("Windows Vista");
else if (dwMinVer == 1L)
strOsName = _T("Windows 7");
else if (dwMinVer == 2L)
strOsName = _T("Windows 8");
else if (dwMinVer == 2L)
strOsName = _T("Windows 8.1");
}
else if (dwMajVer == 10L)
{
if (dwMinVer == 0L)
strOsName = _T("Windows 10");
}
}
//
// 否则,提示系统错误
//
else
{
strOsName = _T("Windows UNKNOWN");
}
//
// 释放内存
//
if (pBuf != NULL)
NetApiBufferFree(pBuf);
}