• Viernes 8 de Noviembre de 2024, 20:43

Autor Tema:  Llamar a una dll desde VC++  (Leído 1990 veces)

tousan

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Llamar a una dll desde VC++
« en: Martes 7 de Julio de 2009, 21:22 »
0
Hola.

No consigo llamar a una función de una librería desde VC++ 2005.
He creado una simple librería llamada "Hola.dll" y en ella exporto una función llamada "Hola()" que es simplemente un MessageBox.

Lo que yo quiero hacer es que en mi programa cargue la librería "Hola.dll" desde la tabla de importaciones... al igual que lo hace con cualquier librería de Windows.
Sé hacerlo con LoadLibrary y con GetProcAddress y funciona perfectamente pero no quiero hacerlo así.

He probado hacerlo de muchas formas diferentes y he leído muchos tutoriales pero no tengo ni idea de cómo hacerlo. Estoy intentando hacerlo del siguiente modo:
#define Hola __declspec(dllimport)
Pero no sé cómo decirle al compilador que Hola() es una función de Hola.dll

Alguien me puede orientar?? llevo dos días intentando hacerlo y de verdad que he rebuscado por todos sitios (buscando en google por ej. "__declspec(dllimport)"etc...) y no encuentro nada.
Gracias

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Llamar a una dll desde VC++
« Respuesta #1 en: Martes 7 de Julio de 2009, 21:24 »
0
No le decis en que libreria esta la funcion, simplemente usas la libreria de importacion (.lib) y el enlazador resuelve los simbolos por su cuenta.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

tousan

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Re: Llamar a una dll desde VC++
« Respuesta #2 en: Martes 7 de Julio de 2009, 21:35 »
0
Cuando creé la librería obtuve un hola.lib.

He puesto ese archivo en mi proyecto y en propiedades->vinculador->entrada->dependencias adicionales he añadido "hola.lib"

En el código he puesto lo siguiente:
....
#define Hola __declspec(dllimport)
...
//y llamo a la función así:
Hola();
....

Lo he compilado y no da ningún error pero he analizado el programa con un debugger y esa llamada Hola() no existe... y en la tabla de importaciones tampoco ha añadido a "Hola.dll"... No lo entiendo.
Gracias

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Llamar a una dll desde VC++
« Respuesta #3 en: Miércoles 8 de Julio de 2009, 00:06 »
0
¿Si sacas el .lib de la configuracion es posible generar el ejecutable?

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

tousan

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Re: Llamar a una dll desde VC++
« Respuesta #4 en: Miércoles 8 de Julio de 2009, 19:33 »
0
Después de 3 días sin parar de probar cosas lo logré...

Lo comento:
Se necesitan dos archivos que se crean con la dll:
1º) Hola.lib -> librería estática absolutamente necesaria que utiliza el vinculador.

Este archivo "Hola.lib" hay que ponerlo en el mismo directorio(por no introducir más rutas) donde se encuentra el proyecto (recuerdo que yo utilizo VC++ 2005 express). Después hay que indicarselo al vinculador y esto se hace así: menú proyecto --> propiedades --> propiedades de configuración --> vinculador --> entrada y en la primera opción que pone: dependencias adicionales hay que poner ahí "Hola.lib"

2º)HolaDll.h -> archivo de encabezado
También se crea con la librería y ahí se indican las funciones exportadas que vamos a llamar.

Simplemente en nuestro proyecto hay que incluirlo:
#include "HolaDll.h"

Y con esto ya está, ya se puede llamar a la función Hola() y VC++ ya sabe que es a la función de la librería de "Hola.dll" y ya no es necesario usar loadlibrary ni Getprocaddress porque se inserta en la tabla de importaciones de nuestro programa.
Espero que sea útil...

PD. Yo lo que nunca he entendido por qué es necesaria la librería estática "Hola.lib", ya que sino existe no hay manera de hacerlo. No lo entiendo.
Digo esto porque yo por ej. puedo llamar a una API que no sea utilizada y después con mi programa compilado modificar la import table y poner la librería "Hola.dll" por ej. con el programa ImportReconstructor, y esto es muy fácil de hacer... entonces por qué narices VC++ necesita la librería estática "hola.lib"?????
¿No podría bastar con una llamada parecida a esto?: (Hola.dll)void Hola(void); o algo similar... No lo entiendo porque en el archivo de encabezado holadll.h ya están las funciones de la librería.... Gracias

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Llamar a una dll desde VC++
« Respuesta #5 en: Lunes 13 de Julio de 2009, 17:26 »
0
El .lib es para que el enlazador (linker) pueda resolver los simbolos que importes, si usas LoadLibrary/GetProcAddress no lo necesitas.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.