C++利用LuaIntf调用Lua的方法示例

 更新时间:2017年11月08日 11:17:51   作者:金庆  
这篇文章主要给大家介绍了关于C++利用LuaIntf调用Lua以及利用lua-intf来调用C++函数的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一的参考学习价值,需要的朋友们下面来一起看看吧。

C++利用LuaIntf调用Lua

本文主要介绍了C++利用LuaIntf调用Lua的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。

void LuaTest::OnResponse(uint32_t uLuaRpcId,
 const std::string& sRespContent) const
{
 using LuaIntf::LuaRef;
 LuaRef require(m_pLuaState, "require");
 try {
  LuaRef handler = require.call<LuaRef>("client_rpc_response_handler");
  handler.dispatchStatic("handle", uLuaRpcId, sRespContent);
 }
 catch (const LuaIntf::LuaException& e) {
  std::cerr << "Failed to call lua client_rpc_response_handler.handle(), "
   << e.what() << std::endl;
 }
}

这是测试客户端代码,可以写Lua代码测试服务器.

Lua代码中发出一个Rpc请求时, 会在Lua中保存一个回调, 待收到应答时触发回调. 通过uLuaRpcId来索引该回调.

sRespContent 是收到的应答包, 将在lua中解包.

OnResponse() 就是调用了 Lua 代码:

require("client_rpc_response_handler").handle(uLuaRpcId, sRespContent)

利用lua-intf来调用C++函数

这里主要是在windows利用VS2015完成,首先是配置lua环境,包含lua的头文件,连接器里面链接lua的静态库,然后就是包含lua-intf的代码,具体如下表


需要注意的是:lua-intf_d6f17a是一个包含lua-intf的目录。

lua-intf的代码在github上可以下载:https://github.com/SteveKChiu/lua-intf

如何使用看他的README.md

这里我们主要是测试绑定C++类中的函数,工程目录结构如下

main.cpp代码如下

#include <iostream> 
#include <lua.hpp> 
#include <LuaIntf/LuaIntf.h> 
#include <string> 
 
const char SCRIPTS_DIR[] = "../scripts"; 
 
using namespace std; 
 
struct lua_State; 
 
class TestLog 
{ 
public: 
 static TestLog *getInstance() 
 { 
  static TestLog instance; 
  return &instance; 
 } 
 
 ~TestLog(); 
 void Log(const string &str); 
 void BindLua(lua_State *l); 
 
private: 
 TestLog(); 
  
}; 
 
TestLog::TestLog() 
{ 
} 
 
TestLog::~TestLog() 
{ 
} 
 
void TestLog::Log(const string &str) 
{ 
 cout << str << endl; 
} 
 
namespace 
{ 
 using LuaRef = LuaIntf::LuaRef; 
 
 void LuaLog(const string &str) 
 { 
  TestLog::getInstance()->Log(str); 
 } 
 
 namespace LuaTestLog 
 { 
  void Bind(lua_State* L) 
  { 
   assert(L); 
   LuaIntf::LuaBinding(L).beginModule("c_testlog") 
    .addFunction("log", &LuaLog) 
    .endModule(); 
  } 
 }; 
}; 
 
void TestLog::BindLua(lua_State *l) 
{ 
 LuaTestLog::Bind(l); 
} 
 
int main() 
{ 
 lua_State *l = luaL_newstate(); 
 luaL_openlibs(l); 
 TestLog::getInstance()->BindLua(l); 
 cout << "mmmmmmmmmmm" << endl; 
 luaL_dofile(l, "test.lua"); 
 system("pause"); 
 return 0; 
} 

log.lua代码如下:

local Log = {} 
 
local log = c_testlog.log 
 
function Log:new(log_name) 
 assert("table" == type(self)) 
 assert(not log_name or "string" == type(log_name)) 
 local log = {} 
 log.log_name = log_name or "Log" 
 setmetatable(log, self) 
 self.__index = self 
 return log 
end 
 
function Log:set_log_name(log_name) 
 self.log_name = log_name 
end 
 
function Log:info(pattern, ...) 
 log(string.format(pattern, ...)) 
end 
 
function Log:debug() 
 print("ssssssssssssssssssssssssss") 
end 
 
return Log 

test.lua代码如下:

local function main() 
 
 print("dddddddddddddddddddddddd") 
 local p = "../testLuaIntf" 
 package.path = package.path ..";" .. p .. "/" .. "testLuaIntf" .. "/?.lua" 
 --package.path = package.path .. "E:\VSProject\?.luac" 
 
 print("bbbbbbbbbbbbbbbbbbbbbbbbbbbbb") 
 
 local log = require("log"):new("svn_log") 
 log:info("%d...",1) 
 
 
 --:new("svc_log") 
 print("ssssssssssssssssssssssss") 
 
 
end 
 
 
xpcall(main,function(...) 
local msg = {...}; 
for k ,v in pairs(msg) do 
print("k=" .. tostring( k) .. " v=" .. tostring(v)) 
 
end 
print(tostring() .. " 123") 
end) 

这里流程通过C++调lua的接口luaL_dofile(l, "test.lua");来执行test.lua,test.lua中require("log"),然后lua再调用C++的函数Log完成打印

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • C++ 如何使用栈求解中缀、后缀表达式的值

    C++ 如何使用栈求解中缀、后缀表达式的值

    这篇文章主要介绍了C++ 使用栈求解中缀、后缀表达式的值,本文讲解了中缀、后缀表达式的求值过程以及如何将一个中缀表达式转换成后缀表达式,需要的朋友可以参考下
    2022-10-10
  • C++ 将数据转为字符串的几种方法

    C++ 将数据转为字符串的几种方法

    这篇文章主要介绍了C++ 将数据转为字符串的几种方法,十分的实用,有需要的小伙伴可以参考下。
    2015-06-06
  • 详解应用程序与驱动程序通信DeviceIoControl

    详解应用程序与驱动程序通信DeviceIoControl

    这种通信方式,就是驱动程序和应用程序自定义一种IO控制码,然后调用DeviceIoControl函数,IO管理器会产生一个MajorFunction为IRP_MJ_DEVICE_CONTROL,MinorFunction为自己定义的控制码的IRP,系统就调用相应的处理IRP_MJ_DEVICE_CONTROL的派遣函数
    2021-06-06
  • 关于在MFC中将窗口最小化到托盘实现原理及操作步骤

    关于在MFC中将窗口最小化到托盘实现原理及操作步骤

    最小化的原理:首先要将窗口隐藏,然后在右下角绘制图标;恢复的原理:将窗口显示,再将托盘中的图片删除,接下来介绍实现方法,感兴趣的朋友可以了解下啊,希望本文对你有所帮助
    2013-01-01
  • C语言字符串大小比较

    C语言字符串大小比较

    本文给大家分享给大家的是C语言的字符串大小比较的函数,有需要的小伙伴可以参考下。
    2015-07-07
  • C 语言基础----详解C中的运算符

    C 语言基础----详解C中的运算符

    这篇文章主要介绍了C语言中的运算符,文中讲解非常详细,适合初学小白进行学习,想入门C语言的朋友不妨了解下
    2020-06-06
  • C++双目运算符+=的重载详解

    C++双目运算符+=的重载详解

    这篇文章主要介绍了详解C++编程中的双目运算符重载,是C++入门学习中的基础知识,需要的朋友可以参考下,希望能够给你带来帮助
    2021-09-09
  • 深入解析C++中的指针数组与指向指针的指针

    深入解析C++中的指针数组与指向指针的指针

    以下是对C++中的指针数组与指向指针的指针进行了详细的介绍,需要的朋友可以过来参考下
    2013-09-09
  • c++中为什么不提倡使用vector示例详解

    c++中为什么不提倡使用vector示例详解

    这篇文章主要给大家介绍了关于c++中为什么不提倡使用vector的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用c++具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • C语言实现导航功能

    C语言实现导航功能

    这篇文章主要为大家详细介绍了C语言实现导航功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03

最新评论