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


Anmelden zum Antworten