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的型号主频和核数(附源码)的主要内容,如果未能解决你的问题,请参考以下文章

手机CPU主频与核数

如何获取 Android 设备的CPU核数,时钟频率以及内存大小

如何获取 Android 设备的CPU核数,时钟频率以及内存大小

ubuntu怎么查看cpu的核数

day1

补全基础资料