Lua Declare |
|
LuaDeclare 是一个 Lua 模块(参见 LuaBinaryModules),它为任意 win32 动态库提供函数绑定机制。
版本说明: 此页面主要涉及早期版本的 Lua(4.0 和 5.0beta),使用 loadmodule
扩展。Lua 5.1 使用 package.loadlib
和 require
。Lua 5.0 使用 loadlib
。)
使用以下代码行加载 declare 库
assert(loadmodule "declare")
declare 模块导出以下函数
declare(library, funcname, prototype, calltype)
第一个参数是库的名称。第二个参数是要绑定的字符串的名称。第三个参数是一个字符串,它编码了函数的参数和返回值类型。最后一个参数是可选的。默认情况下,调用类型为 "cdecl",但您也可以使用 "stdcall"。
原型的格式为
"returntype=(argument)*"
参数的编码如下
A: a string in ANSI format. c: Signed char value (8 bits) C: Unsigned char value (8 bits) s: Signed short value (16 bits) S: Unsigned short value (16 bits) i: Signed integer value (32 bits) I: Unsigned integer value (32 bits) l: Signed long value (64 bits) L: Unsigned long value (64 bits) f: Single-precision float in the native format (32 bits) d: Double-precision float in the native format (64 bits) v: void (only allowed for return values)
以下是如何绑定 win32 MessageBox? 函数的示例
MessageBox = declare("user32.dll", "MessageBox", "i=IAAI", "stdcall")
完成此操作后,您可以按如下方式使用该函数
MessageBox( 0, "this is", "a test", 0 )
您还可以通过以下方式获取有关该函数的更多信息
print(MessageBox.lib) print(MessageBox.name) print(MessageBox.proto)
要删除该函数,请执行以下操作
MessageBox = nil
垃圾收集器将自动卸载库。
请参阅 test-declare.lua 以查看示例。
当前的绑定机制非常慢,真正的解决方案是动态地发出绑定代码以避免分支。同时,您可以通过为 cdecl 和 stdcall 编写几个单独的路径并优化参数检查来降低成本。
lua_declare 仅支持使用简单数据类型的函数调用。可以支持结构和附加数据类型,但您需要扩展原型声明并相应地解析它。
LuaDeclare 的作者是 IgnacioCastano
此代码基于 Ton Plooy 和 Jeff Stong 的 dynawrap 代码,该代码允许在 VBScript 中使用 'declare' 语句,并在 WDJ 中发布。
还要感谢 MartinSpernau 发现了这颗宝石并向我展示了它。
LuaDeclare 实际上仅适用于 Lua 4.0。Lua 5.0 版本将在某一天发布。
[下载] LuaDeclare for lua-4.0
Lua 5.0 使用的潜在更新 [这里]。它没有经过全面测试,但通过了基本的 'MessageBox?' 测试。