Abgeleitete Klasse in DLL



  • Hallo.

    Ich wollte mein Programm etwas flexibler gestalten. Deswegen verwende ich jetzt Dll Plugins. Ich habe das jetzt getesten und eigendlich funktioniert es auch allerdings bekomme ich 2 Debug errors.

    Ich habe mein Hauptporgramm in dem Ich eine Basisklasse definiere. Dann Lade ich explizip eine DLL in der dann eine Abgeleitete Klasse existiert.

    Hauptprogramm:
    Test.h

    class CTest{
    public:
        virtual void print() { printf("Nicht abgeleitet"); }
    };
    

    Test.cpp

    void main(){
        //Dll wird explizip geladen und die Funktionen ausgeführt
    

    DLL:

    //Die Basisklasse includen
    #include <Test.h>
    
    class CNewTest : public CTest{
    public:
        void print() { printf("Abgeleitet"); }
    };
    
    // In der Funktion gibt es dann einen Fehler
    
    void __declspec(dllexport) Init(CTest*& a){
        a = new CNewTest;
    }
    

    Eigentlich funktioniert alles. Er gibt mir dann das richtige print aus. Allerdings bekomme ich einen Debug error. Warum? was ist daran falsch



  • Bei der WinAPI wärst Du wohl richtiger.

    Wei sieht denn der Debugfehler aus?
    Wenn normal alles läuft und nur bei Debug ein Fehler kommt, ist es meist ein Fehler bei Speichergeschichten.



  • Also er bringt eine Message Box

    Debug Error!

    The value of ESP was not prperly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.



  • Mal ne Frage:
    das print steht im private von CTest, bei CNewTest soll es dann public sein.
    Ich glaube das beißt sich etwas, bin mir aber nicht sicher.



  • Hallo,

    wie sieht das Hauptprogramm aus?

    mfg
    v R



  • Im Hauptprogramm mache ich nicht viel ausser die DLL zu laden und die Funktionen aufzurufen

    void main(){
    
    	CTemp* obj;
    	HMODULE hmodul;
    	void (__stdcall *Init)(CTemp*&);
    	void (__stdcall *Exit)(CTemp*&);
    
    	hmodul = LoadLibrary("NewDll.dll");
    	if(hmodul == NULL)
    		printf("hmodul = NULL");
    	//////////////////////////////////////////////////////////////////////////
    	// Init
    	Init = (void (__stdcall*)(CTemp*&))(GetProcAddress(hmodul,"Init"));
    	if(Init == NULL)
    		printf("Konnte Init nicht finden");
    
    	Init(obj);
    	obj->print();
    	//////////////////////////////////////////////////////////////////////////
    	// Exit
    	Exit = (void (__stdcall*)(CTemp*&))(GetProcAddress(hmodul,"Exit"));
    	if(Exit == NULL)
    		printf("Konnte Exit nicht finden");
    
    	Exit(obj);	
    }
    

    Die Exit Funion ist genau so wie die Init Funktion nur wird dort das Object gelöscht.



  • Wie ist denn die Default Calling Convention in deinem Projekt?
    Was passiert, wenn du __stdcall weglässt?



  • Jetzt bringt er keinen Fehler mehr. Danke


Anmelden zum Antworten