Lua & MFC: lua_register-Auch für Leute die LUA nicht kennen!

NeoKalam

Grünschnabel
Ich will eine funktion der Klasse CPHLView (meine Ansichtsklasse) mit der lua funktion lua_register(...) für LUA verfügbar machen. Dabei bekomme ich immer wieder den fehler:

: error C2664: 'lua_pushcclosure' : Konvertierung des Parameters 2 von 'int (struct lua_State *)' in 'int (__cdecl *)(struct lua_State *)' nicht moeglich

Das ist die Funktion, die lua_register aufruft
Code:
void CPHLView::OnExec() 
{
	lua_State* luaVM = lua_open();


	lua_baselibopen(luaVM);
	lua_iolibopen(luaVM);
	lua_strlibopen(luaVM);
	lua_mathlibopen(luaVM);

	lua_register(luaVM, "Relais_On", l_Ron);
	lua_register(luaVM, "Relais_Off", l_Roff);
	lua_register(luaVM, "Wait", l_wait);

	lua_dofile(luaVM, "test.txt");

	lua_close(luaVM);
}

und das ist eine der funktionen die ich für lua verfügbar machen möchte:
Code:
int CPHLView::l_wait(lua_State *luaVM)
{
	CRelaisCtrl *rl = new CRelaisCtrl;
	rl->wait((int)lua_tonumber(luaVM, 1));
	lua_pushnumber(luaVM, 0);

	delete rl;
	return 1;
}
 
Lua kann keine Member-Funktionen binden (zumindest nicht direkt). Bei Member-Funktion einer Klasse/eines Structs wird implizit ein this-Pointer auf die aktuelle Instanz mitübergeben, und der stört in dem Fall (Lua will ja nur einen Parameter, ein lua_State*).

Versuche die gewünschte Funktion static zu deklarieren. So wie deine Funktion aussieht, sollte das Problemlos gehen.

Wenn du wirklich Objekte von Lua aus ansprechen willst, bist du besser mit einem Class-Wrapper beraten.

Hier 2, die ich persönlich verwende:

Luna: ein einfacher Template-Header, Parameter müssen selbst vom Stack geholt und wieder auf den Stack geschoben werden. Ist aber sehr compiler-freundlich, hat keine grossen Ansprüche

LuaBind: Ein mächtiger Template-Komplex, stützt sich auf Boost. D.h. Boost muss zusätzlich verfügbar sein. Dafür erhält man einfachste Klassen- und Funktionsdefinition, die Parameter werden automatisch aus- und eingepackt. Kann den Compiler mächtig in die Knie zwingen, vor allem bei mehr als 3 Parametern.
Hat in der letzten von mir getesten Version Probleme mit coroutines. Müsste allerdings inzwischen auch schon behoben sein.
 
Das gibt dann bei MFC aber weitere Probleme weil die MFC-Mutterklassen das Kompilieren der Templateklasse stören.
 

Neue Beiträge

Zurück