- 通過 API 函數(shù) IsWow64Process 可以判斷 32 位程序運行在 64 位 Windows 系統(tǒng);
- 64 位程序只要能運行起來,說明操作系統(tǒng)是 64 位的,64 位程序不能在 32 位系統(tǒng)里面運行,所以 64 位程序不需要判斷操作系統(tǒng)是不是 32 位的。
API 函數(shù) IsWow64Process 用來判斷 32 位程序運行在 64 位的 Windows 系統(tǒng)里面:
BOOL WINAPI IsWow64Process(
HANDLE hProcess,
PBOOL Wow64Process
);
參數(shù) | 說明 |
---|---|
hProcess | 進程句柄 |
Wow64Process | 返回這個進程是否運行在 WOW64: TRUE: 進程是32位的,操作系統(tǒng)是64位的; FALSE: 進程和操作系統(tǒng)都是32位,或者進程和操作系統(tǒng)都是64位 |
返回值 | 說明 |
---|---|
≠0 | 函數(shù)執(zhí)行成功 |
0 | 函數(shù)執(zhí)行失敗,調(diào)用 GetLastError 獲取失敗原因錯誤編碼 |
雖然這個函數(shù)包含 windows.h 就可以調(diào)用了,但是 MSDN 里面的建議是考慮兼容的原因,調(diào)用 GetProcAddress 檢測 Kernel32.dll 里面是否存在 IsWow64Process 函數(shù)。
為什么提供的函數(shù)是判斷 WOW64 的?也許是操作系統(tǒng)內(nèi)部的需要:
- 64 位 Windows 文件夾里面有 System32 和 SysWOW64 兩個文件夾,System32 里面是 64 位的系統(tǒng)文件,SysWOW64 里面是 32 位的系統(tǒng)文件;
- 64 位的 Windows 的注冊表里面,很多位置都有 WOW6432Node 分支,是存放 32 位應(yīng)用程序的注冊表項目。
這說明:
- 32 位程序在 32 位系統(tǒng)里面運行,64 位程序在 64 位系統(tǒng)里面運行,他們對應(yīng)的系統(tǒng)文件和注冊表項都在正常的位置,System32 或正常的注冊表項位置;
- 只有 32 位程序在 64 位系統(tǒng)里面運行的時候,系統(tǒng)文件和注冊表在對應(yīng)的 WOW64 分支。
判斷應(yīng)用程序自己是 32 位還是 64 位的 Windows 程序,可以用_WIN32 和 _WIN64 這兩個宏定義。
宏定義 | 32位應(yīng)用 | 64位應(yīng)用 | 說明 |
---|---|---|---|
_WIN32 | [√] |
[√] |
32 位 和 64 位 Windows 應(yīng)用都有 |
_WIN64 | [ ] |
[√] |
只有 64 位 Windows 應(yīng)用里面有 |
示例程序:
bool IsAppProcessWOW64(void)
{
typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS)(HANDLE, PBOOL);
HMODULE hKernel32 = GetModuleHandle(L"kernel32");
if(hKernel32)
{
LPFN_ISWOW64PROCESS lpfnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress(hKernel32, "IsWow64Process");
if(lpfnIsWow64Process)
{
BOOL bIsWow64 = FALSE;
if(lpfnIsWow64Process(GetCurrentProcess(),&bIsWow64))
return bIsWow64;
}
}
return false;
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
bool bIsWOW64 = IsAppProcessWOW64();
bool bIsWindows64; // 64-bit Windows
#if defined(_WIN64)
bIsWindows64 = true;
#else
bIsWindows64 = bIsWOW64;
#endif
UnicodeString s = L"WOW64: ";
s += bIsWOW64 ? L"是" : L"否";
s += L"\r\n64-bit Windows: ";
s += bIsWindows64 ? L"是" : L"否";
ShowMessage(s);
}
運行結(jié)果:
選擇 32-bit Windows 編譯運行
選擇 64-bit Windows 編譯運行
把 32 位的 exe 文件復(fù)制到 32 位的 Windows 7 電腦里面運行