C调用lua函数需要考虑的问题

需要考虑的问题:

1. 使用 lua_pcall 可以调用 lua 函数,首先把 lua 函数入栈,然后把参数入栈, lua_pcall(luaState, 参数个数, 返回值个数, 0) ;
2. 为了在事件触发时回调 lua 函数,需要把 lua 函数保存起来,使用 luaL_ref(luaState, LUA_REGISTRYINDEX) 将位于栈顶的 lua 函数保存到 LUA_REGISTRYINDEX 表里面, LUA_REGISTRYINDEX 是一个全局表, luaL_ref 将返回 lua 函数在 LUA_REGISTRYINDEX 表中的位置 nRef ;
3. 使用 lua_rawgeti(luaState, LUA_REGISTRYINDEX, nRef) 获取之前保存的 lua 函数,nRef 是 lua 函数在 LUA_REGISTRYINDEX 表中的位置, lua 函数将被放到栈顶,这时就可以使用 lua_pcall 调用 lua 函数了;
4. 使用 luaL_unref(luaState, LUA_REGISTRYINDEX, nRef) 可以从 LUA_REGISTRYINDEX 表中删除之前保存的 lua 函数;

示例:

代码如下:

int LuaTest::Attach(lua_State* luaState)

{

    if(lua_isfunction(luaState, 1) != 1)

    {

        return 0;

    }

    lua_settop(luaState, 1);

    m_nRef = luaL_ref(luaState, LUA_REGISTRYINDEX);   // 保存到 LUA_REGISTRYINDEX 表

    lua_pushinteger(luaState, nRef);

    

    return 1;

}

int LuaTest::Detach(lua_State* luaState)

{

    m_nRef = luaL_checknumber(luaState, 1);

    luaL_unref(luaState, LUA_REGISTRYINDEX, nRef);    // 从 LUA_REGISTRYINDEX 表中删除

    m_nRef = 0;

    

    return 0;

}


// 事件监听函数

void LuaTest::EventListener(lua_State* luaState)

{

    lua_rawgeti(luaState, LUA_REGISTRYINDEX, m_nRef);  // 从 LUA_REGISTRYINDEX 表中获取

    lua_pushstring(luaState, "参数1");

    lua_pushstring(luaState, "参数2");

    lua_pcall(luaState, 2, 1, 0);               // 调用 lua 函数

    int nRet = luaL_checknumber(luaState, -1);  // 返回值

}

相关推荐