我的服务器通过COM / DCOM调用将字符串流作为OleVariant返回。 此代码适用于客户端,但可能会得到改进。 欢迎提示。
作为后续操作,如果服务器将OleVariant流作为UTF-8返回, 客户端将其转换为unicode的最佳方式是什么?
procedure TClientToServer.GetText( mode : integer;
const infoText : widestring;
txt : TStrings);
var
size : integer;
dataP : pointer;
data : OleVariant;
strStream : TStringStream;
begin
txt.Clear;
data:= fDComServer.GetData( mode,infoText);
if VarIsNull(data) then Exit;
size:= VarArrayHighBound(data,1) + 1;
dataP:= VarArrayLock( data);
try
strStream:= TStringStream.Create;
try
strStream.Write( dataP^,size);
strStream.Seek(0,0);
txt.LoadFromStream( strStream);
finally
strStream.Free;
end;
finally
VarArrayUnlock( data);
end;
end;
编辑: 使用UTF8意味着在网络上使用更少的带宽,并且在稍后实现基于UTF8字符串的http协议接口时,我可以或多或少地重用COM / DCOM例程。
感谢大卫指出我正确的方向来修改代码。
以下是更新程序:
procedure TClientToServer.GetText( mode : integer;
const infoText : widestring;
txt : TStrings);
var
size : integer;
dataP : Pointer;
data : OleVariant;
utf8Str : Utf8String;
begin
txt.Clear;
data:= fDComServer.GetData( mode,infoText);
if VarIsNull(data) then Exit;
size:= VarArrayHighBound(data,1) + 1;
dataP:= VarArrayLock( data);
try
SetString( utf8Str, PAnsiChar(dataP), size);
txt.Text:= utf8Str;
finally
VarArrayUnlock( data);
end;
end;
答案 0 :(得分:2)
你真的不需要字符串流。您只需调用SetString()
即可创建包含dataP
内容的Delphi字符串,然后将该字符串分配给txt.Text
。如果您有UTF8数据,则将UTF8字符串传递给SetString()
。
使用SetString()
仍然需要一个中间缓冲区分配,所以我想真正好的是一个只读TStream
后代,你可以传递一个指针和一个大小。您可以将该流传递给TStrings.LoadFromStream
。写这样的东西很容易。
你真的遇到了性能问题吗?如果没有,那么为什么要改变你目前的做法。