开发某应用软件时,需要获取当前系统架构是x64还是x32。程序为32位应用程序,运行在Win10 64系统下,但是通过api函数GetSystemInfo获取的cpu架构为x86(32位),这显然是不正确的
因为Win32程序在Win64上运行需要借助WOW64,它是一个32位的仿真器,微软利用它,来让一个32位程序无缝的运行在64位系统上,在进程创建时,WOW64会为我们的32位进程设置环境变量如下:
WOW64 实现详细信息 - Win32 apps | Microsoft LearnWOW64 模拟器在用户模式下运行。https://learn.microsoft.com/zh-cn/windows/win32/winprog64/wow64-implementation-details?redirectedfrom=MSDN
由此可见在32位进程中,我们的进程环境变量中的PROCESSOR_ARCHITECTURE被设置为x86,所以我们使用GetSystemInfo的时候,会得到CPU架构x86
解决方案:就是使用GetNativeSystemInfo函数代替GetSystemInfo,这个函数会将有关当前系统的信息检索到在WOW64下运行的应用程序
代码如下:
BOOL IsX64System() {
SYSTEM_INFO si;
GetNativeSystemInfo(&si);
return si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64 ||
si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64 ? true : false;
}