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()
関数を使うことができます。私はL
とCO
の両方の状態で関数を探すようにしました。
しかし、lua_loadbuffer()はスクリプトをコンパイルし、実行のためにスタックに配置するので、それを知る必要があります。 luaL_dostring()は、チャンクがスタックからポップされた後に、スクリプトをコンパイルして実行します。ご覧のとおり、lua_resumeを使用する必要があるので、lua_yield()関数を使用することができます。スクリプトを最初に実行すると、目的の関数以外のコードも実行されます。私はその機能だけを実行したいだけです。 –
@MaxKielland lhfはLuaのクリエイターの一人です。彼はおそらく彼が話していることをよく知っているでしょう。だから私は実際に彼の提案を試み、それがうまくいくかどうかを見ることを提案する(それはおそらくそうするだろうから)。 –
@MaxKielland、 'onData'を定義する場合は、スクリプトを実行する必要があります。また、 'data'を' onData'に渡すには 'lua_resume(CO、NULL、1)'が必要です。 – lhf