C++ Builder 编程技巧

C++ 获取 Windows 是 32 位还是 64 位版本

2020-04-01  本文已影响0人  玄坴

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 的?也许是操作系统内部的需要:

这说明:

判断应用程序自己是 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 电脑里面运行
上一篇下一篇

猜你喜欢

热点阅读