从SymbianOS上的文件系统插件访问资源文件
由于PlatSec问题,我无法从文件系统插件中使用资源文件API:
*PlatSec* ERROR - Capability check failed - Can't load filesystemplugin.PXT because it links to bafl.dll which has the following capabilities missing: TCB
我对这个问题的理解是:
文件系统插件是在文件系统进程的上下文中执行的dll。因此,所有文件系统插件都必须具有" TCB" PlatSec特权,这又意味着它们无法链接到不在" TCB"中的dll。
有没有解决的办法(不求助于文本文件或者中间服务器)?我怀疑不是,但是最好能得到一个明确的答案。
解决方案
Symbian文件服务器具有以下功能:
TCB ProtServ DiskAdmin AllFiles PowerMgmt CommDD
因此,任何加载到文件服务器进程中的DLL必须至少具有这些功能。没有办法解决这个问题,除非我们暗示要编写新的代理过程。
但是,还有一个更根本的原因,为什么我们不应该在文件服务器插件中使用" bafl.dll":该DLL提供了实用程序功能,可与文件服务器客户端API接口。尝试从文件服务器中使用它是行不通的;充其量,这将导致文件服务器在尝试与其自身建立连接时陷入僵局。
我建议我们重新考虑我们要尝试的做法,并研究内部文件服务器API来实现它。
从文件服务器插件中使用RFs / RFile / RDir API是不安全的,如果我们不太谨慎的话,可能会导致死锁。
Symbian 9.5将引入应该使用的新API(RFilePlugin,RFsPlugin和RDirPlugin)。
告诉我们我们正在资源文件中存储哪种数据。
通常进入资源文件的内容在文件服务器插件中没有位置,即使这意味着对一些值进行硬编码。
从技术上讲,我们可以使用RFile.Write()将数据发送到文件服务器插件,但这不是一个很好的解决方案(在插件中拦截RFile.Open("只有插件才能理解的无效文件名"))。
编辑:有人指出,使用无效的文件名不会让我们将数据发送到插件。嘿,我也不喜欢那种解决方案。为了完整起见,我应该澄清一下。组成一个看起来还可以进入插件的文件名。例如使用未添加实际驱动器的驱动器号(但文件名解析代码仍将其视为正确的驱动器)。
从理论上讲,尽管编写代码以解析插件中的资源文件二进制文件,但这也不是一个很好的解决方案。
有一个与插件进行通信的适当机制,即RPlugin。
不要使用RFile。我什至不确定它是否会工作,因为在插件堆栈之前调用的RFile函数的初始化中检查了路径。