c++ - name - ./lua/addtest.lua:9: intento de indexar ''testobj'' local(un valor de datos de usuario)]]
metadata for google search (2)
Parece que testobj.dll
realmente devolvió su lua_testobj
éxito debido al error que está recibiendo:
addTest.lua: 9 intento de indexar ''testobj'' local (un valor de datos de usuario)
indica que lua ve testobj
como un userdata
. Ese no es el problema; el verdadero problema es que no se asoció ningún metatable con ese userdata, por lo que lua no puede hacer nada con él cuando un script intenta usarlo.
He modificado tu luaopen_testobj
para crear y registrar una metatabla para tu 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;
}
Esto debería permitirle acceder a laddTest
usando testobj:addTest()
desde lua. laddtest
debería verificar que testobj
sea de hecho el userdata que ingresó, por ejemplo:
static int laddTest(lua_State *L)
{
auto pTestObj = reinterpret_cast<CTestObj *> (luaL_checkudata(L, 1, "lua_testobj"));
// do something ...
return 1;
}
test.exe llame a addTest.lua y establezca lua_testobj
en la tabla, y agregue Test.stua llamada testobj.dll, pero testobj.dll no puede obtener el "lua_testobj"
error msg es
addTest.lua: 9 intento de indexar ''testobj'' local (un valor de datos de usuario)
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));
el código addtest.lua está siguiendo
local luapath = package.path local cpath = package.cpath print(luapath) print(cpath) local testobj= require "testobj" testobj.addTest()
y el código fuente testobj.dll está siguiendo
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; }
luaopen_testobj
función luaopen_testobj
, lua_pop(L, 1);
antes de regresar
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;
}
Ahora, puede obtener correctamente el valor de pTestObj, ya no aparece "addTest.lua: 9 intenta indexar ''testobj'' local (un valor de datos de usuario)" incorrecto.
Pero no sé cuál es el significado del mensaje de error