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
Seite 2 von 3     12 3      
Carsten1234

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

Re: Aktualisierung erzwingen

  Alt 16. Jan 2009, 06:46
Zitat von franktron:
P.S. unter Linux heist der Befehl Touch um eine Datei eine Änderung zu erzwingen ohne Sie zu ändern
Linux verhält sich hier "Windowskonform", zeigt also dasselbe Verhalten wie Windows.
Wenn eine Datei auf dem USB-Gerät vom Betriebssystem aus geändert wird, wird - wie bei Windows - auch der Cache angepasst und man sieht immer den aktuellen Stand. Kommt nun aber ein zweiter Master, hier das USB-Gerät selbst, und ändert diese Datei, bekommt das Betriebssystem diese Veränderung nicht mit.

Gruß, Carsten
  Mit Zitat antworten Zitat
Carsten1234

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

Re: Aktualisierung erzwingen

  Alt 16. Jan 2009, 08: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
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#13

Re: Aktualisierung erzwingen

  Alt 16. Jan 2009, 09:09
Da bleibt wohl doch die frage, ob dieser Wert wirklich FSCTL_MOUNT_VOLUME ntspricht ... könnte ja auch was ganz anderes sein

hast es auch schonmal mit FILE_FLAG_NO_BUFFERING versuchen?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Carsten1234

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

Re: Aktualisierung erzwingen

  Alt 16. Jan 2009, 09:34
Zitat von himitsu:
Da bleibt wohl doch die frage, ob dieser Wert wirklich FSCTL_MOUNT_VOLUME ntspricht ... könnte ja auch was ganz anderes sein

hast es auch schonmal mit FILE_FLAG_NO_BUFFERING versuchen?
S. [1]

Mein immer stärker werdender Verdacht geht in Richtung "Bug in Firmware", denn:
So lange das USB-Gerät die Log-Datei selbst nicht verändert, kann ich von meinem Programm aus das Gerät zigmal Dismounten und wieder Mounten. Klappt (jetzt) auch ohne Debug-Modus einwandfrei[1].
Wenn aber das USB-Gerät die Log-Datei verändert und ich dann das Gerät (dis-)mounten, stürzt es so gnadenlos ab, dass es nur noch durch Strom aus/an wieder belebt werden kann.

Gruß, Carsten

[1]
Delphi-Quellcode:
const
  //Konstanten für Volume Funktionen
  METHOD_BUFFERED = 0;
  {$EXTERNALSYM METHOD_BUFFERED}
  FILE_ANY_ACCESS = 0;
  {$EXTERNALSYM FILE_ANY_ACCESS}
  FILE_DEVICE_FILE_SYSTEM = $00000009;
  {$EXTERNALSYM FILE_DEVICE_FILE_SYSTEM}
  FSCTL_LOCK_VOLUME = (FILE_DEVICE_FILE_SYSTEM shl 16) or (FILE_ANY_ACCESS shl 14) or (6 shl 2)
                                or METHOD_BUFFERED;
  {$EXTERNALSYM FSCTL_LOCK_VOLUME}
  FSCTL_UNLOCK_VOLUME = ((FILE_DEVICE_FILE_SYSTEM shl 16) or (FILE_ANY_ACCESS shl 14) or (7 shl 2)
                                or METHOD_BUFFERED);
  {$EXTERNALSYM FSCTL_UNLOCK_VOLUME}
  FSCTL_DISMOUNT_VOLUME = ((FILE_DEVICE_FILE_SYSTEM shl 16) or (FILE_ANY_ACCESS shl 14) or (8 shl 2)
                                or METHOD_BUFFERED);

  FSCTL_MOUNT_VOLUME = ((FILE_DEVICE_FILE_SYSTEM shl 16) or (FILE_ANY_ACCESS shl 14) or (9 shl 2)
                                or METHOD_BUFFERED);
(...)
  hDrive := CreateFile('\\.\X:',
                       GENERIC_READ (*or GENERIC_WRITE*),
                       FILE_SHARE_READ (*or FILE_SHARE_WRITE*),
                       nil, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, 0);
  if hDrive <> INVALID_HANDLE_VALUE then
  begin
    DeviceIoControl(hDrive, FSCTL_DISMOUNT_VOLUME, nil, 0, nil, 0, W, nil);
    Delay(100);
    DeviceIoControl(hDrive, FSCTL_MOUNT_VOLUME, nil, 0, nil, 0, W, nil);
    Delay(100);
    CloseHandle(hDrive);
    Delay(600);
 end;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#15

Re: Aktualisierung erzwingen

  Alt 16. Jan 2009, 10:35
Ich meinte nur FILE_FLAG_NO_BUFFERING ohne Dismounten,

also einfach Datei so öffnen und dann auslesen?

Delphi-Quellcode:
hFile := CreateFile('X:\LogFile.txt', GENERIC_READ, FILE_SHARE_READ,
  nil, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, 0);
ReadFile(hFile, Buffer ...
CloseHandle(hFile);
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#16

Re: Aktualisierung erzwingen

  Alt 16. Jan 2009, 10:42
Zitat von himitsu:
man könnte jetzt auch mal versuchen zu raten
Oder man guckt in den entsprechenden Header-Dateien vom Windows SDK nach.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#17

Re: Aktualisierung erzwingen

  Alt 16. Jan 2009, 10:45
Daheim hab'sch das grad nicht installiert und hier isses leider nicht drauf -.-''
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
DerDan

Registriert seit: 15. Nov 2004
Ort: Donaueschingen
251 Beiträge
 
Delphi XE3 Professional
 
#18

Re: Aktualisierung erzwingen

  Alt 16. Jan 2009, 11:00
Hallo,

kann den USB Host nicht die Daten zum PC Streamen.

man könnte den LOG ja zum beispiel so übertragen, wie es über eine USB RS232 Schnittstelle passiert?

mfg

DerDan
nichts ist so schön wie man es sich vorstellt
  Mit Zitat antworten Zitat
Carsten1234

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

Re: Aktualisierung erzwingen

  Alt 16. Jan 2009, 11:50
Zitat von himitsu:
Ich meinte nur FILE_FLAG_NO_BUFFERING ohne Dismounten,
[/delphi]
Könnte ich so auch nochmal versuchen, aber die Tendenz zum Firmwarebug wird größer.
Weil: Ein Log-Eintrag wird nur dann erzeugt, wenn sich der Zustand am/im USB-Gerät ändert (es gibt zwei Zustände ähnl. Start/Stop). Ändere ich den Zustand nur einmal und versuche dann auszulesen, stürzt das Gerät ab.
Ändere ich hingegen zwei Mal den Zustand, stürzt es
1. nicht ab
und
2. ich kann die aktualisierte Log-Datei frisch auslesen!
Der Windows-Cache ist aktualisiert, der Geräteabsturz ist nicht mein Problem.

Dank Dir nochmal ganz herzlich, Gruß und schönes WoEn, Carsten

P.S. Dank natürlich auch allen anderen für ihre Lösungsvorschläge
  Mit Zitat antworten Zitat
Carsten1234

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

Re: Aktualisierung erzwingen

  Alt 16. Jan 2009, 11:51
Zitat von Luckie:
Oder man guckt in den entsprechenden Header-Dateien vom Windows SDK nach.
Hamma da, nix gefunden.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 09:17 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