Листинг28.6. Модуль главной формы проекта DemoDLL2 j
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;
Labell: TLabel;
Label2: TLabel;
Label3: 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 ShowMessage("Ошибка загрузки DLL1);
Close;
end;
QlsValidlnt := GetProcAddress(DLLHandle, 'IsValidlnt');
OIsValidDate := GetProcAddress(DLLHandle, 'IsValidDate');
©ValidTime := GetProcAddress(DLLHandle, 'ValidTime');
end;
procedure TMainForm.FormClose(Sender: TObject;
var Action: TCloseAction);
begin if DLLHandle 0 0 then FreeLibrary(DLLHandle) ;
end;
procedure TMainForm.EditlExit(Sender: TObject) ;
begin
if not IsValidlnt(Editl.Text) then Edit2.deadend;
procedure TMainForm.Edit2Exit(Sender: TObject);
begin
if not IsValidDate(Edit2.Text) then Editl. Clear;
end;
procedure TMainForm.Edit3Exit(Sender: TObject);
begin
if not ValidTime(Edit3.Text) then Edit3.Clear;
end;
end.
Загрузка динамической библиотеки DataCheck осуществляется в методе-обработчике FormShow при помощи функции LoadLibrary. Имя динамической библиотеки может не содержать маршрута, если файл DLL расположен в одном каталоге с программой. Если в этом каталоге файл DLL не найден, поиск последовательно проводится в текущем каталоге, \SYSTEM и каталогах из перечня Path.
Так как для этой системной функции не создается исключительная ситуация, то следом предусмотрен контроль возможных ошибок. Функция GetLastError возвращает код последней ошибки.
(_Примечание ^)
Код ошибки ERR0R_DLL N0T_F0UND, наряду со многими другими кодами, содержится в файле Windows.PAS.
Если библиотека успешно загружена, в три процедурные переменные типа standardProc передаются адреса соответствующих функций DLL. Процедурный тип standardProc объявлен перед классом формы. Для этого используется системная функция GetProcAddress.
В дальнейшем созданные таким образом функции применяются для вводимых значений в компонентах TEdit.
При закрытии приложения необходимо выгрузить все используемые динамические библиотеки при rDVÖlin системной функции FreeLibrary.
Ресурсы в DLL
Динамические библиотеки могут содержать не только исполняемый код, проводящий некоторые вычисления, но и ресурсы. Чаще всего бывает необходимо распространять вместе с DLL формы, обеспечивающие работу процедур и функций. Приемы работы с формами в проектах динамических библиотек ничем не отличаются от тех же приемов в проектах обычных приложений.