Frage

Ich habe Code den Anschluss von USB-Flash-Laufwerken als Volumes zu erkennen. Der Code wurde für eine Weile sehr gut funktioniert, aber in letzter Zeit einen Maschine Kollegen Ingenieur begann zu scheitern und nicht wieder gut arbeiten, bis es neu gestartet wurde.

Das Projekt verwendet Qt 4.5.0, aber das soll nicht auf diese Frage sehr relevant sein.

ich für die Meldung wie folgt registrieren

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

Der Handler filtert dann für die WM_DEVICECHANGE Nachrichten.

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

Die Ankunft Nachrichtenhandler übernimmt dann die Nachricht als solche:

void HandleVolumeArrival (MSG * message) {     if (message-> lParam == 0)     {         qDebug () << "lParam 0 auf Gerät Arrival";         Rückkehr;     } // 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

} // end HandleVolumeArrival

Das Problem kam, als der Gerätetyp für ein Volumen Typen Überprüfung:

pHdr->dbch_devicetype == DBT_DEVTYP_VOLUME

Wenn es versagt, wurde der Gerätetyp als DBT_DEVTYP_DEVICEINTERFACE gemeldet wird.

Mehrere USB-Laufwerke wurden ausprobiert und alle hatten das gleiche Problem.

Hat jemand etwas Ähnliches schon einmal gesehen? Wissen Sie, was es dazu führen könnte, oder warum sollte das Problem auf einem System-Neustart weggehen?

War es hilfreich?

Lösung

Meine Vermutung wäre, dass Sie die DBT_DEVTYP_DEVICEINTERFACE normalerweise ohnehin sehen würde. USB-Geräte sind selbsterklärend. Ein USB-Gerät kann jede „Schnittstellen“, wo jede Schnittstelle ein Merkmal der Vorrichtung ist. Meine Vermutung ist, dass, wenn ein USB angeschlossen ist Sie eine „DBT_DEVTYP_DEVICEINTERFACE“ per USB-Device-Schnittstelle erhalten, so dass ein USB-Gerätetreiber sagen kann, dass sie diese USB-Schnittstelle verarbeiten kann. Ich würde davon ausgehen, dass die USB-Gerätetreiber für USB-Massenspeicher-Treiber würden diese Nachrichten würden behandeln, indem das Volumen der Montage und dann würden Sie die DBT_DEVTYP_VOLUME Meldung.

Ich würde vermuten, dass die Massenspeicherschnittstellentreiber nicht richtig funktioniert (oder abgestürzt ist) bestätigt und das DBT_DEVTYP_DEVICEINTERFACE nicht handhaben. Es sei denn, starten Sie es viel zu sehen, ich glaube nicht, es ist eine Situation, die Sie stören sollte zu behandeln.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top