Lua-funktion von C++ aus starten
-
Hallo,
ich habe mich zwar schon bisschen eingelesen, aber so richtig habe ich das noch nicht verstanden...ich habe ein Lua-Script, wo ich an eine C++-Funktion eine Callback-Adresse angebe:
function menu_test(id) print("Menuitem :)") end gui.Popup_Add_Item(pu,"test1",menu_test)
der erste Parameter ist mein Typ, der zweite ein string und der dritte der funktions-"pointer"
auf C-Seite sieht die Popup_add_item so aus (gekürzt):
static int do_PopupAddItem(lua_State *L) { void *iLuaControl=lua_touserdata(L,1); const char *caption=luaL_checkstring(L,2); Popup->AddMenuItem(caption,3); //use 3rd param to get function pointer return 0; }
AddMenuItem holt sich jetzt aus dem 3. Parameter die Funktionsreferenz
bool function_ref(lua_State* L, int idx, int* pr) { if (*pr != 0) { luaL_unref(L,LUA_REGISTRYINDEX,*pr); } lua_pushvalue(L,idx); *pr = luaL_ref(L,LUA_REGISTRYINDEX); return true; } void dispatch_ref(lua_State* L,int idx, int ival) //call function ival=param for Lua-Function { if (idx != 0) { lua_rawgeti(L,LUA_REGISTRYINDEX,idx); lua_pushnumber(L,ival); //param for lua function int res=lua_pcall(L,1,0,0); g_print("lua_pcall-result: %d\n",res); if (res != 0) OutputMessage(L);// lua_error(L); } } void LuaPopupMenu::AddMenuItem(const char*caption,int param_no) { int id; function_ref(Lua.GetLuaState(), param_no,&id);//holen der referenz //zum testen der Funktionsreferenz wird es einmal aufgerufen dispatch_ref(Lua.GetLuaState(),id, 0); CPopupMenu::AddMenuItem(caption,id); //anlegen des Gui-Controls mit hinterlegen der funktionsreferenz }
beim test mittels dispatch_ref wird die funktion zwar aufgerufen, aber pcall beendet sich mit "attempt to call a number value" (Status 2) und lässt sich danach nicht mehr aufrufen
ich habe noch keine richtige Seite gefunden, wo das mal so erklärt ist, dass ich das verstehe
z.b. was der index ist, der vor luaL_ref gepusht wird, usw. die 2 Funktionen (function_ref und dispatch_ref) habe ich aus dem Scite-Gui-Ext-Project von Steve Donovan.
sieht jemand wo das Problem ist?
Gruß Frank
-
das Problem scheint zu sein, dass im falle meines kontextmenüs für mehrere Einträge einen Lua-Stack benutze und diesen nicht mittels pop aufgeräumt habe, somit kam das programm mit meiner Adressierung von unten (positive indizies) irgendwann durcheinander.
ich bin gerade am testen, wie ich das schöner in meine Klassen verteilen kann