Windows API:检测驱动程序安装何时完成

时间:2009-02-25 20:28:28

标签: c++ windows bluetooth driver

我正在编写一些使用Windows Bluetooth API自动连接蓝牙设备的软件。当它连接时,Windows会自动开始安装蓝牙HID设备驱动程序,如预期的那样:

Installing Bluetooth HID drivers

这需要大约10-15秒,之后Windows会显示熟悉的“随时可用”消息:

Hardware installed and ready for use

问题是BluetoothSetServiceState()在驱动程序安装开始后立即返回,而不是在设备实际可以使用时返回。这会导致我的代码出现一些问题,因为只要它“连接”,它就会调用一个单独的库来进行设备通信。前几个调用失败,因为驱动程序尚未完成安装,并且进行这些连接尝试似乎会干扰驱动程序安装,因为如果我在驱动程序安装完成之前尝试使用通信库,则Windows希望在设备启动之前重新启动使用。

我正在寻找的是一种挂钩“即用型”事件的方法,当驱动程序安装实际完成时,所以我不会过早地进行通信库调用。是否有一些Windows API调用可用于注册函数回调或直接轮询驱动程序安装的状态?

我用vanilla C / C ++编写这个,没有.NET。谢谢你的帮助!

3 个答案:

答案 0 :(得分:4)

你可能想看看 this sample codeRegisterDeviceNotification功能。我不确定100%,但如果你为你的设备类指定了正确的guid,它似乎有用。

答案 1 :(得分:2)

以下是我要做的事情:

  1. 下载Winspector(或使用Spy ++)
  2. 启动Winspector和begin watching for Window Messages
  3. 安装驱动程序
  4. 注意WM指示已完成的驱动程序安装
  5. 我希望我能在#4上更具描述性,但我不熟悉您需要的特定窗口消息。 Have a look here for possible Window Messages to expect

    但是,一旦确定要查找的正确窗口消息,然后以编程方式让您的程序等待(并处理)此WM。 CodeProject has an excellent write up on how to do this in C++。就个人而言,I'd prefer to do it in Delphi

答案 2 :(得分:0)

如果是网络绑定,则RNDIS按照RNDIS Driver Implemenation guide完成安装后会发送消息 和RNDIS

的定义

您可以通过Devcon实用程序(MSDN中提供的源代码)以编程方式安装或查询设备列表,如Examples中所述