Sign in Join
Wiki copytemporary

DLL dynamically load/de: what changed

Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.

Title: DLL dynamically load/de

OldNewLine
1+Zurück zu den [[Additional information/de|Zusätzlichen Informationen]].
2+
3+Dieser Artikel beschäftigt sich mit der Windowsprogrammierung.
4+
5+Das Tutorial, zeigt wie eine DLL (Dynamic Link Library) <b>dynamisch</b> geladen wird.
6+
7+Die Dll (DLLTest.dll) auf die sich im unteren Beispiel bezogen wird:
8+
9+``` pascal
10+library Info;
11+
12+{$mode objfpc}{$H+}
13+
14+uses
15+ SysUtils;
16+
17+{$R *.res}
18+
19+// Das Unterprogramm der DLL
20+ function funStringZurueck(strUebergabe: string): PChar;
21+ begin
22+ funStringZurueck := PChar(UpperCase(strUebergabe));
23+ end;
24+
25+// Exportiertes Unterprgramm(e)
26+exports
27+ funStringZurueck;
28+
29+begin
30+end.
31+```
32+
33+Was ist zu tun:
34+
35+- Speicher definieren
36+ - Es ist ein Datentyp zu erstellen, der genau dem (externen) Unterprogramm entspricht, das aus der DLL importiert werden soll.
37+- Speicher reservieren
38+ - Es ist Speicher für eine Variable (Datenfeld) zu reservieren, der der obige Datentyp zu gewiesen wird.
39+ - Es ist Speicher für ein Handle zu reservieren, dem später der Handle der DLL zugewiesen wird.
40+- DLL und externes Unterprogramm zuweisen und die Daten entgegennehmen
41+ - Die DLL ist aufzurufen und dem Handle ist das Handle der DLL zuzuweisen.
42+ - Der Zeiger (Pointer) der Variablen muss auf den Speicher des externen Unterprogramms geändert werden.
43+ - Das Ergebnis des externen Unterprogramms ist entgegen zu nehmen.
44+- Alle Speicher freigeben
45+ - Der Zeiger (Pointer) der Variablen muss wieder auf einen ungültigen Speicherbereich zeigen (:= nil) um das externe Unterprogramm frei zugeben.
46+ - Der Speicher der DLL ist wieder freizugeben.
47+
48+Einbinden, verwenden und freigeben des DLL-Unterprogramms im eigenen Programm:
49+
50+``` pascal
51+uses
52+ Windows, ...;
53+
54+ ...
55+
56+function funDllEinbinden: string;
57+type
58+ //Definition des aufzurufenden Unterprogramms, wie es in der einzubindenden DLL definiert ist
59+ TfunStringZurueck = function(strUebergabe: string): PChar; stdcall;
60+
61+var
62+ // Legt eine passende Variable (Datenfeld) für das DLL-Unterprogramm an
63+ funStringZurueck: TfunStringZurueck;
64+ // Legt einen Handle für den Handle der DLL an
65+ LibHandle: THandle;
66+
67+begin
68+
69+ // Ermittelt den Handle der zuverwendenden Library
70+ LibHandle := LoadLibrary(PChar('DLLTest.dll'));
71+
72+ // Prüft, ob das Laden der DLL erfolgreich war
73+ if LibHandle <> 0 then
74+ begin
75+ // Weisst der Variablen funStringZurueck die Adresse des Unterprogrammaufrufs zu
76+ // 'funStringZurueck' aus der DLL DLLTest.dll zu.
77+ Pointer(funStringZurueck) := GetProcAddress(LibHandle, 'funStringZurueck');
78+
79+ // Prüft, ob eine gültige Adresse zurück gegeben wurde
80+ if @funStringZurueck <> nil then
81+ Result := funStringZurueck('hallo welt');
82+ end;
83+
84+ // Freigabe des Arbeitsspeichers
85+ funStringZurueck := nil;
86+ FreeLibrary(LibHandle);
87+
88+end;
89+
90+ ...
91+```
92+
93+---
94+*From the Free Pascal wiki, page "DLL dynamically load/de", as it stood on 2020-02-13 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history