VC++獲取不同Windows版本的方法

直接來乾貨,說到獲取Windows版本,在XP和windows7時代,通常使用的做法如下:

    OSVERSIONINFOEX os; 
    os.dwOSVersionInfoSize=sizeof(OSVERSIONINFOEX); 
    if(GetVersionEx((OSVERSIONINFO *)&os)) 
    {
        double i = os.dwMajorVersion + os.dwMinorVersion * 0.1;
        if(i < 6)           //WIN7以下的系統
        //do something....
    }

這裏其實是通過os.dwMajorVersion和os.dwMinorVersion來判斷版本號的,XP的版本號是5.1,win7是6.1。
本身這種方法也沒什麼問題,但是到了win8和win10時代,抓瞎了,通過這種方式獲取出來的版本號,win7及以上都是6.1了,於是微軟告訴你,我們提供了新的API來識別版本號,這個API存在於windowsSDK8.1裏面,新的API的名字叫:
IsWindowsXPOrGreater();
IsWindowsXPSP1OrGreater();
IsWindowsXPSP2OrGreater();
IsWindowsXPSP3OrGreater();
IsWindowsVistaOrGreater();
IsWindows7OrGreater();
IsWindows7SP1OrGreater();
IsWindows8OrGreater();
……..
從名字上來看,確實通俗易懂,使用起來非常方便,這些API都存在於VersionHelpers.h這個頭文件裏面,加入就可以調用了,然而,你以爲這樣就完了?太天真了!這個頭文件在XP下根本無法調用,也就是說,如果你想你的程序可以在XP下運行,根本就不能使用這些API!編譯的時候就會報錯,如下:

fatal error C1083: 無法打開包括文件: “VersionHelpers.h”: No such file or directory

怎麼辦?別急,我們繼續往下看,分析下新的API到底是調用的什麼函數,通過查看SDK,發下:

IsWindows7OrGreater()
{
    return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN7), LOBYTE(_WIN32_WINNT_WIN7), 0);   //調用的IsWindowsVersionOrGreater函數
}

IsWindowsVersionOrGreater(WORD wMajorVersion, WORD wMinorVersion, WORD wServicePackMajor)
{
    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;
}   //調用的VerifyVersionInfoW函數

//

再查VerifyVersionInfoW,發現Windows7.1和windows8.1的SDK均包含這個函數,也就是說,可以直接通過調用這個函數來實現同樣的功能。(此函數只能通過入參來判斷當前的Windows版本是否和輸入的參數需要的版本值一致,返回爲BOOL類型)

這個函數的詳細參數和用法就參見微軟的官方說明了:
VerifyVersionInfo function

這裏給出一個調用示例:

OSVERSIONINFOEXW osvi = {0};
DWORDLONG dwlConditionMask = 0;
ZeroMemory(&osvi, sizeof(osvi));
osvi.dwOSVersionInfoSize = sizeof(osvi);
osvi.dwMajorVersion = 6;  //win主版本號
osvi.dwMinorVersion = 1;  //次版本號
VER_SET_CONDITION(dwlConditionMask, VER_MAJORVERSION, VER_EQUAL);
VER_SET_CONDITION(dwlConditionMask, VER_MINORVERSION, VER_EQUAL);

if(::VerifyVersionInfoW(&osvi, VER_MAJORVERSION | VER_MINORVERSION, dwlConditionMask))  //判斷返回值是否爲win7,返回真爲win7,否則返回0
   //do something...
   else  
   //do something...

這裏給出主流版本的主版本號和此版本號對照:


Operating system Version number
Windows 10 10.0*
Windows Server 2016 10.0*
Windows 8.1 6.3*
Windows Server 2012 R2 6.3*
Windows 8 6.2
Windows Server 2012 6.2
Windows 7 6.1
Windows Server 2008 R2 6.1
Windows Server 2008 6.0
Windows Vista 6.0
Windows Server 2003 R2 5.2
Windows Server 2003 5.2
Windows XP 64-Bit Edition 5.2
Windows XP 5.1
Windows 2000 5.0

發佈了52 篇原創文章 · 獲贊 47 · 訪問量 45萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章