Инициализация и завершение работы библиотеки
Инициализация библиотеки происходит при ее подключении к программе и состоит в выполнении секций initialization во всех составляющих библиотеку модулях, а также в ее главном программном блоке. Завершение работы библиотеки происходит при отключении библиотеки от программы; в этот момент в каждом модуле выполняется секция finalization. Нужно использовать эти секции тогда, когда библиотека запрашивает и освобождает какие-то системные ресурсы, например файлы или соединения с базой данных. Запрос ресурса выполняется в секции initialization, а его освобождение - в секции finalization.
Существует еще один способ инициализации и завершения библиотеки, основанный на использовании предопределенной переменной DllProc. Переменная DllProc хранит адрес процедуры, которая автоматически вызывается при отключении библиотеки от программы, а также при создании и уничтожении параллельных потоков в программах, использующих DLL-библиотеку.
Пример использования переменной DllProc:
LibraryMyLib;
var SaveDllProc: TDLLProc;
procedure LibExit(Reason: Integer);
Begin
if Reason = DLL_PROCESS_DETACH then
Begin
// завершениебиблиотеки
End;
SaveDllProc(Reason); // вызовпредыдущейпроцедуры
End;
Begin
... // инициализация библиотеки
SaveDllProc := DllProc; // сохранение предыдущей процедуры
DllProc := @LibExit; // установка процедуры LibExit
End.
Процедура LibExit получает один целочисленный аргумент, который уточняет причину вызова. Возможные значения аргумента:
·DLL_PROCESS_DETACH — отключение программы;
·DLL_PROCESS_ATTACH — подключение программы;
·DLL_THREAD_ATTACH — создание параллельного потока;
·DLL_THREAD_DETACH — завершение параллельного потока.
Обратите внимание, что установка значения переменной DllProc выполняется в главном программном блоке, причем предыдущее значение сохраняется для вызова "по цепочке".
Рекомендуется прибегать к переменнойDllProc лишь в том случае, если библиотека должна реагировать на создание и уничтожение параллельных потоков. Во всех остальных случаях лучше выполнять инициализацию и завершение с помощью секций initialization и finalization.
Дата добавления: 2015-09-07; просмотров: 1179;