kenlistian

厚积薄发. 勤为桨,思为帆

   :: 首页 :: 新随笔 ::  :: 聚合  :: 管理 ::
  73 随笔 :: 4 文章 :: 22 评论 :: 0 Trackbacks

单独用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

 

 

 

posted on 2007-04-24 11:35 kenlistian 阅读(748) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理