Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Визуальное программирование / Лабораторная работа-10_ИС

.doc
Скачиваний:
34
Добавлен:
07.06.2015
Размер:
86.53 Кб
Скачать

Лабораторная работа № 10

Применение динамически подключаемых библиотек

Теоретический материал

Для создания DLL в Delphi введено зарезервированное слово Library, которым должен начинаться текст библиотеки. За словом Library следует идентификатор библиотеки, он может не совпадать с именем файла. Имя библиотеки определяется именно именем файла, а не идентификатором, следующим за словом Library.

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

Комплексным числом называется выражение вида a + ib, где a и b – любые действительные числа, i – специальное число, которое называется мнимой единицей. Для таких выражений понятия равенства и операции сложения и умножения вводятся следующим образом.

Суммой двух комплексных чисел a + ib и c + id называется комплексное число a + c + i(b + d).

Разностью двух комплексных чисел a + ib и c + id называется комплексное число a – c + i(b – d).

Произведением двух комплексных чисел a + ib и c + id называется комплексное число ac – bd + i(ad + bc).

Модулем комплексного числа называется длина вектора, соответствующего этому числу:

Пример.

Пример создания динамической библиотеки, включающей в себя 4 процедуры для работы с 3-х мерными векторами.

library VectorDLL;

uses SysUtils, Classes;

{$R *.res}

Type TVector3=record

X,Y,Z: Real;

end;

Function SummaryV(a,b: TVector3): TVector3; stdcall;

begin

Result.X:=a.X+b.X; Result.Y:=a.Y+b.Y; Result.Z:=a.Z+b.Z;

end;

Function DifferenceV(a,b: TVector3): TVector3; stdcall;

begin

Result.X:=a.X-b.X; Result.Y:=a.Y-b.Y; Result.Z:=a.Z-b.Z;

end;

Function MultiplicationV(a,b: TVector3): Real; stdcall;

begin

Result:=a.X*b.X+a.Y*b.Y+a.Z*b.Z;

end;

Function AbsV(a: TVector3): Real; stdcall;

begin

Result:=sqrt(sqr(a.X)+sqr(a.Y)+sqr(a.Z));

end;

Function CosAngleV(a,b: TVector3): Real; stdcall;

begin

Result:=MultiplicationV(a,b)/(AbsV(a)*AbsV(b))

end;

Exports

SummaryV name 'SummaryV1',

DifferenceV ,

MultiplicationV ,

CosAngleV ;

begin

end.

Статическая загрузка библиотеки.

unit Unit1;

interface

uses

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

type

TForm1 = class(TForm)

X1: TEdit; Y1: TEdit; Z1: TEdit; X2: TEdit; Y2: TEdit; Z2: TEdit;

Button1: TButton;

Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel;

Button2: TButton; Button3: TButton; Button4: TButton;

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

Type

TVector3=record

X,Y,Z: Real;

end;

Function SummaryV(a,b: TVector3): TVector3;

stdcall; External 'VectorDLL.dll';

Function DifferenceV(a,b: TVector3): TVector3;

stdcall; External 'VectorDLL.dll';

Function MultiplicationV(a,b: TVector3): Real;

stdcall; External 'VectorDLL.dll';

Function AbsV(a: TVector3): Real;

stdcall; External 'VectorDLL.dll';

Function CosAngleV(a,b: TVector3): Real;

stdcall; External 'VectorDLL.dll';

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

var a,b :TVector3;

begin

a.X:=StrToFloat(X1.Text);

a.Y:=StrToFloat(Y1.Text);

a.Z:=StrToFloat(Z1.Text);

b.X:=StrToFloat(X2.Text);

b.Y:=StrToFloat(Y2.Text);

b.Z:=StrToFloat(Z2.Text);

If Sender=Button1 Then

Begin

Label1.Caption:=FloatToStr(SummaryV(a,b).X);

Label2.Caption:=FloatToStr(SummaryV(a,b).Y);

Label3.Caption:=FloatToStr(SummaryV(a,b).Z);

End;

If Sender=Button2 Then

Begin

Label1.Caption:=FloatToStr(DifferenceV(a,b).X);

Label2.Caption:=FloatToStr(DifferenceV(a,b).Y);

Label3.Caption:=FloatToStr(DifferenceV(a,b).Z);

End;

If Sender=Button3 Then

Label4.Caption:=FloatToStr(MultiplicationV(a,b));

If Sender=Button4 Then

Label5.Caption:=FloatToStr(CosAngleV(a,b));

end;

end.

Динамическая загрузка библиотеки.

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls;

type

TForm1 = class(TForm)

X1: TEdit; Y1: TEdit; Z1: TEdit;

X2: TEdit; Y2: TEdit; Z2: TEdit;

Button1: TButton;

Label1: TLabel; Label2: TLabel; Label3: TLabel;

Button2: TButton; Button3: TButton; Button4: TButton;

Label4: TLabel;

procedure Button1Click(Sender: TObject);

private { Private declarations }

public { Public declarations }

end;

var

Form1: TForm1;

Type

TVector3=record

X,Y,Z: Real;

end;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

var a,b :TVector3;

Handle: THandle;

SummaryV: Function (a,b: TVector3): TVector3; stdcall;

DifferenceV: Function (a,b: TVector3): TVector3; stdcall;

MultiplicationV: Function (a,b: TVector3): Real; stdcall;

AbsV: Function (a: TVector3): Real; stdcall;

CosAngleV: Function (a,b: TVector3): Real; stdcall;

begin

// Очищаем адреса

@SummaryV:= nil;

@DifferenceV:=nil;

@MultiplicationV:= nil;

@AbsV:=nil;

@CosAngleV:= nil;

Handle:=LoadLibrary('VectorDLL.dll');

If Handle<32 Then

Begin

ShowMessage('Не найдена библиотека VectorDLL.dll');

Halt

End;

//Определяем адреса функций

@SummaryV:= GetProcAddress(Handle,'SummaryV');

@DifferenceV:=GetProcAddress(Handle,'DifferenceV');

@MultiplicationV:= GetProcAddress(Handle,'MultiplicationV');

@AbsV:=GetProcAddress(Handle,'AbsV');

@CosAngleV:= GetProcAddress(Handle,'CosAngleV');

a.X:=StrToFloat(X1.Text);

a.Y:=StrToFloat(Y1.Text);

a.Z:=StrToFloat(Z1.Text);

b.X:=StrToFloat(X2.Text);

b.Y:=StrToFloat(Y2.Text);

b.Z:=StrToFloat(Z2.Text);

If Sender=Button1 Then

Begin

Label1.Caption:=FloatToStr(SummaryV(a,b).X);

Label2.Caption:=FloatToStr(SummaryV(a,b).Y);

Label3.Caption:=FloatToStr(SummaryV(a,b).Z);

End;

If Sender=Button2 Then

Begin

Label1.Caption:=FloatToStr(DifferenceV(a,b).X);

Label2.Caption:=FloatToStr(DifferenceV(a,b).Y);

Label3.Caption:=FloatToStr(DifferenceV(a,b).Z);

End;

If Sender=Button3 Then

Label4.Caption:=FloatToStr(MultiplicationV(a,b));

//Освобождаем библиотеку

FreeLibrary(Handle)

end;

end.

Задания для самостоятельной работы.

  1. Проанализировать работу с с DLL в Delphi.

  2. Проанализировать пример на использование DLL.

  3. Создать DLL с процедурами(функциями), реализующими действия над комплексными числами.

  4. Организовать подключение созданной библиотеки к приложению “Калькулятор” (добавить дополнительно поле ввода для мнимой части числа).

Контрольные вопросы

  1. Объектно-ориентированная методология разработки программ.

  2. Динамически подключаемые библиотеки.

  3. Области применения DLL.

  4. Структура DLL файла.

  5. Статическая загрузка DLL.

  6. Динамическая загрузка DLL.