IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Globals & DLL


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 24
    Points : 10
    Points
    10
    Par défaut Globals & DLL
    Bonjour à tous,

    mon problème concerne un projet comprenant une application principale qui charge dynamiquement un ensemble de plugins (prenant la forme de DLL). En complément, j'ai factorisé dans une librairie DLL plusieurs classes utilisés à la fois par l'application elle-même et par les plugins. Cette librarie comprend entre autres une classe Globals, utilisant le design pattern Singleton ( décrit dans l'excellent article http://loulou.developpez.com/tutorie.../partie1/#L3.4)
    Cette classe stocke des données de divers types (Strings, enum,pointeurs vers des objets, ...) en membres, qui sont initialisés au démarrage de l'application. Je précise que j'accède à ces données en lecture seulement durant l'éxécution de l'application.

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
    	// ------------------------------------
    	// Compilé dans myLib.dll
    	//
    	// Runtime : multithread (debug) DLL
    	// ------------------------------------
    	#include "myObject.h"
     
    	class MY_API Globals : public Singleton<Globals>
    	{
    		friend class Singleton<Globals>;
     
    		public:
    			Globals();
    			~Globals();
     
     
    		int			m_nombre;
    		myObject*	mp_object;		// mis à null dans le constructeur
     
    		...
     
    	};
     
     
    	// ------------------------------------
    	// Compilé dans MyApplication.exe
    	// Link avec MyLib.dll
    	// ------------------------------------
    	class MyApplication
    	{
    		...
    		int			M_init();
    		Object*		mp_obj;			// mis à 0 dans le constructeur
    		...
     
    	};
     
    	MyApplication::~MyApplication()
    	{
    		delete mp_obj;
    	}
     
    	int MyApplication::M_init()
    	{
     
    		// > nombre
    		Globals::Instance().m_nombre = 1234;
    		// > obj
    		mp_obj = new Object();
    		Globals::Instance().mp_object = mp_obj; // objet détruit à la fin d'éxécution de l'appli
    		// > chargement des plugins
    		// La class plugin implémente une méthode virtuelle M_init()
    		Plugin* myPlugin = PluginManager.M_load("MyPlugin.dll");
    		myPlugin.M_init();
    	}
     
     
    	// ------------------------------------
    	// Compilé dans MyPlugin.dll
    	// Linké avec MyLib.dll
    	// ------------------------------------
    	include "Object.h"
    	include "Globals.h"
     
    	void myPlugin::M_init()
    	{
    		-> accès à Globals::Instance().mp_object qui vaut ici 0.
    	}
    Très clairement, deux instances différentes de Globals sont créées (d'une part par l'application, d'autre part par le plugin). Comment accéder au Globals de l'application?
    La solution (me semble-t-il) consisterait à passer aux plugins un pointeur vers l'instance Globals::Instance() depuis l'application. Or cette méthode me semble fastidieuse, surtout si je dispose d'un tas d'autres types d'objets embarqués dans la DLL qui auraient besoin d'utiliser les objets stockés dans Globals.
    Y'a-t-il un moyen plus élégant de réaliser ceci ?

    Merci !

  2. #2
    Membre averti Avatar de Higestromm
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    516
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 516
    Points : 412
    Points
    412
    Par défaut
    J'ai deja developper une application avec les memes contraintes que toi.

    En gros j'ai charger la librairie contenant les variables globales dans l'application et dans les différents plugins.

    Du coup ton prog et tes dll utilisent la même mémoire.
    J'aime pas les épinards... Mais alors pas du tout

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 24
    Points : 10
    Points
    10
    Par défaut
    Merci pour ta réponse !
    Si je comprends bien, l'idée serait donc de placer ma classe Globals dans une DLL 'isolée' (Globals.dll) et de linker depuis les plugins / exe à la compilation. L'allocation de l'instance / singleton se ferait une et une seule fois, les plugins + exe "voyant" alors cette même et unique instance ?

  4. #4
    Membre averti Avatar de Higestromm
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    516
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 516
    Points : 412
    Points
    412
    Par défaut
    En tout cas c'est comme ca que j ai fait et ca fonctionne très bien.
    J'aime pas les épinards... Mais alors pas du tout

Discussions similaires

  1. Variable globale à plusieurs dll C# asp.net
    Par poussinvert dans le forum ASP.NET MVC
    Réponses: 0
    Dernier message: 11/05/2013, 01h08
  2. Comment utiliser une variable globale de dll ?
    Par Chamatho dans le forum Langage
    Réponses: 14
    Dernier message: 29/11/2008, 21h22
  3. Dll et Variables Globales
    Par scelines dans le forum C++
    Réponses: 7
    Dernier message: 23/08/2005, 18h20
  4. [MFC] Variable global et DLL d'extension
    Par Capnader dans le forum MFC
    Réponses: 2
    Dernier message: 31/03/2005, 12h33
  5. [DLL] partage de variables globales
    Par tut dans le forum MFC
    Réponses: 5
    Dernier message: 29/02/2004, 11h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo