Autor Beitrag
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1835
Erhaltene Danke: 333

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Mi 02.11.16 22:27 
Hallo Forum

Allgemeines:

TfrDrive ist eine nicht-visuelle Delphi und Lazarus (Neu!) Komponente, die einem Anwender dabei helfen soll:
- Laufwerke zu ermitteln und aufzulisten
- (externe) Laufwerke zu trennen / auszuwerfen
- gültige Laufwerke zu erkennen
>> Neu <<
- Laufwerk-Informationen auszulesen
- die Laufwerk-Anzeige zu bearbeiten

Voraussetzung:

Für Windows (32 und 64bit) Desktop-Anwendungen.
Minimum:
- Windows XP / Windows Server 2003
- Delphi6. Für Delphi5 und früher, bitte ein eigenes Package anlegen.
- Lazarus 0.9

Funktionsweise:

- Laufwerke trennen:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
{ Variante 1 }
var
  h: THandle;
begin
  h := frDrive1.OpenVolume('I');  // ermittelt ein Laufwerk 
  frDrive1.EjectVolume(h);        // trennt das Laufwerk
  //frDrive1.UnlockVolume(h);     // nimmt das Laufwerk wieder auf
  sleep(5000);
  frDrive1.CloseVolume(h);        // gibt das Handle wieder frei
end;

{ Variante 2 }
begin
  frDrive1.DriveLetter := 'I,J';  // ermittelt ein oder mehrere Laufwerke
  frDrive1.Eject := true;         // trennt die Laufwerke
  sleep(5000);
  frDrive1.Eject := false;        // nimmt die Laufwerke wieder auf und gibt alle Handle frei
end;

{ Variante 3 }
begin
  frDrive1.DriveType := [dtFixed, dtCDRom]; // ermittelt ein oder mehrere Laufwerk-Typen
  frDrive1.Eject := true;                   // trennt die Laufwerke
  sleep(5000);
  frDrive1.Eject := false;                  // nimmt die Laufwerke wieder auf und gibt alle Handle frei
end;

{ Abfragen }
var
  i: Integer;
  laufwerk: Char;
begin
  frDrive1.DriveLetter := 'CDEF...';
  // oder
  frDrive1.DriveType := [dtFixed, dtCDRom];

  frDrive1.Eject := true;
  frDrive1.Eject := false; // kann auch später aufgerufen werden
  for i := 0 to frDrive1.Count - 1 do
  begin
    laufwerk := frDrive1.DriveLetter[i + 1];
    if frDrive1.Ejected[i] then
      ShowMessage(laufwerk + ' wurde entfernt'else
      ShowMessage(laufwerk + ' wurde nicht entfernt');
  end;
end;

Die 2. und 3. Variante sind auch direkt in der Entwicklungsumgebung anwendbar.

- Laufwerke auflisten:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
{ Alle Laufwerke auflisten }

  frDrive1.GetDrives(Memo1.Lines, [dtNoRootDir, dtRemovable, dtFixed, dtRemote,
                                   dtCDRom, dtRAMDisk]);
  // oder
  frDrive1.GetDrives(Memo1.Lines, DRIVE_ALL);
  // oder
  frDrive1.GetDrives(Memo1.Lines, 255);


{ Bestimmte Laufwerke auflisten }

  frDrive1.GetDrives(Memo1.Lines, [dtFixed, dtCDRom]);
  // oder
  frDrive1.GetDrives(Memo1.Lines, DRIVE_CDROM);
  // oder
  frDrive1.GetDrives(Memo1.Lines, 5);

Natürlich können die Laufwerkbuchstaben auch in der Eigenschaft TfrDrive.DriveLetter festgelegt und wieder abgefragt werden.
Unabhängig von der Zuweisung, werden gültige Laufwerkbuchstaben als (aneinandergereihter) Text ausgegeben.
Ungültige Laufwerkbuchstaben, sowie auch Duplikate, werden ausgefiltert.

- Laufwerk überprüfen:

ausblenden Delphi-Quelltext
1:
2:
3:
// Gibt "True" zurück, wenn das Laufwerk existiert / der Laufwerkbuchstabe belegt ist.
if frDrive1.IsValidDrive('C'then
  // Laufwerk gültig

- Laufwerk-Anzeige bearbeiten:

ausblenden Delphi-Quelltext
1:
frDrive1.RenameDrive('C''MeinSystemLaufwerk');					


- Laufwerk Informationen auslesen:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
{ Ein oder mehrere Laufwerke }

var
  i: integer;
begin
  with frDrive1 do
  begin
    DriveType := [dtFixed, dtCDRom];  // Laufwerk-Typ/en festlegen
    // oder
    DriveLetter := 'C,D,...';   // Laufwerk-Buchstaben festlegen
    for i := 0 to Count - 1 do  // Count zählt dabei nur die gültigen Laufwerke!
    begin
      Memo1.Lines.Add(Info[i].DisplayName);     // Anzeige-Name wie unter Arbeitsplatz ersichtlich
      Memo1.Lines.Add(Info[i].TypeName);        // Typen-Name wie z.B. Lokaler Datenträger
      Memo1.Lines.Add(Info[i].FileSystemName);  // Dateisystem wie z.B. "NTFS"
      Memo1.Lines.Add(Info[i].VolumeSerial);    // Volume-Nummer (8 stelliger HEX Wert)
      Memo1.Lines.Add(Info[i].HDSerial);        // Serien-Nummer einer Festplatte
      Memo1.Lines.Add(Info[i].Model);           // Model-Beschreibung eines Laufwerkes
      Memo1.Lines.Add(Info[i].PDNumber);        // Nummer eines physikalischen Laufwerkes
      Memo1.Lines.Add(IntToStr(Info[i].FullSize));  // Gesamte Laufwerk-Größe in Bytes
      Memo1.Lines.Add(IntToStr(Info[i].FreeSize));  // Freier Speicherplatz in Bytes
      Image1.Picture.Icon.Assign(Info[i].Icon16);   // 16x16 px großes Icon
      Image1.Picture.Icon.Assign(Info[i].Icon32);   // 32x32 px großes Icon
      Image1.Picture.Icon.Assign(Info[i].IconSel16);  // 16x16 px großes Icon "Selektiert"
      Image1.Picture.Icon.Assign(Info[i].IconSel32);  // 32x32 px großes Icon "Selektiert"
    end;
  end;
end;

{ Ein bestimmtes Laufwerk }

var
  c: Char;
begin
  c := 'C';
  with frDrive1 do
  begin
    Memo1.Lines.Add(GetDisplayName(c));     
    Memo1.Lines.Add(GetTypeName(c));        
    Memo1.Lines.Add(GetFileSystemName(c));  
    Memo1.Lines.Add(GetVolumeSerial(c));    
    Memo1.Lines.Add(GetHDSerial(c));       
    Memo1.Lines.Add(GetModel(c));   
    Memo1.Lines.Add(GetPDNumber(c));
    Memo1.Lines.Add(IntToStr(GetFullSize(c)));  
    Memo1.Lines.Add(IntToStr(GetFreeSize(c)));  
    Image1.Picture.Icon.Assign(GetIcon16(c));  
    Image1.Picture.Icon.Assign(GetIcon32(c));  
    Image1.Picture.Icon.Assign(GetIconSel16(c));  
    Image1.Picture.Icon.Assign(GetIconSel32(c));
  end;
end;


Sollten Mängel auftreten oder Verbesserungsvorschläge vorliegen, so lasst es mich wissen.
Danke für's Lesen und die anschließende Nutzung. ;)
Einloggen, um Attachments anzusehen!
_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)


Zuletzt bearbeitet von Frühlingsrolle am Fr 30.06.17 13:23, insgesamt 13-mal bearbeitet

Für diesen Beitrag haben gedankt: Delphi-Laie, t.roller
Frühlingsrolle Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1835
Erhaltene Danke: 333

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Do 03.11.16 13:21 
[#] Korrekturen

Neu!
013 : Lose Variablen wurden nach-initialisiert.
012 : Das Feld FHandles ist nun ein dynamisches array of THandle.
011 : Das Attribut dtNoRootDir wurde aus dem enum TDriveType entfernt.
010 : Folgende Methoden wurden unbenannt : GetSelectedIcon16() -> GetIconSel16(), GetSelectedIcon32() -> GetIconSel32().
009 : Sämtliche (Methoden-) Parameter wurden unbenannt / durch bessere Bezeichner ersetzt.


008 : Anpassungen für Delphi Versionen < 6 bezüglich den Methoden AllocateHWnd() und DeallocateHWnd() wurden vorgenommen.
007 : Stringliste entfernt.
006 : Die Konstante DRIVE_ALL wurde von -1 auf 255 gesetzt.
005 : Die Icons verursachen kein Speicherleck mehr.
004 : Laufwerk-Größen (= Gesamt, Frei) von leeren Laufwerken liefern nun "0" anstelle eines ungültigen Zahlenwertes.
003 : Nicht erkennbare Dateisysteme liefern nun (im Unicode) einen leeren String anstelle eines ungültigen Zeichens.
002 : Strings soweit wie möglich Unicode tauglich angepasst.
001 : Eine Änderung der Eigenschaft .DriveType setzt die Eigenschaft .Eject auf false und schließt somit mögliche offene Handles.

[#] Erweiterungen

Neu!
011 : Ist nun auch für .NET verfügbar, siehe frDriveNET
010 : Konstanten, die für die Weiterentwicklung relevant sind, wurden global definiert.
009 : Laufwerke die (nicht) getrennt wurden, können mit der Eigenschaft .Ejected abgefragt werden.
008 : Das Laufwerk-Model und die Laufwerk-Nummer wurden den Laufwerk Informationen hinzugefügt.


007 : Die Komponente ist nun auch für Lazarus (FreePascal) verfügbar.
006 : Die Laufwerksanzeige lässt sich unbenennen.
005 : Die enum-Konstrukte wurden für Delphi Versionen < 6 angepasst.
004 : Eine WindowProc() Methode wurde hinzugefügt, sowie ein OnDeviceConnected und ein OnDeviceDisconnected Ereignis.
Mit Erzeugen der Komponente und nach dem Hinzufügen und Trennen externer Laufwerke, werden in der Eigenschaft .DriveLetter alle im Moment verfügbaren Laufwerkbuchstaben wiedergegeben.
003 : Eine Versionsnummer wurde hinzugefügt.
002 : Das Ermitteln von bestimmten Laufwerk Informationen ist nun möglich
001 : Eine globale Konstante DRIVE_ALL = -1; wurde deklariert.

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)


Zuletzt bearbeitet von Frühlingsrolle am Fr 30.06.17 17:41, insgesamt 5-mal bearbeitet
Delphi-Laie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1506
Erhaltene Danke: 210


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Do 16.03.17 23:13 
user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Das im Anhang enthaltene Package ist sowohl auf älteren Delphi Versionen (D7 PE) als auch auf neueren Versionen (D10.1 Starter) installierbar.


Es ist auch schon auf Delphi 6 installierbar.

Delphi 5 kommt hingegen mit dem Befehl

ausblenden Delphi-Quelltext
1:
2:
3:
requires
  rtl,
  vcl;


nicht zurecht, findet die Packages nicht. Warum, weiß ich nicht. "requires" kennen nämlich auch Delphi 5 und sogar Delphi 4 schon.

Edit: Vorher mußte ich noch

ausblenden Delphi-Quelltext
1:
{$ALIGN 8}					


auskommentieren bzw. entfernen, also für den Compiler unsichtbar machen.
Frühlingsrolle Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1835
Erhaltene Danke: 333

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Do 16.03.17 23:38 
Wenn das Package ein Problem darstellt, erstell' ein eigenes (leeres) Package in der jeweiligen Delphi Version, füge unter "Enthält" bzw. Contains die .PAS Datei und versuch es zu kompilieren. Sollte es scheitern, dann nur wenn eines der WinAPI Funktionen oder Konstanten nicht bekannt sind. Für den Fall habe ich sie in den Kommentaren aufgelistet. Das müsste man dann übernehmen.
Und wenn das Kompilieren doch gelingt, dann kannst du es mit deinem Package installieren.
Wenn beim Nutzen der Komponente eine Meldung wie "... .dcu nicht gefunden" kommen sollte, dann ist das der Hinweis, dass du diese unter Optionen -> Biibliothekspfad , den Ordner/Pfad zur .DCU eintragen musst.

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)

Für diesen Beitrag haben gedankt: Delphi-Laie
t.roller
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 111
Erhaltene Danke: 31



BeitragVerfasst: Fr 17.03.17 00:20 
Man sollte noch einen Versions-Hinweis einbauen, z.B. so:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
...
    function GetFreeSize(ADriveLetter: Char): Int64;
    function GetDriverVersion : String;  //<---------------------------
    procedure GetDrives(AList: TStrings; ADriveType: ShortInt); overload;
    procedure GetDrives(AList: TStrings; ADriveType: TDriveTypes); overload;
    property Count: Integer read GetCount;
    property Info[Index: Integer]: TDriveInfo read GetDriveInfo;
  published
    property DriveLetter: string read FDriveLetter write SetDriveLetter;
    property DriveType: TDriveTypes read FDriveType write SetDriveType;
    property Eject: Boolean read FEject write SetEject;
    property DriverVersion: String read GetDriverVersion;   //<---------------------------
  end;
...
function TfrDrive.GetDriverVersion : String;
begin
  Result:= '3.0';
end;
//-------------------------------------------
procedure TForm1.FormCreate(Sender: TObject);
begin
caption:= frDrive1.GetDriverVersion;
end;
Frühlingsrolle Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1835
Erhaltene Danke: 333

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Fr 17.03.17 01:03 
Erledigt. Für jene die es nicht wissen: Sobald eine neue Version erscheint, muss einzig die momentane .DCU durch die neue .DCU (siehe Dateianhang 1.Beitrag) ersetzt und die .DPK oder .DPROJ neu kompiliert werden. Die neue .PAS kann ersetzt werden, muss aber nicht.

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
galagher
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2175
Erhaltene Danke: 42

Windows 7 64 Bit
Delphi XE2 Starter, Delphi 10.1 Starter
BeitragVerfasst: Sa 18.03.17 22:10 
user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Hallo Forum

Allgemeines:

TfrDrive ist eine nicht-visuelle Delphi Komponente, die einem Anwender dabei helfen soll:
- Laufwerke zu ermitteln und aufzulisten
- (externe) Laufwerke zu trennen / auszuwerfen
- gültige Laufwerke zu erkennen
>> Neu <<
- Laufwerk-Informationen auszulesen

Finde ich sehr interessant! So etwas suche ich gerade, könnte es gut gebrauchen, wenn es "automatisch" erkennt, wenn ich zB. einen USB-Stick anstecke, so, wie der Windows-Explorer das macht, also "bemerkt", dass das entsprechende Laufwerk jetzt bereit ist und beim Abziehen des Sticks auch dies erkennt.
Kann die Komponente das?

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Delphi-Laie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1506
Erhaltene Danke: 210


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Sa 18.03.17 22:42 
user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
So etwas suche ich gerade, könnte es gut gebrauchen, wenn es "automatisch" erkennt, wenn ich zB. einen USB-Stick anstecke, so, wie der Windows-Explorer das macht, also "bemerkt", dass das entsprechende Laufwerk jetzt bereit ist und beim Abziehen des Sticks auch dies erkennt.
Kann die Komponente das?


Probiere es doch einfach aus!

Nach meinen bescheidenen Kenntnissen ist so etwas (konkret: systemweite Überwachung bestimmter Ereignisse) nur über einen globalen Hook möglich, demnach benötigt man eine Dll-Datei. Hat diese trotzdem sehr gute Komponente jedoch nicht. Deshalb dürfte es nach meiner vorsichtigen Einschätzung damit nichts werden.
Frühlingsrolle Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1835
Erhaltene Danke: 333

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Sa 18.03.17 22:51 
Nicht direkt. Du könntest nach dem Anschließen des externen Laufwerks die Methode .GetDrives() aufrufen. Das Ergebnis würde dann in einer TStrings/TStringList landen. Aber du hast Recht, das sollte noch viel bequemer von statten finden.

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
t.roller
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 111
Erhaltene Danke: 31



BeitragVerfasst: Sa 18.03.17 22:58 
Geht ohne grossen Aufwand:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
unit Unit1; //20170318

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
  Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, DBT, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    UsbNotifyInfo : TDevBroadcastDeviceinterfaceA;
    UsbDeviceNotificationHandle : Pointer;
    Procedure UsbDeviceChangeNotification(Var Msg : TMessage); MESSAGE WM_DEVICECHANGE;
    { Private declarations }
  public
    { Public declarations }
    Procedure RegisterUsbNotification;
    Procedure UnregisterUsbNotification;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure MM(s:string); begin Form1.Memo1.lines.add(s); end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  RegisterUsbNotification;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  UnregisterUsbNotification;
end;

Procedure TForm1.RegisterUsbNotification;
Var
  Error : Cardinal;
Begin
  ZeroMemory(@UsbNotifyInfo, sizeof(UsbNotifyInfo));
  UsbNotifyInfo.dbcc_size := sizeof(TDevBroadcastDeviceInterfaceA);
  UsbNotifyInfo.dbcc_devicetype := DBT_DEVTYP_DEVICEINTERFACE;
  UsbNotifyInfo.dbcc_reserved := 0;
  UsbNotifyInfo.dbcc_classguid := StringToGuid('{A5DCBF10-6530-11D2-901F-00C04FB951ED}');
  UsbDeviceNotificationHandle := RegisterDeviceNotification(self.Handle, @UsbNotifyInfo, Cardinal(0));
  If UsbDeviceNotificationHandle = NIL Then
  Begin
    Error := GetLastError;
    ShowMessage(Format('Registering Device Notification failed, error code: %d', [Error]));
  End;
End;

Procedure TForm1.UnregisterUsbNotification;
Begin
  If (UsbDeviceNotificationHandle <> NILThen
  Begin
    UnregisterDeviceNotification(UsbDeviceNotificationHandle);
  End;
End;

Procedure TForm1.UsbDeviceChangeNotification(Var Msg : TMessage);
Var
  device : PDevBroadcastHdr;
  DeviceInfoBlock : PDevBroadcastDeviceInterface;
  MyDevice : String;
Begin
  If Msg.Msg = WM_DEVICECHANGE Then
  Begin
  Winapi.windows.Beep(2000,50);
    If Msg.WParam = DBT_DEVICEREMOVECOMPLETE Then
    Begin
      device := PDevBroadcastHdr(Msg.lParam);
      If device.dbch_devicetype = DBT_DEVTYP_DEVICEINTERFACE Then
      Begin
        DeviceInfoBlock := PDevBroadcastDeviceInterface(Msg.LParam);
        MyDevice := String(Pchar(@DeviceInfoBlock.dbcc_name));
        MyDevice := Uppercase(MyDevice);
       MM('REMOVAL: '+#13#10+MyDevice);
      End;
    End
    Else
    If Msg.WParam = DBT_DEVICEARRIVAL Then
    Begin
      device := PDevBroadcastHdr(Msg.lParam);
      If device.dbch_devicetype = DBT_DEVTYP_DEVICEINTERFACE Then
      Begin
        DeviceInfoBlock := PDevBroadcastDeviceInterface(Msg.LParam);
        MyDevice := String(Pchar(@DeviceInfoBlock.dbcc_name));
        MyDevice := Uppercase(MyDevice);
        MM('ARRIVAL: '+#13#10+MyDevice);
      End;
    End;
  End;
End;

end.
Einloggen, um Attachments anzusehen!

Für diesen Beitrag haben gedankt: Frühlingsrolle, galagher
Frühlingsrolle Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1835
Erhaltene Danke: 333

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: So 19.03.17 00:28 
Die Idee find' ich gut. Daraus könnte man sogar 2 Ereignisse bereitstellen, nämlich OnDeviceConnect und OnDeviceDisconnect, je nach Rückgabewert des wParam. Eventuell noch eine eigene (virtuelle) WndProc Methode, für spätere Vererbungen. Die gibt es sonst erst ab TControl.

Nachtrag:

Erweiterungen / Korrekturen wurden vorgenommen. Siehe 2.Beitrag !

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)


Zuletzt bearbeitet von Frühlingsrolle am Fr 30.06.17 13:09, insgesamt 1-mal bearbeitet

Für diesen Beitrag haben gedankt: galagher
t.roller
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 111
Erhaltene Danke: 31



BeitragVerfasst: So 19.03.17 07:04 
Leider stürzt das Programm ab bei FOnDeviceConnected und FOnDeviceDisconnected.
Version fehlt: function GetVersion: string; muss unter public
Frühlingsrolle Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1835
Erhaltene Danke: 333

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: So 19.03.17 12:10 
Bei welcher Gelegenheit stürzt es ab? Und nein, GetVersion muss nicht unter public sein. :)
Kann noch jemand einen Absturz bestätigen?

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
t.roller
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 111
Erhaltene Danke: 31



BeitragVerfasst: So 19.03.17 19:33 
Crash beim Abziehen und/oder Anstecken eines USB-Sticks.
Einloggen, um Attachments anzusehen!
Frühlingsrolle Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1835
Erhaltene Danke: 333

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: So 19.03.17 19:50 
Das liegt leider an der falschen Nutzung (2er Versionen zur gleichen Zeit):

frDrive_fail
Einloggen, um Attachments anzusehen!
_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
t.roller
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 111
Erhaltene Danke: 31



BeitragVerfasst: So 19.03.17 19:53 
Das ist nicht die Ursache.
Einloggen, um Attachments anzusehen!
Frühlingsrolle Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1835
Erhaltene Danke: 333

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: So 19.03.17 20:06 
Na schön, dann probier die Demo. Hier wurde ebenso mit der Version 20170319 getestet.
Einloggen, um Attachments anzusehen!
_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
t.roller
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 111
Erhaltene Danke: 31



BeitragVerfasst: So 19.03.17 20:19 
user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Und nein, GetVersion muss nicht unter public sein. :)


Ich hatte es anders in der Unit1:

ausblenden Delphi-Quelltext
1:
caption:= frDrive2.GetVersion;					

statt
ausblenden Delphi-Quelltext
1:
caption:= frDrive2.Version;					


Aber wenn es public ist, kann man beide verwenden... :)

Moderiert von user profile iconTh69: Delphi-Tags hinzugefügt
t.roller
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 111
Erhaltene Danke: 31



BeitragVerfasst: So 19.03.17 20:27 
Seltsam: Deine EXE funktioniert, die unveränderte Compilation mit XE7 führt zum Absturz.
Einloggen, um Attachments anzusehen!
Frühlingsrolle Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1835
Erhaltene Danke: 333

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: So 19.03.17 20:30 
Die Demo funktioniert und die Laufwerke werden stehts beim Anschließen und Trennen aktualisiert? Das sollte so sein!

Geh' auf Nummer sicher und lad' die momentane Komponente nochmal runter. Ersetz' bei dir den gesamten Ordner, dann klick' auf "Bereinigen", nachher auf "Kompilieren" und am Ende "Installieren".

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)