导出C++中的类到Lua脚本中的经历收藏
2008-09-13 03:47
483 查看
导出C++中的类到Lua脚本中的经历收藏
这两天一直在研究Lua和LuaPlus。由于项目需要将C++中的类导出到Lua脚本中,让Lua脚本也可以使用C++中的东西。倘若用Lua的C
API直接导出到Lua脚本中,感觉不是很方便,所以选择了最新的LuaPlus5.1版,又在网上找了沐枫写的一个LuaPlusHelper.h文
件,便开始试着导出C++中的类到Lua脚本中去。我测试用的被导出的类是一个我自己写的,内容相当简单:
class CExportClass
{
public:
int GetData() const
{
return m_Data;
}
void SetData(int Data)
{
m_Data = Data;
}
protected:
private:
int m_Data;
};
就为了导出这么一个测试类,我写了如下一个函数:
void ExportToLua()
{
using namespace LuaPlus;
LuaClass<CExportClass>(GLuaState)
.create("CExportClass")
.def("Get",&CExportClass::GetData)
.def("Set",&CExportClass::SetData);
}
谁知一编译就报很多如下所示的错误:
LuaPlusCD.h(971): error C2780: “int
LPCD::Call(RT (__cdecl *)(void),lua_State *,int)” : 应输入 3 个参数,却提供了 4
个LuaPlusCD.h(702) : 参见“LPCD::Call”的声明
为此我查了很久都没能找到问题的根源,只得将沐枫的原例Logger类拿来试一试,与我自己写的类比一比。这一试,我发现在原例中,所有的函数均没有使用
const,想必肯定是这个原因,我曾经在自己的项目中也遇到过这样的问题。将const一去掉,OK,编译时以上的错误就永远地消失了!但是问题到此还
没有结束,还有一个错误发生在LuaPlusHelper.h头文件的LuaConstructor::ConstructorHelper中,由于我下
载的那个LuaPlusHelper.h头文件是用于LuaPlus5.0版本的,而我现在用的是LuaPlus5.1,PushStack函数已经不是
LuaObject的成员了,原来的PushStack函数在LuaPlus5.1版本中已经被更名为Push了,于是乎将之改掉.现在编译连接就没有问
题了!
编译连接都通过后,我便利用导出的Logger类的来测试一下,还是按照原例中的代码来测试,一运行,没有想到出现问题了:我新建的一个Logger对
象,在使用其成员函数时的this指针却不是生成时的this指针,也就是说脚本中找到的我需要的对象的地址有问题!我将此测试放到LuaPlus5.0
版本中,测试也会遇到同样的问题.经过跟踪调试,发现原来是LPCD::GetObjectUserData函数有问题,原代码:
if (type == LUA_TUSERDATA)
return lua_unboxpointer(L, 1);
其中lua_unboxpointer是一个宏,其定义为#define lua_unboxpointer(L,i) (*(void **)(lua_touserdata(L, i)))
跟踪调试时发现lua_touserdata函数本身返回的就是我们需要的对象的正确地址,但是经过(*(void **)这么一转换就变成了另一个地址了.将之改为:
if (type == LUA_TUSERDATA)
return lua_touserdata(L, 1);
现在编译运行,OK!全部正确!至此,整个C++成员函数的导出成功!
发表于 @ 2007年05月18日 09:29:00|评论(1AddFeedbackCountStack("1614438"))|编辑
新一篇: C++类模板的成员函数模板写法 | 旧一篇: VSLua工具
function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}这两天一直在研究Lua和LuaPlus。由于项目需要将C++中的类导出到Lua脚本中,让Lua脚本也可以使用C++中的东西。倘若用Lua的C
API直接导出到Lua脚本中,感觉不是很方便,所以选择了最新的LuaPlus5.1版,又在网上找了沐枫写的一个LuaPlusHelper.h文
件,便开始试着导出C++中的类到Lua脚本中去。我测试用的被导出的类是一个我自己写的,内容相当简单:
class CExportClass
{
public:
int GetData() const
{
return m_Data;
}
void SetData(int Data)
{
m_Data = Data;
}
protected:
private:
int m_Data;
};
就为了导出这么一个测试类,我写了如下一个函数:
void ExportToLua()
{
using namespace LuaPlus;
LuaClass<CExportClass>(GLuaState)
.create("CExportClass")
.def("Get",&CExportClass::GetData)
.def("Set",&CExportClass::SetData);
}
谁知一编译就报很多如下所示的错误:
LuaPlusCD.h(971): error C2780: “int
LPCD::Call(RT (__cdecl *)(void),lua_State *,int)” : 应输入 3 个参数,却提供了 4
个LuaPlusCD.h(702) : 参见“LPCD::Call”的声明
为此我查了很久都没能找到问题的根源,只得将沐枫的原例Logger类拿来试一试,与我自己写的类比一比。这一试,我发现在原例中,所有的函数均没有使用
const,想必肯定是这个原因,我曾经在自己的项目中也遇到过这样的问题。将const一去掉,OK,编译时以上的错误就永远地消失了!但是问题到此还
没有结束,还有一个错误发生在LuaPlusHelper.h头文件的LuaConstructor::ConstructorHelper中,由于我下
载的那个LuaPlusHelper.h头文件是用于LuaPlus5.0版本的,而我现在用的是LuaPlus5.1,PushStack函数已经不是
LuaObject的成员了,原来的PushStack函数在LuaPlus5.1版本中已经被更名为Push了,于是乎将之改掉.现在编译连接就没有问
题了!
编译连接都通过后,我便利用导出的Logger类的来测试一下,还是按照原例中的代码来测试,一运行,没有想到出现问题了:我新建的一个Logger对
象,在使用其成员函数时的this指针却不是生成时的this指针,也就是说脚本中找到的我需要的对象的地址有问题!我将此测试放到LuaPlus5.0
版本中,测试也会遇到同样的问题.经过跟踪调试,发现原来是LPCD::GetObjectUserData函数有问题,原代码:
if (type == LUA_TUSERDATA)
return lua_unboxpointer(L, 1);
其中lua_unboxpointer是一个宏,其定义为#define lua_unboxpointer(L,i) (*(void **)(lua_touserdata(L, i)))
跟踪调试时发现lua_touserdata函数本身返回的就是我们需要的对象的正确地址,但是经过(*(void **)这么一转换就变成了另一个地址了.将之改为:
if (type == LUA_TUSERDATA)
return lua_touserdata(L, 1);
现在编译运行,OK!全部正确!至此,整个C++成员函数的导出成功!
发表于 @ 2007年05月18日 09:29:00|评论(1AddFeedbackCountStack("1614438"))|编辑
新一篇: C++类模板的成员函数模板写法 | 旧一篇: VSLua工具
相关文章推荐
- 导出C++中的类到Lua脚本中的经历
- c++和MFC 交互通过lua脚本实例
- C++中使用Lua脚本 和lua中调用c的方法
- C/C++中使用Lua脚本
- Lua脚本在C++下的舞步(二)
- Quick-Cocos2d-x 使用tolua工具导出C++的类给Lua调用
- LUA与C++交互(在LUA脚本里调用C++函数传参)
- c++对象导出到lua
- Quick-Cocos2d-x 2.26 使用tolua工具导出C++的类给Lua调用WINDOWS篇
- Lua脚本在C++下的舞步(入门指引)
- 如何在C++中集成Lua脚本
- C++嵌入lua脚本
- 对“tolua++导出C++子类后在Lua中无法添加新成员”这一问题的初步分析【转】
- c++调用lua脚本中局部函数
- 在C++中使用LUA脚本
- Quick-Cocos2d-x 使用tolua工具导出C++的类给Lua调用
- Lua脚本在C++下的舞步(二)
- 脚本语言lua笔记(6)Lua调用c++自定义函数
- Lua脚本在C++下的舞步(三)
- 将C++对象导出到lua,C++和lua的相互调用