Есть в недрах VCL такой класс TPointerStream. Правда он приватный, но тем не менее.
В старых версиях он находился в файле EncdDecd в новых переехал в System.NetEncoding.
function TPointerStream.Write(const Buffer; Count: LongInt): LongInt;
var
Pos, EndPos, Size: LongInt;
Mem: Pointer;
begin
Pos := Self.Position;
if (Pos >= 0) and (Count > 0) then
begin
EndPos := Pos + Count;
Size := Self.Size;
if EndPos > Size then
raise EStreamError.CreateRes(@SMemoryStreamError);
Mem := Self.Memory;
System.Move(Buffer, Pointer(Longint(Mem) + Pos)^, Count);
Self.Position := Pos;
Result := Count;
Exit;
end;
Result := 0;
end;
Как мне кажется строка Self.Position := Pos должна быть записана как Self.Position := EndPos;
В противном случае два последовательных Write будут писать в одно и то же место памяти.
Та же ошибка скопипастена у
http://www.gunsmoker.ru/2011/11/blog-post_12.html Как думаете это ошибка или такой замысел?