DLL dynamically load/de

From Free Pascal wiki
Jump to navigationJump to search
Windows logo - 2012.svg

Dieser Artikel behandelt ausschließlich Windows.

Siehe auch: Multiplatform Programming Guide/de

Deutsch (de) English (en) русский (ru) 中文(中国大陆)‎ (zh_CN)


Zurück zu den Zusätzlichen Informationen.


Dieser Artikel beschäftigt sich mit der Windowsprogrammierung.

Das Tutorial, zeigt wie eine DLL (Dynamic Link Library) dynamisch geladen wird.

Die Dll (DLLTest.dll) auf die sich im unteren Beispiel bezogen wird:

library Info;

{$mode objfpc}{$H+}

uses
  SysUtils;

{$R *.res}

// Das Unterprogramm der DLL
  function funStringZurueck(strUebergabe: string): PChar;
  begin
    funStringZurueck := PChar(UpperCase(strUebergabe));
  end;


// Exportiertes Unterprgramm(e)
exports
  funStringZurueck;

begin
end.

Was ist zu tun:

  • Speicher definieren
    • Es ist ein Datentyp zu erstellen, der genau dem (externen) Unterprogramm entspricht, das aus der DLL importiert werden soll.
  • Speicher reservieren
    • Es ist Speicher für eine Variable (Datenfeld) zu reservieren, der der obige Datentyp zu gewiesen wird.
    • Es ist Speicher für ein Handle zu reservieren, dem später der Handle der DLL zugewiesen wird.
  • DLL und externes Unterprogramm zuweisen und die Daten entgegennehmen
    • Die DLL ist aufzurufen und dem Handle ist das Handle der DLL zuzuweisen.
    • Der Zeiger (Pointer) der Variablen muss auf den Speicher des externen Unterprogramms geändert werden.
    • Das Ergebnis des externen Unterprogramms ist entgegen zu nehmen.
  • Alle Speicher freigeben
    • Der Zeiger (Pointer) der Variablen muss wieder auf einen ungültigen Speicherbereich zeigen (:= nil) um das externe Unterprogramm frei zugeben.
    • Der Speicher der DLL ist wieder freizugeben.


Einbinden, verwenden und freigeben des DLL-Unterprogramms im eigenen Programm:

uses
  Windows, ...;

  ...

function funDllEinbinden: string;
type
  //Definition des aufzurufenden Unterprogramms, wie es in der einzubindenden DLL definiert ist
  TfunStringZurueck = function(strUebergabe: string): PChar; stdcall;

var
  // Legt eine passende Variable (Datenfeld) für das DLL-Unterprogramm an
  funStringZurueck: TfunStringZurueck;
  // Legt einen Handle für den Handle der DLL an
  LibHandle: THandle;

begin

  // Ermittelt den Handle der zuverwendenden Library
  LibHandle := LoadLibrary(PChar('DLLTest.dll'));

  // Prüft, ob das Laden der DLL erfolgreich war
  if LibHandle <> 0 then
  begin
    // Weisst der Variablen funStringZurueck die Adresse des Unterprogrammaufrufs zu
    // 'funStringZurueck' aus der DLL DLLTest.dll zu.
    Pointer(funStringZurueck) := GetProcAddress(LibHandle, 'funStringZurueck');

    // Prüft, ob eine gültige Adresse zurück gegeben wurde
    if @funStringZurueck <> nil then
      Result := funStringZurueck('hallo welt');
  end;

  // Freigabe des Arbeitsspeichers
  funStringZurueck := nil;
  FreeLibrary(LibHandle);

end;

  ...