Lua调用C++函数

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)

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值