AFX_EXT_CLASS



  • Hallo,
    normalerweise stellt man ja Fragen warum etwas nicht geht, hier allerdings suche ich eine Erklärung warum folgendes funktionert 😋 :

    Gegeben sind zwei MFC Erweiterungs DLLs.
    DLL2 importiert Klassen aus DLL1
    Die Klassen aus DLL1 werden mit AFX_EXT_CLASS exportiert
    DLL2 exportiert ebenfalls Klassen mit AFX_EXT_CLASS

    Folgende Konstellation:

    class AFX_EXT_CLASS CDLL_1  
    {
    public:
    	CDLL_1();
    	virtual ~CDLL_1();
    
    };
    
    // ... neuer Header .../
    
    #include "../dll1/dll_1.h"
    
    class AFX_EXT_CLASS CDLL_2  
    {
    public:
    	CDLL_2();
    	virtual ~CDLL_2();
    
    	CDLL_1		m_DLL;
    };
    

    DLL2 müsste CDLL_1 importieren. Da die Klasse aus DLL1 allerdings auch mit dem Makro AFX_EXT_CLASS deklariert ist und beides MFC-Erweiterungs Dlls sind, müsste das Makro als export aufgelöst werden? Warum meckert der Compiler nicht bzw. wo liegt mein Denkfehler?

    Gruß
    foo



  • foodax schrieb:

    DLL2 müsste CDLL_1 importieren. Da die Klasse aus DLL1 allerdings auch mit dem Makro AFX_EXT_CLASS deklariert ist und beides MFC-Erweiterungs Dlls sind, müsste das Makro als export aufgelöst werden?

    Schau mal folgendes an:

    MSDN schrieb:

    Dieses Makro wird von MFC bei der Definition der Präprozessorsymbole _AFXDLL und _AFXEXT als __declspec(dllexport) definiert. Wird jedoch _AFXDLL definiert und _AFXEXT nicht, wird das Makro als __declspec(dllimport) definiert. Wenn das Präprozessorsymbol _AFXDLL definiert ist, gibt es an, dass die gemeinsam genutzte MFC-Version von der ausführbaren Zieldatei (entweder eine DLL oder eine Anwendung) verwendet wird. Die Definition sowohl von _AFXDLL als auch von _AFXEXT deutet darauf hin, dass die ausführbare Zieldatei eine Erweiterungs-DLL ist.

    Aus Sicht der DLL1 ist das ein Export, nämlich nach DLL2. Alternativ kannst du ja mal AFX_EXT_CLASS gegen __declspec(dllimport) austauschen und dann dürfte der Kompiler meckern.



  • AndyDD schrieb:

    Aus Sicht der DLL1 ist das ein Export, nämlich nach DLL2.

    DLL2 inkludiert den Header aus DLL1 und trifft ebenso auf AFX_EXT_CLASS.
    Da DLL2 auch eine MFC Erweiterungs DLL ist und dieselben Präprozessor Defines hat die AFX_EXT_CLASS beeinflussen, müsste die Klasse exportiert werden.
    Es wird aber offensichtlich korrekt importiert.

    Gruß
    foo



  • Also ich bin der Meinung, dass das Macro

    foodax schrieb:

    AndyDD schrieb:

    Aus Sicht der DLL1 ist das ein Export, nämlich nach DLL2.

    DLL2 inkludiert den Header aus DLL1 und trifft ebenso auf AFX_EXT_CLASS.
    Da DLL2 auch eine MFC Erweiterungs DLL ist und dieselben Präprozessor Defines hat die AFX_EXT_CLASS beeinflussen, müsste die Klasse exportiert werden.
    Es wird aber offensichtlich korrekt importiert.

    Gruß
    foo

    Naja, das hab ich doch geschrieben. Aus Sicht der DLL1 ist das ein Export, gesehen in der DLL2 natürlich ein Import. Ansonsten verstehe ich dein Problem nicht so ganz.


  • Mod

    Das ist nur ein Hinweis für den Compiler.
    Aber der Linker erkennt, dass die Symbole alle vorhanden sind, bzw. er erkennt, dass die Symbole aus einer anderem Lib kommen.

    Würden die Symbole vom Linker nicht gefunden wenn alle "Hinweise" und externen Referenzen aufgelöst wurden, dann würde es ein Problem geben. Sprich Linker Fehler.

    Bzgl. DLL1 werden keine Symbol erzeugt, obwohl dllexport angegeben ist, weil eben keine definiert sind. Sie sind eben nur deklariert. Der Compiler mosert hier nie. Der Linker hat auch ncihts zu mosern,, denn er findet die Symbole als extern definiert in der LIB...
    Und deklarieren kann man alles, definieren alles nur einmal... 😉



  • @Martin
    Ich verwende das Makro schon ewig und hatte nie Probleme. In einer anderen Konstellation gabs ein Compilerproblem und da hatte ich das Problem hier vermutet. Deine Erklärung klingt für mich zumindest so plausibel, daß ich meine Projekte nicht ändere. Danke 🙂

    @AndyDD

    ... gesehen in der DLL2 natürlich ein Import.

    Der Linker von DLL2 trifft im include auf den AFX_EXT_CLASS der DLL1 und müsste das ja dann auch exportieren wollen, wenn das Maktro aufgelöst wird. Vielleicht habe ich es umständlich formuliert 😉

    Gruß
    foo


Log in to reply