BCB中C与Lua互相函数变量调用代码


/*

* 转载请带上此行: FreedomKnight_Duzhi     E_mail:

*/

本代码需要三个Label,三个Button,一个BCB编译好的Lua5.1.2库或者原码.需要的请直接邮件联系我.(个人建议自己编译生成)

头文件就添加俩处

#include "lua.hpp"
lua_State *l;

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
lua_State *L;


//---------------------------------------------------------------------------

/*
提供给lua调用,有格式要求

在cbuilder中通过堆栈来获得lua的参数,经过该函数处理后,
也将按栈方式返回,按左序压入

通过lua_gettop获得调用函数的传入参数个数。

第一个参数在索引 1 的地方,最后一个参数在索引 lua_gettop(L) 处。
返回一个结果时,也是通过左序压到堆栈上(第一个返回值最先压入),然后返回这些返回值的个数。
在这些返回值之下的,堆栈上的东西都会被 Lua 丢掉。
*/
int mytest_call(lua_State *L)
{
     int n = lua_gettop(L);

     //typedef double lua_Number;
     //Lua 中数字的类型。确省是 double ,可以在luaconf.h 中修改它
     lua_Number sum = 0;
     int i;
     for (i = 1; i <= n; i++)
{
      //lua调用该函数参数时是从栈上索引为1开始
      sum -= lua_tonumber(L, i);     // 保证传入的参数是数值类型,否则会报错。
     }

     lua_pushnumber(L, sum);      //返回值压入栈传回
     return 1;                   //返回参数数量值
}


//--------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner) 
: TForm(Owner) 
{
// 打开新的lua库
    L = lua_open();
    luaopen_base(L);
    luaopen_string(L);


    //将主程序中的mytest_call函数注册到lua引擎中,
    //脚本用mytest回调宿主程序
    lua_register(L, "mytest", mytest_call);


     //加载脚本
    String sFileName = "E:\\VCProject\\BCB_lua_try05_25\\Lua_test1.lua";
    luaL_dofile(L, sFileName.c_str());
}

//---------------------------------------------------------------------------

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
// 清空Lua栈和对象,释放所有动态内存
lua_close(L);
}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
     //加载后要用lua_resume运行.
     // lua_resume(L,0);

     //调用脚本中函数
     lua_getglobal(L, "lua_func1");

     //传给lua_func1参数1,参数2
     lua_pushnumber(L, 21);
     lua_pushnumber(L, 23);

     //调用lua中函数,传入个参数,有一个返回值 ,看lua_call 和lua_pcall区别
int    nErr = lua_pcall(L, 2, 1, 0);
if(    nErr == LUA_ERRERR )
    {
     ShowMessage( "在运行错误处理函数时发生的错误" );
    }
if(    nErr == LUA_ERRMEM )
    {
     ShowMessage( "内存分配错误" );
    }
if(    nErr == LUA_ERRRUN )
    {
     AnsiString s3 =    lua_tostring(L, -1);
     ShowMessage(s3);
    }
     // lua_call( L, 2, 1 );

     lua_Number retsum;

     //注意返回值是通过
     retsum = lua_tonumber(L, -1);
     Label1->Caption = IntToStr((int)retsum);
Label2->Caption = lua_tostring(L, -1);
}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
     //用lua_resume运行.
    // lua_resume(L,0);

     lua_getglobal(L,"lua_fun3");
     lua_pushnumber(L, 100);
     lua_pcall(L, 1, 1, 0);
     Label2->Caption = lua_tostring(L, -1);


     //测试调用lua中全局变量,
     lua_getglobal(L, "retStr");
     Label3->Caption = lua_tostring(L, -1);
}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button3Click(TObject *Sender)
{
    // lua_resume(L,0);

     //调用脚本中函数
     lua_getglobal(L, "lua_func2");

     //传给lua_func1参数1,参数2
     lua_pushnumber(L, 21);
     lua_pushnumber(L, 55);

     //调用lua中函数,传入个参数,有一个返回值 ,看lua_call 和lua_pcall区别
     lua_pcall(L, 2, 1, 0);

     lua_Number retsum;
     //注意返回值是通过
     retsum = lua_tonumber(L,-1);
     Label1->Caption = lua_tostring(L, -1);
     Label2->Caption = IntToStr((int)retsum);
}

//---------------------------------------------------------------------------

以下是Lua_test1.lua中的内容


retStr="123"

function lua_fun3(ss)
    ss = ss .. "<-参数SS的值"
    retStr = "这是内部变量Str值"
    return ss
end

function lua_func2(val1, val2)
sum = val1+val2
return sum
end

function lua_func1(val1, val2)
-- 调用cbuilder中函数
val1 = mytest(val1, val2)
return val1
end