给定一个IScriptObj
参考,如何获得相应的IInfo
or TProgramInfo
?
我有一个包装 Delphi 对象的脚本对象。
为了管理脚本对象的生命周期,Delphi 对象存储了对脚本对象的引用。Script 对象是用一个TdwsUnit
组件声明的。这是非常标准的,是这样的:
德尔福
type
TDelphiObject = class
private
FScriptObject: IScriptObj;
public
procedure DoSomething;
property ScriptObject: IScriptObj read FScriptObject write FScriptObject;
end;
脚本
type
TScriptObject = class
protected
procedure DoSomething; virtual;
public
constructor Create;
end;
Delphi 对象的实例化和 Delphi/脚本链接的设置发生在脚本对象构造函数的 Delphi 实现中。也很标准:
德尔福
// Implements TScriptObject.Create
procedure TMyForm.dwsUnitClassesTScriptObjectConstructorsCreateEval(Info: TProgramInfo; var ExtObject: TObject);
var
DelphiObject: TDelphiObject;
DelphiObjectInfo: IInfo;
begin
// Create the Delphi-side object
DelphiObject := TDelphiObject.Create;
// Get the script object "self" value
DelphiObjectInfo := Info.Vars['self'];
// Store the ScriptObject reference
DelphiObject.ScriptObject := DelphiObjectInfo.ScriptObj;
// Return the instance reference to the script
ExtObject := DelphiObject;
end;
理想情况下,我会保存IInfo
引用,而不是IScriptObj
因为之后IInfo
会做我需要的一切,但从经验来看,该IInfo
对象似乎只在方法调用期间有效。
无论如何,稍后在TDelphiObject.DoSomething
Delphi 端调用时会出现问题。
TDelphiObject.DoSomething
旨在调用脚本对象上相应的虚拟方法:
德尔福
procedure TDelphiObject.DoSomething;
var
Info: IInfo;
DoSomethingInfo: IInfo;
begin
// I have a IScriptObj but I need a IInfo...
Info := { what happens here? };
// Call the virtual DoSomething method
DoSomethingInfo := Info.Method['DoSomething'];
DoSomethingInfo.Call([]);
end;
我尝试了很多不同的技术来获得可用的IInfo
或TProgramInfo
从存储的IScriptObj
,但每件事都失败了。那么这样做的正确方法是什么?