http://19332145.blog.hexun.com/80137459_d.html
C++要想跟tolua完整的相互调用,中间需要很多的库和执行程序,包括tolua.lib tolua++.exe等交互。
1、必须先下载lua 1.5,下载好后,把/src目录的除开lua.c,luac.c的文件全部放到一个新建的静态链接库的工程项目里,然后编译出一个静态链接库xxxxx.lib。
2、去tolua++官网下载一个tolua++的包,解压出来,再次新建一个静态链接库的项目,把tolua++的/src/lib里的.h .c的文件拷贝到静态链接库的项目里,然后编译出一个XXX++.lib 的库。
3、再次新建一个控制台程序的项目,把编译好的lua静态库和tolua++的静态库放在项目里附加,然后把tolua++的/src/bin/里的tolua.c,luabind.h,luabind.c文件放在项目里,然后把tolua++的/include里的tolua++.h和lua1.5的目录里的/src的所有头文件放到项目里,然后编译生成xxxx++.exe
4、预备工作做好了,现在要了解一下tolua++的一些概念,要想c++与tolua交互,我们需要两个文件,一个是用来解析pkg文件的C++代码,和一个编译好的tolua++.lib或者.dll的静态或动态库,
tolua通过pkg文件解析捆绑c++代码,生成一个解析好的lua能识别的文件(就是通过编译好的xxx++.exe控制台程序生成的),我们通过一串命令来执行生成
tolua -n 链接的名字 -o /xxxx.h或者.cpp xxxxx.pkg
这样lua就可以调用C++的代码了,pkg文件也有一些规范,具体规范请参考http://blog.csdn.net/OBsona/archive/2008/12/08/3478518.aspx
所有lua的API函数中文解释参考
http://blogold.chinaunix.net/u/18584/showart_2098629.html
lua调用C++的方式
首先编辑好解析的pkg和生成链接lua的文件,然后在主运行入口里main()
加载lua文件
lua_State* L = lua_open();
luaL_openlibs(L);
tolua_xxxx(链接的名字)_open(L);
luaL_dofile(L, "xxxxx.lua");
lua_close(L);
C++调用lua的方式(最复杂的)
1、由于tolua没有完整的封装C++调用的lua的方式,对于习惯C++调用函数和变量的人来说有点别扭,不过可以尝试自己封装
C++调用lua的函数和全局变量,都要通过入栈出栈的方式调用。
可以这样理解,我们调用luaL_dofile(L,"xxx.lua")时,就把lua相应的函数和变量放在一个内存栈里了,当我们需要调用lua的函数或者变量时,就把相应名字索引的栈空间值重新压入到一个新的栈里进行操作。
lua_State* L = lua_open();
luaL_openlibs(L);
tolua_xxxx(链接的名字)_open(L);
luaL_dofile(L, "xxxxx.lua");
2、调用基本类型变量
lua_getglobal(L,"demo");(demo具体的函数名或者变量)
这个值在栈顶,现在加入我们要取得一个lua的全局变量demo,我们已经把变量压到栈里,现在就是取出它的时候
type demo = lua_tonumber(L,-1);在这里具体取出什么类型的值,请看上面的API,lua的栈取值的索引很有趣,可以正着取也可以反着取,通常是反着取,就是从栈顶向下数,-1就是栈顶.
3、调用函数(无参)
现在我们取一个函数试试,这个函数假设没参数
( xxx.lua里
function TestFuc()
print("lua脚本函数")
end
)
lua_getglobal(L,"TestFuc");
lua_pcall(L,0,0,0);调用lua函数需要调用这个接口,第二参数为函数的参数个数,第三参数为返回参数个数,第四参数为错误信息,当调用lua函数错误时会返回相应的错误信息
4、重点,调用函数(带参数)
( xxx.lua里
function TestFuc(xxx)
xxxxx........
end
)
lua_getglobal(L,"TestFuc");
由于不同的参数调用不同故分开写
传入数字类型时
lua_pushnumber(L,250);压入第一个参数当做函数的第一个参数也可以用tolua_pushnumber(L,250)
传入字符串类型时
lua_pushstring(L,"hello world");或者
std::string temp("hello world");
lua_pushstring(L,temp.c_str());
传入一个表结构时
lua_newtable(L);首先先创建一个空表到栈里 假设表为tab = {[1]="array1",[2]="array2",[3]={"aaa","bbb"}}
lua_pushnumber(L,1);传入KEY
lua_pushstring(L,"array1");传入值
lua_settable(L,-3);找到表的栈的位置,设置键和值进入,这里注意只能一对键值对的设置,不能一起设置
lua_pushnumber(L,2);传入KEY
lua_pushstring(L,"array2");传入值
lua_settable(L,-3);
嵌套表的插入
lua_newtable(L);
lua_pushnumber(L,1);传入KEY
lua_pushstring(L,"aaa");传入值
lua_settable(L,-3);
lua_pushnumber(L,2);传入KEY
lua_pushstring(L,"bbb");传入值
lua_settable(L,-3);
lua_settable(L,-3);
这里可能对栈里表的位置有疑惑,明明又压入两个元素为什么表的位置还是-3,设置一次表后,参数会被pop出栈,跟调用函数一样,调用完函数之后参数会被pop出栈
参数是C++对象的时
( xxx.lua里
function TestFuc(testClass)
local name=testClass.m_name
testClass:testFuc()
testClass.m_name="dfdfdf"
end
)
需要预先通过pkg生成解析文件,lua通过解析文件能知道C++的自定义类型
假设pkg里解析了一个类testClass 里面有一个成员变量m_name和成员函数testFuc()
只要有解析文件,我们只需要把解析好的类型指针传入即可
testClass* tempPtr= new testClass;
tolua_pushusertype(L,tempPtr,"testClass");
lua_close(L);

转载于:https://blog.51cto.com/zgame/1117712

C++与tolua++的完整调用流程,超级详解解决交互疑难相关推荐

  1. jsapi支付签名_PHP实现微信支付(jsapi支付)流程步骤详解

    最近接触到一个项目,涉及到微信支付,搞微信开发这么久以来,还没搞过支付,之前也就搞过公众号发红包,感谢前辈们的探索,我看了他们的博文,让我少走了很多弯路. 前期准备: 1.微信认证服务号,并且开通了微 ...

  2. html5 调用手机摄像头详解

    html5 调用手机摄像头详解   首先,我们看看HTML代码结构,当然,这部分的DOM内容应该是在用户允许使用其摄像头事件出发后,动态加载生成的.  注意: 我们采用的是 640X480的分辨率,如 ...

  3. java有返回值的方法回调_java调用回调机制详解

    调用和回调机制 在一个应用系统中, 无论使用何种语言开发, 必然存在模块之间的调用, 调用的方式分为几种: 1.同步调用 同步调用是最基本并且最简单的一种调用方式, 类A的方法a()调用类B的方法b( ...

  4. 在VM虚拟机中 CentOS7安装VMware Tools(超级详解)

    ** 在VM虚拟机中的CentOS7的linux系统中安装VMware Tools(超级详解) ** 一.明白为什么这么做? 为什么要安装vmtools? vmtools 安装后,可以让我们在wind ...

  5. python流程控制语句-python学习 流程控制语句详解

    ###################### 分支语句 python3.5 ################ #代码的缩进格式很重要 建议4个空格来控制 #根据逻辑值(True,Flase)判断程序的 ...

  6. Python 在子类中调用父类方法详解(单继承、多层继承、多重继承)

    Python 在子类中调用父类方法详解(单继承.多层继承.多重继承)   by:授客 QQ:1033553122   测试环境: win7 64位 Python版本:Python 3.3.5 代码实践 ...

  7. 怎么在手机上取消双重认证_用手机在淘宝上怎么开网店?流程步骤详解

       这是一篇关于"用手机在淘宝上怎么开网店?流程步骤详解"的文章: 开网店因为门槛低.收益大,成为众多年轻人创业的首选.很多新手朋友们都想开一家属于自己的网店,但是苦于没有经验, ...

  8. ebay注册流程_2017年eBay注册开店流程图文详解

    原标题:2017年eBay注册开店流程图文详解 今天跟大家分享最新的eBay注册开店流程,希望对卖家小伙伴们有所帮助.我们先简单了解一下eBay注册条件. 企业注册eBay需满足以下条件: 合法登记的 ...

  9. 数据仓库电商建模_真实电商数据仓库全流程开发详解,资源教程下载

    课程名称 Hadoop大数据视频教程-第一季:真实电商数据仓库全流程开发详解(共46讲),资源教程下载 课程目录 第一部分:数据仓库基础理论与技术圈 第一章:互联网电商大数据环境 第二章:商业智能与数 ...

最新文章

  1. 一点想法--- 做一个轻便的程序编辑器
  2. 黑马程序员 - 接口、内部类和异常
  3. ubuntu12.04LTS下eclipse indigo版配置opencv2.4.9
  4. 绘图操作(点,线,多边形,徒手多边形等)
  5. JS面向对象——Object对象的方法补充、原型继承关系图
  6. Firebug控制台详解[转]
  7. 狱警讲述死刑_BDFL是死刑吗?
  8. BZOJ——1626: [Usaco2007 Dec]Building Roads 修建道路
  9. 《转》SAP RM07扩展
  10. [FW]修复ubutnu12.04+win7的grub2引导
  11. 百叶窗式的幻灯片切换效果原理
  12. git tag — 标签相关操作
  13. Hibernate的org.hibernate.dialect.Oracle9Dialect错误
  14. 基于python的学生管理系统的设计开题报告_学生信息管理系统_毕业设计论文_开题报告...
  15. 有窗体的闭合导线计算程序(C#)
  16. 直方图均衡化及算法步骤
  17. 红米手机html文件,红米手机中ES文件浏览器无法删除SD卡中文件的解决办法-es文件浏览器...
  18. 极简主义、人工智能与Readhub的产品哲学
  19. Julia 机器学习 ---- 单变量线性回归 和 多元线性回归 (Linear regression)
  20. 固定资产管理系统怎么选,详细评测为你解答

热门文章

  1. 3D打印策略:检验CIO领导力的试金石
  2. 更改VMware虚拟机硬件版本
  3. 无法在PC上找到,android app 创建的文件 问题.
  4. ubuntu下环境变量详解 bashrc, profile, environment
  5. Leetcode 535.TinyURL的加密与解密
  6. 并查集--Java实现
  7. mysqldump方式导出mysql
  8. SQL*Plus 系统变量之32 - NEWP[AGE]
  9. 洛谷p1216 IOI1994 Day1T1
  10. textarea 自动检测高度换行