Qt中判斷windows系統位數
因為要通過對系統位數的判斷,來決定程序中不同的操作。
最開始想到Qt中是否有封裝好的類,發現了QSysInfo類可以為我們提供一些有關當前系統的底層信息。在QSysInfo類中 QSysInfo::WordSize 可以返回“編譯應用程序的平臺的指針大小(32或64)”。但是在實際使用過程中,發現其返回的32或64是根據編譯器決定的,若編譯成32位即返回32,63位即返回64。
所以只能使用windows系統函數來判斷當前系統環境,在Windows系統函數中有一個IsWow64Process function,可使用確定指定的進程是否在WOW64下運行。但官方明確說明:
為了與不支持此功能的操作系統兼容,請調用 GetProcAddress
所以使用 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系統位數