DLL!
01.01.2007
Ура. До нас и за нас все уже стандатизировали. Давайте этим воспользуемся и напишим теперь наш модуль в постандарту. Напишим 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 тут и не пахнет?
Правильно, ибо про СОМ я пока ничего и не сказал, но
Продолжение следует!