DLL dynamisch einbinden?



  • tomb schrieb:

    Hi,

    Ich glaube die Variable (Adresse)
    muß statisch gebunden sein.

    und dass bedeutet?

    MfG Mijenix



  • Ich bin mir jetzt auch nicht sicher
    aber probiers mal so.

    static int (*Adresse)(int, char*);
    


  • Hi

    Hat nicht funktioniert. Mann ich bin am Verzweifeln!!!



  • Ich habe da gerade einen Beitrag gelesen.
    Über einbinden von .def Dateien bei dynamischen DLL's.
    Schau mal rein bei -Probleme beim DLL laden-.

    mfg tomb



  • ja, schon nur bleibe ich immer bei diesem kompilierungsfehler stecken und komme nicht weiter. Und der Beitrag "Probleme ..." ist für mich nicht gerade verständlich!

    Könnte mir jemand nicht ein kleines Demo-Projekt schicken das eine dll dynamisch lädt und einfach eine kleine Funktion von dieser dll ausführt??

    MfG Mijenix



  • Das exportiert meine DLL

    extern "C" PLUG_API UINT SetMap(CMap< CString, LPCSTR, CString, CString& > *m_smtpdaten);
    

    Und hier dann zum Laden

    typedef UINT (*PINITFUNC)(CMap< CString, LPCSTR, CString, CString& > *m_smtpdaten);
    
    HMODULE hModule = LoadLibrary(szFileName);
    
    HINSTANCE m_pDLLhInstance;
    
    m_pDLLhInstance = hModule;
    
    PINITFUNC pInitFunc = (PINITFUNC)GetProcAddress(m_pDLLhInstance, _T("SetMap"));
    

    Und jetzt bitte nicht sagen das der Source nicht funktioniert. Ist auch kein COPY/Paste-Source



  • So gings:

    extern "C" in der dll.h in die Funktionsdeklaration hinzugefügt. Kann mir noch jemand erklären was extern "C" bewirkt?

    und in meinem Programm:

    int i=0;
        typedef int (*DLLFUNC)(void);
        DLLFUNC Dllfunc;
        HINSTANCE hdll;
        hdll = LoadLibrary("dll.dll");
    
        if (hdll != NULL)
        {
            Dllfunc = (DLLFUNC)GetProcAddress(hdll, "DLL_func");
            i = Dllfunc();
        }
    

    Ich frage mich nur, wieso es ohne typedef nicht geht? Aber was ist an dieser "dynamischen DLL Loading Variante" so viel anders als bei der statischen Variante? Ich muss trozdem immer mein Programm anpassen wenn ich zum Beispiel eine neue Funktion in die DLL einfüge und dann im Programm verwenden will?! Oder geht das auch anders? Das man diese Deklarationen auch nachladen kann?

    MfG Mijenix



  • Mijenix schrieb:

    Ich frage mich nur, wieso es ohne typedef nicht geht?

    Du brauchst typedef afaik nicht (warum auch).
    Mein Beispiel klappt super:

    CString GetAdd(int* i, CString x)
    {
    	return "OK";
    }
    void CTestDlg::OnButton1() 
    {
    	CString (*GA)(int*, CString) = GetAdd;
    	MessageBox(GA(NULL, "Hallo"));
    }
    

    Mijenix schrieb:

    Aber was ist an dieser "dynamischen DLL Loading Variante" so viel anders als bei der statischen Variante?

    Ist ein Unterschied wie Tag und Nacht 😃
    Es ermöglicht z.B. ein Plugin-System.

    Mijenix schrieb:

    Ich muss trozdem immer mein Programm anpassen wenn ich zum Beispiel eine neue Funktion in die DLL einfüge und dann im Programm verwenden will?!

    Wieso denn das? Du musst dein Programm nur anpassen, wenn du in der Dll eine Funktion löschst bzw. die Parameter änderst und diese Funktion in deinem Programm benutzt wird.

    Mijenix schrieb:

    Oder geht das auch anders? Das man diese Deklarationen auch nachladen kann?

    😕 😉

    Grüße Rapha



  • Hi

    Also wenn ich typedef entferne gibt er n paar Fehler aus folglich braucht es typedef?

    MfG Mijenix



  • Hi

    Mijenix schrieb:

    Also wenn ich typedef entferne gibt er n paar Fehler aus folglich braucht es typedef?

    typedef erleichtert dir nur die Arbeit, es geht auch ohne:

    int i=0; 
    //typedef int (*DLLFUNC)(void); 
    //DLLFUNC Dllfunc; 
    HINSTANCE hdll = LoadLibrary("dll.dll"); 
    
    if (hdll != NULL) 
    { 
        int (*Dllfunc)(void) = (int (*)(void))GetProcAddress(hdll, "DLL_func"); 
        i = Dllfunc(); 
    }
    

    Übrigends: FreeLibrary nicht vergessen 😉

    FreeLibrary(hdll);
    

    Güße Rapha



  • Hat jemand ein Bsp wie ich einen Dialog aus einer dll HINZULADEN KANNß

    Danke für eure hilfe!



  • wie hinzuladen?
    wenn du nen MFC-Dialog willst dann schau dir mal die "MFC-Dlls" an, die kannst du dann aber nur in der MFC benutzen.



  • Habe ich eine Anwendung mit einigen Dialogen!
    Nun will ich einen Dialog in eine DLL auslagern und bei Bedarf hinzuladen und danach direkt wieder löschen!

    Dafür bräuchte ich ein Bsp !



  • Die DLL selbst habe ich schon generiert! Das funzt auch soweit!

    Ich will sie nun korrekt hinzuladen und daraus den Dialog aufrufen!


Anmelden zum Antworten