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(程序集)块来调用它,但就是这样. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- (转)golang 垃圾回收机制
- 大数据分析如何改变传统酒店与保险业
- #Leetcode# 235. Lowest Common Ancestor of a Binary Sear
- 让自己写的Delphi控件具备接收windows消息的能力
- 在vb.net中的方法名称后面的美元符号的含义是什么
- perl – 为什么减少{}没有按预期返回最大值?
- Lua中的定时器
- delphi – 当TDBGrid.DefaultDrawing为false时,如何对Full
- php – 如何使用Laravel的块来避免内存不足?
- How to deploy a Delphi OSX project from the command lin