Windowsのボリュームデバイスの再起動するまで失敗した検出。前に失敗したことはありません
質問
私はボリュームとして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です"。 返します。 } // END IF
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デバイスドライバは、彼らがそのUSBインターフェースを扱うことができると言うことができるようにあなたがUSBデバイスのインターフェイスごとに「DBT_DEVTYP_DEVICEINTERFAC
E」を得ることです。私は、USBマスストレージドライバ用USBデバイスドライバは、ボリュームをマウントすることによって、このメッセージを処理するだろうだろうと、あなたはDBT_DEVTYP_VOLUME
メッセージを取得することを前提となります。
私は、マスストレージインタフェースドライバが正しく動作していない(またはクラッシュした)とDBT_DEVTYP_DEVICEINTERFACE
を処理していないことを推測します。あなたはそれをたくさん見て起動しない限り、私はそれはあなたが処理するためにわざわざすべき状況ではないと思います。