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 :

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 !!
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.

Voici le code source du programme de test, synthétisé :

main.cpp

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.h

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;
};
System.cpp

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; }
PluginInterface.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.h

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*);
};
Plugin.cpp

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);
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.

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 .