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 тут и не пахнет?
Правильно, ибо про СОМ я пока ничего и не сказал, но
Продолжение следует!