Zitat von
himitsu:
FSCTL_MOUNT_VOLUME = $00090024;[/delphi]
1) Das scheint schon nicht schlecht geraten zu sein, allerdings ist der Effekt etwas merkwürdig.
DeviceIoControl soll lt.
Doku einen booleanschen Wert zurück liefern. Dies scheint aber erst der Fall zu sein, wenn ich das CloseHandle aufrufe, denn so lange ich das nicht mache, sehe ich zwar den Laufwerksbuchstaben des USB-Geräts im Explorer, mehr aber auch nicht. Nach dem CloseHandle sehe ich das USB-Gerät wieder im Explorer *komplett*.
Anders ausgedrückt: Das FSCTL_DISMOUNT_VOLUME klappt noch, DeviceIOControl liefert TRUE zurück. Bei FSCTL_MOUNT_VOLUME liefert DeviceIOControl so lange FALSE zurück (wenn ich mit dem Explorer auf das USB-Gerät schaue), bis ein CloseHandle erfolgt. Nach dem CloseHandle steht das USB-Gerät im Explorer wieder korrekt zur Verfügung.
Delphi-Quellcode:
const
FSCTL_DISMOUNT_VOLUME = $00090020;
FSCTL_MOUNT_VOLUME = $00090024;
function TForm1.RefreshDrive: boolean;
var hDrive: THandle;
W: LongWord;
Drive: string;
x : byte;
begin
hDrive := CreateFile('\\.\X:',
GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE,
nil, OPEN_EXISTING, 0, 0);
if hDrive <> INVALID_HANDLE_VALUE then
begin
Result:= DeviceIoControl(hDrive, FSCTL_DISMOUNT_VOLUME, nil, 0, nil, 0, W, nil);
// Testweise:
Delay(100); // warte 100ms
if (Result) then
begin
// 5 Mountversuche
for x:= 1 to 5 do
begin
Result:= DeviceIoControl(hDrive, FSCTL_MOUNT_VOLUME, nil, 0, nil, 0, W, nil);
Delay(100);
if (Result) then
Break;
end;
if (not Result) then
MessageDlg('Mount fehlgeschlagen!', mtError, [mbOk], 0);
end
else
MessageDlg('Dismount fehlgeschlagen!', mtError, [mbOk], 0);
CloseHandle(hDrive);
end;
end;
Anm.: Delay stammt von
hier.
2) Das ganze funktioniert leider auch nur so lange wunderprächtig, bis das USB-Gerät selbst den Inhalt der Log-Datei verändert hat. Hat es diese geändert, geht das Mounten total in die Hose.
Gruß, Carsten