AStream.ReadBuffer(Pointer(Str)^, AStream.Size div SizeOf(Char));
That's odd. Shouldn't you be referring to the location of data in the string, and are there char sizes different than 1? So simplified:
AStream.ReadBuffer(Str[1], AStream.Size);
edit: Testing things... Pointer(Str)^ seems equal to Str[1]. But SizeOf(Char) is 1, whereas SizeOf(WideChar) is 2. SizeOf(Str[1]) is 1 for string type, but 2 for widestring.