在RemObjects Pascal脚本(Delphi)中加载预编译的脚本

时间:2013-06-14 05:16:09

标签: delphi pascal pascalscript

我正在尝试在运行时在Delphi中加载预编译的RemObjects Pascal脚本。 但是,当我尝试加载时,Delphi除了“无法导入VALUE_TEAMCODE”。 Value_TeamCode是我已经在Pascal脚本中注册的Delphi应用程序中的一个函数。

这是我正在做的事情。下面是粗略的伪代码 - 实际代码分为多个文件。此外,当需要运行脚本时,以下SetCompiled调用会在应用程序中发生。{/ p>

关于代码的注意事项:   FPascalScriptTPSScriptDebugger

...

//Register custom functions with Pascal Script
FuncsRegister;  

//Load script
FPascalScript.Script.AddStrings(AContent);

//Compile script
FPascalScript.Compile;

//Get compiled script
FPascalScript.GetCompiled(sCompiledScript)

//Try and set script back in - ERROR Here 'Cannot Import VALUE_TEAMCODE'
FPascalScript.PascalScript.Debugger.SetCompiled(sCompiledScript);

...

也许我正在犯这个错误。我不确定是否可以加载预编译的脚本。

我在RemObjects WebSite Wiki上搜索,但删除了Pascal脚本帮助。 我还在StackOverflow上搜索了各种主题,但似乎都没有与此问题相关。

再说一遍。我已经在运行时编译和执行脚本而没有任何问题。出于性能原因,我需要预编译。

任何帮助表示感谢。

更新

目前的解决方法是在我的系统中为每个脚本配备一个脚本引擎。然后,这些引擎在预编译后保留在内存中。这将删除每个脚本编译开销30毫秒。它也使用了更多的内存但不足以成为一个问题。

我仍然宁愿只使用一个脚本引擎。(因此需要加载预编译的脚本)

2 个答案:

答案 0 :(得分:1)

感谢RemObject Connect beta论坛上的回复,我有一个解决方案。 (有关帖子,请参阅http://connect.remobjects.com/discussion/comment/13540#Comment_13540

谢谢你去海报vovanl。

我必须通过OnExecImport事件导入我的函数,如下所示:

...

FPascalScript.OnExecImport := OnExecImport;
FPascalScript.SetCompiled(sCompiledScript);

...

TMyClass.OnExecImport(Sender: TObject; se: TPSExec; x: TPSRuntimeClassImporter);
begin
  se.RegisterDelphiFunction(@Value_TeamCode, 'Value_TeamCode', cdRegister);
end;

...

看起来SetCompiled清除了所有现有的注册,所以你必须挂钩OnExecImport来重新注册函数,程序,方法等。

请注意,加载预编译脚本(即将一个脚本替换为另一个脚本)似乎确实会增加一些额外的时间开销。我发现我最初的工作实际上更快了大约6次。

答案 1 :(得分:0)

而不是如何做到这一点,我会反驳为什么?

编译的脚本很可能是版本绑定的,甚至可能是平台/目标绑定的 - 它们通常编译得足够快,你永远不会注意到时间。你是否真的使用脚本足够强大,编译时间是一个问题?

有时最好的答案是“你真的需要这样做吗?”