Глобальные переменные и константы, объявленные в библиотеке, не могут быть экспортированы, поэтому если необходимо обеспечить к ним доступ из использующей программы, это нужно делать с помощью функций, возвращающих значение.
Несмотря на то, что библиотека может одновременно подключаться к нескольким программам, ее глобальные переменные не являются общими и не могут быть использованы для обмена данными между программами. На каждое подключение библиотеки к программе, операционная система создает новое множество глобальных переменных, поэтому библиотеке кажется, что она работает лишь с одной программой. В результате программисты избавлены от необходимости согласовывать работу нескольких программ с одной библиотекой.
Инициализация и завершение работы библиотеки
Инициализация библиотеки происходит при ее подключении к программе и состоит в выполнении секций 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; // установка процедуры LibExit
End.
Процедура LibExit получает один целочисленный аргумент, который уточняет причину вызова. Возможные значения аргумента:
·DLL_PROCESS_DETACH — отключение программы;
·DLL_PROCESS_ATTACH — подключение программы;
·DLL_THREAD_ATTACH — создание параллельного потока;
·DLL_THREAD_DETACH — завершение параллельного потока.
Обратите внимание, что установка значения переменной DllProc выполняется в главном программном блоке, причем предыдущее значение сохраняется для вызова "по цепочке".
Рекомендуется прибегать к переменной DllProc лишь в том случае, если библиотека должна реагировать на создание и уничтожение параллельных потоков. Во всех остальных случаях лучше выполнять инициализацию и завершение с помощью секций initialization и finalization.