Hallo,
um einen (umfangreichen und Strings enthaltenden) Record mit WM_COPYDATA versenden zu können wollte ich diesen in einen TMemoryStream packen und diesen versenden.
Beim Auspacken aber funktioniert nur der erste String:
Verpacken:
Delphi-Quellcode:
TMyRecord = packed record
s1: string;
s2: string;
end;
...
rec : TMyRecord;
rec.s1:= 'langer String.....1';
rec.s2:= 'langer String.....2';
procedure RecordToStream(var ms: TMemorystream; rec: TMyRecord);
var
c: Char;
s: String;
i: integer;
begin
ms.Clear;
i := length(rec.s1);
ms.write(i, sizeof(i));
for i := 1 to length(rec.s1) do
begin
c := rec.s1[i];
ms.write(c, sizeof(c));
end;
i := length(rec.s2);
ms.write(i, sizeof(i));
for i := 1 to length(rec.s2) do
begin
c := rec.s2[i];
ms.write(c, sizeof(c));
end;
end;
Auspacken:
Delphi-Quellcode:
function StreamToRecord(ms: TMemorystream): TMyRecord;
var
len: integer;
sbuf: string;
begin
ms.Position := 0;
//Speichern zum Angucken
ms.savetofile('c:\temp\stream.xxx');
ms.Read(len, sizeof(len));
sbuf := StringOfChar(#00, len);
ms.Read(sbuf[1], len);
result.s1 := sbuf;
ms.Read(len, sizeof(len));
sbuf := StringOfChar(#00, len);
ms.Read(sbuf[1], len);
result.s2 := sbuf;
end;
Hier ist die len des 2. Strings utopisch groß und s2 bekommt den Inhalt den auch s1 hat!
Der Stream wird korrekt übertragen, die gespeicherte Version sieht im Hexeditor korrekt aus, es muss also ein Fehler in StreamToRecord liegen, nur welcher?
ms.Position habe ich im Debugger ebenfalls kontrolliert, sieht normal und richtig aus...
Ciao
Stefan