MinGW: Exceptions und DLLs
-
Hi,
der MinGW hat ernsthafte Probleme, wenn man eine DLL baut und dort eine Exception wirft. Dann stuerzt das Programm naemlich ab.
Jetzt habe ich im Netz auch die Begruendung dafuer gelesen (in den statischen Runtime bibliothelen gibts globale Variablen, die furs Exceptionhandling notwendig sind, und im Falle von einer DLL gibt es halt zwei solcher Variablen: in der DLL und im Programm, so dass beim Fangen der Exception alles schief laeuft).
Nun soll es angeblich moeglich sein, die Runtime bibliotheken in DLLs umzuwandeln und so das Problem zu umgehen. Hat das mal jemand geschafft? - Ich bekomm naemlich immer unresolved externals.
-
Gegenfrage:
Wirft die DLL die Exception und soll die exe sie fangen?
Exceptions sollten IMMER in dem Modul bleiben in dem sie geworfen wurden.
-
Wenn die DLL die exception nach aussen laesst dann musst du RaiseException() verwenden.
-
@shade
Oha, Raisexception? Kann man das auch verwenden, wenn die Exception in der DLL bleibt? - Ich habe halt eine Klasse in ne DLL gepackt und die kann sowohl von der DLL selbst alsauch von aussen verwendet werden.@cd9000
Solange garantiert ist, dass die DLL nur von Programmen genutzt wird, die mit dem gleichen Compiler gebaut wurden (also ist die DLL eher privater Natur) Sehe ich keinen Grund fuer die Einschraenkung, warum eine Exception die DLL nicht verlassen darf.
-
Original erstellt von virtual:
**@shade
Oha, Raisexception? Kann man das auch verwenden, wenn die Exception in der DLL bleibt? - Ich habe halt eine Klasse in ne DLL gepackt und die kann sowohl von der DLL selbst alsauch von aussen verwendet werden.
**mhm... Koennen? keine Ahnung. tun wird mans nicht.
RaiseException() sagt dem OS dass du eine Exception wirfst, und das OS tut das dann fuer dich.
[/quote]
Solange garantiert ist, dass die DLL nur von Programmen genutzt wird, die mit dem gleichen Compiler gebaut wurden (also ist die DLL eher privater Natur) Sehe ich keinen Grund fuer die Einschraenkung, warum eine Exception die DLL nicht verlassen darf.[/QUOTE]
Stell dir mal vor, du updatest deinen Compiler. Willst du dann echt die dll neu kompilieren?was ist wenn du irgendwann mal DOCH einen anderen compiler verwenden willst?
Eine Exception hat, wie cd9000 schon sagte IN dem Modul zu bleiben. Denn Exceptions sind nicht standardisiert!
Wenn du eine nach aussen werfen willst nimm RaiseException()!
-
Ja, ich sehe das Problem. In meinem speziellen Programm kann ich jedoch garantieren, dass alles aus einem Guss kommt. Normalerweise hat man ja auch ohne Exceptions schon das Problem, dass das Namemangling nicht standardisiert ist, wenn man da Compiler(versionen) mischen will.
In letzter Konsequenz heisst das ja eh, dass man nur Funktionen mit C Linkage aus einer DLL exportiert, wenn man DLLs Compilerunabh. bauen will.