Windows API: определение окончания установки драйвера - PullRequest
4 голосов
/ 25 февраля 2009

Я пишу программное обеспечение, которое автоматически подключает устройство Bluetooth с помощью Windows Bluetooth API . При подключении Windows автоматически начинает установку драйвера устройства Bluetooth HID, как и ожидалось:

Installing Bluetooth HID drivers

Это занимает около 10-15 секунд, после чего Windows отображает известное сообщение «готов к использованию»:

Hardware installed and ready for use

Проблема в том, что BluetoothSetServiceState() возвращается, как только начинается установка драйвера , а не когда устройство фактически готово к использованию. Это вызывает некоторые проблемы для моего кода, потому что он вызывает отдельную библиотеку для связи с устройством, как только он «подключен». Первые несколько вызовов терпят неудачу, потому что драйверы еще не закончили установку, и выполнение этих попыток подключения, по-видимому, мешает установке драйвера, потому что, если я пытаюсь использовать библиотеку связи до завершения установки драйвера, Windows захочет перезагрузиться, прежде чем устройство сможет использоваться.

То, что я ищу, - это способ перехватить это событие «готов к использованию», когда установка драйвера фактически завершена, поэтому я не выполняю преждевременно вызовы из моей библиотеки связи. Есть ли какой-нибудь вызов Windows API, который я могу использовать для регистрации обратного вызова функции или непосредственного опроса состояния установки драйвера?

Я пишу это на ванильном C / C ++, нет .NET. Спасибо за вашу помощь!

Ответы [ 3 ]

4 голосов
/ 28 февраля 2009

Возможно, вы захотите взглянуть на этот пример кода и RegisterDeviceNotification функция. Я не уверен на 100%, но, похоже, сработает, если вы укажете правильный guid для вашего класса устройств.

2 голосов
/ 26 февраля 2009

Вот что я бы сделал:

  1. Скачать Winspector (или использовать Spy ++)
  2. Запустите Winspector и начните наблюдать за сообщениями окна
  3. Установите драйвер
  4. Следите за тем, чтобы WM указала на завершенную установку драйвера

Хотелось бы, чтобы я # 4 был более описательным, но я не знаком с конкретным оконным сообщением, которое вам нужно. Посмотрите здесь на возможные сообщения окна .

Однако, как только вы определите правильное окно сообщения, которое нужно искать, программно сделайте так, чтобы ваша программа ожидала (и обрабатывала) этот WM. CodeProject имеет отличную статью о том, как сделать это на C ++ . Лично, Я бы предпочел сделать это в Delphi .

0 голосов
/ 26 февраля 2009

Если это сетевая привязка, то RNDIS отправляет сообщение, когда завершает установку, согласно Руководство по внедрению драйвера RNDIS и определение RNDIS

или

Вы можете установить или запросить список устройств программно с помощью утилиты Devcon (исходный код доступен с MSDN), как указано в Примеры

...