1. 程式人生 > >Qt中判斷windows系統位數

Qt中判斷windows系統位數

windows系統 sin 我們 位數 fun AR blank 結構體 system

因為要通過對系統位數的判斷,來決定程序中不同的操作。

最開始想到Qt中是否有封裝好的類,發現了QSysInfo類可以為我們提供一些有關當前系統的底層信息。在QSysInfo類中 QSysInfo::WordSize 可以返回“編譯應用程序的平臺的指針大小(32或64)”。但是在實際使用過程中,發現其返回的32或64是根據編譯器決定的,若編譯成32位即返回32,63位即返回64。

所以只能使用windows系統函數來判斷當前系統環境,在Windows系統函數中有一個IsWow64Process function,可使用確定指定的進程是否在WOW64下運行。但官方明確說明:

為了與不支持此功能的操作系統兼容,請調用 GetProcAddress

來檢測是否 在Kernel32.dll中實現了IsWow64Process。如果GetProcAddress成功,則調用此函數是安全的。否則,WOW64不存在。請註意,此技術不是檢測操作系統是否為64位版本的Windows的可靠方法,因為當前版本的32位Windows中的Kernel32.dll也包含此功能。

所以使用 GetProcAddress function,此方法可以從指定的動態鏈接庫(DLL)中檢索導出的函數或變量的地址。在Kernel32.dll中有一個GetNativeSystemInfo function可以檢索有關當前系統的信息,向改函數中傳入一個SYSTEM_INFO structure,在改結構體中包含了處理器體系結構(wProcessorArchitecture屬性)可以是:PROCESSOR_ARCHITECTURE_AMD64、PROCESSOR_ARCHITECTURE_ARM、PROCESSOR_ARCHITECTURE_ARM64、PROCESSOR_ARCHITECTURE_IA64、PROCESSOR_ARCHITECTURE_INTEL、PROCESSOR_ARCHITECTURE_UNKNOWN這些值中的一個,所以可以根據這些值來判斷系統是否為64位。

具體代碼如下:

 1 BOOL Is64BitSystem()
 2 {
 3     typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO);
 4     PGNSI pGNSI;
 5     SYSTEM_INFO si;
 6     ZeroMemory(&si, sizeof(SYSTEM_INFO));
 7     pGNSI =(PGNSI) GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "GetNativeSystemInfo");
 8     if (pGNSI)
9 { 10 pGNSI(&si); 11 12 if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64 || 13 si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64 || 14 si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_ARM64) 15 { 16 return TRUE; 17 } 18 } 19 return FALSE; 20 }

Qt中判斷windows系統位數