#cpp #классы #visual_cpp #dll
Пишу на 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; } }
Ответы
Ответ 1
Под форточкой экспорт класса - это COM API, Он же ActiveX. Жутко монструозная вещь, но она действительно позволит в дальнейшем использовать ваш класс во всех языках с поддержкой COM. Главное ограничение - С++ не имеет стабильного ABI. Отсюда следует, например, что если в DLL выделяется память, освобождать ее нужно в той же самой DLL, иначе - рантаймы подерутся и будут жуткие глюки. Просовывание исключений между DLL - отдельный интересный процесс. DLL "с классами" можно связывать с другим бинарником только явно. Тогда вся забота о связывании ложится на компилятор. При этом, и DLL, и то, куда ее привязывают, должны быть собраны одной и той же версией компилятора с одинаковыми настройками - иначе - возможны глюки. (Например, если программу собрали с динамическим включением рантайма, а DLL - со статическим). Пишите экспорт функций или возьмите технологию плагинов, которую уже кто-то сделал - Qt или COM, например. В противном случае, придется вам зубрить MSDN.
Комментариев нет:
Отправить комментарий