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函数;
示例:
intLuaTest::Attach(lua_State*luaState) { if(lua_isfunction(luaState,1)!=1) { return0; } lua_settop(luaState,1); m_nRef=luaL_ref(luaState,LUA_REGISTRYINDEX); //保存到LUA_REGISTRYINDEX表 lua_pushinteger(luaState,nRef); return1; }
intLuaTest::Detach(lua_State*luaState) { m_nRef=luaL_checknumber(luaState,1); luaL_unref(luaState,LUA_REGISTRYINDEX,nRef); //从LUA_REGISTRYINDEX表中删除 m_nRef=0; return0; }
//事件监听函数 voidLuaTest::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函数 intnRet=luaL_checknumber(luaState,-1); //返回值 }