(1)首先下载lua的源码,创建一个DLL工程,将src目录复制到工程目录下,并将除lua.c、lua.h、luac.c、luac.h外的所有文件,分别添加到头文件和源文件中去。
(2)关闭预编译头
(3)预处理里添加:LUA_BUILD_AS_DLL
#include "lua.hpp"
static int add(lua_State *L)
{
double op1 = lua_tonumber(L, -1);//从栈上获取数据
double op2 = lua_tonumber(L, -2);
lua_pushnumber(L, op1 + op2);//结果入栈
return 1;
}
static const luaL_Reg work[] =
{
{ "add", add },
{ NULL, NULL }
};
int GetLib(lua_State* L)
{//创建模块
luaL_newlib(L, work);
return 1; //return one value
}
int main()
{
lua_State *L = luaL_newstate();
luaL_openlibs(L);
//注册模块
luaL_requiref(L, "Scale", GetLib, 1);
luaL_dofile(L, "1.lua");//加载执行lua文件
lua_close(L);
getchar();
return 0;
}
1.lua文件内容如下:
require "Scale"
print "调用C语言函数,计算两个数相加"
a = Scale.add(1,2)
print (a)
(4)lua调用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);
}
GetText.lua的文件内容如下:
require "Scale" --引入模块
strEdit= Scale.GetEditText(1001)--1001为控件的ID
Scale.msgbox("提示",strEdit)--在lua显示出控件内容
(5)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)
转载于:https://blog.51cto.com/9233403/2128934