|
我的博客(原址)
继续接上一篇,接下来实现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[]={
{&#34;set_color&#34;,set_color},
{NULL,NULL}
}
int libaray(lua_State *L)
{
luaL_register(L,&#34;MyColor&#34;,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 == &#34;error&#34; or headStr == &#34;Error&#34; or headStr_1 == &#34;err&#34; then
MyColor.set_color(0x0004);--调用C++函数 设置控制台输出颜色位红色
local arg = {...}
local tmpStr = str;
for i= 1,#arg do ---拼接参数
tmpStr = tmpStr .. arg
end
print(tmpStr)
MyColor.set_color(0x000F);--调用C++函数 设置控制台输出颜色为白色
return &#34;succsse1&#34; --返回一个成功标识
elseif headStr_2 == &#34;warning&#34; or headStr_2 == &#34;Warning&#34; or headStr_2 == &#34;WARNING&#34; then
MyColor.set_color(0x000E);--调用C++函数 设置控制台输出颜色为黄色
local arg = {...}
local tmpStr = str;
for i= 1,#arg do ---拼接参数
tmpStr = tmpStr .. arg
end
print(tmpStr)
MyColor.set_color(0x000F);--调用C++函数 设置控制台输出颜色为白色
return &#34;succsse2&#34; --返回一个成功标识
else
local arg = {...}
local tmpStr = str;
for i= 1,#arg do ---拼接参数
tmpStr = tmpStr .. arg
end
print(tmpStr)
return &#34;succsse3&#34; --返回一个成功标识
end
end整个关键代码都已经完成,c++中调用lua 的logout 输出信息,lua中再调用C++接口设置控制台的输出颜色。
下面是修改后的main.cpp文件
#include <iostream>
#include &#34;MainLua.h&#34; //添加头文件
int main(){
//创建lua状态 相当于lua的栈
lua_State *L = luaL_newstate();//提示无法解析的外部符号 考虑lua5.1.lib没有加到 附加依赖项
if(L==NULL)
{
std::cout<<&#34;error lua_State by luaL_newstate!&#34;<<std::endl;
return 0;
}
MainLua::libaray(L);//注册函数
luaL_openlibs(L);//如果不加 会导致luaL_dofile出错
//加载脚本
int nRet = luaL_dofile(L,&#34;luaLogOut.lua&#34;);//注意上面5个文件的版本一致,否则有可能导致luaL_dofile找不到,另外还有luaL_loadfile可以自行百度看下区别
if(nRet)
{
std::cout<<&#34;error load file by luaL_dofile!&#34;<<std::endl;
lua_close(L);
system(&#34;pause&#34;);
return 0;
}
lua_getglobal(L,&#34;logout&#34;);//获取lua脚本中的全局函数 实现带颜色的输出
lua_pushstring(L,&#34;error :I am lua function &#39;logout&#39; tese&#34;);//要传入的参数 压入栈中 传入带有“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<<&#34;return msg: &#34;<<result<<std::endl;
lua_close(L);
system(&#34;pause&#34;);
return 0;
}else
{
const char* result = lua_tostring(L,-1);
lua_getglobal(L,&#34;logout&#34;);//获取lua脚本中的全局函数 实现带颜色的输出
lua_pushstring(L,&#34;Warning &#39;logout&#39; return: &#34;);//要传入的参数 压入栈中 传入带有“Warning ”标识的信息
lua_pushstring(L,result);//返回结果再次压入
int nRet = lua_pcall(L,2,0,0);//传入两个参数 没有返回值
}
lua_close(L);
system(&#34;pause&#34;);
return 0;
}
执行结果:
error : I am lua function &#39;logout&#39; test (红色)
Warning &#39;logout&#39; return: succsse1 (黄色)
完结。整个简单的lua与c++交互的功能完成,并实现控制台颜色的区分输出。在实际开发中也可以使用。 |
|