2010-03-07 53 views
1

我正在用lua扩展一个接口,并且遇到了问题,因为我需要将指向对象的指针传递给lua代码才能工作。这些类将通过SWIG包装,我可以通过使用swig的lua实例化它们,但这会让我留下无用的对象。将非全局C++对象传递给Lua函数(Swig)

我需要能够将回调对象传递给lua以及表示事件的对象。我无法手动将回调定义为全局的,因为这会引入一个不可接受的约束。

因此,对于一个通用的例子,给定一个类C和lua中的函数需要1个参数,我怎样在传递C类型的C++指针时调用lua函数?

回答

3

啊哈,回答我的问题,但我创立了!

http://lua-users.org/lists/lua-l/2007-05/msg00053.html

你好乔伊,

我几乎所有的夜风,LUA从 的LUA边工作。 Swig对于 非常有用,只是将一个C/C++库包装到 ,让它可以被lua读取。让C++与lua交谈是相当容易的,但 没有很好的记录。

你的想法lua_pushlightuserdata(), 已接近,但没有。你可能 想是这样的:对于 Foo对象&它推到堆栈

Foo* p= new Foo(); 
SWIG_NewPointerObj(L,p,SWIGTYPE_p_Foo,1); 
lua_setglobal (L, "p"); 

的SWIG_NewPointerObj()创建一个 用户数据(而不是lightuserdata)。 最后一个参数(在本例中为1)是 ,无论您是想让lua管理内存(0代表否,1代表是)。

SWIG_NewPointerObj()SWIGTYPE_p_Foo都在 包装文件中找到。

一旦你有,你应该能够 在Lua做:

print(p) 
print(swig_type(p)) 
p:some_function() 

让我知道如果您有任何其他 问题。问候,马克

0

我还没有使用Swig与C++和Lua,但是你可以在两种不同的方式(userdata和closures)下不用Swig来完成。我不知道Swig是否干涉了这件事。

Using Userdata

lua_pushcclosure