DLL/SO oder inc

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.

DLL/SO oder inc

Beitragvon Maik81SE » 25. Mai 2016, 03:56 DLL/SO oder inc

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'
Maik81SE
 
Beiträge: 75
Registriert: 30. Sep 2011, 13:07
Wohnort: Lübeck
OS, Lazarus, FPC: Win7/(en)Debian/Ubuntu 14:10 (L 1.2.4+dfsg-1. FPC 2.6.x) | 
CPU-Target: 64bit; arm; avr
Nach oben

Beitragvon USauter » 1. Okt 2016, 16:20 Re: DLL/SO oder inc

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!
USauter
 
Beiträge: 9
Registriert: 26. Aug 2016, 15:28
OS, Lazarus, FPC: Ubunntu 16.04 (L 1.6+dfsg-1 FPC 3.0.0) | 
CPU-Target: 64Bit
Nach oben

Beitragvon mschnell » 2. Okt 2016, 11:11 Re: DLL/SO oder inc

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
mschnell
 
Beiträge: 3202
Registriert: 11. Sep 2006, 09:24
Wohnort: Krefeld
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ) | 
CPU-Target: X32 / X64 / ARMv5
Nach oben

Beitragvon Mathias » 2. Okt 2016, 16:10 Re: DLL/SO oder inc

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

Meinst du damit, das einbinden von OCX-Dateien ?
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3777
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon USauter » 2. Okt 2016, 16:36 Re: DLL/SO oder inc

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.
USauter
 
Beiträge: 9
Registriert: 26. Aug 2016, 15:28
OS, Lazarus, FPC: Ubunntu 16.04 (L 1.6+dfsg-1 FPC 3.0.0) | 
CPU-Target: 64Bit
Nach oben

Beitragvon marcov » 3. Okt 2016, 09:08 Re: DLL/SO oder inc

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.
marcov
 
Beiträge: 1027
Registriert: 5. Aug 2008, 08:37
Wohnort: Eindhoven (Niederlande)
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk) | 
CPU-Target: 32/64,PPC(+64), ARM
Nach oben

Beitragvon USauter » 3. Okt 2016, 10:33 Re: DLL/SO oder inc

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ß
USauter
 
Beiträge: 9
Registriert: 26. Aug 2016, 15:28
OS, Lazarus, FPC: Ubunntu 16.04 (L 1.6+dfsg-1 FPC 3.0.0) | 
CPU-Target: 64Bit
Nach oben

Beitragvon mschnell » 4. Okt 2016, 09:50 Re: DLL/SO oder inc

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
mschnell
 
Beiträge: 3202
Registriert: 11. Sep 2006, 09:24
Wohnort: Krefeld
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ) | 
CPU-Target: X32 / X64 / ARMv5
Nach oben

Beitragvon marcov » 4. Okt 2016, 10:20 Re: DLL/SO oder inc

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
marcov
 
Beiträge: 1027
Registriert: 5. Aug 2008, 08:37
Wohnort: Eindhoven (Niederlande)
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk) | 
CPU-Target: 32/64,PPC(+64), ARM
Nach oben

Beitragvon mschnell » 5. Okt 2016, 11:06 Re: DLL/SO oder inc

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
mschnell
 
Beiträge: 3202
Registriert: 11. Sep 2006, 09:24
Wohnort: Krefeld
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ) | 
CPU-Target: X32 / X64 / ARMv5
Nach oben

• Themenende •

Zurück zu Sonstiges



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

porpoises-institution
accuracy-worried