[C con Clase] Ayuda para enlazar DLL

Steven Davidson srd4121 en njit.edu
Sab Ene 9 03:56:17 CET 2010


Hola Camilo José,

2010/1/9 Camilo José <cjdelreal2009 en gmail.com>

> Hola a todos,
>         es mi primera vez que interactúo en las listas de correo a pesar
> que llevo tiempo estudiando por los manuales de Con Clase.


Encantado de que participes de una forma más activa.


> Mi situación es la siguiente, me gusta programar programando la API
> completamente(disculpen la repetición), o sea sin usar programas de edición
> de las ventanas(como C++ Builder, o Delphi) y deseaba hacer una aplicación
> que tuviese una barra de herramientas o toolbar a la cual le agrego las
> imágenes para los botones desde listas de imágenes(ImageList), pero entre
> los ejemplos que se pueden encontrar en el sitio de Con Clase existe un
> juego de Criptografía que almacena imágenes en una DLL, basada en un archivo
> de cabacera y uno de recursos, entonces he querido almacenar las imágenes
> que deseo para los botones, en si lo que empleo son íconos pero básicamente
> considero que son lo mismo, yo hice un proyecto de DLL en el que incluyo un
> archivo de recurso desde el que busco los íconos y un archivo de cabecera
> con identificadores para cada imagen(#define ICONO1 200 por ejemplo), lo
> compilo y me crea una DLL cuyo tamaño(kb, mb, etc) es más o menos
> equivalente con el peso de todos los íconos(al menos es superior), a pesar
> de que en el programa de ejemplo que planteo las DLL si se incluyen, no he
> logrado hacerlo yo, en parte también se debe a que yo no trabajo en Builder
> como creo que está hecho el programa que tomé,
> mis preguntas son:
> 1. ¿Cómo puedo enlazar DLL con mis aplicaciones?


Hay dos formas: explícita o implícitamente. Cuando creas una DLL, el
programa te genera un fichero ".dll" y suele generar también un fichero ".a"
o ".lib", según el programa. Esta "biblioteca de importación" no es una
biblioteca estática normal y corriente. Básicamente, esta biblioteca
contiene referencias a la DLL. La ventaja es que en un proyecto, puedes
agregar esta biblioteca de importación como si fuese la biblioteca de
verdad. Implícitamente, el enlazador te enlazará (valga la redundancia) la
DLL con tu ejecutable, sin que tengas que modificar nada.

Puedes enlazar una DLL explícitamente usando las funciones del API de
MS-Windows. Invoca 'LoadLibrary()' para cargar la biblioteca dinámicamente
enlazada (DLL). Luego, invoca 'GetProcAddress()' para obtener cada función
exportable. Esta función retorna un puntero a una función, por lo que
sugiero definir un tipo para ello. Por ejemplo,

// En la DLL
double sumar( double x, double y );
double restar( double x, double y );
...

// En el programa
typedef double (*PFSUMAR)( double, double );
 typedef double (*PFRESTAR)( double, double );
...
HMODULE hDLL = LoadLibrary( "mi.dll" );
PFSUMAR sumar = (PFSUMAR) GetProcAddress( hDLL, "sumar" );
 PFRESTAR restar = (PFRESTAR) GetProcAddress( hDLL, "restar" );
...
cout << sumar(3.2, 5.6) << endl;
cout << restar(3.2, 5.6) << endl;

La ventaja es que podemos controlar cuándo cargar la DLL en nuestro
programa, y posiblemente implementar un mecanismo semejante al polimorfismo,
ya que las funciones 'sumar' y 'restar' son apodos de las funciones reales
en la DLL. Por ejemplo, podríamos haber hecho lo siguiente,

 HMODULE hDLL2 = LoadLibrary( "mi2.dll" );
PFSUMAR sumar = (PFSUMAR) GetProcAddress( hDLL2, "sumar" );
 PFRESTAR restar = (PFRESTAR) GetProcAddress( hDLL2, "restar" );

Ahora tenemos otras versiones de "sumar" y "restar" de otra DLL, pero en
nuestro programa principal las invocaremos a través de los punteros a
funciones 'sumar' y 'restar'.

Eso sí, recuerda que debes liberar la DLL con 'FreeLibrary()'.


> 2. ¿Qué procedimiento(s) debo hacer para poder acceder a lo que guarde en
> la DLL, ya sea para este ejemplo o para acceder a funciones; o si solo
> accedo a ellos como si los archivos fueron unos simple de recursos y
> cabecera?


Los recursos en una DLL o en un ejecutable siguen siendo recursos; trátalos
como si fuesen recursos cualesquiera. Las funciones que permiten cargar
información de recursos requieren un manipulador a una instancia. Esta
instancia se refiere, en tu caso, al módulo de la DLL que cargaste con
'LoadLibrary()'. También puedes obtener el módulo con 'GetModuleHandle()'.


> Les agradecería una respuesta y solución a mi duda pues no he encontrado
> una respuesta concreta para mi problema y asi poder ver si la DLL también la
> cree correctamente.
> Trabajo actualmente con Code::Block, pero también tengo Dev-C++ y me gusta
> trabajar en la API de la cual he aprendido en el curso de WINAPI de Con
> Clase y me he apoyado también en contenido de C++ que se encuentra en el
> sitio de Microsotf, gracias :-) .



Espero que esto te oriente.

Steven
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20100109/8409495f/attachment.html>


Más información sobre la lista de distribución Cconclase