检测32位或64位Windows

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了检测32位或64位Windows相关的知识,希望对你有一定的参考价值。

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

答案

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

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

另一答案

一个简单的检查是,如果EXE没有运行,那么它是一个在32位机器上运行的64位可执行文件。 64位计算机将始终运行32位可执行文件。

来自Microsoft

为32位版本的Windows设计的大多数程序都可以在64位版本的Windows上运行。值得注意的例外是许多防病毒程序。

为32位版本的Windows设计的设备驱动程序在运行64位版本Windows的计算机上不起作用。如果您尝试安装只有32位驱动程序的打印机或其他设备,则无法在64位版本的Windows上正常运行。

但是,在Windows中,您还可以检查是否存在Program Files(x86)文件夹作为另一个简单检查。没必要花哨。

另一答案

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

另一答案
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
}
另一答案

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

另一答案

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

另一答案

使用GetNativeSystemInfo函数。它得到一个LPSYSTEM_INFO参数来得到你想要的。

SYSTEM_INFO结构:

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

另一答案

这是另一种方法:GetSystemWow64Directory - “检索WOW64使用的系统目录的路径。这个目录在32位Windows上不存在。”并且“在32位Windows上,该函数始终失败,并且扩展错误设置为ERROR_CALL_NOT_IMPLEMENTED。”

我个人不确定IsWow64Process的使用,因为在MSDN中IsWow64Process的描述中有文字“请注意,这种技术不是一种可靠的方法来检测操作系统是否是64位版本的Windows,因为Kernel32当前版本的32位Windows中的.dll也包含此功能。“

另一答案

您可以在程序中运行Windows命令systeminfo作为进程。

#include <stdlib.h>

system("systeminfo");

其中一个返回类别是系统类型。

它的输出为:System Type: x86-based PC,或System Type: x64-based PC

这可能是一个比其他人提供的解决方案更复杂的解决方案,但我认为我会将其添加为可能性。 (也许你也在追加其他信息。)

另一答案
 static bool is64bitOS()
   {
      SYSTEM_INFO si;
      GetSystemInfo(&si);

      if((si.wProcessorArchitecture & PROCESSOR_ARCHITECTURE_IA64)||(si.wProcessorArchitecture & PROCESSOR_ARCHITECTURE_AMD64)==64)
      {
         return true;
      }
      else
      {
         return false;
      }

   }

以上是关于检测32位或64位Windows的主要内容,如果未能解决你的问题,请参考以下文章

从用户代理或 Javascript 检测 64 位或 32 位 Windows?

在 64 位 Windows 上安装 32 位或 64 位应用程序有啥区别?

如何根据浏览器在同一页面上嵌入 32 位或 64 位 ActiveX 控件?

安装的jvm是64位或32位[重复]

MSVC:以64位代码读取特定的64位或32位寄存器(例如R10)?

Visual Studio - C++ - 作为 32 位或 64 位构建和运行应用程序 - 从适当的 ProgramFiles 目录加载 DLL