我遇到了与“Delphi XE4 Indy compatibility issue between TBytes and TidBytes”中提到的问题相同的问题,即在使用Delphi XE4进行编译时,TBytes(Delphi RTL)和TIdBytes(Indy)数据类型之间的兼容性问题。我的问题的根源是代码不完全符合Indy的界面,并且某些函数在调用本地Indy IO过程时使用TBytes而不是TIdBytes。

所以我想知道最好的解决方案是什么?

在我看来,有两种方法:

  • 重构项目中的所有功能以使用TIdBytes而不是TBytes。
  • 实现TBytesToTidBytes转换过程(将TBytes转换为TIdBytes),并在进行上述 native 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;
    

    最佳答案

    TBytesTIdBytes都实现为动态数组,只是声明方式不同。 “政治上正确”的解决方案是复制字节。但这会浪费大型阵列的内存。一个简单的解决方案是使用类型转换,以便可以利用数组的内部引用计数,例如:

    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;
    

    关于delphi - 我应该如何调整我的代码以实现TBytes和TIdBytes之间的兼容性?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18849053/

    10-09 01:37