Bonjour,
tout d'abord merci pour ce forum. Je tiens à préciser que j'ai longtemps cherché (forum, google, collègues) avant de poser la question sur ce forum.
Mon but est le suivant:
J'ai une classe (disons MB) qui exportée dans une DLL. Dans un EXE appelant cette DLL, je souhaiterais charger dynamiquement cette DLL (je veux la charger au runtime càd 'LoadLibrary' et 'GetProcAddress', et non pas au loadtime). J'ai déjà fait des trucs similaires dans le passé mais là, la classe MB contient des méthodes statiques et c'est là où ca coince !
En détail:
Voici le header de la classe MB, qui est aussi inclus dans le projet générant l'EXE. (Lors de la compilation de la DLL, on a défini 'MB_EXPORTS'. Et dans le projet de l'EXE, on définit 'MB_IMPORT_LIB').
Pour info, j'ai créé aussi un .DEF pour avoir des noms de fonctions non-décorées dans la DLL.
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 #ifndef _MB_H_ #define _MB_H_ #ifdef MB_EXPORTS #define MB_API __declspec(dllexport) #else #ifdef MB_IMPORT_LIB #define MB_API __declspec(dllimport) #else #define MB_API #endif #endif MB_API class MB { public : /// Empty constructor. MUST NOT BE USED outside MB(); /// Destructor MUST NOT BE USED outside virtual ~MB(); /// assignment operator. NOT TO BE USED OUTSIDE MB& operator=(const MB& MB_API); ///methode statique de chargement d'une sous DLL MB_API static int MB_LoadSubDll(const char* DllFile); /// Initialise MB from config file MB_API int MB_init(const char* Filename); private : // Structure containing all private data for this class struct PrivateData; PrivateData* pd; }; /// Empty constructor. This one can be used outside MB_API MB* MB_Ctor(void); /// Destructor. This one can be used outside MB_API void MB_Dtor(MB* mb); #endif
J'ai donc fait un créateur 'MB_Ctor' (il parait que c'est un constructeur, mais en dehors de la classe), j'ai exporté les méthodes et la classe.
- J'ai essayé de faire une classe Interface avec des fonctions virtuelles: mais on ne peut pas faire de fonctions virtuelles statiques.
- J'ai essayé la méthode du 'static_cast< >', mais je n'arrive pas définir les types de fonctions...
Mes contraintes:
je peux rajouter de nouvelles interfaces à la DLL, mais je ne peux pas modifier la signature des méthodes actuelles. A part ca, je peux a peu près faire tout ce que je veux.
J'espère que je me suis exprimé clairement ! Alors j'attends vos réponses.
Partager