Вызов функции Lua из глобальной таблицы в C ++

0

Я определил некоторые функции Lua в глобальной таблице Hooks следующим образом:

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")

Затем пользователи могут добавлять свои собственные функции в систему hook с уникальными идентификаторами, а затем удалять их, если необходимо.

Мне нужно выяснить, как вызвать Hooks.Call() из C++, но я знаю только, как вызывать глобальные функции, а не функции внутри таблиц, которые находятся в глобальной области. Самый эффективный способ - сделать то, что Hooks.Call() полностью в C++.

Это позволило мне вызвать функцию Lua из C++

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;
}

Этот код завершен? Является ли стека понятным в этот момент?

  • 0
    Вы можете получить функцию Call из таблицы Hooks же, как и любое другое значение из таблицы.
Теги:
c++11
lua

1 ответ

1
Лучший ответ

Ваш код выглядит хорошо для меня.

  • Вы оставили таблицу " Hooks в стеке. Вы можете удалить его сразу после вызова lua_getfield. В качестве альтернативы, инкапсулируйте поиск "table.field" в функции утилиты. Т.е. что-то вроде getglobal2(m_Lua, "Hooks", "Call").

  • Вы также оставляете сообщение об ошибке в стеке. Вам нужно выскочить.

Кроме того, оберните свой код в Lua-функцию (написанную на стороне C) и вызовите ее через lua_pushcfunction & lua_pcall. Таким образом, стек будет автоматически управляться для вас.

BTW, вы можете сделать v(...) вместо v(unpack(arg)).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню