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.