Как использовать класс в 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? Большое спасибо.
4 ответов
Если вы используете динамическое связывание во время выполнения (использует 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
решение предложил bcsanches,
__declspec(dllexport) ISDLConsole *Create()
{
return new SDLConsole();
}
Если вы собираетесь использовать этот подход как предложил by bcsanches, затем убедитесь, что вы используете следующие функции delete
объект
__declspec(dllexport) void Destroy(ISDLConsole *instance)
{
delete instance;
}
определить такие функции всегда в паре, как это обеспечивает что вы удаляете свои объекты из той же кучи / пула памяти / и т. д., на которых они были созданы. Видеть это пара-функции
вы можете, и вся необходимая вам информация находится на на этой странице и на этой странице :
#ifdef _EXPORTING
#define CLASS_DECLSPEC __declspec(dllexport)
#else
#define CLASS_DECLSPEC __declspec(dllimport)
#endif
class CLASS_DECLSPEC SDLConsole
{
/* ... */
};
осталось только определить символ препроцессора _EXPORTING
при создании DLL.
если вы хотите предоставить данные в классе, вышеуказанные решения не сократят его. Вы должны ударить __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 C++ с нуля и установите флажок "экспортировать символы", некоторые примеры кода будут сгенерированы с помощью этого метода.