Windows卷设备检测失败,直到重新启动。之前从来没有失败过
题
我有代码来检测作为卷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
在到达消息处理程序然后处理该消息作为这样:
空隙HandleVolumeArrival(MSG *消息) { 如果(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驱动器进行了尝试和所有有同样的问题。
有没有人见过这样的事情之前?你知道什么可能导致它或者为什么这个问题会自动消失,系统重新启动?
解决方案
我的猜测是,你会看到DBT_DEVTYP_DEVICEINTERFACE
通常反正。 USB设备是自描述。一个USB设备可以具有任何“接口”,每个接口是设备的一个特征。我的猜测是,当一个USB连接你会得到一个“DBT_DEVTYP_DEVICEINTERFAC
E”每个USB设备接口,使USB设备驱动程序可以说,他们能处理的USB接口。我假设为USB大容量存储驱动程序的USB设备驱动程序就会将通过安装体积处理这个消息,然后你会得到DBT_DEVTYP_VOLUME
消息。
我猜想,大容量存储接口驱动器工作不正常(或崩溃),并且不处理DBT_DEVTYP_DEVICEINTERFACE
。除非你开始看到了很多我不认为这是你应该费心处理的情况。