C++ 获取 Windows 是 32 位还是 64 位版本
2020-04-01 本文已影响0人
玄坴
- 通过 API 函数 IsWow64Process 可以判断 32 位程序运行在 64 位 Windows 系统;
- 64 位程序只要能运行起来,说明操作系统是 64 位的,64 位程序不能在 32 位系统里面运行,所以 64 位程序不需要判断操作系统是不是 32 位的。
API 函数 IsWow64Process 用来判断 32 位程序运行在 64 位的 Windows 系统里面:
BOOL WINAPI IsWow64Process(
HANDLE hProcess,
PBOOL Wow64Process
);
参数 | 说明 |
---|---|
hProcess | 进程句柄 |
Wow64Process | 返回这个进程是否运行在 WOW64: TRUE: 进程是32位的,操作系统是64位的; FALSE: 进程和操作系统都是32位,或者进程和操作系统都是64位 |
返回值 | 说明 |
---|---|
≠0 | 函数执行成功 |
0 | 函数执行失败,调用 GetLastError 获取失败原因错误编码 |
虽然这个函数包含 windows.h 就可以调用了,但是 MSDN 里面的建议是考虑兼容的原因,调用 GetProcAddress 检测 Kernel32.dll 里面是否存在 IsWow64Process 函数。
为什么提供的函数是判断 WOW64 的?也许是操作系统内部的需要:
- 64 位 Windows 文件夹里面有 System32 和 SysWOW64 两个文件夹,System32 里面是 64 位的系统文件,SysWOW64 里面是 32 位的系统文件;
- 64 位的 Windows 的注册表里面,很多位置都有 WOW6432Node 分支,是存放 32 位应用程序的注册表项目。
这说明:
- 32 位程序在 32 位系统里面运行,64 位程序在 64 位系统里面运行,他们对应的系统文件和注册表项都在正常的位置,System32 或正常的注册表项位置;
- 只有 32 位程序在 64 位系统里面运行的时候,系统文件和注册表在对应的 WOW64 分支。
判断应用程序自己是 32 位还是 64 位的 Windows 程序,可以用_WIN32 和 _WIN64 这两个宏定义。
宏定义 | 32位应用 | 64位应用 | 说明 |
---|---|---|---|
_WIN32 | [√] |
[√] |
32 位 和 64 位 Windows 应用都有 |
_WIN64 | [ ] |
[√] |
只有 64 位 Windows 应用里面有 |
示例程序:
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);
}
运行结果:
选择 32-bit Windows 编译运行 选择 64-bit Windows 编译运行 把 32 位的 exe 文件复制到 32 位的 Windows 7 电脑里面运行