在C ++中调用全局表中的Lua函数

时间:2014-07-21 01:49:37

标签: c++ c++11 lua

我在全局Hooks表中定义了一些Lua函数,如下所示:

print("Loading Hook System")
local pairs = pairs;
Hooks = {}
Hooks.Hooks = {}
----------
--  This file defines all the available hooks
----------
Hooks.Hooks.OnScoreboardOpen = {}


function Hooks.Add( Name, Identifier, Function )
    if (Hooks.Hooks[Name] == nil) then
        print("Hook "..Name.." Does Not Exist")
    else
        if (Hooks.Hooks[Name][Identifier] == nil) then
            Hooks.Hooks[Name][Identifier] = Function
        else
            print("Hooks.Add Error: Identifier: "..Identifier.." Already Exists")
        end
    end
end

function Hooks.Remove( Identifier )
    for _,Hook in pairs(Hooks.Hooks) do
        if (Hook[Identifier]) then
            Hook[Identifier] = nil
        end
    end
end

function Hooks.Call( Name, ... )
    local arg = {...}
    for _,v in pairs(Hooks.Hooks[Name]) do
        v(unpack(arg))
    end
end

print("Complete")

然后,用户可以使用唯一标识符将自己的函数添加到钩子系统中,然后在需要时将其删除。

我需要弄清楚如何在C ++中调用Hooks.Call()函数,但我只知道如何调用全局函数,而不是在全局范围内的表中调用函数。一种完成Hooks.Call()在C ++中完成的工作方式将是最有效的途径。

这允许我从C ++调用Lua函数

lua_getglobal(m_Lua, "Hooks");
lua_getfield(m_Lua, -1, "Call");
lua_pushstring(m_Lua, "OnScoreboardOpen");
lua_pushnumber(m_Lua, 5);
lua_pushnumber(m_Lua, 7);
int Error = lua_pcall(m_Lua, 3, 0, 0);
if (Error)
{
    std::cout << lua_tostring(m_Lua, -1) << std::endl;
}

此代码是否完整?此时堆栈是否清晰?

1 个答案:

答案 0 :(得分:1)

你的代码看起来不错。

  • 您已将Hooks表格保留在堆叠中。您可以在致电lua_getfield后立即将其删除。或者,封装&#34; table.field&#34;在效用函数中检索。即getglobal2(m_Lua, "Hooks", "Call")

  • 之类的东西
  • 您还将错误消息留在堆栈中。你需要弹出它。

或者,将代码包装在Lua函数中(写在C端)并通过lua_pushcfunction&amp; lua_pcall。这样就可以自动管理堆栈。

顺便说一句,您可以v(...)代替v(unpack(arg))