Страницы

Поиск по вопросам

четверг, 15 ноября 2018 г.

Правильная реализация экспорта класса из DLL на C++

Пишу на VC++ 2010. Планирую реализовать плагины в виде Dll, в которых будет класс, перегружающий виртуальные методы базового класса. Хочется написать библиотеку с классом, использование которой не будет зависеть от версии компилятора. Погуглил, понял что просто так экспортировать класс не получится. В связи с этим возникли несколько вопросов:
Как правильно реализовать экспорт класса из Dll, чтобы в дальнейшем можно было использовать эту библиотеку с другим компилятором (например в Delphi, ну или хотя бы в другой версии Visual Studio)? Какие ограничения будут для такого класса? Можно ли будет связывать такую dll неявно (на одном из сайтов прочитал, что dll экспортирующие классы невозможно загрузить явно с помощью LoadLibrary)? Имеет ли смысл такая реализации плагина, или же лучше писать простые dll с экспортом функций?
Если не сложно, прошу показать какой-нибудь примитивный пример экспорта следующего класса:
class Sample { private: int field; public: Sample(const int number) { field = number; }
~Sample() {}
virtual int GetField() { return field; } }


Ответ

Под форточкой экспорт класса - это COM API, Он же ActiveX. Жутко монструозная вещь, но она действительно позволит в дальнейшем использовать ваш класс во всех языках с поддержкой COM. Главное ограничение - С++ не имеет стабильного ABI. Отсюда следует, например, что если в DLL выделяется память, освобождать ее нужно в той же самой DLL, иначе - рантаймы подерутся и будут жуткие глюки. Просовывание исключений между DLL - отдельный интересный процесс. DLL "с классами" можно связывать с другим бинарником только явно. Тогда вся забота о связывании ложится на компилятор. При этом, и DLL, и то, куда ее привязывают, должны быть собраны одной и той же версией компилятора с одинаковыми настройками - иначе - возможны глюки. (Например, если программу собрали с динамическим включением рантайма, а DLL - со статическим). Пишите экспорт функций или возьмите технологию плагинов, которую уже кто-то сделал - Qt или COM, например. В противном случае, придется вам зубрить MSDN.

Комментариев нет:

Отправить комментарий