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;