码源

获取Windows 10版本信息

2015-12-01  本文已影响203人  李书文

自从Windows 8.1 (包括Windows 10)之后,原有的GetVersion和GetVersionEx就没法返回正确的Windows版本信息了。按照Microsoft上的介绍来讲:希望开发不是用系统的版本号来进行功能的开发,而是希望开发者用类似Feature Detection的方式来进行开发。虽然这个想法很美好,但是为了能向下兼容,有时候还是需要获取到当前Windows的详细的版本信息。
网络上常见的方式是通过嵌入Manifest, 然后指定兼容的WIndows版本让GetVersion这一系列的函数能返回正确的版本信息。但这个方法感觉太过麻烦,即使没有升级内容,也需要根据不同版本的Windows来对Manifest进行升级。下面介绍两种不同过Manifest的方法来获取到正确的Windows版本信息。

HMODULE hKernel32 = GetModuleHandleA("KERNEL32.DLL");
char kernel32Path[256] = {0};
GetModuleFileNameA(hKernel32, kernel32Path, 256);

DWORD               dwSize              = 0;
BYTE                *pVersionInfo       = NULL;
VS_FIXEDFILEINFO    *pFileInfo          = NULL;
UINT                pLenFileInfo        = 0;


/*getting the file version info size */
dwSize = GetFileVersionInfoSizeA(kernel32Path, NULL);
if ( dwSize == 0 ) {
    cout << "Error in GetFileVersionInfoSize: " << GetLastError() << endl;
    return 1;
}

pVersionInfo = new BYTE[dwSize]; /*allocation of space for the verison size */

if (!GetFileVersionInfoA( kernel32Path, 0, dwSize, pVersionInfo )) { 
    /*entering all info data to pbVersionInfo*/
    cout << "Error in GetFileVersionInfo: %d" << GetLastError() << endl;
    delete[] pVersionInfo;
    return 1;
}

if (!VerQueryValueA(pVersionInfo, "\\", (LPVOID*) &pFileInfo, &pLenFileInfo)) {
    cout << "Error in VerQueryValue: %d" << GetLastError() << endl;
    delete[] pVersionInfo;
    return 1;
}

int major  = (pFileInfo->dwFileVersionMS >> 16) & 0xffff ;
int minor  = (pFileInfo->dwFileVersionMS)       & 0xffff;
int hotfix = (pFileInfo->dwFileVersionLS >> 16) & 0xffff;
int other  = (pFileInfo->dwFileVersionLS)       & 0xffff; 

delete[] pVersionInfo;

cout << "OS Version: " << major << "." << minor << "." << hotfix << "." << other << endl;
上一篇 下一篇

猜你喜欢

热点阅读