Bonsoir,
Je réalise en ce moment même un programme qui nécessite un système de plugins. En cherchant dans la doc j'ai trouvé que Qt gérait cela, en suivant les exemples j'ai pus faire un programme de test qui charge un plugin et appelle une fonction de celui-ci : ça a marché avec succès.
Cependant, je cherche à faire quelque chose d'un peu plus poussé : dans mon programme je dispose d'un pointeur System* qui est l'instance de la classe singleton « System ». Ce dernier possède en attributs d'autre pointeurs vers les éléments constitutifs du logiciel. Ce que je souhaite faire c'est d'envoyer ce fameux pointeur au plugin afin que celui-ci (le plugin) puisse manipuler entièrement le programme. Par exemple la classe System possède une méthode quit() qui permet de terminer le programme. Ce que je fait c'est d'envoyer le pointeur sur System au plugin, celui-ci le reçoit correctement, mais dès que j'appelle quit() par exemple : crash ! Et ça fait ça pour toutes les méthodes, dès que j'accède à une quelconque méthode du pointeur le programme crash.
C'est comme si je faisais :
Le plugin n'arrive vraisemblablement pas à accéder à la zone mémoire où pointe ce pointeur. Vous aurez compris que je ne peux pas faire de copie de l'objet, ça n'aurait aucun intérêt ! Vu que je veux envoyer une référence (enfin un pointeur qui fait référence xD) au système du programme, et bien sûr il ne peut en avoir qu'un seul.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 System *system; // Création d'un pointeur sans initialisation => pointe n'importe où en mémoire system->quit(); // Crash !!
Voici le code source du programme de test, synthétisé :
main.cpp
System.h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 QPluginLoader pluginLoader("libplugin.so"); QObject *plugin = pluginLoader.instance(); PluginInterface *pluginInterface = qobject_cast<PluginInterface*>(plugin); System *system = new System; // Création du pointeur sur système pluginInterface->setSystem(system); // Transmission du pointeur au plugin system->moo(); // Affichage (dans un QMessageBox) du message qui est contenu en attribut de la classe System et modifié par le plugin
System.cpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 class System : public QObject { Q_OBJECT public: System(); void setMsg(QString); void moo(); private: QString _msg; };
PluginInterface.h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 System::System() { _msg = "Appelle de la méthode System réussie."; // Message par défaut } void System::moo() { QMessageBox::information(NULL, "System::moo()", _msg); } void System::setMsg(QString msg) { _msg = msg; }
Plugin.h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 class PluginInterface { public: virtual ~PluginInterface(){} virtual void setSystem(System*) = 0; }; Q_DECLARE_INTERFACE(PluginInterface, "PluginInterface");
Plugin.cpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 class Plugin : public QObject, PluginInterface { Q_OBJECT Q_INTERFACES(PluginInterface) public: void setSystem(System*); };
Voilà, j'espère avoir était le plus simple, bref et clair. J'ajouterais que je suis sous Ubuntu 9.10 32bits avec Qt 4.5.3.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 void Plugin::setSystem(System *system) { system->setMsg("Changed!!!"); } Q_EXPORT_PLUGIN2(plugin, Plugin);
Merci beaucoup d'avance de votre aide, ce problème m'est très ennuyeux car si je n'arrive pas à le résoudre, mon projet ne pourra plus continuer.
Partager