デバイスマネージャーから見ることができるようなデバイスの一覧を取得する方法はいくつかあるが、Setup APIを利用すると比較的簡単に取得できる。
デバイスはSetupDiEnumDeviceInfoを使って列挙できる。あとは見つかったデバイスから必要な情報を取得すればいい。
SetupDiGetDeviceRegistryPropertyを利用すればデバイスに関する各種情報を取得できる。ここではデバイスの説明用文字列の取り出しのみに利用し、列挙されたすべてのデバイスをMessageBoxで表示するようにした。
#include "atlstr.h" #include <devguid.h> #include <regstr.h> #include <setupapi.h> #pragma comment(lib,"setupapi.lib") bool Test(void) { bool ret; DWORD dwIndex; TCHAR* pszName; DWORD dwSize; DWORD dwRegType; BOOL bRet; HDEVINFO hDevInfo; SP_DEVINFO_DATA sDevInfo; CAtlString strMessage; hDevInfo = ::SetupDiGetClassDevs(NULL,0,0,DIGCF_PRESENT | DIGCF_ALLCLASSES); if(hDevInfo == INVALID_HANDLE_VALUE) return false; ret = false; dwIndex = 0; ::ZeroMemory(&sDevInfo,sizeof(SP_DEVINFO_DATA)); sDevInfo.cbSize = sizeof(SP_DEVINFO_DATA); while(1) { bRet = ::SetupDiEnumDeviceInfo(hDevInfo,dwIndex++,&sDevInfo); if(bRet == FALSE) break; ret = false; //デバイス名(説明)の取得 dwSize = 0; bRet = ::SetupDiGetDeviceRegistryProperty(hDevInfo,&sDevInfo,SPDRP_DEVICEDESC,&dwRegType,NULL,0,&dwSize); pszName = new TCHAR[dwSize]; if(pszName == NULL) break; bRet = ::SetupDiGetDeviceRegistryProperty(hDevInfo,&sDevInfo,SPDRP_DEVICEDESC,&dwRegType,(BYTE*)pszName,dwSize,&dwSize); if(bRet == FALSE) { delete pszName; continue; } strMessage += pszName; delete pszName; { //フレンドリーネームの取得 //取得できないことが多いので取得できない場合もcontinueしない dwSize = 0; bRet = ::SetupDiGetDeviceRegistryProperty(hDevInfo,&sDevInfo,SPDRP_FRIENDLYNAME,&dwRegType,NULL,0,&dwSize); pszName = new TCHAR[dwSize]; if(pszName) { bRet = ::SetupDiGetDeviceRegistryProperty(hDevInfo,&sDevInfo,SPDRP_FRIENDLYNAME,&dwRegType,(BYTE*)pszName,dwSize,&dwSize); if(bRet) { strMessage += _T(" ("); strMessage += pszName; strMessage += _T(")"); } delete pszName; } } strMessage += _T("\n"); ret = true; } ::SetupDiDestroyDeviceInfoList(hDevInfo); ::MessageBox(NULL,strMessage,_T(""),MB_OK); return ret; }プロジェクトファイルをダウンロード