Moin Homer,
erst einmal herzlich willkommen hier in der Delphi-PRAXiS.
Einbinden kannst Du Funktionen aus DLLs auf zwei Wegen: Statisch oder dynamisch.
Statisch heisst:
Du deklarierst die Funktion, wie eine "normale" Funktion, teilst dem Compiler aber mit, dass er für die Implementierung nicht in Deinem Programm suchen muss, sondern die Funktion in einer
DLL findet.
Beispiel:
function GetAdaptersInfo(const ApAdapterInfo : PIP_ADAPTER_INFO;const ApOutBufLen : PULONG) : DWORD; stdcall; external 'IPHLPAPI.DLL' name 'GetAdaptersInfo';
Die Angabe der Aufrufkonvention (hier stdcall) sollte in der Dokumentation der
DLL enthalten sein.
Mit external '<Name der
DLL>' wird angegeben, wie die
DLL heisst, aus der man die Funktion importieren will.
Der name der Funktion muss nur mit angegeben werden, wenn man einen Funktionsnamen verwenden will, der von dem der Funktion in der
DLL abweicht (und sei es auch nur durch eine andere Gross-/Kleinschreibung). In obigem Beispiel hätte also name 'GetAdaptersInfo' entfallen können.
Dynamisch heisst:
Die Funktion wird erst zur Laufzeit tatsächlich eingebunden.
Beispiel (die gleiche Funktion wie oben, nur eben dynamisch eingebunden):
Delphi-Quellcode:
// Einen Typ deklarieren, der die Funktionsdeklaration enthält
type
TcsGetAdaptersInfo =
function(
const ApAdapterInfo : PIP_ADAPTER_INFO;
const ApOutBufLen : PULONG) : DWORD;
stdcall;
// Eine Variable deklarieren, die die Adresse der Funktion aufnehmen soll
var
GetAdaptersInfo : TcsGetAdaptersInfo;
hDLL : DWORD;
// Dann muss noch die Funktionsadresse aus der DLL ermittelt werden
// Dies kann, z.B., im Implementation-Abschnitt einer Unit erfolgen
initialization
begin
// Handle auf die DLL holen.
// Hierbei darf auch ein Pfad angegeben werden, um die Position der gewünschten DLL genau zu bestimmen.
hDLL := LoadLibrary('
IPHLPAPI.DLL');
if hDLL <> 0
then begin
// wenn ein gültiges Handle (<> 0) zurückgegeben wurde, kann jetzt die Adresse der Funktion ermittelt werden
// Wichtig: Die schreibweise (Gross-/Kleinschreibung) muss exakt eingehalten werden
@GetAdaptersInfo := GetProcAddress(hDLL,'
GetAdaptersInfo');
if @GetAdaptersInfo =
nil then begin
MessageBox(0,'
GetAdaptersInfo nicht gefunden','
FEHLER',MB_ICONERROR
or MB_OK);
fFatalError := true;
end;
// Wenn kein Fehler aufgetreten ist, kann die Funktion, jetzt so benutzt werden, wie jede andere auch.
// Später muss dann die DLL auch wieder freiggegeben werden
finalization
begin
if hDLL <> 0
then begin
FreeLibrary(hDLL);
end;
Es empfiehlt sich auf jeden Fall auch die Dokumentation zu den Funktionen zu lesen (z.B.
LoadLibrary)
Bei der statischen Methode hat man zwar weniger zu schreiben, hat aber auch den Nachteil, dass das Programm gar nicht erst startet (bzw. man erhält eine Fehlermeldung, und das Programm beendet sich gleich wieder), wenn die Funktion nicht importiert werden kann.
Wenn man eine Funktion dynamisch importiert, kann man beim Programmstart auf derartige Probleme eingehen, und evtl. Alternativen verwenden, zur Nachinstallation auffordern, oder einfach den Funktionsumfang des Programmes einschränken.
[EDIT]
Um herauszufinden, welche Funktionen enthalten sind, müsstest Du wohl mal die Dokumentation studieren.
Wie diese dann korrekt eingebunden werden können (z.B., Aufrufkonvention) kannst Du wohl auch den genannten Beispielen entnehmen
[/EDIT]