【问题标题】:Delphi Web Script: How to Expose a Class via RTTI which contains a Method returning another (exposed) ClassDelphi Web 脚本:如何通过 RTTI 公开一个包含返回另一个(公开)类的方法的类
【发布时间】:2011-04-20 08:31:42
【问题描述】:

我有这个 Delphi 类

type
  TAnotherClass = class
  end;

  TMyClass = class
    function Foo: TAnotherClass;
  end;

function TMyClass.Foo: TAnotherClass;
begin
  Result := TAnotherClass.Create;
end;

现在我想通过“dwsRTTIExposer.pas”公开这个类:

myUnit.ExposeRTTI(TypeInfo(TMyClass));
myUnit.ExposeRTTI(TypeInfo(TAnotherClass));

我的脚本是这样的:

var a: TMyClass = TMyClass.Create;
var b: TAnotherClass;
b := a.Foo;

不幸的是,Delphi Web Script 无法将 TMyClass.Foo 的返回值识别为有效的 Script Class。是否有可能在不回退到使用 OnEval-Eventhandler 手动公开每个方法的情况下做到这一点?

【问题讨论】:

    标签: delphi rtti dwscript


    【解决方案1】:

    ExposeRTTI 目前不支持类类型的参数。

    这是因为在脚本中返回直接的 Delphi 类可能会出现问题,因为 Delphi 对象的生命周期是任意且不确定的(Delphi 端的对象可以随时销毁而无需通知 f.i.)。

    您不必手动公开每个方法,您可以为每个涉及基本类型的方法使用RTTI暴露器,只需手动处理涉及类类型的方法。

    这将使您不得不决定如何公开脚本端对象,以及它们与 Delphi 端对象的关系,这是 RTTI 没有提供的线索。

    例如,对于您的原始代码,OnEval 代码只会创建一个新的脚本对象,该对象为每次调用包装方法 Result。

    但是如果 Foo 的实现被更改为类似的东西,它的 RTTI 签名仍然是完全相同的

    TMyClass = class
       private
          FFoo: TAnotherClass;
       public
          function Foo: TAnotherClass;
    end;
    
    function TMyClass.Foo: TAnotherClass;
    begin
       if FFoo=nil then
          FFoo := TAnotherClass.Create;
       Result := FFoo;
    end;
    

    但是,在这种情况下,OnEval 必须完全不同,因为您必须在后续调用中返回相同的脚本端对象,并且您还需要挂钩脚本端对象的析构函数以正确处理对私有 FFoo 字段的影响。

    一旦 Delphi 拥有真正的垃圾收集对象,就可以放宽约束,但目前唯一接近的是 TInterfacedObject,它是不安全的,您仍然必须处理手动事件处理程序来处理循环引用或禁用引用计数的类(如 VCL 组件)。

    【讨论】:

    • 感谢您的回复。这对我帮助不大。我编写了一个自己的 Exposer,它通过 TProgramInfo.RegisterExternalObject 和 IScriptObj.ExternalObject 支持将类作为参数和结果。它就像魅力;-)但是你是对的,生命周期问题使得这不是一个通用的解决方案。但是可以添加另一个属性来控制“AutoFree”。您对我的解决方案感兴趣吗?
    • @Stebi:我对您的解决方案感兴趣。我需要公开嵌套的实例类,其中生命周期完全在我的控制之下,我只想对它们进行只读访问。
    • @BrianFrost 你明白了吗?我也有同样的问题。
    猜你喜欢
    • 2023-03-26
    • 1970-01-01
    • 2021-10-10
    • 2020-01-16
    • 1970-01-01
    • 1970-01-01
    • 2011-05-18
    • 1970-01-01
    相关资源
    最近更新 更多