c++ - ¿Cómo usar una clase en DLL?
dllimport c++ (4)
Puede, y toda la información que necesita está en here y esta página :
#ifdef _EXPORTING
#define CLASS_DECLSPEC __declspec(dllexport)
#else
#define CLASS_DECLSPEC __declspec(dllimport)
#endif
class CLASS_DECLSPEC SDLConsole
{
/* ... */
};
Todo lo que queda es definir el símbolo del preprocesador _EXPORTING
al crear el DLL.
¿Puedo poner una clase dentro de un DLL? La clase que escribí es esta:
class SDLConsole
{
public:
SDLConsole();
~SDLConsole(){};
void getInfo(int,int);
void initConsole(char*, char*, SDL_Surface*, int, int, int);
void sendMsg(char*,int, SDL_Surface*);
void cls(SDL_Surface*);
private:
TTF_Font *font;
SDL_Surface *consoleImg;
int width, pos, height, line, size, ctLine;
SDL_Surface* render(char*,int);
};
Sé cómo cargar una DLL y usar la función dentro de una DLL, pero ¿cómo puedo poner una clase dentro de una DLL? Muchas gracias.
Si desea exponer los datos en una clase, las soluciones anteriores no lo cortarán. __declspec(dllexport)
abofetear una __declspec(dllexport)
en la propia clase en la compilación de DLL, y una __declspec(dllimport)
en el módulo que enlaza con la DLL.
Una técnica común es hacer esto (los asistentes de Microsoft producen un código como este):
#ifdef EXPORT_API
#define MY_API __declspec(dllexport)
#else
#define MY_API __declspec(dllimport)
#endif
class MY_API MyClass {
...
};
Luego, asegúrese de que EXPORT_API
esté definido en el proyecto DLL, y asegúrese de que no esté definido en el módulo que enlaza con la DLL.
Si crea un nuevo proyecto DLL en Visual C ++ desde cero y marca la casilla de verificación "Exportar símbolos", se generará un código de ejemplo utilizando esta técnica.
Si usa la vinculación dinámica en tiempo de ejecución (usa LoadLibrary para cargar la dll), no puede acceder directamente a la clase, debe declarar una interfaz para su clase y crear una función que devuelva una instancia de esta clase, como esta:
class ISDLConsole
{
public:
virtual void getInfo(int,int) = 0;
virtual void initConsole(char*, char*, SDL_Surface*, int, int, int) = 0;
virtual void sendMsg(char*,int, SDL_Surface*) = 0;
virtual void cls(SDL_Surface*) = 0;
};
class SDLConsole: public ISDLConsole
{
//rest of the code
};
__declspec(dllexport) ISDLConsole *Create()
{
return new SDLConsole();
}
De lo contrario, si vincula la dll durante el tiempo de carga, solo use la información proporcionada por icecrime: here
Solution sugerida por bcsanches ,
__declspec(dllexport) ISDLConsole *Create()
{
return new SDLConsole();
}
Si va a utilizar este enfoque como lo Solution bcsanches , asegúrese de utilizar la siguiente función para delete
su objeto:
__declspec(dllexport) void Destroy(ISDLConsole *instance)
{
delete instance;
}
Defina dichas funciones siempre en par, ya que garantiza que elimine sus objetos del mismo montón / memory-pool / etc en el que se crearon. Ver este pair-functions