我正在研究最近从Delphi 2007升级到XE7的应用程序。 TMemoryStream到PChar的转换失败了。下面是代码:移植到Delphi XE7后,StrAlloc无法正常工作
procedure TCReport.CopyToClipboard;
var
CTextStream: TMemoryStream;
PValue: PChar;
begin
CTextStream := TMemoryStream.Create;
//Assume that this code is saving a report column to CTextStream
//Verified that the value in CTextStream is correct
Self.SaveToTextStream(CTextStream);
//The value stored in PValue below is corrupt
PValue := StrAlloc(CTextStream.Size + 1);
CTextStream.Read(PValue^, CTextStream.Size + 1);
PValue[CTextStream.Size] := #0;
{ Copy text stream to clipboard }
Clipboard.Clear;
Clipboard.SetTextBuf(PValue);
CTextStream.Free;
StrDispose(PValue);
end;
添加代码SaveToTextStream:
procedure TCReport.SaveToTextStream(CTextStream: TStream);
var
CBinaryMemoryStream: TMemoryStream;
CWriter: TWriter;
begin
CBinaryMemoryStream := TMemoryStream.Create;
CWriter := TWriter.Create(CBinaryMemoryStream, 24);
try
CWriter.Ancestor := nil;
CWriter.WriteRootComponent(Self);
CWriter.Free;
CBinaryMemoryStream.Position := 0;
{ Convert Binary 'WriteComponent' stream to text}
ObjectBinaryToText(CBinaryMemoryStream, CTextStream);
CTextStream.Position := 0;
finally
CBinaryMemoryStream.Free;
end;
end;
我观察到,strlen的值(P Char)也现身是内存流的一半大小。但在Delphi 2007中,它的出现与TMemoryStream的大小相同。
我知道上面的代码假设char的大小为1个字节,这可能是一个问题。但我尝试了多种方法,没有任何工作。
你能否提出一个更好的方式来进行这种转换?
“SaveToTextStream”以什么编码存储数据?修正你的代码的正确方法取决于使用的编码。三种现实的可能性是:1)与'UnicodeString'(UTF-16LE)相同的编码2)UTF-8 3)与'AnsiString'(取决于Windows活动代码页)相同的编码。 – hvd
这是为什么被拒绝? – jetty