DLL dynamically load/de

From Free Pascal wiki
Revision as of 17:14, 4 June 2013 by Olaf (talk | contribs)
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)


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}

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


// Exportierte Funktion(en)
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 der DLL-Funktion 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 die Speicheradresse der DLL-Funktion 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 Arbeistspeichers
  funStringZurueck := nil;
  FreeLibrary(LibHandle);

end;

  ...



--Olaf 13:48, 4 June 2013 (UTC)