Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi USB Stick erkennen (https://www.delphipraxis.net/17126-usb-stick-erkennen.html)

DeddyH 9. Feb 2012 14:17

AW: USB Stick erkennen
 
Delphi-Quellcode:
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
    FUSB: TComponentUSB;
    procedure DoOnConnect(Sender: TObject); //<- TNotifyEvent
    procedure DoOnDisconnect(Sender: TObject); //<- TNotifyEvent
  public
    { Public-Deklarationen }
  end;

...

procedure TForm1.DoOnConnect(Sender: TObject);
begin
  ShowMessage('Gerät angeschlossen');
end;

procedure TForm1.DoOnDisconnect(Sender: TObject);
begin
  ShowMessage('Gerät entfernt');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FUSB := TComponentUSB.Create(self);
  FUSB.OnUSBArrival := DoOnConnect;
  FUSB.OnUSBRemove := DoOnDisconnect;
end;

MiKaEr 9. Feb 2012 14:18

AW: USB Stick erkennen
 
ups.

sorry. jetzt weiß ich auch was ich falsch gemacht habe :oops:

ich habe das Sender: TObject vergessen

himitsu 9. Feb 2012 14:40

AW: USB Stick erkennen
 
PS: Delphi-Referenz durchsuchenTNotifyEvent

Zitat:

Zitat von MiKaEr (Beitrag 1150116)
mein einziges problem ist:

wie sieht der aufbau eines solchen TNotifyEvents aus?


DeddyH 9. Feb 2012 14:43

AW: USB Stick erkennen
 
Hast Du auch selbst vorher nachgeschaut?
Zitat:

Code:
typedef void __fastcall (__closure *TNotifyEvent)(System::TObject* Sender);

Für reine Delphianer nicht sehr informativ :roll:

MiKaEr 9. Feb 2012 14:45

AW: USB Stick erkennen
 
mir fällt gerade auf, dass der auf der letzten seite vorgeschlagene source-code (WMDeviceChange) nicht funktioniert.

folgende funktion gibt keinen wert zurück, da
Delphi-Quellcode:
if (Maske and 1) = 1
niemals zutrifft:

Delphi-Quellcode:
 function GetDrive(pDBVol: PDevBroadcastVolume): string;
 var
  i: Byte;
  Maske: DWORD;
 begin
  if (pDBVol^.dbcv_flags and $0001) = $0001 then
   begin
    Maske := pDBVol^.dbcv_unitmask;
    for i := 0 to 25 do
     begin
      if (Maske and 1) = 1 then
       Result := Char(i + Ord('A')) + ': ';

      Maske := Maske shr 1;
     end;
   end;
 end;

// GetDrive(PDevBroadcastVolume(Msg.lParam))

DeddyH 9. Feb 2012 14:58

AW: USB Stick erkennen
 
Welcher Wert steht denn in Maske?

himitsu 9. Feb 2012 16:18

AW: USB Stick erkennen
 
@Detlev: War auch vorwiegend als Beispiel gedacht. :stupid:
'ne lokale OH gibt's och noch, im Delphi-Quelltext steht es ganz genau und das CodeInsight, bzw. die Autovervollständigung zeichen auch die wichtigen pascalbezogenen Infos.

Falls man sich mal die Beschreibung zu DevBroadcastVolume ansieht, dann fällt Folgendes auf.
Zitat:

Gets the bit unit mask of the device. IE (bit 0 = A:, bit 1 = B:, etc..)
Mit der 1 liefert es also nur ein Ergebnis, wenn sich am ersten Laufwerk (also A: ) etwas verändert hat. :angle:

DeddyH 9. Feb 2012 16:29

AW: USB Stick erkennen
 
Das sehe ich aber anders.
Zitat:

Delphi-Quellcode:
for i := 0 to 25 do
begin
  if (Maske and 1) = 1 then Result := Char(i + Ord('A')) + ': ';
  Maske := Maske shr 1;
end;

Die Maske wird 26 mal auf gesetztes Bit geprüft und nach rechts geshiftet.

himitsu 9. Feb 2012 18:52

AW: USB Stick erkennen
 
:oops: Hab bei der Leerzeile aufgehört zu lesen ... wer kann den Ahnen, daß da noch was Wichtiges kommt. :stupid:

ASM 10. Feb 2012 16:33

AW: USB Stick erkennen
 
Zitat:

Zitat von MiKaEr (Beitrag 1150135)
mir fällt gerade auf, dass der auf der letzten seite vorgeschlagene source-code (WMDeviceChange) nicht funktioniert.

folgende funktion gibt keinen wert zurück, da
Delphi-Quellcode:
if (Maske and 1) = 1
niemals zutrifft:


Der Fehler liegt im Code
Code:
if (pDBVol^.dbcv_flags and $0001) = $0001 then
Der Wert "$0001" ist für den Wechsel eines CD/DVD-Laufwerks gültig.
Mit USB-Drives (Stick, Harddisk)) aber wird die dann folgende Schleife niemals durchlaufen, also der Laufwerksbuchstabe nicht erkannt.

Für USBs muss es vielmehr heißen:
Code:
 if (pDBVol^.dbcv_flags and DBTF_REMOVE) = DBTF_REMOVE then
wobei:
Code:
Const
  DBTF_REMOVE = $0000;
  DBTF_MEDIA = $0001;


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:41 Uhr.
Seite 3 von 4     123 4      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz