0

[仅供参考:我已经得到了答案,我正在编写解决方案。本帖仅供有类似问题的人参考】


我正在 Symbian-Belle 平台上开发一些小型应用程序。一切都做得很好,直到我遇到了必须解析一些 JSON 文件的地方。我找到了一个 QJson 库,它看起来非常相关且易于使用(尽管它似乎将所有内容都返回为 QVariantMap,这可能不是那么轻量级..)。

然而,这个库不是以预编译的形式提供的。它是仅限源代码的。幸运的是,它准备在 QtCreator 的 Symbian 项目下编译。

经过一些初始设置和小修复后,模拟器上的一切运行顺利,因此,下一步是在真实设备上运行它。这里开始出现一些问题。在构建、链接、部署和安装之后,IDE 告诉我:

启动失败:命令答案 [命令错误],1 个要请求的值:'C|4|Processes|start|""|"MyApp.exe"|[""]|[]|true'
#0 {"代码":-46,Format="创建进程失败(验证可执行文件和所有必需的 DLL 是否已传输,并且该进程尚未运行)(权限被拒绝)"}
错误:'创建进程失败(验证可执行文件和所有必需的 DLL 是否已传输,并且该进程尚未运行)(权限被拒绝) ' 代码:-46

启动过程立即中止。当然,当与 json 相关的代码和库尚未添加到项目中时,应用程序会正常启动。

我已经检查了建议的内容,并且 QJson 库确实已正确安装在设备上,因此与丢失文件无关。此外,它自己的应用程序也已正确安装:我什至可以尝试手动运行它。这样做会导致错误:

出于安全原因无法执行文件

到底是怎么回事?如何解决?

4

1 回答 1

1

问题确实在于 Symbian 平台的安全特性。事实证明,它根本与 Qt 无关。

您会看到,EXE 和 DLL 项目都可能标有“功能”,指定代码使用哪些特殊平台功能。例如,如果您尝试读取特定于设备的数据,则需要ReadDeviceData功能。

功能嵌入到设备上安装的二进制文件中。Symbian 构建系统要求在 .PKG 文件中定义它们,但如果您使用当前的 Nokia/Qt 工具,所有这些文件都会由构建过程自动生成。对于 Qt 项目,功能在 .pro 文件中指定,例如:

TARGET.CAPABILITY += ReadDeviceData

现在,诀窍是,虽然 EXE 和 DLL 使用完全相同的 Capability 标志,但对于 EXE 和 DLL,相同的功能意味着其他东西

  • 对于 EXE,它们的意思是“允许应用程序使用什么?”
  • 对于 DLL,它们的意思是“哪些应用程序可以安全地使用该 DLL?”

在您第一次想到它时就很难看到差异。

  • 如果 EXE 有标志 X,则操作系统授予此应用程序对某些 X API 的访问权限
  • 如果 DLL 有标志 X,这意味着它可以被有 X 标志的应用程序安全地使用

请注意,对于 DLL,含义有些相反:使用某些超安全标志的应用程序AllFiles 不能使用没有这些标志的 DLL。

原因很简单:如果我使用 XYZ 标志,并且如果 DLL 没有使用该标志标记为可安全使用,那么使用该 DLL 是不安全的,我无法加载它。

这甚至写在诺基亚的 Symbian 文档上:http:
//www.developer.nokia.com/Community/Wiki/Shared_Library_DLLs_on_Qt_for_Symbian#Capabilities

这意味着您必须确保所有 DLL(由您的应用程序使用)至少具有与您的应用程序一样宽的功能。

对于我使用 QJson 库的问题,解决方案是简单地添加NetworkServices到 QJson/src/src.pro 文件中。我的应用程序使用了这个标志,因为它从互联网上下载了一些数据。因此,必须将库标记为可安全使用网络。我无法想象为什么它一开始就没有标上那面旗帜。可能作者只是忘记了,因为很明显 JSON-parser 将用于支持网络的应用程序中。我要给他们留个便条。


我想写的问题解决案例到此结束。我在以下位置发布了一个更长的版本,其中包含更广泛的解释:http: //quetzalcoatl-pl.blogspot.com/2012/10/notes-on-symbian-qt-qjson-dlls-and.html

于 2012-10-04T14:58:54.047 回答