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:
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:
typedef EZ_IModule *(*EntryPointfuncPtr)();
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"):
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:
1 2
|
bool setNext(EZ_IModule &) |
Quelqu'un pourrait il m'aider a y voir un peu plus clair ? Merci d'avance
Partager