Beiträge durchsuchen

DLLs

Einbinden zur Laufzeit (1)

Damit kommen wir zur komplizierteren Art der Einbindung, der Einbindung zur Laufzeit. Wir gehen hier wieder von einer leeren Unit „Unit1“ aus.
Zuerst müssen wir einen Typ für die aufzurufende Funktion erstellen:

type TSummenFunktion = function(zahl1, zahl2: integer): integer; stdcall;

Hinter dem Gleichheitszeichen folgt das Wort function oder procedure und anschließend in Klammern die Parameter dazu. Der eigentliche Funktions-/Prozedurname wird weggelassen.
Nun kommen wir zu der Stelle, von der aus die Funktion in der DLL benötigt wird. Nehmen wir an, das geschieht wie im Beispiel der Einbindung bei Programmstart in einer extra „Schnittstellen-Unit“, in der sich nur die Schnittstellen zu Funktionen und Prozeduren in DLLs befinden. Zur Unterscheidung mit der Funktion in der DLL, nennen wir die Schnittstellen-Funktion „addieren“. Folgende Variablen müssen definiert werden:

function addieren(zahl1, zahl2: integer): integer;
var SummenFunktion: TSummenFunktion;
    Handle: THandle;

Schon an der Verwendung eines Handles merkt man, dass man hier wieder auf Windows-API-Ebene arbeitet und nicht die Vereinfachungen von Delphi genießen kann. Laden wir also unsere DLL. Hier muss nun der DLL-Dateiname angegeben werden; zuvor könnte geprüft werden, ob diese Datei auch existiert. Über ExtractFilePath(ParamStr(0)) wird der Pfad der Anwendung ermittelt. Das ist sicherer als das Verwenden von relativen Pfadangaben.

Handle := LoadLibrary(PChar(ExtractFilePath(ParamStr(0))+'rechnen.dll'));

Im Folgenden wird geprüft, ob das Handle unleich Null ist, das Laden also erfolgreich war, und anschließend die Adresse der von uns benötigten Funktion „addiere“ ermittelt.

if Handle <> 0 then begin
    @SummenFunktion := GetProcAddress(Handle, 'addiere');
    if @SummenFunktion <> nil then begin

Hier geht es nun auch erst weiter, wenn die Funktion „addiere“ in der DLL gefunden worden ist. Nun kommt der eigentliche Aufruf der Funktion:

result := SummenFunktion(zahl1, zahl2);
    end;

Und zu guter Letzt muss die DLL wieder aus dem Arbeitsspeicher freigegeben werden:

FreeLibrary(Handle);

1 Kommentar zu DLLs

  1. Hi,

    danke für das nette Tutorial.

    Aber windows alleine reicht bei mir im uses Abschnitt nicht aus. Ich muss noch SysUtils hinzufügen damit es läuft. Ohne SysUtils kommt diese Fehlermeldung: [DCC Fehler] Unit3.pas(17): E2003 Undefinierter Bezeichner: ‚ExtractFilePath‘

Kommentare sind geschlossen.