Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

DLL dinamica

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: DLL dinamica Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
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


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.