Lua Declare |
|
LuaDeclare 是 Lua 模組(參閱 LuaBinaryModules),它提供任意 win32 動態函式庫的函式繫結機制。
版本公告:此頁面大部分與 Lua 較早版本 (4.0 和 5.0beta) 有關,且使用 loadmodule
延伸模組。Lua 5.1 使用 package.loadlib
和 require
。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?」測試。