导读:对于C语言和Lua的互调在网上已经一大堆了,但是对于MFC和Lua的互调还是比较少的。所以这篇文章就讲述一下如何在MFC中调用Lua的函数。
实验环境:Visual C++ 6.0
- 首先,新建一个MFC项目,我使用的是"基本对话框"类型项目。
- 选择"工具" -> "选项" -> "目录" -> "Include files`选项, 添加上Lua安装下的include目录的路径
- 选择"工具" -> "选项" -> "目录" -> "Library files`选项, 添加上Lua安装下的lib目录的路径
- 打开 "你的项目名Dlg.cpp` ,然后添加以下语句
代码:
extern C
{
#include lua.h
#include lualib.h
#include lauxlib.h
}
#pragma comment(lib, lua51.lib)
lua_State *lua;
在窗口上拉进去一个Button,命名为"调用",然后添加点击响应函数
在响应函数中添加以下语句
lua = lua_open ();
if(lua)
{
luaopen_base (lua);
luaopen_table (lua);
luaopen_string (lua);
luaopen_math (lua);
luaopen_debug (lua);
}
luaL_dofile(lua, test.lua); // 解释分析lua文件
lua_getglobal(lua, add); // 取到一个全局标号add,取的同时会把add函数压栈
lua_pushnumber(lua, 4); // 把第一个参数压入栈里
lua_pushnumber(lua, 5); // 第二个参数压栈
lua_checkstack(lua, 225);
if(lua_pcall(lua, 2, 1, 0) != 0) // 执行add函数
{
AfxMessageBox(lua_pcall error!);
return;
}
int d = (int)lua_tonumber(lua, -1); // 函数执行完了,执行结果被压栈,所以取得最顶端的一个数就是结果值,-1就是指取栈顶的值
CString str;
str.Format(%d`, d);
AfxMessageBox(str);
lua_pop(lua, 1); // 把值从栈里清除,pop(弹出)一个值
lua_close(lua);
最后一步,在项目目录下新建一个文件,命名为"test.lua",然后在里面输入以下内容,然后运行程序,点击按钮你将会看到效果。
function add ( ... )
return arg[1] + arg[2];
end