Einzelnen Beitrag anzeigen

omp

Registriert seit: 7. Apr 2012
60 Beiträge
 
#1

IsFileInUse mit CreateFile

  Alt 3. Nov 2017, 10:35
Hallo. Um zu prüfen, ob eine Datei geöffnet ist, verwendet man gerne
Code:
function IsFileInUse(const AFileName: string; ANeedWriteAccess: boolean): boolean;
var LFileRes: HFILE;
    LAccess : DWord;
begin
  if ANeedWriteAccess then
    LAccess := GENERIC_READ or GENERIC_WRITE
  else
    LAccess := GENERIC_READ;
  LFileRes := CreateFile(pchar(AFileName),
                         LAccess, 0, nil,
                         OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, 0);
  result := (LFileRes = INVALID_HANDLE_VALUE);
  if not result then
    CloseHandle(LFileRes);
end;
Der Code wird in diversen Foren und auf Tipp-Seite genannt und er funktionierte auch seit Jahren, dachte ich.

Als Win32-Application ist alles ok.

Als Win64 kompiliert und die .exe ausgeführt: Es wird nicht erkannt, dass die Datei geöffnet ist. Es gibt keine Exception.

Als Win64 im Delphi-Debugger ausgeführt verhält dich das Programm anders:
1. "Im Projekt .. ist eine Exception der Klasse $C0000008 mit der Meldung 'c0000008 INVALID_HANDLE' aufgetreten."
2. Dann die Fehlermeldung im Programm "Externe Exception C0000008". Diese kommt aber nicht, wenn ohne Debugger ausgeführt.
Tritt bei CloseHandle auf. LFileRes ist ein großer Integerwert, also <> INVALID_HANDLE_VALUE.

Habe auch ein neues Delphi-Projekt (10.2 Tokyo) angelegt und konnte es auch damit nachvollziehen.

Jetzt habe ich ein Fragezeichen auf dem Kopf.
Harald
  Mit Zitat antworten Zitat