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