Lua Declare

lua-users home
wiki

简介

LuaDeclare 是一个 Lua 模块(参见 LuaBinaryModules),它为任意 win32 动态库提供函数绑定机制。

版本说明: 此页面主要涉及早期版本的 Lua(4.0 和 5.0beta),使用 loadmodule 扩展。Lua 5.1 使用 package.loadlibrequire。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?' 测试。


最近更改 · 偏好设置
编辑 · 历史记录
最后编辑于 2007 年 1 月 14 日凌晨 1:58 GMT (差异)