Variable statique dupliquée suite au chargement d'une dll avec visual c++
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:
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:
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:
1 2
|
SolutionFactory::getInstance()->createSolution(universe); |
Suite au premier appel, qui est fait à partir de l'application principale, la sortie est la suivante:
Code:
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:
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 !