Компоненты Rave Reports и отчеты в приложении Delphi

       

Явный вызов



Явный вызов


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

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

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

unit Unit2;

interface


uses

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

type

StandardProc = function(AText: String): Boolean;

TMainForm = class(TForm)

Editl: TEdit;

Edit2: TEdit;

Edit3: TEdit;

Label1: TLabel;

Label2: TLabel;

LabelS: TLabel;

procedure FormShow(Sender: TObject);

procedure EditlExit(Sender: TObject);

procedure FormClose(Sender: TObject; var Action: TCloseAction);

procedure Edit2Exit(Sender: TObject);

procedure EditSExit(Sender: TObject);

 private

DLLHandle: THandle;

LoadError: Word;

IsValidlnt: StandardProc;

IsValidDate: StandardProc;

ValidTime: StandardProc;

 public

{ Public declarations }

  end;

var

MainForm: TMainForm;

implementation {$R *.DFM}

procedure TMainForm.FormShow(Sender: TObject);

 begin

DLLHandle := LoadLibrary('DataCheck');

 if DLLHandle = 0 then begin if GetLastError = ERROR_DLL_NOT_FOUND

then ShowMessagef'Ошибка загрузки DLL'); 

Close;

  end;

@IsValidInt := GetProcAddress(DLLHandle, 'IsValidlnt');

 SIsValidDate := GetProcAddress(DLLHandle, 'IsValidDate');

 SValidTime := GetProcAddress(DLLHandle, 'ValidTime');

  end;

procedure TMainForm.FormClose(Sender: TObject;

 var Action: TCloseAction);

 begin if DLLHandle <> 0

then FreeLibrary(DLLHandle);

  end;

procedure TMainForm.EditlExit(Sender: TObject); 

begin

if not IsValidlnt(Editl.Text)

then Edit2.Clear; 

end;

procedure TMainForm.Edit2Exit(Sender: TObject);

 begin if not IsValidDate(Edit2.Text)

then Editl.Clear; 

end;

procedure TMainForm.EditSExit(Sender: TObject);

 begin 

if not ValidTime(Edit3.Text)

then Edit3.Clear;

  end;

end.

Загрузка динамической библиотеки DataCheck осуществляется в методе-обработчике FormShow при помощи функции LoadLibrary. Имя динамической библиотеки может не содержать маршрута, если файл DLL расположен в одном каталоге с программой. Если в этом каталоге файл DLL не найден, поиск последовательно проводится в текущем каталоге, \SYSTEM и каталогах из перечня Path.

Так как для этой системной функции не создается исключительная ситуация, то следом предусмотрен контроль возможных ошибок. Функция GetLastError возвращает код последней ошибки.

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

Код ошибки ERROR_DLL_NOT_FOUND, Наряду со многими другими кодами, содержится в файле Windows.PAS.

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

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

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



Содержание раздела