获取Windows系统版本

->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);

}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值