Undefiniertes Verhalten beim benutzen einer Funktion aus eine DLL



  • Hallo,
    ich möchte eine DLL verwenden. Habe nun ein merkwürdiges Verhalten. Binde ich den Code direkt zum Programm ist alles ok, nehme ich den Code aus einer DLL gibt es diverse Effekte. Beim beenden des Programms beleibt der Builder im Debugger hängen. Es gibt keine Fehlermeldung, aber der Debugger beendet sich einfach nicht.
    Zweiter (sichtbarer) Effekt. Das Icon der Mainform ist jetzt ein kleines weisses Fenster statt des roten Borland Icons. Habe die DLL soweit abgespeckt, das nur eine simplefunktion drin ist. Aber auch hier ist das Problem.

    int TTestclass::GetValue()
    {
       return 1;
    }
    

    Header:

    #ifdef DLLGEN
    #define mode __export
    #else
    #define mode __import
    #endif
    
    //---------------------------------------------------------------------------
    class mode TTestclass
    {
    private:
    
    protected:
    
    public:
       int GetValue();
    };
    

    DLL ist mit RTL und Laufzeitpackage kompiliert. MEMMGR.LIB haber ich hinzugefügt. DLL wird nicht mit LoadLibrary geladen, sondern dynamisch.

    Problem tritt nur auf, wenn ich den Haken "VCL verwenden" in der DLL anmache. Eine VCL freie DLL macht das nicht....

    Kennt jemand das Problem? Ich weiss nicht mehr wo ich suchen soll.....

    Gruss

    Jörn



  • So,
    habe noch etwas weiter geforscht. Problem tritt nicht auf, wenn ich den Header der DLL im EXE ohne __import verwende (bzw. das __export stehen lasse). Programm funktioniert dann wundersamer weise problemlos.....

    Da es ohne großen Aufwand nachzuvollziehen ist, wundert es mich das dieses Problem noch bei niemandem aufgetreten ist. Eine aufwändige Internet Recherche brachte nicht ansatzweise was in diese Richtung...

    Jörn



  • Wenn du alle involvierten Projektdateien bereitstellen kannst, schaue ich mir das an.



  • California schrieb:

    Problem tritt nicht auf, wenn ich den Header der DLL im EXE ohne __import verwende (bzw. das __export stehen lasse). Programm funktioniert dann wundersamer weise problemlos.....wundert es mich das dieses Problem noch bei niemandem aufgetreten ist.

    Warum sollte das bei wem aufgetreten sein? 😕 Funktionen werden von einer DLL exportiert und von der die DLL nutzenden Anwendung geeignet importiert. 🤡 Für den Import eignet sich am besten eine Import-Library (LIB) ohne weitere Eintragungen in einer Header-Datei der Anwendung.



  • Hallo Audacia,
    Danke für das Angebot. Habe das Beispielprojekt hier mal zum Download verlinkt : http://pogotogo.npage.de/

    Benutzt ist Builder XE

    Wie man sieht geht das rote Embarcadero Icon verloren wenn ich die Funktion aus der DLL verwende. Wenn ich die Funktion nicht aufrufe, ist das Icon da.
    Wenn ich im Header der DLL '__export' stehen lasse wenn ich den Header von der EXE verwende, scheint es auch zu gehen.

    @berniebutt
    was ich meinte, das dies so auffällig ist und schon mit der ersten implementierten Funktion auftritt, das es mich wundert das zu dem Thema nichts zu finden war.

    Jörn



  • California schrieb:

    habe noch etwas weiter geforscht. Problem tritt nicht auf, wenn ich den Header der DLL im EXE ohne __import verwende (bzw. das __export stehen lasse). Programm funktioniert dann wundersamer weise problemlos.....

    Das liegt daran, daß du die Funktion im Header definiert hast. Die DLL-Funktion wird überhaupt nicht aufgerufen.

    Dein Debugging-Problem kann ich mit C++Builder XE nicht reproduzieren. Das Anwendungsicon allerdings hängt tatsächlich davon ab, ob die DLL eingebunden wird oder nicht. Seltsam - sowas habe ich noch nicht gesehen, und ich arbeite eigentlich häufiger mit DLLs in meinen Anwendungen...



  • Hallo,
    Danke für Deine Mühe. Wie gesagt ist das mit dem Icon nur eine Erscheinung die mir aufgefallen ist und mir seltsam vorkam, weil im gleichen Zuge die Anwendung beim beenden hängen blieb (nicht diese Demoanwendung). Kam mir auch seltsam vor das es niemand vorher bemerkt hat, weil es ja wirklich der minimalste Code in einer DLL ist und es eigentlich ja bei jedem der eine VCL DLL baut auftreten muss.

    Gruss

    Jörn


Anmelden zum Antworten