获取Windows系统版本

来源:互联网 发布:淘宝如何好评截图 编辑:程序博客网 时间:2024/05/21 08:59

->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);}
0 0
原创粉丝点击