Difference between revisions of "DLL dynamically load/de"

From Free Pascal wiki
Jump to navigationJump to search
m
m (Fixed syntax highlighting; deleted category already in page template)
 
Line 1: Line 1:
 
{{DLL dynamically load}}
 
{{DLL dynamically load}}
<br>
+
 
Zurück zu den [[Additional information/de|Zusätzlichen Informationen]].<br>
+
 
<br>
+
Zurück zu den [[Additional information/de|Zusätzlichen Informationen]].
Dieser Artikel beschäftigt sich mit der Windowsprogrammierung.<br>
+
 
Das Tutorial, zeigt wie eine DLL (Dynamic Link Library) <b>dynamisch</b> geladen wird.<br>
+
 
<br>
+
Dieser Artikel beschäftigt sich mit der Windowsprogrammierung.
<br>
+
 
Die Dll (DLLTest.dll) auf die sich im unteren Beispiel bezogen wird:<br>
+
Das Tutorial, zeigt wie eine DLL (Dynamic Link Library) <b>dynamisch</b> geladen wird.
<syntaxhighlight>
+
 
 +
Die Dll (DLLTest.dll) auf die sich im unteren Beispiel bezogen wird:
 +
 
 +
<syntaxhighlight lang=pascal>
 
library Info;
 
library Info;
  
Line 32: 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 50: Line 52:
  
  
Einbinden, verwenden und freigeben des DLL-Unterprogramms im eigenen Programm:<br>
+
Einbinden, verwenden und freigeben des DLL-Unterprogramms im eigenen Programm:
<syntaxhighlight>
+
 
 +
<syntaxhighlight lang=pascal>
 
uses
 
uses
 
   Windows, ...;
 
   Windows, ...;
Line 94: Line 97:
  
 
</syntaxhighlight>
 
</syntaxhighlight>
<br>
 
<br>
 
--[[User:Olaf|Olaf]] 13:48, 4 June 2013 (UTC)
 
{{AutoCategory}}[[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;

  ...