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);
}
