これはおそらく簡単な質問ですが、私は困惑しています。これはLua5.1用です。
独自の環境で実行されるスクリプトがあります。その環境では、C++から次のように設定した「プラグイン」という変数があります。
lua_getfield(L, LUA_REGISTRYINDEX, getScriptId()); // Put script's env table onto the stack -- env_table
lua_pushstring(L, "plugin"); // -- env_table, "plugin"
luaW_push(L, this); // -- env_table, "plugin", *this
lua_rawset(L, -3); // env_table["plugin"] = *this -- env_table
lua_pop(L, -1); // Cleanup -- <<empty stack>>
Luaスクリプトを実行する前に、関数環境を次のように設定します。
lua_getfield(L, LUA_REGISTRYINDEX, getScriptId()); // Push REGISTRY[scriptId] onto stack -- function, table
lua_setfenv(L, -2); // Set that table to be the env for function -- function
スクリプトを実行すると、期待どおりにプラグイン変数を表示して操作できます。ここまでは順調ですね。
ある時点で、LuaスクリプトがC ++関数を呼び出し、その関数で、プラグイン変数が設定されているかどうかを確認したいと思います。
多くのことを試しましたが、プラグイン変数が表示されないようです。これが私が試した4つのことです:
lua_getfield(L, LUA_ENVIRONINDEX, "plugin");
bool isPlugin = !lua_isnil(L, -1);
lua_pop(L, 1); // Remove the value we just added from the stack
lua_getfield(L, LUA_GLOBALSINDEX, "plugin");
bool isPlugin2 = !lua_isnil(L, -1);
lua_pop(L, 1); // Remove the value we just added from the stack
lua_getglobal(L, "plugin");
bool isPlugin3 = !lua_isnil(L, -1);
lua_pop(L, 1); // Remove the value we just added from the stack
lua_pushstring(L, "plugin");
bool isPlugin4 = lua_isuserdata(L, -1);
lua_pop(L, 1);
残念ながら、すべてのisPlugin変数はfalseを返します。これは、Luaから呼び出されたC++関数がLua環境で設定された変数を認識できないかのようです。
C ++からプラグイン変数を確認する方法はありますか?
ありがとう!