我有代码可以将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(消息-> lParam == 0)
{
qDebug()< 返回;
} // 万一
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驱动器,并且所有驱动器都有相同的问题。
有人看过这样的东西吗?您知道是什么原因引起的,或者为什么在系统重新启动后问题消失了?
最佳答案
我的猜测是您仍然会正常看到DBT_DEVTYP_DEVICEINTERFACE
。 USB设备是自描述的。 USB设备可以具有任何“接口”,其中每个接口都是该设备的功能。我的猜测是,当连接USB时,每个USB设备接口都会得到一个“ DBT_DEVTYP_DEVICEINTERFAC
E”,以便USB设备驱动程序可以说它们可以处理该USB接口。我假设USB大容量存储驱动程序的USB设备驱动程序将通过装入卷来处理此消息,然后您将收到DBT_DEVTYP_VOLUME
消息。
我猜大容量存储接口驱动程序无法正常工作(或崩溃),并且无法处理DBT_DEVTYP_DEVICEINTERFACE
。除非您开始看到很多东西,否则我认为您不应该处理这种情况。