Как создать некоторый класс из 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();
}