原网址:

http://my.oschina.net/hac2009/blog/14099?catalog=67125

使用Lua编程,扩展外部接口时,不一定要编写lua专用的dll,使用系统的,或传统的动态链接库也可以,这样更具有通用性。

基本用法:

require("alien") --1.加载alien
libc = alien.load("msvcrt.dll") -- 2.加载动态链接库
libc.puts:types("void", "string") -- 3.说明参数类型
libc.puts:types{abi='cdecl',ret="void";"string"} --3.或者 说明函数调研类型,显式申明返回值
libc.puts("kasdfajdskfas;dlfjkads") -- 调用

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

对于引用类型参数, Alien 在堆栈中分配空间, Lua的变量传值给函数参数(正确转换), 调用函数时使用分配的空间地址调研。返回时通过lua的函数返回方式返回结果值,如:scanf
scanf = libc.scanf
scanf:types("int", "string", "ref int", "ref double")
_, x, y = scanf("%i %lf", 0, 0) -- 后面两个参数其实没有使用传入的值
==》23 42.5

分配缓冲区(buffer):

当调用的函数时,参数需要预先分配空间时,使用alien.buffer来分配空间

如果没有指定参数,分配平台默认的参数;如果指定参数,根据参数数值分配空间。
如:
require("alien") --1.加载alien
libc = alien.load("msvcrt.dll") -- 2.加载动态链接库
libc.gets:types("pointer", "string") -- 3.说明参数类型
libc.gets:types{abi='cdecl',ret="pointer";"string"} --3.或者 说明函数调研类型,显式申明返回值
buf = alien.buffer(100)
libc.gets(buf) -- 调用
=buf:tostring() -- 转换为字符串,
或者为:tostring(buf)
可以象C字符串一样,通过buf的数组下标操作字符串单元,但是这里使用的是Lua的数组风格(下标从1开始,不是从0开始)
=string.char(buf[1])
也可以通过
buf:get(offset,type),或buf:set(offset,value,type)来读取或更改数据,如buf中有4个int数据,可以这样读取或存储:
i=buf:get(1,"int"),j=buf:get(5,"int"),k=buf:get(9,"int"),l=buf:get(13,"int")
注意:get或set没有边界检查,请注意超出界限问题

使用数组
libc = alien.load("msvcrt.dll") -- 2.加载动态链接库

function sort(a, b)
return a - b
end
compare = alien.callback(sort, "int", "ref int", "ref int")

qsort = libc.qsort
qsort:types("void", "pointer", "int", "int", "callback")

nums = alien.array("int", { 4, 5, 3, 2, 6, 1 })
qsort(nums.buffer, nums.length, nums.size, compare)
for i, v in nums:ipairs() do print(v) end
--可以直接使用数组下标操作
=nums[1]
=nums[2]
=nums[3]
=nums[4]
=nums[5]
=nums[6]

指针解包

alien.tostring -- 把char* 转换成LUA的string
alien.toint -- 把int* 转换成Lua的numeric
alien.toshort, alien.tolong, alien.tofloat, and alien.todouble与toint类似
例如:
> fs = alien.tofloat(ptr, 4)
> =#fs
4
>
标签

把userdata与metatable关联起来,以便使用lua的垃圾回收器

alien.tag(*tagname*) -- 如果没有,创建metatable的标签,如果有则返回
alien.wrap(*tagname*, ...) -- 创建完整的userdata,并与metatable关联起来,命名标签,并且根据后面的参数赋值。
alien.unwrap(*tagname*, obj) -- 检测标签的对象,如果没有就抛出错误,否则返回对象

alien.rewrap(*tagname*, obj, ...) -- 更新对象值

例如:
local tag_foo = alien.tag("libfoo_foo")
alien.foo.create_foo:types("pointer")
alien.foo.destroy_foo_types("void", "pointer")

function new_foo()
local foo = alien.foo.create_foo()
return alien.wrap("libfoo_foo", foo)
end

tag_foo = {
__gc = function (obj)
local foo = alien.unwrap("libfoo_foo", obj)
alien.foo.destroy_foo(foo)
end
}

回调函数

在动态链接库中回调LUA函数
local function cmp(a, b)
return a - b
end
local cmp_cb = alien.callback(sort, "int", "ref char", "ref char")

其他

alien.platform -- 检测操作系统
alien.sizeof(*typename*) -- 类型长度
alien.align(*typename*)
alien.table(narray, nhash) -- 创建环队列
local qsort = alien.default.qsort
qsort:types("void", "pointer", "int", "int", "callback")

local chars = alien.buffer("spam, spam, and spam")
qsort(chars, chars:len(), alien.sizeof("char"), cmp_cb)
assert(chars:tostring() == " ,,aaaadmmmnpppsss")

Lua直接调用动态链接库(DLL或so文件)相关推荐

  1. Unity调用动态链接库dll和so

    [001]Unity调用动态链接库dll和so  ApolloAR https://www.jianshu.com/p/f37bb72979a1 一.PC平台 (注:环境 VS2017+Unity20 ...

  2. 如何用C/C++生成一个为lua所用的动态库dll文件以及lua如何调用该dll(C语言的动态库)

    如果读者朋友想详细的了解lua与C的通信原理,请移步这里[https://www.zhangshengrong.com/p/ERNnAzWa5W/]: 先说两句废话:怪不得lua不火,因为它对我们新手 ...

  3. Matlab调用动态链接库DLL文件

    环境:vs2015.Matlab2020 VS2015中建立工程, 建立工程如下两图所示 在头文件和源文件中分别添加头文件和源文件(代码如下所示) 头文件matdll.h文件 #pragma once ...

  4. VC++6.0如何创建与调用动态链接库(dll)

    VC++支持的DLL: DLL的编制与具体的编程语言及编译器无关,动态链接库随处可见,VC++支持三种DLL:非MFC动态库.MFC规则DLL和MFC扩展DLL.DLL导出函数(或变量.类)可供应用程 ...

  5. 使用Matlab调用动态链接库dll

    1.下载.安装和配置环境变量MinGW-w64 C/C++ 1.1 下载网址 http://tdm-gcc.tdragon.net/download 1.2 默认地址安装 1.3 配置环境变量 新建系 ...

  6. Qt生成调用动态链接库dll

    把编译好的包含函数和变量的目标代码存储到文件中,在链接的时候让链接程序自动从文件中查找需要的代码.这个文件就是链接库,又可以分为静态链接库和动态链接库. 1. 静态链接库 链接程序从库中寻找需要的符号 ...

  7. Windows 下 JNI 调用动态链接库 dll

    1. Java调用本地代码常见的两种方案 JNI JNI(Java Native Interface),有过不同语言间通信开发经历的一般都知道,它允许java和其他语言代码(尤其是C/C++)进行交互 ...

  8. 制作和unity调用动态链接库dll文件

    首先用vc建立一个dll工程 然后在里面建立一个testunity.h文件.内容如下 1 extern "C" int _declspec(dllexport)testunity( ...

  9. Python调用动态链接库DLL文件

    目录 方法一.ctypes库方式 方法二.shell方式 方法一.ctypes库方式 使用ctypes库调用.这个方法网上一搜都是. import ctypes obj = ctypes.WinDLL ...

最新文章

  1. crontab实例分析(转)
  2. 简易promise的实现(二)
  3. 若川知乎问答:2年前端经验,做的项目没什么技术含量,怎么办?
  4. js文件 import java类_实现JS脚本导入JAVA类包
  5. fastdfs的tracker启动之后一直选举_jraft选举策略
  6. RNN,LSTM,GRU的理解
  7. 服务器红帽操作系统安装,pxe无人值守安装 红帽操作系统
  8. python机器学习库sklearn——K最近邻、K最近邻分类、K最近邻回归
  9. L1-019 谁先倒 (15 分) — 团体程序设计天梯赛
  10. 六子棋AI程序---核心讲解
  11. 实现背景轮播登录页面
  12. 20165309 实验四 Android程序设计
  13. 简单的基于规则的汉语拼音分词
  14. 基于MATLAB的烟雾火灾检测识别系统
  15. mysql写出总分最高的学生姓名_编写SQL语句查询出每个各科班分数最高的同学的名字,班级名称,课程名称,分数...
  16. Unity项目-黑魂复刻(四)玩家控制器(翻滚以及跳跃操作改动)
  17. Codeforces Round #369 (Div. 2) B. Chris and Magic Square【数学,模拟】
  18. java中Keytool生成证书
  19. 在线预览word文档
  20. js实现图片预览功能

热门文章

  1. Android中的AsyncTask异步加载图片
  2. (Mybatis)XML配置解析
  3. (仿头条APP项目)6.点击过的新闻列表文字变灰和下拉刷新与滚动加载新闻数据
  4. 计算机网络(一)计算机网络概述、组成、功能分类、性能指标 | 思维导图
  5. 深究AngularJS——ng-checked(回写:带真实案例代码)
  6. android点击隐藏控件,Android编程实现点击EditText之外的控件隐藏软键盘功能
  7. c# java 语法_Java与C#的语法区别
  8. linux smplayer 快捷键,SMPlayer:让 MPlayer 的使用更简单
  9. linux 中卸载提示设备正忙怎么办?
  10. 【实验】不会部署VRRP?看完就会了