SetupDi関数を使用して、接続されているすべてのUSBデバイスのデバイスパスを列挙しようとしています。デバイスパスはCreateFile()で使用されるパスなので、デバイスと通信できます。
ただし、 SetupDiGetDeviceInterface にはインターフェイスが必要ですGUIDしかし、特定のインターフェイス(接続されているすべてのUSB以外)を具体的に探しているわけではありません。この部分は/ *とコメントされています??? * /以下のソースで。
試行されたソリューション:
GUID_DEVCLASS_UNKNOWN = {0x4d36e97e、0xe325、0x11ce、{0xbf、0xc1、0x08、0x00、0x2b、0xe1、0x03、0x18}}を指定しようとしました;しかし、これは「これ以上のインターフェース」エラーをスローしました。
また、deviceInfoData.ClassGuidをSetupDiGetDeviceInterfaceに提供しようとしましたが、上記と同じエラー、「これ以上インターフェイスはありません」が発生します。
質問:
すべてのUSBデバイスをカバーする一般的なインターフェイスクラスはありますか? (HID、ジェネリックなど)
または、デバイスへのパスを提供する代替機能はありますか? (SetupDiGetDeviceInterfaceDetailによって返されたSP_DEVICE_INTERFACE_DETAIL_DATA構造の逆引き)。
出典:
HDEVINFO deviceInfoList
SP_DEVINFO_DATA deviceInfoData;
deviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
SP_DEVICE_INTERFACE_DATA deviceInterfaceData;
PSP_DEVICE_INTERFACE_DETAIL_DATA deviceInterfaceDetailData = NULL;
DWORD requiredLength = 0;
char *hardwareID = 0;
// Retrieve a list of all present devices
deviceInfoList = SetupDiGetClassDevs(NULL, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE | DIGCF_ALLCLASSES);
if (deviceInfoList == INVALID_HANDLE_VALUE) {
SetupDiDestroyDeviceInfoList(deviceInfoList);
return false;
}
// Iterate over the list
for (DWORD i = 0; SetupDiEnumDeviceInfo(deviceInfoList, i, &deviceInfoData); i++) {
if (deviceInterfaceDetailData) LocalFree(deviceInterfaceDetailData);
requiredLength = 0;
SetupDiGetDeviceRegistryProperty(deviceInfoList, &deviceInfoData, SPDRP_HARDWAREID, &DataT, NULL, 0, &requiredLength);
if (requiredLength <= 0) {
SetupDiDestroyDeviceInfoList(deviceInfoList);
return false;
}
hardwareID = new char[requiredLength]();
SetupDiGetDeviceRegistryProperty(deviceInfoList, &deviceInfoData, SPDRP_HARDWAREID, &DataT, (PBYTE)hardwareID, requiredLength, NULL);
// Parse hardwareID for vendor ID and product ID
delete hardwareID;
hardwareID = 0;
deviceInterfaceData.cbSize = sizeof(SP_INTERFACE_DEVICE_DATA);
// Requires an interface GUID, for which I have none to specify
if (!SetupDiEnumDeviceInterfaces(deviceInfoList, &deviceInfoData, /* ??? */, 0, &deviceInterfaceData)) {
SetupDiDestroyDeviceInfoList(deviceInfoList);
return false;
}
if (!SetupDiGetDeviceInterfaceDetail(deviceInfoList, &deviceInterfaceData, NULL, 0, &requiredLength, NULL)) {
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER && requiredLength > 0) {
deviceInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)LocalAlloc(LPTR, requiredLength);
if (!deviceInterfaceDetailData) {
SetupDiDestroyDeviceInfoList(deviceInfoList);
return false;
}
} else {
SetupDiDestroyDeviceInfoList(deviceInfoList);
return false;
}
}
deviceInterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
if (!SetupDiGetDeviceInterfaceDetail(deviceInfoList, &deviceInterfaceData, deviceInterfaceDetailData, requiredLength, NULL, &deviceInfoData)) {
SetupDiDestroyDeviceInfoList(deviceInfoList);
return false;
}
SetupDiDestroyDeviceInfoList(deviceInfoList);
// deviceInterfaceDetailData->DevicePath yields the device path
}
[〜#〜] msdn [〜#〜] は、GUID_DEVINTERFACE_USB_DEVICE
という名前の汎用USBデバイスインターフェイスクラスがあり、GUID {A5DCBF10-6530-11D2-901F-00C04FB951ED}
:
システムが提供するUSBハブドライバーは、GUID_DEVINTERFACE_USB_DEVICEのインスタンスを登録して、USBハブに接続されているUSBデバイスの存在をシステムとアプリケーションに通知します。
これはコード例です DEVINTERFACE_USB_DEVICE GUIDを使用して、やりたいことを実行しているようです。