加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 访问_CopyArray过程

发布时间:2020-12-15 09:06:35 所属栏目:大数据 来源:网络整理
导读:有没有办法访问(和调用)像单元系统中的接口中定义的_CopyArray程序? 注意:我正在尝试创建一个对任何动态数组进行深度克隆的例程,并且不使用Delphi 2010(使用Delphi 2007). 我试图在不使用Copy的情况下解决这个问题的原因是我只有一个动态数组所在的指针(指
有没有办法访问(和调用)像单元系统中的接口中定义的_CopyArray程序?

注意:我正在尝试创建一个对任何动态数组进行深度克隆的例程,并且不使用Delphi 2010(使用Delphi 2007).

我试图在不使用Copy的情况下解决这个问题的原因是我只有一个动态数组所在的指针(指针)和一个typeinfo引用.我无法调用Copy函数,因为它隐式需要填写typeinfo.

解:
您需要通过用@替换_并使用系统确定它来引用它.

procedure CopyArray( dest,source,typeInfo: Pointer; cnt: Integer );
asm
    PUSH    dword ptr [EBP+8]
    CALL    system.@CopyArray
end;

type
    PObject = ^TObject;

function TMessageRTTI.CloneDynArray( Source: Pointer; T: TTypeRecord ): Pointer;
var
    TypeInfo: TTypeRecord;
    L:        Integer;
    PObj:     PObject;
    PArr:     PPointer;
begin
    Assert( T.TypeKind = tkDynArray );

    // set size of array
    Result := nil;
    L := Length( TIntegerDynArray( Source ) );
    if L = 0 then Exit;
    DynArraySetLength( Result,T.TypeInfo,1,@L );

    if Assigned( T.TypeData^.elType ) then TypeInfo := ByTypeInfo( T.TypeData^.elType^ ) else TypeInfo := nil;
    if Assigned( TypeInfo ) then begin
        case TypeInfo.TypeKind of
            tkClass: begin
                PObj := Result;
                while L > 0 do begin
                    PObj^ := CloneObject( PObject( Source )^ );
                    Inc( PObject( Source ) );
                    Inc( PObj );
                    Dec( L );
                end;
            end;
            tkDynArray: begin
                PArr := Result;
                while L > 0 do begin
                    PArr^ := CloneDynArray( PPointer( Source )^,TypeInfo );
                    Inc( PPointer( Source ) );
                    Inc( PArr );
                    Dec( L );
                end;
            end;
            else CopyArray( Result,Source,TypeInfo.TypeInfo,L );
        end;
    end else begin
        // We can simply clone the data
        Move( Source^,Result^,L * T.ElementSize );
    end;
end;

解决方法

就像Serg和Andreas所说的那样,_例程都使用编译器魔术来提供功能,所以你应该使用Copy而不是_CopyArray,而不是_IsClass等.

要直接回答你的问题,不,没有办法从其他单位的Delphi代码中调用这些例程.在编译System.pas和SysInit.pas时,RTL的makefile传递一个未记录的编译器开关,它告诉编译器将任何前导_字符转换为@.例如,_CopyArray变成@CopyArray.您可以使用BASM(程序集)块来调用它,但就是这样.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读