the*_*man 2 c++ dll lua ffi luajit
所以首先我加载一个我需要的DLL
local ffi = require("ffi")
local theDLL = ffi.load("thisDLL")
Run Code Online (Sandbox Code Playgroud)
在ffi cdef我有两种不同的结构
ffi.cdef [[
typedef struct StructSession StructSession;
typedef struct {
/*
* begin_proj callback
*/
bool (__cdecl *begin_proj)(char *proj);
/*
* save_proj_state
*/
bool (__cdecl *save_proj_state)(unsigned char **buffer, int *len);
} StructCallbacks;
Run Code Online (Sandbox Code Playgroud)
我在cdef中也有这个功能
__declspec(dllexport) int __cdecl start_session(StructSession **session,
StructCallbacks *cb);
Run Code Online (Sandbox Code Playgroud)
现在我想调用这个函数
print(theDLL.start_session(a,b))
Run Code Online (Sandbox Code Playgroud)
变量a和b显然是占位符,问题是如何传递函数所需的结构?并说我们得到StructSession工作,正在回复一个函数WITHIN LuaJIT甚至可以用于StructCallbacks?
创造StructCallbacks很容易; 您可以使用它创建它ffi.new并为字段创建FFI回调(有关回调的信息,请参阅FFI语义).
创建它StructSession是比较棘手的,因为它是一个不透明的类型,但它与你在C中的方式没有太大的不同.
以下是如何在C中创建一个:
StructSession* S = NULL;
start_session(*S, foo);
Run Code Online (Sandbox Code Playgroud)
注意你没有直接分配a StructSession.相反,您指定一个指针,并start_session分配实际的结构.
所以我们现在将其转换为LuaJIT代码:
local S = ffi.new("StructSession*")
lib.start_session(getPointer(S), foo) -- getPointer should take the pointer of S, but...
Run Code Online (Sandbox Code Playgroud)
... FFI没有提供任何方法来获取对象的指针(这是故意的;它允许优化).
那么我们如何得到一个指针StructSession?好吧,回想一下,数组可以转换为指针,我们可以通过FFI访问它们.所以我们改为创建一个单槽指针数组并将其传递给start_session:
local S_slot = ffi.new("StructSession*[1]")
lib.start_session(S_slot, foo)
local S = S_slot[0]
Run Code Online (Sandbox Code Playgroud)
现在你有了一个StructSession对象.