Bonjour tout le monde
J'ai un petit soucis concernant des DLL, donc, et des pointeurs ou references.
J'ai un programme qui doit loader des DLL crees par n'importe qui, mais qui respectent un modele de conception (donc, une interface avec virtuelles).

Dans cette DLL, j'ai une fonction GetInstance() qui me renvoit un pointeur vers un objet creer par cette DLL:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
extern "C"	EXPORT EZ_IModule  *getInstance() // EXPORT est define comme un __declspec(dllexport)
{
	return new Module;
}
Et dans le programme de base, je load la librairie, je choppe l'adresse en memoire du point d'entree, et j'essaye d'appeler une fonction de cet objet:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
typedef EZ_IModule *(*EntryPointfuncPtr)();
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
 
list<EZ_IModule *>	modulesIN;
list<EZ_IModule *>	modulesPROCEED;
list<EZ_IModule *>	modulesOUT;
 
list<HINSTANCE>	libInstances;
HINSTANCE		dll;
EntryPointfuncPtr LibMainEntryPoint;
 
if (dll = LoadLibrary(TEXT(line.c_str())))
{
	libInstances.push_back(dll);
	LibMainEntryPoint = (EntryPointfuncPtr)GetProcAddress(dll, TEXT("getInstance"));
	if (LibMainEntryPoint)
	{
		EZ_IModule *imod;
		imod = LibMainEntryPoint();
		cerr << imod->getModuleName() << endl;
	}
	else
		FreeLibrary(dll);
}
Lorsque je lance le programme, au moment ou il fait appel a la methode getModuleName, j'ai un bel "Unhandled win32 exception"...
Ce que j'ai pu en voir ? Que je ne maitrise pas vraiment les references, et que malgre les cours, non, ca reste hors de ma portee...
De plus, si je passe outre le bug du getModuleName et que j'essaye de continuer le programme en repoussant a plus tard le bug (c'est le mal, je sais ), je fais ca (code qui vient se placer juste apres avoir declare le "imod"):

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
 
if (LibMainEntryPoint)
{
	EZ_IModule *imod;
	imod = LibMainEntryPoint();
	cerr << imod->getModuleName() << endl;
	switch (imod->getModuleLevel()){
		case(EZ_IModule::EZ_IN):
			if (modulesIN.back())
				modulesIN.back()->setNext(imod);
			modulesIN.push_back(imod);
			break;
		case (EZ_IModule::EZ_OUT):
			if (modulesOUT.back())
				modulesOUT.back()->setNext(imod);
			modulesOUT.push_back(imod);
			break;
		case (EZ_IModule::EZ_PROCEED):
			if (modulesPROCEED.back())
				modulesPROCEED.back()->setNext(imod);
			modulesPROCEED.push_back(imod);
			break;
	}
}
Mais le compilateur n'apprecie vraiment pas le passage pour la methode setNext, dont voici le prototype:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
bool                    setNext(EZ_IModule &)
Quelqu'un pourrait il m'aider a y voir un peu plus clair ? Merci d'avance