• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell
您的位置:首页 > 脚本语言 >Lua > 使用Lua来扩展C++程序的方法

使用Lua来扩展C++程序的方法

作者:goldensun 字体:[增加 减小] 来源:互联网

goldensun 通过本文主要向大家介绍了lua调用c++,c++ lua,lua程序设计,lua加到arm程序,lua程序设计第二版等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

 介绍

如果用户能够通过一些脚本语言来修改应用本身的行为,那么许多应用可以变得更适合用户使用。一些商业应用就提供了此类便利。例如 Microsoft Office 的 VBA 脚本编程或在视频游戏 World of Warcraft 中使用 Lua 。脚本语言把应用作为一个平台提供一系列终端用户可以获得并操控的服务。

做为嵌入到程序中的语言,我们有很多可用的选择:开源和不开源的脚本引擎,或者可以从头开始创建一个。现在,最为熟知的脚本语言是JavaScript,Lua和Python,还有很多其它的语言等等。在Microsoft Windows平台上 嵌入脚本引擎的一般方法是使用一个 包含脚本引擎动态链接库(DLL)中,然后使用一系列的函数调用访问引擎中的服务。

在这篇文章里面我们将看到如何使用lua5.2脚本引擎嵌入到C++的代码中,我们的测试用例使用的开发工具是Visual Studio 2005.这开始讲解之前我们要从lua官方网站下载一些必要的组件,lua5.2中包含有已经编译好的dll以及头文件和链接用的导入库。需要说明的是当你使用lua嵌入到C++代码的时候,编译出来的可执行文件必须包含有lua的DLL即动态链接库,否则会提示运行出错,缺少必要的dll。这些例子都是用Visual Studio 2005编写,当然对于VS的后续版本是兼容的。


这篇文章向您描述了一个使用lua5.2作为脚本引擎的特定实现,在lua的官方文档(lua.org)以及一些网站中有许多关于这方面的信息,这里仅仅是为你提供一些测试例子,作为你开始lua旅程之前的引导

对于产品开发而言,开发一个完整专业应用程序跟开发单块应用程序有不同的策略和方法。譬如说:开发完整专业应用平台需要对终端用户提供大量丰富的插件工具和服务去实现他们自己特定的领域需求。插件程序的策略和方法被应用在许多的软件中,例如微软的Office,Visual Studio以及集成开发环境Eclipse,甚至是图片处理软件Adobe Photoshop. 网游魔兽世界就提供大量的add-on(插件)给用户,一些其他的游戏提供类似的工具,让玩家可以增加额外的内容从而创造一个与众不同的社区。


作为商业应用程序,GenPOS,有一些特性也是极具工具集的策略的:

  •     布局管理器工具然该用户可以通过调整窗口,按钮的位置,文字,内容等属性来调整界面的布局。
  •     字符控制功能可以让一些工作流自动化
  •     丰富的参数化设计可以更改软件的功能
  •     数据库的助记符可以使得显示不同的语言,使得多语言更容易
  •     通过远程接口可以动态地改变参数和助记符
  •     提供接口从终端获取财物和运行的状态数据


不管怎样,有些模块是被源代码实际控制的,这部分模块的更改需要通过开发部门的协作才能完成软件行为的改变。例如说,打印收据(一些显示内容是从参数或者助记符的输入中获取的)。简短列举这些限制可能包含:

  •     现有的字符控制功能缺少状态测试和跳转
  •     不能沟通动态地根据现有的状态修改和显示信息

与其试图加强和改进当前的非常简单的控制字符串功能,以提供包含额外脚本功能的销售终端,我们最终决定寻找到其它可能的方案,不需要大量开发到改进,且提供更多的产品改进能力。就像我们引入的布局管理器使客户能够设计自己的屏幕布置和工作流程一样,我们希望有一个相当灵活的机制让经销商的销售终端通过脚本为他们的客户提供增值服务。我们还打算提供足够的应用服务访问权限,让经销商和最终客户将能够修改自己的应用程序的行为。最后,我们要使用有一定程度到用户社区的语言,感兴趣到人们可以使用社区的资源。

我们已经用5.2版本的Lua脚本引擎在POS源代码上做了一些简单的实验来观察向程序中添加功能的难度。从实验结果来看,我们想通过程序服务来展现的各种功能已经是可用的了,并且可以通过对Lua脚本引擎做一些修改就可以使用起来。

使用 Lua 5.2 脚本引擎

Lua 脚本引擎本身是由 C 语言写成的,在 C 或 C++ 中使用 Lua 脚本也相当简单。你在网上也可以找到很多集成了 Lua 5.2 脚本引擎的的程序或程序片段,并且 Lua 5.2 的程序接口和先前 Lua 版本只有在初始化和启动等接口上存在少量变化,所以旧的 Lua 程序可以不做修改或只做很小的修改就可以移植到 Lua 5.2环境下。


基本的初始化步骤如下:

  •     使用 lua_newstate() 创建一个新的 Lua 状态机。
  •     若有必要,调用 luaL_openlibs() 函数加载 Lua 的标准库。

一旦初始化了 Lua 脚本引擎,你可以通过如下步骤执行一段 Lua 脚本:

  •     使用 luaL_loadfile 加载一段 Lua 程序或脚本到 Lua 执行引擎中;
  •     调用 lua_pcall 函数执行已加载的脚本。

如果想在应用程序中加载Lua脚本并执行其中的函数,你必须执行被加载的Lua程序块(chunk)。刚刚加载的程序块只是编译后存放于Lua的脚本引擎中,并没有被执行。只有在程序块被执行后,Lua中的全局变量和函数才会被创建,在这之前这些任何全局变量和函数对于应用程序来说都不可用。作为Lua引擎的环境由应用程序提供给Lua脚本引擎的任何全局变量和函数也不可用。应用程序必须首先创建变量和函数,并使用函数lua_setglobal()让它们可用。在文件 UtilityFunctions.cpp 中的函数int LuaSimpleWrapper::TriggerGlobalCall()定义了一个例子,它在Lua虚拟栈上动态创建一个Lua函数调用,并用Lua脚本引擎中的lua_pcall()函数,以给定的参数来执行此函数。

所有Lua脚本引擎函数或服务,都用到一个包含Lua脚本引擎状态信息的句柄或数据结构指针。这个句柄被指定为lua_State*或者指向lua_State变量的指针。每次成功的lua_newstate()的调用都会返回一个lua_State指针,失败时返回NULL。这个数据结构是用来指示特定会话的变量,它允许Lua脚本引擎同时有多个会话并行。当应用程序用到Lua脚本引擎中的函数,或应用程序提供给Lua脚本引擎的服务被调用时,lua_State结构提供的会话环境唯一指示了某个Lua会话状态。这意味着,应用程序提供给Lua脚本引擎的函数应该是完全可重入的,或者提供某种监视,比如信号量和临界区使得非共享服务能够提供线程安全的访问。

使用代码

在Visual Studio 2005工程目录中包含三个C++文件和一个测试基本功能的Lua例子。主体部分在Parser01.cpp中。在这里,加载了特定的Lua文件,然后又调用了一些别的函数。UtilityFunctions.cpp包含了LuaSimpleWrapper方法的源代码。InitEnviron则包含了我们希望提供给Lua环境的的函数。

我们正考虑使用的这个方法是, 在销售点应用程序启动一个包含Lua脚本的文件被指定。作为启动,销售点将启动一个初始化Lua脚本引擎并且加载和执行指定的Lua源文件的线程。Lua块将一直保留在内存中,并且在销售点应用程序中,随着事件的进行一些事件会被转移到Lua脚本进行处理。这个示例程序中的测试工具是一个对我们正在考虑的这种方法的探索。

在下面提供的lua源码的函数中,我们使用了几个在文件InitEnviron.cpp中提供的几个函数,处理非标准Lua字符串的‘宽字符串'。标准的Lua字符串是char字符串(C风格的单字节字符串)。这些附加函数为Lua处理这些宽字符串提供了方法,例如字符串的连接,比较。


下面展示一个含有三个参数并执行一系列操作的Lua函数。函数名xxfunc是一个全局名字,应用程序可以通过调用函数lua_getglobal()从Lua全局字典中检索出来并在Lua虚拟堆栈上把句柄传给lua_getglobal。然后函数的参数可以通过调用像一个lua_pushstring()的函数推送到Lua虚拟堆栈上,接着调用Lua脚本引擎函数lua_pcall()执行xxfunc函数。

function xxfunc (myMessage, wide1, wide2)
    trace("## xxfunc() called.")
    trace("  "..myMessage)
    trace ("  myFrame index "..myFrame.FrameIndex)
    trace ("  myFrame2 index "..myFrame2.FrameIndex)
    trace ("  myFrame3 index "..myFrame3.FrameIndex)
   
    -- compare two wide char strings that were passed in as arguments
    trace ("  compare wide "..wcscmp(wide1, wide2))
   
    -- generate a wide char string from a Lua string
    local widestring = wcscre("WIDE1")
    trace ("  compare with generated "..wcscmp (wide1, widestring))
   
    -- try out the wcscat and the wcscre functions to generate a string
    traceW (wcscat (wcscre("  concat two "), wcscat(wide1, wide2)))
   
    traceW (wcscat (wcscre("  con

您可能想查找下面的文章:

  • Lua中调用C++函数示例
  • C++中调用Lua配置文件和响应函数示例
  • 使用Lua来扩展C++程序的方法
  • Lua的table库函数insert、remove、concat、sort详细介绍
  • C++遍历Lua table的方法实例
  • 把Lua函数传递到C/C++中实例
  • Lua和C++语言的交互详解

相关文章

  • 浅析C\C++和Lua的通信方式
  • Lua中的源代码预编译浅析
  • Lua中的协同程序之resume-yield间的数据返回研究
  • Lua中使用table.concat连接大量字符串实例
  • Lua学习笔记之表达式
  • Lua中数字for循环实例
  • Lua变量类型简明总结
  • 举例简介Lua中函数的基本用法
  • Lua 学习笔记之C API 遍历 Table实现代码
  • Lua中table的几种构造方式详解

文章分类

  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell

最近更新的内容

    • Lua实现__add方法重载示例
    • Lua中的基本语法、控制语句总结
    • Lua中的__index和__newindex实例
    • Lua中的迭代器和泛型for学习总结
    • Lua中调用C++函数实例
    • Lua脚本实现递归删除一个文件夹
    • Lua中os库详细介绍
    • Lua检测数组(tabble)中是否包含某个值
    • Lua中的基本数据类型详细介绍
    • Lua脚本自动生成APK包

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有