如何从 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 获得某种形式的自动内存管理时,这将变得更简单)。