Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

 
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 16-07-2010
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.233
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
Post INFO: DLL's, BPL's, carga dinámica, carga estática y Packages en Runtime

Es un tema que ya ha salido otras veces, y son muchas "palabrejas"; Al principio (a mi me pasó también) uno se lía un poco, así que ya que he escrito la explicación para un hilo concreto de estos foros, creo que es mejor publicarla aquí por si a alguien más le puede interesar.


DLL's, BPL's, carga dinámica, carga estática y Packages en Runtime

Sí ya se que el título es un poco largo... ;-)
Para aclarar un poco las cosas intentare explicar todos los casos que a mí se me ocurren, cómo configurarlos y lo que se puede hacer con ellos, de forma rápida; Aclararemos antes la opción "Build With Runtime Package" imprescindible para TODO esto:

·······························································································
BWRP = "Build with runtime packages"
Esta opción se encuentra en las "opciones de proyecto" y con ella conseguimos:

* ACTIVADA: El programa no incluye las librerías (normalmente la VCL y componentes de terceros) en el EXE; El ejecutable es más pequeño, pero necesita de los packages (BPLs) de la VCL; Al distribuir la aplicación se deben copiar también esos ficheros (los necesarios).
* DESACTIVADA: El programa incluye en el EXE los packages de librerías y componentes de terceros. En 1 sólo fichero va todo incluído. El EXE tiene mayor tamaño (lógico porque todo va incluído).
·······························································································


* EXE + DLL carga estática(El EXE puede ser con o sin BWRP)

La DLL debe existir cuando se ejecuta la aplicación, de otra forma esta no funcionaría.
Hay que definir dónde se encuentra la DLL (en el que la carga) y con eso ya se puede hacer la llamada:

Código Delphi [-]
function Sumar(x,y:integer):Integer; stdcall; external 'sumas.dll';

Código Delphi [-]
Res := Sumar(4,5);

* EXE + DLL carga dinámica(El EXE puede ser con o sin BWRP)

En este caso el programa puede funcionar aunque la DLL no exista; En el momento de intentar cargarla se debe comprobar si está o no. Se utiliza para programas que cargan plugins o similares. La carga es un poco más compleja.
Se utiliza LoadLibrary para cargar la DLL en el momento en que se necesita:

Código Delphi [-]
  H := LoadLibrary('SUMAS.DLL');

Para acceder a las funciones de la DLL se usa GetProcAddress:
Código Delphi [-]
  @sum := GetProcAddress(H, 'Sumar2');

Tiene que estar predefinido el tipo de la función en el programa donde se llama:

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


* EXE + BPL carga estática(El EXE puede ser con o sin BWRP)
En este caso no hace falta definir nada referente a la función que se encuentra en el package, simplemente hacer referencia a ella en diseño.
Si el programa se compila con "BRWP Desactivado" TODO va dentro del EXE. Si se compila con "BWRP activado" la BPL va aparte, pero es obligatorio que exista, ya que la carga se ha hecho de forma estática (en diseño hemos añadido un USES); Si la BPL no existe el programa no puede funcionar.
Para trabajar así basta con añadir al USES las units del packages que necesitemos.

* EXE + BPL carga dinámica + RTTI(El EXE debe ser con BWRP)
Es el caso más potente que tenemos. Cargar BPL's (que son más potentes que las DLL's) de forma dinámica. Para ello hacemos uso de RTTI (Runtime Type Information) que es lo que le da la potencia extra a los BPL's. En obligatorio en este caso que "BWRP esté activado"; Es decir, obligatoriamente debemos distribuir nuestra aplicación con packages.
Los packages se cargan de forma dinámica con LoadPackage:
Código Delphi [-]
  H := LoadPackage('RESTAS.BPL');

Podemos acceder a las funciones de la misma forma que lo hacemos con las DLL's, utilizando GetProcaddress:

Código Delphi [-]
  @resta := GetProcAddress(H, 'Resta');

Podemos utilizar RTTI para acceder a classes que previamente se han registrado (con RegisterClass) utilizando funciones de RTTI como GetClass:

Código Delphi [-]
    AClass := GetClass('TFormMain');

Y podemos acceder a métodos de las clases utilizando también RTTI, utilizando MethodAddress:

Código Delphi [-]
      // Acceder al método
      Routine.Data := Pointer((F as FormClass));
      // Ejecutar al código
      Routine.Code := (F as FormClass).MethodAddress('ExecForm');

* EXE + BPL carga dinámica sin RTTI(El EXE puede ser sin BWRP)
Hay una última opción (un poco rara), que sería uriliar un EXE con "BRWP Desactivado" (es decir TODO en un único EXE) y cargar en él package de forma dinámica. Esto es posible, pero en este caso perdemos la opción de utilizar RTTI; El EXE (fichero único) podría funcionar sin que exista la BPL que vamos a cargar. Esta opción, aunque es viable, como digo, no tiene mucho sentido, porque utiliza las BPL como si se trataran de DLL; Al no poder utilizar RTTI, las "mejoras" que tienen las BPL's se pierden y pasan a usarse como DLL's.

Se pueden cargar las BPL's de forma dinámica con LoadPackage:
Código Delphi [-]
  H := LoadPackage('RESTAS.BPL');

Y para acceder a las funciones usamos GetProcAddress (como en las DLL's):

Código Delphi [-]
  @resta := GetProcAddress(H, 'Resta');

Por supuesto si intentamos acceder a información de clases (GetClass) el programa falla.

Espero que este "breve" explicación haya servido para aclarar alguna cosa. Si tengo un hueco itentaré colgar los ejempos correspondientes a cada caso.

Un salduo.
__________________
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.

Última edición por Neftali [Germán.Estévez] fecha: 19-07-2010 a las 12:24:16.
Responder Con Cita
 


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Carga dinamica de una dll y Access violation zurech OOP 3 21-02-2011 13:33:14
carga dinamica de un dllform pabloloustau Varios 6 11-03-2010 10:47:52
Duda con Build with runtime packages dtomeysoto Varios 5 18-12-2009 22:05:41
carga dinámica de una libreria en linux Robert01 Lazarus, FreePascal, Kylix, etc. 2 06-10-2007 20:43:15
Carga el applet maribajar JAVA 2 22-06-2007 12:15:15


La franja horaria es GMT +2. Ahora son las 13:40:51.


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