Russian Qt Forum

Qt => Общие вопросы => Тема начата: ecspertiza от Октябрь 24, 2012, 12:45



Название: 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)))
Ясно, но зачем Вы еще копируете, почему не просто
Код
C++ (Qt)
QDesktopService::openUrl(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
Нет, эти флаги не имеют значения, они не используются.