Динамический импорт класса С++ из DLL

Каков правильный способ импортирования класса С++ из DLL? Мы используем Visual С++.

Здесь dllexport/exports.def + LoadLibrary + GetProcAddress trifecta, но он не работает на С++-классах, а только на C-функциях. Это связано с изменением имени С++? Как это сделать?

Ответы

Ответ 2

Вам нужно добавить следующее:

extern "C"
{
...
}

чтобы избежать манипуляции с функциями.

вы можете написать две простые функции C:

SomeClass* CreateObjectInstace()
{
    return new SomeClass();
}

void ReleaseObject(SomeClass* someClass)
{
   delete someClass;
}

Используя эти функции, вы можете впоследствии добавить/изменить функциональность создания/удаления вашего объекта. Это иногда называют Factory.

Ответ 3

Я обычно объявляю базовый класс интерфейса, использую это объявление в своем приложении, а затем использую LoadLibrary, GetProcAddress, чтобы получить функцию factory. Фактор всегда возвращает указатель типа интерфейса.

Вот пример: экспорт документа/представления MFC из DLL, динамически загружаемый

Ответ 4

Отметьте этот вопрос. В принципе, есть два пути. Вы можете пометить класс с помощью _dllexport, а затем связать его с библиотекой импорта, и DLL будет загружаться автоматически. Если вы хотите динамически загружать DLL, вы можете использовать идею функции factory, которую предложили @titanae

Ответ 5

dllexport/dllimport работает, поместите его перед именем вашего класса в файл заголовка, и вам будет хорошо идти.

Как правило, вы хотите использовать dllexport в dll и dllimport в exe (но вы можете просто использовать dllexport повсюду, и он работает, делая это "правильно", делает его намного быстрее для загрузки).

Очевидно, что для компиляции link-time. Вы можете использовать /linkload linker директиву, чтобы сделать его "динамическим", но это, вероятно, не то, что вы хотите от строки темы.

Если вам действительно нужна загрузка стиля LoadLibrary, вам придется обернуть ваши функции С++ оболочками extern C. Проблема состоит в том, что из-за манипуляции с именем вы можете ввести полностью искаженное имя, и оно будет работать.

Обходные пути обычно включают функцию C, которая возвращает указатель на правильный класс. COM работает таким образом, поскольку он экспортирует 4 C-функции из dll, которые используются для получения методов интерфейса внутри объекта в dll.