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.