Difference between revisions of "DLL dynamically load/de"

From Free Pascal wiki
Jump to navigationJump to search
m (Fixed syntax highlighting; deleted category already in page template)
 
(5 intermediate revisions by one other user not shown)
Line 1: Line 1:
 
{{DLL dynamically load}}
 
{{DLL dynamically load}}
<br>
+
 
<br>
+
 
Dieser Artikel beschäftigt sich mit der Windowsprogrammierung.<br>
+
Zurück zu den [[Additional information/de|Zusätzlichen Informationen]].
Das Tutorial, zeigt wie eine DLL (Dynamic Link Library) <b>dynamisch</b> geladen wird.<br>
+
 
<br>
+
 
<br>
+
Dieser Artikel beschäftigt sich mit der Windowsprogrammierung.
Die Dll (DLLTest.dll) auf die sich im unteren Beispiel bezogen wird:<br>
+
 
<syntaxhighlight>
+
Das Tutorial, zeigt wie eine DLL (Dynamic Link Library) <b>dynamisch</b> geladen wird.
 +
 
 +
Die Dll (DLLTest.dll) auf die sich im unteren Beispiel bezogen wird:
 +
 
 +
<syntaxhighlight lang=pascal>
 
library Info;
 
library Info;
  
Line 17: Line 21:
 
{$R *.res}
 
{$R *.res}
  
// Die Funktion der DLL
+
// Das Unterprogramm der DLL
 
   function funStringZurueck(strUebergabe: string): PChar;
 
   function funStringZurueck(strUebergabe: string): PChar;
 
   begin
 
   begin
Line 24: Line 28:
  
  
// Exportierte Funktion(en)
+
// Exportiertes Unterprgramm(e)
 
exports
 
exports
 
   funStringZurueck;
 
   funStringZurueck;
Line 31: Line 35:
 
end.
 
end.
 
</syntaxhighlight>
 
</syntaxhighlight>
<br>
 
<br>
 
  
 
Was ist zu tun:
 
Was ist zu tun:
 +
 
* Speicher definieren
 
* Speicher definieren
 
** Es ist ein Datentyp zu erstellen, der genau dem (externen) Unterprogramm entspricht, das aus der DLL importiert werden soll.
 
** Es ist ein Datentyp zu erstellen, der genau dem (externen) Unterprogramm entspricht, das aus der DLL importiert werden soll.
Line 49: Line 52:
  
  
Einbinden, verwenden und freigeben der DLL-Funktion im eigenen Programm:<br>
+
Einbinden, verwenden und freigeben des DLL-Unterprogramms im eigenen Programm:
<syntaxhighlight>
+
 
 +
<syntaxhighlight lang=pascal>
 
uses
 
uses
 
   Windows, ...;
 
   Windows, ...;
Line 64: Line 68:
 
   // Legt eine passende Variable (Datenfeld) für das DLL-Unterprogramm an
 
   // Legt eine passende Variable (Datenfeld) für das DLL-Unterprogramm an
 
   funStringZurueck: TfunStringZurueck;
 
   funStringZurueck: TfunStringZurueck;
   // Legt einen Handle für die Speicheradresse der DLL-Funktion an
+
   // Legt einen Handle für den Handle der DLL an
 
   LibHandle: THandle;
 
   LibHandle: THandle;
  
Line 84: Line 88:
 
   end;
 
   end;
  
   // Freigabe des Arbeistspeichers
+
   // Freigabe des Arbeitsspeichers
 
   funStringZurueck := nil;
 
   funStringZurueck := nil;
 
   FreeLibrary(LibHandle);
 
   FreeLibrary(LibHandle);
Line 93: Line 97:
  
 
</syntaxhighlight>
 
</syntaxhighlight>
<br>
 
<br>
 
--[[User:Olaf|Olaf]] 13:48, 4 June 2013 (UTC)
 
[[Category:Tutorials/de]]
 

Latest revision as of 09:03, 13 February 2020

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;

  ...