Конференция "WinAPI" » Добраться до PortName, через SetupAPI.
 
  • POP (01.11.08 20:36) [0]
    Подключен например у меня модем IDC. В свойствах (в диспетчере задач) вижу, он висит на COM2.

    Как мне программно до этого "COM2" (PortName в реестре) добраться?

    Через SetupAPI.

    Пока додумался только вот до чего:

    Через SetupDiGetClassDevs получаю список всех устройств в классе "Модемы", то есть юзаю GUID_DEVCLASS_MODEM.

    Далее использую SetupDiEnumDeviceInfo и получаю заполненную структуру SPDevInfoData для каждого устройства (модема)

    Далее, через SetupDiGetDeviceRegistryProperty (подсовываю ей SPDevInfoData) могу получить разную инфу, типа имя устройства, FriendlyName и тд.

    То есть, в конечно итоге, можно ли добраться до досового имени PortName имея хендл устройства (из SPDevInfoData)?

    Либо используя какую-нибудь инфу полученную с помощью SetupDiGetDeviceRegistryProperty?
  • POP (02.11.08 02:00) [1]
    В процессе изучения вопроса обнаружил вот что:

    Девайсы могут быть прописаны как в "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" и вывели из названия, юзер тыкает мышкой и выбирает один из них... далее как коннектиться к ним?
  • tesseract © (06.11.08 10:25) [2]

    > вывели из названия, юзер тыкает мышкой и выбирает один из
    > них... далее как коннектиться к ним?


    Вообще коннектиться к ним не надо - полученным устройством можно будет работать через CreateFile/DeviceIoControl - если у тебя есть список параметров для драйвера этих функций. Для разных драйверов он может быть разным.

    Чем тебя RasDial не устравивает ? С RasEnumDevices намного проще найти модем.

    ЗЫ: Или тебе  надо с этим модемом по душам через COM-порт  поговорить ?
 
Конференция "WinAPI" » Добраться до PortName, через SetupAPI.
Есть новые Нет новых   [134435   +33][b:0][p:0]