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

Функции динамических библиотек могут вызываться двумя способами - явным и неявным. Рассмотрим их.

Неявный вызов

Механизм неявного вызова наиболее прост, т. к. выполняется автоматически и основан на имеющейся в приложении информации о вызываемых функциях и динамических библиотеках. Однако разработчик не имеет возможности влиять на ход загрузки DLL. Если операционная система не смогла загрузить библиотеку, просто выдается сообщение об ошибке. Единственный способ повлиять на процесс загрузки - использовать секцию инициализации библиотеки (см. выше).

В качестве примера неявного вызова рассмотрим простое приложение ОетоОЫЛ, использующее функции библиотеки Ба1аСпеск (см. выше). Для этого в нем имеются три компонента ТЕсШ, в которых осуществляется проверка введенной строки на соответствие формату одного из типов данных.

( Примечание ^

Проекты ОетоОШ и ОаІаСгіеск объединены в одну группу. Переключение междупроектами легко выполняется утилитой Диспетчер проектов.

(Листинг 28.5. Модуль главной формы проекта DemoDLLI

unit Unitl; interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, comctrls, Buttons;

type

TMainForm = class(TForm) Editl: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Labell: TLabel;
Label2: TLabel;
Label3: TLabel;
procedure EditlExit(Sender: TObject) ;
procedure Edit2Exit(Sender: TObject) ;
procedure Edit3Exit(Sender: TObject);

private

{ Private declarations } public

{ Public declarations } end;

var

MainForm: TMainForm;
function IsValidlnt(AText: String): Boolean;
external 'DataCheck.dll';
function IsValidDate(AText: String): Boolean;
external 'DataCheck.dll';
function ValidTime(AText: String): Boolean;
external 'DataCheck.dll';

implementation {$R *.DFM}

procedure TMainForm.EditlExit(Sender: TObject) ;
begin
if not IsValidlnt(Editl.Text) then Editl.Clear;
end;
procedure TMainForm.Edit2Exit(Sender: TObject);
begin
if not IsValidDate(Edit2.Text) then Edit2.Clear;
end;
procedure TMainForm.Edit3Exit(Sender: TObject);
begin
if not ValidTime(Edit3.Text) then Edit3. Clear;
end;

end.

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

В дальнейшем импортированные функции используются обычным образом.

Явный вызов

Явный вызов динамической библиотеки подразумевает создание программистом соответствующего исходного кода. Ему необходимо предусмотреть загрузку DLL, получение адресов переменных процедурного типа для используемых функций и процедур, выгрузку DLL.

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


⇐ Предыдущая страница| |Следующая страница ⇒

Программирование в Delphi 7



Новости за месяц

  • Декабрь
    2017
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс