VC++ 获取CPU的型号、主频和核数(附源码)

       有时我们需要获取CPU的型号、主频以及CPU的核数,去判断CPU的性能。对于型号和主频,我们可以从注册表中读取;对于CPU核数,则可以调用系统ntdll.dll库中没有公开的接口NtQuerySystemInformation去获取。

VC++ 获取CPU的型号、主频和核数(附源码)_第1张图片

1、读取CPU型号

       从系统注册表路径HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System

\CentralProcessor\0中读取即可,注册表中如下:

VC++ 获取CPU的型号、主频和核数(附源码)_第2张图片

代码如下:

//获取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,型号,主频,核数)