源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

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

  • 时间:2021-08-30 13:05 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:C调用lua函数需要考虑的问题
[b]需要考虑的问题: [/b] 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 函数; [b]示例: [/b]
[u]复制代码[/u] 代码如下:
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);  // 返回值 }
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部