Подтвердить что ты не робот

Как использовать класс в 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? Большое вам спасибо.

4b9b3361

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