判斷作業系統是32位元或64位元
在32位元作業系統尚未淘汰,64位元系統日益漸多的時代,我們的程式需要滿足最大的相容性,
勢必需要同時支援32/64bit作業系統,以服務更多使用者需求,
關鍵函數:IsWow64Process
用途:判斷當前的32bit程式是否在Wow64中執行
BOOL WINAPI IsWow64Process(
_In_ HANDLE hProcess,
_Out_ PBOOL Wow64Process
);
在這補充個小資訊,為何32位元程式可以在64位元作業系統運作?
是因為在64bit作業系統執行32bit的程式時,程式會運行在64位元作業系統中的模擬的32位元環境執行程式,
這個模擬的環境就叫做Wow64(Windows 32-bit on Windows 64-bit),
所以我們可以在64bit作業系統下,看到一個系統資料夾:C:\Windows\SysWOW64就是用來處理WOW64的主要核心,
翻譯:
32bit程式 + 32bit OS = System32
32bit程式 + 64bit OS = SysWow64
64bit程式 + 32bit OS = 系統會告訴你不能執行!
64bit程式 + 64bit OS = System32
此判斷方法僅限於32位元程式,但判斷絕對精準,所以推薦使用此方法判斷32/64作業系統.
程式範例如下:
#include <windows.h> #include <tchar.h> typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL); LPFN_ISWOW64PROCESS fnIsWow64Process; BOOL IsWow64() { BOOL bIsWow64 = FALSE; //IsWow64Process is not available on all supported versions //of Windows. Use GetModuleHandle to get a handle to the //DLL that contains the function and GetProcAddress to get //a pointer to the function if available. fnIsWow64Process = (LPFN_ISWOW64PROCESS) GetProcAddress( GetModuleHandle(TEXT("kernel32")),"IsWow64Process"); if(NULL != fnIsWow64Process) { if (!fnIsWow64Process(GetCurrentProcess(),&bIsWow64)) { //handle error } } return bIsWow64; } int _tmain(int argc, _TCHAR* argv[]) { TCHAR s_setup[MAX_PATH]; ZeroMemory(s_setup,sizeof(TCHAR)*MAX_PATH); if(IsWow64()) { _tprintf(TEXT("This is a 64bit OS...\n")); } else { _tprintf(TEXT("This is a 32bit OS...\n")); } system("pause"); return 0; }
1. 宣告函數指標:要從Kernel32.dll引用函數,所以宣告一個函數指標,這函數指標功能等同於引用之函數
typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
LPFN_ISWOW64PROCESS fnIsWow64Process;
2. 引用IsWow64Process函數:用GetProcAddress和GetModuleHandle從Kernel32.dll中引用IsWow64Process函數
fnIsWow64Process = (LPFN_ISWOW64PROCESS) GetProcAddress(
GetModuleHandle(TEXT("kernel32")),"IsWow64Process");
3. 判斷是否為64位元作業系統:
fnIsWow64Process == NULL -> 回傳FALSE -> 32位元作業系統
fnIsWow64Process != NULL -> bIsWow64 == FALSE -> 回傳FALSE -> 32位元作業系統
fnIsWow64Process != NULL -> bIsWow64 == TRUE -> 回傳TRUE -> 64位元作業系統
留言列表