CPU数などのCPU関連情報を取得する

Windows XPから使えるようになったAPIにGetNativeSystemInfoがある。この関数を利用するとCPU数、CPUアーキテクチャ種(64ビット環境か32ビットかなど)の情報を取得できる。

依存環境:ATL
#include "atlstr.h"


//
//	CPU情報の取得
//
//取得できるのはCPU数など一部の情報のみ。
//実際のCPU型番(「Core Duo T2600」など)はこの関数では取得できない。
//とは言うもののCPU型番を推測するための情報として利用できる。
//
//pwProcessorArchitectureなどの詳しい情報はMSDNのSYSTEM_INFOを参照すること
//
//対応:Windows XP以降
//
bool	GetCPUInformation(DWORD* pdwNumberOfProcessors,WORD* pwProcessorArchitecture,DWORD* pdwProcessorType,WORD* pwProcessorLevel,WORD* pwProcessorRevision)
{
	SYSTEM_INFO	sInfo;
	HMODULE		hDLL;

	void	(CALLBACK* pfnGetNativeSystemInfo)(LPSYSTEM_INFO);

	if(pdwNumberOfProcessors)
		*pdwNumberOfProcessors = 0;
	if(pwProcessorArchitecture)
		*pwProcessorArchitecture = 0;
	if(pdwProcessorType)
		*pdwProcessorType = 0;
	if(pwProcessorLevel)
		*pwProcessorLevel = 0;
	if(pwProcessorRevision)
		*pwProcessorRevision = 0;

	hDLL = ::LoadLibrary(_T("Kernel32.dll"));
	if(hDLL == NULL)
		return	false;

	(*(FARPROC*)&pfnGetNativeSystemInfo) = ::GetProcAddress(hDLL,"GetNativeSystemInfo");
	if(pfnGetNativeSystemInfo == NULL)
	{
		::FreeLibrary(hDLL);
		return	false;
	}

	::ZeroMemory(&sInfo,sizeof(SYSTEM_INFO));
	pfnGetNativeSystemInfo(&sInfo);
	::FreeLibrary(hDLL);

	if(pdwNumberOfProcessors)
		*pdwNumberOfProcessors = sInfo.dwNumberOfProcessors;
	if(pwProcessorArchitecture)
		*pwProcessorArchitecture = sInfo.wProcessorArchitecture;
	if(pdwProcessorType)
		*pdwProcessorType = sInfo.dwProcessorType;
	if(pwProcessorLevel)
		*pwProcessorLevel = sInfo.wProcessorLevel;
	if(pwProcessorRevision)
		*pwProcessorRevision = sInfo.wProcessorRevision;

	return	true;
}




void	Test(void)
{
	bool		ret;
	DWORD		dwNumberOfProcessors;
	CAtlString	strMessage;

	ret = GetCPUInformation(&dwNumberOfProcessors,NULL,NULL,NULL,NULL);

	if(ret)
	{
		strMessage.Format(_T("CPU(コア)は %d 個"),dwNumberOfProcessors);
		::MessageBox(NULL,strMessage,_T(""),MB_OK);
	}
	else
		::MessageBox(NULL,_T("取得に失敗しました"),_T(""),MB_OK);
}

プロジェクトファイルをダウンロード


カテゴリー「システム情報」 のエントリー