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.
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?
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. }
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 !
Partager