Pour une application avec Qt (projet perso), j'essaye de mettre en place un système de plugin. J'ai suivi la doc, ça fonctionne bien. Néanmoins, j'aimerai donner plus de souplesse et de possibilités à mes plugins tout en ayant une interface de plugin très simplifiée.
C'est à dire qu'au lieu de déclarer N fontions virtuelles dans l'interface, je n'en déclare qu'une seule qui reçoit en paramètre un pointeur sur un "plugin handler" qui lui fait la jonction entre le plugin et l'application.
Pour vous donner un exemple, imaginons que le plugin veuille ajouter un menu à l'application. Le truc simple et qui fonctionne est d'avoir ce genre de fonction dans l'interface du plugin:
Puis l'application après avoir chargé le plugin va appeler cette fonction et "ajouter" elle-même le menu qui sera retourné par le plugin.
Code : Sélectionner tout - Visualiser dans une fenêtre à part virtual QMenu* menu() const = 0;
Maintenant ce que je cherche à faire est de donner au "plugin handler" le rôle d'ajouter lui-même le menu à l'application.
Lorsque l'appli démarre, une instance de PluginHandler est créée. Celle-ci garde un pointeur sur l'application principale.
Une fois le plugin chargé, l'application lui passe le PluginHandler et c'est le plugin qui décide s'il veut ajouter le menu ou non.
Un exemple:
Et du coté du PluginHandler:
Code : Sélectionner tout - Visualiser dans une fenêtre à part 
2
3
4
5
6
7
8
Maintenant ce qui cloche dans mon approche est le fait que PluginHandler est partagé à la fois par l'application et aussi par les plugins.
Code : Sélectionner tout - Visualiser dans une fenêtre à part 
2
3
4
5
Ca ne pose pas de problème quand je compile l'application seule.
En revanche, quand je compile un plugin, le linker (gcc win32) me dit qu'il y a des undefined references concernant le Pluginhandler.
J'ai donc essayé de compiler l'appli principale en tant que static library et la lier lors de la compilation du plugin.
Après quelques tentatives, j'arrive à tout compiler mais l'application principale n'est plus en mesure de loader mon plugin...
pluginLoader.errorString() retourne "cannot load library TestPlugin.dll".
Alors j'en viens quand même à ma question:
Que feriez-vous dans un pareil cas ?
Dois-je essayer de découpler le PluginHandler de l'application principale (essayer de ne mettre que lui dans une librarie statique qui serait linkée lors de la compilation de l'appli et des plugins ?)
Ferais-je fausse route ?
Comment gérez-vous vos plugins d'applications ?
Merci
Juste pour info, voici mes headers simplifiés:
Code : Sélectionner tout - Visualiser dans une fenêtre à part 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56

 

 
		
		 
         
 

 
			
			

 
   


 Plugins d'application. Question de design et méthodologie
 Plugins d'application. Question de design et méthodologie
				 Répondre avec citation
  Répondre avec citation
Partager