FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
||||
|
||||
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:
* 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:
Para acceder a las funciones de la DLL se usa GetProcAddress:
Tiene que estar predefinido el tipo de la función en el programa donde se llama:
* 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:
Podemos acceder a las funciones de la misma forma que lo hacemos con las DLL's, utilizando GetProcaddress:
Podemos utilizar RTTI para acceder a classes que previamente se han registrado (con RegisterClass) utilizando funciones de RTTI como GetClass:
Y podemos acceder a métodos de las clases utilizando también RTTI, utilizando MethodAddress:
* 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:
Y para acceder a las funciones usamos GetProcAddress (como en las DLL's):
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. |
#2
|
||||
|
||||
Una pregunta:
Cuando activas la opción "Buld with runtime packages", ¿qué papel juegan los paquetes listados en el cuadro de edición adjunto? // Saludos |
#3
|
||||
|
||||
Con ese Edit estás obligando (o indicando) a que ese package realmente sea un package en Runtime; No se van añadir al programa principal.
Imagina la siguiente situación; En un mismo directorio tienes los ficheros del package (Restas.BPL) y del Ejecutable (EXE). Borras todos los ficheros compilados (DCU, DCP, EXE, BPL) del directorio. Eliminamos el package RESTAS.BPL, de la lista de "Runtime Packages" con lo que estamos diciendo que "no es un package de Runtime" o no le estamos diciendo expresamente que lo sea: Si ahora compilamos nuestro ejecutable, como en ningun sitio le hemos indicado que ese RESTAS.BPL es un "Runtime Package", lo que delphi hace (ya que encuentra los fuentes) es añadirlas al ejecutable. Para comprobarlo vemos que en disco sólo se genera el fichero del ejecutable y si lo revisamos con alguna herramienta para ver recursos, se puede ver que el formulario que estaba definido dentro del package (UMain.pas con la clase TFormMain) se ha añadido al ejecutable: Se ha añadido al EXE porque en nungun sitio se le ha especificado que los elementos pertenecientes a ese package deben ser tratados como tales. Volvemos a borrar TODOS los ficheros compilados y probamos la segunda opción; Añadir a la lista de "packagesa en runtime" nuestro package "RESTAS.BPL". Al intentar compilar ahora el ejecutable, vemos que ahora no añade esos elementos al EXE, sino que COMPILA primero el package RESTA.BPL (sin haberselo dicho explícitamente -lo saca de esa lista-) y posteriormente compila el EXE. Si miramos ahora el EXE vemos que no incluye los formularios que están en el package: Determina qué packages en runtime va a utilizar tu aplicación, por lo tanto obligas a que esos packages estén generados y disponibles (DCP) en el momento de compilar tu EXE. En ese momento comprueba que en esos packages esta lo que tú necesitas (Units añadidas al uses) y compila tu EXE. Lo que no está en esos packages, al encontrarlo se incluye en tu EXE.
__________________
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. |
#4
|
||||
|
||||
Cita:
Lo curioso es que si quitas todos los paquetes de la lista, la opción "Build with runtime packages" se desmarca sola. No he probado si agregamos un paquete personal y quitamos la vcl si realmente sucede lo que digo. // Saludos |
#5
|
||||
|
||||
Pues yo estaba casi nulo en éstos asuntos de "carga dinámica y estática de packages y dll", pero ahora con la super explicacion de Neftali pues ya le voy entendiendo a la cosa..
Muchas gracias Neftali por dar tanto de tu conocimiento.. Saludos...
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7
|
#6
|
||||
|
||||
Yo sólo conocía la parte de los bpl porque hace años nos encontramos que nuestro .exe era tan grande que los win98 y winMe no los podía ejecutar, así que lo compilamos con las bpl aparte y con el tamaño resultante del .exe ya sí que pudimos ejecutarlo en esos sistemas.
Sin embargo con winNT y 2000 sí que funcionaban con "todo dentro".
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
#7
|
||||
|
||||
Cita:
Si dejas un sólo paquete lo mantiene, es al dejarlo vacío que lo desactiva.
__________________
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. |
#8
|
||||
|
||||
Lo prometido es deuda, así que he completado la entrada en mi blog, y allí mismo podéis encontrar el código de los ejemplos que os adjunto a este mensaje.
__________________
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. |
#9
|
||||
|
||||
Cita:
Solo aclarar, que se compilaría pimero el BPL, solo si este tiene seleccionada la opción de "reconstruir cuando sea necesario" ("Rebuild as needed"). Si se tiene la opción de "reconstrucción explícita" ("Explicit rebuild") el BPL no tendría porque compilarse cada vez que se compile el proyecto donde se le requiera. Saludos.
__________________
|
#10
|
||||
|
||||
Cita:
En mi caso estaba dando por supuesto que el package no existía, de ahí que asumía siempre se generara.
__________________
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. |
#11
|
||||
|
||||
Neftalí:
Muy esclarecedor el post. Gracias por compartirlo. Saludos.
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
#12
|
||||
|
||||
Hola
Muy interesante tema. Hacia falta algo asi, ademas muy bien explicado. Gracias por el aporte. Saludos
__________________
Siempre Novato |
#13
|
|||
|
|||
Gran explicación sobre Bpls, Dlls, y exes!!!
Siempre va bien poderlo leer todo del tirón para entender bien como funciona!! GRACIAS |
|
|
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 |
|