Je dois charger des modules en tant que DLL dynamiquement au moment de l'exécution car ils ne sont pas connus à l'avance, juste qu'ils se conforment à une interface de classe. Ce que j'ai remarqué c'est qu'après avoir attrapé une exception lancée par la DLL (dans le programme principal du thread principal), les bons destructeurs sont appelés et les modules détruits et dll déchargés, mais alors comme} à la fin du bloc catch est atteint par le débogueur Visual Studio C++ lors de l'étape ligne par ligne, j'obtiens une autre exception qui bloque le programme avecViolation d'accès après avoir intercepté l'exception dll
Exception de première chance à 0x68ad2377 (msvcr90d.dll) dans xxxxx.exe: 0xC0000005: Emplacement de lecture de violation d'accès 0x02958f14 .
Si j'ENABLE casser des exceptions, brisant cette deuxième exception montre l'emplacement que
msvcr90d.dll! __ DestructExceptionObject (EHExceptionRecord * pExcept = 0x0017ee4c, unsigned char fThrowNotAllowed = 0) Ligne 1803 + 0xf octets
mais il semble que la pile de cadres soit corrompue. Je ne peux pas comprendre pourquoi cette exception est levée.
Une version simplifiée de ma structure de code est le suivant:
Une structure très simplifiée du programme:
//shared header:
class Module
{
public:
virtual void Foo(void) = 0;
};
//dll:
class SomeSpecificModule : public Module
{
public:
virtual void Foo(void);
};
void SomeSpecificModule::Foo(void)
{
throw 1;
}
extern "C" __declspec(dllexport) Module* GetModule()
{
return new SomeSpecificModule;
}
//program:
typedef ptrGetModule* (*GetModule)();
int main(void)
{
HANDLE hMod = LoadLibrary("SomeSpecificModule.dll");
ptrGetModule GetModule = (ptrGetModule)GetProcAddress(hMod, "GetModule");
try
{
Module *d = GetModule();
d->Foo();
}
catch (...)
{
cout << '!' << endl;
}
return 0;
}
Veuillez poster toute la trace de la pile –