我想检测当前Windows操作系统是32位还是64位。如何使用C ++实现? 我不想要处理器类型,而是想要操作系统的位类型。这是因为您可以在64位处理器上安装32位操作系统。
我想检测当前Windows操作系统是32位还是64位。如何使用C ++实现? 我不想要处理器类型,而是想要操作系统的位类型。这是因为您可以在64位处理器上安装32位操作系统。
您可以在程序中将Windows命令systeminfo
作为一个进程运行。
#include <stdlib.h>
system("systeminfo");
系统类型:基于 x86 的个人电脑
或 系统类型:基于 x64 的个人电脑
这可能比其他人提供的解决方案更复杂,但我认为我应该将其作为一种可能性添加进来。(也许您还需要额外的信息。)IsWow64Process()
函数那样简单。 - Alexey Ivanov新版本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机器。 如果有人可以测试其他情况,我会很感激他们给我一些反馈,让我知道我所做的设计是否适用于他们。
我写了一篇文章,深入解释了上述代码的工作原理。
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;
}
}
一个简单的检查方法是,如果EXE文件无法运行,则表示64位可执行文件正在32位机器上运行。64位机器将始终运行32位可执行文件。
来自Microsoft的信息如下:
大多数为32位Windows版本设计的程序都可以在64位Windows版本上运行。但许多杀毒软件等程序是例外。
为32位Windows版本设计的设备驱动程序无法在运行64位Windows版本的计算机上工作。如果您尝试安装只有32位驱动程序的打印机或其他设备,则在64位Windows版本上无法正常工作。
然而,在Windows中,您还可以检查Program Files(x86)文件夹的存在作为另一种简单的检查方法。不需要变得复杂。