2013-12-10 15 views
5

私はGoogleを高く評価して低かったし、例も見つかったが、どれもうまくいかない(Lua 5.2)。C++からLua関数を呼び出す

私はC++からonDataを呼び出したいと、この試みたのLua

function onData (data) 
    print (data) 
end 

でシンプルな機能を持っている:あなたは、私が共同として私のスクリプトを始めて見ることができるように

// 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_loadbufferの代わりにluaL_dostringを呼び出してみてください。

またはをlua_getglobalの前に追加してください。

また、dataonDataに渡すには、lua_resume(CO,NULL,1)が必要です。

+0

しかし、lua_loadbuffer()はスクリプトをコンパイルし、実行のためにスタックに配置するので、それを知る必要があります。 luaL_dostring()は、チャンクがスタックからポップされた後に、スクリプトをコンパイルして実行します。ご覧のとおり、lua_resumeを使用する必要があるので、lua_yield()関数を使用することができます。スクリプトを最初に実行すると、目的の関数以外のコードも実行されます。私はその機能だけを実行したいだけです。 –

+2

@MaxKielland lhfはLuaのクリエイターの一人です。彼はおそらく彼が話していることをよく知っているでしょう。だから私は実際に彼の提案を試み、それがうまくいくかどうかを見ることを提案する(それはおそらくそうするだろうから)。 –

+0

@MaxKielland、 'onData'を定義する場合は、スクリプトを実行する必要があります。また、 'data'を' onData'に渡すには 'lua_resume(CO、NULL、1)'が必要です。 – lhf