DLL dynamisch laden und Funktion aufrufen



  • Hallo

    Eigentlich soll das dynamische Laden von DLLs sinpel sein, schliesslich gibt es diverse Beispiele dazu. Und trotzdem klappt es bei mir nicht. Kann mir jemand helfen? PS: Reine Ressourcen DLLs kann ich prima erstellen, aber es kappt nicht, wenn ich funktionen aus einer DLL aufrufen möchte

    Ziel:
    Ich will Funktionen & Ressourcen in eine DLL auslagern, die ich bei Bedarf dynamisch laden kann (also nix mit static lib link etc.) :p

    Projek-DLL
    Mittels Assistenten erzeuge ich ein DLL-MFC Projekt:

    class CMyDllApp : public CWinApp{
    }
    

    Diese Klasse istbereits definiert und deklariert.

    Im cpp File füge ich nun noch meine globale Funktion dazu:

    #define MY_DLL_API __declspec(dllexport)
    int MY_DLL_API foo(){
      return 666;
    }
    

    Ich kompiliere und erhalte eine DLL.

    Projekt-Client
    MFC-Dialog anwendung mit 2 Buttons:
    Button 1: Ich lade die DLL und speichere die Adresse in ein HINSTANCE (m_Dllhnd)

    void CDll_ClientDlg::OnButton1(){
      CString location = "MyDll.dll";
      m_Dllhnd = NULL;
      m_Dllhnd = LoadLibrary(location);
      if(m_Dllhnd==NULL){
        AfxMessageBox("error loading dll");
      }
    }
    

    Soweit so gut. Die DLL wird geladen. Nun möchte ich die Funktion aus der DLL aufrufen. Dazu muss ich nun mit einer Methode die Adresse herausfinden.

    int __declspec(dllimport) foo();  // bekanntmachen der funktion
    
    void CDll_ClientDlg::OnButton2(){
      typedef int (__stdcall *MyFunction)();
      MyFunction fn = GetProcAddress( (HINSTANCE)m_Dllhnd, "foo");
    
      ....
    }
    

    Aus meiner Sicht sollte das so klappen. Aber 'fn' erhält NULL zurück, also ist die Funktion 'GetProcAddress()' gescheitert. Kennt jemand den Grund?

    Danke für Hinweise



  • schreibe vor die Funktion

    extern "C"
    

    oder mache den Namen(nur den Namen, keine Parameter oder Rückgabytp) in der .def-Datei bekannt.



  • Pellaeon schrieb:

    schreibe vor die Funktion

    extern "C"
    

    oder mache den Namen(nur den Namen, keine Parameter oder Rückgabytp) in der .def-Datei bekannt.

    Danke: Habe jetzt folgenden Code im .def file innerhalb des DLL-Proejktes hinzugefügt:

    ; MyDll.def : Deklariert die Modul-Parameter für die DLL.
    
    LIBRARY      "MyDll"
    DESCRIPTION  'MyDll Windows Dynamic Link Library'
    
    EXPORTS
        ; Explizite Exporte können hier eingefügt werden
      foo
    

    Nun gehts 👍


Anmelden zum Antworten