Exceptions in DLL's
-
Hoffe das ich hier richtig bin, ansonsten bitte verschieben !!!
THXMein Programm besteht aus einer Exe, eine statischen DLL (der Kernel)
und einigen dynamisch geladenen DLL's.
Also, i schmeisse in meinem Programm eine Exception (mit throw)
Dies geschiet in einer dynamisch geladenen DLL.Teilweise Pseudocode
// in der Exe
main { try { // Kernel ist eine Klasse der statischen DLL (exportiert) Kernel Test; // lädt eine dll dynamisch und erhält aus der DLL einen Pointer auf eine Klasse Interface // Interface ist abgeleitet aus der Klasse BaseInterface aus der statischen Kernel.dll Test.LoadClass("bla.dll", "Interface"); // Interface ist der einfachhalthalber mal ein direkter Zugriff auf den KlassenPointer // CallFunc ist eine virtuelle Methode von BaseInterface, überladen von Interface // in CallFunc mache ich // throw 5; Test.Interface->CallFunc(); } catch(int i) { // schön und gut message } return 0; }
So, wenn nun die Exception in CallFunc geworfen wird, dann zerstört er den Kernel(dynamische DLL's werden entladen),
geht dann in den catch block, gibt ne Message aus und wirft dann eine nicht aufgefangene
Exception in__DestructExceptionObject(EHExceptionRecord * pExcept=0x0012f800, unsigned char fThrowNotAllowed=0) + 0x32 C++
Unhandled exception at: xyxyxyxy
Access violationreading address:xxxxxxxxUnd ich weiss nicht wieso ?!!?!?
Wenn die Exception im Hauptprogramm oder im Kernel geworfen wird gibt es keine Probleme
Fall ich das ganze so aufbaue das die Konstruktion des Kernels nicht im try Block steht funktioniert auch alles wunderbar,
da er nicht zerstört und die DLL nicht entladen wird.Weiss jemand wie ich ohne Probleme denn nun eine Exception in der dynamischen DLL werfen kann ?
Ich kann meinem User schlecht verbieten die Kernel Kosntruktion in nen try Block zu nehmen ...
-
Exceptions in DLLs kannste knicken!
DLL's für C konzipiert!
du kannst nichtmal ne Klasse Exportieren!
In ner DLL kannst du nur das machen was C kann!Ich gebe zu ich hab nie probiert, was passiert, wenn man einfach eine exception wirft... aber ich bin mir sicher, das DLL's dafür nicht gedacht sind!
Also machs im C-Style Lass die funktion einfach ne int mit nem Fehlercode zurückgeben!!!
-
Exceptions in DLLs kannste knicken!
DLL's für C konzipiert!
du kannst nichtmal ne Klasse Exportieren!
In ner DLL kannst du nur das machen was C kann!Ich gebe zu ich hab nie probiert, was passiert, wenn man einfach eine exception wirft... aber ich bin mir sicher, das DLL's dafür nicht gedacht sind!
Also machs im C-Style Lass die funktion einfach ne int mit nem Fehlercode zurückgeben!!!
-
Original erstellt von Endy:
**
du kannst nichtmal ne Klasse Exportieren!
**Natürlich geht das!
-
Original erstellt von Nemesyzz:
Natürlich geht das!Aber wenn mich nicht alles taeuscht dann sind C++ dlls extrem inkompatibel zu anderen Compilern... da kocht jeder sein eigenes sueppchen...
-
Also solang die Exception die DLL nicht verlässt, geht alles gut.
Nur nach außen darf sie eben auf gar keinen Fall gelangen (so wie bei dir).
-
Nungut, bei mir kommt sie jetzt nach aussen, mit nem kleinen Trick, mit dem VC klappts, mit anderen Compilern hab ichs noch net getestet, sollte aber theoretisch auch klappen ... Is halt Scheisse das es sowas praktisches wie DLL's net für C++ gibt (i meine wirklich praktisch, also auch so schnell, net COM)
-
Original erstellt von ChaosAngel:
mit anderen Compilern hab ichs noch net getestet, sollte aber theoretisch auch klappenKann nicht gehen, wenn es eine Exception ist - da jeder Compiler exception anders handhabt!
Du hast den Sinn einer DLL nicht verstanden - eine DLL ist mit jeder Sprache ansprechbar, das ist der Sinn. Deshalb können einige Sprachspezifische Sachen halt nicht verwendet werden!
Du findest COM lahm? Naja...
-
dachte bis vor deinem Beitrag der sinn einer dll wäre die redundanz, also das selbe nicht öfter vorhanden ist.
eigentlich müsste das ganz normal möglich sein, wenn du z.B. mit Visual C++ eine DLL schreibst mit Exceptions drin und auch das "Ladeprogramm" in Visual C++ schreibst und dort die Exception abfängst. Das hab ich schonmal gemacht, das geht ohne irgendwelche Tricks. Wenn du das Ladeprogramm aber z.B. mit Borland C++ Builder oder jedem anderen beliebigen Compiler compilierst, wird das Exception fangen mit einem Absturtz enden
-
hmm, das Argument mit den verschiedenen Sprachen die keine Exceptions unterstützen ist gut ... aber diese Exceptions sind halt so verdammt praktisch !!!
Wie machen das denn Spiele wie Unreal etc... die geben im Falle eines Absturzes (Exception) sogar den gesamten Stack aus ...
Gab mal nen Topic darüber hier im Board, interessiert mich net wie sie den Stack ausgegeben haben, aber meines wissens arbeiten die doch auch mit DLL's ...
-
Vielleicht sind es ja garkeine echten Exceptions (nicht mit throw geworfen), aber auch wenn es welche sind, ist das bei spielen ja garkein problem, da die DLLs ja sowieso nur für das Spiel geeignet sind und für andere Programmierer nutzlos sind. Solange DLL und DLL-Benutzer mit dem selben Compiler compiliert wurden, gibt's ja keine Probleme.
-
Nunja, das ist bei mir die Engine zu einem Spiel ...
Allerdings soll die Engine danach auch noch weiter verwendet werden könnenWas benutzt man denn dann anstatt Exceptions ? If -Abfragen ? Ihhh
-
If-Schleifen :p
-
Gut, dann muss ich diesen Uralten Thread nochmal ausgraben ...
Schmeisst DirectX nicht auch Exceptions ??? Ich kenn mich damit nicht so gut aus, aber meiner Meinung nach basiert das doch auch auf DLL's. Und das DXSDK gibt nicht für verschiedene Compiler ...
-
Nein. IMO schmeißt DirectX keine C++-Exceptions.
Aber dabei gibts beim Borland compiler ja auch Probleme. In der Hilfe des SDK steht was man machen muss, damit Direct3D auch mit dem Borlandcompiler funktioniert.
-
Dazu hab ich in der Hilfe doch glatt was interessantes gefunden.
What compiler do I need for DirectShow development?
Any compiler capable of generating Component Object Model (COM) objects should work once the compiler's environment has been configured correctly. If you use a compiler other than Microsoft Visual C++, you might need to rebuild the base class libraries, because of differences between compilers.
Man muss also die libs neu compilieren ?
Dazu braucht man aber doch den SoureCode oder irre ich mich da ?
Und ist es normal das man bei einem Produkt (OpenSource oder nicht) es für jeden Compiler neu compiliert ? Ich glaube doch nicht Denn dann würde das Programm das z.B. mit dem BCB entwickelt wurde nur auf BCB libs laufen, und man könnte es ohne diese nicht weitergeben...
-
Also:
1. Exceptions sind C++ - Objekte, haben also nix mit API zu tun, weil API weiterhin reines C ist!
2. Jeder Compiler handelt Exceptions etwas anders, so dass alle Programme, die auf die DLL aufbauen, mit dem gleichen Compiler erstellt werden müssen.
3. DirectX ist COM, und COM wirft keine Exceptions im eigentlichen Sinne, sondern erstellt ein IErrorInfo-Objekt.
Fazit: Innerhalb einer DLL sollten alle von C++ erzeugten Exceptions abgefangen und durch Rückgabewerte oder/und inhaltliche Exceptionobjekte ersetzt werden!
-
Was hat denn API mit C zu tun ?!?!
Eine Api ist ein Application Programming Interface ...
Dieses kann 1. sowohl in C als auch C++ stehen und 2. auch Exceptions beinhalten ...PS: Wird bei dem IError Objekt denn dann auch der Stack unrolled ? Ich denke doch mal nicht !
Es gibt einfach Sachen wo man eine Exception schmeissen muss !!! *heul*
-
1. Da Dein Posting hier im WinAPI steht, bezog ich mich auf das WinAPI, ist das so daneben?
2. Eine Funktion, die einen Stack-Fehler verursacht, ist ganz einfach falsch programmiert. Und selbst wenn es aufgrund Stack-Speichermangels dazu kommen sollte, was nützt es, wenn Du dann folgendes lesen kannst:
0xab00cd34
0xde45gd21
.
.
.
-
Achja, nochwas:
Wenn es so notwendig wäre, unbedingt Exceptions in DLL's schmeissen zu müssen, hätte sich COM und ActiveX bis heute nicht durchsetzen können!
-
Nun werd mal nicht gleich sauer !
1. Das ist im WinApi Forum weil es hierhin verschoben wurde. Es gibt kein anderes Forum für DLL-spezifische Fragen.2. Hier hat keiner was von einem Stack Fehler gesagt, und ich will den Stack auch nicht auslesen ...
Exceptions haben den Vorteil das sie hinter sich aufräumen, das heist sie gehen solange rückwärts bis sie gefangen werden. Und auf dem Weg dorthin wird der Stack unrolled, also praktisch rückgängig gemacht was bis dahin passiert ist (Speichertechnisch, Destruktormässig)Und in einem simplen Beispiel ist es nötig.
Ich schreibe eine Engine, und meine DLL exportiert dafür mehrere Klassen.
Nun hat eine Klasse zum Beispiel den op-> überladen ...
Bar* Foo::operator->()
{
return m_pbar;
}Damit kann man von einem Foo Objekt auf sein Bar Objekt zugreifen
Falls m_pbar nun aber null ist endet so ein Zugriff immer in einer Katastrophe !Beispiel:
class Bar { public: void blupp() { // MembervariablenAccess } }; Foo a; a.m_pbar = NULL; // aus was für Gründen auch immer a->blupp(); // böses Aua
Und dort kann ich leider keinen Rückgabewert checken, deshalb muss ne Exception her ...
Naja, ich werd da schon nen Kompromiss finden, DLL's sind wohl einfach nichts für C++