我有代码可以将 USB 闪存驱动器的连接检测为卷。这段代码一直运行良好,但最近一位工程师的机器开始出现故障,直到重新启动后才再次正常运行。
该项目使用 Qt 4.5.0,但这应该与这个问题不太相关。
我注册通知如下
// Register for device connect notification
DEV_BROADCAST_DEVICEINTERFACE devInt;
ZeroMemory( &devInt, sizeof(devInt) );
devInt.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
devInt.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
devInt.dbcc_classguid = GUID_DEVINTERFACE_VOLUME;
m_hDeviceNotify =
RegisterDeviceNotification( winId(), &devInt, DEVICE_NOTIFY_WINDOW_HANDLE );
然后处理程序过滤 WM_DEVICECHANGE 消息。
if (message->message == WM_DEVICECHANGE)
{
switch (message->wParam)
{
case DBT_DEVICEARRIVAL:
HandleVolumeArrival( message );
break;
case DBT_DEVICEREMOVECOMPLETE:
HandleVolumeRemoval( message );
break;
default:
break;
}
*result = TRUE;
} // end if
到达消息处理程序然后按如下方式处理消息:
void HandleVolumeArrival( MSG *message ) { if(message->lParam == 0) { qDebug() << "lParam 在设备到达时为 0"; 返回; } // 万一
PDEV_BROADCAST_HDR pHdr = (PDEV_BROADCAST_HDR) message->lParam;
if(pHdr->dbch_devicetype == DBT_DEVTYP_VOLUME)
{
PDEV_BROADCAST_VOLUME pVol = (PDEV_BROADCAST_VOLUME) pHdr;
// Handling of the volume is performed here
} // end if
} // 结束 HandleVolumeArrival
检查卷类型的设备类型时出现问题:
pHdr->dbch_devicetype == DBT_DEVTYP_VOLUME
当它失败时,设备类型被报告为DBT_DEVTYP_DEVICEINTERFACE
.
尝试了多个 USB 驱动器,但都遇到了同样的问题。
有没有人见过这样的事情?你知道什么可能导致它或为什么问题会在系统重新启动时消失?