Я пытаюсь получить пути ко всем устройствам с интерфейсами устройств, но когда я звоню SetupDiEnumDeviceInterfaces
, я получаю ERROR_NO_MORE_ITEMS
.
#include <windows.h>
#include <setupapi.h>
#include <iostream>
#include <string>
#include <vector>
int main(int argc, const char **argv)
{
HDEVINFO hdevinfo = SetupDiGetClassDevs(0, 0, 0, DIGCF_ALLCLASSES |
DIGCF_PRESENT |
DIGCF_DEVICEINTERFACE);
if (hdevinfo == INVALID_HANDLE_VALUE)
{
std::cerr << "Failed to get device information set" << std::endl;
return -1;
}
SP_DEVINFO_DATA devinfoData{sizeof(SP_DEVINFO_DATA)};
SP_DEVICE_INTERFACE_DATA deviceInterfaceData{sizeof(SP_DEVICE_INTERFACE_DATA)};
std::vector<std::string> devicePaths{};
devicePaths.reserve(512);
DWORD index = 0;
while (SetupDiEnumDeviceInfo(hdevinfo, index, &devinfoData))
{
if (!SetupDiEnumDeviceInterfaces(hdevinfo, &devinfoData, &devinfoData.ClassGuid, index, &deviceInterfaceData))
{
DWORD error = GetLastError();
std::cout << "Error: " << error << std::endl; // always get 259
++index;
continue;
}
DWORD reqSize = 0;
SetupDiGetDeviceInterfaceDetail(hdevinfo, &deviceInterfaceData, 0, 0, &reqSize, 0);
PSP_INTERFACE_DEVICE_DETAIL_DATA pDetailData = PSP_INTERFACE_DEVICE_DETAIL_DATA(new char[reqSize]);
pDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
if (SetupDiGetDeviceInterfaceDetail(hdevinfo, &deviceInterfaceData, pDetailData, reqSize, 0, 0));
devicePaths.push_back(pDetailData->DevicePath);
delete [] pDetailData;
++index;
}
SetupDiDestroyDeviceInfoList(hdevinfo);
return 0;
}
Я просмотрел этот ответ , но у меня это не работает, так как использует GUID для устройств usb. В моем случае нужные устройства могут быть подключены не только через USB, но также через PCI и PCI express.
Мне нужны эти пути для использования в CreateFile
. Я применил неподходящий подход? Есть ли альтернативы?