(1)lua程序

(2)C++程序(头文件)

extern "C"
{
    #include "lua.h"
    #include "lualib.h"
    #include "lauxlib.h"
};class CLuaFn
{public:
    CLuaFn(void);
    ~CLuaFn(void);
    
    void Init();    //初始化Lua对象指针参数
    void Close();    //关闭Lua对象指针
 
    bool LoadLuaFile(const char* pFileName);    //加载指定的Lua文件
    bool CallFileFn(const char* pFunctionName, int nParam1, int nParam2);        //执行指定Lua文件中的函数private:
    lua_State* m_pState;    //这个是Lua的State对象指针,你可以一个Lua文件对应一个
};

(3)C++程序(.cpp文件)

#include "CLuaFn.h"
 
CLuaFn::CLuaFn(void){m_pState = NULL;};        //这句干嘛
CLuaFn::~CLuaFn(void){};
//初始化函数void CLuaFn::Init()
{
    if (NULL == m_pState)
    {
        m_pState = lua_open();    //返回一个lua对象指针
        luaL_openlibs(m_pState);    //加载了所有你可能用到的Lua基本库    }
}
//关闭Lua对象并释放资源void CLuaFn::Close()
{
    if(NULL != m_pState)
    {
        lua_close(m_pState);
        m_pState = NULL;
    }
}
bool CLuaFn::LoadLuaFile(const char* pFileName)
{
    int nRet = 0;
    if (NULL == m_pState)
    {
        printf("[CLuaFn::LoadLuaFile]m_pState is NULL./n");
        return false;
    }
    //加载文件的时候尽量放在程序的初始化中
    nRet = luaL_dofile(m_pState, pFileName);
    if (nRet != 0)
    {
        printf("[CLuaFn::LoadLuaFile]luaL_loadfile(%s) is file(%d)(%s)./n", pFileName, nRet, lua_tostring(m_pState, -1));
        return false;
    }
    return true;
}
bool CLuaFn::CallFileFn(const char* pFunctionName, int nParam1, int nParam2)
{
    int nRet = 0;
    if (NULL == m_pState)
    {
        printf("[CLuaFn::CallFileFn]m_pState is NULL./n");
        return false;
    }
    //验证你的Lua函数是否在你当前加载的Lua文件中,并把指针指向这个函数位置    lua_getglobal(m_pState, pFunctionName);
 
    // 压栈(顺序:从左到右的参数):第一个参数    lua_pushnumber(m_pState, nParam1);
    // 压栈:第二个参数    lua_pushnumber(m_pState, nParam2);
    //执行这个函数,2是输入参数的个数,1是返回值的个数
    nRet = lua_pcall(m_pState, 2, 1, 0);
    if (nRet != 0)
    {
        printf("[CLuaFn::CallFileFn]call function(%s) error(%d)./n", pFunctionName, nRet);
        return false;
    }
    if (lua_isnumber(m_pState, -1) == 1)
    {
        int nSum = lua_tonumber(m_pState, -1);
        printf("[CLuaFn::CallFileFn]Sum = %d./n", nSum);
    }
    return true;
}

(4)C++程序(main文件)

#include "CLuaFn.h"int main(int argc, char* argv[])
{
    CLuaFn LuaFn;
    LuaFn.Init();
    LuaFn.LoadLuaFile("Sample.lua");
    LuaFn.CallFileFn("func_Add", 11, 12);
    getchar();
 
    return 0;
}

注:程序中的注释已经很详尽,这里不在对代码进行解释。下载安装lua之后,在vs2010中还要引入相应的库。截图如下:

lua与c的交互(运用)的更多相关文章

  1. Lua与C的交互

    Lua 与 C 的交互 Lua是一个嵌入式的语言,它不仅可以是一个独立运行的程序,也可以是一个用来嵌入其它应用的程序库. C API是一个C代码与Lua进行交互的函数集,它由以下几部分构成: 1.  ...

  2. cocos2d-x lua与c++简单交互

    cocos2d-x lua与c++简单交互 version: cocos2d-x 3.6 本文讲述lua与c++的一些简单交互: lua通过消息方式调用c++无参接口 c++调用lua带参接口 1.通 ...

  3. Lua与C/C++交互问题

    初学lua,遇到注册C/C++交互函数问题 在lua与C/C++交互时,C/C++的注册Lua函数若是一个有返回类型(压栈)而不是获取类型的时候应该返回1而不是返回0,否则会出现在Lua中值为nil( ...

  4. Lua与C++的交互

    这篇文章说的挺详细的:Lua与C++的交互

  5. lua与C/C++交互概要

    转 http://blog.csdn.net/wildfireli/article/details/22307635 Lua生来就是为了和C交互的,因此使用C扩展Lua或者将Lua嵌入到C当中都是非常 ...

  6. 通过lua栈了解lua与c的交互

    lua是如何执行的 其中分析.执行部分都是c语言实现的. lua与c的关系 lua的虚拟机是用c语言实现的,换句话说一段lua指令最终在执行时都是当作c语言来执行的,lua的global表,函数调用栈 ...

  7. Lua脚本和C++交互(一)

    现在,越来越多的C++服务器和客户端融入了脚本的支持,尤其在网游领域,脚本语言已经渗透到了方方面面,比如你可以在你的客户端增加一个脚本,这个脚本将会帮你在界面上显示新的数据,亦或帮你完成某些任务,亦或 ...

  8. Lua基本语法-lua与C#的交互(相当简单详细的例子)

    lua脚本 与 C#的交互 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 1 Lua And C# -- ...

  9. lua和C++的交互(1)

    /* 以前听的一个故事,当年Java的创造者讲课的时候,一开始先拿一个简单的不能简单的小例子, 不断的扩展,最后成为一个复杂而完美的程序. 一个重要之重要的概念,就是栈.Lua与别的语言交互以及交换数 ...

  10. lua与c的交互(函数专用)

    Lua与C的交互 Lua是一个嵌入式的语言,它不仅可以是一个独立运行的程序,也可以是一个用来嵌入其它应用的程序库. C API是一个C代码与Lua进行交互的函数集,它由以下几部分构成: 1.  读写L ...

随机推荐

  1. SpringCloud(1)----基于RestTemplate微服务项目

    在写SpringCloud搭建微服务之前,我想先搭建一个不通过springcloud只通过SpringBoot和Mybatis进行模块之间额通讯.然后在此基础上再添加SpringCloud框架. 下面 ...

  2. ActiveMQ的作用总结(应用场景及优势)以及springboot+activeMq 实战

      业务场景说明: 消息队列在大型电子商务类网站,如京东.淘宝.去哪儿等网站有着深入的应用, 队列的主要作用是消除高并发访问高峰,加快网站的响应速度. 在不使用消息队列的情况下,用户的请求数据直接写入 ...

  3. Android蓝牙开发技术学习总结

    Android开发,提供对蓝牙的通讯栈的支持,允许设别和其他的设备进行无线传输数据.应用程序层通过安卓API来调用蓝牙的相关功能,这些API使程序无线连接到蓝牙设备,并拥有P2P或者多端无线连接的特性 ...

  4. Jmeter使用实践- 基础介绍

    Jmeter使用实践- 基础介绍 随着市场上推出越来越多的测试工具,大家使用起来也比较盲目,就我个人而言,使用过LoadRunner和Jmeter 很多人倾向于LoadRunner,因为LR的功能更强 ...

  5. python中pip的安装与更新

    python -m pip install --upgrade pip --force-reinstall

  6. vs把asp.net旧的项目名称全部修改

    1 先打开项目,把名称全部替换掉,然后把解决方案,程序集名称全部替换掉. 2 重新生成,清理,关闭项目. 3 把.sln文件用文本编辑器打开,替换里面的名称,然后把文件夹名称都修改好.d 4.打开项目 ...

  7. 在java开发环境中,快捷键的使用及用法

    (1)Ctrl+M切换窗口的大小 (2)Ctrl+Q跳到最后一次的编辑处 (3)F2当鼠标放在一个标记处出现Tooltip时候按F2则把鼠标移开时Tooltip还会显示即Show Tooltip De ...

  8. 【VS开发】【C/C++开发】printf缓冲区刷新

    printf之缓冲区小结: 今天调试程序,发现了一个有趣的现象,printf函数没有按照预期的结果输出重复的字符串,单步调试显示代码的确走到了打印屏幕的分支,没有显示不由得想到了是不是缓冲区去刷新的问 ...

  9. flask的session基础认识

    from flask import Flask,session from datetime import timedelta import os app = Flask(__name__) app.c ...

  10. sqlyog注释的快捷键-先收藏

    在学习使用sqlyog的时候,想要多行注释SQL语句,就去网上找了相关的快捷键,与大家分享,网上有很多! Ctrl+M 创建一个新的连接Ctrl+N 使用当前设置新建连接Ctrl+F4 断开当前连接 ...