如何最好地在DWScript中公开类实例

Bri*_*ost 6 delphi rtti dwscript

我正在使用优秀的Pascal DWScript整合内置脚本功能.我还使用以下命令将自己的Delphi端类定义(TDemo)添加到DWScript:

dwsUnit.ExposeRTTI( TDemo.ClassInfo  )
Run Code Online (Sandbox Code Playgroud)

这只是工作,是快速添加属性和方法的好方法.

我也希望以类似的方式添加现有实例,因此我创建了类型为TDemo的实例FDemo,然后执行:

   dwsUnit.ExposeInstanceToUnit( 'Demo', 'TDemo', FDemo );
Run Code Online (Sandbox Code Playgroud)

这看起来很有前途,但是我从未初始化的单位表中得到一个AV.我也查看了SVN源的单元测试代码,看看这个功能的使用但无济于事.任何人都可以指出我应该添加/更改的内容吗?

Eri*_*nge 4

必须在 TdwsUnit 表初始化中使用 ExposeInstanceToUnit,有关一些示例代码,请参阅 RTTIExposeTests/ExposeInstancesAfterInitTable。它允许直接公开动态实例。

另一种方法是使用TdwsUnit 组件的Instances集合,您可以获得设计时支持,并对实例及其生命周期进行更多控制。

另请记住,即使脚本行为不当,您也必须确保您公开的实例能够正常运行,例如当用户尝试手动销毁您公开的实例时,并且该实例不应被销毁。默认情况下,ExposeRTTI 将映射析构函数,因此您可能希望通过指定 eoNoFreeOnCleanup 来限制它。

编辑:最近添加的最后一种方法是使用 TdwsRttiConnector,它基本上允许公开和连接到通过 RTTI 可访问的任何内容。就设置代码而言,这是非常轻量级的,但缺点是您无法获得任何形式的编译时检查。