检测Windows的32位或64位版本

51

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


可能是重复的问题: https://dev59.com/JXI_5IYBdhLWcg3wJfkM - user72424
他并不是在询问代码是否以32位或64位编译,而是试图找到安装的操作系统版本。 - Hayri Uğur Koltuk
重复的问题,已有更完整的答案,请参考https://dev59.com/EEvSa4cB1Zd3GeqPfZKO。 - Fabio Zadrozny
14个回答

0

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

#include <stdlib.h>

system("systeminfo");

其中一个返回的类别是系统类型。
它的输出为:系统类型:基于 x86 的个人电脑系统类型:基于 x64 的个人电脑 这可能比其他人提供的解决方案更复杂,但我认为我应该将其作为一种可能性添加进来。(也许您还需要额外的信息。)

如果2.5年后仍然有人给我点踩,能否附上说明?如果这已不是有效选项,请不要犹豫告诉我 :) - sealz
或者是三年后的那个 O-o - sealz
2
这是一个有效的答案。然而,解析另一个进程的输出并不像调用专门设计用于此目的的IsWow64Process()函数那样简单。 - Alexey Ivanov
1
它打印了许多与OP所要求的内容无关的系统信息,请使用**IsWow64Process()**方法。 - Haseeb Mir

0

新版本Windows的答案

虽然有几个人和Microsoft Docs建议使用IsWow64Process2,但在我的研究中我没有看到任何代码示例。这就是为什么我想为社区做出贡献并提供这个答案。

根据运行32位应用程序文档页面,Microsoft建议在Windows 10上使用IsWow64Process2而不是IsWow64Process

32位应用程序可以通过调用IsWow64Process函数(如果针对Windows 10,请使用IsWow64Process2)来检测是否在WOW64下运行。

此函数适用于 Windows 10 版本1511(客户端)和 Windows Server 2016 及以上版本。

它有两个参数,通过这两个参数返回信息:pProcessMachine 和 pNativeMachine。两者都返回Image File Machine Constants

pProcessMachine 返回关于目标进程是否在 WOW64 模拟器下运行的信息,如果是,还会返回它是哪种类型的进程。

pNativeMachine 返回有关 Windows 主机架构的信息。

使用这两个返回值,可以确定 Windows 是32位还是64位(这就是 OP 所问的),以及该进程是否在 WOW64 下运行,以及该进程是32位还是64位。

以下是我为此编写的功能:

BOOL getBits(BOOL& windowsIs32Bit, BOOL& isWOW64, BOOL& processIs32Bit)
{
  USHORT ProcessMachine;
  USHORT NativeMachine;

  if (!IsWow64Process2(GetCurrentProcess(), &ProcessMachine, &NativeMachine)) {
    std::cerr << "IsWOW64Process2 returned FALSE (failed). GetLastError returned: " << GetLastError() << std::endl;
    return FALSE;
  }

  if (ProcessMachine == IMAGE_FILE_MACHINE_UNKNOWN) {
    isWOW64 = FALSE;

    if (NativeMachine == IMAGE_FILE_MACHINE_IA64 || NativeMachine == IMAGE_FILE_MACHINE_AMD64 || NativeMachine == IMAGE_FILE_MACHINE_ARM64) {
      windowsIs32Bit = FALSE;
      processIs32Bit = FALSE;

      return TRUE;
    }

    if (NativeMachine == IMAGE_FILE_MACHINE_I386 || NativeMachine == IMAGE_FILE_MACHINE_ARM) {
      windowsIs32Bit = TRUE;
      processIs32Bit = TRUE;

      return TRUE;
    }

    std::cerr << "Unknown Windows Architecture." << std::endl;
    return FALSE;
  }

  windowsIs32Bit = FALSE;
  isWOW64 = TRUE;
  processIs32Bit = TRUE;

  return TRUE;
}

这是上述函数的一个使用示例:
int main() {

  BOOL windowsIs32Bit;
  BOOL isWOW64;
  BOOL processIs32Bit;

  if (!getBits(windowsIs32Bit, isWOW64, processIs32Bit)) {
    return -1;
  }

  std::cout << (windowsIs32Bit ? "Windows is 32 bit" : "Windows is 64 bit") << std::endl;
  std::cout << (isWOW64 ? "This process *is* running under WOW64" : "This process is *not* running under WOW64") << std::endl;
  std::cout << (processIs32Bit ? "This process is 32 bit" : "This process is 64 bit") << std::endl;

  return 0;
}

我只能测试上述代码的两种情况,因为我只有一台64位机器上的64位Windows。 我没有32位机器或32位Windows,也没有任何ARM机器。 如果有人可以测试其他情况,我会很感激他们给我一些反馈,让我知道我所做的设计是否适用于他们。

我写了一篇文章,深入解释了上述代码的工作原理。


-1
 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;
      }

   }

1
除了错误代码“==64”之外,它还无法正常工作。对于32位应用程序,它无法检测到64位操作系统。您应该按照以下说明使用“GetNativeSystemInfo”。 - gast128

-2

一个简单的检查方法是,如果EXE文件无法运行,则表示64位可执行文件正在32位机器上运行。64位机器将始终运行32位可执行文件。

来自Microsoft的信息如下:

大多数为32位Windows版本设计的程序都可以在64位Windows版本上运行。但许多杀毒软件等程序是例外。

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

然而,在Windows中,您还可以检查Program Files(x86)文件夹的存在作为另一种简单的检查方法。不需要变得复杂。


4
程序无法运行时,它如何得出任何结论呢? - Hans Passant
制作一堆编译在不同架构和位数上的“Hello World”程序,然后尝试从您的应用程序中执行它们 - 无论哪个子程序运行都表示主机能够执行什么“个性”。(您甚至可以检测到更多的可运行特性,例如.NET框架支持,例如.NET 3.0/4.0;当这样做时,拥有正确的QT库或其他常见库也可能会显露出来。) - Alexander Stohr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接