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
相關文章
- 如何優雅獲的獲取不同系統版本中的程式資訊
- 無影雲電腦獲取windows密碼的方法Windows密碼
- Windows系統安全獲取重要資訊的方法(一)Windows
- 乾貨:不同場景容器內獲取客戶端源IP的方法客戶端
- 獲取方法
- 09 獲取需求的方法
- Oracle database 19c中獲取當前資料庫版本的方法OracleDatabase資料庫
- 獲取類名稱的方法
- PHP --反射 --獲取類的方法PHP反射
- MFC中獲取程式自身的版本資訊
- php一句話獲取獲取檔案目錄的方法PHP
- 獲取Windows遠端桌面埠Windows
- Windows Media Player播放器(VC++ 2008)Windows播放器C++
- VC++ MFC程式設計版本資訊控制C++C程式程式設計
- C獲取程式名稱的方法
- Java獲取Object中Value的方法JavaObject
- 獲取 Class 物件的 3 種方法物件
- Javascript獲取原型的四種方法JavaScript原型
- Appium Android 獲取WebView元素的方法APPAndroidWebView
- 為不同專案指定不同的 PHP 版本PHP
- 在Windows 11中解除安裝更新的不同方法Windows
- 獲取app版本號相關資訊APP
- 【exp/imp不同版本】Oracle不同版本的exp/imp使用注意事項Oracle
- windows10版本號在哪看_檢視windows10版本的方法Windows
- 關於如何獲取資料的方法
- PHP獲取HTTP body內容的方法PHPHTTP
- python request 獲取cookies value值的方法PythonCookie
- Spring LocalVariableTableParameterNameDiscoverer獲取方法的引數名Spring
- 如何獲取服務的 git 分支及 commit 版本號GitMIT
- Winform獲取並設定WebBrowser所用的IE核心版本ORMWeb
- 如何升級電腦windows版本 windows系統版本升級方法介紹Windows
- windows獲取實際cpu speed(非物理)Windows
- Windows10系統檢視DX版本的方法Windows
- go-carbon 1.3.3 版本釋出,新增獲取星座方法和判斷是否是某個星座方法Go
- 封裝getParam方法 ,獲取URL封裝
- jqGrid獲取json資料方法JSON
- 前端常用的echart獲取地圖json方法前端地圖JSON
- js獲取dom節點的方法有哪些JS
- python元組有哪些獲取元素的方法Python