語言:C/C++
編程軟件:VS2015
字符集:UNICODE編碼
【1】說明
1、由於GetVersionEx函數在Windows 8.1版本之後,返回的結果全部是6.2,這函數被微軟動了手腳的,但是實際上可以利用額外添加一個manifest文件指示兼容新版本.
(參看文章:http://blog.csdn.net/k1988/article/details/47614529)
2、GetVersionEx函數還有一個問題,就是當使用兼容模式打開程序時,它返回的是兼容模式下的系統版本號.
由於以上這兩個問題,建議用Version Helper系列的函數或使用直接內核的函數獲取系統版本信息.
(文章:https://msdn.microsoft.com/en-us/library/windows/desktop/dn424972(v=vs.85).aspx)
這裏直接使用ntdll.dll裏的內核函數,獲取系統版本信息.
【2】實現:
//獲取系統版本號
#define SYSTEM_VERSION_UNKNOW _T("未知的操作系統")
BOOL GetSystemVersion(LPWSTR version, DWORD lenth)
{
BOOL Wow64;
SYSTEM_INFO info;
//判斷是否是在64位系統模擬層上運行
if (!IsWow64Process(GetCurrentProcess(), &Wow64))
return FALSE;
//獲取CPU信息
if (Wow64)
GetNativeSystemInfo(&info);
else
GetSystemInfo(&info);
//定義變量
typedef LONG(__stdcall *fnRtlGetVersion)(PRTL_OSVERSIONINFOW lpVersionInformation);
fnRtlGetVersion pRtlGetVersion;
HMODULE hNtdll;
LONG ntStatus;
RTL_OSVERSIONINFOEXW os;
//獲取函數
hNtdll = GetModuleHandle(_T("ntdll.dll"));
if (hNtdll == NULL)
return FALSE;
pRtlGetVersion = (fnRtlGetVersion)GetProcAddress(hNtdll, "RtlGetVersion");
if (pRtlGetVersion == NULL)
return FALSE;
//獲取系統相關信息
os.dwOSVersionInfoSize = sizeof(RTL_OSVERSIONINFOEXW);
ntStatus = pRtlGetVersion((PRTL_OSVERSIONINFOW)&os);
if (ntStatus != 0)
return FALSE;
//判斷是什麼系統
switch (os.dwMajorVersion){
case 4:
{
switch (os.dwMinorVersion) { //Minor
case 0:
{
if (os.dwPlatformId == VER_PLATFORM_WIN32_NT)
wcscpy_s(version, lenth, _T("Microsoft Windows NT 4.0"));
else if (os.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
wcscpy_s(version, lenth, _T("Microsoft Windows 95"));
break;
}
case 10:
{
wcscpy_s(version, lenth, _T("Microsoft Windows 98"));
break;
}
case 90:
{
wcscpy_s(version, lenth, _T("Microsoft Windows Me"));
break;
}
default:
{
wcscpy_s(version, lenth, SYSTEM_VERSION_UNKNOW);
break;
}
}
break;
}
case 5:
{
switch (os.dwMinorVersion) {
case 0:
{
wcscpy_s(version, lenth, _T("Microsoft Windows 2000"));
break;
}
case 1:
{
wcscpy_s(version, lenth, _T("Microsoft Windows XP"));
break;
}
case 2:
{
if (os.wProductType == VER_NT_WORKSTATION &&
info.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
wcscpy_s(version, lenth, _T("Microsoft Windows XP Professional x64 Edition"));
else if (os.wSuiteMask == VER_SUITE_WH_SERVER)
wcscpy_s(version, lenth, _T("Microsoft Windows Home Server"));
else if (GetSystemMetrics(SM_SERVERR2) == 0)
wcscpy_s(version, lenth, _T("Microsoft Windows Server 2003"));
else if (GetSystemMetrics(SM_SERVERR2) != 0)
wcscpy_s(version, lenth, _T("Microsoft Windows Server 2003 R2"));
break;
}
default:
{
wcscpy_s(version, lenth, SYSTEM_VERSION_UNKNOW);
break;
}
}
break;
}
case 6:
{
switch (os.dwMinorVersion) {
case 0:
{
if (os.wProductType == VER_NT_WORKSTATION)
wcscpy_s(version, lenth, _T("Microsoft Windows Vista"));
else
wcscpy_s(version, lenth, _T("Microsoft Windows Server 2008"));
break;
}
case 1:
{
if (os.wProductType == VER_NT_WORKSTATION)
wcscpy_s(version, lenth, _T("Microsoft Windows 7"));
else
wcscpy_s(version, lenth, _T("Microsoft Windows Server 2008 R2"));
break;
}
case 2:
{
if (os.wProductType == VER_NT_WORKSTATION)
wcscpy_s(version, lenth, _T("Microsoft Windows 8"));
else
wcscpy_s(version, lenth, _T("Microsoft Windows Server 2012"));
break;
}
case 3:
{
if (os.wProductType == VER_NT_WORKSTATION)
wcscpy_s(version, lenth, _T("Microsoft Windows 8.1"));
else
wcscpy_s(version, lenth, _T("Microsoft Windows Server 2012 R2"));
break;
}
}
break;
}
case 10:
{
if (os.dwMinorVersion == 0)
{
if (os.wProductType == VER_NT_WORKSTATION)
wcscpy_s(version, lenth, _T("Microsoft Windows 10"));
else
wcscpy_s(version, lenth, _T("Microsoft Windows Server 2016"));
}
else
{
wcscpy_s(version, lenth, SYSTEM_VERSION_UNKNOW);
}
break;
}
default:
{
wcscpy_s(version, lenth, SYSTEM_VERSION_UNKNOW);
break;
}
}
if ((wcscmp(version, SYSTEM_VERSION_UNKNOW) != 0))
{
if(os.dwBuildNumber != 0)
wsprintf(version, _T("%s.%u"), version, os.dwBuildNumber);
if (info.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64 || info.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64)
wcscat_s(version, lenth, _T(" 64位<基於x64的處理器>"));
else
wcscat_s(version, lenth, _T(" 32位<基於x86的處理器>"));
}
return TRUE;
}
【3】效果: