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 ドライブを試しましたが、すべて同じ問題が発生しました。
誰もこのようなものを見たことがありますか?何が原因なのか、またはシステムの再起動で問題が解決する理由を知っていますか?