Exceptions in Objekten welche in DLLS instantiert werden



  • Hallo,

    ich habe eine DLL in welcher ich ein Objekt einer selbstgeschriebenen Klasse instantiere.

    extern "C" __declspec(dllexport) long DLLFunction(String Var)
      {
      try
        {  
        MyClass * MyObj = new MyClass;
        // Eine Methode des Objektes wird aufgerufen
        MyObj->ObjFunction(Var);
      __finally
        {
        // HasError sollte = true sein wenn es Exceptions in Objektmethoden gab
        if (MyObj->HasError == true)
          {
          // Fehler werden in ein Logfile geschrieben
          WriteLogFile(MyObj->GetErrors());
          }
        delete MyObj;
        }
      }
    

    Die Methode "ObjFunction()" sieht wie folgt aus:

    bool MyClass::ObjFunction(String Var)
      {
      try
        {
        // hier steht Code (der Übersicht halber lasse ich ihn weg)
        return true;
        }
      catch (Exception &exception)
        {
        // Err Handler ist eine Private Methode des Objektes und speichert bis zu max. 10 
        // Fehler in einem Struct. Er sollte immer aufgerufen werden wenn eine Exception
        // ausgelöst wurde.
        ErrHandler(1002, exception.Message);
        HasError = true;
        return false;
        } 
      }
    

    Provoziere ich jetzt eine Exception in der Methode "MyFunction()" weißt mich der Builder mit einer Meldung darauf hin. Allerdings wird der "catch" Bereich der Methode NIE erreicht. D.h. es wird auch keine Errormeldung gespeichert.

    Führe ich das Programm direkt unter Windows aus wird der Benutzer über keine Exception informiert (wie gewüscht), allerdings wird auch nichts ins Logfile geschrieben, da wie gesagt der "catch" Bereich nie erreicht wird.

    Interresant ist, dass wenn ich ein Objekt der Klasse MyClass
    direkt in einem Programm instantiere, der "catch" Bereich angesprungen wird.

    Weiß jemand wodurch dieser Effeckt verursacht wird, und wie ich auch den in der DLL ausgeführten Code dazu bewegen kann die Exception korreckt zu verarbeiten?

    Danke!



  • Vielleicht wird keine Exception ausgelöst.



  • doch, ganz bestimmt!



  • Und die Exception ist vom typ "Exception"? Springt er auch nicht in ein - zum schluss gestelltes "catch (...)"?

    -junix



  • Also ich werfe selber keine eigenen Exceptions, sondern fange nur diejenigen ab, die von anderen Funktionen (Borland, System) geworfen werden.

    Ein Cach(...) hat auch nichts gebracht 😞



  • Und die Exception ist vom typ "Exception"? Springt er auch nicht in ein - zum schluss gestelltes "catch (...)"?

    meinst Du das so:

    try
    {
    }
    catch (Exception &exception)
    {
    }
    catch (...)
    {
    }
    

    ??



  • jau



  • Wie gesagt, wenn ich das Objekt in einer Anwendung instantiere ist es kein Problem. Dann funzt auch alles ohne "catch(...)". Nur aus wenn ich das Objekt in einer DLL instantiere geht es nicht. Auch nicht mit anschliessenden "catch(...)".

    Ist doch komisch, dass nicht in die Exceptionanweisung gesprungen wird ,nur weil alles in eiener DLL passiert..... 😕 😕 😕



  • Ich frag mich gerade, wie will ein Programm auf eine Exception reagieren können, welche in einem zu Laufzeit geladenem Modul (DLL) ausgelöst wird ? Das ganze try/catch Geraffel wird vom Compiler "erzeugt" und nicht zur Laufzeit des Programms 🙄



  • Das Programm soll nicht auf die Exception reagieren. Die DLL soll das tun!
    Wenn Fehler, dann soll die DLL diesen in ein Logfile schreiben. Das ist eigentlich alles.



  • Das Programm soll nicht auf die Exception reagieren. Die DLL soll das tun!

    Ach so, dann habe ich das wohl mißverstanden.
    Liegts vielleicht an irgendwelchen Compilereinstellungen ? Ansonsten würde ich mal eine Test-DLL und ein Testprojekt basteln um darin wild probieren zu können 😉



  • Ansonsten würde ich mal eine Test-DLL und ein Testprojekt basteln um darin wild probieren zu können

    ja, genau das habe ich auch gemacht.
    ich komm einfach nicht hinter woher dieses Verhalten kommt 😞
    *schnüff*



  • muss wohl n Borland Fehler oder so gewesen sein.
    Ich hab einfach nochmal den DLL Experten angeschmissen, die DLL-Funktionen per Paste/Kopie in die neue DLL Datei eingetragen und schon ging alles.

    Bleibt mir zu grübeln obs Borland war, oder ob ich im Entwicklungsprozess irgendetwas zerschossen hatte.

    Danke für die Hilfe!



  • Vielleicht wars doch ne Compilereinstellung die Du mit dem Neuerstellen wieder hergestellt hast 🙄



  • Peter,

    Peter schrieb:

    Das ganze try/catch Geraffel wird vom Compiler "erzeugt" und nicht zur Laufzeit des Programms

    was meinst Du damit? Was genau soll der Compiler da "erzeugen"?

    @Clip:
    Von String als Parameter-Typ in DLL's wird i.allg. abgeraten, da AnsiString ein proprietärer(Borland) Typ ist. Die Verwendung von "echten" c-Strings ist hier angebracht.

    extern "C" __declspec(dllexport) long DLLFunction(char* cstr)
    

    Und immer schön auf den buffer overflow aufpassen. Wir sind ja hier nicht bei Microsoft!


Log in to reply