Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Laboratornaya_rabota_8_dll.doc
Скачиваний:
18
Добавлен:
29.03.2015
Размер:
95.23 Кб
Скачать

Явный вызов

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

unit Unit2;

interface

uses

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

type

StandardProc = function(AText: String): Boolean;

TMainForm = class(TForm)

Edit1: TEdit;

Edit2: TEdit;

Edit3: TEdit;

Label1: TLabel;

Label2: TLabel;

LabelS: TLabel;

procedure FormShow(Sender: TObject);

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

procedure Edit1Exit(Sender: TObject);

procedure Edit2Exit(Sender: TObject);

procedure Edit3Exit(Sender: TObject);

private

DLLHandle: THandle;

LoadError: Word;

IsValidInt: StandardProc;

IsValidDate: StandardProc;

ValidTime: StandardProc;

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, 'IsValidInt');

@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.Edit1Exit(Sender: TObject);

begin

if not IsValidInt(Edit1.Text) then Edit1.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.

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

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

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

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

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

Ресурсы в dll

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]