Neu erkanntes USB-Laufwerk Laufwerksbuchstaben ermitteln



  • Hallo,
    ich stelle über MessageHandler fest ob ein USB Gerät(in dem Fall eine Kamera) eingesteckt wird.

    BEGIN_MESSAGE_MAP
        MESSAGE_HANDLER(WM_DEVICECHANGE, Messages::TMessage, wmDevChange);
      END_MESSAGE_MAP(inherited)
    
    void __fastcall TForm1::wmDevChange(Messages::TMessage msg)
    {
       if(msg.WParamLo==7)
       {
    ...
    

    Das klappt auch soweit. Das zugewiesenen Laufwerk bekomme ich bisher indem ich von Laufwerksbuchstabe Z bis A alle Laufwerke auf Gerätetyp untersuche
    (GetDriveType(DriveName) == DRIVE_REMOVABLE).
    Wie kann ich sonst noch an das Laufwerk kommen?



  • öhhm ich glaube das währe besser ein Thema im WINAPI Forum...



  • Dieser Thread wurde von Moderator/in akari aus dem Forum VCL (C++ Builder) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Du musst den WPARAM Parameter auswerten, falls er den Wert DBT_DEVICEARRIVAL hat ist der LPARAM Parameter ein Zeiger auf eine DEV_BROADCAST_HDR Struktur. Die DEV_BROADCAST_HDR Struktur hat ein Attribut dbch_devicetype, wenn dieses Attribut den Wert DBT_DEVTYP_VOLUME hat dann ist der DEV_BROADCAST_HDR Zeiger ein Zeiger auf eine DEV_BROADCAST_VOLUME Struktur. Diese Struktur hat wiederum ein Attribut dbcv_unitmask, dessen erstes gesetztes Bit den Laufwerksbuchstaben des neuen Volumes anzeigt (Bit 0 = A, Bit 1 = B, Bit 2 = C, etc.)

    Ungetestet:

    void __fastcall Form::OnDeviceChange( TMessage msg )
    {
       char VolumeLetter = ' ';
    
       // neues Device erkannt?
       if( DBT_DEVICEARRIVAL == msg.WParam )
       {
          // ja, Device Typ feststellen
          DEV_BROADCAST_HDR* pBCH = reinterpret_cast<DEV_BROADCAST_HDR*>( msg.LParam );
          if( DBT_DEVTYP_VOLUME == pBCH->dbch_devicetype )
          {
             // Device Typ ist Volume, Laufwerksbuchstaben bestimmen
             DEV_BROADCAST_VOLUME* pBCV = reinterpret_cast<DEV_BROADCAST_VOLUME*>( pBCH );
             for( unsigned int LW = 0; LW < 26; ++LW )
             {
                if( pBCV->dbcv_unitmask & (1 << LW) )
                {
                   VolumeLetter = 'A' + LW;
                   break;
                }
             }
          }
       }
    }
    

Log in to reply