 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
kalux Master


Registrado: 21 Nov 2003Mensajes: 313Ubicación: Alicante - España
|
Publicado: Dom 17 Sep, 2006 5:43 pm Asunto: DLL dinamica |
|
|
Hola,
Estoy aprendiendo a usar una dll de forma dinamica,
Siguiendo algunos post del foro, he obtenido lo siguiente:
Creo la dll, que contiene una funcion que devuelve la suma de 2 enteros. La dll esta bien ya que la he probado de forma estatica.
En el fichero cpp tengo:
| Código: |
typedef int (__stdcall *pfSuma)(int, int);
pfSuma Suma;
HINSTANCE hLib = LoadLibrary("midll.dll");
if (hLib)
{
Suma = reinterpret_cast<pfSuma>(GetProcAddress(hLib,"Suma"));
if (Suma) ShowMessage(Suma(2,3));
else ShowMessage("No se pudo acceder a la funcion");
FreeLibrary(hLib);
}
else
{
ShowMessage("No se pudo acceder a la DLL");
}
|
Pues bien, al ejecutarla me sale el mensaje de: "No se pudo acceder a la funcion".
Por lo que veo, se carga la dll pero no entra en la funcion de la suma.
¿Que estoy haciendo mal?.
Gracias |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Lun 18 Sep, 2006 12:08 am Asunto: |
|
|
Intenta poner el tipo Puntero en la declaracion de la Funcionn Suma
| Código: | Suma = reinterpret_cast<pfSuma*>(GetProcAddress(hLib,"Suma")); |
en todo caso asumiendo que la función suma te retorne un entero, puedes usar la siguiente declaracion de la funcion y cargarla de esta manera que es mas efectiva
| Código: |
int __stdcall (*Suma)(int, int);
Suma = (int __stdcall (*)(int, int))GetProcAddress(hLib,"Suma");
|
Saludos _________________
 |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Lun 18 Sep, 2006 12:12 am Asunto: |
|
|
Hola kalux:
Depende de que modificadores hayas usado a la hora de exportar la función en la DLL, ya que según los que uses el compilador puede decorar el nombre.
Para saber el nombre exacto con el que se ha exportado puedes usar desde la línea de comandos lo siguiente:
TDUMP -ee -m tuLibreria.dll
Por ejemplo si lo has exportado de cada una de estas maneras fíjate debajo como debes importarla luego:
extern "C" __declspec(dllexport) int __stdcall Suma(int a, int b) { return(a+b); }
... GetProcAddress(hLib, "Suma") ...
extern "C" __declspec(dllexport) int Suma(int a, int b) { return(a+b); }
... GetProcAddress(hLib, "_Suma") ...
__declspec(dllexport) int __stdcall Suma(int a, int b) { return(a+b); }
... GetProcAddress(hLib, "@Suma$qqsii") ...
__declspec(dllexport) int Suma(int a, int b) { return(a+b); }
... GetProcAddress(hLib, "@Suma$qii") ... |
|
| Volver arriba |
|
 |
kalux Master


Registrado: 21 Nov 2003Mensajes: 313Ubicación: Alicante - España
|
Publicado: Mie 20 Sep, 2006 7:05 pm Asunto: |
|
|
Hola,
Gracias Cesar. Gracias Leo.
Siguiendo vuestros consejos, probe a usar el TDUMP, y el nombre que me dio fue el ultimo: "@Suma$qii"
Le puse este nombre, y funciono.
Por curiosidad ¿Sabeis porque se decora el nombre?, que ganas de complicarlo, no.
De todas formas, gracias por vuestra ayuda. |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mie 20 Sep, 2006 7:59 pm Asunto: |
|
|
| kalux escribió: | | Por curiosidad ¿Sabeis porque se decora el nombre?, que ganas de complicarlo, no. |
La decoración da más información sobres las funciones, argumentos, etc... y además sirve para evitar la duplicación de nombres, por ejemplo al usar sobrecarga...
Realmente el problema no es que se decoren los nombres, lo malo de la historia es que mientras en C todos usaban el mismo sistema (preceder las funciones con un subrayado) en C++ no existe un estándar para esto, con lo que cada fabricante lo hace a su manera.
Por eso lo mejor si vas a compartir la DLL con otros compiladores es que uses una de las dos primeras formas de exportar las funciones (al estilo de C).
Mas detalles sobre la decoración de nombres:
http://en.wikipedia.org/wiki/Name_mangling |
|
| Volver arriba |
|
 |
|
|
No puedes publicar temas nuevos en este foro No puedes responder a temas en este foro No puedes editar tus mensajes en este foro No puedes borrar tus mensajes en este foro No puedes votar en las encuestas de este foro
|
© 2002–2026 Club Builder · Funciona con phpBB.
|