![]() |
Re: Aktualisierung erzwingen
Zitat:
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 |
Re: Aktualisierung erzwingen
Zitat:
DeviceIoControl soll lt. ![]() 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:
Anm.: Delay stammt von
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; ![]() 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. :wall: Gruß, Carsten |
Re: Aktualisierung erzwingen
Da bleibt wohl doch die frage, ob dieser Wert wirklich FSCTL_MOUNT_VOLUME ntspricht ... könnte ja auch was ganz anderes sein :stupid:
hast es auch schonmal mit FILE_FLAG_NO_BUFFERING versuchen? |
Re: Aktualisierung erzwingen
Zitat:
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; |
Re: Aktualisierung erzwingen
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); |
Re: Aktualisierung erzwingen
Zitat:
|
Re: Aktualisierung erzwingen
Daheim hab'sch das grad nicht installiert und hier isses leider nicht drauf -.-''
|
Re: Aktualisierung erzwingen
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 |
Re: Aktualisierung erzwingen
Zitat:
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. :stupid: 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 |
Re: Aktualisierung erzwingen
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:16 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