Sign in Join
Wiki copytemporary

shared object dynamically load/de: what changed

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

Title: shared object dynamically load/de

OldNewLine
1+Zurück zu den [[Additional information/de|Zusätzlichen Informationen]].
2+
3+Dieser Artikel beschäftigt sich mit der Linux(Ubuntu)-Programmierung.
4+
5+Das Tutorial, zeigt wie eine Programmbibliothek mit der Dateinamenserweiterung .so (Shared Object) dynamisch geladen wird.
6+
7+``` pascal
8+library sotest;
9+
10+{$mode objfpc}{$H+}
11+
12+uses
13+ SysUtils;
14+
15+// Das Unterprogramm im Shared Object
16+function funStringZurueck(strUebergabe: PChar): PChar;
17+begin
18+ funStringZurueck := PChar(UpperCase(strUebergabe));
19+end;
20+
21+// Exportiertes Unterprogramm(e)
22+exports
23+ funStringZurueck;
24+
25+begin
26+end.
27+```
28+
29+Damit das Shared Objekt vom Betriebssystem (Linux) gefunden werden kann, muss es in einem der folgenden Pfade zu finden sein.
30+
31+Ist das Shared Object in keinem dieser Pfade zu finden, dann müssen Sie das Shared Objekt in einen dieser Pfade kopieren.
32+
33+- Pfad der Umgebungsvariable LD_LIBRARY_PATH
34+- /lib
35+- /usr/lib
36+- /etc/ld.so.conf
37+
38+Beim Datenaustausch zwischen dem Unterprogrammen des Shared Object und dem rufenden Programm empfiehlt sich die Verwendung des Datentyps PChar.
39+
40+Einbinden und verwenden des Shared Object-Unterprogramms im eigenen Programm:
41+
42+``` pascal
43+ ...
44+uses
45+ dynlibs, SysUtils, ...;
46+
47+ ...
48+
49+function funDllEinbinden: string;
50+type
51+ //Definition des aufzurufenden Unterprogramms wie Sie im einzubindenden Shared Object definiert ist
52+ TfunStringZurueck = function(strUebergabe: PChar): PChar;
53+
54+var
55+ hndLib: TLibHandle = 0;
56+ funStringZurueck: TfunStringZurueck;
57+
58+begin
59+
60+ Result := '';
61+
62+ // Ermittelt den Handle der Library
63+ hndLib := LoadLibrary(PChar('libsotest.so'));
64+
65+ // Prüft, ob das Laden des Shared Object erfolgreich war
66+ if hndLib <> NilHandle then
67+ begin
68+ // Weisst der Variablen funStringZurueck die Adresse des Unterprogrammaufrufs
69+ // 'funStringZurueck' aus dem Shared Object libsotest.so zu.
70+ Pointer(funStringZurueck) := GetProcedureAddress(hndLib, 'funStringZurueck');
71+ // Prüft, ob eine gültige Adresse zurück gegeben wurde
72+ if @funStringZurueck <> nil then
73+ Result := funStringZurueck('hello world')
74+ end;
75+
76+ // Freigabe des Arbeistspeichers
77+ funStringZurueck := nil;
78+ FreeLibrary(hndLib);
79+
80+end;
81+
82+ ...
83+```
84+
85+---
86+*From the Free Pascal wiki, page "shared object dynamically load/de", as it stood on 2020-02-26 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