美文网首页C++ Builder 编程技巧
C++ 获取 Windows 是 32 位还是 64 位版本

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

作者: 玄坴 | 来源:发表于2020-04-01 07:26 被阅读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 电脑里面运行

    相关文章

      网友评论

        本文标题:C++ 获取 Windows 是 32 位还是 64 位版本

        本文链接:https://www.haomeiwen.com/subject/vqkmuhtx.html