Это больше вопрос о проблеме. Когда вы вызываете функцию, первый передаваемый аргумент должен быть DeviceInfoSet, который вы, вероятно, получили от функции SetupDiGetClassDevs . Когда вы вызвали функцию SetupDiGetClassDevs, что вы указали для флагов (последний аргумент), цитируя страницу Microsoft в функции:
DIGCF_ALLCLASSES
Возврат списка установленных устройств для всех классов настройки устройства или всех
классы интерфейса устройства.
DIGCF_DEVICEINTERFACE
Возврат устройств, которые поддерживают интерфейсы устройств для указанного устройства
интерфейсные классы. Этот флаг должен быть
установить в параметре Flags, если
Параметр Enumerator указывает
идентификатор экземпляра устройства.
DIGCF_DEFAULT
Возврат только устройства, связанного с системой по умолчанию
интерфейс устройства, если он установлен, для
указанный интерфейс устройства
классы.
DIGCF_PRESENT
Возврат только тех устройств, которые в данный момент присутствуют в системе.
DIGCF_PROFILE
Возврат только тех устройств, которые являются частью текущего профиля оборудования.
В зависимости от вашего выбора список устройств меняется. Например, флаг Present будет отображать только устройства, подключенные активно.
ОБНОВЛЕНИЕ: Спасибо за пример кода.
Мой вопрос сейчас: если вы хотите знать понятное имя модема, почему бы не использовать тот же вызов, но указать модемный гид вместо COM-порта? У меня есть GUID модема 4D36E96D-E325-11CE-BFC1-08002BE10318
В реестре я вижу значение AttachedTo, которое указывает COM-порт. Я должен исследовать, к какому свойству это привязано в API. Раздел реестра находится на
HKLM \ SYSTEM \ CurrentControlSet \ Control \ Class {4D36E96D-E325-11CE-BFC1-08002BE10318} \
ДРУГОЕ ОБНОВЛЕНИЕ:
Присмотритесь к примеру кода. Исходя из этого, если вы пытаетесь получить класс интерфейса устройства, который должен вернуть структуру SP_DEVICE_INTERFACE_DETAIL_DATA . Это не обеспечит способ получить понятное название устройства. Я считаю, что вместо этого вы хотели бы экземпляр устройства.
Из того, что я прочитал, интерфейс устройства используется как способ получения пути к устройству, который можно использовать для записи в него.
Одна вещь, которую я сделал, чтобы проверить ваш код, - это повторить попытку Disk Device Interface. Я сделал несколько изменений, чтобы заставить его работать в моей системе, и это все еще не совсем сделано. Я думаю, что единственная проблема (возможно, больше) заключается в том, что мне нужно изменить размер переменной DevicePath между вызовами SetupDiGetDeviceInterfaceDetail.
void Test()
{
GUID *serial_port_guid = const_cast<GUID *>(&GUID_DEVINTERFACE_DISK);
HDEVINFO device_info = INVALID_HANDLE_VALUE;
SP_DEVICE_INTERFACE_DETAIL_DATA detail_data;
device_info = SetupDiGetClassDevs(
serial_port_guid, 0, 0, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
if(device_info != INVALID_HANDLE_VALUE)
{
//uint4 const detail_data_size = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);// + 256;
//detail_data = reinterpret_cast<SP_DEVICE_INTERFACE_DETAIL_DATA *>(new char[detail_data_size]);
SP_DEVICE_INTERFACE_DATA ifc_data;
bool more_interfaces = true;
int rcd;
memset(&ifc_data, 0, sizeof(ifc_data));
//memset(detail_data, 0, detail_data_size);
ifc_data.cbSize = sizeof(ifc_data);
detail_data.cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
for(uint4 index = 0; more_interfaces; ++index)
{
rcd = SetupDiEnumDeviceInterfaces(device_info, 0, serial_port_guid, index, &ifc_data);
if(rcd)
{
// we need to get the details of this device
SP_DEVINFO_DATA device_data;
device_data.cbSize = sizeof(SP_DEVINFO_DATA);
DWORD intReqSize;
rcd = SetupDiGetDeviceInterfaceDetail(device_info, &ifc_data, 0, 0, &intReqSize, &device_data);
rcd = SetupDiGetDeviceInterfaceDetail(device_info, &ifc_data, &detail_data,intReqSize,&intReqSize,&device_data);
if(rcd)
{
//StrAsc device_path(detail_data->DevicePath);
byte friendly_name[256];
rcd = SetupDiGetDeviceRegistryProperty(
device_info, &device_data, SPDRP_FRIENDLYNAME, 0, friendly_name, sizeof(friendly_name), reinterpret_cast<DWORD *>(sizeof(friendly_name)));
if(rcd)
{
cout<<reinterpret_cast<char const *>(friendly_name);
}
else
{ int num = GetLastError();
}
}
else
{
int num = GetLastError();
}
}
else
more_interfaces = false;
}
}
SetupDiDestroyDeviceInfoList(device_info);
}
Кроме того, в INF, возможно, вам придется добавить директиву AddInterface , чтобы связать драйвер с правильным интерфейсом.