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++交互的功能完成,并实现控制台颜色的区分输出。在实际开发中也可以使用。
留言评论
暂无留言