Итак, у меня есть приложение, которое в значительной степени основано на API QT, использующее систему QPlugin. Его довольно просто использовать, вы определяете класс, который наследуется от интерфейса, и когда плагин загружается, вы получаете экземпляр этого класса. В конце все сводится к dlopen
/ dlsym
или LoadLibrary
/ GetProcAddress
, в зависимости от того, что подходит для ОС. У меня нет проблем, здесь все работает, как ожидалось.
Итак, к вопросу. Существует много функциональных возможностей, включающих плагин, который должен ссылаться на данные / функции, предоставляемые основным приложением. Например, мое приложение имеет графический интерфейс, поэтому в моем приложении есть функция "plugin::v1::gui
", которая возвращает QWidget *
. Если я хочу, чтобы плагин мог добавлять элементы в мой пользовательский интерфейс или даже сделать его диалог дочерним по отношению к моему пользовательскому интерфейсу, ему понадобится указатель на него.
Я начал разработку для Linux и быстро столкнулся с тем, что по умолчанию загрузчик не заполняет неразрешенные символы в общих объектах символами из приложения, загружающего его. Нет проблем, легко исправить. добавьте "-rdynamic
" к моим флагам и двигайтесь дальше. Все работает хорошо.
Теперь я обнаружил, что в Windows нет аналога :(. Так что же является хорошим решением?
Пока лучшее, что я придумал, - это структура, которую я заполняю в своем основном приложении, в которой есть указатели на каждый объект / функцию, о которых может заботиться плагин. Затем, передав это в функцию плагина "init()
", и теперь он имеет правильные указатели на все, но это раздражающее решение, так как теперь мне приходится вносить изменения в нескольких местах, когда я что-то добавляю.
Есть ли лучшее решение? Как сообщество SO справилось с этим?