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;
};
 
#endif
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";
}
Le 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
 
SolutionFactory::getInstance()->createSolution(universe);
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 instance created
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
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
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.

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 !