首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以让自定义函数在不退出应用程序的情况下停止Delphi中的Lua脚本吗?

我可以让自定义函数在不退出应用程序的情况下停止Delphi中的Lua脚本吗?
EN

Stack Overflow用户
提问于 2012-11-29 00:26:15
回答 1查看 781关注 0票数 3

我有一个定期运行Lua脚本的应用程序。在脚本中,有时我会创建一个自定义的注册Lua函数来检查一些参数,并决定Lua脚本应该继续还是退出。理想情况下,逻辑不应该是脚本的一部分,我可以考虑使用Lua脚本来解决这个问题,但我想知道是否有可能在不结束应用程序的情况下停止Lua脚本的执行。

我有一个用Delphi编写的自定义函数,并使用Lua 5.1公开给Lua脚本。Lua脚本如下所示,Lua中的脚本是使用luaL_loadbuffer启动的。

代码语言:javascript
复制
io.write("Script starting\n");
--Custom Function
ExitIfFound();
io.write("Script continuing\n");

我的自定义函数看起来像这样,下面我提供了我的一次尝试,我尝试使用lua_error来停止脚本...

代码语言:javascript
复制
function ExitIfFound(LuaState: TLuaState): Integer;
var
  s: AnsiString;
begin
  s := 'ExitIfFound ending script, next Lua script line not called';
  lua_pushstring(LuaState, PAnsiString(s));
  lua_error(LuaState);
end;

当我的自定义函数被调用时,我不确定如何退出Lua脚本而不进行任何进一步的计算。我看过一些帖子提到Lua,并在C中使用setjmplongjmp,但我很好奇这些如何翻译Delphi。

在上面的例子中,当我使用lua_error时,整个程序都崩溃了,而Windows正在执行其典型的[luarun.exe has stopped working] ...

尽管有了这些,我仍然是一个将Lua集成到Delphi的新手,并希望我能找到一些更干净的选择来探索。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-29 08:12:49

没有一种干净利落的方法可以完全中止Lua脚本。lua_error函数是发出错误信号的正确方法。调用者有责任捕获错误并将其传播给下一个调用者。

如果您不能依赖调用者进行协作,那么您可以尝试通过installing debug hooks施加更多的控制。则在继续运行脚本之前将咨询主机程序。然而,the script can still avoid exiting by using pcall to catch any errors

你的程序崩溃可能不仅仅是因为设置了一个错误。相反,这很可能是因为在ExitIfFound函数上使用了错误的调用约定。它需要是cdecl,但Delphi的默认值是register,如果您没有指定其他任何内容。使用错误的调用约定将给出不可预测的参数值,并可能导致堆栈损坏。如果您在调用lua_register时对函数进行了类型转换或使用了@操作符,那么您可能对编译器的类型检查器隐藏了调用约定不匹配,否则它会在编译时提醒您该问题。

当编译为C++时,lua_error将使用异常而不是longjmp,但无论采用哪种方式,调用者都会捕获错误。但是,当您的Delphi代码使用编译器管理的类型(如string )或异常敏感的构造(如try-finally块)时,异常是很重要的。在C模式下,lua_error调用longjmp直接跳转到先前调用setjmp所设置的路点。该跳转将跳过任何异常处理程序,例如Delphi编译器设置的异常处理程序,以确保finally块运行并清除字符串。

另一个令人头疼的问题是,由于编译器在退出函数时会清理字符串,所以放在Lua堆栈上的指针在使用时可能无效;这取决于lua_pushstring是否复制了它的参数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13609746

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档