Du versuchst also diese Records über EXE/
DLL-Grenzen hinweg zu übertragen?
A) sollte man bei sowas nie String, Integer und immer mit packed Records arbeiten, da unterschiedliche Compiler/Optionen sonst den Record verändern und andere Typen verwenden würden.
B) Hast du auch einen SharedMemoryManager eingerichtet?
Strings werden im Delphi-SpeicherManager abgelegt und da hat standardmäßig jede EXE/
DLL ihre eigene Instanz eines SpeicherManagers.
[add]
*den Neutral General steinige*
Delphi-Quellcode:
ShortString = packed record
Len: Byte;
Data: Array[1..Len] of AmsiChar;
end;
@S zeigt auf Len, bzw. den Recordanfang
Delphi-Quellcode:
type
// Delphi 2007 und kleiner
PStrRec = ^StrRec;
StrRec = packed record
refCnt: Longint; // Referenzzähler
length: Longint; // Stringlänge
data: array[1..x] of AnsiChar;
end;
// Delphi 2009+
PStrRec = ^StrRec;
StrRec = packed record
codePage: Word;
elemSize: Word;
refCnt: Longint;
length: Longint;
data: array[1..x] of AnsiChar; // für AnsiString oder WideChar für UnicodeString
end;
@S zeigt auf den Pointer
@S[1] und Pointer(S), bzw PChar(S) zeigen auf "data", bzw. das erste Zeichen und nicht auf den RecordAnfang
also String/AnsiString/UnicodeStrin entsprechen intern jeweil ihrer PStrRec-Variante
( WideString ist was Anderes und der Entspricht einem
OLE-String, verwaltet von der OleAuth.dll )