Difference between revisions of "shared object dynamically load/de"

From Free Pascal wiki
Jump to navigationJump to search
m
m (Fixed syntax highlighting; deleted category included in page template)
 
(One intermediate revision by one other user not shown)
Line 1: Line 1:
 
{{shared object dynamically load}}
 
{{shared object dynamically load}}
<br>
+
 
<br>
+
 
Dieser Artikel beschäftigt sich mit der Linux(Ubuntu)-Programmierung.<br>
+
Zurück zu den [[Additional information/de|Zusätzlichen Informationen]].
Das Tutorial, zeigt wie eine Programmbibliothek mit der Dateinamenserweiterung .so (Shared Object) <b>dynamisch</b> geladen wird.<br>
+
 
<br>
+
 
<syntaxhighlight>
+
Dieser Artikel beschäftigt sich mit der Linux(Ubuntu)-Programmierung.
 +
 
 +
Das Tutorial, zeigt wie eine Programmbibliothek mit der Dateinamenserweiterung .so (Shared Object) <b>dynamisch</b> geladen wird.
 +
 
 +
<syntaxhighlight lang=pascal>
 
library sotest;
 
library sotest;
  
Line 27: Line 31:
 
begin
 
begin
 
end.
 
end.
 +
</syntaxhighlight>
 +
 +
Damit das Shared Objekt vom Betriebssystem (Linux) gefunden werden kann, muss es in <b>einem</b> 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.
  
</syntaxhighlight>
 
<br>
 
<br>
 
Damit das Shared Objekt vom Betriebssystem (Linux) gefunden werden kann, muss es in <b>einem</b> der folgenden Pfade zu finden sein.<br>
 
Ist das Shared Object in keinem dieser Pfade zu finden, dann müssen Sie das Shared Objekt in einen dieser Pfade kopieren.<br>
 
 
* Pfad der Umgebungsvariable LD_LIBRARY_PATH
 
* Pfad der Umgebungsvariable LD_LIBRARY_PATH
 
* /lib
 
* /lib
 
* /usr/lib
 
* /usr/lib
 
* /etc/ld.so.conf
 
* /etc/ld.so.conf
<br>
+
 
Beim Datenaustausch zwischen dem Unterprogrammen des Shared Object und dem rufenden Programm empfiehlt sich die Verwendung des Datentyps PChar.<br>
+
Beim Datenaustausch zwischen dem Unterprogrammen des Shared Object und dem rufenden Programm empfiehlt sich die Verwendung des Datentyps PChar.
<br>
+
 
Einbinden und verwenden des Shared Object-Unterprogramms im eigenen Programm:<br>
+
Einbinden und verwenden des Shared Object-Unterprogramms im eigenen Programm:
<syntaxhighlight>
+
 
 +
<syntaxhighlight lang=pascal>
 
   ...
 
   ...
 
uses
 
uses
Line 84: Line 89:
  
 
</syntaxhighlight>
 
</syntaxhighlight>
<br>
 
<br>
 
--[[User:Olaf|Olaf]] 06:10, 7 June 2013 (UTC)
 
[[Category:Tutorials/de]]
 

Latest revision as of 12:38, 26 February 2020

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;

  ...