site name metaetiquetas keywords google for etiquetas description c++ lua lua-api lua-userdata

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)

  1. 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));

  2. 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()

  3. 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