1.调用C函数
C文件
//对于被Lua调用的函数必须符合typedef int (*lua_CFunction)(lua_State* L)格式
//其中返回值是返回值的个数
#ifdef _cplusplus
extern "C"{
#endif
int add(lua_State* L)
{
int a = lua_tonumber(L,1);
int b = lua_tonumber(L,2);
lua_pop(L,2);
lua_pushnumber(L,a+b);
return 1;
}
static const luaL_Reg mathlib[] =
{
{ "add", add },
{ NULL, NULL }
};
int Luaopen_Libmath(lua_State* L)
{
if (L == NULL)
{
return 1;
}
luaL_checkversion(L);
luaL_newlib(L,mathlib);
return 1;
}
#ifdef _cplusplus
}
#endif
int main()
{
lua_State *L = luaL_newstate(); //返回一個指向棧頂的指針
if(L == nullptr)
{
return;
}
//获取相应lua库的使用权
luaopen_base(L);
luaopen_table(L);
luaopen_package(L);
luaopen_io(L);
luaopen_string(L);
luaL_requiref(L, "MathLib", Luaopen_Libmath, 1);
luaL_openlibs(L);
if(luaL_dofile(L,"test.lua")) //luaL_dofile宏封装了luaL_Loadfile和lua_pcall
{
const char * error = lua_tostring(L, -1);
printf(error);
return;
}
lua_colse(L);
}
lua文件
require "MathLib"
print(MathLib.add(27,3))
2.lua调用C++函数,获取窗口控件内容
C++文件
//定义全局的窗口指针变量,可在窗口构造函数中初始化
CLuadialogDlg * pDlg;
static int msgbox(lua_State *L)
{
//从lua文件中获取字符串参数值
const char * p1 = lua_tostring(L, -1);
const char * p2 = lua_tostring(L, -2);
::MessageBox(0, CString(p1), CString(p2), MB_OK + MB_ICONINFORMATION);
return 1;
}
static int gettext(lua_State * L)
{
//从lua脚本中获取参数
double id = lua_tonumber(L, -1);
CWnd * pWnd = pDlg->GetDlgItem(id);
CString strTemp;
pWnd->GetWindowText(strTemp);
USES_CONVERSION;
//将结果压栈,传给lua脚本
lua_pushstring(L, W2A(strTemp));
return 1;
}
static int settext(lua_State * L)
{
//从lua脚本中获取参数
double id = lua_tonumber(L, -1);
const char * szText = lua_tostring(L, - 2);
CWnd * pWnd = pDlg->GetDlgItem(id);
USES_CONVERSION;
pWnd->SetWindowText(A2W(szText));
return 1;
}
static const luaL_Reg work[] =
{//模块映射表
{ "msgbox", msgbox },
{"gettext",gettext},
{"settext",settext},
{ NULL, NULL }
};
int GetLib(lua_State* L)
{//创建模块
luaL_newlib(L, work);
return 1; //return one value
}
void CluadialogDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
lua_State *L = luaL_newstate();
luaL_openlibs(L);
//注册模块
luaL_requiref(L, "Scale", GetLib, 1);
luaL_dofile(L, "gettext.lua");//加载执行lua文件
lua_close(L);
}
void CluadialogDlg::OnBnClickedButton2()
{
lua_State *L = luaL_newstate();
luaL_openlibs(L);
//注册模块
luaL_requiref(L, "Scale", GetLib, 1);
luaL_dofile(L, "the.lua");//加载执行lua文件
lua_close(L);
}
lua文件
require "Scale" --引入模块
strEdit= Scale.GetEditText(1001)--1001为控件的ID
Scale.msgbox("提示",strEdit)--在lua显示出控件内容
3.C++中操作lua中的表,实现多个数据传递
如获取控件的坐标,C++函数如下:
int CScale3DCLuaControl::getpos(lua_State *L)
{
if (!pWeightDlg)return 0;
double id = lua_tonumber(L, -1);
CWnd *pWnd = pWeightDlg->GetDlgItem(id);
if (pWnd)
{
CRect rt;
pWnd->GetWindowRect(rt);
ScreenToClient(pWeightDlg->GetSafeHwnd(), &rt.TopLeft());
lua_getglobal(L, "point"); //获取表名
lua_pushstring(L, "x"); //键名
lua_pushnumber(L, rt.left); //值
lua_settable(L, -3); //设值成键值对,并出栈
lua_pushstring(L, "y"); //下一对键值组合
lua_pushnumber(L, rt.top);
lua_settable(L, -3); //将这一对键值设成元素
}
return 0;
}
lua文件
require "Scale" --引入称重模块
point={x=100,y=200}--声明表
Scale.getpos(15009)--获取坐标
--在lua显示出控件内容
Scale.msgbox("提示","你好,这是提示信息!"..point.x..","..point.y)