Sharemem für .so

Antworten
Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Sharemem für .so

Beitrag von Maik81ftl »

Moin Moin.

War grad wieder auf der suche einer wichtigen Information (was ich alles bei einer dll/so an unit und co brauche), bin allerdings an der Sharemem gescheitert.

da ich Strings zw. den progis und den Lib's austausche, bin ich, und das war schon meine bittere Pille bei Delphi, auf die Unit Sharemem, angewiesen. Leider scheint die hier bei Larazus noch nicht vorhanden zu sein, bzw nur über eine Seberate DLL.

Nur für den fall, das sich hier schon mal einer damit beschäfsogt hat, wäre ich Sehr dankbar, wenn ich eine Gedankenhilfe bekommen könnte, wie dies lösbar ist.

Sage auch gleich im Vorfeld, das meine Letzte DLL, welche ich geschrieben habe 2005 alt ist und sich auch einer Fast defekten HDD befindet :(
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

Benutzeravatar
theo
Beiträge: 10500
Registriert: Mo 11. Sep 2006, 19:01

Re: Sharemem für .so

Beitrag von theo »

Kommt drauf an, was du machen willst.
Wenn du möglichst keinen Ärger haben willst, dann schreib das Interface so, dass es auch von C aus angesprochen werden könnte.
also
String-> PChar, Keine Klassen, Keine dynamischen Arrays etc.

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: Sharemem für .so

Beitrag von Maik81ftl »

theo hat geschrieben:Kommt drauf an, was du machen willst.
Wenn du möglichst keinen Ärger haben willst, dann schreib das Interface so, dass es auch von C aus angesprochen werden könnte.
also
String-> PChar, Keine Klassen, Keine dynamischen Arrays etc.


Ärger??? in wie fern.

Interface so schreiben, das es ach von c aus angesprochen werden kann??? :?:

Edit *

Mir grad mal die Definition von PChar angeschaut

komm ehrlich gesagt nict mit dem ^klar

ergo PChar : ^Char sagt mir nicht wirklich, ob dies nur 1 zeichen ist oder eine Zeichenkette wie z.B. String.

ebenso bei dem Begriff "Null-Terminierte Zeichenkette" machen sich bei mir Böhmische Dörfer auf.
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: Sharemem für .so

Beitrag von Maik81ftl »

hab mich nochmal inna Lazaus Hilfe || zu Delphihilfe umgeschaut.

wie du schon sagste Theo! PChar oder ShortString.

will quasi nur den Binärwert eines zeichens in einem Stringwert

Code: Alles auswählen

Bsp: AC = 0100000101000011
umwandeln.

Dahingehen habe ich auch die Function umgeschrieben und 1:1 von der .so in's Programm gepackt.

Code: Alles auswählen

function StrtoBin(Value: ShortString):ShortString; stdcall;


Aber leider kommt die Meldung

Code: Alles auswählen

unit1.pas:(.text+0x725): undefined reference to `StrtoBin'
Regel.lpr(26,1) Error: Error while linking


wieder. .so liegt im *nix libverzeichnis und im lib-Projektordner.

Selbst die suche nach Bsp. Libs für *nix, brachte null pinkt.
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

Benutzeravatar
theo
Beiträge: 10500
Registriert: Mo 11. Sep 2006, 19:01

Re: Sharemem für .so

Beitrag von theo »

Weiss nicht genau, was du meinst. Nur unter Linux gilt meist CDECL statt STDCALL.

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Sharemem für .so

Beitrag von MAC »

also - string in pascal (delphi) ist eigentlich gepfuscht.
In wirklickkeit haben wir kein string - wir haben einen array of char.
Nur können wir diesen Array sehr einfach behandeln...

In C haben die leute das glück nicht.
Dort hat man ein Array of Char. Generell gilt (jetzt sind wir bei Null-Terminierte Zeichenkette) das der string dann aufhört soballt das erste 0 zeichen kommt.( Ascii 0)
Das heißt aus Hello wird dann
x[0] = 'H';
x[1] = 'e';
x[2] = 'l';
x[3] = 'l';
x[4] = 'o';
x[5] = #0;

Mit hilfe der Ascii tabelle kann man dann jede menge tolle sachen machen , hilfreich byte() und char() um zeichen in zahlen und umgegehrt zu konvertieren...

Der PChar ist, soweit ich weis einen pointer auf das erste zeichen.
Ich schötze , mann muss sich den schnappen und dann im Arbeitsspeicher sich vortasten bis man auf ein wert #0 stößt, dann weis man : der string ist vorbei...

Allgemein solltest du -dll's so programmieren das man von jeder Programiersprache (zumindest mal C, da diese sehr gebräuchlich ist) drauf zugreifen kannst.
Du kannst also keine typen verwenden die diese nicht haben...
Zum beispiel betrieft das auch den pascal typischen "set of".

So und das ganze hab ich geschrieben ohne irgendeine praktische erfahrung mit .dll's xD

Code: Alles auswählen

Signatur := nil;

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Sharemem für .so

Beitrag von Socke »

theo hat geschrieben:Weiss nicht genau, was du meinst. Nur unter Linux gilt meist CDECL statt STDCALL.

Unter Linux wird überwiegend cdecl, unter Windows üblicherweise stdcall verwendet. Was davon (oder etwas ganz anderes) du verwendest hängt von dir und deinen Zielen ab.

Maik81ftl hat geschrieben:da ich Strings zw. den progis und den Lib's austausche, bin ich, und das war schon meine bittere Pille bei Delphi, auf die Unit Sharemem, angewiesen. Leider scheint die hier bei Larazus noch nicht vorhanden zu sein, bzw nur über eine Seberate DLL.

Die Unit Sharemem gibt es beim Free Pascal Compiler ebenfalls (Lazarus hat mit der nichts zu tun), aber eben nur unter Windows. Unter Linux kannst du ähnliches mit der Unit cmem erreichen, die die clib als Speichermanager verwendet.

Wenn du natürlich mit PChar arbeiten willst (funktioniert dann auch mit anderen Sprachen), geht das bspw. so:

Code: Alles auswählen

var
s: String;
ps: PChar;
begin
s := 'Hallo';
ps := 'Hallo2'; // kann man direkt im Quelltext so schreiben
s := ps; // wird automatisch in einen String kopiert, muss aber noch freigegeben werden, wenn es keinen konstanten String enthält
ps := PChar(s); // hier brauchst du einen typcasting; ps dürfte ungültig sein, wenn der Referenzzähler des ursprünglichen Strings auf 0 fällt und er freigegeben wird, sofern er kein konstanter String ist.
end;

Wenn du deine Bibliothek für mehrere Sprachen als Free Pascal verfügbar machen willst, musst du dich vorher auch mit Speicherverwaltung auseinandersetzen.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: Sharemem für .so

Beitrag von Maik81ftl »

theo hat geschrieben:Weiss nicht genau, was du meinst. Nur unter Linux gilt meist CDECL statt STDCALL.

DLL Programmierung

is aber leider zu sehr für win gemacht :(
MAC hat geschrieben:also - string in pascal (delphi) ist eigentlich gepfuscht.
In wirklickkeit haben wir kein string - wir haben einen array of char.
Nur können wir diesen Array sehr einfach behandeln...

In C haben die leute das glück nicht.
Dort hat man ein Array of Char. Generell gilt (jetzt sind wir bei Null-Terminierte Zeichenkette) das der string dann aufhört soballt das erste 0 zeichen kommt.( Ascii 0)
Das heißt aus Hello wird dann
x[0] = 'H';
x[1] = 'e';
x[2] = 'l';
x[3] = 'l';
x[4] = 'o';
x[5] = #0;

Mit hilfe der Ascii tabelle kann man dann jede menge tolle sachen machen , hilfreich byte() und char() um zeichen in zahlen und umgegehrt zu konvertieren...

Der PChar ist, soweit ich weis einen pointer auf das erste zeichen.
Ich schötze , mann muss sich den schnappen und dann im Arbeitsspeicher sich vortasten bis man auf ein wert #0 stößt, dann weis man : der string ist vorbei...

Allgemein solltest du -dll's so programmieren das man von jeder Programiersprache (zumindest mal C, da diese sehr gebräuchlich ist) drauf zugreifen kannst.
Du kannst also keine typen verwenden die diese nicht haben...
Zum beispiel betrieft das auch den pascal typischen "set of".

So und das ganze hab ich geschrieben ohne irgendeine praktische erfahrung mit .dll's xD


weiß zwar auf was du hinaus willst mit dem PChar und Pointer.

da ich allerdings bequem ohne den ausgekommen bin steh ich da grad aus der leitung.

Die fkt string(Pchar) wie es die ja angeblich geben soll mag lazarus bei mir auch nicht wirklich.

und was c angeht. da echt null plan da keine freeware gefunden, für wenig geld.
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6217
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Sharemem für .so

Beitrag von af0815 »

Vielleicht ist zum Thema SharedMem passend der folgende Thread
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: Sharemem für .so

Beitrag von Maik81ftl »

af0815 hat geschrieben:Vielleicht ist zum Thema SharedMem passend der folgende Thread


meinst du des hier???

Code: Alles auswählen

var
test : THandle;
 
(...)
 
showmessage('start');
test := LoadLibrary(PChar(ExtractFilePath(ParamStr(0)) + '\Objects\Image.dll'));
showmessage('mitte');
FreeLibrary(test);
showmessage('stop');


mal versuch.
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: Sharemem für .so

Beitrag von Maik81ftl »

theo hat geschrieben:Weiss nicht genau, was du meinst. Nur unter Linux gilt meist CDECL statt STDCALL.


danke cdecl hat mir erst mal das link problem genommen.

af0815 hat geschrieben:Vielleicht ist zum Thema SharedMem passend der folgende Thread


wenn du genau diesen Teil meinst

Code: Alles auswählen

showmessage('start');
test := LoadLibrary(PChar(ExtractFilePath(ParamStr(0)) + '/lib/libMyCode.so'));
showmessage('mitte');
FreeLibrary(test);
showmessage('stop');

auch der war goldig.

Danke euch beider erst mal für genau diesen wink mit der Dachrinne...

nun nur noch den PChar in einen String zurückbekommen und freuen :D
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

Antworten