Domanda

Ho codice per rilevare la connessione di unità flash USB come volumi. Il codice ha lavorato molto bene per un po ', ma di recente la macchina di un collega ingegnere ha iniziato a fallire e non ha funzionato ancora a destra fino a quando non è stato riavviato.

Il progetto utilizza Qt 4.5.0, ma che non dovrebbe essere molto rilevante a questa domanda.

mi iscrivo per la notifica come segue

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

Il gestore filtra poi per i messaggi 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

Il gestore di messaggi arrivo gestisce quindi il messaggio in quanto tale:

vuoto HandleVolumeArrival (MSG * messaggio) {     if (message-> lParam == 0)     {         qDebug () << "lParam è 0 su Device arrivo";         ritorno;     } // 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

} // fine HandleVolumeArrival

Il problema è venuto quando si controlla il tipo di dispositivo per un tipo di volume:

pHdr->dbch_devicetype == DBT_DEVTYP_VOLUME

Quando fu fallendo, il tipo di dispositivo veniva riportato come DBT_DEVTYP_DEVICEINTERFACE.

Più unità USB sono stati processati e tutti avevano lo stesso problema.

Qualcuno ha visto niente di simile prima? Sai che cosa potrebbe causare o perché il problema sarebbe andato via su un riavvio del sistema?

È stato utile?

Soluzione

La mia ipotesi è che si dovrebbe vedere la DBT_DEVTYP_DEVICEINTERFACE normalmente in ogni caso. dispositivi USB sono autodescrittivi. Un dispositivo USB può avere "interfacce" dove ogni interfaccia è una caratteristica del dispositivo. La mia ipotesi è che quando è collegato un USB si ottiene un "DBT_DEVTYP_DEVICEINTERFAC E" per interfaccia dispositivo USB in modo che un driver di periferica USB può dire che essi in grado di gestire l'interfaccia USB. Parto dal presupposto che il driver di periferica USB per il driver di archiviazione di massa USB sarebbe sarebbe gestire questi messaggi montando il volume e quindi si dovrebbe ottenere il DBT_DEVTYP_VOLUME messaggio.

Direi che il driver di interfaccia di archiviazione di massa non funziona correttamente (o è andato in crash), e non si sta occupando del <=>. A meno che non iniziare a vedere un sacco non credo che si tratta di una situazione che si dovrebbe preoccuparsi di gestire.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top