单独用lua是不够的,这里我简单推出cbuilder版本和lua的结合运用例子一篇。
这个例子是初步实现了在cbuilder中调用lua实现的函数的例子,同时,也演示了lua中如何调用cbuilder中的函数例子。闲话少说,把例子帖上来。
有几个方面要注意,在cbuilder中创建一个工程,把lua中的src导入进来,其中,要在单元。h文件中做如下声明
extern "c"{
#include <lua.h>
#include
<lauxlib.h>
#include <lualib.h>
}//end extern "c"
否则编译时,cbuilder是不认
################################
#include <vcl.h>
#pragma hdrstop
#include
"uni2.h"
//---------------------------------------------------------------------------
#pragma
package(smart_init)
#pragma resource "*.dfm"
tform1
*form1;
//---------------------------------------------------------------------------
__fastcall
tform1::tform1(tcomponent* owner)
: tform(owner)
{
}
/*
提供给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;
//返回参数数量值
}
/*
调用lua 中的函数模式
1.使用lua_getglobal()来获得函数,
2.将参数压入堆栈,
3.调用
lua_pcall(),
4.然后处理结果。
*/
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区别
lua_pcall(l, 2, 1, 0);
//取值
lua_number retsum;
//注意返回值是通过-1来获取
retsum = lua_tonumber(l,
-1);
label1->caption =
inttostr((int)retsum);
}
void __fastcall tform1::formclose(tobject *sender, tcloseaction
&action)
{
lua_close(l);
}
void __fastcall tform1::formcreate(tobject
*sender)
{
l =
lua_open();
luaopen_base(l);
luaopen_string(l);
//将主程序中的mytest_call函数注册到lua引擎中,
//脚本用mytest回调宿主程序
lua_register(l, "mytest",
mytest_call);
//加载脚本
string sfilename =
"lua_test1.lua";
lual_dofile(l,
sfilename.c_str());
}
/*
测试返回字符串
*/
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);
}
############
其中lua_test1.lua测试文件如下:
retstr="123"
function lua_fun3(ss)
ss
= "aaaaaaaa"
retstr = ss
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
运行效果图:
实践源码见:
http://256617.tomore.com/1/44360.html