Я предполагаю, что FText
- это PChar
. Поскольку вы говорите, что используете Delphi 2010, вы должны знать, что Char
на самом деле является синонимом WideChar
и имеет ширину 2 байта. Я подозреваю, что вы действительно хотите использовать AnsiChar
.
Самая явная проблема заключается в том, что вы выделяете память для FText
, а затем отбрасываете ее с назначением на FText
. Более того, память, на которую ссылается FText
, уничтожается при завершении процедуры.
Я думаю, что вы, вероятно, должны сделать следующее:
- Переключитесь на
AnsiChar
для вызовов recv
.
- Изменить
FText
на AnsiString
.
- Прекратить использование
GetMem
в целом и использовать выделение стека.
Возможно, что-то вроде этого:
procedure TReadThread.Execute;
Var
iRead, count: Integer;
header: array [0..12-1] of AnsiChar;
params: array [0..16384-1] of AnsiChar;
begin
try
iRead := recv(FSocket, header, 12, 0);
if (iRead<>12) then
raise Exception.Create('Header receiving problem!');
count := StrToIntDef(Copy(header,3,4),0);
if (count=0) then
raise Exception.Create('Body receiving problem!');
if (count+12<=16384) then
begin
iRead := recv(FSocket, params, count, 0);
if (iRead<>count) then
raise Exception.Create('Cant receive messsage fully!');
end
else
raise Exception.Create('Bad message size (>16 KB)!');
SetLength(FText, 12+count);
Move(header, FText[1], 12);
Move(params, FText[13], count);
except
on E : Exception do
ShowMessage(E.Message);
end;
end;