2013-12-10 179 views
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()功能。我試圖在LCO狀態中查找該函數。

回答

4

luaL_loadbuffer加載腳本但不運行它。只有在腳本運行時纔會定義onData。請致電luaL_dostring而不是luaL_loadbuffer

或者在lua_getglobal之前加lua_pcall(CO,0,0,0)

此外,您需要lua_resume(CO,NULL,1)data傳遞給onData

+0

但lua_loadbuffer()編譯腳本並將其放在堆棧上執行,所以應該知道它。 luaL_dostring()將編譯並執行腳本,之後該塊將被堆棧。正如你所看到的,我需要使用lua_resume,所以我可以使用lua_yield()函數。如果我先運行腳本,那麼除了所需的函數之外的其他代碼也會運行。我只想運行該功能,沒有別的。 –

+2

@MaxKielland lhf是Lua的創造者之一。他大概非常清楚他在說什麼。所以我建議實際嘗試他的建議,看看它是否有效(因爲它可能會)。 – 2013-12-10 13:42:07

+0

@MaxKielland,如果你想定義'onData',你需要運行腳本。此外,您需要'lua_resume(CO,NULL,1)'將'data'傳遞給'onData'。 – lhf