请选择 进入手机版 | 继续访问电脑版
  • 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

lua与c的交互(运用)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

(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中还要引入相应的库。截图如下:

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Lua学习五----------Lua循环发布时间:2022-07-22
下一篇:
Lua,github,nginx发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap