检测32位或64位Windows

Rah*_*hul 46 c++ windows 32bit-64bit

我想检测当前的Windows操作系统是32位还是64位.如何使用C++实现它?我不想要处理器类型我想要OS的位类型.这是因为您可以在64位处理器上安装32位操作系统.

Bo *_*son 45

要调用的函数是IsWow64Process.它会告诉您的32位应用程序是否在64位Windows上运行.

如果程序编译为64位,它就已经知道了.

  • @GetFree:“*如果该函数存在,这足以表明它是 64 位 Windows,对吗?*” - 否。`IsWow64Process()` 存在于 32 位版本的 XP SP2 及更高版本中。 (3认同)
  • msdn说该功能存在并不意味着它是64位Windows。“为了与不支持此功能的操作系统兼容,请调用GetProcAddress以检测是否在Kernel32.dll中实现了IsWow64Process。如果GetProcAddress成功,则可以安全地调用此函数。否则,将不存在WOW64。请注意,此技术是不是一种可靠的方法来检测操作系统是否为Windows的64位版本,因为当前版本的32位Windows中的Kernel32.dll也包含此功能。” (2认同)

sha*_*oth 16

如果您的代码是64位并且正在运行,那么Windows是64位 - 无需检查.如果您的进程是32位调用IsWow64Process()- 32位进程在64位Windows上以WOW64运行,否则不使用WOW64.

  • @Wolf:AFAIK这个函数不会改变程序状态 - 它只返回一个布尔值,就是全部.MSDN从未提到调用此函数会导致任何程序状态更改. (2认同)

小智 11

bool getWindowsBit(bool & isWindows64bit)
{
#if _WIN64

    isWindows64bit =  true;
    return true;

#elif _WIN32

    BOOL isWow64 = 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.

    LPFN_ISWOW64PROCESS fnIsWow64Process  = (LPFN_ISWOW64PROCESS) 
GetProcAddress(GetModuleHandle(TEXT("kernel32")),"IsWow64Process");

    if(fnIsWow64Process)
    {
        if (!fnIsWow64Process(GetCurrentProcess(), &isWow64))
            return false;

        if(isWow64)
            isWindows64bit =  true;
        else
            isWindows64bit =  false;

        return true;
    }
    else
        return false;

#else

    assert(0);
    return false;

#endif
}
Run Code Online (Sandbox Code Playgroud)

  • 取自http://msdn.microsoft.com/en-gb/library/windows/desktop/ms684139(v=vs.85).aspx (4认同)
  • 你应该添加你的来源,以避免剽窃的怀疑. (2认同)

Nec*_*lis 7

如果您的应用程序是32位应用程序,您可以使用IsWow64Process,如果您在x64操作系统上运行它是真的,否则它是32位


Hay*_*tuk 5

使用GetNativeSystemInfo功能。它获取一个LPSYSTEM_INFO参数来获得你想要的东西。

SYSTEM_INFO 结构体:

wProcessorArchitecture
已安装操作系统的处理器架构。

  • @ThreeBit:这个答案很好。你所说的“GetSystemInfo”是真的,这个答案需要“GetNativeSystemInfo” (4认同)
  • 微软的文档是错误的,事实上 wProcessorArchitecture 不返回安装的操作系统处理器架构,而是返回应用程序构建的架构。 (2认同)

Han*_*ant 5

你需要使用GetNativeSystemInfo.鉴于您希望这可以在32位操作系统上运行,您需要使用LoadLibrary+ GetProcAddress以便您可以处理此功能不可用.因此,如果失败,您就知道它是一个32位操作系统.如果没有,SYSTEM_INFO.wProcessorArchitecture则为您提供真实的处理器类型而不是模拟的处理器类型.