Próbuję użyć funkcji SetupDi do wyliczenia wszystkich ścieżek urządzeń podłączonego urządzenia USB. Ścieżka urządzenia jest ścieżką używaną w CreateFile(), dzięki czemu mogę komunikować się z urządzeniem.Windows - Jak wyliczyć wszystkie ścieżki urządzeń podłączonego urządzenia USB?
Jednak SetupDiGetDeviceInterface wymaga interfejsu GUID interfejsu, ale nie szukam konkretnego interfejsu (innego niż wszystkie podłączone USB). Ta część została skomentowana jako/* ??? */w źródle poniżej.
Próby rozwiązania:
Próbowałem dostarczyć GUID_DEVCLASS_UNKNOWN = {0x4d36e97e, 0xe325, 0x11ce {0xbf, 0xC1, 0x08, 0x00, 0x2b, 0xE1, 0x03, 0x18}}; ale to spowodowało błąd "nie więcej interfejsów".
Próbowałem również dostarczyć deviceInfoData.ClassGuid do SetupDiGetDeviceInterface, ale pojawia się ten sam błąd, jak powyżej, "nie ma więcej interfejsów".
Pytania:
istnieje ogólna klasa interfejs, który obejmie wszystkie urządzenia USB? (HID, ogólne, itp.)
A może jest alternatywna funkcja, która da mi ścieżkę do urządzenia? (Odczyt struktury SP_DEVICE_INTERFACE_DETAIL_DATA zwróconej przez SetupDiGetDeviceInterfaceDetail).
Źródło:
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
}
Wypróbowałem kod podany w odpowiedzi, ale otrzymałem komunikat "Wybierz prawidłową maszynę docelową do wdrożenia na stronie właściwości projektu". Jest zbudowany, ale nie mogę go uruchomić. Czy masz ten sam problem? Używam VS 2015 i WDK 10 na Windows 7 – lads