DLL!

Previous  Top  Next

    
 

 

Ура. До нас и за нас все уже стандатизировали. Давайте этим воспользуемся и напишим теперь наш модуль в постандарту. Напишим dll.

Code:

library CalcDll;

 

uses SysUtils, Classes;

 

type

MyCalc=class

fx,fy:integer;

public

procedure SetOperands(x,y:integer);

function Sum:integer;

function Diff:integer;

end;

 

var Calc:MyCalc;

 

procedure MyCalc.SetOperands(x,y:integer);

begin

fx:=x; fy:=y;

end;

 

function MyCalc.Sum:integer;

begin

result:=fx+fy;

end;

 

function MyCalc.Diff:integer;

begin

result:=fx-fy;

end;

 

procedure SetOperands(x,y:integer);

begin

Calc.SetOperands(x,y);

end;

 

function Sum:integer;

begin

result:=Calc.Sum;

end;

 

function Diff:integer;

begin

result:=Calc.Diff;

end;

 

procedure CreateObject;

begin

Calc:=MyCalc.Create;

end;

 

procedure ReleaseObject;

begin

Calc.Free;

end;

 

exports //Вот эта секция и указывает компилятору что записать в таблицу экспорта

SetOperands,

Sum,

Diff,

CreateObject,

ReleaseObject;

begin

end.

 

 

 

 

Напишим программку - протестировать наш модуль.

Code:

unit tstcl;

 

interface

 

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

 

type

TForm1 = class(TForm)

Button1: TButton;

Button2: TButton;

procedure FormCreate(Sender: TObject);

procedure FormDestroy(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

end;

 

var Form1: TForm1;

_Mod:Integer; //индефикатор модуля

SetOpers:procedure(x,y:integer); //Это все указатели на функции,

diff,sum:function:integer; //которые мы собираемся получить

CreateObj,ReleaseObj:procedure; //из нашего модуля

 

implementation

{$R *.DFM}

 

procedure TForm1.FormCreate(Sender: TObject);

begin

//загружаем наш модуль в память

_Mod:=LoadLibrary('CalcDll.dll');

 

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

CreateObj:=GetProcAddress(_Mod,'CreateObject');

ReleaseObj:=GetProcAddress(_Mod,'ReleaseObject');

sum:=GetProcAddress(_Mod,'Sum');

diff:=GetProcAddress(_Mod,'Diff');

SetOpers:=GetProcAddress(_Mod,'SetOperands');

 

CreateObj; //вызываем функцию по адресу

SetOpers(13,10); //вызываем функцию по адресу

end;

 

procedure TForm1.FormDestroy(Sender: TObject);

begin

ReleaseObj; //опять вызываем функцию по адресу

FreeLibrary(_Mod); //выгружаем модуль из памяти

end;

 

procedure TForm1.Button1Click(Sender: TObject);

begin

ShowMessage(IntToStr(diff)); //вычисляем разницу

end;

 

procedure TForm1.Button2Click(Sender: TObject);

begin

ShowMessage(IntToStr(sum)); //вычисляем сумму

end;

 

end.

 

 

 

Классно! Теперь каждый программирующий в системе Windows на любом языке может использовать наш калькулятор! Что? Разочарованны? Такое ощущение что COM тут и не пахнет?

 

Правильно, ибо про СОМ я пока ничего и не сказал, но

 

Продолжение следует!