我有代码来检测作为卷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_DEVICEINTERFACE”每个USB设备接口,使USB设备驱动程序可以说,他们能处理的USB接口。我假设为USB大容量存储驱动程序的USB设备驱动程序就会将通过安装体积处理这个消息,然后你会得到DBT_DEVTYP_VOLUME消息。

我猜想,大容量存储接口驱动器工作不正常(或崩溃),并且不处理DBT_DEVTYP_DEVICEINTERFACE。除非你开始看到了很多我不认为这是你应该费心处理的情况。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top