shared object dynamically load/de
│
Deutsch (de) │
Zurück zu den Zusätzlichen Informationen.
Dieser Artikel beschäftigt sich mit der Linux(Ubuntu)-Programmierung.
Das Tutorial, zeigt wie eine Programmbibliothek mit der Dateinamenserweiterung .so (Shared Object) dynamisch geladen wird.
library sotest;
{$mode objfpc}{$H+}
uses
SysUtils;
// Das Unterprogramm im Shared Object
function funStringZurueck(strUebergabe: PChar): PChar;
begin
funStringZurueck := PChar(UpperCase(strUebergabe));
end;
// Exportiertes Unterprogramm(e)
exports
funStringZurueck;
begin
end.
Damit das Shared Objekt vom Betriebssystem (Linux) gefunden werden kann, muss es in einem der folgenden Pfade zu finden sein.
Ist das Shared Object in keinem dieser Pfade zu finden, dann müssen Sie das Shared Objekt in einen dieser Pfade kopieren.
- Pfad der Umgebungsvariable LD_LIBRARY_PATH
- /lib
- /usr/lib
- /etc/ld.so.conf
Beim Datenaustausch zwischen dem Unterprogrammen des Shared Object und dem rufenden Programm empfiehlt sich die Verwendung des Datentyps PChar.
Einbinden und verwenden des Shared Object-Unterprogramms im eigenen Programm:
...
uses
dynlibs, SysUtils, ...;
...
function funDllEinbinden: string;
type
//Definition des aufzurufenden Unterprogramms wie Sie im einzubindenden Shared Object definiert ist
TfunStringZurueck = function(strUebergabe: PChar): PChar;
var
hndLib: TLibHandle = 0;
funStringZurueck: TfunStringZurueck;
begin
Result := '';
// Ermittelt den Handle der Library
hndLib := LoadLibrary(PChar('libsotest.so'));
// Prüft, ob das Laden des Shared Object erfolgreich war
if hndLib <> NilHandle then
begin
// Weisst der Variablen funStringZurueck die Adresse des Unterprogrammaufrufs
// 'funStringZurueck' aus dem Shared Object libsotest.so zu.
Pointer(funStringZurueck) := GetProcedureAddress(hndLib, 'funStringZurueck');
// Prüft, ob eine gültige Adresse zurück gegeben wurde
if @funStringZurueck <> nil then
Result := funStringZurueck('hello world')
end;
// Freigabe des Arbeistspeichers
funStringZurueck := nil;
FreeLibrary(hndLib);
end;
...