DWScript对象属性Getter/Setter实现及跨脚本对象存活问题
Delphi tdwsUnit跨脚本传递TObject对象解决方案
问题背景
在tdwsUnit中声明了TObject类型属性及对应Getter/Setter,需将对象存储在Delphi端全局“对象存储”中,实现同一Delphi进程内:脚本A创建并存储对象,脚本B读取并使用该对象。现有代码片段存在两处待实现逻辑,同时需确认对象跨脚本运行的存活能力。
现有代码:
Var ObjectStore : TObject; procedure TDWSLibTools.TApp_GetObject(Info: TProgramInfo; ExtObject: TObject); begin // 如何返回ObjectStore中的对象? <ResultOfThisGetter> := ObjectStore; end; procedure TDWSLibTools.TApp_SetObject(Info: TProgramInfo; ExtObject: TObject); begin // 如何访问名为“Value”的参数中的对象? ObjectStore := Info.Vars['Value'].Get????? end;
代码实现修正
Setter方法(TApp_SetObject)
通过Info.Vars['Value'].GetObject()方法提取脚本传入的TObject对象,赋值给全局存储变量:
procedure TDWSLibTools.TApp_SetObject(Info: TProgramInfo; ExtObject: TObject); begin ObjectStore := Info.Vars['Value'].GetObject; end;
Getter方法(TApp_GetObject)
tdws的Getter方法通过ExtObject参数返回结果,直接将全局存储的对象赋值给该参数即可:
procedure TDWSLibTools.TApp_GetObject(Info: TProgramInfo; ExtObject: TObject); begin ExtObject := ObjectStore; end;
对象跨脚本存活能力说明
只要ObjectStore是Delphi进程级全局变量(或生命周期覆盖多次脚本运行的变量),且对象未被手动释放、也未被Delphi内存管理机制自动回收,该对象就能在多次脚本运行间保持存活。
注意要点:
- 需明确对象所有权,避免内存泄漏:当对象不再被使用时,要在Delphi端手动调用
Free释放,或使用TObjectList等容器托管内存。 - 若
ObjectStore为局部变量,脚本运行结束后变量销毁,对象会失去有效引用,可能被自动回收。
内容的提问来源于stack exchange,提问作者LuWey
相关产品推荐
相关产品推荐

