所以Lua似乎是在我的应用程序中实现安全"用户脚本"的理想选择.
但是,嵌入lua的大多数示例似乎都包括加载所有标准库,包括"io"和"package".
所以我可以从我的解释器中排除这些库,但即使是基本库也包含访问文件系统的函数"dofile"和"loadfile".
如何删除/阻止这些不安全的函数,而不仅仅是一个甚至没有像"ipairs"函数这样的基本内容的解释器?
我目前正在学习如何使用 Lua C API,虽然我在 C/C++ 和 Lua 之间成功绑定了函数,但我有几个问题:
将多个脚本加载到一个中是个好主意lua_State吗?有没有办法关闭特定的块?如果不再使用脚本,如何lua_State在保留其他所有内容的同时将其清除?
使用可能对函数/全局变量使用相同名称的脚本的最佳方法是什么?如果我加载所有这些,新的定义会覆盖旧的。
在线阅读后,我认为我需要将每个加载的块分离到不同的环境中。我设想的这种工作方式是每次加载一个块时,我都会为它分配一个唯一的环境名称,当我需要使用它时,我只需使用该名称从 中获取环境LUA_REGISTRYINDEX并执行操作。到目前为止,我还没有想出如何做到这一点。网上有例子,但他们使用 Lua 5.1。
我正在研究一个试图将lua与c ++集成的小项目.我的问题如下:
我有多个lua脚本,我们称之为s1.lua s2.lua和s3.lua.其中每个都具有以下功能:setVars()和executeResults().
现在,我可以通过LuaL_dofile调用lua文件,并在使用setVars()和/或executeResults()之后立即调用.这里的问题是,在我加载s2.lua之后,我再也无法调用s1.lua的函数了.这意味着我必须重做s1.lua上的LuaL_dofile以重新获得对该函数的访问权限,这样我就无法访问s2.lua中的函数.
有没有办法简单地加载所有lua文件,然后开始随意调用它们的函数?类似于s1-> executeResults()s5-> executeResults()s3-> setVars()等.
我目前已经有一个系统使用boost :: filesystem来检测文件夹中的所有lua文件,然后我将这些文件名保存在一个向量中,然后简单地迭代向量以连续加载每个lua文件.
在使用lua文件名填充向量时,我的插件加载函数现在看起来像这样:
void Lua_plugin::load_Plugins(){
std::vector<std::string>::const_iterator it;
for (it=Lua_PluginList.begin(); it!=Lua_PluginList.end(); it++){
std::cout<<"File loading: " << *it << std::endl;
std::string filename = *it;
std::string filepath = scriptdir+filename;
if (luaL_loadfile(L, filepath.c_str()) || lua_pcall(L, 0, 0, 0)) {
std::cout << "ScriptEngine: error loading script. Error returned was: " << lua_tostring(L, -1) << std::endl;
}
}
}
Run Code Online (Sandbox Code Playgroud)
为了使它更清楚一点,我在.lua中的所有内容都是这样的:
-- s1.lua
setVars()
--do stuff
end
executeResults()
--dostuff
end
Run Code Online (Sandbox Code Playgroud)
等,但我希望能够在连续加载两个之后调用s1.lua的setVars()和s2.lua的setVars().