DLLs

20/01/2004 - 12:20 por Manuel D. Jiménez González | Informe spam
Hola grupo,

En nuestro proyecto queremos hacer que nuestro programa principal presente
unas funcionalidades según haya en el sistema una DLL o no. Para esto, nos
hace falta dos cosas:

1.- Implementar las DLLs: Cada una de estas DLLs consta de dos partes, un
diálogo MFC y una parte de procesamiento interno. Nuestro programa
presentará al usuario el diálogo proporcionado por la DLL y dará a ésta los
valores introducidos para que la DLL haga el procesamiento.

2.- Hacer que el programa busque la DLL y se comporte de forma distinta
según la DLL se encuentre o no.

Para el primer punto, nos gustaría saber dónde podemos mirar los pasos para
implementar un DLL "hola mundo" en VC++, y de ahí ir creciendo. Tampoco
sabemos si una DLL puede proporcionar un diálogo MFC para que otro programa
lo muestre (esto no es tan importante, basta con dar los datos al programa
con aquello que el diálogo tiene que tener y que el programa lo pinte).

Para el segundo punto, hasta ahora nos ha ocurrido que los programas dan un
error al principio cuando no existe una DLL que se necesita, lo cual no nos
deja tiempo para comprobar si existe, y por lo tanto actuar en consecuencia.
¿Cómo se puede corregir esto?.

De antemano, gracias. Un saludo,

Manuel.

Preguntas similare

Leer las respuestas

#1 Rodrigo Corral González
20/01/2004 - 12:46 | Informe spam
Sobre el primer punto, no hay problema en que una dll muestre ventanas.

Sobre el segundo punto, el tema es que debe cargar la dll de manera dinamica
utilizando LoadLibrary y GetProcAddress, en lugar de enlazarla estaticamente
mediante su .lib.

Un saludo
Rodrigo Corral González
Respuesta Responder a este mensaje
#2 Manuel D. Jiménez González
21/01/2004 - 12:23 | Informe spam
Muchas gracias Ramiro.

Ahora estoy detenido en un nuevo punto: Tengo una librería llamada
"TheDLL.dll" que tiene una función fnTheDLL. La línea...

hModule = LoadLibrary("TheDLL.dll");

... parece funcionar bien, y me da un valor válido en hModule, después
hago...

FARPROC procTheDll;
procTheDll = GetProcAddress(hModule, "fnTheDLL");

... de donde obtengo NULL. Sospecho que no se pueda declarar FARPROC sin
más. He encontrado en MSDN un ejemplo en el que hacen algo como...

typedef int (*MYPROC) ();

... entonces cambio la definición de "FARPROC procTheDll" a "MYPROC
procTheDll". Esto es todavía peor, porque ahora tengo un error de
compilación cuando llamo a GetProcAddress ...

cannot convert from 'int (__stdcall *)(void)' to 'int (__cdecl *)(void)'

Sospecho que todo esto es válido para C y no para C++ (mi proyecto es MFC).
He leído por ahí que, si se trabaha en C++, hay que usar...

# ifdef __cplusplus
extern "C" {
# endif

// código

# ifdef __cplusplus
}
# endif

¿Van por ahí mis problemas? En tal caso, ¿dónde tendría que añadir estas
macros?

Gracias una vez más, y un saludo a todos.

Manuel.

"Rodrigo Corral González" wrote in message
news:#
Sobre el primer punto, no hay problema en que una dll muestre ventanas.

Sobre el segundo punto, el tema es que debe cargar la dll de manera


dinamica
utilizando LoadLibrary y GetProcAddress, en lugar de enlazarla


estaticamente
mediante su .lib.

Un saludo
Rodrigo Corral González
Respuesta Responder a este mensaje
#3 Rodrigo Corral González
21/01/2004 - 12:50 | Informe spam
El problema es que C++ decora el nombre de las funciones para poder
distinguir las sobrecargas, de hay que tengas de declara aquellas funciones
que exportes como extern "C". La manera de hacer esto es:

# ifdef __cplusplus
extern "C" {
# endif

//Declaración de las funciones que exportas...

# ifdef __cplusplus
}
# endif

Además debes añadir un archivo .def a tu proyecto de dll de manera que en el
definas alias de las funciones exportadas.

En el programa que use la dll debes definir punteros a esas funciones de
manera que puedas hacer cast de lo que te devuelve la GetProcAddress a ese
tipo de puntero a función.

Otra cuestión interesante, aunque no imprescidible, es declarar la funciones
WINAPI, para que convención de llamada sea stdcall, que es la mas estandar.

Un saludo
Rodrigo Corral González

microsoft.public.es.vc FAQ
http://vcfaq.europe.webmatrixhosting.net
Respuesta Responder a este mensaje
#4 Manuel D. Jiménez González
21/01/2004 - 16:57 | Informe spam
Infinitamente gracias.

He hecho el siguiente .def...

LIBRARY TheDll.dll
DESCRIPTION 'My first DLL'

EXPORTS
fnTheDLL @2 PRIVATE

... supongo que será correcto, en cualquier caso funciona.

Ahora sólo tengo otra duda: Ya sé que con GetProcAddres puedo acceder a las
funciones, pero ¿cómo puedo acceder a las clases? Ya que vamos a tener una
clase heredando de CDialog, podríamos implementar una función dentro de la
DLL que lanzara este diálogo, pero creo que sería más "elegante" que la
aplicación pudiera lanzarlo.

Un saludo,

Manuel

"Rodrigo Corral González" wrote in message
news:
El problema es que C++ decora el nombre de las funciones para poder
distinguir las sobrecargas, de hay que tengas de declara aquellas


funciones
que exportes como extern "C". La manera de hacer esto es:

# ifdef __cplusplus
extern "C" {
# endif

//Declaración de las funciones que exportas...

# ifdef __cplusplus
}
# endif

Además debes añadir un archivo .def a tu proyecto de dll de manera que en


el
definas alias de las funciones exportadas.

En el programa que use la dll debes definir punteros a esas funciones de
manera que puedas hacer cast de lo que te devuelve la GetProcAddress a ese
tipo de puntero a función.

Otra cuestión interesante, aunque no imprescidible, es declarar la


funciones
WINAPI, para que convención de llamada sea stdcall, que es la mas


estandar.

Un saludo
Rodrigo Corral González

microsoft.public.es.vc FAQ
http://vcfaq.europe.webmatrixhosting.net
Respuesta Responder a este mensaje
#5 Rodrigo Corral González
21/01/2004 - 21:48 | Informe spam
No puedes acceder a clases utilizando GetProcAddress. Tendrias que crear una
dll de extension de MFC y no podrias usarla dinamicamente, sino que tendrias
que linkarla estaticamente usando el .h y el .lib. Lee sobre 'extension
DLLs' en la MSDN, si quieres exportar una clase que represente tu dialogo.

Un saludo
Rodrigo Corral González
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida