2013-12-10 2 views
5

У меня есть google high и low и найдены примеры, но ни один из них не работает (Lua 5.2).Вызов функции Lua из C++

У меня есть простая функция в Lua

function onData (data) 
    print (data) 
end 

Я хочу назвать onData от C++ и попытался это:

// 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.

ответ

4

luaL_loadbuffer загружает сценарий, но не запускает его. onData будет определяться только при запуске скрипта.

Попробуйте позвонить luaL_dostring вместо luaL_loadbuffer.

или добавьте lua_pcall(CO,0,0,0) до lua_getglobal.

Кроме того, вам необходимо lua_resume(CO,NULL,1) пройти data до onData.

+0

Но lua_loadbuffer() компилирует скрипт и помещает его в стек для выполнения, поэтому он должен быть известен. luaL_dostring() скомпилирует И выполнит скрипт, после чего кусок будет вставлен в стек. Как вы можете видеть, мне нужно использовать lua_resume, поэтому я могу использовать функцию lua_yield(). Если я сначала запустил сценарий, тогда будет запущен другой код, чем желаемая функция. Я только хочу запустить эту функцию, ничего больше. –

+2

@MaxKielland lhf является одним из создателей Lua. Вероятно, он хорошо знает, о чем говорит. Поэтому я предлагаю на самом деле попробовать его предложение и посмотреть, работает ли оно (потому что это, вероятно, будет). –

+0

@MaxKielland, если вы хотите определить 'onData', вам нужно запустить скрипт. Кроме того, вам нужно 'lua_resume (CO, NULL, 1)' передать 'data' в' onData'. – lhf

Смежные вопросы