Страницы

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

воскресенье, 22 декабря 2019 г.

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

#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.

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

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