Klasse in DLL wirft Exception
-
Hallo,
hoffe ich bin hier richtig.
Ich habe in C++ (MS Visual Studio 2005) eine Klasse geschrieben, von der ich in meinem Programm noch eine Klasse ableite. Wenn ich die .hpp und .cpp Dateien der Basisklasse direkt in meinem Programm verwende, funktioniert alles.Wenn ich jedoch meine Basisklasse in eine DLL stecke und diese DLL dann in meinem Programm verwende, wird bei gleichem Quellcode der Klassen beim erzeugen eines neuen Objekts eine std::bad_alloc Exception geworfen. Dies geschieht z.B., wenn ich ein Objekt meiner abgeleiteten Klasse erstellen möchte.
Das DLL erstellen hat eigentlich alles geklappt, habe alles mit __declspec(dllexport) bzw. dllimport gekennzeichnet etc.
Vllt. noch wichtig: meine Basisklasse kapselt ein std::string Objekt.Hoffe ihr könnt jetzt schon etwas sagen, ansonsten poste ich ein paar Codeausschnitte (wie gesagt, eigentlich kann am Quellcode der Klassen nichts falsch sein, da das Programm funktioniert wenn ich den Originalcode verwende anstelle der DLL).
-
Wenn Du Klassen oder Allokationen über EXE/DLL-Grenzen hinweg machst, so musst Du die DLL-Version der CRT verwenden!!!
Du linkst vermutlich statisch! Das geht dann nicht mehr!Linke gegen die DLL-Version der CRT, dann sollte es keine Probleme mehr geben.
Also das *Gegenteil* von dem hier machen:
http://www.kalmbach-software.de/screencasts/VC2008EE-StaticLinkCRT/
-
Hi,
ich habe das mal versucht, aber es hat auch nichts gebracht. Habe in meinen Projekteigenschaften der DLL unter Laufzeitbibliothek angegeben: Multithreaded DLL (das Gegenteil von dem im Video) und habe es einmal mit Common Language Runtime Unterstützung und einmal ohne versucht, aber es kam bei beidem wieder die Exception wenn ich meine DLL in dem anderen Programm benutzen will.Habe das ganze mal debuggt und bin auf folgenden Verlauf gestoßen:
Ich rufe throw AbgeleiteteKlasse() auf. Das funktioniert (die abgeleitete Klasse liegt als Quellcode vor). Komischerweise springt er dabei in den Konstruktor der abgeleiteten Klasse, wo ich den Konstruktor der Basisklasse aufrufe und das funktioniert reibungslos. Aber danach kommt an verschiedensten Stellen eine Fehlermeldung. Manchmal (wenn ich in einzel Schritten durch das Programm wander) sagt mir der Debugger am Ende des throw-Teils, dass für die aktuelle Position kein Quellcode verfügbar ist oder er wirft mir eine Exception (wenn ich mit Prozedurschritten durchwander) wenn er im catch-Zweig gelandet ist, mit folgendem Inhalt:Unbehandelte Ausnahme bei 0x6bb117fd (msvcp80d.dll) in DB-Ansteuerung.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0x1800912c.
Irgendwie alles unverständlich...
-
Keiner eine Idee was ich falsch gemacht haben könnte?
-
Der Typ kann offesnsichtlich nicht aufgelöst werden.
Es gibt X-Diskussion über C++ Exception über DLL Grenzen hinweg!
Fazit ist immer, lass es bleiben.
Warum willst Du das?Dass es geht zeigt die MFC, die auch in der MFC-DLL Exceptions wirft, die auch in der EXE gefangen werden könne. Wichtig ist hier, dass die Klasse die geworfen wird auch in der DLL existiert und exportiert wurde.
Andernfalls kann IMHO der Typ nicht korrekt aufgelöst werden.
-
Hi,
ich werfe in der DLL selbst keine Exception.
In der DLL steckt nur meine selbstgeschriebene Klasse für Exceptions.
Geworfen werden die Exceptions nur in meinem Hauptprogramm. Und da macht es doch keinen Unterschied, ob ich ein Objekt dieser Exceptionklasse über throw erstelle oder ob ich es von Hand machen würde (was in diesem Fall keinen Sinn macht, aber nur mal so allgemein).
Habe mal getestet, ob es an der abgeleiteten Klasse in meinem Hauptprogramm liegt und nur Basisklassenobjekte erzeugt, aber er wirft immer noch Exceptions.
Das komische ist auch, dass der Debugger immer in einem anderen Codeabschnitt hängen bleibt, nur halt immer in der msvcr80.dll.
Habe auch mal getestet, was passiert, wenn ich ganz normal in meinem Programm ein Objekt der Klasse aus der DLL erstelle und dann mal eine Methode aufrufen will. Es passiert genau das gleiche. Er unterbricht, der Debugger zeigt auf eine Stelle im Quellcode der Bibliothek (diesmal: memcpy.asm, ich rufe aber nirgendwo memcpy selbst auf) und er meldet wieder das gleiche wie oben schon geschrieben.
Könnte es daran liegen, dass ich in meiner Klasse std::string benutze und das dann Probleme macht?