C/C++判斷作業系統(Win10,Win8.1WinServer等等)-完整原始碼及思路
阿新 • • 發佈:2019-02-05
在判斷電腦系統前,我們先要知道版本號,通過函式呼叫返回的資訊,就可以知道是什麼系統。
下面這圖是官方提供的關於Windows版本對應的號碼
我們可以通過系統Windows的API中GetVersionEx這個函式獲取win8.1下的版本。
(這裡我只稍微解釋下,win8.1以上的版本用GetVersionEx將獲取不了,要用別的方法,待會將會說明)
因為本人沒有winServer2016的系統,所以在下面和程式碼裡面將不會演示獲取winServer2016。
用win10為例,該如何獲取win10
RtlGetNtVersionNumbers法
typedef void (__stdcall*NTPROC)(DWORD*,DWORD*,DWORD*);
void GetWinVer()
{
HINSTANCE hinst = LoadLibrary("ntdll.dll");
DWORD dwMajor,dwMinor,dwBuildNumber;
NTPROC proc = (NTPROC)GetProcAddress(hinst,"RtlGetNtVersionNumbers"); proc(&dwMajor,&dwMinor,&dwBuildNumber);
}
這個方法可以準備分辨出win8.1的6.3系統號。
那麼win8.1以下的版本呢?
我們呼叫GetVersionEx這個函式獲取。
下面給出程式碼,因為有註釋,在此就不再說明,邏輯思路如剛剛所說:
#include <Windows.h> #include <string> #include <stdio.h> void getSystemName() { std::string vname; //先判斷是否為win8.1或win10 typedef void(__stdcall*NTPROC)(DWORD*, DWORD*, DWORD*); HINSTANCE hinst = LoadLibrary("ntdll.dll"); DWORD dwMajor, dwMinor, dwBuildNumber; NTPROC proc = (NTPROC)GetProcAddress(hinst, "RtlGetNtVersionNumbers"); proc(&dwMajor, &dwMinor, &dwBuildNumber); if (dwMajor == 6 && dwMinor == 3) //win 8.1 { vname = "Microsoft Windows 8.1"; printf_s("此電腦的版本為:%s\n", vname.c_str()); return; } if (dwMajor == 10 && dwMinor == 0) //win 10 { vname = "Microsoft Windows 10"; printf_s("此電腦的版本為:%s\n", vname.c_str()); return; } //下面判斷不能Win Server,因為本人還未有這種系統的機子,暫時不給出 //判斷win8.1以下的版本 SYSTEM_INFO info; //用SYSTEM_INFO結構判斷64位AMD處理器 GetSystemInfo(&info); //呼叫GetSystemInfo函式填充結構 OSVERSIONINFOEX os; os.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); #pragma warning(disable:4996) if (GetVersionEx((OSVERSIONINFO *)&os)) { //下面根據版本資訊判斷作業系統名稱 switch (os.dwMajorVersion) { //判斷主版本號 case 4: switch (os.dwMinorVersion) { //判斷次版本號 case 0: if (os.dwPlatformId == VER_PLATFORM_WIN32_NT) vname ="Microsoft Windows NT 4.0"; //1996年7月釋出 else if (os.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) vname = "Microsoft Windows 95"; break; case 10: vname ="Microsoft Windows 98"; break; case 90: vname = "Microsoft Windows Me"; break; } break; case 5: switch (os.dwMinorVersion) { //再比較dwMinorVersion的值 case 0: vname = "Microsoft Windows 2000"; //1999年12月釋出 break; case 1: vname = "Microsoft Windows XP"; //2001年8月釋出 break; case 2: if (os.wProductType == VER_NT_WORKSTATION && info.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) vname = "Microsoft Windows XP Professional x64 Edition"; else if (GetSystemMetrics(SM_SERVERR2) == 0) vname = "Microsoft Windows Server 2003"; //2003年3月釋出 else if (GetSystemMetrics(SM_SERVERR2) != 0) vname = "Microsoft Windows Server 2003 R2"; break; } break; case 6: switch (os.dwMinorVersion) { case 0: if (os.wProductType == VER_NT_WORKSTATION) vname = "Microsoft Windows Vista"; else vname = "Microsoft Windows Server 2008"; //伺服器版本 break; case 1: if (os.wProductType == VER_NT_WORKSTATION) vname = "Microsoft Windows 7"; else vname = "Microsoft Windows Server 2008 R2"; break; case 2: if (os.wProductType == VER_NT_WORKSTATION) vname = "Microsoft Windows 8"; else vname = "Microsoft Windows Server 2012"; break; } break; default: vname = "未知作業系統"; } printf_s("此電腦的版本為:%s\n", vname.c_str()); } else printf_s("版本獲取失敗\n"); } void main() { getSystemName(); system("pause"); }
下面是幾臺電腦的執行結果:
首先是大家關注的win10
然後是win server2008R2
‘
然後是win7
xp系統