检测32位或64位Windows

时间:2011-08-10 12:53:30

标签: c++ windows 32bit-64bit

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

13 个答案:

答案 0 :(得分:44)

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

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

答案 1 :(得分:16)

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

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

答案 3 :(得分:7)

如果您的应用是32位应用,则可以使用IsWow64Process,如果您使用的是x64操作系统,那么它是32位

答案 4 :(得分:5)

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

答案 5 :(得分:3)

使用GetNativeSystemInfo功能。它获得LPSYSTEM_INFO参数来获得您想要的内容。

SYSTEM_INFO结构:

  

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

答案 6 :(得分:1)

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

#include <stdlib.h>

system("systeminfo");

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

其输出显示为:System Type: x86-based PCSystem Type: x64-based PC

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

答案 7 :(得分:1)

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

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

答案 8 :(得分:0)

bool IsX64win()
{
    UINT x64test = GetSystemWow64DirectoryA(NULL, 0);
    if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)  return FALSE;
    else return TRUE;
}

答案 9 :(得分:0)

Windows较新版本的答案

尽管有几个人和Microsoft Docs为此提出了IsWow64Process2的建议,但我在研究中没有看到任何代码示例。这就是为什么我想向社区贡献这个答案。

根据running 32 bit applications documentation page,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计算机。如果有人可以测试其他方案,那么我会反馈一些有关我完成的设计是否对他们有用的反馈。

我写了一个article,它更深入地解释了上面的代码是如何工作的。

答案 10 :(得分:0)

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

如果为 4,则为 32 位
如果是 8 则它是 64 位

答案 11 :(得分:-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;
      }

   }

答案 12 :(得分:-2)

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

来自Microsoft

  

为32位版本的Windows设计的大多数程序都可以使用   64位版本的Windows。值得注意的例外是许多防病毒软件   程序

     

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

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