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