test.exe调用addTest.lua并将lua_testobj
设置为表,并将addTest.lua调用testobj.dll,
但是testobj.dll无法获得“lua_testobj”
错误信息是
addTest.lua:9尝试索引本地'testobj'(用户数据值)
test.exe
L = luaL_newstate();
// link lua lib
luaL_openlibs(L);
//
addLuaCPath( L, "./clib/?.dll" );
//
lua_pushlightuserdata(L, (void*)g_TestObj.get()); // g_TestObj is a global vars
lua_setfield(L, LUA_REGISTRYINDEX, "lua_testobj");
//
int err = 0;
err = luaL_loadfile( L, "./lua/addTest.lua" );
if( err != LUA_OK )
printf("Failed to load addTest.lua![%s]", lua_tostring(L,-1));
err = lua_pcall( L, 0, 1, 0 );
if( err != LUA_OK )
printf("Failed to call addTest.lua![%s]", lua_tostring(L,-1));
addtest.lua代码如下:
local luapath = package.path
local cpath = package.cpath
print(luapath)
print(cpath)
local testobj= require "testobj"
testobj.addTest()
并且testobj.dll源代码如下:
static int laddTest(lua_State *L)
{
lua_getfield(L, LUA_REGISTRYINDEX, "lua_testobj");
return 1;
}
extern "C" int __declspec(dllexport)
luaopen_testobj(lua_State *L)
{
luaL_Reg l[] = {
{ "addTest", laddTest },
{ NULL, NULL },
};
luaL_checkversion(L);
luaL_newlib(L,l);
lua_getfield(L, LUA_REGISTRYINDEX, "lua_testobj");
CTestObj* pTestObj = static_cast<CTestObj*>( lua_touserdata(L,-1) );
return 1;
}
答案 0 :(得分:1)
看起来testobj.dll
确实已成功返回lua_testobj
因为您收到的错误:
addTest.lua:9尝试索引本地'testobj'(用户数据值)
表示lua将testobj
视为userdata
。这不是问题所在;真正的问题是你没有将任何metatable与该userdata相关联,所以当脚本试图使用它时,lua无法对它做任何事情。
我已修改您的luaopen_testobj
以创建并注册testobj
的元表:
extern "C" int __declspec(dllexport)
luaopen_testobj(lua_State *L)
{
luaL_Reg l[] =
{
{ "addTest", laddTest },
{ NULL, NULL },
};
luaL_checkversion(L);
lua_pushlightuserdata(L, (void*)g_TestObj.get());
// g_TestObj, testobj_mt, {l}
luaL_newmetatable(L, "lua_testobj");
luaL_newlib(L, l);
// testobj_mt.__index = {l}
lua_setfield(L, -2, "__index");
// return setmetatable(g_TestObj, testobj_mt)
lua_setmetatable(L, -2);
return 1;
}
这应该允许您使用来自lua的laddTest
访问testobj:addTest()
。 laddtest
应检查testobj
确实是您传入的用户数据,例如:
static int laddTest(lua_State *L)
{
auto pTestObj = reinterpret_cast<CTestObj *> (luaL_checkudata(L, 1, "lua_testobj"));
// do something ...
return 1;
}
答案 1 :(得分:0)
我修改了luaopen_testobj
功能,在返回前添加lua_pop(L, 1);
extern "C" int __declspec(dllexport)
luaopen_testobj(lua_State *L)
{
luaL_Reg l[] = {
{ "addTest", laddTest },
{ NULL, NULL },
};
luaL_checkversion(L);
luaL_newlib(L,l);
lua_getfield(L, LUA_REGISTRYINDEX, "lua_testobj");
CTestObj* pTestObj = static_cast<CTestObj*>( lua_touserdata(L,-1) );
lua_pop(L, 1);
return 1;
}
现在,它可以正确地获取pTestObj的值,不再出现&#34; addTest.lua:9尝试索引本地&#39; testobj&#39; (用户数据值)&#34;错。
但我不知道错误消息的含义是什么