Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

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

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

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