AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Aktualisierung erzwingen

Ein Thema von Carsten1234 · begonnen am 15. Jan 2009 · letzter Beitrag vom 22. Okt 2009
Antwort Antwort
Carsten1234

Registriert seit: 9. Apr 2008
Ort: Vechelde
178 Beiträge
 
Delphi 8 Professional
 
#1

Re: Aktualisierung erzwingen

  Alt 16. Jan 2009, 07:34
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:10 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