lua运行外部程序_Lua脚本层面调用外部DLL - [LUA]

本文介绍了如何在Lua脚本中调用外部DLL,通过`package.loadlib`和`require`两种方式实现。示例中展示了调用`w32.dll`执行批处理的代码,并强调了使用`require`时DLL抛出函数的命名规则。
摘要由CSDN通过智能技术生成

任何语言都有办法和lua交互,原因是它们都可以和C交互,而LUA是用C写的,所以....。比如:java可以通过jni和C/C++交互,C#可以通过平台调用和native交互。所以java和C#都可以和lua交互。首先可以把其他语言或C/C++的第三库提供的接口,用LUA所能接受的C接口原型Lua_CFunction,进行封装后注册,那么在LUA脚本中就可以直接使用。Lua_CFunction就是 int  (*Lua_CFunction)(LuaState* L)例子:最近下载了一个w32.dll,包含源代码,它是一个封装了部分win32 api提供给lua使用。刚开始时候,我是把源代码直接集成进LUA 源代码重新编译,让生成的LUA 支持win32 api,后面发现公司的LUA游戏脚本程序员,他们无法接触到服务端的脚本引擎,就无法在公司LUA 源代码里面加入这些代码,后面就想直接在LUA脚本层面去调用DLL来实现。如:调用win32  ShellExecute执行一个批处理

(一)package.loadlib方式:

local f = package.loadlib("d:\\w32.dll", "luaopen_w32") --获取DLL中抛出函数地址assert(f, "Failed on loading w32.dll")f() --调用DLL中抛出函数w32.ShellOpen("地下城服务端下载.bat")

(二)require方式:

package.path = ""package.cpath = (os.getenv ("LUA_CLIBRARY_PATH") or ".") .. "/?.dll"

require("w32") --自动调用w32.dll的luaopen_w32抛出函数,w32.dll要在LUA_CPATH搜索路径

w32.ShellOpen("地下城服务端下载.bat")

PS:

LUA 调用外部DLL,DLL 中包含库函数和抛出函数,当不是使用package.loadlib来使用外部DLL时, 而是使用另一种方式require,那么就需要注意一些规则:

DLL中的抛出函数原型必须是: [extern "C" ] __declspec(dllexport) int luaopen_XXX(LuaState* L),而且XXX是DLL的文件名。[]是可选符号,而package.loadlib使用方式是不需要这些规则的,但是为了兼容性好,即:DLL可以同时使用以上两种方式使用,还是按规则命名抛出函数。

PS:也可以参考下本blog中另一篇《Lua调用DLL》,转载网络上的一个例子(被我修改过)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值