• lua与c的交互(运用)


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

  • 相关阅读:
    Java学习
    Java学习
    Java学习
    Java学习
    Java学习
    Java学习
    Java学习
    Citrix 挂经思考
    eBay OA挂经反思
    roblox OA ancestor names 根据roman to int改的
  • 原文地址:https://www.cnblogs.com/gd-luojialin/p/10962844.html
Copyright © 2020-2023  润新知