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

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

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

#include "CLuaFn.h"
int main(int argc, char* argv[])
{
CLuaFn CLuaFn;
CLuaFn.Init();
CLuaFn.InitClass();
CLuaFn.LoadLuaFile("Sample.lua");
CParamGroup ParamIn;
CParamGroup ParamOut;
char szData1[] = {'\0'}; sprintf(szData1, "[yang]");
_ParamData* pParam1 = new _ParamData(szData1, "string", (int)strlen(szData1));
ParamIn.Push(pParam1); char szData2[] = {'\0'};
sprintf(szData2, "[xiaotian]");
_ParamData* pParam2 = new _ParamData(szData2, "string", (int)strlen(szData2));
ParamIn.Push(pParam2); //只追加了这里
CTest* pTest = new CTest();
_ParamData* pParam3 = new _ParamData(pTest, "CTest", sizeof(CTest));
ParamIn.Push(pParam3);
//追加结束
  
char szData4[] = {'\0'};
_ParamData* pParam4 = new _ParamData(szData4, "string", );
ParamOut.Push(pParam4); CLuaFn.CallFileFn("func_Add", ParamIn, ParamOut);
char* pData = (char* )ParamOut.GetParam()->GetParam();
printf("[Main]Sum = %s.\n", pData);
getchar();
return ;
}

运行看看输出结果:

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

#include "CLuaFn.h"
int main(int argc, char* argv[])
{
CLuaFn CLuaFn;
CLuaFn.Init();
CLuaFn.InitClass();
CLuaFn.LoadLuaFile("Sample.lua");
CParamGroup ParamIn;
CParamGroup ParamOut;
char szData1[] = {'\0'}; sprintf(szData1, "[yang]");
_ParamData* pParam1 = new _ParamData(szData1, "string", (int)strlen(szData1));
ParamIn.Push(pParam1); char szData2[] = {'\0'};
sprintf(szData2, "[xiaotian]");
_ParamData* pParam2 = new _ParamData(szData2, "string", (int)strlen(szData2));
ParamIn.Push(pParam2); //只追加了这里
CTest* pTest = new CTest();
_ParamData* pParam3 = new _ParamData(pTest, "CTest", sizeof(CTest));
ParamIn.Push(pParam3);
//追加结束 //char szData4[40] = {'\0'};
//_ParamData* pParam4 = new _ParamData(szData4, "string", 40);
CTest* pTestRsult = NULL;
_ParamData* pParam4 = new _ParamData(pTestRsult, "CTest", sizeof(CTest));
ParamOut.Push(pParam4); CLuaFn.CallFileFn("func_Add", ParamIn, ParamOut); //char* pData = (char* )ParamOut.GetParam(0)->GetParam();
//printf("[Main]Sum = %s.\n", pData); //接受Lua返回参数为CTest类型,并调用其中的方法
pTestRsult = (CTest* )ParamOut.GetParam()->GetParam();
pTestRsult->GetData(); getchar();
return ;
}

(使用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. matlab与VC6.0混合编程设置

    版本matlab 2009 和vc++6.0 SP6 步骤 1)  配置环境,新建一个VC工程,然后在VC界面的“工具->选项”的目录选项卡中的“include”中加入如下路径: 2)  D:\ ...

  2. SpringMVC 常用工具类与接口

    ClassPathResource 在类路径下读取资源 public final String getPath()public boolean exists()public InputStream g ...

  3. JavaScript 深入理解作用域链

    第一步. 定义后:每个已定义函数,都有一个内在属性[scope],其对应一个对象的列表,列表中的对象仅能内部访问. 例如:建立一个全局函数A,那么A的[Scope]内部属性中只包含一个全局对象(Glo ...

  4. BUS Matrix

    ARM的BUS Matrix就是多主(Core,DMA等).多从(内部RAM,APB,外部总线等)的交联和仲裁.目的是为了提高不同主机访问不同外设情况下的带宽,另外一个就是简化Bus Master的协 ...

  5. 【mybase】绿色版---mybase非常好用的笔记软件

    mybase绿色软件,体积小,解压可以直接使用,PC端非常好用的笔记软件. 包含两个版本: mybase6.5.0 mybase7.0.0 软件下载地址: 链接: http://pan.baidu.c ...

  6. CodeIgniter(3.1.4)框架中添加执行时间统计代码

    CodeIgniter(3.1.4)框架中添加,执行时间统计代码: system/core/CodeIgniter.php最后行处. /* * ---------------------------- ...

  7. mysql数据库对时间进行默认的设置

    //----------------------------------------------------------sql语句----------------------------------- ...

  8. DataTables 固定列时实现 hover

    之前说过 DataTables 表格固定栏使用方法 .分析下它的代码,如下图 它实现固定左侧的原理就是把需要固定的数据复制一份,覆盖在全部数据的上面,用绝对定位固定在左边. 这样子有个问题就是,表格的 ...

  9. 科普Spark,Spark核心是什么,如何使用Spark(1)

    科普Spark,Spark是什么,如何使用Spark(1)转自:http://www.aboutyun.com/thread-6849-1-1.html 阅读本文章可以带着下面问题:1.Spark基于 ...

  10. imx6 gpio分析

    本文主要介绍如何配置IOMUX寄存器,设置IO复用寄存器,配置为GPIO功能.参考: http://www.jianshu.com/p/3c2053508342 http://www.embest-t ...