Как создать некоторый класс из dll (конструктор в dll) в C ++? - PullRequest
8 голосов
/ 04 октября 2009

Как создать некоторый класс из dll (конструктор в dll)? (C ++) или как динамически загрузить класс из dll?

Ответы [ 4 ]

10 голосов
/ 04 октября 2009

Вам нужно объявить свой класс, используя ключевое слово __declspec(dllexport) при сборке DLL. При использовании DLL класс должен быть объявлен с __declspec(dllimport):

#ifdef COMPILING_DLL
#define DECLSPEC_CLASS __declspec(dllexport)
#else
#define DECLSPEC_CLASS __declspec(dllimport)
#endif

class DECLSPEC_CLASS MyClass
{
...
}

Когда DLL скомпилирована, вы должны добавить -DCOMPILING_DLL в список определений.

При использовании класса вы должны статически связываться с DLL, то есть передавать библиотеку импорта mydll.lib основной программе.

Если вы хотите загрузить DLL во время выполнения , вам нужна C-функция в DLL, которая создает объект и возвращает его для вас. Невозможно динамически искать конструктор в DLL (используя GetProcAddress ()).

3 голосов
/ 04 октября 2009

Вместо того, чтобы экспортировать каждый метод класса с помощью __declspec, вы также можете рассчитывать на то, что компилятор может вызывать виртуальные функции через vtable, например:

//note: no __declspec
class IPublicInterface
{
  virtual ~IPublicInterface() = 0;
  virtual void SomeMethod() = 0;
};

//note: no __declspec
class SomeClass : IPublicInterface
{
  virtual ~SomeClass() { ... }
  virtual void SomeMethod() { ... }
};

//note: this is the only method which needs to be exported from the DLL
IPublicInterface* createSomeClass()
{
  return new SomeClass();
}
3 голосов
/ 04 октября 2009

Строго отвечая на ваш вопрос, вам нужно добавить функцию extern "C", которая возвращает результат конструктора:

extern "C" foo* __declspec(dllexport) new_foo(int x) {
    return new foo(x);
}

Тогда в вашем источнике вы можете использовать GetProcAddr для "new_foo" для вызова функции.

3 голосов
/ 04 октября 2009

Вам нужно будет экспортировать функцию из DLL, которая вызывает конструктор и возвращает новый объект.

Старайтесь избегать использования конкретных типов C ++ в качестве параметров функции; Идея библиотек DLL заключается в том, что вы можете самостоятельно обновлять их, но обновленный компилятор может по-разному размещать std :: string, вызывая несовместимость во время выполнения.

Это то, что находится в корне COM, например - система ограниченного типа и стандартная экспортируемая функция для получения экземпляров объектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...