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。)

使用指南

使用下列程式碼載入宣告函式庫

assert(loadmodule "declare")

宣告模組匯出下列函式

declare(函式庫, 函式名稱, 原型, 呼叫類型)

第一個參數是函式庫的名稱。第二個參數是您要繫結的字串名稱。第三個參數是編碼函式引數和傳回類型的字串。最後一個參數是選用的。呼叫類型預設為「cdecl」,但您也可以使用「stdcall」。

原型的格式為

"傳回類型=(引數)*"

編碼引數的方式如下

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 中使用「宣告」陳述式,並在 WDJ 中發表。

還要感謝 MartinSpernau 找到這項寶藏並向我展示。

下載

LuaDeclare 實際上只適用於 Lua 4.0。Lua 5.0 版本未來某天會推出。

[下載] 供 lua-4.0 使用的 LuaDeclare

以下是適用於 Lua 5.0 的潛在更新 [在此處]。此版本尚未完全測試,但通過基本「MessageBox?」測試。


最近異動 · 偏好設定
編輯 · 歷史
上次編輯 2007年1月14日 1:58 am GMT (差異)