C++すべてのUSBデバイスを取得すべてのUSBデバイスを列挙すべてのUSB HUBを列挙

2574 ワード

最近、USB関連のコンテンツを開発していますが、ここではUSBデバイスを挙げるコード(USB HUBも挙げられます)を記録します.
システム定義のGUIDを直接使用するのは問題があるので、ヘッダファイルでは関連するGUIDを自分で定義する必要があります.
ヘッダファイルコードは以下の通りです(USB DEVICEとUSB HUBの2種類のGUIDが定義されています.その他はmsdnを参照してください).
#pragma once

#include "resource.h"
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#pragma comment(lib, "Winmm.lib")
#pragma comment(lib, "setupapi.lib")

DEFINE_GUID(GUID_DEVINTERFACE_USB_DEVICE,
	0xA5DCBF10L, 0x6530, 0x11D2, 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED);
#define   GUID_CLASS_USB_DEVICE                   GUID_DEVINTERFACE_USB_DEVICE  



DEFINE_GUID(GUID_DEVINTERFACE_USB_HUB,
	0xf18a0e88, 0xc30c, 0x11d0, 0x88, 0x15, 0x00, 0xa0, 0xc9, 0x06, 0xbe, 0xd8);

#define		GUID_CLASS_USB_HUB GUID_DEVINTERFACE_USB_HUB

関数コードは以下の通り、コードで使用されるGUID_CLASS_USB_HUB、GUIDが使えますCLASS_USB_DEVICEは、接続されたすべてのUSBデバイスを取得します.
void getDevices()
{
	LPGUID lpGuid = (LPGUID)&GUID_CLASS_USB_HUB;//
	int INTERFACE_DETAIL_SIZE = 1024;
	int nCount = 0;
	HDEVINFO info = SetupDiGetClassDevs(lpGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_INTERFACEDEVICE);

	//enumerate device information  
	DWORD required_size = 0;
	int i;
	SP_DEVINFO_DATA DeviceInfoData = { sizeof(DeviceInfoData) };

	DWORD DataT;
	DWORD buffersize = 1024;
	DWORD req_bufsize = 0;

	for (i = 0; SetupDiEnumDeviceInfo(info, i, &DeviceInfoData); i++)
	{
		WCHAR *did = new WCHAR[1024];
		WCHAR *locid = new WCHAR[1024];
		WCHAR *locdesc = new WCHAR[1024];
		//get device description information
		if (!SetupDiGetDeviceInstanceId(info, &DeviceInfoData, (PTSTR)did, buffersize, &req_bufsize))
			continue;
		if (!SetupDiGetDeviceRegistryPropertyW(info, &DeviceInfoData, SPDRP_LOCATION_PATHS, &DataT, (LPBYTE)locid, buffersize, &req_bufsize))
			continue;

		if (!SetupDiGetDeviceRegistryPropertyW(info, &DeviceInfoData, SPDRP_LOCATION_INFORMATION, &DataT, (LPBYTE)locdesc, buffersize, &req_bufsize))
			continue;
	}

	SetupDiDestroyDeviceInfoList(info);
}

上記コードでは、GUIDを変更してUSBデバイスの情報を取得することができます.上記のコードは、SetupDiGetDeviceInstanceID関数を用いてDeviceIDを取得し、SetupDiGetDeviceRegistryPropertyW関数を用いて関連属性を取得し、例ではLocation pathとlocation Infoを取得し、その他の情報を取得してもよい.関連情報はここで定義する.