Exceptions in DLL's



  • 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++ 😞



  • Unter COM wird direkter Zugriff auf Membervariablen untersagt. Man muss innerhalb der Memberfunktionen halt abfangen, ob der Zugriff überhaupt gültig ist.
    Wenn Du DLLs programmieren willst, musst Du Dir einen anderen Programmierstil angewöhnen. Vor allem direkter Pointerzugriff, da ist es nicht mehr weit her mit Threadsynchronisation



  • ARGH
    Ich programmiere nicht so !
    Das mit dem Memberzugriff war doch nur dafür da um ein Beispiel zu liefern !!!

    Der Pointer wird erst initialisiert wenn eine DLL geladen wird. Dies geschieht dynamisch. Deshalb sollte der User vorher nicht den op-> verwenden. Falls er dies doch tut kann ich dies nur innerhalb des -> Aufrufes abfangen, und da kann ich schlecht mit Returnwert Rückgabe arbeiten, da hilft nur eine Exception !


Anmelden zum Antworten