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').

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
Pour info, j'ai créé aussi un .DEF pour avoir des noms de fonctions non-décorées dans la DLL.

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.