單獨用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