我能否在Delphi中使用自定义函数停止Lua脚本而不退出应用程序?
2012-11-28 22:9:0
收藏:0
阅读:133
评论:1
我有一个应用程序,定期运行 Lua 脚本。在脚本内,有时我会创建一个自定义注册的 Lua 函数来检查一些参数,并决定 Lua 脚本是否应该继续或退出。理想情况下,逻辑不应该是脚本的一部分,我可以想到使用一个 Lua 脚本来解决这个问题,但我想知道是否可以停止 Lua 脚本的执行而不终止应用程序。
我有一个自定义函数,使用 Lua 5.1 编写并暴露给 Lua 脚本使用。Lua 脚本类似于下面的示例,并且使用 luaL_loadbuffer 启动 Lua 脚本。
io.write("Script starting\n");
--Custom Function
ExitIfFound();
io.write("Script continuing\n");
我的自定义函数类似于下面的函数。下面我提供了一个尝试,其中我尝试使用 lua_error 来停止脚本...
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 中使用 setjmp 和 longjmp,但我好奇这些如何在 Delphi 中翻译。
在上面的示例中,当我使用 lua_error 时,整个程序会崩溃,Windows 会进行典型的 [luarun.exe 已停止工作] ...
在这一切中,我仍然是集成 Lua 到 Delphi 的新手,希望我能找到一些更清洁的选项来探索。
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
没有干净的方式完全中止 Lua 脚本。
lua_error函数是发出错误信号的正确方式。调用者有责任捕获错误并将其传播到下一个调用者。如果您无法依赖调用者来配合,那么可以通过安装调试钩子来尝试更多地控制。然后,主机程序将在继续运行脚本之前咨询。但是,脚本仍然可以使用
pcall来捕获任何错误以避免退出。您程序中的崩溃可能不仅是由于设置错误。相反,这可能是由于在
ExitIfFound函数中使用了错误的调用约定导致的。它需要是 cdecl,但是如果您未指定其他任何内容,则 Delphi 的默认调用约定是寄存器。使用错误的调用约定将给您带来不可预测的参数值,并可能导致受损的堆栈。如果您对函数进行了类型转换或在调用lua_register时使用了@运算符,则可能已将调用约定不匹配从编译器类型检查器中隐藏,否则编译器将在编译时向您发出警告。在编译为 C++ 时,
lua_error将使用异常而不是longjmp,但无论如何,调用者始终捕获错误。当 Delphi 代码使用编译器管理的类型(如string)或异常敏感结构(如try-finally块)时,异常很重要。在 C 模式下,lua_error调用longjmp来直接跳转到之前通过调用setjmp设置的航路点。该跳转将跳过任何异常处理程序,如 Delphi 编译器设置的确保运行finally块和清理字符串的处理程序。更进一步的问题是,由于编译器在退出函数时清除了字符串,因此您放在 Lua 栈上的指针在使用时可能无效;这取决于
lua_pushstring是否复制其参数。