задача: Вызывать метод по адресу и передавать ему параметры и Result. Разные, от простых типов до рекордов, сетов и прочих. Со всем остальным проблем нет, только с динмассивами - бьюсь со вчера, не выходит каменный цветок.
Подскажите, кто в этом разбирается - как динамические массивы (в чистом виде, не типизированные) ПРАВИЛЬНО передавать?
Сразу уточню, что если прописать TCardArr = array of Cardinal и использовать его - то все красиво, но только такой вариант - это вообще малоинтересно.
procedure _TestM(ObjTypes : array of Word; Colors : array of Word; Cons : array of Cardinal);
begin
end;
class function TSForm.TypeFrom<T>(const Value: T): PTypeInfo;
begin
Result := System.TypeInfo(T);
end;
procedure TSForm.TestButtonClick(Sender: TObject);
var
mm,mm2 : array of Word;
nn : array of Cardinal;
Args: TArray<TValue>;
len : Integer;
arr : Pointer;
TInfo : PTypeInfo;
begin
mm := [111,222,333,444];
mm2 := [12,13,14,15];
nn := [555,666,777];
for I := 0 to 2 do
begin
SetLength(Args, Length(Args) + 1);
//params types taken from script info
arr := nil;
case i of
0 :
begin
TInfo := TypeFrom<array of Word>([]);
len := Length(mm);
DynArraySetLength(arr, TInfo, 1, @len);
Move(Pointer(mm)^, arr^, PDynArrayTypeInfo( PByte(TInfo) + PDynArrayTypeInfo(TInfo).name ).elSize * len);
end;
1:
begin
TInfo := TypeFrom<array of Word>([]);
len := Length(mm2);
DynArraySetLength(arr, TInfo, 1, @len);
Move(Pointer(mm2)^, arr^, PDynArrayTypeInfo( PByte(TInfo) + PDynArrayTypeInfo(TInfo).name ).elSize * len);
end;
2:
begin
TInfo := TypeFrom<array of Cardinal>([]);
len := Length(nn);
DynArraySetLength(arr, TInfo, 1, @len);
Move(Pointer(nn)^, arr^, PDynArrayTypeInfo( PByte(TInfo) + PDynArrayTypeInfo(TInfo).name ).elSize * len);
end;
end;
Args[i] := TValue.From<Pointer>(Pointer(arr));
System.Rtti.Invoke(@_TestM,Args,ccReg,nil,False,False);
end;
end;
Вот максимум чего я добился - на входе в _TestM массив ObjTypes имеет один элемент 111, второй массив nil, третий - мусор.
Данный пример написан для воспроизведения проблемы, в оригинале данные приходят из скрипта, в этом случае и содержимое массивов, и инфа о типе массива и его элементов.
Cмотрел как дельфийский компилятор передает массивы - вроде похоже. Так же копирует массив по указателю.