dll klassen



  • hi

    Kann mir bitte jemand sagen, wie man Klassen aus DLL-Dateien importiert?!
    Angeblich solls so gehen:

    In der Anwendung definiert man eine Basisklasse.
    Die Methoden dieser Klasse sind virtuell (können also von abgeleiteten Klassen überschrieben werden).
    In der DLL wird nun eine davon abgeleitete Klasse implementiert. Also die Klassendeklaration im Header und die Implementierung in der cpp.
    Eine Instanz dieser Klasse wird dann von einer "Fabrikfunktion" innerhalb der DLL generiert und an die Anwendung geliefert.

    Ich zeig mal meinen Code den ich gebastelt hab:

    Erstmal das DLL-Projekt...

    //Deklaration der abgeleiteten Klasse in der dll.h
    class Basis{};
    
    class __declspec(dllexport) Ableitung : public Basis
    {
    public:
    	void funktion();
    };
    
    #include "dll.h"
    //Definition in der dll.cpp
    void Ableitung::funktion()
    {
    	cout<<"Ableitung";
    }
    
    //Fabrikfunktion
    extern "C" __declspec(dllexport) Ableitung* getInstance()
    {
    	return new Ableitung();
    }
    

    Nun die Anwendung...
    (dll und lib-Dateien sind korrekt plaziert und im Linker eingebunden.)

    class Basis
    {
    public:
    	virtual void funktion()
    	{
    		cout<<"Basis";
    	}
    };
    
    int main()
    {
    HMODULE hDLL = LoadLibrary("dll.dll");	//DLL-Datei laden
    if(!hDLL)
    {
    	cout<<"dll nicht geladen";
    }
    
    Basis* (__stdcall* pfunktion)();	//Funktionszeiger
    pfunktion = (Basis* (__stdcall*)())(GetProcAddress(hDLL,"getInstance"));	//Funktion aus DLL laden
    if(!pfunktion)
    {
    	cout<<"funktion nicht geladen";
    }
    Basis *p = pfunktion();	//geladene Funktion aufrufen
    p->funktion();	//hier Crash!
    
    FreeLibrary(hDLL);	//DLL-Datei wieder freigeben
    }
    

    Das lustige ist, wenn ich mit typeid() die Typen zur Laufzeit vergleiche (also Typ Basis mit der Instanz) sind sie identisch.
    Nur wenn ich dann die Instanz verwenden will, crasht es.



  • Hallo,

    Müsstest Du nicht auch in der DLL die Klasse Basis wie folgt def.:

    class Basis
    {
    public:
        virtual void funktion()
        {
            cout<<"Basis";
        }
    };
    

    (Nicht nur: class Basis {}; )

    Ich denke, ansonsten, weiss die Klasse Ableitung gar nicht dass eben die "funktion" überschrieben worden ist.

    Dafür denke ich ist es nicht nötig (das ist ja der Clou) die Klasse Ableitung zu exportieren (mit __declspec(..)).

    Vielleicht irre ich mich auch...

    Zusätzlich musst Du noch überlegen wie Du den mit new allozierten Speicher wieder freigibst. Das muss in der DLL geschehen (ansonsten versuchst Du auf dem falschen Heap den Speicher freizugeben.)

    Simon



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Compiler- und IDE-Forum verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Tatsächlich, das funzt.
    Vielen Dank @ simon.gysi 🙂


Anmelden zum Antworten