Exceptions von einer dll zu einer exe werfen



  • Hallo,
    weiß einer wie das geht?
    In der dll ist die Exception wie folgt definiert:

    extern "C" _declspec(dllexport) class CMyException : public CException {
    		AFX_MANAGE_STATE(AfxGetStaticModuleState());
        public:
            CMyException() { }
            virtual ~CMyException() { }
    };
    
    throw new CMyException;
    

    geht auch noch.
    Aber wie importiere ich das in der exe?
    Wenn in der MyExe.h

    extern "C"__declspec(dllimport) void CMyException();
    

    drinsteht, geht zwar das Compilieren gut, aber die Exception wird nicht bis zur exe geworfen bzw. kommt dort nicht an.

    Und wenn ich in der MyDll.def noch

    EXPORTS
    CMyException
    

    habe, dann sagt der Linker, dass er das externe Symbol CMyException nicht auflösen kann.

    Irgendwer eine Idee?
    Oder sollte ich lieber eine Windows-API-Exception werfen bzw zuerst definieren (geht ds überhaupt) und dann werfen?



  • Du musst die Exception Klasse nicht exportieren um sie ausserhalb fangen zu können (kannst ja über CException* fangen).

    Und:
    Bei extern "C" Funktionen geht der Compiler davon aus dass diese keine Exceptions werfen. Entweder stellst du den passenden Compiler-Switch um so dass bei allen Funktionen Exceptions erwartet werden (IMO nicht sinnvoll, weil unnötiger Overhead), oder du entfernst das extern "C", oder du rufst die Funktion über einen Funktionszeiger auf, oder ...


  • Mod

    IMHO Weitere Vorraussetzungen
    - Nicht statisch gelinkt weder CRT noch MFC,
    - garantiert selbe CRT und MFC Version in beiden Modulen



  • Ich hab jetzt das mit dem Compiler-Switch ausprobiert und das geht: also einfach "GX-" sagen. Danke. Wegen den aderen Sachen: Danke für die Hinweise, damit werde ich mich wohl die nächsten Tage mal beschäftigen müssen.



  • Sorry für Doppelpost.

    Ich bin jetzt wieder weggegeangen von einer eigenen Fehlerklasse.
    In der Dll mach ich jetzt z.B.

    AfxThrowFileException(2, -1,"bla.txt");
    

    Ich kann auch eine CException fangen, aber wenn ich die dll als Release compiliere, fang ich nur eine CException, wo nix mehr drin steht. Ich benötige aber noch die Information, dass das eine CFileException mit FileNotFound (also die "2" im obigen Aufruf) ist. Ich vermute es liegt an einem Compilerswitch. Irgendwer eine Idee? Und die Sprache ist vc++6.

    Danke schon im Vorraus für die Anregungen.



  • Wenn du Release und Debug Versionen zu mischen versuchst könnte sowas passieren. Hatte zwar noch nie genau den Fall, aber schon viele andere Probleme, inklusive Abstürze etc.
    Ideal ist daher auch wenn du die Binaries der Release und Debug Versionen gleich mal unterschiedlich nennst, dann kann kaum mehr was schief gehen.



  • Danke, das mit der CException furktioniert jetzt.


Anmelden zum Antworten