首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

Lua 5.1 使用 alien 載入非標準 DLL (msvcrt.dll 範例)

     編輯:更多程式設計知識

Lua 5.1 標準 package.loadlib 僅能載入符合 Lua C API 規範的擴充庫。若需呼叫通用 DLL (如 msvcrt.dll),需使用 alien 套件,它提供 FFI (Foreign Function Interface) 功能,自動處理呼叫慣例、型別轉換與記憶體管理。

基本步驟


require("alien")

-- 1. 載入 DLL
local libc = alien.load("msvcrt.dll")

-- 2. 宣告函數簽名:回傳型別, 參數型別...
libc.puts:types("void", "string")

-- 3. 呼叫
libc.puts("test")  -- 輸出到 stdout

型別對應表

Lua 型別C 型別alien 字串
numberint, long, float, double"int", "long", "float", "double"
stringconst char*"string"
userdatavoid*"pointer"
nilNULL-

參考參數 (Output Parameters)

使用 ref type 指示 alien 在堆疊分配空間:


local scanf = libc.scanf
scanf:types("int", "string", "ref int", "ref double")

local _, x, y = scanf("%i %lf", 1, 1)  -- 後兩參數為佔位
-- 輸入: 23 24.5
-- x=23, y=24.5

記憶體管理

  • 字串自動轉為 const char*,生命週期至呼叫結束。
  • 需長期持有指標時,使用 alien.buffer 或 alien.array 分配緩衝區。
  • 結構體支援有限,複雜結構建議改用 LuaJIT FFI 或編寫 C 擴充庫。

替代方案

  • LuaJIT FFI:效能極佳,語法更自然,需使用 LuaJIT 執行環境。
  • 自寫 C 擴充:完整控制,適合高效能、複雜資料結構場景。

alien 是 Lua 5.1 純 Lua 環境呼叫系統 DLL 的輕量選擇。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved