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

StackOverflow https://stackoverflow.com/questions/110833

  •  02-07-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение 2

Нашел решение по адресу http://www.codeproject.com/KB/DLL/XDllPt4.aspx

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

Другие советы

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

extern "C"
{
...
}

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

вы могли бы рассмотреть возможность написания двух простых функций на языке Си:

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top