Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на языке Delphi_3.doc
Скачиваний:
37
Добавлен:
28.03.2015
Размер:
1.71 Mб
Скачать

5.3.4. Глобальные переменные и константы

Сделаем несколько замечаний о глобальных переменных и константах, объявленных в библиотеке:

  1. Они не могут быть экспортированы, поэтому если необходимо обеспечить к ним доступ из использующей программы, это нужно делать с помощью функций, возвращающих значение.

  2. Они не являются общими и не могут быть использованы для обмена данными между программами, несмотря на то, что библиотека может одновременно подключаться к нескольким программам. На каждое подключение библиотеки к программе, операционная система создает новое множество глобальных переменных, поэтому библиотеке кажется, что она работает лишь с одной программой. В результате, программисты избавлены от необходимости согласовывать работу нескольких программ с одной библиотекой.

5.3.5. Инициализация и завершение работы библиотеки

Инициализация библиотеки происходит при ее подключении к программе и состоит в выполнении секций 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.