Pregunta: | 32446 - CARGAR DLL'S EN C++ BUILDER |
Autor: | Angel Serralan |
Me gustaria que me indicaseis como puedo cargar una libreria (DLL) para poder utilizar sus funciones.
Estoy probando con "extern prototipo", pero me da un error externo y no se si es la libreria que está mal o que no se carga. Un saludo y gracias por adelantado |
Respuesta: | Angel Serralan |
Existen varias formas de utilizar las librerías en C++ Builder.
Si la librería es interna de, es decir tiene extensión .BPI o es estática .LIB tan solo hay que añadirla a la lista de librerías utilizadas por nuestro proyecto en el menú Project->Options. Luego tendremos que declarar el prototipo de la función en la cabecera del modulo implementado y utilizar las funciones declaradas en esta librería. Por supuesto debemos conocer la estructura de la función o componente declarado en la librería. Si por el contrario estamos hablando de funciones del API de windows tan solo habrá que saber la estructura de la función a utilizar y utilizarla. Esta estructura está disponible casi siempre en Win32.hlp o en algún fichero de ayuda relacionado con Win32. Existen librerías del API que están ya cargadas con lo cual sólo es necesario utilizar la función y otras que es necesario declarar el prototipo de la función en la cabecera, para poder utilizarla. Estas declaraciones de prototipos son del tipo: extern "C" __stdcall tipo_dato_devuelto Nombre_función ( ) ; El tipo de convención de llamada depende si la función esta escrita en C++, C o en cualquier otro lenguaje.(_ _stdcall, _ _fastcall, _ _pascal, _ _cdecl). En caso de querer utilizar una librería (Dll\'s) externa, lo primero que tendremos que hacer es conocer la estructura de la función. Una vez conozcamos la estructura de la función tendremos que utilizar dos funciones del API de windows como son LoadLibrary( ) , para cargar la librería propiamente dicha, y GetProcAddress( ) para obtener la función a utilizar. Una vez utilizada se deberá liberar la librería con FreeLibrary( ). Para entenderlo os pongo un ejemplo. 1º- Declaramos en la cabecera del fichero implementado: // Definimos un nuevo tipo de datos con un puntero al tipo de datos devuelto por la // función a utilizar, y también los parámetros pasados a la función. typedef int (*PROCEDIMIENTO)(LPSTR, int); // Asignamos un nombre al procedimento PROCEDIMIENTO Nombre_procedimiento; // Cargamos la librería utilizando el manejador HINSTANCE. HINSTANCE Nombre_deseado =:: LoadLibrary("Nombre_librería.dll"); // Luego asignamos al procedimiento declarado en la cabecera la función de la librería que queremos utilizar. Nombre_procedimiento = (PROCEDIMIENTO)::GetProcAddress(Nombre_deseado,"Nombre_función"); // A partir de aquí ya podemos utilizar la función a través de Nombre_procedimiento. //(Pasándole los parámetros correspondientes) // Lo normal será asignar a un tipo de datos igual al devuelto por la función, a // Nombre_procedimiento(Parámetros), para poder evaluar los resultados obtenidos, ya // que normalmente la función devolverá algún dato para saber que se ha realizado la // operación con éxito o no. int Dato_devuelto; Dato_devuelto = Nombre_procedimento(parámetros de la función); // Una vez utilizada la función será necesario liberar el espacio ocupado en memoria por // la librería cargada, para lo que habrá que utilizar FreeLibrary( ). ::FreeLibrary(Nombre_deseado); Este tema es bastante extenso por lo que me imagino que deben haber más formas de utilizar las librerías, además de crear nuevos componentes VCL, COM, etc. Yo he probado varías formas de utilizarlas, como por ejemplo utilizar la declaración del prototipo, y luego intentar hacer que se cargue la librería utilizando Project->Options->Advanced Linkers->Dll's to delays load y no me ha funcionado, dandome casi siempre un error de proceso de la librería. También cargando la librería manualmente en el fichero Options-Source en el apartado indicado como <ALLLIB>, pero tampoco me ha funcionado dándome errores en el linkado del tipo Unresolved-external error . Así que buscando encontré la forma explicada y con esta funciona correctamente, sólo es necesario conocer bien la estructura de la función. Os pongo una referencia que de una página que a mí me ayudo bastante y que por lo que he ojeado me parece que está bastante bien. http://www.zator.com/Cpp/E1_4_htm#librería Espero que sea de vuestra ayuda, y que si alguien encuentra otra forma me la comuniqueis. Gracias y un saludo. |