Динамический импорт класса C ++ из DLL - PullRequest
13 голосов
/ 21 сентября 2008

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

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

Ответы [ 5 ]

12 голосов
/ 21 сентября 2008

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

extern "C"
{
...
}

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

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

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

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

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

5 голосов
/ 21 сентября 2008

Нашли решение на http://www.codeproject.com/KB/DLL/XDllPt4.aspx

Спасибо за ваши усилия, парни и девушки

2 голосов
/ 21 сентября 2008

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

2 голосов
/ 21 сентября 2008

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

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

1 голос
/ 21 сентября 2008

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

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

Очевидно, это для компиляции во время компоновки. Вы можете использовать директиву / delayload linker, чтобы сделать ее «динамической», но это, вероятно, не то, что вы хотите от строки темы.

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

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

...