5
저는 Google을 최고로 낮게 책망하고 있지만 예제는 있지만 아무 것도 작동하지 않는 것 같습니다 (루아 5.2). C++에서 Lua 함수를 호출하십시오.
은 내가 C++에서onData
를 호출 할
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_yield() 함수를 사용할 수 있도록 lua_resume을 사용해야합니다. 스크립트를 먼저 실행하면 원하는 함수 이외의 다른 코드도 실행됩니다. 나는 그 기능 만 실행하고 싶지 않다. –
@MaxKielland lhf는 Lua의 제작자 중 한 명입니다. 그는 아마도 그가 무슨 말을하는지 잘 알고있을 것입니다. 그래서 나는 실제로 그의 제안을 시도하고 그것이 효과가 있는지보기를 제안한다. –
@MaxKielland, onData를 정의하려면 스크립트를 실행해야합니다. 또한'data'를'onData'에 전달하기 위해서는'lua_resume (CO, NULL, 1)'이 필요합니다. – lhf