パソコンに接続されているデバイスを一覧する

test51_01.gif
デバイスマネージャーから見ることができるようなデバイスの一覧を取得する方法はいくつかあるが、Setup APIを利用すると比較的簡単に取得できる。
デバイスはSetupDiEnumDeviceInfoを使って列挙できる。あとは見つかったデバイスから必要な情報を取得すればいい。

test51_02.gif
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;
}
プロジェクトファイルをダウンロード

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