Инициализация библиотеки происходит при ее подключении к программе и состоит в выполнении секций initialization во всех составляющих библиотеку модулях, а также в ее главном программном блоке. Завершение работы библиотеки происходит при отключении библиотеки от программы; в этот момент в каждом модуле выполняется секция finalization.
Эту возможность необходимо использовать, когда библиотека запрашивает и освобождает какие-то системные ресурсы, например файлы или соединения с базой данных. Запрос ресурса выполняется в секции initialization, а его освобождение — в секции finalization.
Существует еще один способ инициализации и завершения библиотеки, основанный на использовании предопределенной переменной DllProc. Переменная DllProc хранит адрес процедуры, которая автоматически вызывается при отключении библиотеки от программы, а также при создании и уничтожении параллельных потоков в программах, использующих DLL-библиотеку. Пример использования переменной DllProcприведен в приложении №:
library MyLib; var SaveDllProc: TDLLProc; procedure LibExit(Reason: Integer);begin if Reason = DLL_PROCESS_DETACH then begin ... // завершение библиотеки end; SaveDllProc(Reason); // вызов предыдущей процедурыend; begin ... // инициализация библиотеки SaveDllProc := DllProc; // сохранение предыдущей процедуры DllProc := @LibExit; // установка процедуры LibExitend. |
Процедура LibExit получает один целочисленный аргумент, который уточняет причину вызова. Возможные значения аргумента:
- DLL_PROCESS_DETACH — отключение программы;
- DLL_PROCESS_ATTACH — подключение программы;
- DLL_THREAD_ATTACH — создание параллельного потока;
- DLL_THREAD_DETACH — завершение параллельного потока.
Обратите внимание, что установка значения переменной DllProc выполняется в главном программном блоке, причем предыдущее значение сохраняется для вызова "по цепочке".
м прибегать к переменнойDllProc лишь в том случае, если библиотека должна реагировать на создание и уничтожение параллельных потоков. Во всех остальных случаях лучше выполнять инициализацию и завершение с помощью секций initialization и finalization.