標籤:api 運行 結構 size als wow 變數 mem 一個
因為要通過對系統位元的判斷,來決定程式中不同的操作。
最開始想到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系統位元