我遇到了与" TBytes和TidBytes之间的Delphi XE4 Indy兼容性问题 "中提到的相同的问题,即在使用Delphi XE4进行编译时TBytes(Delphi RTL)和TIdBytes(Indy)数据类型之间的兼容性问题.我的问题的根源是代码不完全符合Indy的接口,并且一些函数在调用本机Indy IO过程时使用TBytes而不是TIdBytes.
所以我想知道最好的解决方案是什么?
我认为有两种方法:
重构项目中的所有函数以使用TIdBytes而不是TBytes.
实现TBytesToTidBytes转换过程(将TBytes转换为TIdBytes)并在进行上述本机Indy调用之前调用该过程.
哪种方法更好/最好?您对我如何做到这一点有什么其他想法吗?
仅供参考:我尝试使用XE4配置的项目可在sourceforge上在线获取: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;
Run Code Online (Sandbox Code Playgroud)
TBytes并且TIdBytes都是作为动态数组实现的,它们只是以不同方式声明."政治上正确"的解决方案是制作字节的副本.但这会浪费大型阵列的内存.更简单的解决方案是使用类型转换,以便您可以利用数组的内部引用计数,例如:
type
PIdBytes = ^TIdBytes;
var
B1: TBytes;
B2: TIdBytes;
begin
B1 := ...;
B2 := PIdBytes(@B1)^;
end;
Run Code Online (Sandbox Code Playgroud)
或者干脆:
var
B1: TBytes;
B2: TIdBytes;
begin
B1 := ...;
B2 := TIdBytes(B1);
end;
Run Code Online (Sandbox Code Playgroud)