Delphi - база знаний


DLL!


DLL!



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

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.


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

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 тут и не пахнет?

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

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





Начало  Назад  Вперед