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