如何将指针类型数组传递给 RttiMethods.Invoke in Delphi



使用最新更新的Delphi 10.2

我有一个程序(实际代码):

PyObject = packed record ... end;
PPyObject = ^PyObject
PPyObjectArray = array of PPyObject;
procedure invokeMethod (methodName : string; args : PPyObjectArray);
var  ctx: TRttiContext;
rt : TRttiType;
mt : TRttiMethod;
py : TPyArithmetic;
tv : array of TValue;
begin
py := TPyArithmetic.Create;
ctx := TRttiContext.Create;
try
rt := ctx.GetType(TPyArithmetic);
mt := rt.GetMethod (methodName);
setlength (tv, 1);
tv[0].From(args);
mt.Invoke(py, tv);
finally
ctx.Free;
end;
end;

出于调试原因,代码本身在 invokeMethod 中分散到乘法行上。 该过程的目的是使用参数数组参数调用方法 methodName。但是,我无法成功地将参数传递到调用的方法中。尽管调用了正确的函数,但调用方法入口处的参数是乱码。我的问题是我应该如何将 T 数组传递给调用方法?

我还尝试使用

山。Invoke(py, [args]);

但是我收到编译错误:

E2250 没有可以使用这些参数调用的重载版本的"调用"。

山。Invoke(py, [@args]);

但是我收到运行时错误:

带有消息"无效大小写类型转换"的 EInvalidCast,尝试跟踪调用,但没有成功弄清楚我收到错误的原因。

调用端的代码为:

class function TPyArithmetic.add (args : PPyObjectArray) : double;
begin
result := TArithmetic.add (GetPythonEngine.PyFloat_AsDouble (args[0]), GetPythonEngine.PyFloat_AsDouble (args[1]));
end;

有什么建议吗?

TValue.From是一个返回新值的函数。A 此代码是错误的:

tv[0].From(args);

没有任何东西分配给tv[0].您需要这样做:

tv[0] := TValue.From(args);

更简单的是删除动态数组并使用开放数组构造函数:

mt.Invoke(py, [TValue.From(args)]);

创建和销毁 RTTI 上下文的代码也是虚假的。它以您的方式工作正常,但它同样可以是:

procedure invokeMethod(methodName: string; args: PPyObjectArray);
var  
ctx: TRttiContext;
rt: TRttiType;
mt: TRttiMethod;
py: TPyArithmetic;
begin
py := TPyArithmetic.Create;  
rt := ctx.GetType(TPyArithmetic);
mt := rt.GetMethod (methodName);
mt.Invoke(py, [TValue.From(args)]);
end;

FWIW,看起来您的代码泄漏py.

最新更新