Wide/Strings über Librarys hinweg

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
paradox
Beiträge: 34
Registriert: Fr 15. Sep 2006, 14:33

Wide/Strings über Librarys hinweg

Beitrag von paradox »

Hallo ich versuche eine Multithread Applikation zu schreiben die Library’s laden kann, in denen die Eigentlichen Funktionen der Applikation enthalten sind.
Da FPC keine alternative zu der BPL Technik unter Delphi bietet wird man zur Kreativität gezwungen. Objekte habe ich mit Abstraktenklassen gelöst, die Library bekommt beim laden nur noch den Pointer von der Anwendung übergeben.
Dies alles geht soweit ganz gut. Nur hin und wieder bekommt eine Library eine Exception die immer darauf zurück zu führen ist das Sie irgend etwas mit einem String macht.

Hat jemand Erfahrungen mit Wide/Strings über Library’s? wenn ihr mehr Infos braucht z.b. Backtrace von gdb einfach fragen.

Danke schon mal im voraus.

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Erfahrungen nir mit strings sollte aber ähnlich sein.
Auf keinen Fall Widestrings oder strings oder ansistrings übergeben.
Üergib nur PChar oder PWideChar dann sollte alles klappen...
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

paradox
Beiträge: 34
Registriert: Fr 15. Sep 2006, 14:33

Beitrag von paradox »

Danke für die schnelle Antwort, nur habe ich damit ein kleines Problem :D.
Da ich auch Varianten mit übergebe, habe ich den MemManager und den WebStringMananger der Library mit übergeben. Doch das scheint nicht die Lösung zu sein ?

schnullerbacke
Beiträge: 1187
Registriert: Mi 13. Dez 2006, 10:58
OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
CPU-Target: AMD A4-6400 APU
Wohnort: Hamburg

Beitrag von schnullerbacke »

Variants sind normalerweise auch nur Pointer. Es sollte also reichen die Unit Variants einzubinden. Nur wenn man eigene Variants baut müssen natürlich die entsprechenden Lib's mit eingebunden werden. Etwas anders sieht die Geschichte aus, wenn die Variants als Ergebnis einer Funktion zurück gegeben werden. Da Pascal nicht das Memory-Management von C/C++ unterstützt muß man da nachhelfen.
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.

(Ringelnatz)

paradox
Beiträge: 34
Registriert: Fr 15. Sep 2006, 14:33

Beitrag von paradox »

Andere Programmier Sprachen sind nicht so mein Problem, die Ristrektion nur Library’s die mit FPC gemacht sind laufen, ist schon ok.

Ich habe hier mal einen backtrace vielleicht kann man mir da weiter helfen:

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread -1481729104 (LWP 18467)]
0x08059cea in SYSTEM_SYSGETMEM_FIXED$LONGINT$$POINTER ()
(gdb) bt
#0 0x08059cea in SYSTEM_SYSGETMEM_FIXED$LONGINT$$POINTER ()
#1 0x08059e28 in SYSTEM_SYSGETMEM$LONGINT$$POINTER ()
#2 0xa7f4afc5 in SYSTEM_GETMEM$POINTER$LONGINT () from /home/richard/multitier/bin/libdbmanager.so
#3 0xa7f40f4c in fpc_ansistr_setlength () from /home/richard/multitier/bin/libdbmanager.so
#4 0xa8019f79 in STRREPLACE (S=0xa1157bb0, SEARCH=0xa806cbec, REPLACE=0x0, FLAGS=[RFREPLACEALL]) at jclstrings.pas:219
#5 0xa8005f4d in TCONNECTIONS__GETCONNECTIONNAME (ANAME=0xa1155410, this=0xa1a8b358) at Tables.pas:1290
#6 0xa80069dc in TCONNECTIONS__GETCONNECTIONBYNAME (ANAME=0xa1155410, this=0xa1a8b358) at Tables.pas:1441
#7 0xa8006bad in TCONNECTIONS__ITEMBYNAME (ANAME=0xa1155410, this=0xa1a8b358) at Tables.pas:1479
#8 0xa8006df2 in TCONNECTIONS__GENERATE (ANAME=0xa13e91f0, ASEARCH=true, this=0xa1a8b358) at Tables.pas:1521
#9 0xa8006a16 in TCONNECTIONS__GETCONNECTIONBYNAME (ANAME=0xa13e91f0, this=0xa1a8b358) at Tables.pas:1447
#10 0xa8006bad in TCONNECTIONS__ITEMBYNAME (ANAME=0xa13e91f0, this=0xa1a8b358) at Tables.pas:1479
#11 0xa800a9bb in TCONNECTIONTABLE__CONNECTIONBYNAME (ANAME=0xa13e91f0, this=0xa88e8c28) at Tables.pas:2425
#12 0xa800ba9e in TCONNECTIONTABLE__SETIMPORTVALUE (ANAME=0xa13e91f0, VALUE=0xa11591f0, this=0xa88e8c28) at Tables.pas:2730
#13 0xa8001f43 in TOPERATIONFUNCTION__INTERNALRUN (this=0xb7daa4c8) at fprocess.pas:1411
#14 0xa80016da in TOPERATIONFUNCTION__RUN (this=0xb7daa4c8) at fprocess.pas:1330
#15 0x080a8d52 in TFUNCTIONHANDLER__EXECFUNCTION (THREAD=0xb6d59ba8, INITEM=0xa18020a8, OUTITEM=0xa1802dc8, this=0xb7f780f8)
at ofunctionhandler.pas:187
#16 0x080ce245 in TREQUESTTHREAD__PROCESSITEM (INITEM=0xa18020a8, this=0xb6d59ba8) at requestthreads.pas:1320
#17 0x080cdddc in TREQUESTTHREAD__EXECUTE (this=0xb6d59ba8) at requestthreads.pas:1230
#18 0x08084899 in CLASSES_THREADFUNC$POINTER$$LONGINT ()
#19 0x08061445 in CTHREADS_THREADMAIN$POINTER$$POINTER ()
#20 0xb7f60240 in start_thread () from /lib/tls/i686/cmov/libpthread.so.0
#21 0xb7ebd3de in clone () from /lib/tls/i686/cmov/libc.so.6


Hier der ausschnitt aus der Tables.pas, jclstrings.pas kennt ihr ja alle.

Code: Alles auswählen

function TConnections.GetConnectionName(const aName : String) : String;
begin
  Result := AnsiUpperCase(aName);
  StrReplace(Result, '~', '', [rfReplaceAll]);
  StrReplace(Result, '-', '', [rfReplaceAll]); //<- Line: 1290
  StrReplace(Result, '.', '', [rfReplaceAll]);
  StrReplace(Result, '#', '', [rfReplaceAll]);
end;


Bis TFUNCTIONHANDLER ist es noch die Anwendung, TOPERATIONFUNCTION ist in der Library deklariert.
Wenn ihr mehr Infos braucht einfach fragen.

Danke schon mal.

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

Beitrag von theo »

Hast du's mit Unit cmem probiert?

paradox
Beiträge: 34
Registriert: Fr 15. Sep 2006, 14:33

Beitrag von paradox »

Hi theo, ich habe es auch gefunden auf http://www.hu.freepascal.org/lists/fpc- ... 09934.html.
Da ich aus der Delphi Welt komme und FPC keine sharemem.pas kennt,
ging ich davon aus die ganzen Manager einfach zu setzen reicht aus.
Ich werde es heute einmal einbauen wird 1-2 Tage dauern.

Danke noch mal an alle

schnullerbacke
Beiträge: 1187
Registriert: Mi 13. Dez 2006, 10:58
OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
CPU-Target: AMD A4-6400 APU
Wohnort: Hamburg

Beitrag von schnullerbacke »

Ich denke für den Fall mußt du für Result Speicher reservieren:

Result:= malloc(SizeOf(array of char));

dürfte in cmem sein.
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.

(Ringelnatz)

Antworten