【发布时间】:2014-09-11 11:05:32
【问题描述】:
我在全局 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表中获取Call函数,就像从表中获取任何其他值一样。