8

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

这就是我正在做的事情。下面的粗略伪代码 - 实际代码被拆分为多个文件。SetCompiled当脚本需要运行时,下面的调用也会在应用程序中发生得更晚。

关于代码的注意事项: 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 毫秒。它还使用更多的内存,但不足以引起关注。

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

4

2 回答 2

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 倍。

于 2013-06-18T02:13:41.753 回答
0

而不是这个如何,我要反驳为什么?

编译后的脚本可能会受到版本限制,甚至可能是平台/目标限制 - 而且它们通常编译得足够快,以至于您永远不会注意到时间命中。您是否真的足够频繁地使用脚本以至于编译时间是一个问题?

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

于 2013-06-14T07:33:04.307 回答