VC++ 获取CPU的型号主频和核数(附源码)
Posted dvlinker
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VC++ 获取CPU的型号主频和核数(附源码)相关的知识,希望对你有一定的参考价值。
有时我们需要获取CPU的型号、主频以及CPU的核数,去判断CPU的性能。对于型号和主频,我们可以从注册表中读取;对于CPU核数,则可以调用系统ntdll.dll库中没有公开的接口NtQuerySystemInformation去获取。
1、读取CPU型号
从系统注册表路径HKEY_LOCAL_MACHINE\\HARDWARE\\DESCRIPTION\\System
\\CentralProcessor\\0中读取即可,注册表中如下:
代码如下:
//获取CPU型号
void GetCpuType( CUIString& strCpuType )
TCHAR szCPUName[256] = 0;
DWORD dwSize=256;
CUIString strPath=_T("HARDWARE\\\\DESCRIPTION\\\\System\\\\CentralProcessor\\\\0");//注册表子键路径
CRegKey regkey;//定义注册表类对象
LONG lResult;//LONG型变量-反应结果
lResult=regkey.Open(HKEY_LOCAL_MACHINE,LPCTSTR(strPath),KEY_QUERY_VALUE); //打开注册表键
if (lResult!=ERROR_SUCCESS)
return ;
//获取ProcessorNameString字段值
if (ERROR_SUCCESS == regkey.QueryStringValue(_T("ProcessorNameString"),szCPUName,&dwSize))
strCpuType = szCPUName;
return ;
regkey.Close();//关闭注册表
return ;
2、获取CPU主频
也是从系统注册表路径HKEY_LOCAL_MACHINE\\HARDWARE\\DESCRIPTION\\System
\\CentralProcessor\\0中读取的,代码如下:
//获取CPU主频
DWORD GetCpuFreq()
DWORD dwSize=50;
CUIString strPath=_T("HARDWARE\\\\DESCRIPTION\\\\System\\\\CentralProcessor\\\\0");//注册表子键路径
CRegKey regkey;//定义注册表类对象
LONG lResult;//LONG型变量-反应结果
lResult=regkey.Open(HKEY_LOCAL_MACHINE,LPCTSTR(strPath),KEY_QUERY_VALUE); //打开注册表键
if (lResult!=ERROR_SUCCESS)
return dwSize;
//查询CPU主频
DWORD dwValue;
if (ERROR_SUCCESS == regkey.QueryDWORDValue(_T("~MHz"),dwValue))
regkey.Close();//关闭注册表
return dwValue;
3、获取CPU核数
此处是调用系统ntdll.dll库中没有公开的接口NtQuerySystemInformation去获取。代码中要提供该接口对应的结构体SYSTEM_BASIC_INFORMATION,该结构体也是未公开的:
typedef struct
DWORD dwUnknown1;
ULONG uKeMaximumIncrement;
ULONG uPageSize;
ULONG uMmNumberOfPhysicalPages;
ULONG uMmLowestPhysicalPage;
ULONG uMmHighestPhysicalPage;
ULONG uAllocationGranularity;
PVOID pLowestUserAddress;
PVOID pMmHighestUserAddress;
ULONG uKeActiveProcessors;
BYTE bKeNumberProcessors;
BYTE bUnknown2;
WORD wUnknown3;
SYSTEM_BASIC_INFORMATION;
获取核数的代码如下:
u32 GetCpuCoreNum()
SYSTEM_BASIC_INFORMATION SysBaseInfo;
LONG status;
NtQuerySystemInfo = (PROCNTQSI)GetProcAddress( GetModuleHandle( _T("ntdll") ), "NtQuerySystemInformation" );
if (!NtQuerySystemInfo)
return 1;
// get number of processors in the system
status = NtQuerySystemInfo(SystemBasicInformation,&SysBaseInfo,sizeof(SysBaseInfo),NULL);
if (status != NO_ERROR)
return 1;
return SysBaseInfo.bKeNumberProcessors;
以上是关于VC++ 获取CPU的型号主频和核数(附源码)的主要内容,如果未能解决你的问题,请参考以下文章
如何获取 Android 设备的CPU核数,时钟频率以及内存大小