簡體   English   中英

在C ++中從全局表調用Lua函數

[英]Call Lua Function From A Global Table In C++

我已經在全局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()函數,但我只知道如何調用全局函數,而不是全局范圍內的表中的函數。 在C ++中完全完成Hooks.Call()一種方法是最有效的途徑。

這使我可以從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;
}

該代碼是否完整? 此時堆棧是否清晰?

您的代碼對我來說還不錯。

  • 您已經將Hooks表留在了堆棧上。 您可以在調用lua_getfield之后立即將其lua_getfield 或者,將“ table.field”檢索結果封裝在實用程序函數中。 getglobal2(m_Lua, "Hooks", "Call")

  • 您還將錯誤消息留在堆棧上。 您需要彈出它。

或者,將代碼包裝在Lua函數(在C端編寫)中,然后通過lua_pushcfunctionlua_pcall對其進行lua_pcall 這樣,將自動為您管理堆棧。

順便說一句,你可以做v(...)而不是v(unpack(arg))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM