Как использовать класс в DLL?
Можно ли разместить класс внутри DLL?
Я написал этот класс:
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);
};
Я знаю, как загрузить DLL и использовать функцию внутри DLL, но как я могу поместить класс внутри DLL? Большое вам спасибо.
Ответы
Ответ 1
Если вы используете динамическую компоновку времени выполнения (использует LoadLibrary для загрузки DLL), вы не можете получить доступ к классу напрямую, вам нужно объявить интерфейс для своего класса и создать функцию, которая возвращает экземпляр этого класса, например:
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();
}
В противном случае, если вы связываете DLL во время загрузки, просто используйте информацию, предоставленную icecrime: http://msdn.microsoft.com/en-us/library/a90k134d.aspx
Ответ 2
Решение, предложенное bcsanches,
__declspec(dllexport) ISDLConsole *Create()
{
return new SDLConsole();
}
Если вы собираетесь использовать этот подход в качестве , bcsanches, убедитесь, что вы используете следующую функцию для delete
ваш объект,
__declspec(dllexport) void Destroy(ISDLConsole *instance)
{
delete instance;
}
Определите такие функции всегда в паре, так как это гарантирует, что вы удаляете свои объекты из того же пула кучи/памяти/etc, в котором они были созданы. См. Пара-функции
Ответ 3
Вы можете, и вся необходимая информация находится на этой странице и эта страница:
#ifdef _EXPORTING
#define CLASS_DECLSPEC __declspec(dllexport)
#else
#define CLASS_DECLSPEC __declspec(dllimport)
#endif
class CLASS_DECLSPEC SDLConsole
{
/* ... */
};
Все, что осталось, это определить символ препроцессора _EXPORTING
при создании библиотеки DLL.
Ответ 4
Если вы хотите разоблачить данные в классе, вышеупомянутые решения не сократят его. Вы должны пометить __declspec(dllexport)
в самом классе в компиляции DLL и __declspec(dllimport)
в модуле, который ссылается на DLL.
Общей методикой является это (мастера Microsoft производят такой код):
#ifdef EXPORT_API
#define MY_API __declspec(dllexport)
#else
#define MY_API __declspec(dllimport)
#endif
class MY_API MyClass {
...
};
Затем убедитесь, что EXPORT_API
определен в проекте DLL и убедитесь, что он не определен в модуле, который ссылается на DLL.
Если вы создаете новый проект DLL в Visual С++ с нуля, и установите флажок "Экспорт символов", некоторые примеры кода будут сгенерированы с использованием этой техники.