Man kann nicht einfach so einen Record via Socked verschicken, in welchem solche dynamische Elemente (DynArray, String, Objekt usw.) enthalten sind.
Im Record liegt von dem dynArray nur ein Zeiger, die Arraydaten verstecken sich wo anders und werden nicht mit verschickt.
Zitat:
GetMem(x, 8);
Für derartige Records reserviert man besser über
New und
Dispose den Speicher.
Nicht über GetMem/GetMemory und gibt sie erst ggarnicht über FreeMem wieder frei.
Move('hello', a.buf, 6);
.
Ab Delphi 2009 tritt man mit der festen 6 in ein schönes
Unicode-Fettnäpfchen.
Außerdem hast du vergessen für das dynamische Array vergessen Speicher zu reservieren >
SetLength.
Und das Move überschreibt hier den internen Zeiger und schreibt nicht in den Datenbereich des Arrays.
Delphi-Quellcode:
foo = record
other: Word;
buf: Array[0..0] of AnsiChar;
end;
-
Ansi zur Vorsorge wegen eventuellem
Unicode-Compiler
- über GetMem dann genügend Speicher für den gesamten Text reservieren.
Delphi-Quellcode:
Text := 'hello'; // Text = AnsiString
GetMem(a, 2{other} + Length(Text) + 1{#0}); //a := GetMemory(2{other} + Length(Text) + 1{#0});
a.other := 2;
Move(Text[1], a.buf[0], Length(Text) + 1);
Da in diesem Beispiel ein statisches Array verwendet wird, könnte man hier die [0] zwar weglassen, aber zur Sicherheit macht es sich mit [0] besser und vom Compilat her ist das Ergebnis so oder so gleich.