C++ 从C++;

C++ 从C++;,c++,lua,lua-5.2,c++builder-xe3,C++,Lua,Lua 5.2,C++builder Xe3,我在谷歌上下搜索并找到了一些例子,但它们似乎都不起作用(Lua5.2) 我在Lua中有一个简单的函数 function onData ( data ) print ( data ) end < >我想从C++调用 OnData < /Cord>,并尝试如下: // Create new Lua state L = luaL_newstate(); // Load all Lua libraries luaL_openlibs(L); // Create co-routine CO =

我在谷歌上下搜索并找到了一些例子,但它们似乎都不起作用(Lua5.2)

我在Lua中有一个简单的函数

function onData ( data )
  print ( data )
end
< >我想从C++调用<代码> OnData < /Cord>,并尝试如下:

// 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状态
L=luaL_newstate();
//加载所有Lua库
luaL_openlibs(L);
//创建共同例程
CO=lua_新线程(L);
//加载并编译脚本
翻译脚本(框架->脚本\编辑->文本);
if(luaL_loadbuffer(CO,script.c_str(),script.Length(),AnsiString(Name).c_str())==LUA_OK){
编译=真;
}否则{
cs_错误(CO,“编译器错误:”);//打印编译器错误
编译=假;
}
//脚本已编译并准备好了吗?
if(Compiled==true){

lua_getglobal(CO,“onData”);//
luaL_loadbuffer
加载脚本但不运行脚本。
onData
仅在脚本运行时定义

尝试调用
luaL\u dostring
而不是
luaL\u loadbuffer

或者在
lua\u getglobal
之前添加
lua\u pcall(CO,0,0,0)


此外,您需要
lua\u resume(CO,NULL,1)
数据
传递给
onData

,但是lua\u loadbuffer()编译脚本并将其放在堆栈上执行,因此应该知道它。luaL\u dostring()将编译并执行脚本,然后将块从堆栈中弹出函数。如果我先运行脚本,那么除所需函数外的其他代码也会运行。我只想运行该函数,其他什么都不想。@MaxKielland lhf是Lua的创建者之一。他可能非常清楚自己在说什么。因此我建议尝试他的建议,看看它是否有效(因为它可能会有效)@MaxKielland,如果你想定义
onData
,你需要运行脚本。另外,你需要
lua_resume(CO,NULL,1)
数据
传递给
onData
@MaxKielland,恐怕你必须更改设计或将
onData
的定义放在一个单独的块中。@MaxKielland如果你把“执行”脚本的一部分,比如说“main”“函数?这将在运行脚本时将其与执行隔离。更容易将
luaL\u load*
函数视为将脚本整体包装在匿名函数中,并将该函数保留在堆栈上。在实际运行该匿名函数之前,脚本中的任何内容都不存在。