DLL/SO oder inc

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
Benutzeravatar
Maik81SE
Beiträge: 308
Registriert: Fr 30. Sep 2011, 14:07
OS, Lazarus, FPC: Debian 12 (L 3.0.0.3 FPC 3.2.2); Windows 10 (L 3.99.0.0 FPC 3.2.0)
CPU-Target: x86-64; arm; avr
Wohnort: Lübeck
Kontaktdaten:

DLL/SO oder inc

Beitrag von Maik81SE »

Moin @ll,

ich bin im Zuge meiner Programme schwer am überlegen, ob ich gewisse Programmpunkte in eine Bibliothek (Dll/so) oder in eine inc auslagere.
da ich nun für meine µC schon im INC-Sektor arbeite würde ich es gerne da auch beibehalten wollen, stellt sich für mich jedoch da die Frage, ob Lazarus dies ohne Große Probleme verkraftet, wenn der von *PASCAL* auf einmal in "C/C++" springen soll muß.

Bei SO/DLL in Pascal habe ich wiederum den Nachteil und da werden mir alle "Delphi-Programmierer Recht geben, das ich da eine "Sharemem" brauche, wenn ich Strings und der gleichen übergeben will.

um es an einem Beispiel zu erklären.
Ich will / muß folgendes von meinem Programm in mind. eine Lib übergeben.

Code: Alles auswählen

code    : array of array[0..1, 0..7] of char;


Der Inhallt könnte in etwa so ausschauen.

Code: Alles auswählen

Code[0, 0, 1] := 2
Code[0, 1, 0] := 0
Code[0, 1, 1] := 1
Code[0, 1, 2] := 0
Code[0, 1, 3] := 1
Code[0, 1, 4] := 0
Code[0, 1, 5] := 0
Code[0, 1, 6] := 1
Code[0, 1, 7] := 0
Code[1, 0, 1] := 5
Code[1, 1, 0] := 1
Code[1, 1, 1] := 0
Code[1, 1, 2] := 0
Code[1, 1, 3] := 0
Code[1, 1, 4] := 1
Code[1, 1, 5] := 1
Code[1, 1, 6] := 1
Code[1, 1, 7] := 0
Code[2, 0, 1] := 0
Code[2, 1, 0] := 0
Code[2, 1, 1] := 0
Code[2, 1, 2] := 1
Code[2, 1, 3] := 1
Code[2, 1, 4] := 0
Code[2, 1, 5] := 1
Code[2, 1, 6] := 1
Code[2, 1, 7] := 0
Code[3, 0, 1] := 1
Code[3, 1, 0] := 1
Code[3, 1, 1] := 0
Code[3, 1, 2] := 1
Code[3, 1, 3] := 1
Code[3, 1, 4] := 0
Code[3, 1, 5] := 1
Code[3, 1, 6] := 1
Code[3, 1, 7] := 0
Code[4, 0, 1] := 7
Code[4, 1, 0] := 1
Code[4, 1, 1] := 1
Code[4, 1, 2] := 1
Code[4, 1, 3] := 1
Code[4, 1, 4] := 0
Code[4, 1, 5] := 1
Code[4, 1, 6] := 0
Code[4, 1, 7] := 0
Code[5, 0, 1] := 8
Code[5, 1, 0] := 0
Code[5, 1, 1] := 0
Code[5, 1, 2] := 0
Code[5, 1, 3] := 0
Code[5, 1, 4] := 0
Code[5, 1, 5] := 1
Code[5, 1, 6] := 0
Code[5, 1, 7] := 1
Code[6, 0, 1] := 1
Code[6, 1, 0] := 0
Code[6, 1, 1] := 1
Code[6, 1, 2] := 1
Code[6, 1, 3] := 0
Code[6, 1, 4] := 1
Code[6, 1, 5] := 0
Code[6, 1, 6] := 1
Code[6, 1, 7] := 0
Code[7, 0, 1] := 8
Code[7, 1, 0] := 1
Code[7, 1, 1] := 0
Code[7, 1, 2] := 1
Code[7, 1, 3] := 0
Code[7, 1, 4] := 0
Code[7, 1, 5] := 1
Code[7, 1, 6] := 1
Code[7, 1, 7] := 1
Code[8, 0, 1] := 7
Code[8, 1, 0] := 0
Code[8, 1, 1] := 0
Code[8, 1, 2] := 1
Code[8, 1, 3] := 1
Code[8, 1, 4] := 0
Code[8, 1, 5] := 1
Code[8, 1, 6] := 0
Code[8, 1, 7] := 0
Code[9, 0, 1] := 5
Code[9, 1, 0] := 0
Code[9, 1, 1] := 0
Code[9, 1, 2] := 1
Code[9, 1, 3] := 0
Code[9, 1, 4] := 0
Code[9, 1, 5] := 1
Code[9, 1, 6] := 1
Code[9, 1, 7] := 0


Daher erst mal meine Frage vorweg:

Gibt es auch unter Lazarus eine Art Sharemem, Wenn ja wie nennt diese sich hier und wo finde ich eine Extra auf Lazarus zugeschnittenes Tut?

Gru und schönen Mittwoch Maik

Code: Alles auswählen

label.caption:= 'gnublin.no-ip.info'
Debian 12 (L 3.0.0.3 FPC 3.2.2);
windows 10 (L 3.99.0.0 FPC 3.2.0)

USauter
Beiträge: 9
Registriert: Fr 26. Aug 2016, 16:28
OS, Lazarus, FPC: Ubunntu 16.04 (L 1.6+dfsg-1 FPC 3.0.0)
CPU-Target: 64Bit

Re: DLL/SO oder inc

Beitrag von USauter »

Hallo Maik81SE

Deine Frage interessiert auch mich brennendst. Unter Delphi/Windows erstelle ich alle Module mit Runtimepackage rtl und benötigte dann keinen Sharemem. DLL-übergreifende Records mit Pointer wie Strings, dynamische Arrays, ... definiere ich in eigenen Runtime-Packages. Zur Auslieferung kommen dann auch die Delphi-Packages.

Seit kurzem beschäftige ich mich privat mit Lazarus unter Linux (Ubuntu). Mit einer alternativem Lösungsstrategie für dieses Umgebung möchte ich mein Wissen vervollständigen.

Bleibe dran!

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: DLL/SO oder inc

Beitrag von mschnell »

Delphi hat genau aus diesem Grund schon seit zig Jahren "Runtime Packages". Da kann man z.B. prima "Plugins" für seine Programme mit bauen. In Lazarus gibt es das (noch) nicht.
-Michael

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: DLL/SO oder inc

Beitrag von Mathias »

Delphi hat genau aus diesem Grund schon seit zig Jahren "Runtime Packages".

Meinst du damit, das einbinden von OCX-Dateien ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

USauter
Beiträge: 9
Registriert: Fr 26. Aug 2016, 16:28
OS, Lazarus, FPC: Ubunntu 16.04 (L 1.6+dfsg-1 FPC 3.0.0)
CPU-Target: 64Bit

Re: DLL/SO oder inc

Beitrag von USauter »

Das Auslesen eines Strings ist unproblematisch. Problematisch ist das Schreiben, da hierdurch ein anderer Adressraum zugewiesen wird (Überwache von der String-Variablen cText: string den Wert integer(@cText[1])). Delphi und dies dürfte auch auf FPC zutreffen, hat eine Speichermanager, welche den implizit angeforderten Speicher wieder abräumt - ein rudimentärer Garbagecollector. Implizit heißt, der Variablen wird ein Wert zugewiesen ohne hierfür explizit Speicher anzufordern wie dies z.B. mittels GetMem getätigt wird. Ohne Sharemem ist es nun so, dass sowohl Server (EXE) als auch Client (DLL/SO) einen eigenen Speichermanager haben und bei einer Veränderung des Adressraums der zuständige Speichermanager keine Mitteilung erhält. So funktioniert primär die Zuweisung, beim Abräumen der Variablen kommt es jedoch zur Zugriffsverletzung, da der zugehörige Speicherverweis abgehängt wurde.

Eine Lösungsansatz besteht darin, auf Typen auszuweichen, welche auch zur Kommunikation mit anderen Programmiersprachen verwendet werden können.
Delphi <--> C++ Widestring
Delphi <--> C# Widestring/OleString
Auch der Typ Variant ist geeignet.

Zu Beachten ist, dass die Zuweisung eines Delphi-Strings an einen Variant Delphi-Spezifisch ist und in einer anderen Programmiersprache außer Borland keine regelmäßige Entsprechung. Die Zuweisung eines Shortstrings müsste ich klären. Ob die Zuordnung Variantzurodrung von Strings bei Delphi <-> FPC möglich ist, wäre noch zu prüfen.

marcov
Beiträge: 1100
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: DLL/SO oder inc

Beitrag von marcov »

sharemem tauscht der normale memory manager aus und nutzt COM Schnitstellen fuer Memorymanagement. Das ist cross Module, aber langsamer. (nur) COM typen sind auch zu Marshallen zwischen Prozesse. Aber das ist nur Widestring, nicht zb ansistring usw.

Es ist kein GC, aber Referenz Counting (innerhalb ein Process) und kopieren (Marschalling) zwischen Prozesse.

USauter
Beiträge: 9
Registriert: Fr 26. Aug 2016, 16:28
OS, Lazarus, FPC: Ubunntu 16.04 (L 1.6+dfsg-1 FPC 3.0.0)
CPU-Target: 64Bit

Re: DLL/SO oder inc

Beitrag von USauter »

Mathias hat geschrieben:
Delphi hat genau aus diesem Grund schon seit zig Jahren "Runtime Packages".

Meinst du damit, das einbinden von OCX-Dateien ?


So wie ich die Antwort von mschnell verstehe, ist Deine Frage obsolet, da Free Pascal keine Runtime Packages besitzt, existiert keine Möglichkeit der Einbindung.

OCX wird verwendent zur Kommunikation mit einem COM-Server. Dafür müsstest Du erst einen COM-Server - registriert oder nicht registriert - bereitstellen. Ob dies zielgerichtet wäre?

Gruß

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: DLL/SO oder inc

Beitrag von mschnell »

Mathias hat geschrieben:
Delphi hat genau aus diesem Grund schon seit zig Jahren "Runtime Packages".

Meinst du damit, das einbinden von OCX-Dateien ?

Nein, DCP-Dateien.
-> http://www.delphipraxis.net/171762-howt ... kages.html

-Michael

marcov
Beiträge: 1100
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: DLL/SO oder inc

Beitrag von marcov »

mschnell hat geschrieben:
Mathias hat geschrieben:
Delphi hat genau aus diesem Grund schon seit zig Jahren "Runtime Packages".

Meinst du damit, das einbinden von OCX-Dateien ?

Nein, DCP-Dateien.
-> http://www.delphipraxis.net/171762-howt ... kages.html

-Michael



DCP dateien sind nicht loadable. Es ist etwas wie FPC's .a

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: DLL/SO oder inc

Beitrag von mschnell »

Der Link, den ich angegeben habe, spricht von "Dynamisch eingebundenen Runtime-Packages". Ich hatte vermutet, dass dafür die DCP-Dateien verwendet werden. Vielleicht haben diese Dateien aber auch eine andere Endung.

-Michael

Antworten