Francisco,
Cita:
|
Empezado por Francisco
...Uso de Dynamic-Link Library (DLL)...me gustaría si alguien tiene algún tutorial de como utilizarlas correctamente y sacarles el maximo beneficio...
|
Revisa esta código:
Código Delphi
[-]
library MathDLL;
uses
Windows,
Messages,
SysUtils,
Variants,
Classes,
Graphics,
Controls,
Forms,
Dialogs,
StrUtils;
{$R *.res}
function SumNum(N1, N2 : Double) : Double; stdcall;
begin
Result := N1 + N2;
end;
function SubNum(N1, N2 : Double) : Double; stdcall;
begin
Result := N1 - N2;
end;
function MulNum(N1, N2 : Double) : Double; stdcall;
begin
Result := N1 * N2;
end;
function DivNum(N1, N2 : Double) : Double; stdcall;
begin
Result := N1 / N2;
end;
exports
SumNum,
SubNum,
MulNum,
DivNum;
begin
end.
Código Delphi
[-]
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
Edit3: TEdit;
Label3: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
public
end;
function SumNum(N1, N2 : Double) : Double; stdcall; external 'MathDLL.dll';
function SubNum(N1, N2 : Double) : Double; stdcall; external 'MathDLL.dll';
function MulNum(N1, N2 : Double) : Double; stdcall; external 'MathDLL.dll';
function DivNum(N1, N2 : Double) : Double; stdcall; external 'MathDLL.dll';
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
N1, N2 : Double;
begin
N1 := StrToFloatDef(Edit1.Text,0);
N2 := StrToFloatDef(Edit2.Text,0);
Edit3.Text := FloatToStr(SumNum(N1,N2));
end;
procedure TForm1.Button2Click(Sender: TObject);
var
N1, N2 : Double;
begin
N1 := StrToFloatDef(Edit1.Text,0);
N2 := StrToFloatDef(Edit2.Text,0);
Edit3.Text := FloatToStr(SubNum(N1,N2));
end;
procedure TForm1.Button3Click(Sender: TObject);
var
N1, N2 : Double;
begin
N1 := StrToFloatDef(Edit1.Text,0);
N2 := StrToFloatDef(Edit2.Text,0);
Edit3.Text := FloatToStr(MulNum(N1,N2));
end;
procedure TForm1.Button4Click(Sender: TObject);
var
N1, N2 : Double;
begin
N1 := StrToFloatDef(Edit1.Text,0);
N2 := StrToFloatDef(Edit2.Text,0);
Edit3.Text := FloatToStr(DivNum(N1,N2));
end;
end.
Código Delphi
[-]
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
Edit3: TEdit;
Label3: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
public
end;
TSumNum = function (N1, N2 : Double) : Double; stdcall;
TSubNum = function (N1, N2 : Double) : Double; stdcall;
TMulNum = function (N1, N2 : Double) : Double; stdcall;
TDivNum = function (N1, N2 : Double) : Double; stdcall;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
N1, N2 : Double;
hDLL : THandle;
SumNum : TSumNum;
begin
N1 := StrToFloatDef(Edit1.Text,0);
N2 := StrToFloatDef(Edit2.Text,0);
hDLL := LoadLibrary('MathDLL.dll');
if hDLL <> 0 then
begin
@SumNum := GetProcAddress(hDLL, 'SumNum');
if @SumNum <> nil then
begin
Edit3.Text := FloatToStr(SumNum(N1,N2));
FreeLibrary(hDLL);
end
else
MessageDlg('Error en Llamada de Función/Procedimiento',mtInformation,[mbOK],0);
end
else
MessageDlg('Error en LoadLibrary',mtInformation,[mbOK],0);
end;
procedure TForm1.Button2Click(Sender: TObject);
var
N1, N2 : Double;
hDLL : THandle;
SubNum : TSubNum;
begin
N1 := StrToFloatDef(Edit1.Text,0);
N2 := StrToFloatDef(Edit2.Text,0);
hDLL := LoadLibrary('MathDLL.dll');
if hDLL <> 0 then
begin
@SubNum := GetProcAddress(hDLL, 'SubNum');
if @SubNum <> nil then
begin
Edit3.Text := FloatToStr(SubNum(N1,N2));
FreeLibrary(hDLL);
end
else
MessageDlg('Error en Llamada de Función/Procedimiento',mtInformation,[mbOK],0);
end
else
MessageDlg('Error en LoadLibrary',mtInformation,[mbOK],0);
end;
procedure TForm1.Button3Click(Sender: TObject);
var
N1, N2 : Double;
hDLL : THandle;
MulNum : TMulNum;
begin
N1 := StrToFloatDef(Edit1.Text,0);
N2 := StrToFloatDef(Edit2.Text,0);
hDLL := LoadLibrary('MathDLL.dll');
if hDLL <> 0 then
begin
@MulNum := GetProcAddress(hDLL, 'MulNum');
if @MulNum <> nil then
begin
Edit3.Text := FloatToStr(MulNum(N1,N2));
FreeLibrary(hDLL);
end
else
MessageDlg('Error en Llamada de Función/Procedimiento',mtInformation,[mbOK],0);
end
else
MessageDlg('Error en LoadLibrary',mtInformation,[mbOK],0);
end;
procedure TForm1.Button4Click(Sender: TObject);
var
N1, N2 : Double;
hDLL : THandle;
DivNum : TDivNum;
begin
N1 := StrToFloatDef(Edit1.Text,0);
N2 := StrToFloatDef(Edit2.Text,0);
hDLL := LoadLibrary('MathDLL.dll');
if hDLL <> 0 then
begin
@DivNum := GetProcAddress(hDLL, 'DivNum');
if @DivNum <> nil then
begin
Edit3.Text := FloatToStr(DivNum(N1,N2));
FreeLibrary(hDLL);
end
else
MessageDlg('Error en Llamada de Función/Procedimiento',mtInformation,[mbOK],0);
end
else
MessageDlg('Error en LoadLibrary',mtInformation,[mbOK],0);
end;
end.
El código anterior en Delphi 7 sobre Windows 7 Professional x32,
Crea una DLL con funciones matemáticas básicas e implementa la misma en formas estática y dinámica, como se puede ver en la siguiente imagen:
El ejemplo esta disponible en el siguiente link :
Example DLL Static vs Dinamic.rar
Revisa esta información:
Espero sea útil
Nelson.