欢迎来到山村网

Lua5.1中加载dll动态链接库的方法

2019-03-02 12:20:46浏览:516 来源:山村网   
核心摘要:  这篇文章主要介绍了Lua5.1中加载dll动态链接库的方法,本文讲解了加载专门为lua写的扩展dll的方法和加载不是专为lua写的扩展d

  这篇文章主要介绍了Lua5.1中加载dll动态链接库的方法,本文讲解了加载专门为lua写的扩展dll的方法和加载不是专为lua写的扩展dll的方法,需要的朋友可以参考下

  一、加载专门为lua写的扩展dll

  使用require或package.loadlib方法,在此不做过多解释。

  二、加载不是专为lua写的扩展dll

  “不是专为lua写的扩展dll”是指:dll中并没有以lua注册函数的方式导出接口,而是以__declspec(dllexport)形式导出的接口。这样就不能使用“package.loadlib”方法调用,而要使用lua5.1封装过的“alien.load()”方法。(Lua5.1luaalien.lua)

  基本用法:

  1、加载alien:

   代码如下:

  require(“alien”)

  2、加载动态链接库:(此处以”msvcrt.dll”为例)

   代码如下:

  libc = alien.load(“msvcrt.dll”)

  3、说明参数类型:(第一个参数表示返回类型,后面的参数表示传入参数类型)

  代码如下:

  libc.puts:types(“void”, “string”)

  Alien转换 Lua numbers 为C的 numeric 类型, 转换 nil 为 NULL,strings 为 const char* , userdata 为 void* 指针。而函数返回值的转换工作正好相反 (pointer类型转换为userdata)。

  以上三步完成了dll的加载,之后便可调用dll中的函数来实现操作,例如:

   代码如下:

  libc.puts(“test”)

  当传入引用类型参数时,需要alien在堆栈中分配空间,lua的变量将值传递给函数参数,如:

  代码如下:

  scanf = libc.scanf

  scanf:types(“int”, “string”, “ref int”, “ref double”)

  _, x, y = scanf(“%i %lf”, 1, 1) — 后面两个参数没有实际意义,只是为了说明参数个数

  调用时输入23和24.5,输入的这2个参数才是真正需要传递给函数的参数,ref int, ref double是告诉alien需要分配空间,调用C函数从栈中获取它的参数,调用结束后将返回结果放到栈中(为了区分返回结果和栈中的其他的值,每个C函数还会返回结果的个数),然后lua函数返回结果值。

(责任编辑:豆豆)
下一篇:

Linux下编写Lua扩展so文件和调用方法实例

上一篇:

Lua中计算、执行字符串中Lua代码的方法

  • 信息二维码

    手机看新闻

  • 分享到
打赏
免责声明
• 
本文仅代表作者个人观点,本站未对其内容进行核实,请读者仅做参考,如若文中涉及有违公德、触犯法律的内容,一经发现,立即删除,作者需自行承担相应责任。涉及到版权或其他问题,请及时联系我们 xfptx@outlook.com