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

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

4 ответов


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

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

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


нужно объявить свой класс с помощью __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()).


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

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

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


вместо экспорта каждого метода класса с помощью _ _ 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();
}