我遇到了与“中提到的相同的问题”Delphi XE4 Indy TBytes 和 TidBytes 之间的兼容性问题 https://stackoverflow.com/questions/16339656/delphi-xe4-indy-compatibility-issue-between-tbytes-and-tidbytes”,即使用 Delphi XE4 编译时 TBytes(Delphi RTL) 和 TIdBytes(Indy) 数据类型之间的兼容性问题。问题的根源是代码不完全按照 Indy 的接口,并且某些函数使用 TBytes,而不是 TIdBytes ,当调用本机 Indy IO 过程时。
所以我想知道最好的解决办法是什么?
我认为有两种方法:
重构项目中的所有函数以使用 TIdBytes 而不是 TBytes。
实现 TBytesToTidBytes 转换过程(将 TByte 转换为 TIdBytes)并在进行上述本机 Indy 调用之前调用该过程。
哪种方法更好/最好?您对我如何做到这一点还有其他想法吗?
仅供参考:我尝试使用 XE4 配置的项目可以在 sourceforge 上在线获取:http://sourceforge.net/projects/indy10clieservr/?source=directory http://sourceforge.net/projects/indy10clieservr/?source=directory
建议的转换过程应该类似于:
procedure TBytesToTIdBytes(const Input:TBytes, var Output: TIdBytes)
var
i,L : Integer;
allocate : Boolean;
begin
L := Length(Input);
if(Length(Output) <> L) then
begin
SetLength(Output,L);
end;
if(L > 0) then
move(Pointer(Input)^,Pointer(Output)^,L);
end;
TBytes
and TIdBytes
都是作为动态数组实现的,只是声明方式不同。 “政治正确”的解决方案是复制字节。但这可能会浪费大型数组的内存。一个更简单的解决方案是使用类型转换,以便您可以利用数组的内部引用计数,例如:
type
PIdBytes = ^TIdBytes;
var
B1: TBytes;
B2: TIdBytes;
begin
B1 := ...;
B2 := PIdBytes(@B1)^;
end;
或者简单地:
var
B1: TBytes;
B2: TIdBytes;
begin
B1 := ...;
B2 := TIdBytes(B1);
end;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)