C++ 检测32位或64位的Windows

C++ 检测32位或64位的Windows,c++,windows,32bit-64bit,C++,Windows,32bit 64bit,我想检测当前的Windows操作系统是32位还是64位。如何用C++实现?我不想要处理器类型,我想要操作系统的位类型。这是因为您可以在64位处理器上安装32位操作系统。一个简单的检查是,如果EXE未运行,则它是在32位计算机上运行的64位可执行文件。64位计算机将始终运行32位可执行文件 从 大多数为32位版本的Windows设计的程序都可以在 64位版本的Windows。值得注意的例外是许多杀毒软件 节目 为32位版本的Windows设计的设备驱动程序不起作用 在运行64位版本Windows的

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

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

大多数为32位版本的Windows设计的程序都可以在 64位版本的Windows。值得注意的例外是许多杀毒软件 节目

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

但是,在Windows中,您还可以检查Program Files(x86)文件夹是否存在,这是另一个简单的检查。无需花哨。

使用函数。它获取一个
LPSYSTEM\u INFO
参数来获取您想要的

结构:

wProcessorArchitecture

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


你需要使用。考虑到您希望它在32位操作系统上工作,您需要使用+,以便能够处理此函数不可用的情况。所以如果失败了,你知道它是一个32位操作系统。否则,
SYSTEM\u INFO.wProcessorArchitecture
将为您提供真实的处理器类型,而不是模拟的处理器类型。

如果您的代码为64位且正在运行,则Windows为64位-无需检查。如果您的进程是32位调用-32位进程在64位Windows上的WOW64中运行,否则不运行WOW64。

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


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

如果你的应用程序是32位的应用程序,如果你是在x64操作系统上运行的,那么你可以使用它,否则它是32位的,你可以在程序中作为进程运行windows命令
systeminfo

#include <stdlib.h>

system("systeminfo");
#包括
系统(“系统信息”);
返回的类别之一是系统类型

其输出为:
系统类型:基于x86的PC
,或
系统类型:基于x64的PC

这可能是一个比其他人提供的解决方案更复杂的解决方案,但我想我会添加它作为一种可能性。(可能您还需要其他信息。)

这里有另一种方法:-“检索WOW64使用的系统目录的路径。此目录在32位窗口上不存在。”和“在32位窗口上,函数总是失败,扩展错误设置为
错误调用\u未实现”


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

针对较新版本的Windows回答

虽然有几个人和微软文档对此提出了建议,但我在研究中没有看到任何代码示例。这就是为什么我想向社区贡献这个答案

根据,Microsoft建议使用适用于Windows 10的,而不是:

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

此功能适用于Windows 10版本1511(客户端)和Windows Server 2016及更高版本

这有两个返回信息的参数:pProcessMachine和pNativeMachine。这两个参数都返回

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;
}
BOOL getBits(BOOL&windowsis32位,BOOL&isWOW64,BOOL&processis32位)
{
USHORT加工机;
美国本土机器;
如果(!IsWow64Process2(GetCurrentProcess(),&ProcessMachine,&NativeMachine)){

std::cerr或者,最简单的方法是使用
sizeof(int*)
检查整数指针的大小

如果为4,则其32位

如果是8,则其64位

可能与的重复:他不是询问代码是以32位还是64位编译的,而是尝试查找已安装的os版本的副本(其中有更完整的答案).Err,当程序无法运行时,它是如何得出结论的?制作一组针对不同体系结构和位性编译的hello world程序-然后尝试从应用程序中执行它们-将运行的任何子程序都表明了所讨论的主机能够执行的“个性”。(您可能能够检测到更多的可运行性功能,如.NET framework支持,例如.NET 3.0/4.0;如果有合适的QT库或其他通用库,那么这样做也可能会暴露出来。)Microsoft的文档是错误的,事实上WPProcessorArchitecture并没有返回已安装的OS处理器体系结构,而是返回了应用程序构建的体系结构。@三位:这个答案很好。你所说的关于
GetSystemInfo
,这个答案要求
GetNativeSystemInfo
,我希望你投反对票2.5年后发生的错误请给出解释。如果这不再是一个有效的选项,请不要害怕让我知道:)或是3
 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;
      }

   }
bool IsX64win()
{
    UINT x64test = GetSystemWow64DirectoryA(NULL, 0);
    if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)  return FALSE;
    else return TRUE;
}
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;
}