gpt4 book ai didi

delphi - 如何在 Delphi 中将指针类型数组传递给 RttiMethods.Invoke

转载 作者:行者123 更新时间:2023-12-03 19:37:09 25 4
gpt4 key购买 nike

使用最新更新的 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 中展开到多行。该过程的目的是使用参数数组 args 调用方法 methodName。但是,我无法成功地将参数传递给调用的方法。尽管调用了正确的函数,但调用方法的入口处的参数是乱码。我的问题是我应该如何将一个 T 数组传递给调用方法?

我也尝试使用调用调用

mt.Invoke(py, [args]);

但我得到编译错误:

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

试过了

mt.Invoke(py, [@args]);

但我得到运行时错误:

带有消息“Invalid case typecast”的 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 .

关于delphi - 如何在 Delphi 中将指针类型数组传递给 RttiMethods.Invoke,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48334544/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com