Thema: Delphi USB Laufwerk erkennen

Einzelnen Beitrag anzeigen

Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: USB Laufwerk erkennen

  Alt 23. Sep 2009, 15:23
Ich komme damit nur bedingt klar.

Ich bin bisher so vorgegangen, dass ich GetLogicalDriveStrings bei jeder eingehenden Message das an- oder abstöpseln eines Laufwerks betreffend aufgerufen habe. Dann habe ich die Arrays [0..128] Of Char verglichen. Allerdings kann ich mit der Benutzung des PChar nichts anfangen und habe damm bedingt geschummelt.
Ich hatte herausgefunden, dass das Array eine Liste der vergebenen Laufwerksbuchstaben nach dem Schema 'A'+':'+'\'+#00 enthält. Jetzt habe ich einfach nur die Buchstaben verglichen und wenn dann z.B. vorher nach 'C' nichts mehr kam, dann war es der nächste Buchstabe und wenn zwischen z.B. 'C' und 'P' nichts kam und dann plötzlich ein 'I' auftauchte, hatte ich das Laufwerk auch gefunden.

Allerdings benötige ich für meine Zwecke die VID_ und PID_ des Gerätes. Die ermittle ich nun unter Einbindung der DBT.pas und der Registrierung eines UsbDeviceNotificationHandle in FormCreate gemäß des hier im Forum kursierenden Codes. Seit ich das tue, bekomme ich aber nur noch Hyroglyphen. Schlimmer noch: Das neue Laufwerk ist in dem Array nicht einmal mehr dabei
Ich brauche VID_ und PID_ aber, um das Gerät eindeutig zu identifizieren, sonst wäre mein Programm murks. Und ich müsste dann auch alle 26 Laufwerke druchprobieren, weil das neue nicht mehr auftaucht.

Delphi-Quellcode:
Var
   Drives      : Array [0..128] Of Char;
...

Procedure TForm1.FormCreate(Sender: TObject);
Begin
   GetLogicalDriveStrings(SizeOf(Drives), Drives);
...

Procedure TForm1.WMDeviceChange(Var Msg: TMessage);
   Function GetDrive: String;
   Var
      I         : Integer;
      Aktuell   : Array [0..128] Of Char;
   Begin
      GetLogicalDriveStrings(SizeOf(Aktuell), Aktuell);
      I:=0;
      Repeat
         Inc(I,4);
      Until (Aktuell[I]<>Drives[I]) Or (I>SizeOf(Aktuell));
      If I>SizeOf(Aktuell) Then
         Result:='Fehler'
      Else
         Result:=Aktuell[I]+Aktuell[I+1];
   End;
Var
   device            : PDevBroadcastHdr;
   DeviceInfoBlock   : PDevBroadcastDeviceInterface;
Begin
   device:=PDevBroadcastHdr(Msg.lParam);
   Case Msg.wParam Of
      $8000   :   If device.dbch_devicetype = DBT_DEVTYP_DEVICEINTERFACE Then
               Begin
                  ShowMessage(GetDrive);
                  DeviceInfoBlock:=PDevBroadcastDeviceInterface(Msg.LParam);
                  If IsDVR(String(Pchar(@DeviceInfoBlock.dbcc_name))) Then
                     Memo1.Lines.Add('Diktiergerät als Laufwerk '+GetDrive+' angeschlossen.');
                  Memo1.Lines.Add('-----');
                  GetLogicalDriveStrings(SizeOf(Drives), Drives);
               End;
      $8004   :   If device.dbch_devicetype = DBT_DEVTYP_DEVICEINTERFACE Then
               Begin
                  GetLogicalDriveStrings(SizeOf(Drives), Drives);
               End;
   End;
End;
Alex Winzer
  Mit Zitat antworten Zitat