You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 15:25:08