Bonjour,
J'ai un programme C++ qui charge dynamiquement des dll. Les dll sont des plugins pour mon application qui peuvent être développés séparément. Lorsque l'application principale est lancée, tous les plugins sont chargés à partir d'un répertoire connu (ex. /bin/plugins).
Dans le programme principale, j'utilise une classe "factory" pour créer des objets. La "factory" est aussi un "singleton". Voici le code de cette classe:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
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 #ifndef _SOLUTION_FACTORY_H #define _SOLUTION_FACTORY_H #include <string> using std::string; class mscSolution; class mscUniverse; class SolutionFactory { public: static SolutionFactory* getInstance(); mscSolution* createSolution(mscUniverse* u); void setActiveModel(string& model){this->activeModel=model;} protected: SolutionFactory(); static SolutionFactory* _instance; string activeModel; }; #endifLe premier appel à SolutionFactory se fait à partir de l'application principale et les appels qui suivent se font dans un plugin une fois la dll correspondante est chargée. Les appels se font de la façon suivante:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
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 #include "SolutionFactory.h" #include "CCSolution.h" #include "BCSolution.h" SolutionFactory* SolutionFactory::_instance = NULL; //_______________________________________________________________________________________ SolutionFactory* SolutionFactory::getInstance() { if(_instance == NULL) { std::cout << "SolutionFactory instance created" << std::endl; _instance = new SolutionFactory(); } else { std::cout << "instance exists, activeMode = " << _instance->activeModel << std::endl; } return _instance; } //_______________________________________________________________________________________ mscSolution* SolutionFactory::createSolution(mscUniverse* u) { if(activeModel == CCSolution::name) return new CCSolution(u); else if(activeModel == BCSolution::name) return new BCSolution(u); std::cerr << "The solution model " << activeModel << " was not found" << std::endl; return NULL; } //_______________________________________________________________________________________ SolutionFactory::SolutionFactory() { this->activeModel = "INVALID"; }
Suite au premier appel, qui est fait à partir de l'application principale, la sortie est la suivante:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 SolutionFactory::getInstance()->createSolution(universe);
Par la suite, le plugin est chargé et deux appels sont effectués à SolutionFactoryde la même façon. La sortie cette fois est:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 SolutionFactory instance created
Apparemment, la variable statique _instance n'est pas visible au plugin qui est chargé dynamiquement à partir d'une dll et une deuxième copie de _instance est crée lorsque le "singleton" est appelé à partir du plugin.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 SolutionFactory instance created The solution model INVALID was not found instance exists, activeMode = INVALID The solution model INVALID was not found instance exists, activeMode = INVALID
PS: Je compile avec visual c++.
J'ai essayé le même code avec gcc et tout semble fonctionner correctement !!
Est ce c'est un problème dans visual studio ? y a t-il un moyen de le contourner ?
Merci !
Partager