Название: QDesktopService vs QProcess Отправлено: ecspertiza от Октябрь 24, 2012, 12:45 Это наверное больше не вопрос, а может случай из практики который может пригодится :) Многие наверное как и я делают апдейт следующим образом, качают в какую то папку инсталяшку и затем запускают ее. Как обычно запускаем процесс конечно же
Код: QProcess:start(); а если еще и не хотим заморачиваться со всякими там wait() или отловом запущен ли уже процесс(что бы закрыть свое приложение) то вызываем Код: QProcess:startDeatached() Все просто и здорово. На практике это не работает :) Конечно может быть прям "Не работает" звучит очень грубо, но в случае когда например под Windowd 7 это отрабатывает на ура ,а под XP нет, я могу сказать что это "не рабочий вариант". Под XP QProcess:startDeatached() при запуска *.exe из папки с документами возвращает false при этом файл есть, документы юзверя который файл сохраняет(стало быть проблем с доступом быть не должно), но возвращается false и при этом QProcess::errorString() и QProcess::error() ни о чем не говорят, оно и не странно, разрабы не заморочились в этой функици записывать описания ошибок. Ну думаю я попробую start() . Здесь все немного лучше видно смену статусов и ошибки приходят, все здорово, но приходит ошибка QProcess::FailedToStart которая следуя из описания говорит о том, что файла либо нет, либо к нему нет доступа. Но постойте как же таг ? перед запуском проверяется что файл есть QFile::exist() - файл есть, сохранен там где доступ тоже есть. Фигня какая то. Решение было найдено использование QDesktopService::openUrl(QUrl(QUrl::fromLocalFile(fileName))) Конечно же мне стало интересно в чем разница, раньше то я думал что openUrl для запуска локальных файлов использует QProcess - ну это было бы логично. Разница в том что QProcess использует winApi ф-цию CreateProcess QDesktopServie использует winApi ф-цию ShellExecute Вот так вот :) Надеюсь кому нибудь это поможет. Название: Re: QDesktopService vs QProcess Отправлено: Bepec от Октябрь 24, 2012, 13:48 Кхм. Вопрос - CreateProcess вроде в XP спокойно рулит как бы. Так почему же не открывается?
По стеку вызовов спускались? Название: Re: QDesktopService vs QProcess Отправлено: ecspertiza от Октябрь 24, 2012, 13:52 Дальше не копал, знаю что CreateProcess получается false возвращает. Можно конечно поэкспериментировать, но это я думаю когда dead line кончится, тогда можно будет глянуть что там :) Наткнулся на статью что с CreateProcess не все так просто и очень просто накосячить с параметрами, но опять же прототип наверное чуть позже накидаю гляну что там.
Название: Re: QDesktopService vs QProcess Отправлено: Igors от Октябрь 24, 2012, 16:47 Решение было найдено использование QDesktopService::openUrl(QUrl(QUrl::fromLocalFile(fileName))) Ясно, но зачем Вы еще копируете, почему не просто Код ??? В нативняке я не раз использовал CreateProcess (WinXP 64) и все нормуль. Наверное дело в параметрах, там их много, помнится еще и блок надо заполнять - ну таково все API (и это не худший вариант). Ваш пост хороший, конструктивный, но хотелось бы пожелать больше архитектуры, алгоритмов. Изучение подробностей Qt классов конечно полезно, но до определенного уровня - возможно Вы его уже достигли. Название: Re: QDesktopService vs QProcess Отправлено: CMorgan от Октябрь 24, 2012, 16:52 Писал для тех приблуд, что у нас разрабатываются автоапдейтер
пользовал: QProcess::startDetached все вроде нормально пахало (тестировались под Win2000, XP, 7); Я б посмотрел в сторону проверки текущей рабочий папки приложения из которой все это запускается. Название: Re: QDesktopService vs QProcess Отправлено: ecspertiza от Октябрь 24, 2012, 17:03 Igors, спасибо что про копирование сказал, это я видимо с горяча.
Я б посмотрел в сторону проверки текущей рабочий папки приложения из которой все это запускается. а что там проверять ? :) Приложение лежит в "C:\Program files\" в нее ничего не копируется и ничего не запускается, так как как раз там и бывают проблемы с доступом, обычно под Windows 7. Сам файл обновления лежит в C:\Documents and settings\{username}\Мои документы. Название: Re: QDesktopService vs QProcess Отправлено: Bepec от Октябрь 24, 2012, 17:12 А у вас предусмотрено то, что username будет русским? А то если без кодировочки, то и папочку он не откроет как бы :)
Название: Re: QDesktopService vs QProcess Отправлено: navrocky от Октябрь 24, 2012, 18:51 а UAC там какой-нибудь случайно не сопротивляется?
Название: Re: QDesktopService vs QProcess Отправлено: ecspertiza от Октябрь 24, 2012, 19:23 А у вас предусмотрено то, что username будет русским? А то если без кодировочки, то и папочку он не откроет как бы :) Ну "Мои документы" написано по русски, проблем вроде нет. а UAC там какой-нибудь случайно не сопротивляется? Могу ошибаться но UAC вроде с Vista ввели. Название: Re: QDesktopService vs QProcess Отправлено: kuzulis от Декабрь 17, 2012, 20:59 Кстати, подниму тему.
Сам недавно столкнулся с задачей запуска под виндой некоего консольного приложения, требующего права админа от обычного пользователя. Консольное приложение собрано в студии с использованием манифеста, в котором указано, что приложению необходимы права админа. При ручном запуске из консольки, все работает тип-топ: винда показывает диалоговое окно (UAC) для ввода пароля админа для повышения привилегий. Но вот, при попытке запустить эту консольную программульку через QProcess (process->start()) из GUI приложения - получаю фейл при отладке с ошибкой типа: "Process failed to start: Запрошенная операция требует повышения". GUI приложение, естественно, собрано при помощи MinGW (может это играет роль?). Знаю, что можно использовать ShellExecute(), но мне оно не подходит, т.к. необходимо перехватывать и читать консольный выхлоп cerr и/или cout из консольного приложения и передавать его в MessageBox ГУЕ-вого приложения. Есть ли какие-то пути решения этой проблемы? Название: Re: QDesktopService vs QProcess Отправлено: kuzulis от Декабрь 18, 2012, 10:28 Приходит на ум только один обходной путь:
Сделать отдельное вспомогательное приложение (например GUI), основная задача которого вызывать через QProcess консольное приложение и перехватывать весь его вывод, например, для отображения этого выхолпа в QMessageBox и т.п. Но само это вспомогательное приложение должно вызываться из главного через QDesktopService (ShellExecute()) с правами администратора. И еще для того, чтобы главное GUI приложение смогло определить "а как там у нас получилось екзекутнуть и с каким результатом?", можно сделать IPC между главным GUI и вспомогательным GUI через QLocalServer/Socket к примеру. Но тут возникает вопрос: а будут ли работать QLocalServer/Socket, если одно работает от админа, а другое от юзера? Других "простых" мыслей не имею". :) Название: Re: QDesktopService vs QProcess Отправлено: ecspertiza от Декабрь 18, 2012, 11:55 Я бы еще предложил вариант поиграться с параметрами QProcess. Ибо как показывает практика они тоже играют роль, например поиграться с параметром OpenMode в ф-ции start(), не исключено что поможет.
Название: Re: QDesktopService vs QProcess Отправлено: kuzulis от Декабрь 18, 2012, 12:15 Нет, эти флаги не имеют значения, они не используются.
|