有没有办法访问(和调用)像单元系统中的接口中定义的_CopyArray程序? 注意:我正在尝试创建一个对任何动态数组进行深度克隆的例程,并且不使用Delphi 2010(使用Delphi 2007). 我试图在不使用
注意:我正在尝试创建一个对任何动态数组进行深度克隆的例程,并且不使用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(程序集)块来调用它,但就是这样.
