Pergunta

Eu tenho o código para detectar a conexão de USB Flash Drives como volumes. O código tem trabalhado muito bem por algum tempo, mas recentemente máquina de um colega do engenheiro começou a falhar e não funcionou novamente à direita até que ele foi reiniciado.

O projeto usa Qt 4.5.0, mas que não deve ser muito relevante para esta questão.

me inscrever para a notificação da seguinte maneira

// 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 );   

O manipulador seguida, filtra as mensagens 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

O manipulador de mensagem de chegada, em seguida, manipula a mensagem como tal:

vazio HandleVolumeArrival (MSG * mensagem) { if (Mensagem-> lParam == 0) { qDebug () << "lParam é 0 na chegada Device"; Retorna; } // fim do 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

} // fim HandleVolumeArrival

O problema veio quando verificar o tipo de dispositivo para um tipo de volume:

pHdr->dbch_devicetype == DBT_DEVTYP_VOLUME

Quando foi falhando, o tipo de dispositivo estava sendo relatado como DBT_DEVTYP_DEVICEINTERFACE.

Várias unidades USB foram julgados e todos tiveram o mesmo problema.

Alguém viu nada como isso antes? Você sabe o que poderia causar-lhe ou porque o problema seria ir longe em uma reinicialização do sistema?

Foi útil?

Solução

Meu palpite seria que você veria o DBT_DEVTYP_DEVICEINTERFACE normalmente de qualquer maneira. Os dispositivos USB são auto-descrição. Um dispositivo USB pode ter qualquer "interfaces", onde cada interface é uma característica do dispositivo. Meu palpite é que quando um USB é conectado você recebe um "DBT_DEVTYP_DEVICEINTERFACE" per interface do dispositivo USB para que um driver de dispositivo USB pode dizer que eles podem lidar com essa interface USB. Eu diria que o driver de dispositivo USB para controlador de armazenamento em massa USB que iria lidar com estas mensagens, montando o volume e, em seguida, você iria receber a mensagem DBT_DEVTYP_VOLUME.

Eu acho que o driver de interface de armazenamento em massa não está funcionando corretamente (ou deixou de funcionar) e não está a tratar do DBT_DEVTYP_DEVICEINTERFACE. A menos que você começar vendo um monte Eu não acho que é uma situação que você deve se preocupar em punho.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top