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

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

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