2011-09-20 14 views
5

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; 
    } 
} 
+2

Tutti i moduli utilizzano la stessa istanza del runtime msvc? –

+2

Non lo sono e questo è il problema. –

+0

@Brian Hai catturato tutti i gestori nella DLL? Possiamo vedere un esempio di uno di questi gestori che non cattura un'eccezione. –

risposta

1

Non si può fare di eredità versioni del compilatore trasversali del genere. Funziona quasi ma eccezioni e poche altre cose impazziscono.

+1

ed è per questo che Dico sempre che se la tua DLL vivrà a lungo, dovresti limitare l'interfaccia pubblica a C, non a C++. – rodrigo

+1

Il problema qui non è nell'interfaccia. Il problema è che le eccezioni _internal alla DLL_ sono causali il programma si interrompe prima che le eccezioni vengano catturate. Le eccezioni non intendono attraversare il limite della DLL, devono essere lanciate e catturate interamente all'interno del codice DLL. – Brian

+0

Il problema è che la compatibilità ABI è stata interrotta in un modo che confonde il runtime. – Joshua

Problemi correlati