DLL dynamisch einbinden?
-
Hi
Ich will eine DLL dynamisch in ein Programm einbinden. Reicht es wenn ich die Dll erstellt und dann einfach mit LoadLibrary die dll lade? Muss ich in meinem Programm noch was hinzufügen oder muss ich nichts machen? Reicht es wenn die Funktions/Klassen deklarationen in der dll definiert wurden?
MfG Mijenix
-
Hallo,
damit du mit den Funktionen der DLL arbeiten kannst, mußt du dir
ein HANDLE (Adresse der Funktion) besorgen.mfg
-
Hi
Ich bekomme mit
Adresse = GetProcAddress(HINSTANCE derDLL, LPCSTR funcName);
Aber welcher Typ hat Adresse, int, bool oder was?
MfG Mathias
-
Hi
kommt auf deine Funktion an.
Wenn du z.B. folgende Funktion in deiner dll hast:E
__declspec( dllexport ) int GetNumber(int nItem, char* blabla);
Muss Adresse folgendermaßen deklariert sein:
int (*Adresse)(int, char*);
Wobei ich hier den Namen GetNumber dem Namen Adresse vorziehen würde (damit du leichter verstehst, um was es geht).
Siehe "Zeiger auf Funktionen".
Wenn du jetzt mit GetProcAdress den Zeiger auf die Funktion GetNumber der Dll erhalten hast, kannst du ganz normal diese Funktion aufrufen:
int i; int Paramter1 = 24; i = Adresse(Paramter1, "test");
Grüße Rapha
-
Hi
Danke für deine Antwort. Leider erscheint folgende Fehlermeldung wenn ich nun mein Programm ausführen will:
cannot convert from 'int (__stdcall *)(void)' to 'int (__cdecl *)(void)'
und mit dieser Methode muss man die Funktion im Programm deklariert haben. Gibts auch eine möglichkeit ein Programm zu schreiben das nicht mehr angepasst werden muss wenn ich z.B. in der dll etwas ändere z.B. ein neue Funktion erstelle? Oder kann ich diese dll.lib datei auch dynamisch laden?
MfG Mijenix
-
Hi,
Ich glaube die Variable (Adresse)
muß statisch gebunden sein.
-
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!