Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 22-04-2015
deliriun deliriun is offline
Miembro
 
Registrado: ago 2014
Posts: 51
Poder: 10
deliriun Va por buen camino
Question 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
Responder Con Cita
  #2  
Antiguo 22-04-2015
Avatar de ElKurgan
[ElKurgan] ElKurgan is offline
Miembro Premium
 
Registrado: nov 2005
Posts: 1.235
Poder: 20
ElKurgan Va camino a la fama
¿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
Responder Con Cita
  #3  
Antiguo 22-04-2015
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.293
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
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.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #4  
Antiguo 22-04-2015
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
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}

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

Última edición por nlsgarcia fecha: 22-04-2015 a las 22:21:28.
Responder Con Cita
  #5  
Antiguo 22-04-2015
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Ligeramente fuera de tema, pero vale la pena decirlo.
Cita:
Empezado por ElKurgan Ver Mensaje
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.
Responder Con Cita
  #6  
Antiguo 23-04-2015
deliriun deliriun is offline
Miembro
 
Registrado: ago 2014
Posts: 51
Poder: 10
deliriun Va por buen camino
Smile 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.
Responder Con Cita
  #7  
Antiguo 23-04-2015
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
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...


Revisa esta información:
Espero sea útil

Nelson.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
label link link???? darkcuevas Varios 6 13-04-2011 21:17:37
Dynamic Sql Error -901 trex2000 Conexión con bases de datos 2 16-09-2008 09:37:04
Dynamic sql error -303 amkalzada Conexión con bases de datos 2 27-06-2008 11:12:33
Dynamic Sql error -303 amkalzada Firebird e Interbase 1 16-06-2008 15:37:51
dynamic Sql Error digital Firebird e Interbase 1 03-03-2004 09:48:26


La franja horaria es GMT +2. Ahora son las 05:25:22.


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