5
我有谷歌高和低,找到的例子,但他們都沒有工作(Lua 5.2)。從C++調用Lua函數
我在Lua
function onData (data)
print (data)
end
我想打電話從C++ onData
一個簡單的功能,並試圖此:
// Create new Lua state
L = luaL_newstate();
// Load all Lua libraries
luaL_openlibs(L);
// Create co-routine
CO = lua_newthread(L);
// Load and compile script
AnsiString script(Frame->Script_Edit->Text);
if (luaL_loadbuffer(CO,script.c_str(),script.Length(),AnsiString(Name).c_str()) == LUA_OK) {
Compiled = true;
} else {
cs_error(CO, "Compiler error: "); // Print compiler error
Compiled = false;
}
// Script compiled and ready?
if (Compiled == true) {
lua_getglobal(CO, "onData"); // <-------- Doesn't find the function
if(!lua_isfunction(CO,-1)) {
lua_pop(CO,1);
return;
}
lua_pushlstring(CO,data,len);
lua_resume(CO,NULL,0)
}
正如你看到的,我開始我的劇本作爲共例程,所以我可以使用它的lua_yield()
功能。我試圖在L
和CO
狀態中查找該函數。
但lua_loadbuffer()編譯腳本並將其放在堆棧上執行,所以應該知道它。 luaL_dostring()將編譯並執行腳本,之後該塊將被堆棧。正如你所看到的,我需要使用lua_resume,所以我可以使用lua_yield()函數。如果我先運行腳本,那麼除了所需的函數之外的其他代碼也會運行。我只想運行該功能,沒有別的。 –
@MaxKielland lhf是Lua的創造者之一。他大概非常清楚他在說什麼。所以我建議實際嘗試他的建議,看看它是否有效(因爲它可能會)。 – 2013-12-10 13:42:07
@MaxKielland,如果你想定義'onData',你需要運行腳本。此外,您需要'lua_resume(CO,NULL,1)'將'data'傳遞給'onData'。 – lhf