Thema: Delphi Aktualisierung erzwingen

Einzelnen Beitrag anzeigen

Carsten1234

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

Re: Aktualisierung erzwingen

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