上一篇中,你已经可以在Lua里面用C++的函数了,那么咱们再增加一点难度,比如,我有一个CTest对象,要作为一个参数,传输给func_Add()执行,怎么办?
很简单,如果你对上面的代码仔细阅读,你会发现下面的代码一样简洁。为了支持刚才要说的需求,我们需要把Sample.lua再做一点修改。

  1. function func_Add(x, y, f)
  2. -- New了一个CTest对象,并进行赋值操作,最后把结果打印在屏幕上
  3.  
  4. -- local test = CTest:new()
  5. -- test:SetData("I'm xiaotian")
  6. -- test:GetData()
  7.  
  8. f:SetData("I'm xiaotian")
  9. f:GetData()
  10.  
  11. return x..y;
  12. end

假设就是我们要传入的CTest对象。我们要在Lua里面使用它。(我们的CLuaFn都不用改,把main函数稍微改一下即可,来看看怎么写。)

  1. #include "CLuaFn.h"
  2. int main(int argc, char* argv[])
  3. {
  4. CLuaFn CLuaFn;
  5. CLuaFn.Init();
  6. CLuaFn.InitClass();
  7. CLuaFn.LoadLuaFile("Sample.lua");
  8. CParamGroup ParamIn;
  9. CParamGroup ParamOut;
  10. char szData1[] = {'\0'};
  11.  
  12. sprintf(szData1, "[yang]");
  13. _ParamData* pParam1 = new _ParamData(szData1, "string", (int)strlen(szData1));
  14. ParamIn.Push(pParam1);
  15.  
  16. char szData2[] = {'\0'};
  17. sprintf(szData2, "[xiaotian]");
  18. _ParamData* pParam2 = new _ParamData(szData2, "string", (int)strlen(szData2));
  19. ParamIn.Push(pParam2);
  20.  
  21. //只追加了这里
  22. CTest* pTest = new CTest();
  23. _ParamData* pParam3 = new _ParamData(pTest, "CTest", sizeof(CTest));
  24. ParamIn.Push(pParam3);
  25. //追加结束
  26.   
  27. char szData4[] = {'\0'};
  28. _ParamData* pParam4 = new _ParamData(szData4, "string", );
  29. ParamOut.Push(pParam4);
  30.  
  31. CLuaFn.CallFileFn("func_Add", ParamIn, ParamOut);
  32. char* pData = (char* )ParamOut.GetParam()->GetParam();
  33. printf("[Main]Sum = %s.\n", pData);
  34. getchar();
  35. return ;
  36. }

运行看看输出结果:

既然已经到了这里,我们索性再加点难度,如果我要把CTest作为一个对象返回回来怎么做?很简单,且看。(运行中断,问题待解决)

  1. #include "CLuaFn.h"
  2. int main(int argc, char* argv[])
  3. {
  4. CLuaFn CLuaFn;
  5. CLuaFn.Init();
  6. CLuaFn.InitClass();
  7. CLuaFn.LoadLuaFile("Sample.lua");
  8. CParamGroup ParamIn;
  9. CParamGroup ParamOut;
  10. char szData1[] = {'\0'};
  11.  
  12. sprintf(szData1, "[yang]");
  13. _ParamData* pParam1 = new _ParamData(szData1, "string", (int)strlen(szData1));
  14. ParamIn.Push(pParam1);
  15.  
  16. char szData2[] = {'\0'};
  17. sprintf(szData2, "[xiaotian]");
  18. _ParamData* pParam2 = new _ParamData(szData2, "string", (int)strlen(szData2));
  19. ParamIn.Push(pParam2);
  20.  
  21. //只追加了这里
  22. CTest* pTest = new CTest();
  23. _ParamData* pParam3 = new _ParamData(pTest, "CTest", sizeof(CTest));
  24. ParamIn.Push(pParam3);
  25. //追加结束
  26.  
  27. //char szData4[40] = {'\0'};
  28. //_ParamData* pParam4 = new _ParamData(szData4, "string", 40);
  29. CTest* pTestRsult = NULL;
  30. _ParamData* pParam4 = new _ParamData(pTestRsult, "CTest", sizeof(CTest));
  31. ParamOut.Push(pParam4);
  32.  
  33. CLuaFn.CallFileFn("func_Add", ParamIn, ParamOut);
  34.  
  35. //char* pData = (char* )ParamOut.GetParam(0)->GetParam();
  36. //printf("[Main]Sum = %s.\n", pData);
  37.  
  38. //接受Lua返回参数为CTest类型,并调用其中的方法
  39. pTestRsult = (CTest* )ParamOut.GetParam()->GetParam();
  40. pTestRsult->GetData();
  41.  
  42. getchar();
  43. return ;
  44. }

(使用lua++)Lua脚本和C++交互(四)的更多相关文章

  1. lua解析脚本过程中的关键数据结构介绍

    在这一篇文章中我先来介绍一下lua解析一个脚本文件时要用到的一些关键的数据结构,为将来的一系列代码分析打下一个良好的基础.在整个过程中,比较重要的几个源码文件分别是:llex.h,lparse.h.l ...

  2. C# 运行中 Lua 语言脚本

    这里就不介绍Lua语言了,使用挺广的一种脚本语言.自行百度. 第一步 使用 Nuget 安装引用 VikingErik.LuaInterface. 第二步 添加 Using using LuaInte ...

  3. <转>lua解析脚本过程中的关键数据结构介绍

    在这一篇文章中我先来介绍一下lua解析一个脚本文件时要用到的一些关键的数据结构,为将来的一系列代码分析打下一个良好的基础.在整个过程中,比较重要的几个源码文件分别是:llex.h,lparse.h.l ...

  4. [译] Closures in Lua - Lua中的闭包

    原文:(PDF) . 摘要 一等(first-class)函数是一种非常强大的语言结构,并且是函数式语言的基础特性.少数过程式语言由于其基于栈的实现,也支持一等函数.本文讨论了Lua 5.x用于实现一 ...

  5. [转][译] Closures in Lua - Lua中的闭包

    http://www.cnblogs.com/plodsoft/p/5900270.html?utm_source=tuicool&utm_medium=referral 原文:(PDF) . ...

  6. [Sciter系列] MFC下的Sciter–3.Sciter脚本与底层交互

    [Sciter系列] MFC下的Sciter–3.Sciter脚本与底层交互,脚本调用底层自定义的方法函数. 本系列文章的目的就是一步步构建出一个功能可用,接口基本完善的基于MFC框架的SciterF ...

  7. Linux 下 expect 脚本语言中交互处理常用命令

    Linux 下 expect 脚本语言中交互处理常用命令 1. #!/usr/bin/expect 告诉操作系统脚本里的代码使用那一个 shell 来执行.这里的 expect 其实和 Linux 下 ...

  8. Lua脚本和C++交互(一)

    现在,越来越多的C++服务器和客户端融入了脚本的支持,尤其在网游领域,脚本语言已经渗透到了方方面面,比如你可以在你的客户端增加一个脚本,这个脚本将会帮你在界面上显示新的数据,亦或帮你完成某些任务,亦或 ...

  9. (使用lua++)Lua脚本和C++交互(三)

    前两篇文章中介绍了C++调用lua.lua栈操作的一些相关知识. 下面说一下Lua的工具.我们下一步要用到其中的一个帮助我们的开发,其实,Lua里面有很多简化开发的工具,你可以去www.sourcef ...

随机推荐

  1. 纯css3实现图片三角形排列

    当今是个读图时代.纯大部分网页或多或少都会用到图片.特别是图片较多的网页.图片的布局和排版就非常重要了.今天要给大写带来一款纯css3实现图片三角形排列.适合一系列的图片.效果图如下: 在线预览    ...

  2. SpringMVC之学习(0)

    Spring MVC 是一个模型 - 视图 - 控制器(MVC)的Web框架建立在中央前端控制器servlet(DispatcherServlet),它负责发送每个请求到合适的处理程序,使用视图来最终 ...

  3. JS地毯式学习一

    1.<noscript> 现代浏览器都对JavaScript进行了支持,一般是在用户的浏览器禁用了脚本的情况下才会显示<noscript>的内容. 包含在<noscrip ...

  4. git关联远程仓库命令<原>

    一.存在远程仓库了,本地想克隆其代码: $ git clone git@git.oschina.net:winkey4986/Weather_demo.git 二.本地有代码了,想在建个远程仓库保存代 ...

  5. linux并发concurrency控制

    解决竞态(race conditions)最根本的途径是对共享资源的互斥访问,访问共享资源的代码区被称为临界区(critical sections),对临界区的代码需要以某种互斥机制加以保护.常见的互 ...

  6. tar -h 参数

    1.1.1 tar命令参数-h,-h参数会把软链接指向的文件也打包. [root@ob2 mytmp]# ll total 8 -rw-r--r--. 1 root root 910 Aug 12 2 ...

  7. android EditText设置光标、边框和图标,以及限制输入

    控制边框形状,先在drawable中建一个xml文件:shape.xml <?xml version="1.0" encoding="utf-8"?> ...

  8. 统一建模语言 UML

    目录 统一建模语言 UML UML定义了5类10种模型图 一用例图用于建立需求模型 二静态图主要描述系统的静态表示和关系包括类图包图对象图 三行为图描述系统动态模型和对象组成的交换关系包括状态图和活动 ...

  9. e1087. 用For循环做数组的遍历

    The for statement can be used to conveninently iterate over the elements of an array. The general sy ...

  10. 转载:15个最受欢迎的Python开源框架

    出自:http://python.jobbole.com/72306/?replytocom=57112 15个最受欢迎的Python开源框架 Django: Python Web应用开发框架 Dja ...