Discussion:
¿Cómo usar DLLs y DLLs dinámicas?
(demasiado antiguo para responder)
J.A. Gutierrez
2004-04-01 07:33:26 UTC
Permalink
Hardwie <***@lycos.es> wrote:

: Necesito usar una DLL en un programa escrito en C, me han dicho que es
: posible que para mi problema necesite cargar la DLL de forma dinámica.

Una DLL, por definicion es dinamica, no puede ser estatica.

: Quería saber cual es la diferencia, es decir, cuando hay que cargarlas de
: forma estática y cuando de forma dinámica. Y cómo se hacen ambas cosas.

Todo lo mas puedes diferenciar entre dejar que el enlazador
en tiempo de ejecucion del sistema la cargue al ejecutar
el programa (lo que se hace al generar el ejecutable, en la
fase de enlazado) o bien que tu programa incluya codigo para
cargar explicitamente la DLL. La forma de hacer esto ultimo
depende del sistema:

POSIX:
dlopen/dlsym/dlclose

Darwin:
NSCreateObjectFileImageFromFile/NSLinkModule/
NSLookupSymbolInModule/NSAddressOfSymbol/
NSDestroyObjectFileImage/NSUnLinkModule

Windows:
LoadLibrary/GetProcAddress/FreeLibrary
--
finger ***@shiva.cps.unizar.es for PGP /
.mailcap tip of the day: / La vida es una carcel
application/ms-tnef; cat '%s' > /dev/null / con las puertas abiertas
text/x-vcard; cat '%s' > /dev/null / (A. Calamaro)
Hardwie
2004-04-01 10:44:27 UTC
Permalink
Estaticamente implica un #include "libreria.h", simplemente se escribe en
el
ejecutable que tu programa va a necesitar tal dll, y dentro de tal dll,
estas funciones.
Osea, que me bastaría con tener el "libreria.h" y el "libreria.dll" en el
mismo directorio, y hacer #include "libreria.h", ¿no?
Entonces, ¿para qué vale el "libreria.lib"? ¿cual es la diferencia con el
"libreria.dll"?
Yo lo que me he bajado es "LTC2x.dll", "LTC2X.H" y "LTC2x.lib"
De manera dinamica, tu usas la funcion loadlibrary para cargar la dll, y
getprocaddress para obtener la direccion de la funcion, con lo cual puedes
cargar "dinamicamente" cualquier dll y funcion.
¿Conoces alguna página dónde expliquen el uso de estas funciones? Me vendría
muy bien.
Esa es la gran diferencia, asi a grandes rasgos.
Gracias
RETECAL nos tima - MechaKaiser
2004-04-01 21:15:01 UTC
Permalink
Post by Hardwie
Osea, que me bastaría con tener el "libreria.h" y el "libreria.dll" en
el mismo directorio, y hacer #include "libreria.h", ¿no?
Entonces, ¿para qué vale el "libreria.lib"? ¿cual es la diferencia con
el "libreria.dll"?
Yo lo que me he bajado es "LTC2x.dll", "LTC2X.H" y "LTC2x.lib"
Muy sencillo, libreria.h probablemente contenga las declaraciones de las
funciones de la DLL, mientras que libreria.lib tiene el código de carga y
llamada a libreria.dll. La otra posibilidad es la que te han comentado,la
de usar funciones para pedir punteros a las funciones de la libreria.dll.

En ambos casos la librería se carga dinámicamente, la diferencia consiste
en que enlazando con libreria.lib simulas que se carga estáticamente, y la
puedes usar sin saber que en realidad se carga dinámicamente.
ViKT0RY
2004-04-03 02:08:52 UTC
Permalink
Post by RETECAL nos tima - MechaKaiser
Post by Hardwie
Osea, que me bastaría con tener el "libreria.h" y el "libreria.dll" en
el mismo directorio, y hacer #include "libreria.h", ¿no?
Entonces, ¿para qué vale el "libreria.lib"? ¿cual es la diferencia con
el "libreria.dll"?
Yo lo que me he bajado es "LTC2x.dll", "LTC2X.H" y "LTC2x.lib"
Muy sencillo, libreria.h probablemente contenga las declaraciones de las
funciones de la DLL, mientras que libreria.lib tiene el código de carga y
llamada a libreria.dll. La otra posibilidad es la que te han comentado,la
de usar funciones para pedir punteros a las funciones de la libreria.dll.
En ambos casos la librería se carga dinámicamente, la diferencia consiste
en que enlazando con libreria.lib simulas que se carga estáticamente, y la
puedes usar sin saber que en realidad se carga dinámicamente.
Bueno, la diferencia real entre dll y lib es el tema de que sea estática o
no, es decir, la dll queda como archivo aparte en el sistema, mientras que
el .lib te incluye en el ejecutable el codigo, para que posteriormente tu
exe sea independiente de las dlls del sistema.
Hay otro punto de vista en cuanto a lo estático y dinamico y es la forma de
llamar a las funciones de una dll, que era a lo que me refería
anteriormente.

Un saludo :)
Miguel
2004-04-03 16:03:18 UTC
Permalink
Post by ViKT0RY
Bueno, la diferencia real entre dll y lib es el tema de que sea estática o
no, es decir, la dll queda como archivo aparte en el sistema, mientras que
el .lib te incluye en el ejecutable el codigo, para que posteriormente tu
exe sea independiente de las dlls del sistema.
Hay otro punto de vista en cuanto a lo estático y dinamico y es la forma de
llamar a las funciones de una dll, que era a lo que me refería
anteriormente.
Para tu comodidad, incluyes una cabecera con prototipos en lugar de
escribir por tu cuenta cada uno de ellos. Para tu comodidad, le indicas
al linker que use un lib (una "import library") en lugar de escribir por
tu cuenta una cláusula IMPORTS en un archivo de definición.

El linker necesita crear un recurso llamado import table y lo hace a
partir del listado compilado en el lib. Cuando llamas a una función de
la dll, no haces más que un call a la dirección virtual almacenada en un
vector de esa tabla y que es inicializada por el loader.

Si no agregas el símbolo a la import table y no reservas espacio para el
vector, entonces necesitas llamar a LoadLibrary[Ex](), ó a
GetModuleHandle() si la biblioteca ya está mapeada, y recuperar la
dirección del call con GetProcAddress().

Ok, windows y dlls.

Saludos.
--
Miguel.
Loading...