gpt4 book ai didi

delphi - 我可以在 Delphi 中使用自定义函数停止 Lua 脚本而不退出应用程序吗?

转载 作者:行者123 更新时间:2023-12-03 15:58:18 25 4
gpt4 key购买 nike

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

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

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 中使用 setjmplongjmp 的帖子,但我很好奇这些如何翻译 Delphi。

在上面的示例中,当我使用 lua_error 时,整个程序崩溃,Windows 执行其典型操作,[luarun.exe 已停止工作] ...

尽管如此,我对将 Lua 集成到 Delphi 还很陌生,希望能找到一些更简洁的选项来探索。

最佳答案

没有干净的方法可以完全中止 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 block )时,异常就很重要。在 C 模式下,lua_error 调用 longjmp 直接跳转到之前调用 setjmp 所设置的路点。该跳转将跳过任何异常处理程序,例如 Delphi 编译器设置的异常处理程序,以确保 finally block 运行并且字符串得到清理。

更令人头痛的是,由于编译器在退出函数时会清理字符串,因此您放在 Lua 堆栈上的指针在使用时可能无效;这取决于 lua_pushstring 是否复制其参数。

关于delphi - 我可以在 Delphi 中使用自定义函数停止 Lua 脚本而不退出应用程序吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13609746/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com