Das Erzeugen einer Importlibrary ist eine Möglichkeit, mit einer DLL
umzugehen. Ein anderer Weg, der keine externen Hilfsmittel erfordert
und obendrein ein "gnädigeres" Verhalten der Anwendung im Fehlerfalle
(DLL fehlt) ermöglicht, besteht darin, die DLL mit LoadLibrary zu laden
und mit GetProcAddress die relevanten Funktionspointer zu bestimmen.
Der Aufruf der Libraryfunktionen erfolgt danach über die so bestimmten
Funktionspointer.
Am Beispiel einer DLL mit einer Funktion mit dem Klartextnamen
"Init", die einen int zurückliefert und zwei char-Pointer als
Argument erwartet, ist hier der Gebrauch von LoadLibrary und
GetProcAddress zu sehen:
Typedef für Funktionspointer:
typedef int (__stdcall *t_initfunc)(char*, char*);
Funktionspointer
t_initfunc pInitfunc;
Laden der DLL:
HINSTANCE hModule;
hModule = LoadLibrary("meinedll.dll");
if (!hModule)
{
// fehlerbehandlung
}
Funktionspointer bestimmen:
pInitfunc = (t_initfunc) GetProcAddress(hModule, "Init");
if (!pInitfunc)
{
// fehlerbehandlung
}
Funktion aufrufen:
int ergebnis;
ergebnis = pInitfunc("bla", "fusel");
Nach Gebrauch kann die DLL auch wieder freigegeben werden:
FreeLibrary(hModule);
Der beim Aufruf von GetProcAddress gebrauchte Klartextname ist der in
der DLL stehende Klartextname des exportierten Symbols. Eine Liste der
von einer DLL exportierten Symbole erhält man mit
Dumpbin /exports meinedll.dll
Dumpbin gehört zum Lieferumfang von Microsoft-Compilern, es wird aber
sicherlich auch alternative Tools geben, die diese Aufgabe übernehmen
können.