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 Wechseldatenträger auswerfen (https://www.delphipraxis.net/134352-wechseldatentraeger-auswerfen.html)

patti 20. Mai 2009 13:14


Wechseldatenträger auswerfen
 
Hallo,

stehe vor einem kleinen Problem und hoffe, dass ihr mir helfen könnt.
Und zwar geht es darum, einen Wechseldatenträger (hauptsächlich USB-Sticks) aus meinem eigenen Programm heraus sicher zu entfernen (also zunächst abzumelden, wie über das Tray-Icon "Hardware sicher entfernen"). Hab natürlich schon gesucht (in der DP und über Google) und mir auch schon was zusammengebastelt, was ansatzweise schon ganz gut funktioniert. Ich arbeite hierbei mit der Methode DeviceIoControl. Meine Vorgenhensweise ist dabei folgendermaßen:
  • Volume-Handle holen:

    Delphi-Quellcode:
    AccessFlags := GENERIC_READ or GENERIC_WRITE;
    //
    VolumeName := Format('\\.\%s:', [ADrive]);
    //
    Result := CreateFile(PChar(VolumeName), AccessFlags, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
  • Wenn Volume-Handle gültig ist (und DriveType DRIVE_REMOVABLE):
    --> Volume sperren (DeviceIoControl mit zweitem Parameter FSCTL_LOCK_VOLUME)
  • --> Volume dismounten (DeviceIoControl mit zweitem Parameter FSCTL_DISMOUNT_VOLUME)
  • --> PreventMediaRemoval auf false setzen (DeviceIoControl mit zweitem Parameter IOCTL_STORAGE_MEDIA_REMOVAL)
  • --> Volume auswerfen (DeviceIoControl mit zweitem Parameter IOCTL_STORAGE_EJECT_MEDIA)
  • --> Volume-Handle mit CloseHandle-Funktion "schließen"

Teste ich meinen Quellcode mit einem USB-Stick, so scheint das ganze schon zu funktionieren. Die LED blinkt zunächst und geht dann irgendwann aus, wie es auch beim Standard-Abmelden mit dem Tray-Icon der Fall ist. Allerdings wird das Gerät anscheinend nicht vollständig abgemeldet. Das Laufwerk-Icon bleibt im Explorer erhalten und auch das Tray-Icon zum Abmelden verschwindet nicht. Ein Zugriff auf den Datenträger ist allerdings nicht mehr möglich (Nachricht "Bitte Datenträger in Laufwerk einlegen" oder ähnlich). Wenn ich über den Geräte-Manager von Windows nach geänderter Hardware suchen lassen, bleibt das Problem weiterhin bestehen. Muss ich Windows noch irgendetwas mitteilen oder habe ich in meinem Code einfach nur etwas vergessen?

Hoffe, ich hab mich verständlich ausgedrückt und mein Problem ist lösbar ;-)
Danke schonmal ;-)

Patti

patti 21. Mai 2009 11:42

Re: Wechseldatenträger auswerfen
 
Ist zwar noch nicht ganz 24 Stunden seit meinem ersten Post her, aber ich hoffe, das wird mir verziehen ;-)
Noch eine Anmerkung: wenn ich DeviceIoControl mit dem Parameter IOCTL_STORAGE_EJECT_MEDIA aufrufe, um das Medium auszuwerfen, liefert mir die Funktion als result "true", scheint also tatsächlich erfolgreich zu sein. Es geht nur darum, Windows noch mitzuteilen, dass das Gerät vollkommen abgemeldet wurde und nicht mehr als angestecktes Gerät erkannt werden soll. Muss ich mit Datenverlust auf meinem Stick rechnen, wenn ich ihn nach der (erfolgreichen) Ausführung meines Quelltextes einfach abziehe? (Denke eigentlich nicht, weil das Gerät ja "geunmountet" wurde und auch ausgeworfen ["eject"] wurde).
Kennt vielleicht noch jemand eine andere Möglichkeit (allerdings ohne Fremdkomponenten, ...), einen USB-Stick aus meinem Delphi-Programm heraus sicher zu entfernen?

Patti

rakekniven 29. Nov 2010 14:22

AW: Wechseldatenträger auswerfen
 
Hi,

hast Du hierfür inzwischen eine Lösung gefunden?

Gruß


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:38 Uhr.

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