Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi neues Laufwerk erkennen (https://www.delphipraxis.net/59560-neues-laufwerk-erkennen.html)

NeoXan 24. Dez 2005 10:50


neues Laufwerk erkennen
 
Hallo,

zur Zeit sieht mein Programm folgendermaßen aus:

Es läuft ein Timer der in einem bestimmten Abstand alle Laufwerke abfragt und schaut ob Laufwerk L: dabei ist...hmm, ein wenig doof. Deshalb wollte ich fragen, wie man denn quasi das Programm die Nachricht "abfangen" lassen könnte, wenn ein neues Laufwerk hinzukommt bzw. eines wieder entfernt wird z.B. USB Stick (Wechselmedium).

vielen Dank
Florian

BTW: Hat ein USB Stick auch änhlich zu einer Festplatte eine Unique Device ID, oder vergleichbares?

Luckie 24. Dez 2005 11:23

Re: neues Laufwerk erkennen
 
Windows Schick da eine nachricht, wenn ein USB Gerät angeschlossen wird. Allerdings weiß ich jetzt nicht welche. Robert Marquardt ist aber unser USB Experte. Such mal nach Beiträgen von ihm, die mit USB zu tun haben.

Robert Marquardt 24. Dez 2005 16:54

Re: neues Laufwerk erkennen
 
Bei jeder Aenderung an den Geraeten bekommt man eine WM_DEVICECHANGE Nachricht.
Ich verweise jetzt mal auf JwaDbt.pas aus dem Modul win32api der Jedi-Apilib. http://jedi-apilib.sf.net
Da sind auch Kommentare von Microsoft mit dabei. Ansonsten hilft immer MSDN weiter. Microsoft hat das alles online.

NeoXan 25. Dez 2005 00:37

Re: neues Laufwerk erkennen
 
Ich habe zig Prozeduren ausprobiert...keine jedoch erfolgreich. Es wird mir angezeigt, wenn ein Laufwerk dazu kommt bzw. entfernt wird, jedoch bräuchte ich den Laufwerksbuchstaben oder ähnliches?

eine Beispiel Prozedur aus dem Forum übernommen:
Delphi-Quellcode:
procedure TfrmMain.WMDeviceChange(var Msg: TMessage);
type PDevBroadcastHdr = ^TDevBroadcastHdr;
TDevBroadcastHdr = packed record
dbcd_size, dbcd_devicetype, dbcd_reserved: DWORD; end;
type PDevBroadcastVolume = ^TDevBroadcastVolume;
TDevBroadcastVolume = packed record
dbcv_size, dbcv_devicetype, dbcv_reserved, dbcv_unitmask: DWORD;
dbcv_flags: Word; end;
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;
var Drive: String;
begin
case Msg.wParam of
$8000:
  if PDevBroadcastHdr(Msg.lParam)^.dbcd_devicetype = $0002 then
   ShowMessage('Datenträger in Laufwerk '+GetDrive(PDevBroadcastVolume(Msg.lParam))+'eingelegt');
$8004:
  if PDevBroadcastHdr(Msg.lParam)^.dbcd_devicetype = $0002 then
  begin
   Drive := GetDrive(PDevBroadcastVolume(Msg.lParam));
   ShowMessage('Datenträger aus Laufwerk '+Drive+'entfernt');
   if not(Drive = '') and (Drive[1] = ExtractFilePath(ParamStr(0))[1]) then Close;
  end;
end;
end;
[Drive] ist leer...Msg.lParam liefert eine mehrstellige Zahl.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:42 Uhr.

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