dispositif de volume de Windows detect échoué jusqu'au redémarrage. Jamais échoué avant

StackOverflow https://stackoverflow.com/questions/853304

Question

J'ai le code pour détecter la connexion des lecteurs flash USB en tant que volumes. Le code a très bien fonctionné pendant un certain temps, mais récemment la machine d'un ingénieur compagnon a commencé à échouer et n'a pas fonctionné de nouveau à droite jusqu'à ce qu'il soit redémarré.

Le projet utilise Qt 4.5.0, mais cela ne devrait pas être très utile à cette question.

je me inscrire à la notification suivante

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

Le gestionnaire filtre ensuite pour les messages 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

Le gestionnaire de messages d'arrivée traite alors le message en tant que tel:

vide HandleVolumeArrival (MSG * Message) {     if (message-> lParam == 0)     {         qDebug () << "lParam est 0 à l'arrivée de l'appareil";         revenir;     } // 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

} // fin HandleVolumeArrival

Le problème est venu lors de la vérification du type de dispositif pour un type de volume:

pHdr->dbch_devicetype == DBT_DEVTYP_VOLUME

Quand il échouait, le type d'appareil a été signalé comme étant DBT_DEVTYP_DEVICEINTERFACE.

lecteurs USB multiples ont été essayé et avait tout le même problème.

Quelqu'un at-il vu quelque chose comme ça avant? Savez-vous ce qui pourrait causer ou pourquoi le problème disparaîtrait sur un redémarrage du système?

Était-ce utile?

La solution

Je dirais que vous verriez normalement de toute façon DBT_DEVTYP_DEVICEINTERFACE. Les périphériques USB sont auto-description. Un périphérique USB peut avoir des « interfaces » où chaque interface est une caractéristique du dispositif. Je pense que quand un USB est connecté, vous obtenez un « E DBT_DEVTYP_DEVICEINTERFAC » par interface périphérique USB de sorte qu'un pilote de périphérique USB peut dire qu'ils peuvent gérer cette interface USB. Je suppose que le pilote de périphérique USB pour le pilote USB de stockage de masse ne traiterait ces messages en montant le volume et vous obtiendrez le message de DBT_DEVTYP_VOLUME.

Je suppose que le pilote d'interface de stockage de masse ne fonctionne pas correctement (ou est tombé en panne) et ne gère pas la <=>. À moins que vous commencer le voir beaucoup, je ne pense pas que ce soit une situation que vous devez prendre la peine de gérer.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top