Закрытие файла, открытого в DLL
Как мне закрыть файл, открытый в DLL (созданный в Delphi), и
вызванный из VB?
Это известная проблема. Это происходит от того, что VB закрывает при запуске
5 стандартных DOS-дескрипторов (0..4). Так, программа, открывшая файл, повторно
использует один из этих дескрипторов, чтобы первой открыть файл с локального
файла. Проблемы при использовании файла не возникает, но паскалевская процедура
Close использует характеристику "безопасной" работы: она отказывается закрывать
файл, если он имеет один из стандартных дексрипторов! Такая функциональность
хороша под DOS, но в нашей ситуации файл, открытый DLL никогда не закроется,
даже если DLL завершит свою работу! VC++, очевидно, менее закомплексован в
данном вопросе, и поэтому закрывает стандартный дескриптор.
Но вы сами можете решить эту проблему. Вместо использования паскалевских
методов Close/CloseFile для закрытия файла в DLL, вы можете использовать
следующее:
Procedure ReallyCloseFileVar(Var F); Assembler;
{ F должен иметь тип File }
Asm
les bx, F { сохраняем F в es:bx }
mov bx, word ptr es:[bx] { сохраняем дескриптор в bx }
mov ah, $3E { функция 3Eh аналогична закрытию файла }
call Dos3Call { задействуем прерывание int 21h }
End;
Procedure ReallyCloseFileHandle(FileHandle: word); assembler;
{ FileHandle - дескриптор DOS-файла }
asm
mov bx, Handle { сохраняем дескриптор в bx }
mov ah, $3E { функция 3Eh аналогична закрытию файла }
call DOS3Call { задействуем прерывание int 21h }
end;
|
|