将 Lua 函数传递给 C++

我正在用 C++ 制作一个 GUI。

我想让一个 Lua 脚本向 C++ 注册一个 Lua 函数,当 C++ 处理按钮点击时,C++ 将调用已注册的 Lua 函数。

我使用以下 SO 帖子作为指南:http://stackoverflow.com/questions/4928973/how-do-you-pass-a-lua-function-to-a-c-function-and-execute-the-lua-function-seve

由于某些原因,我在做出更改后,它并没有起作用。

这是我的 Lua 代码:

-- 这是 button.setClickEvent
function self.setClickEvent(eventFunction)
    uiButtonSetClickEvent(self.id, eventFunction)
end

function buttonClick()
    print("哟,它好使了!")
end

button.setClickEvent(buttonClick)

这是 C++ 代码

static int lua_uiButtonSetClickEvent(lua_State *L)
{
    int argumentsCount = lua_gettop(L);
    int argumentsMin = 2;
    if(argumentsCount < argumentsMin)
        cout << "uiButtonSetClickEvent 错误,参数数目错误" << endl;

    double buttonId = lua_tonumber(L, 1);
    int event = luaL_ref(L, LUA_REGISTRYINDEX);

    long i = uiButtonGetIndex(buttonId);
    if(i != -1)
    {
        cout << "!!! 存储 lua 函数引用" << endl;
        uiButtons[i].luaClickEvent = event;
        uiButtonSetClickEvent(buttonId, lua_uiButtonCallClickEvent);
    }

    return 0;
}

static void uiButtonSetClickEvent(double buttonId, void (&event)(double))
{
    long i = uiButtonGetIndex(buttonId);
    if(i != -1)
        uiButtons[i].clickEvent = event;
}

static void lua_uiButtonCallClickEvent(double buttonId)
{
    long i = uiButtonGetIndex(buttonId);
    if(i != -1)
    {
          lua_rawgeti( L, LUA_REGISTRYINDEX, uiButtons[i].luaClickEvent);

          if ( 0 != lua_pcall( L, 0, 0, 0 ) ) {
            printf("Failed to call the callback!\n %s\n", lua_tostring(L, -1));
            return;
          }

          uiButtons[i].luaClickEvent = luaL_ref(L, LUA_REGISTRYINDEX);
    }
}

一切都按预期进行,直到

结果在 lua_uiButtonCallClickEvent 中遇到分段故障,具体位于以下行:

lua_rawgeti( L, LUA_REGISTRYINDEX, uiButtons[i].luaClickEvent);

我注意到 SO 指南与我的实现之间唯一的区别是不仅将 Lua 函数传递给 C++,而且还传递了一个 buttonId

我不知道偏移参数是否引起问题。

引用 Lua 参考手册时我没有成功。

我认为我正在寻找的修复方法是微不足道的,希望您能帮忙。

感谢您的阅读

点赞
用户449534
用户449534

lua_close(L) 被过早调用,导致 Lua 堆栈被销毁。

2016-02-09 12:40:37