0

我有代码可以将 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 驱动器,但都遇到了同样的问题。

有没有人见过这样的事情?你知道什么可能导致它或为什么问题会在系统重新启动时消失?

4

1 回答 1

1

我的猜测是无论如何你都会看到DBT_DEVTYP_DEVICEINTERFACE正常情况。USB 设备是自描述的。USB 设备可以有任何“接口”,其中每个接口都是设备的一个特性。我的猜测是,当连接 USB 时,DBT_DEVTYP_DEVICEINTERFAC每个 USB 设备接口都会得到一个“E”,以便 USB 设备驱动程序可以说他们可以处理该 USB 接口。我假设 USB 大容量存储驱动程序的 USB 设备驱动程序将通过安装卷来处理此消息,然后您会收到DBT_DEVTYP_VOLUME消息。

我猜大容量存储接口驱动程序无法正常工作(或已崩溃)并且没有处理DBT_DEVTYP_DEVICEINTERFACE. 除非您开始经常看到它,否则我认为您不应该费心处理这种情况。

于 2009-05-13T19:15:53.287 回答