我试图在运行时在Delphi中加载一个预编写的RemObjects Pascal脚本。然而,当我尝试加载它时,Delphi例外地使用‘不能导入VALUE_TEAMCODE’。Value_TeamCode是我的Delphi应用程序中的一个函数,我已经在Pascal脚本中注册了它。
这就是我在做的事情。下面的粗伪代码-实际代码被分割成多个文件。另外,当需要运行脚本时,下面的SetCompiled调用将在应用程序中发生。
关于代码的注意:FPascalScript是一个TPSScriptDebugger
...
//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 per。它还使用了更多的内存,但不足以引起关注。
不过,我还是宁愿只使用一个脚本引擎(因此需要加载预编译脚本)。
发布于 2013-06-18 02:13:41
感谢RemObject连接测试版论坛上的回应,我有一个解决方案。(发帖见13540)
谢谢你的海报。
我必须通过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-14 07:33:04
我要反驳的不是这是怎么回事,而是为什么?
编译后的脚本很可能是版本绑定的,甚至可能是平台/目标绑定--它们的编译速度通常足够快,以至于您永远不会注意到时间的命中。您是否真的对脚本的使用非常深入,以致于编译时间是一个问题?
有时候最好的答案是“你真的需要这么做吗?”
https://stackoverflow.com/questions/17101532
复制相似问题