J'ai donc une application basée sur l'API QT qui utilise le système QPlugin. C'est assez simple à utiliser, vous définissez une classe qui hérite d'une interface et lorsque le plugin est chargé, vous obtenez une instance de cette classe. À la fin, il se résumera à dlopen
/dlsym
ou LoadLibrary
/GetProcAddress
, tout ce qui est approprié pour le système d'exploitation. Je n'ai aucun problème ici tout fonctionne comme prévu.Conception de l'API du plugin
Donc, sur le problème. Il y a un lot de fonctionnalité qui implique un plugin ayant besoin de se référer aux données/fonctions fournies par l'application principale. Par exemple, mon application a une interface graphique, j'ai donc dans mon application une fonction "plugin::v1::gui
" qui renvoie un QWidget *
. Si je veux qu'un plugin soit capable d'ajouter des choses à mon interface utilisateur, ou même de faire de sa boîte de dialogue un enfant de mon interface utilisateur, il aura besoin d'un pointeur.
J'ai commencé le développement sous Linux et j'ai rapidement rencontré le fait que par défaut le chargeur ne remplissait pas les symboles non résolus dans les objets partagés avec ceux de l'application qui le chargeait. Pas de problème, solution facile. ajoutez "-rdynamic
" à mes drapeaux et continuez. Chose fonctionne bien.
Maintenant, je l'ai découvert qu'il ne semble pas être un équivalent sur Windows :(. Quel est donc une bonne solution?
Jusqu'à présent, le meilleur que je suis venu avec une structure est d'avoir I remplissez dans mon application principale qui a des pointeurs vers chaque objet/fonction dont un plugin pourrait se soucier.Puis passer cela à la fonction "init()
" du plugin et maintenant il a des pointeurs appropriés à tout, mais c'est une solution ennuyante car maintenant je dois faire changements dans plusieurs endroits chaque fois que j'ajoute quelque chose
Existe-t-il une meilleure solution? Comment la communauté SO a-t-elle traité cela?
Voici un bon article qui explique en détail comment accomplir des plugins de cette manière: http://www.nuclex.org/articles/building-a-better-plugin-architecture#comment-738 – joshperry