我有代码可以将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。除非您开始看到很多东西,否则我认为您不应该处理这种情况。

08-16 15:10