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.) :pProjek-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