我正在使用优秀的Pascal DWScript整合内置脚本功能。我还使用以下方法将自己的Delphi端类定义(TDemo)添加到DWScript中:
dwsUnit.ExposeRTTI( TDemo.ClassInfo )
这很有效,是快速添加属性和方法的好方法。
我也希望以类似的方式添加现有实例,因此我创建了TDemo类型的实例FDemo,然后执行:
dwsUnit.ExposeInstanceToUnit( 'Demo', 'TDemo', FDemo );
这看起来很有前途,但我从未初始化的单位表中获得了AV。我也查看了SVN源的单元测试代码,看看这个功能的使用但无济于事。任何人都可以指出我应该添加/更改的内容吗?
答案 0 :(得分:4)
必须在TdwsUnit表初始化中使用ExposeInstanceToUnit,有关示例代码,请参阅RTTIExposeTests / ExposeInstancesAfterInitTable。它允许直接暴露动态实例。
另一种方法是使用TdwsUnit组件的 Instances 集合,获得设计时支持,以及对实例及其生命周期的更多控制。
另外请记住,即使脚本行为不当,你必须确保你公开的实例能够正常运行,f.i。当用户尝试手动销毁您公开的实例时,不应销毁该实例。默认情况下,ExposeRTTI将映射析构函数,因此您可能希望通过指定eoNoFreeOnCleanup来限制它。
编辑:最近添加的最后一种方法是使用TdwsRttiConnector,它基本上允许暴露和连接到可通过RTTI访问的任何内容。在设置代码方面,这是非常轻量级的,但缺点是你没有得到任何形式的编译时检查。