判斷作業系統是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位元作業系統
