对较新版本的 Windows 的回答
虽然有几个人和 Microsoft Docs 为此建议了 IsWow64Process2,但我在研究中没有看到任何代码示例。这就是为什么我想将这个答案贡献给社区。p>
根据running 32 bit applications documentation page,微软建议在Windows 10 中使用IsWow64Process2 而不是IsWow64Process:
32 位应用程序可以通过调用 IsWow64Process 函数来检测它是否在 WOW64 下运行(如果针对 Windows 10,则使用 IsWow64Process2)。
此功能适用于 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,更深入地解释了上述代码的工作原理。