(1)首先下载lua的源码,创建一个DLL工程,将src目录复制到工程目录下,并将除lua.c、lua.h、luac.c、luac.h外的所有文件,分别添加到头文件和源文件中去。

(2)关闭预编译头

(3)预处理里添加:LUA_BUILD_AS_DLL

#include"lua.hpp"staticintadd(lua_State*L){doubleop1=lua_tonumber(L,-1);//从栈上获取数据doubleop2=lua_tonumber(L,-2);lua_pushnumber(L,op1+op2);//结果入栈return1;}staticconstluaL_Regwork[]={{"add",add},{NULL,NULL}};intGetLib(lua_State*L){//创建模块luaL_newlib(L,work);return1;//returnonevalue}intmain(){lua_State*L=luaL_newstate();luaL_openlibs(L);//注册模块luaL_requiref(L,"Scale",GetLib,1);luaL_dofile(L,"1.lua");//加载执行lua文件lua_close(L);getchar();return0;}

1.lua文件内容如下:

require"Scale"print"调用C语言函数,计算两个数相加"a=Scale.add(1,2)print(a)

(4)lua调用C++函数,获取窗口控件内容

//定义全局的窗口指针变量,可在窗口构造函数中初始化CLuadialogDlg*pDlg;staticintmsgbox(lua_State*L){//从lua文件中获取字符串参数值constchar*p1=lua_tostring(L,-1);constchar*p2=lua_tostring(L,-2);::MessageBox(0,CString(p1),CString(p2),MB_OK+MB_ICONINFORMATION);return1;}staticintgettext(lua_State*L){//从lua脚本中获取参数doubleid=lua_tonumber(L,-1);CWnd*pWnd=pDlg->GetDlgItem(id);CStringstrTemp;pWnd->GetWindowText(strTemp);USES_CONVERSION;//将结果压栈,传给lua脚本lua_pushstring(L,W2A(strTemp));return1;}staticintsettext(lua_State*L){//从lua脚本中获取参数doubleid=lua_tonumber(L,-1);constchar*szText=lua_tostring(L,-2);CWnd*pWnd=pDlg->GetDlgItem(id);USES_CONVERSION;pWnd->SetWindowText(A2W(szText));return1;}staticconstluaL_Regwork[]={//模块映射表{"msgbox",msgbox},{"gettext",gettext},{"settext",settext},{NULL,NULL}};intGetLib(lua_State*L){//创建模块luaL_newlib(L,work);return1;//returnonevalue}voidCluadialogDlg::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);}voidCluadialogDlg::OnBnClickedButton2(){lua_State*L=luaL_newstate();luaL_openlibs(L);//注册模块luaL_requiref(L,"Scale",GetLib,1);luaL_dofile(L,"the.lua");//加载执行lua文件lua_close(L);}

GetText.lua的文件内容如下:

require"Scale"--引入模块strEdit=Scale.GetEditText(1001)--1001为控件的IDScale.msgbox("提示",strEdit)--在lua显示出控件内容

(5)C++中操作lua中的表,实现多个数据传递

如获取控件的坐标,C++函数如下:

intCScale3DCLuaControl::getpos(lua_State*L){if(!pWeightDlg)return0;doubleid=lua_tonumber(L,-1);CWnd*pWnd=pWeightDlg->GetDlgItem(id);if(pWnd){CRectrt;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);//将这一对键值设成元素}return0;}

.lua文件的内容如下:

require"Scale"--引入称重模块point={x=100,y=200}--声明表Scale.getpos(15009)--获取坐标--在lua显示出控件内容Scale.msgbox("提示","你好,这是提示信息!"..point.x..","..point.y)