Визуальное программирование / Лабораторная работа-10_ИС
.docЛабораторная работа № 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.
Задания для самостоятельной работы.
-
Проанализировать работу с с DLL в Delphi.
-
Проанализировать пример на использование DLL.
-
Создать DLL с процедурами(функциями), реализующими действия над комплексными числами.
-
Организовать подключение созданной библиотеки к приложению “Калькулятор” (добавить дополнительно поле ввода для мнимой части числа).
Контрольные вопросы
-
Объектно-ориентированная методология разработки программ.
-
Динамически подключаемые библиотеки.
-
Области применения DLL.
-
Структура DLL файла.
-
Статическая загрузка DLL.
-
Динамическая загрузка DLL.