У меня проблема с получением этой функции, чтобы работать. Я прочитал MSDN и под документами, и это то, что я придумаю, однако это не удается.
Поэтому я использовал SetupDiGetClassDevs, чтобы составить список всех устройств и затем сохранить их в дескрипторе. Что работает нормально, то следующим шагом является перечисление каждого устройства с использованием SetupDiEnumDeviceInterfaces и передача значения дескриптора. Вот где я потерял его, это всегда возвращает ложь. Был бы признателен за несколько советов о том, где я ошибся. Спасибо за прочтение.
#include <windows.h>
#include <setupapi.h>
#include <stdio.h>
#pragma comment(lib,"SetupAPI")
//
int main()
{
// Set up handles and data storage
HDEVINFO hDevInfo;
// Load GUID Classes
static GUID GUID_DEVINTERFACE_USB_HUB={ 0xf18a0e88, 0xc30c, 0x11d0, {0x88, 0x15, 0x00, 0xa0, 0xc9, 0x06, 0xbe, 0xd8} };
static GUID GUID_DEVINTERFACE_USB_DEVICE ={ 0xA5DCBF10L, 0x6530, 0x11D2, { 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED } };
static GUID GUID_DEVINTERFACE_USB_HOST_CONTROLLER={ 0x3abf6f2d, 0x71c4, 0x462a, {0x8a, 0x92, 0x1e, 0x68, 0x61, 0xe6, 0xaf, 0x27}};
//
SP_DEVICE_INTERFACE_DATA ifdata;
// Create a HDEVINFO with all present devices.
hDevInfo = SetupDiGetClassDevs(NULL,0, 0, DIGCF_PRESENT | DIGCF_ALLCLASSES | DIGCF_DEVICEINTERFACE);
//
if (INVALID_HANDLE_VALUE == hDevInfo)
{
return FALSE;
}
else
{
printf("Device info set handle for all devices attached to system: 0x%x\n", hDevInfo);
}
//
BOOL bResult = TRUE;
DWORD nCount = 0;
//
while (bResult)
{
//
ifdata.cbSize=sizeof(ifdata);
//
bResult = SetupDiEnumDeviceInterfaces(
hDevInfo,
NULL,
&GUID_DEVINTERFACE_USB_DEVICE,
(ULONG)nCount,
&ifdata);//
if(!bResult)
{
printf("Error Failed\n");
//fails here with error 6 invalid handle
}
}// Cleanup
SetupDiDestroyDeviceInfoList(hDevInfo);
//
system ("pause");
//
return 0;
}
Ваш звонок в SetupDiGetClassDevs
неверно, потому что информация об устройстве устанавливает элементы, которые она возвращает, в конечном итоге отсутствуют списки интерфейсов устройства, которые SetupDiEnumDeviceInterfaces
должен работать.
Смотрите раздел замечаний SetupDiGetClassDevs
документация по MSDN:
Чтобы вернуть устройства, которые поддерживают интерфейс устройства любого класса, установите
флаг DIFCF_DEVICEINTERFACE, установите флаг DIGCF_ALLCLASSES и установите
ClassGuid для NULL. Функция добавляет к устройству информацию о наборе
элемент информации об устройстве, который представляет такое устройство, а затем добавляет
к элементу информации устройства список интерфейса устройства, который
содержит все интерфейсы устройства, которые поддерживает устройство.
Так что исправь SetupDiGetClassDevs
позвонить, добавив DIGCF_DEVICEINTERFACE
пометить как:
hDevInfo = SetupDiGetClassDevs(NULL,0,0, DIGCF_PRESENT | DIGCF_ALLCLASSES | DIGCF_DEVICEINTERFACE);
Других решений пока нет …