Wide/Strings über Librarys hinweg
Wide/Strings über Librarys hinweg
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.
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.
-
- 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
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)
(Ringelnatz)
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.
Bis TFUNCTIONHANDLER ist es noch die Anwendung, TOPERATIONFUNCTION ist in der Library deklariert.
Wenn ihr mehr Infos braucht einfach fragen.
Danke schon mal.
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;
Wenn ihr mehr Infos braucht einfach fragen.
Danke schon mal.
Hi theo, ich habe es auch gefunden auf http://www.hu.freepascal.org/lists/fpc- ... 09934.html" onclick="window.open(this.href);return false;.
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
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
-
- 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