轉載:https://blog.csdn.net/sunflover454/article/details/51525179
轉載:https://blog.csdn.net/magictong/article/details/40753519
轉載:https://blog.csdn.net/ryu2003/article/details/52064494
#include <iostream> #include <Windows.h> #include <atlstr.h> #pragma warning(disable : 4996) CString GetSystemName() { SYSTEM_INFO info; //用SYSTEM_INFO結構判斷64位AMD處理器 GetSystemInfo(&info); //調用GetSystemInfo函數填充結構 OSVERSIONINFOEX os; os.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); CString osname = L"unknown OperatingSystem."; if (GetVersionEx((OSVERSIONINFO *)&os)) { //下面根據版本信息判斷操作系統名稱 switch (os.dwMajorVersion)//判斷主版本號 { case 4: switch (os.dwMinorVersion)//判斷次版本號 { case 0: if (os.dwPlatformId == VER_PLATFORM_WIN32_NT) osname = L"Microsoft Windows NT 4.0"; //1996年7月發布 else if (os.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) osname = L"Microsoft Windows 95"; break; case 10: osname = L"Microsoft Windows 98"; break; case 90: osname = L"Microsoft Windows Me"; break; } break; case 5: switch (os.dwMinorVersion) //再比較dwMinorVersion的值 { case 0: osname = L"Microsoft Windows 2000";//1999年12月發布 break; case 1: osname = L"Microsoft Windows XP";//2001年8月發布 break; case 2: if (os.wProductType == VER_NT_WORKSTATION && info.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) { osname = L"Microsoft Windows XP Professional x64 Edition"; } else if (GetSystemMetrics(SM_SERVERR2) == 0) osname = "Microsoft Windows Server 2003";//2003年3月發布 else if (GetSystemMetrics(SM_SERVERR2) != 0) osname = L"Microsoft Windows Server 2003 R2"; break; } break; case 6: switch (os.dwMinorVersion) { case 0: if (os.wProductType == VER_NT_WORKSTATION) osname = L"Microsoft Windows Vista"; else osname = L"Microsoft Windows Server 2008";//服務器版本 break; case 1: if (os.wProductType == VER_NT_WORKSTATION) osname = L"Microsoft Windows 7"; else osname = L"Microsoft Windows Server 2008 R2"; break; case 2: if (os.wProductType == VER_NT_WORKSTATION) osname = L"Microsoft Windows 8"; else osname = L"Microsoft Windows Server 2012"; break; case 3: if (os.wProductType == VER_NT_WORKSTATION) osname = L"Microsoft Windows 8.1"; else osname = L"Microsoft Windows Server 2012 R2"; break; } break; case 10: switch (os.dwMinorVersion) { case 0: if (os.wProductType == VER_NT_WORKSTATION) osname = L"Microsoft Windows 10"; else osname = L"Microsoft Windows Server 2016 Technical Preview";//服務器版本 break; } break; } } return osname; } int main() { CString strOSversion = GetSystemName(); return 0; }
注:現在系統升級很快,這對軟件開發人員來說是個打擊,測試起來太麻煩,要考慮的兼容性問題也越來越多,坑也越來越多。。。
雖然核心代碼就一個函數:GetVersionEx,但是Win8.1和Win10獲取到的版本缺一直是6.2(Win8)
仔細閱讀微軟說明:https://msdn.microsoft.com/en-us/library/ms724832.aspx
問題的原因:簡單講就是兼容問題。可以通過修改manifest文件解決,也可以采用新的API來獲取版本號。
由於新的API在低版本操作系統沒有,還要特別處理,我們干脆使用修改manifest文件的方法,提高程序自身的兼容性,從而得到正確的系統版本信息。
<?xml version="1.0" encoding="UTF-8"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> <application> <!-- Windows 10 --> <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/> <!-- Windows 8.1 --> <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/> <!-- Windows Vista --> <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/> <!-- Windows 7 --> <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/> <!-- Windows 8 --> <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/> </application> </compatibility> </assembly>
代碼不變,只需要把項目屬性設置一下就好了
配置目標那里選則所有配置,配置屬性->清單工具->輸入和輸出-附加清單文件 填寫compatibility.xml,並把這個文件拷貝到項目源代碼目錄。
具體設置如下圖所示:
2.獲取CPU名稱、內核數目、主頻
轉載:https://blog.csdn.net/github_37567324/article/details/79925776
#include <iostream> #include <Windows.h> void GetCpuInfo(CString &chProcessorName, CString &chProcessorType, DWORD &dwNum, DWORD &dwMaxClockSpeed) { CString strPath = _T("HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0");//注冊表子鍵路徑 CRegKey regkey;//定義注冊表類對象 LONG lResult;//LONG型變量-反應結果 lResult = regkey.Open(HKEY_LOCAL_MACHINE, LPCTSTR(strPath), KEY_ALL_ACCESS); //打開注冊表鍵 if (lResult != ERROR_SUCCESS) { return; } WCHAR chCPUName[50] = { 0 }; DWORD dwSize = 50; //獲取ProcessorNameString字段值 if (ERROR_SUCCESS == regkey.QueryStringValue(_T("ProcessorNameString"), chCPUName, &dwSize)) { chProcessorName = chCPUName; } //查詢CPU主頻 DWORD dwValue; if (ERROR_SUCCESS == regkey.QueryDWORDValue(_T("~MHz"), dwValue)) { dwMaxClockSpeed = dwValue; } regkey.Close();//關閉注冊表 //UpdateData(FALSE); //獲取CPU核心數目 SYSTEM_INFO si; memset(&si, 0, sizeof(SYSTEM_INFO)); GetSystemInfo(&si); dwNum = si.dwNumberOfProcessors; switch (si.dwProcessorType) { case PROCESSOR_INTEL_386: { chProcessorType.Format(_T("Intel 386 processor")); } break; case PROCESSOR_INTEL_486: { chProcessorType.Format(_T("Intel 486 Processor")); } break; case PROCESSOR_INTEL_PENTIUM: { chProcessorType.Format(_T("Intel Pentium Processor")); } break; case PROCESSOR_INTEL_IA64: { chProcessorType.Format(_T("Intel IA64 Processor")); } break; case PROCESSOR_AMD_X8664: { chProcessorType.Format(_T("AMD X8664 Processor")); } break; default: chProcessorType.Format(_T("未知")); break; } } int main() { CString chProcessorName, chProcessorType; DWORD dwNum, dwMaxClockSpeed; GetCpuInfo(chProcessorName,chProcessorType,dwNum,dwMaxClockSpeed); return 0; }