Hola Camilo José,<br><br>
<div class="gmail_quote">2010/1/9 Camilo José <span dir="ltr"><<a href="mailto:cjdelreal2009@gmail.com">cjdelreal2009@gmail.com</a>></span><br>
<blockquote style="BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex; PADDING-LEFT: 1ex" class="gmail_quote">Hola a todos,<br>        es mi primera vez que interactúo en las listas de correo a pesar que llevo tiempo estudiando por los manuales de Con Clase.</blockquote>

<div> </div>
<div>Encantado de que participes de una forma más activa.</div>
<div> </div>
<blockquote style="BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex; PADDING-LEFT: 1ex" class="gmail_quote">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é,<br>
mis preguntas son:<br>1. ¿Cómo puedo enlazar DLL con mis aplicaciones?</blockquote>
<div> </div>
<div>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.</div>

<div> </div>
<div>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,</div>

<div> </div>
<div>// En la DLL</div>
<div>double sumar( double x, double y );<br>double restar( double x, double y );<br>...</div>
<div><br>// En el programa</div>
<div>typedef double (*PFSUMAR)( double, double );</div>
<div>
<div>typedef double (*PFRESTAR)( double, double );</div>...</div>
<div>HMODULE hDLL = LoadLibrary( "mi.dll" );</div>
<div>PFSUMAR sumar = (PFSUMAR) GetProcAddress( hDLL, "sumar" );</div>
<div>
<div>PFRESTAR restar = (PFRESTAR) GetProcAddress( hDLL, "restar" );</div>
<div>...</div>
<div>cout << sumar(3.2, 5.6) << endl;</div>
<div>cout << restar(3.2, 5.6) << endl;</div>
<div> </div>
<div>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,</div>

<div> </div>
<div>
<div>
<div>HMODULE hDLL2 = LoadLibrary( "mi2.dll" );</div>PFSUMAR sumar = (PFSUMAR) GetProcAddress( hDLL2, "sumar" );</div>
<div>
<div>PFRESTAR restar = (PFRESTAR) GetProcAddress( hDLL2, "restar" );</div></div></div>
<div> </div>
<div>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'.</div>
<div> </div>
<div>Eso sí, recuerda que debes liberar la DLL con 'FreeLibrary()'.</div>
<div> </div></div>
<blockquote style="BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex; PADDING-LEFT: 1ex" class="gmail_quote">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?</blockquote>

<div> </div>
<div>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()'.</div>

<div> </div>
<blockquote style="BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex; PADDING-LEFT: 1ex" class="gmail_quote">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.<br>
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 :-) .</blockquote>

<div> </div>
<div> </div>
<div>Espero que esto te oriente.</div>
<div> </div>
<div>Steven</div>
<div> </div></div>