Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Convertir aplicación en dll (https://www.clubdelphi.com/foros/showthread.php?t=89452)

jars 23-11-2015 15:30:48

Convertir aplicación en dll
 
Hola amigos.
Estoy tratando de convertir una aplicación en dll pero no logro hacer que funcione desde una aplicación que la carga en forma dnámica. Esta aplicación cuenta con varios forms, accesos a BBDD y archivos planos. No tengo idéa de como hacerla funcionar.
Necesito que sea dll para luego poder incorporarla como plugin.
Uso Delphi 7.
Gracias por cualquier ayuda.

Neftali [Germán.Estévez] 23-11-2015 16:12:03

Cita:

Empezado por jars (Mensaje 499724)
...pero no logro hacer que funcione desde una aplicación que la carga en forma dnámica.

El problema es que, eso es muy poca información para saber qué puede estar pasando.
¿Algún error? ¿Qué tipo de error?
¿Cómo estás intentando cargar tu aplicación (DLL)?
¿Has ejecutado paso a paso?
¿En qué momento falla o hace lo que no debe?
...

jars 23-11-2015 16:24:49

Hola Neftali.
La dll lacargo asi:
Código Delphi [-]
H := LoadLibrary('D:\Dev\Delphi\Special_Projects\TmApp.DLL');
Pero luego de eso no se que debo hacer.
Quisiera que el form principal de la dll se ubique en el panel de la aplicación que la invoca.
Me falta algun ejemplo de como hacerlo.

Ñuño Martínez 23-11-2015 16:58:11

Depende de la aplicación que la invoca. Supongo que habrá algún manual que diga cómo deben ser las DLL que usa.

jars 23-11-2015 16:59:54

No, la aplicación la estoy empezando a desarrollar yo.

jars 23-11-2015 17:06:11

Pregunto, tengo que exportar el FormCreate de la dll???

Ñuño Martínez 23-11-2015 18:13:21

Tienes que definir el API tú mismo: Qué funciones y procedimientos publicar, qué pretende hacer con cada uno, etc.

Como te veo muy perdido, deberías empezar leyendo la documentación acerca de cómo crear una DLL y utilizarla.

Neftali [Germán.Estévez] 23-11-2015 18:17:08

Si no lo has hecho ya, échale un vistazo a esta entrada en mi blog.

Ahí se explican varias opciones, entre ellas, la que tú estás intentando aplicar a tu aplicación. en tu caso, la que está etiquetada como:
"EXE + DLL con Carga dinámica(El EXE puede ser con o sin BWRP)"

Al final tienes los ejemplos con código fuente para que puedas probar.

el que se aplica en tu caso, sería algo así:

Código Delphi [-]
  // Cargar la DLL
  H := LoadLibrary('SUMAS.DLL');
  // Cargada correctamente?
  if (H >= 32) then begin
    MessageDlg('Cargada la DLL...', mtInformation, [mbOK], 0);
    sum := nil;
    @sum := GetProcAddress(H, 'Sumar2');
    // Asignada?
    if Assigned(sum) then begin
      MessageDlg('Acceso a la función SUMAR', mtInformation, [mbOK], 0);
      // llamada
      res := Sum(4,5);
      MessageDlg(Format('Resultado:  %d+%d=%d',[4,5,res]), mtInformation, [mbOK], 0);
      FreeLibrary(H);
    end;
    else begin
      MessageDlg('Error, no se ha encontrado el método SUMAS2', mtError, [mbOk], 0) 
    end;
  end
  else
    MessageDlg('Error, no se ha encontrado SUMAR.DLL', mtError, [mbOk], 0)
 end.

Las definiciones serían estas:

Código Delphi [-]
var
  H: Thandle;
  res:integer;
  Sum: function(x,y:Integer):integer; stdcall;

En este caso la DLL SUMAS.DLL sería la que tú estás programando y el método Sumar2, el equivalente al que deberías programar tú para que se muestre el formulario que quieres.

Neftali [Germán.Estévez] 23-11-2015 18:20:11

Al final de esa entrada, tienes algunos links a otras, sobre cómo trabajar con plugins.

jars 23-11-2015 19:39:37

Neftali, ya había leído tu artículo y he trabajado con dll´s que exportaban algunas funciones.
Lo distinto aca es que es una aplicación que ya está funcionando como .exe y necesito poder ejecutarla desde una app.
Esta app tiene el formcreate y formshow donde hago inicializaciones y lectura de un par de ini´s. No se si tengo que exportar el formcreate y formshow ó que hacer para que la misma arranque dentro de la nueva app que la instancia.

escafandra 24-11-2015 01:39:51

Para hacer eso, la dll no debe tener el formato de una aplicación, sino un formulario. Puedes tener los formularios que quieras. Te pongo un ejemplo:

La dll:
Código Delphi [-]
library Formdll;

uses
  SysUtils, Windows,
  Classes,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

// Creas tu formulario principal y lo destruyes al salir...
procedure Init;
var
   Form1: TForm1;
begin
   Form1:= TForm1.Create(nil);
   Form1.ShowModal();
   Form1.free;
end;

begin
 Init;
end.

En la aplicación que ejecuta la dll:
Código Delphi [-]
procedure TForm2.Button1Click(Sender: TObject);
var
  Dll: String;
begin
  // Suponiendo que la dll esta en la ruta de este ejecutable...
  Dll:= ExtractFilePath(ParamStr(0)) + 'Formdll.dll';
  LoadLibrary(PCHAR(Dll));
end;

Saludos.

jars 24-11-2015 13:25:22

Gracias Escafandra.
Ahora todos los formularios comparten un DataModule con distintos objetos de BBDD, de que mopdo se pueden compartir.
Lo mismo sucede con variables publicas que se encuentran en el formulario principal.
Gracias

jars 24-11-2015 14:20:25

Gracias a sus aportes voy progresando.
Ya entendi el mecanismo y pude acceder a los distintos forms.
La cosa ahora es como puedo hacer para que desde la app host, le indique a cada form de la dll que se muestre dentro de un TPanel que funciona como contenedor, para que se muestren dentro de el (owner).
Espero me hallan entendido.
Gracias

Neftali [Germán.Estévez] 24-11-2015 15:31:40

Dirá que eso se puede hacer de forma similar a como se hace con los forms "normales" (sin que estén en una DLL), utilizando el Parent del form que estás abriendo.

Revisa estos hilos:
Form dentro de otro
Se puede colocar un form dentro de un TPanel
Form contenedor dentro de otro


La franja horaria es GMT +2. Ahora son las 22:20:40.

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