C/Visual C - Como cargar una dll en C++

 
Vista:

Como cargar una dll en C++

Publicado por Clayder (11 intervenciones) el 22/08/2007 06:12:19
Hola:

Soy nuevo en este lenguaje de programacion. Hace poco, estuve dejando algunos post sobre la palabra reservada using. Ya entendí que no se usa para cargar dlls, pero entonces como se hace esto en C++, ¿es igual que en C? o hay algun metodo mas abreviado.

Les agradezco me respondan y si es con un ejemplo simple, mejor.

Saludos.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Como cargar una dll en C++

Publicado por fernando.gomez (1604 intervenciones) el 22/08/2007 17:30:20
Hay dos formas, una dinámica y otra estática, para cargar una DLL. La primera forma la puedes encontrar en http://www.lawebdelprogramador.com/news/mostrar_new.php?id=13&texto=C/Visual+C&n1=454266&n2=1&n3=0&n4=0&n5=0&n6=0&n7=0&n8=0&n9=0&n0=0 y como verás es la misma que C (de hecho es algo heredado).

Cargar DLLs en C++ es algo complicado desde el punto de vista de la interoperabilidad del lenguaje. El estándar de C++ no define cómo importar o exportar objetos, clases o funciones como lo hace el estándar de C (a esto se le llama Application Binary Interface, ABI), y por ende queda del lado de la implementación del compilador realizar esta tarea. Realizar esta ABI es difícil por muchos elementos, como por ejemplo la sobrecarga de funciones y las plantillas. Y aunque nos habían prometido que para la siguiente versión del estándar (cuyo borrador será ratificado a finales de este año) ya hab´ria un ABI para C++, se ha descartado y pospuesto para la siguiente versión del estándar.

Lo que quiero decir con lo anterior es que, en esencia, tendrás que consultar la documentación de tu compilador, ya que cada quién lo interpreta como le de la gana. Más aún, a veces es imposible cargar una DLL que se generó en, digamos, Borland C++ Builder desde una aplicación hecha en Visual C++. Triste.

En el caso particular de Visual C++, la forma de exportar una función o clase es a través de la extensión __declspec(dllexport) de la siguiente forma:

__declspec(dllexport) class Clase
{
...
};

Y para importarla, necesitas la definición de la clase con __declspec(dllimport):

__declspec(dllimport) class Clase
{
...
};

Clase clase; // lista para usarse.

Es práctica común, por ende, que en la DLL se defina algún símbolo para diferenciar cuando el header está en la DLL o cuando está en el programa que importa la clase. Lo tradicional es algo así, suponiendo que tu proyecto se llame MiProyecto:

#ifdef MIPROYECTO_EXPORTS
#define MIPROYECTO_API __declspec(dllexport)
#else
#define MIPROYECTO_API __declspec(dllimport)
#endif

Entonces, en las configuraciones del proyecto de tu DLL defines MIPROYECTO_EXPORTS, y con eso ya puedes emplear el mismo header. Por supuesto, la clase la tendrías que declarar como:

MIPROYECTO_API class Clase
{
...
};

Bueno, espero te sirva. Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar