Цитата(vshemm @ Feb 25 2008, 14:34)

Если известны VendorID и DeviceID устройства (CP210x USB to UART Bridge Controller) то можно пройтись по всем портам, найти родительское устройство и сравнить VendorID и DeviceID с нужными. Нужные функции здесь -
http://msdn2.microsoft.com/en-us/library/ms790838.aspxА вот пример реализации
http://forums.microsoft.com/MSDN/ShowPost....63&SiteID=1Правда, на VB, но все довольно понятно

Совершенно верно. Этот способ отлично работает - мы делали программу для конвертеров FTDI на C++.
Однако далее столкнулись с определенными проблемами. Как определить номера портов, если к в изделии два таких конвертера, или же к компьютеру подключены два или более разных устройств с одинаковыми VID и PID?
Первая мысль - присвоить собственный PID. Фирма FTDI выделила нам блок из восьми PID, и мы вставили их в драйвер (в inf-файлы) для Win98/2000/XP. Также, фирма FTDI выпустила новую версию драйвера для Mac OS X, куда были вписаны наши идентификаторы.
Фирме - большое спасибо, однако вскоре вышла Windows Vista. Чтобы исправленный драйвер заработал с этой OS, его нужно сертифицировать в Микрософте - а этого не хотелось бы делать по нескольким причинам.
Возникла идея - нельзя ли исправить только название изделия в Flash-памяти, подключенной к конвертеру, оставив VID и PID старыми. Оказалось, при просмотре дерева устройств (функциями SetupDiXXXXX) родительский элемент COM-порта имеет свойство Location с названием, соответствующим прописанному нами в Flash-памями имени (например, "My Device").
Однако в Windows Vista вместо этого имени выводится что-то типа "Port_#0002.Hub_#0001". Естественно, определить принадлежность COM-порта нашему устройству не представляется возможными. :-(
(Это все можно проверить, заглянув в Device Manager.)
Пришлось идти дальше. Сканировать дерево USB-устройств (по типу программы USBView, DeviceIoControl начиная от Root Hub) и находить то, чей дескриптор названия равен нашему "My Device". У этого устройства можно спросить такой параметр, как Driver Key. Такое же значение Driver Key должно быть у родительского элемента COM-порта (из списка устройств, полученных функциями SetupDiXXXX). Таким образом, получаем соответствие COM-порта и нашего устройства.
При необходимости в Flash-память можно зашить серийный номер и получить таблицу COM-портов и серийных номеров устройств, подключенных к ним.
Может быть, можно сделать все это проще?