Lua脚本层面调用外部DLL
2010-12-24 10:25
363 查看
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://cjbskysea.blogbus.com/logs/68482862.html
任何语言都有办法和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 》,转载网络上的一个例子(被我修改过)
http://cjbskysea.blogbus.com/logs/46142537.html
http://cjbskysea.blogbus.com/logs/68482862.html
任何语言都有办法和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 》,转载网络上的一个例子(被我修改过)
http://cjbskysea.blogbus.com/logs/46142537.html
相关文章推荐
- Unity3d 调用 Luajit C++ DLL 实现调用 Lua脚本
- Lua脚本调用外部脚本
- Redis进阶实践之八Lua的Cjson在Linux下安装、使用和用C#调用Lua脚本(转载8)
- 在lua中调用DLL
- lua学习笔记 2 android调用Lua。Lua脚本中实现添加Button,并为Button增加Listener
- lua学习笔记 3 android调用Lua。Lua脚本使用LoadLib回调Java,并传多个参数
- Python:使用ctypes库调用外部DLL(附带ctypes c 类型转换图)
- 以前编写的inno setup脚本,涵盖了自定义安装界面,调用dll等等应用
- C#调用外部DLL介绍及使用详解
- Lua移植到arm上 并实现在arm上 可以让lua脚本调c语言,C语言调用lua脚本
- Python:使用ctypes库调用外部DLL
- c++中调用python脚本提示 error LNK2001: 无法解析的外部符号 __imp_Py_Initialize等错误的解决方法
- linux sh 脚本调用外部命令
- QT编写DLL给外部程序调用,提供VC/C#/C调用示例(含事件)good
- Lua 脚本语言 与 C的互相调用
- 让FLASH接收网页传过来的参数和动态调用外部脚本程序返回结果
- [Lua脚本实践3]LuaPlus中类成员的调用
- Lua通过COM调用外部程序excel及调用windows api
- uLua学习之读取外部Lua脚本(四)
- hiredis中lua脚本调用