BCB中C与Lua互相函数变量调用代码
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