2009-01-21

在程序中处理设备的热插拔通知

注册 WM_DEVICECHANGE 事件,但还不够。
仅注册该事件则仅仅只会收到 DBT_DEVNODES_CHANGED 通知(包括光驱的弹出、收入,网络的通断等都会触发该事件)。
所以还需要用 RegisterDeviceNotification() 注册相应的设备通知。

HDEVNOTIFY RegisterDeviceNotification(
  IN HANDLE hRecipient,  // 注册 WM_DEVICECHANGE 事件的窗口或Service句柄
  IN LPVOID NotificationFilter, // DEV_BROADCAST_DEVICEINTERFACE 结构
  IN DWORD Flags
);

BOOL UnregisterDeviceNotification(
  IN HDEVNOTIFY Handle  // RegisterDeviceNotification() 返回的那个Handle
);
在 DEV_BROADCAST_DEVICEINTERFACE 结构里有个 dbcc_classguid 为需要监听的设备 GUID。
MSDN 上说 RegisterDeviceNotification() 的 Flags 加上 DEVICE_NOTIFY_ALL_INTERFACE_CLASSES 后可以不要GUID 但我这里似乎 不能不要GUID~~ RegisterDeviceNotification() 时失败说 “Bad Data!”~ 不知道是怎么回事,也许没用对吧。

参考:
http://www.microsoft.com/whdc/Driver/tips/PnPUmNotif.mspx
http://msdn.microsoft.com/en-us/library/aa363211(VS.85).aspx
http://msdn.microsoft.com/en-us/library/aa363431(VS.85).aspx


另外,在 Linux 上的热插拔通知 可用 udev, HAL, D-BUS。

//EOF

0 comments: