hi!
Ich bin blutige Anfaengerin in Umgang mit DLLs und soll
nun in einem C-Programm Funktionen aufrufen die in einer
DLL stehen. Ich weiss nicht ob ich einfach nur auf der
Leitung stehe oder es irgendwie einfach nicht kapiere.
Wie muss ich denn mein Makefile gestalten? Ich kann dann
doch ohne weitere Probleme die Funktionen aufrufen oder muss ich
doch extra Funktionen anwenden die erstmal die DLL einbinden? Ich
lese so viel wiederspruechliches.
Es gibt zwei Methoden, Funktionen aus einer DLL aufzurufen: implizit
oder explizit.
Bei der impliziten Methode brauchst du eine Headerdatei für die DLL,
in der ein Prototyp aller exportierten Funktionen dieser DLL steht.
Bei dieser Methode muss die DLL allerdings schon während der Compile-
Zeit vorhanden sein.
Bei der expliziten Methode kannst du die DLLs nachträglich hinzufügen
(zb. für Plugins), dafür ist die Verwendung etwas komplizierter:
Angenommen, du hast folgende - einfache aber sinnlose - Funktion in
deiner DLL stehen (MS VC++):
extern "C" __declspec(dllexport) int getInt(int i);
{
return
}
Diese Funktion kannst du dann etwa folgendermaßen verwenden:
HMODULE handle;
handle = LoadLibrary("test.dll");
if (handle != NULL)
{
typedef int (*DLLFUNC)(int);
DLLFUNC func = (DLLFUNC)GetProcAddress(handle, "getInt");
if (func)
{
int i = func(42);
}
}
FreeLibrary(handle);
Sieht wohl auf den ersten Blick recht kompliziert aus, da gewöhnt man
sich aber dran:
LoadLibrary("test.dll");
Lädt die DLL in den Speicher und gibt ein Handle zurück.
typedef int (*DLLFUNC)(int);
Keine Ahnung, wie die Zeile genau funktioniert. Damit definierst du
aber einen Zeiger auf eine Funktion, die einen Parameter vom Typ
int erwartet und einen int zurückgibt.
(DLLFUNC)GetProcAddress(handle, "getInt");
Gibt einen Funktionszeiger vom Typ DLLFUNC (s.o.) auf die Funktion
getInt aus der geladenen DLL zurück, der später verwendet wird, um
die Funktion auszuführen.
int i = func(42);
Ruft die Funktion getInt über den Funktionszeiger func auf, der von
GetProcAddress() zurückgegeben wurde.
Implizit habe ich noch keine DLL verwendet, kann ich dir also nichts
genaueres drüber sagen. Aber in Microsofts MSDN findest du sicher was
zu diesem Thema:
http://msdn.microsoft.com/
http://msdn.microsoft.com/library/techart/dlldynamic.htm
Allerdings wirst du da sicher noch mehr finden. Viel Glück ;)
bye, Frank!