2014-07-21 36 views
0

我如下所述的在全球Hooks表中的一些Lua函數:調用Lua函數從全局表在C++

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

這段代碼完成的Lua功能?在這一點上,堆棧是否清晰?

+0

您可以從'Hooks'表中獲得'Call'函數,就像您從表中獲取其他值一樣。 –

回答

1

你的代碼對我來說看起來很好。

  • 您已將Hooks表保留在堆棧上。您可以在致電lua_getfield後立即將其刪除。或者,在一個效用函數中封裝一個「table.field」檢索。即一些沿着getglobal2(m_Lua, "Hooks", "Call")

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

或者,包裹代碼在一個Lua函數(寫在C側),並通過lua_pushcfunction & lua_pcall調用它。這樣堆棧將自動爲您管理。你可以做v(...)而不是v(unpack(arg))