"Не удалось создать процесс" после добавления DLL в проект
[К вашему сведению: у меня есть ответ, и я нахожусь в процессе написания решения. Этот пост только для справки для других с подобной проблемой]
Я работаю над небольшим приложением на платформе Symbian-Belle. Все шло хорошо, пока я не нашел место, где мне пришлось анализировать несколько файлов JSON. Я нашел библиотеку QJson, которая казалась очень актуальной и простой в использовании (хотя, похоже, она возвращает все как QVariantMap, что, вероятно, не так уж и легко).
Эта библиотека, однако, не предоставляется в предварительно скомпилированном виде. Это только источник. К счастью, он готов к компиляции в проектах Symbian QtCreator.
После некоторых первоначальных настроек и незначительных исправлений на Симуляторе все прошло гладко, поэтому следующим шагом было запустить его на реальном устройстве. Здесь начались некоторые проблемы. После сборки, связывания, развертывания и установки среда IDE сказала мне:
Ошибка запуска: Ответ команды [ошибка команды], 1 значений для запроса: "C|4| Процессы | Пуск |" "|" MyApp.exe "| [" "] | [] | true '
# 0 {"Код":-46,Format="Не удалось создать процесс (убедитесь, что исполняемый файл и все необходимые библиотеки DLL были переданы и процесс еще не запущен) (разрешение запрещено)"}
Ошибка: "Не удалось создать процесс (убедитесь, что исполняемый файл и все необходимые библиотеки DLL были переданы и процесс еще не запущен) (разрешение запрещено)" Код: -46
Процесс запуска мгновенно был прерван. Конечно, приложение запускалось должным образом, когда код и библиотека, связанные с json, еще не были добавлены в проект.
Я проверил предложенную вещь, и библиотека QJson действительно была правильно установлена на устройстве, поэтому речь шла не о пропущенных файлах. Кроме того, само приложение также было правильно установлено: я даже мог попробовать запустить его вручную. Это привело к ошибке:
Невозможно выполнить файл из соображений безопасности
Что здесь происходит? Как это исправить?
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 и не могу ее загрузить.
Вот это даже написано в документации Nokia на Symbian:
http://www.developer.nokia.com/Community/Wiki/Shared_Library_DLLs_on_Qt_for_Symbian
Это означает, что вы должны убедиться, что все библиотеки DLL (которые используются вашим приложением) имеют по крайней мере такие же широкие возможности, что и ваше приложение.
Для моих проблем с библиотекой QJson, решение было просто добавить NetworkServices
в файл QJson/src/src.pro. Мое приложение использовало этот флаг, потому что оно загружало некоторые данные из Интернета. Таким образом, библиотека должна быть помечена как безопасная для использования с сетью. Я не могу понять, почему он не был помечен этим флагом в первую очередь. Вероятно, авторы просто забыли, так как совершенно очевидно, что JSON-парсер будет использоваться в сетевых приложениях. Я собираюсь оставить их в заметке.
Это завершает мой случай решения проблемы, о котором я хотел написать. Я разместил более длинную версию с более широкими объяснениями по адресу: http://quetzalcoatl-pl.blogspot.com/2012/10/notes-on-symbian-qt-qjson-dlls-and.html