[Back to DELPHI SWAG index] [Back to Main SWAG index] [Original]
{
Q: How do I close a file that was opened in a DLL (Delphi
made) and called from VB?
A: This is a known problem. It comes from the fact that VB
closes the 5 DOS standard handles (0..4) at startup. So the
open file routine will reuse one of these handles to open the
first disk file. That is not a problem in using the file, but
the Pascal Close routine has a build-in safety feature: it
refuses to close a file that has one of the standard handles!
That is a Good Thing under DOS but screws up the works in your
situation since the file opened by the DLL is never closed, not
even when the DLL goes down! VC++ is obviously less restricted
and will close a standard handle.
You can fix this problem yourself. Instead of using the Pascal
Close/CloseFile routine to close the file in the DLL, use one
of these:
}
Procedure ReallyCloseFileVar(Var F); Assembler;
{ F should be a file type }
Asm
les bx, F { store F in es:bx }
mov bx, word ptr es:[bx] { store handle in bx }
mov ah, $3E { function 3Eh = close file }
call Dos3Call { execute int 21h }
End;
Procedure ReallyCloseFileHandle(FileHandle: word); assembler;
{ FileHandle is the DOS file handle }
asm
mov bx, Handle { store handle in bx }
mov ah, $3E { function 3Eh = close file }
call DOS3Call { execute int 21h }
end;
[Back to DELPHI SWAG index] [Back to Main SWAG index] [Original]