-
Подключен например у меня модем IDC. В свойствах (в диспетчере задач) вижу, он висит на COM2.
Как мне программно до этого "COM2" (PortName в реестре) добраться?
Через SetupAPI.
Пока додумался только вот до чего:
Через SetupDiGetClassDevs получаю список всех устройств в классе "Модемы", то есть юзаю GUID_DEVCLASS_MODEM.
Далее использую SetupDiEnumDeviceInfo и получаю заполненную структуру SPDevInfoData для каждого устройства (модема)
Далее, через SetupDiGetDeviceRegistryProperty (подсовываю ей SPDevInfoData) могу получить разную инфу, типа имя устройства, FriendlyName и тд.
То есть, в конечно итоге, можно ли добраться до досового имени PortName имея хендл устройства (из SPDevInfoData)?
Либо используя какую-нибудь инфу полученную с помощью SetupDiGetDeviceRegistryProperty?
-
В процессе изучения вопроса обнаружил вот что:
Девайсы могут быть прописаны как в "Ports", так и в "Modems" в Девайс менеджере.
Девайсы могут иметь два пути по которым они открываются CreateFile: это обычные DOS имена типа COM1, COM2 и тд, и служебные, типа usb#vid_067b&pid_2303#5&1489a85&0&2#{86e0d1e0-8089-11d0-9ce4-08003e301f73}
Служебное имя называется DevicePath.
DevicePath можно получить фунциями SetupDiEnumDeviceInterfaces и SetupDiGetDeviceInterfaceDetail
Но перед эти нужно составить список устройств некоего класса, например "Ports" и подсунуть этим фунциям.
Список получается при помощи ф-и: SetupDiGetClassDevs(@GUID_DEVCLASS_PORTS, nil, 0, DIGCF_PRESENT or DIGCF_DEVICEINTERFACE);
Так вот проблема в том, что для класса "Modems" эта ф-я не найдет ни одного девайса с DIGCF_DEVICEINTERFACE, а следовательно невозможно будет в дальнейшем получить DevicePath по которому можно коннектиться к устройству.
Для класса "Ports" найдутся все порты без проблем.. видимо они обьявлены как с интерфесом.
То есть возникает вопрос:
Каким макаром можно находить DevicePath и коннектиться к устройствам перечисленным в "Modems"?
На практике это выглядит так, вы в своей программе при помощи SetupAPI нашли все устройства в классе "Modems" и вывели из названия, юзер тыкает мышкой и выбирает один из них... далее как коннектиться к ним?
-
> вывели из названия, юзер тыкает мышкой и выбирает один из > них... далее как коннектиться к ним?
Вообще коннектиться к ним не надо - полученным устройством можно будет работать через CreateFile/DeviceIoControl - если у тебя есть список параметров для драйвера этих функций. Для разных драйверов он может быть разным.
Чем тебя RasDial не устравивает ? С RasEnumDevices намного проще найти модем.
ЗЫ: Или тебе надо с этим модемом по душам через COM-порт поговорить ?
|