Как использовать класс в 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++ с нуля и установите флажок "экспортировать символы", некоторые примеры кода будут сгенерированы с помощью этого метода.