【发布时间】:2012-06-01 14:37:46
【问题描述】:
如何从 delphi 中调用以类为参数的 DWScript 过程?
例如:
DWScript 方面:
procedure Proc1(AParam: TObject);
begin
// do something useful
end;
德尔福方面:
var
Obj: TObject;
Exec.Invoke('Proc1', [obj]);
【问题讨论】:
如何从 delphi 中调用以类为参数的 DWScript 过程?
例如:
DWScript 方面:
procedure Proc1(AParam: TObject);
begin
// do something useful
end;
德尔福方面:
var
Obj: TObject;
Exec.Invoke('Proc1', [obj]);
【问题讨论】:
您需要将 Delphi 端对象包装到脚本端对象中,并在需要时创建一个。
对于暴露,您可以使用 TdwsUnit 并手动暴露(这可以保护 Delphi 端类免受脚本错误操作),或使用 RTTI 暴露(但在这种情况下,脚本端的错误将能够直接影响 Delphi,因此可能会导致主机崩溃,因此,如果您知道您的课程已经安全,或者您不关心沙盒,请仅使用 RTTI。
如果您只需要简单的暴露,更简单的方法是使用 RTTI 环境(参见 URTTIExposeTests 中的 TRTTIExposeTests.EnvironmentTest),但请记住上述关于 RTTI 和安全/沙盒的注意事项。
更复杂的方法是使用类似的代码创建脚本端对象
scriptObj := Info.Vars['TScriptSideClassName'].Method['Create'].Call([param1, param2]);
然后手动调整它的 ExternalObject 属性。
您可能还必须担心只创建一次脚本端对象(如果您希望脚本端对象比较照常工作),以及清理(即如果 Delphi 端对象被释放会发生什么)当脚本仍在运行时,或者在释放脚本端对象时谁应该负责释放 Delphi 端对象),以及其他微妙之处(当/如果 Delphi 获得某种形式的自动内存管理时,这将变得更简单)。
【讨论】: