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

http://www.cnblogs.com/clever101/archive/2010/04/14/1712207.html

作者:朱金灿

来源:http://www.cnblogs.com/clever101/

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脚本函数,代码如下:

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

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

接着我们新建一个MFC对话框工程:Calc。这个程序实现简单整数加法运算。

首先在对话框类定义一个Lua虚拟机指针以及加法运算所需要的变量:

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

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

/*!
*  \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虚拟机:

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

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

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

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脚本函数程序源码下载

参考文献:

1. LUA 和C之间的函数调用

2. LUA整合进MFC代码

时间: 2024-12-30 16:21:39

VC和LUA混合开发之VC程序调用Lua脚本函数的相关文章

Cocos2d-x Lua游戏开发之Lua oo 的实现

一些面向对象的语言中提供了类的概念,作为创建对象的模版.在这些 语言里面.对象是类的实例,lua通过table也可以实现类的使用. --建立父类Animal Animal = { size,--动物大小 成员变量声明,不赋值为nil age,--动物年龄 color = "yellow",--动物颜色 sex,--动物性别,这个可以有?? new = function ( self,object ) object = object or {}--判断object是否为空,nil就会创建

Android混合开发之WebViewJavascriptBridge实现JS与java安全交互

前言: 为了加快开发效率,目前公司一些功能使用H5开发,这里难免会用到Js与Java函数互相调用的问题,这个Android是提供了原生支持的,不过存在安全隐患,今天我们来学习一种安全方式来满足Js与java互相调用的需求.它就是WebViewJavascriptBridge. 学习动机: 先看下之前的解决办法:Android混合开发之WebView与Javascript交互 最近棒棒安全的一个市场推广来我们公司推广他们的产品,当时也没太引起我的注意,后来这个市场推广人员把我们的app的进行了他们

lua入门之一:c/c++ 调用lua及多个返回值得获取

当 Lua 调用 C 函数的时候,使用和 C 调用 Lua 相同类型的栈来交互.C 函数从栈中获取她的参数,调用结束后将返回结果放到栈中.为了区分返回结果和栈中的其他的值,每个 C 函数还会返回结果的个数(the  function  returns  (in  C)  the  number  of  results  it  is leaving on the stack.). // luacallcpp.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h&

lua入门之一:c/c++ 调用lua

lua和c / c++的数据交互通过栈进行, 操作数据时,首先将数据拷贝到"栈"上,然后获取数据,栈中的每个数据通过索引值进行定位,索引值为正时表示相对于栈底的偏移索引,索引值为负时表示相对于栈顶的偏移索引,索引值以1或 - 1为起始值,因此栈顶索引值永远为 - 1, 栈底索引值永远为1 . "栈"相当于数据在lua和c / c++之间的中转地.每种数据都有相应的存取接口 . --region *.lua --Date --此文件由[BabeLua]插件自动生成 p

安卓混合开发之Cordova,NativeWebView两种实现

转载请注明出处:王亟亟的大牛之路 如今混合开发已经不是新鲜词了,虽然作为源生的死忠我不怎么愿意去用H5实现我的功能,但是需求说了算...还是屈服了...然后就去了解了下,也抠了点Demo在这里分享给大家(也许网上有类似的,但是我这个肯定是可以run并且实现方式是不同的) 上内容之前,先说下纯H5 混合 纯native的各种区别,不了解的可以看下下面的简单描述(扣来的) 一.原生应用 优点 可访问手机所有功能(GPS.摄像头): 速度更快.性能高.整体用户体验不错: 可线下使用(因为是在跟Web相

iOS开发之iOS程序的启动过程

程序启动的完整过程: (1)main函数 (2)UIApplicationMain * 创建UIApplication对象 * 创建UIApplication的delegate对象 (3)delegate对象开始处理(监听)系统事件(没有storyboard) * 程序启动完毕的时候, 就会调用代理的application:didFinishLaunchingWithOptions:方法 * 在application:didFinishLaunchingWithOptions:中创建UIWind

Cocos2dx-lua开发之c++绑定到lua

一. 简单介绍 文章介绍是在实际的游戏开发项目中,将自定义的C++类绑定到lua中,能够让lua调用c++类.会创建一个python脚本,执行python脚本会让自动将我们的c++类绑定到lua.生成我们要的代码.文章会介绍配置环境.编写脚本.测试类.实际项目中调用,以及一些遇到的问题 二.兵马未动粮草先行 当前我用的是quicklua 3.3 win7系统.下载需要的工具 可以先看一下 \tools\tolua \README.mdown里面有详细介绍,而且都有下载地址 我现在是win系统,翻

移动混合开发之android文件管理-->flexbox,webFont。

增加操作栏,使用felxbox居中,felx相关参考网址:http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html 使用webFont添加图标,webFont下载地址为http://fontello.com/ index.html: <!DOCTYPE html> <!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor l

移动混合开发之android文件管理新建文件和删除文件

今天经过一天超过8小时的实践,有很多CSS上的细节需要注意: 1, /*注意是对before的操作*/ .content ul li .icon-check-empty:before{ display: block; /*webFont设置其width和height时无效,只有设置font-size*/ /*width: 3rem;*/ /*height: 3rem;*/ font-size: 1.5rem; position: absolute; top:0; left: 0; bottom: