VC和LUA混合开发之VC程序调用Lua脚本函数

 
Lua语言以其卓越的可扩展性、简单、高效率和与平台无关性在游戏领域得到广泛应用。今天花了一些时间学习VC和Lua如何混合开发,编写了一个小例程,和大家分享一下这方面的经验。

首先在http://www.lua.org/ftp/下载Lua的最新版本:lua-5.1.4。然后用VS C++ 2005 + sp1建一个Win32静态库空工程:lua,把相关c文件和h文件都添加进来。为了导出了lua的api接口,注意添加一个预处理宏:LUA_CORE(或者是LUA_LIB也可以),另外运行时库采用多线程DLL。

首先编写一个Lua脚本函数,代码如下:

Python code 


function add ( x, y )
return x + y;
end



将这个代码保存为add.lua。

接着我们新建一个MFC对话框工程:Calc。这个程序实现简单整数加法运算。
首先在对话框类定义一个Lua虚拟机指针以及加法运算所需要的变量:


C/C++ code 


    /**
    * \brief LUA 虚拟机指针。
    */
    lua_State *m_plua;
    /**
    * \brief 加法运算的左操作数。
    */
    int m_nLeftNum;
    /**
    * \brief 加法运算的左操作数。
    */
    int m_nRightNum;
    /**
    * \brief 加法运算的结果。
    */
    long m_nResult;



在对话框初始化函数CCalcDlg::OnInitDialog调用LUA虚拟机初始化函数InitLuaState。InitLuaState函数的代码如下:

C/C++ code 

/*!
*  \brief 初始化Lua虚拟机。
*
*  \return 无。
*/
void CCalcDlg::InitLuaState()
{
    m_plua = lua_open(); 
    if(NULL!=m_plua)
    {
        luaopen_base(m_plua);
        luaopen_table(m_plua);
        luaopen_string(m_plua);
        luaopen_math(m_plua);
        luaopen_debug(m_plua);
    } 
}



在对话框的销毁消息响应函数里关闭Lua虚拟机:

C/C++ code 

void CCalcDlg::OnDestroy()
{
    CDialog::OnDestroy();

    // TODO: 在此处添加消息处理程序代码
    lua_close (m_plua); 
}



在执行加法按钮的消息函数里添加如下代码:

C/C++ code 

void CCalcDlg::OnBnClickedOk()
{
    // TODO: 在此添加控件通知处理程序代码
    UpdateData(TRUE);

    StackDump(m_plua); 
    string strLuaFile = _T("");
    GetLuaFile(strLuaFile);  // 得到lua脚本文件全路径
    luaL_dofile(m_plua,strLuaFile.c_str());     // 解释分析lua文件
    StackDump(m_plua);
    lua_getglobal(m_plua,_T("add"));       // 取到一个全局标号add,取的同时会把add函数压栈
    StackDump(m_plua);   
    lua_pushnumber(m_plua,m_nLeftNum);        // 把第一个参数压入栈里
    StackDump(m_plua);
    lua_pushnumber(m_plua,m_nRightNum);        // 第二个参数压栈
    StackDump(m_plua);
    if(lua_pcall(m_plua,2,1,0)!= 0)        // 执行add函数
    {
        AfxMessageBox(_T("调用lua脚本函数失败"));            
        return;
    }
    StackDump(m_plua);
    m_nResult = (int)lua_tonumber(m_plua, -1);        // 函数执行完了,执行结果被压栈,所以取得最顶端的一个数就是结果值,-1就是指取栈顶的值
    StackDump(m_plua);
    lua_pop(m_plua,1);      // 把值从栈里清除,pop(弹出)一个值
    StackDump(m_plua); 
    UpdateData(FALSE);
}



编译环境为:WinXp + sp3, VS C++2005 + sp1,程序运行界面如下:
相关源码在这里下载:VC程序调用Lua脚本函数程序源码下载。


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值