Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Uso de Dynamic-Link Library (DLL) (https://www.clubdelphi.com/foros/showthread.php?t=88170)

deliriun 22-04-2015 04:14:38

Uso de Dynamic-Link Library (DLL)
 
Hola que tal a todos espero esten realmente bien. Me presento mi nombre es Francisco.

Conversando con un amigo en Facebook me explico que el utilizaba bastante Dll para conseguir modificar su programa
algo que yo no entiendo y es que me dice que con una Dll puede modificar su programa. Lo que no entendí es como hacer eso.

Sé un poco de programación pero no tengo mucha práctica con librerias Dll y me gustaría si alguien tiene algún tutorial de como utilizarlas correctamente y sacarles el maximo beneficio.

Muy bien el me dijo que hacia esto: declarar nombre de función (Para luego hacer su busqueda), Obtener Handled de la libreria de donde fue sacda, luego el address y por ultimo la llamada.

Si alguien comprende mejor esto que yo que casi no entendí nada me podría decir a que se refería, pues yo me perdí cuando dijo eso y si me podría dar ejemplos un poco sencillos para poder entenderlos .
De ante mano gracias

ElKurgan 22-04-2015 08:21:22

¿Pero quieres aprender a manejar Dlls con Delphi? ¿Crearlas? ¿Usar otros lenguajes?

Si es con Delphi, te recomiendo que leas la cara oculta de Delphi, del maestro Marteens.

En el capítulo 36 trata precisamente de eso, de las librerías de enlace dinámico.

Saludos

Neftali [Germán.Estévez] 22-04-2015 10:21:04

Aquí en este hilo tienes un ejemplo de carga de librería de forma dinámica, que más op menos sigue los pasos que describes...

Te añado unos comentarios...
Busca ayuda y ejemplos de la función LoadLibrary, que creo que es a lo que se refiere tu amigo.

Aquí también tienes una explicación bastante amplia de las diferentes formas de cargar DLL's y packages.

Aquí tienes otro ejemplo completo, con los comentarios en inglés, pero fácilmente entendible...

Cargar la DLL con LoadLibrary, obtener la dirección de la función con GetProcAddress, ejecutar la función a partir del nombre (en este caso ShowCalendar) y por último liberar la DLL con FreeLibrary.

nlsgarcia 22-04-2015 21:36:13

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...

:rolleyes:

Revisa esta código:
Código Delphi [-]
library MathDLL;

uses
  Windows,
  Messages,
  SysUtils,
  Variants,
  Classes,
  Graphics,
  Controls,
  Forms,
  Dialogs,
  StrUtils;

{$R *.res}

// Suma dos números reales
function SumNum(N1, N2 : Double) : Double; stdcall;
begin
   Result := N1 + N2;
end;

// Resta dos números reales
function SubNum(N1, N2 : Double) : Double; stdcall;
begin
   Result := N1 - N2;
end;

// Multiplica dos números reales
function MulNum(N1, N2 : Double) : Double; stdcall;
begin
   Result := N1 * N2;
end;

// Divide dos números reales
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
    { Private declarations }
  public
    { Public declarations }
  end;

  // Funciones de DLL implementadas de forma estática
  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
    { Private declarations }
  public
    { Public declarations }
  end;

  // Funciones de DLL implementadas de forma dinámica
  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.

Al González 22-04-2015 23:10:54

Ligeramente fuera de tema, pero vale la pena decirlo.
Cita:

Empezado por ElKurgan (Mensaje 491602)
En el capítulo 36 trata precisamente de eso, de las librerías de enlace dinámico.

Este es el índice del capítulo 36: https://pbs.twimg.com/media/CDOPgQHVEAA0_ZK.png

Es de destacarse cómo Ian, desde temprano, comenzó a tomar consciencia de que library no es librería (así como exit no es éxito). Y al llegar a La cara oculta de Delphi 6, esta edición de su magnífico libro quedó con uno solo y muy correcto uso de la palabra librería:
Cita:

Prólogo del Autor
Acabo de regresar de la librería. Quería comprar algo sobre sistemas operativos, pero he terminado gastándome el dinero en varios libros de “divulgación científica”: uno sobre dinosaurios, otro sobre cosmología, un tercero sobre algo que parece psicología...
Todavía hay cierta resistencia, pero se va ganando la batalla. Da gusto ver que esta campaña de años por hacer ver el falso amigo ha venido dando sus frutos, y cada vez son menos los autores que siguen cometiendo este error lingüístico. En esa resistencia, la cerrazón ha llegado incluso a presentarse con un rostro formal bajo ciertos artículos de la Red, pero la razón tiende a triunfar sobre ese tipo de trampas.

Vamos, que todavía hay agua tibia para los que faltan de remojar barbas. ;)

Con mucho respeto y cordialidad. :)

Al González.

deliriun 23-04-2015 01:22:26

Agradecimiento
 
Muchas gracias a todos los interesados voy a revisar cada una de las respuestas con mucho agrado.
Además agradesco a toda la comunidad por estar ayudandome con las dudas que tengo acerca de Delphi gracias.

nlsgarcia 23-04-2015 04:21:15

Francisco,

Cita:

Empezado por deliriun
...Sé un poco de programación...agradezco a toda la comunidad por estar ayudándome con las dudas que tengo acerca de Delphi...

:rolleyes:

Revisa esta información:
Espero sea útil :)

Nelson.


La franja horaria es GMT +2. Ahora son las 06:15:38.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi