EnumPorts () возвращает странную ошибку на некоторых машинах - PullRequest
3 голосов
/ 08 октября 2008

Я поддерживаю приложение, которое использует функцию Win32 EnumPorts (), чтобы помочь определить набор последовательных портов, установленных на компьютере. На некоторых компьютерах я видел случаи, когда вызов для получения этой информации не удался с кодом GetLastError () 1722 (сервер RPC недоступен). Я предполагаю, что это как-то связано с настройками реестра или отключением требуемой службы, но мой поиск до сих пор был довольно бесплодным. Кто-нибудь еще сталкивался с этой проблемой?

В ответ на комментарии Euro Micelli. Я специально пытаюсь заполнить список выбора, который позволит пользователю выбрать доступный список выбора. Для начала я полагался исключительно на EnumPorts (), чтобы предоставить мне список потенциальных имен последовательных портов. Он оказался ненадежным, однако в нескольких смыслах: он не всегда предоставлял полный набор имен портов, и, как я недавно видел, он может вообще не функционировать, когда «служба RPC недоступна». Зачем нужен RPC, чтобы узнать, какие порты доступны на локальной машине, совершенно за мной, но это так. Эта последняя проблема была последней каплей. Поскольку я полностью полагаюсь на предоставленный список имен, я фильтрую эти имена, используя функцию GetDefaultCommConfig (), чтобы определить точную природу каждого из имен, которые я придумал.

По моему опыту, список имен, предоставленных ранее упомянутым разделом реестра, был самым надежным способом получения имен портов. На самом деле, я вижу, как обновляется ключ, когда я отключаю драйверы портов в диспетчере устройств. При нормальном опыте я бы согласился с оценкой, что полагаться на тот или иной ключ чревато опасностью. Однако в этом случае M $ никогда не предоставлял достойного механизма для оценки имен доступных портов.

Я должен указать, что я уже заменил вызов EnumPorts () алгоритмом, который сканирует раздел реестра: HKEY_LOCAL_MACHINE \ HARDWARE \ DEVICEMAP \ SERIALCOMM для имен последовательных портов. Это должно решить проблему после выпуска моего программного обеспечения. Мне нужны указатели, которые могут быть предоставлены клиентам, использующим выпущенный пакет в настоящее время.

Ответы [ 4 ]

1 голос
/ 17 октября 2008

Я не эксперт по EnumPorts, но настоятельно рекомендую не полагаться на ключи реестра.

  • Ключевые определения могут измениться в будущем.
  • Ключевые определения могут не соответствовать вашим ожиданиям.
  • Могут быть способы «быть последовательным портом», которые не включают эти ключи.
  • Клавиши могут не отражать текущее состояние и т. Д. И т. Д.

Вы всегда должны полагаться на доступные API.

Если API не работает для вас, давайте попробуем выяснить, почему. Может быть, с небольшой дополнительной информацией мы можем помочь лучше:

Что именно нужно делать с последовательным портом?

0 голосов
/ 11 августа 2014

Я знаю, что этот вопрос очень старый, но я наткнулся на него сегодня и заметил, что никто не дал объяснения.

Причина RPC заключается в том, что вы вызываете функцию диспетчера очереди печати - вы просите диспетчер очереди печати вернуть список портов принтера, который в большинстве случаев включает в себя COM-порты. Я полагаю, что это может объяснить ваши немного ненадежные результаты.

RPC используется для передачи запроса от вашего процесса к активному процессу диспетчера очереди, и сообщение RPC Server is unavailable появляется, когда служба диспетчера очереди печати не работает (или не отвечает должным образом).

0 голосов
/ 09 октября 2008

Я знаю, что это не прямой ответ на ваш вопрос, но вы рассматривали возможность использования другого метода для перечисления последовательных портов? В своих приложениях я использую API настройки, используя код с веб-сайта P J Naughter: http://www.naughter.com/enumser.html,, и я считаю, что он работает хорошо.

0 голосов
/ 08 октября 2008

В наши дни есть много странных последовательных портов: последовательные USB-кабели, Bluetooth, модемы сотовых телефонов с GPS, ... Это может быть что-то подключенное к компьютеру и давно забытое.

Чтобы узнать, какой порт вызывает проблему, попробуйте зайти в диспетчер устройств, выберите «Показать скрытые устройства» на вкладке «Просмотр» и удаляйте их, пока проблема не исчезнет. Это может позволить вам сосредоточиться на проблеме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...