Обнаружение устройства тома Windows не удалось до перезагрузки. Никогда не подводил раньше
У меня есть код для определения подключения USB Flash Drive как тома. Код работал очень хорошо в течение некоторого времени, но недавно машина другого инженера начала выходить из строя и снова не работала, пока не была перезапущена.
В проекте используется 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 *) { 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
} // end HandleVolumeArrival
Проблема возникла при проверке типа устройства для типа тома:
pHdr->dbch_devicetype == DBT_DEVTYP_VOLUME
При сбое тип устройства указывался как DBT_DEVTYP_DEVICEINTERFACE
,
Было опробовано несколько USB-накопителей, и у всех была одна и та же проблема.
Кто-нибудь видел что-нибудь подобное раньше? Знаете ли вы, что может быть причиной или почему проблема исчезнет при перезагрузке системы?
1 ответ
Я предполагаю, что вы увидите DBT_DEVTYP_DEVICEINTERFACE
все равно нормально. USB-устройства самоописывают. Устройство USB может иметь любые "интерфейсы", где каждый интерфейс является функцией устройства. Я думаю, что при подключении USB вы получаете "DBT_DEVTYP_DEVICEINTERFAC
E "на интерфейс USB-устройства, так что драйвер USB-устройства может сказать, что он может обрабатывать этот интерфейс USB. Я предполагаю, что драйвер USB-устройства для драйвера USB-накопителя будет обрабатывать эти сообщения путем монтирования тома, а затем вы получите DBT_DEVTYP_VOLUME
сообщение.
Я бы предположил, что драйвер интерфейса запоминающего устройства не работает правильно (или произошел сбой) и не обрабатывает DBT_DEVTYP_DEVICEINTERFACE
, Если вы не начнете видеть это много, я не думаю, что это ситуация, с которой вам стоит потрудиться.