Пишу на 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.
Комментариев нет:
Отправить комментарий