Klassendlls Importieren?



  • Hallo ,

    Ich möchte gerne eine komplette Klasse in der Dll exportieren und vor allem dann in einer Anderen Anwendung importieren(kein Framework,nur eine "Arbeitsklasse" in STL).

    Der Export klappt, aber der import leider nicht.

    Ich habe das beispiel vom Fatman98 ausprobiert.
    Der Import von einzelnen Funktionen außerhalb der Klassen funktioniert wie gewohnt mit __declspec(dllimport)... ohne Probleme

    Könnte mir jemand weiterhelfen wie die direktive für den Klassen-Dll Import lautet?

    Danke!!

    Dominik

    #ifndef __CLASS_H
    #define __CLASS_H
    
    # define DLL_EXP __declspec(dllexport)
    
    //Funktion geht mit dllimport ohne Probleme!
    __declspec(dllexport) void ShowHallo(AnsiString text);
    
    class DLL_EXP Class
    {
    
    private:
    int quad;
    //...
    protected:
    //...
    public:
            Class();
            void SetQ(int nr);
            int GetQ(void);
    //...
    
    };
    
    void ShowHallo(AnsiString text)
    {
    ShowMessage(text);
    }
    
    #endif
    
    #pragma argsused
    int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
    {
            return 1;
    }
    //---------------------------------------------------------------------------
    
    Class::Class():quad(0)
    {
    
    }
    
    void Class::SetQ(int nr)
    {
    if(nr<=0)quad=0;
    quad=nr*nr;
    }
    
    int Class::GetQ(void)
    {
    return quad;
    }
    


  • Hat wirklich niemand von Euch schon mal Klassen in einer Dll gepackt?



  • Hallo,

    Vielleicht hilft es wenn du das hier
    class DLL_EXP Class
    in das hier
    DLL_EXP class Class
    änderst.
    Ich mach das aber normalerweise anders. Ich exportiere in solchen Fällen immer eine Funktion, welche mir einen Pointer auf die Klasse liefert.



  • Ja,
    das war der Fehler, klar!
    Danke!!

    Trotzdem würde mich interessieren, wie Du in Deiner Methode den Zeiger auf die Klasse liefert ebenfalls.
    Ich bekomme dabei immer ein Unresolved External 😞

    Hier mein Beispielcode aus der Dll

    class CTest
    {
    private:
    int quad;
    protected:
    public:
           CTest():quad(0){};
           CTest(CTest& C):quad(0){};
            void SetQ(int nr);
            int GetQ(void);
    
    }*pCTest;
    
    CTest* GetClass(void){return pCTest;}
    __declspec(dllexport) CTest GetClass(void);
    

    Einbindung:

    Die Header aus der "Dll Klasse"+Import:
    __declspec(dllimport) CTest* GetClass(void);
    

    Kannst Du mir einen Auszug aus deiner Dll(Export) und aus dem Projekt(Import)
    zur Verfügung stellen?

    Danke sehr!!



  • dominik 0 schrieb:

    Ja,
    das war der Fehler, klar!
    Danke!!

    Trotzdem würde mich interessieren, wie Du in Deiner Methode den Zeiger auf die Klasse aus der Dll lieferst.
    Ich bekomme dabei immer ein Unresolved External 😞

    Hier mein Beispielcode aus der Dll

    class CTest
    {
    private:
    int quad;
    protected:
    public:
           CTest():quad(0){};
           CTest(CTest& C):quad(0){};
            void SetQ(int nr);
            int GetQ(void);
    
    }*pCTest;
    
    CTest* GetClass(void){return pCTest;}
    __declspec(dllexport) CTest GetClass(void);
    

    Einbindung:

    Die Header aus der "Dll Klasse"+Import:
    __declspec(dllimport) CTest* GetClass(void);
    

    Kannst Du mir einen Auszug aus deiner Dll(Export) und aus dem Projekt(Import)
    zur Verfügung stellen?

    Danke sehr!!



  • Du musst den Pointer auf deine Klasse in der Funktion schon dynamisch erstellen (also mit new). Du darfst dann natürlich nicht vergessen diesen Pointer dann später zu löschen. Alternativ wäre auch ein auto_ptr oder Verwandtes möglich, wo du dir das eigenhändige Löschen sparst.

    Ciao



  • Jo funktioniert's.
    Danke Dir.

    Den Fehler habe ich allerdings selbst gefunden.
    Lag am Konstruktor, der nur deklariert wurde. 😕


Anmelden zum Antworten