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_DEVICEINTERFACUSBデバイスインターフェイスごとに「E」が表示されるため、USBデバイスドライバーはそのUSBインターフェイスを処理できると言うことができます。USB大容量ストレージドライバー用のUSBデバイスドライバーは、ボリュームをマウントすることでこのメッセージを処理し、メッセージが表示されると思いDBT_DEVTYP_VOLUMEます。

大容量記憶装置のインターフェイスドライバが正しく機能していない(またはクラッシュしている)ため、を処理していないと思いますDBT_DEVTYP_DEVICEINTERFACE。たくさん見始めない限り、わざわざ対処すべき状況ではないと思います。

于 2009-05-13T19:15:53.287 に答える