码迷,mamicode.com
首页 > Windows程序 > 详细

Qt中判断windows系统位数

时间:2018-04-04 12:32:57      阅读:1347      评论:0      收藏:0      [点我收藏+]

标签:api   运行   结构   size   als   wow   变量   mem   一个   

因为要通过对系统位数的判断,来决定程序中不同的操作。

最开始想到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 }

 

Qt中判断windows系统位数

标签:api   运行   结构   size   als   wow   变量   mem   一个   

原文地址:https://www.cnblogs.com/joker-wz/p/8715669.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!