C++ 与 Lua交互,实现简单的C++ 与 Lua的简单调用,在控制台输出实现颜色的区分输出(二)

C++ 与 Lua交互,实现简单的C++ 与 Lua的简单调用,在控制台输出实现颜色的区分输出(二)

继续接上一篇,接下来实现lua 调用C++  并且实现控制台  输出的颜色:


创建类MainLua

将原来main.cpp中的 extern  "C"移到  MainLua.h中

MainLua.h

#ifndef __MAIN_LUA_H__
#define __MAIN_LUA_H__
extern "C"{
    #include "lua.h"//如果出现报错,无法找到文件,考虑文件位置放的不对
    #include "lauxlib.h"
    #include "lualib.h"
};
namespace Mainlua
{
    int libaray(lua_State *L);
}

#endif

下面是MainLua.cpp的实现,定义lua中调用的C++函数

#include "MainLua.h"
#include <Windows.h>

namespace MyColor //定义一个改变颜色相关的命名空间
{
    static int set_color(lua_State *L)//定义调用函数
    {
        WORD color = (WORD)luaL_checknumber(L,-1);//获取lua传过来的颜色参数
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),color);
        return 0;//表示返回0个返回值
    }
    
    static luaL_Reg libs[]={
        {"set_color",set_color},
        {NULL,NULL}
    }
    
    int libaray(lua_State *L)
    {
        luaL_register(L,"MyColor",libs);//注册函数
        return 1;
    }
}

namespace Mainlua
{
    int libaray(lua_State *L)
    {
        MyColor::libaray(L);
        return 0;
    }
}


修改之前的测试lua文件luaLogOut.lua  logout函数支持多参数传入

function logout(str,...)--支持接收多参数传入
    local headStr = string.sub(str,0,5)
    local headStr_1 = string.sub(str,0,3)
    local headStr_2 = string.sub(str,0,7)
    if headStr == "error" or headStr == "Error" or headStr_1 == "err" then
        MyColor.set_color(0x0004);--调用C++函数  设置控制台输出颜色位红色
        local arg = {...}
        local tmpStr = str;
        for i= 1,#arg do  ---拼接参数
            tmpStr = tmpStr .. arg[i]
        end
        print(tmpStr)
        MyColor.set_color(0x000F);--调用C++函数  设置控制台输出颜色为白色
        return "succsse1"  --返回一个成功标识
    elseif headStr_2 == "warning" or headStr_2 == "Warning" or headStr_2  == "WARNING" then
        MyColor.set_color(0x000E);--调用C++函数  设置控制台输出颜色为黄色
        local arg = {...}
        local tmpStr = str;
        for i= 1,#arg do  ---拼接参数
            tmpStr = tmpStr .. arg[i]
        end
        print(tmpStr)
        MyColor.set_color(0x000F);--调用C++函数  设置控制台输出颜色为白色
        return "succsse2"  --返回一个成功标识
        else
            local arg = {...}
            local tmpStr = str;
            for i= 1,#arg do  ---拼接参数
                tmpStr = tmpStr .. arg[i]
            end
            print(tmpStr)
            return "succsse3"  --返回一个成功标识
    end
end

整个关键代码都已经完成,c++中调用lua 的logout   输出信息,lua中再调用C++接口设置控制台的输出颜色。

下面是修改后的main.cpp文件

#include <iostream>
#include "MainLua.h" //添加头文件
int main(){
    //创建lua状态 相当于lua的栈
    lua_State *L = luaL_newstate();//提示无法解析的外部符号  考虑lua5.1.lib没有加到 附加依赖项
    if(L==NULL)
    {
        std::cout<<"error lua_State by luaL_newstate!"<<std::endl;
        return 0;
    }
    MainLua::libaray(L);//注册函数
    luaL_openlibs(L);//如果不加  会导致luaL_dofile出错
    //加载脚本  
    int nRet = luaL_dofile(L,"luaLogOut.lua");//注意上面5个文件的版本一致,否则有可能导致luaL_dofile找不到,另外还有luaL_loadfile可以自行百度看下区别
    if(nRet)
    {
        std::cout<<"error load file by luaL_dofile!"<<std::endl;
        lua_close(L);
        system("pause");
        return 0;
    }
    
    lua_getglobal(L,"logout");//获取lua脚本中的全局函数  实现带颜色的输出
    lua_pushstring(L,"error :I am lua function 'logout' tese");//要传入的参数  压入栈中 传入带有“error”标识的信息 
    /*
    lua_pushcclosure(L, func, 0) // 创建并压入一个闭包
    lua_createtable(L, 0, 0)        // 新建并压入一个表
    lua_pushnumber(L, 343)      // 压入一个数字
    lua_pushstring(L, “mystr”)   // 压入一个字符串 
    */
    int nRet = lua_pcall(L,1,1,0);// 1 1 0 传入一个参数  返回一个参数  0自定义错误处理  注意与lua_call的区别
    if(nRet)
    {
          const char* result = lua_tostring(L,-1);
          std::cout<<"return msg: "<<result<<std::endl;
          lua_close(L);
          system("pause");
          return 0;
    }else
    {
          const char* result = lua_tostring(L,-1);
          lua_getglobal(L,"logout");//获取lua脚本中的全局函数  实现带颜色的输出
          lua_pushstring(L,"Warning 'logout' return: ");//要传入的参数  压入栈中 传入带有“Warning ”标识的信息 
          lua_pushstring(L,result);//返回结果再次压入
          int nRet = lua_pcall(L,2,0,0);//传入两个参数  没有返回值 
    }
    lua_close(L);
    system("pause");
    return 0;
}

执行结果:

error : I am lua function 'logout' test

Warning  'logout' return: succsse1

完结。整个简单的lua与c++交互的功能完成,并实现控制台颜色的区分输出。在实际开发中也可以使用。