因为要通过对系统位数的判断,来决定程序中不同的操作。
最开始想到Qt中是否有封装好的类,发现了QSysInfo类可以为我们提供一些有关当前系统的底层信息。在QSysInfo类中 QSysInfo::WordSize 可以返回“编译应用程序的平台的指针大小(32或64)”。但是在实际使用过程中,发现其返回的32或64是根据编译器决定的,若编译成32位即返回32,63位即返回64。
所以只能使用windows系统函数来判断当前系统环境,在Windows系统函数中有一个IsWow64Process function,可使用确定指定的进程是否在WOW64下运行。但官方明确说明:
为了与不支持此功能的操作系统兼容,请调用 GetProcAddress来检测是否 在Kernel32.dll中实现了IsWow64Process。如果GetProcAddress成功,则调用此函数是安全的。否则,WOW64不存在。请注意,此技术不是检测操作系统是否为64位版本的Windows的可靠方法,因为当前版本的32位Windows中的Kernel32.dll也包含此功能。
所以使用 GetProcAddress function,此方法可以从指定的动态链接库(DLL)中检索导出的函数或变量的地址。在Kernel32.dll中有一个GetNativeSystemInfo function可以检索有关当前系统的信息,向改函数中传入一个SYSTEM_INFO structure,在改结构体中包含了处理器体系结构(wProcessorArchitecture属性)可以是:PROCESSOR_ARCHITECTURE_AMD64、PROCESSOR_ARCHITECTURE_ARM、PROCESSOR_ARCHITECTURE_ARM64、PROCESSOR_ARCHITECTURE_IA64、PROCESSOR_ARCHITECTURE_INTEL、PROCESSOR_ARCHITECTURE_UNKNOWN这些值中的一个,所以可以根据这些值来判断系统是否为64位。
具体代码如下:
1 BOOL Is64BitSystem() 2 { 3 typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO); 4 PGNSI pGNSI; 5 SYSTEM_INFO si; 6 ZeroMemory(&si, sizeof(SYSTEM_INFO)); 7 pGNSI =(PGNSI) GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "GetNativeSystemInfo"); 8 if (pGNSI) 9 { 10 pGNSI(&si); 11 12 if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64 || 13 si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64 || 14 si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_ARM64) 15 { 16 return TRUE; 17 } 18 } 19 return FALSE; 20 }