16218

СОЗДАНИЕ DLL

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

Информатика, кибернетика и программирование

Лабораторная работа №6 Создание DLL Цель лабораторной работы: изучить принципы создания и использования DLL в Delphi. Постановка задачи: Разработать библиотеку DLL содержащую класс вычисления определенного интеграла экспортируемую функцию и форму выбора цвета которы

Русский

2013-06-20

87.5 KB

16 чел.

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

Создание DLL

Цель лабораторной работы: изучить принципы создания и использования DLL в Delphi.

Постановка задачи:

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

Краткие теоретические сведения:

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

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

Эффективнее было бы использовать одну копию. Такую возможность предоставляет DLL.

В отличие от модуля DLL не компонуется с использующей DLL программой. Вместо этого код и ресурсы DLL находятся в отдельном выполняемом файле с расширением .DLL. Этот файл должен присутствовать при выполнении программы-клиента. Вызываемые программой процедуры и функции динамически компонуются со своими точками входа в используемой программе DLL.

Другое отличие модулей от DLL состоит в том, что модули могут экспортировать типы, константы, данные и объекты, а DLL - только процедуры и функции.

Чтобы ее можно было использовать в программе Borland Pascal, DLL не обязательно должна быть написана на Borland Pascal. Кроме того, программы,  написанные на других языках, могут использовать DLL, написанные на Borland Pascal.  DLL,  таким образом, идеально подходит при программных проектах, реализуемых на нескольких языках.

Шаблон DLL:

library MyDll;

uses

<используемые модули>;

<объявления и описания функций>

exports

< экспортируемые функции>

begin

<инициализационная часть>

end.

Текст программы:

// основная программа

unit UDisplayForm;

interface

uses

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

Dialogs, Series, ExtCtrls, StdCtrls, TeEngine, TeeProcs, Chart, Buttons;

type

TForm1 = class(TForm)

Edit2: TEdit;

Edit1: TEdit;

MethodSelector1: TRadioGroup;

DisplayChart: TChart;

SeriesFunction1: TLineSeries;

Label1: TLabel;

Label2: TLabel;

Label4: TLabel;

SeriesPatterned1: TAreaSeries;

Label3: TLabel;

Edit3: TEdit;

SpeedButton1: TSpeedButton;

Edit4: TEdit;

Panel1: TPanel;

Label5: TLabel;

Panel2: TPanel;

CheckBox1: TCheckBox;

SeriesPatterned2: TAreaSeries;

SeriesFunction2: TLineSeries;

SeriesCommon: TAreaSeries;

Label6: TLabel;

Edit5: TEdit;

Label7: TLabel;

Edit6: TEdit;

Label8: TLabel;

Edit7: TEdit;

Panel3: TPanel;

Label9: TLabel;

Edit8: TEdit;

Panel4: TPanel;

Label10: TLabel;

Edit9: TEdit;

Panel5: TPanel;

Label11: TLabel;

Edit10: TEdit;

Panel6: TPanel;

Label12: TLabel;

Edit11: TEdit;

RadioGroup1: TRadioGroup;

RadioGroup2: TRadioGroup;

MethodSelector2: TRadioGroup;

Bevel1: TBevel;

Label13: TLabel;

Label14: TLabel;

SpeedButton3: TSpeedButton;

procedure FormCreate(Sender: TObject);

procedure SomeEditKeyPress(Sender: TObject; var Key: Char);

procedure SpeedButton1Click(Sender: TObject);

procedure SomeEditChange1(Sender: TObject);

procedure SomeEditChange2(Sender: TObject);

procedure MethodSelector1Click(Sender: TObject);

procedure CheckBox1Click(Sender: TObject);

procedure FormShow(Sender: TObject);

procedure SmthChanged;

function f2(x: Extended): Extended;

procedure RadioGroup1Click(Sender: TObject);

procedure RadioGroup2Click(Sender: TObject);

procedure MethodSelector2Click(Sender: TObject);

procedure SpeedButton3Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

function GetTwoIntegrals(): ITwoIntegrals; far; external 'MyDll.dll';

function SetColorResult(Form:TForm): TColor; far; external 'FormDLL.dll';

var

Form1: TForm1;

e1, e2, e3, e5, e6, e7: string;

p1, p2, p3, p5, p6, p7: integer;

int:ITwoIntegrals;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);

begin

int:=GetTwoIntegrals();

int.Chart:=DisplayChart;

int.OnSomethingChanged:=SmthChanged;

end;

procedure TForm1.SomeEditKeyPress(Sender: TObject; var Key: Char);

begin

if Sender=Edit3 then

p3:=Edit3.SelStart;

 

if (Sender=Edit2) then

p2:=Edit2.SelStart;

if (Sender=Edit1) then

p1:=Edit1.SelStart;

if Sender=Edit7 then

p7:=Edit7.SelStart;

if (Sender=Edit6) then

p6:=Edit6.SelStart;

if (Sender=Edit5) then

p5:=Edit5.SelStart;

end;

procedure TForm1.SpeedButton1Click(Sender: TObject);

begin

Application.Terminate;

end;

procedure TForm1.SomeEditChange1(Sender: TObject);

var r: real;

begin

if Sender=Edit3 then

begin

try

int.Integral1.N:=StrToInt((Sender as TEdit).Text);

e3:=Edit3.Text;

except

on EConvertError do begin

Edit3.Text:=e3;

Edit3.SelStart:=p3;

end;

end;

end

else if ((Sender=Edit1) or (Sender=Edit2)) then

begin

if true then

begin

try

r:=StrToFloat((Sender as TEdit).Text);

e1:=Edit1.Text;

e2:=Edit2.Text;

except

on EConvertError do begin

if Sender=Edit1 then

begin

(Sender as TEdit).Text:=e1;

(Sender as TEdit).SelStart:=p1;

end

else if Sender=Edit2 then

begin

(Sender as TEdit).Text:=e2;

(Sender as TEdit).SelStart:=p2;

end;

exit;

end;

end;

if Sender=Edit2 then

begin

int.Integral1.B:=r;

end

else

begin

int.Integral1.A:=r;

end;

end;

end;

end;

procedure TForm1.SomeEditChange2(Sender: TObject);

var r: real;

begin

if Sender=Edit7 then

begin

try

int.Integral2.N:=StrToInt((Sender as TEdit).Text);

e7:=Edit7.Text;

except

on EConvertError do begin

Edit7.Text:=e7;

Edit7.SelStart:=p7;

end;

end;

end

else if ((Sender=Edit5) or (Sender=Edit6)) then

begin

if true then

begin

try

r:=StrToFloat((Sender as TEdit).Text);

e5:=Edit5.Text;

e6:=Edit6.Text;

except

on EConvertError do begin

if Sender=Edit5 then

begin

(Sender as TEdit).Text:=e5;

(Sender as TEdit).SelStart:=p5;

end

else if Sender=Edit6 then

begin

(Sender as TEdit).Text:=e6;

(Sender as TEdit).SelStart:=p6;

end;

exit;

end;

end;

if Sender=Edit6 then

begin

int.Integral2.B:=r;

end

else

begin

int.Integral2.A:=r;

end;

end;

end;

end;

procedure TForm1.MethodSelector1Click(Sender: TObject);

begin

//int.CalcMethod:=MethodSelector.ItemIndex;

int.Integral1.CalcMethod := MethodSelector1.ItemIndex;

end;

procedure TForm1.CheckBox1Click(Sender: TObject);

begin

SeriesPatterned1.AreaLinesPen.Visible:=(Sender as TCheckBox).Checked;

SeriesPatterned2.AreaLinesPen.Visible:=(Sender as TCheckBox).Checked;

end;

procedure TForm1.FormShow(Sender: TObject);

begin

SomeEditChange1(Edit1);

SomeEditChange1(Edit2);

SomeEditChange2(Edit5);

SomeEditChange2(Edit6);

end;

procedure TForm1.SmthChanged;

begin

if not int.Integral1.IsError then

Edit4.Text:=FloatToStr(int.Integral1.Res)

else

Edit4.Text:='Ошибка в данных!';

if not int.Integral2.IsError then

Edit9.Text:=FloatToStr(int.Integral2.Res)

else

Edit9.Text:='Ошибка в данных!';

if not int.IsError then

begin

Edit8.Text:=FloatToStr(int.Sum);

Edit10.Text:=FloatToStr(int.Difference12);

Edit11.Text:=FloatToStr(int.Difference21);

end

else

begin

Edit8.Text:='Ошибка в данных!';

 Edit10.Text:='Ошибка в данных!';

Edit11.Text:='Ошибка в данных!';

 end;

end;

function TForm1.f2(x: Extended): Extended;

begin

Result:=x*x*3;

end;

procedure TForm1.RadioGroup1Click(Sender: TObject);

begin

int.Integral1.Free;

int.SetIntegral1((Sender as TRadioGroup).ItemIndex);

int.Integral1.CalcMethod:=MethodSelector1.ItemIndex;

end;

procedure TForm1.RadioGroup2Click(Sender: TObject);

begin

int.Integral2.Free;

int.SetIntegral2((Sender as TRadioGroup).ItemIndex);

int.Integral2.CalcMethod:=MethodSelector2.ItemIndex;

end;

procedure TForm1.MethodSelector2Click(Sender: TObject);

begin

int.Integral2.CalcMethod := MethodSelector2.ItemIndex;

end;

procedure TForm1.SpeedButton3Click(Sender: TObject);

var ColorResult:TColor;

begin

ColorResult:=SetColorResult(Form1);

Edit4.Font.Color:=ColorResult;

Edit8.Font.Color:=ColorResult;

Edit9.Font.Color:=ColorResult;

Edit10.Font.Color:=ColorResult;

Edit11.Font.Color:=ColorResult;

end;

end.

unit TwoIntegralIntf;

interface

uses UCalc, Chart, Windows;

type TProcedure = procedure () of object;

type

ITwoIntegrals = interface(IInterface)

//['{29B70BB9-03DF-4856-888A-A8F32162C309}']

procedure SetChart(newChart: TChart);

procedure SetCalcMethod(newMethod: byte);

procedure SetOnSomethingChanged(newProcedure:TProcedure);

function GetSum:Extended;

function GetChart:TChart;

function GetDifference12:Extended;

function GetDifference21:Extended;

function GetIsError:boolean;

function GetCalcMetod:byte;

function GetIntegral1:TIntegral;

function GetIntegral2:TIntegral;

function GetOnSomethingChanged:TProcedure;

procedure SetIntegral1(newIntegral1: Byte);

procedure SetIntegral2(newIntegral2: Byte);

procedure ParametersChanged(AA: Extended);

property Sum: Extended read GetSum;

property Difference12: Extended read GetDifference12;

property Difference21: Extended read GetDifference21;

property IsError: boolean read GetIsError;

property Chart: TChart read GetChart write SetChart;

property CalcMethod: byte read GetCalcMetod write SetCalcMethod;

property Integral1: TIntegral read GetIntegral1;// write SetIntegral1;

property Integral2: TIntegral read GetIntegral2;// write SetIntegral2;

property OnSomethingChanged: TProcedure read GetOnSomethingChanged write SetOnSomethingChanged;

 end;

implementation

end.


Результаты работы программы:

Вывод: В результате выполнения данной лабораторной работы были изучить принципы создания и использования DLL в Delphi.

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


 

А также другие работы, которые могут Вас заинтересовать

29023. Фундаменты мелкого заложения и их основные виды. Применяемые материалы и их выбор 43 KB
  Фундаменты мелкого заложения и их основные виды. К фундаментам мелкого заложения относятся фундаменты имеющие отношение их глубины заложения к ширине подошвы не превышающее 4 и передающие нагрузку на грунты основания преимущественно через подошву. Фундаменты мелкого заложения разделяются на следующие основные типы: отдельные ленточные сплошные и массивные см.2 Отдельные фундаменты устраивают под колонны опоры балок ферм и других элементов промышленных и гражданских зданий и сооружений.
29024. Отдельные фундаменты мелкого заложения. Основные конструктивные решения и применяемые материалы 48 KB
  Отдельные фундаменты мелкого заложения. Отдельные фундаменты устраивают под колонны опоры балок ферм и других элементов промышленных и гражданских зданий и сооружений. Отдельные фундаменты представляют собой кирпичные каменные бетонные или железобетонные столбы с уширенной опорной частью. Отдельные фундаменты могут выполняться в монолитном и сборном варианте.
29025. Ленточные фундаменты под стены. Конструктивные решения и применяемые материалы. Условия применения прерывистых ленточных фундаментов 36.5 KB
  Ленточные фундаменты под стены. Ленточные фундаменты под стены устраивают либо монолитными либо из сборных блоков. Монолитные ленточные фундаменты изготовляют из природного камня бетона или железобетона. Монолитные ленточные фундаменты из природного камня и бетона проектируются как жёсткие.
29026. Ленточные фундаменты под колонны и их конструктивные решения 26 KB
  Ленточные фундаменты под колонны и их конструктивные решения. Ленточные фундаменты под колонны устраивают в виде одиночных под ряд колонн или перекрёстных под сетку колонн лент рис. Ленточные фундаменты под колонны предают большую жёсткость сооружению и способствуют выравниванию его осадки.
29027. Сплошные фундаменты. Основные конструктивные решения. Сопряжение колонн со сплошными фундаментами 31 KB
  Сплошные фундаменты. Сплошные фундаменты иногда называемые плитными устраивают под всем зданием в виде железобетонных плит под стены или сетку колонн рис. Сплошные фундаменты способствуют уменьшению неравномерности осадки сооружения. Сплошные фундаменты выполняются как правило из монолитного железобетона.
29028. Определение глубины заложения фундамента исходя из инженерно-геологических и гидрогеологических условий строительной площадки 31.5 KB
  Этот выбор производится на основе предварительной оценки прочности и сжимаемости грунтов по геологическим разрезам. Покажем это на примере рассмотрев 3 наиболее характерные схемы напластований грунтов приведенные на рис. Площадка сложена одним или несколькими слоями прочных грунтов при этом строительные свойства каждого последующего слоя не хуже свойств предыдущего. В этом случае глубина заложения фундамента принимается минимальной допускаемой при учёте сезонного промерзания грунтов и конструктивных особенностей сооружения рис.
29029. Учёт глубины сезонного промерзания грунтов при выборе глубины заложения фундаментов зданий и сооружений 20.5 KB
  Учёт глубины сезонного промерзания грунтов при выборе глубины заложения фундаментов зданий и сооружений. Глубина заложения фундамента из условия промерзания грунтов назначается в зависимости от их вида состояния начальной влажности и уровня подземных вод в период промерзания. Как непучинистые рассматриваются также пески мелкие и пылеватые с любой влажностью а также супеси твёрдой консистенции если уровень подземных вод во время промерзания находится от спланированной отметки земли на глубине равной расчётной глубине промерзания плюс 2 м...
29030. Определение глубины заложения фундаментов с учётом конструктивных особенностей сооружения, включая глубину прокладки подземных коммуникаций, наличие и глубину заложения соседних фундаментов 31.5 KB
  Определение глубины заложения фундаментов с учётом конструктивных особенностей сооружения включая глубину прокладки подземных коммуникаций наличие и глубину заложения соседних фундаментов. Основными конструктивными особенностями возводимого сооружения влияющими на глубину заложения его фундамента являются: наличие и размеры подвальных помещений приямков или фундаментов под оборудование; глубина заложения фундаментов примыкающих сооружений; наличие и глубина прокладки подземных коммуникаций. В зданиях с подвалом или полуподвалом а также...
29031. Определение размеров подошвы центрально нагруженных фундаментов мелкого заложения 63.5 KB
  Реактивное давление грунта по подошве жёсткого центрально нагруженного фундамента принимается равномерно распределённым интенсивностью: 1 где NoII расчётная вертикальная нагрузка на уровне обреза фундамента; GfII и GgII расчётные значения веса фундамента и грунта на его уступах см.1; А площадь подошвы фундамента. Площадь подошвы фундамента при его расчёте по второму предельному состоянию по деформациям определяется из условия: pII ≤ R 2 где R расчётное сопротивление грунта основания. Поскольку обе части неравенства 2...