Sto lavorando a un'applicazione scritta in Visual Studio 6 (noto, FML) che sta chiamando le funzioni in una DLL utilizzando LoadLibrary
e GetProcAddress
. Il codice più recente non può essere compilato in VC6 e necessita di un compilatore più recente. La DLL ha alcune funzioni che costruiscono un oggetto C++, e quindi il programma VC6 usa l'oggetto attraverso una classe astratta.In che modo MSVC6 gestisce le eccezioni dalle funzioni "C" esterne?
Questo funziona bene di solito, ma si imbatte in problemi quando le funzioni recuperati da GetProcAddress
generano eccezioni - anche quando le eccezioni vengono catturati all'interno della DLL. Ho notato che questo non accade quando i metodi della classe astratta lanciano un'eccezione. Le cose funzionano normalmente in quel caso.
Cosa sto facendo di sbagliato qui? Come posso fare in modo che VC6 generi codice per gestire correttamente le eccezioni?
Edit: Ecco un esempio di una funzione che fa sì che il crash del programma:
extern "C" __declspec(dllexport) Box* getBox(const char* addr)
{
try {
return createBox(addr);
} catch (std::exception& ex) {
LOG_ERROR("Open failed: " << ex.what());
return 0;
} catch (...) {
LOG_ERROR("Error while opening.");
return 0;
}
}
Tutti i moduli utilizzano la stessa istanza del runtime msvc? –
Non lo sono e questo è il problema. –
@Brian Hai catturato tutti i gestori nella DLL? Possiamo vedere un esempio di uno di questi gestori che non cattura un'eccezione. –