Самоучитель по Delphi 7 для профессионалов



             

Инициализация и завершение работы DLL - часть 2


Рассмотрим их.

  •  Значение DLL_PROCESS_DETACH передается при выгрузке DLL из адресного пространства процесса. Это происходит при явном вызове системной функции FreeLibrary (см. ниже) или при завершении процесса.
  •  Значение DLL_PROCESS_ATTACH означает, что библиотека отображается в адресное пространство процесса, который загружает ее в первый раз.
  •  Значение DLL_THREAD_ATTACH посылается всем загруженным в процесс динамическим библиотекам при создании нового потока. Обратите внимание, что при создании процесса и первичного потока посылается только одно значение DLL_PROCESS_ATTACH.
  •  Значение DLL_THREAD_DETACH посылается всем загруженным в процесс динамическим библиотекам при уничтожении существующего потока.

Впоследствии, при работе процесса с загруженной DLL, в случае возникновения описанных событий, функция обратного вызова вызывается снова и снова. При этом ей передается одно из рассмотренных значений.

Это хороший способ организовать в динамической библиотеке необходимую в каждом случае обработку. Как это сделать?

Во-первых, необходимо создать процедуру, подходящую для процедурного типа DLLProc, и написать для нее исходный код, применяемый в зависимости от переданного параметра.

Во-вторых, в секции инициализации нужно связать переменную DLLProc и созданную процедуру.

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

Листинг 28.3. Часть исходного кода динамической библиотеки DataCheck c функцией обратного вызова

...

{Часть исходного кода опущена (см. листинг 24.2)}

exports

IsValidlnt,

IsValidDate index 1,

IsValidTime index 2 name 'ValidTime',

procedure DLLEntryPoint(Reason: Integer);

 begin

case Reason of

DLL_PROCESS_ATTACH: ShowMessage('Первая загрузка DLL'); DLL_PROCESS_DETACH:;

DLL_THREAD_ATTACH: ShowMessage('Создан новый поток'); DLL_THREAD_DETACH:; end; end;

begin

DLLProc := @DLLEntryPoint;

DLLEntryPoint(DLL_PROCESS_ATTACH); 

end.

Процедура DLLEntryPoint обеспечивает простой показ сообщения о полученном значении параметра. В коде инициализации глобальной переменной DLLProc передается адрес процедуры DLLEntryPoint. Затем эта процедура вызывается явно с параметром DLL_PROCESS_ATTACH.




Содержание  Назад  Вперед