Russian Qt Forum
Ноябрь 23, 2024, 21:55 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QDesktopService vs QProcess  (Прочитано 8851 раз)
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« : Октябрь 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

Вот так вот Улыбающийся Надеюсь кому нибудь это поможет. 
Записан
Bepec
Гость
« Ответ #1 : Октябрь 24, 2012, 13:48 »

Кхм. Вопрос - CreateProcess вроде в XP спокойно рулит как бы. Так почему же не открывается?

По стеку вызовов спускались?
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #2 : Октябрь 24, 2012, 13:52 »

Дальше не копал, знаю что CreateProcess получается false возвращает. Можно конечно поэкспериментировать, но это я думаю когда dead line кончится, тогда можно будет глянуть что там Улыбающийся Наткнулся на статью что с CreateProcess не все так просто и очень просто накосячить с параметрами, но опять же прототип наверное чуть позже накидаю гляну что там.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Октябрь 24, 2012, 16:47 »

Решение было найдено использование QDesktopService::openUrl(QUrl(QUrl::fromLocalFile(fileName)))
Ясно, но зачем Вы еще копируете, почему не просто
Код
C++ (Qt)
QDesktopService::openUrl(QUrl::fromLocalFile(fileName))
 
Непонимающий

В нативняке я не раз использовал CreateProcess (WinXP 64) и все нормуль. Наверное дело в параметрах, там их много, помнится еще и блок надо заполнять - ну таково все API (и это не худший вариант).

Ваш пост хороший, конструктивный, но хотелось бы пожелать больше архитектуры, алгоритмов. Изучение подробностей Qt классов конечно полезно, но до определенного уровня - возможно Вы его уже достигли.
Записан
CMorgan
Гость
« Ответ #4 : Октябрь 24, 2012, 16:52 »

Писал для тех приблуд, что у нас разрабатываются автоапдейтер
пользовал:
QProcess::startDetached

все вроде нормально пахало (тестировались под Win2000, XP, 7);

Я б посмотрел в сторону проверки текущей рабочий папки приложения из которой все это запускается.
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #5 : Октябрь 24, 2012, 17:03 »

Igors, спасибо что про копирование сказал, это я видимо с горяча.

Я б посмотрел в сторону проверки текущей рабочий папки приложения из которой все это запускается.

а что там проверять ? Улыбающийся Приложение лежит в "C:\Program files\" в нее ничего не копируется и ничего не запускается, так как как раз там и бывают проблемы с доступом, обычно под Windows 7. Сам файл обновления лежит в C:\Documents and settings\{username}\Мои документы.
Записан
Bepec
Гость
« Ответ #6 : Октябрь 24, 2012, 17:12 »

А у вас предусмотрено то, что username будет русским? А то если без кодировочки, то и папочку он не откроет как бы Улыбающийся
Записан
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #7 : Октябрь 24, 2012, 18:51 »

а UAC там какой-нибудь случайно не сопротивляется?
Записан

Гугль в помощь
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #8 : Октябрь 24, 2012, 19:23 »

А у вас предусмотрено то, что username будет русским? А то если без кодировочки, то и папочку он не откроет как бы Улыбающийся

Ну "Мои документы" написано по русски, проблем вроде нет.

а UAC там какой-нибудь случайно не сопротивляется?

Могу ошибаться но UAC вроде с Vista ввели.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #9 : Декабрь 17, 2012, 20:59 »

Кстати, подниму тему.

Сам недавно столкнулся с задачей запуска под виндой некоего консольного приложения, требующего права админа
от обычного пользователя.

Консольное приложение собрано в студии с использованием манифеста, в котором указано, что приложению
необходимы права админа. При ручном запуске из консольки, все работает тип-топ:
винда показывает диалоговое окно (UAC) для ввода пароля админа для повышения привилегий.

Но вот, при попытке запустить эту консольную программульку через QProcess (process->start()) из GUI приложения - получаю фейл
при отладке с ошибкой типа:

"Process failed to start: Запрошенная операция требует повышения".

GUI приложение, естественно, собрано при помощи MinGW (может это играет роль?).

Знаю, что можно использовать ShellExecute(), но мне оно не подходит, т.к. необходимо перехватывать и читать
консольный выхлоп cerr и/или cout из консольного приложения и передавать его в MessageBox ГУЕ-вого приложения.

Есть ли какие-то пути решения этой проблемы?


Записан

ArchLinux x86_64 / Win10 64 bit
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #10 : Декабрь 18, 2012, 10:28 »

Приходит на ум только один обходной путь:

Сделать отдельное вспомогательное приложение (например GUI), основная задача которого вызывать через QProcess консольное приложение
и перехватывать весь его вывод, например, для отображения этого выхолпа в QMessageBox и т.п.

Но само это вспомогательное приложение должно вызываться из главного через QDesktopService (ShellExecute()) с правами администратора.

И еще для того, чтобы главное GUI приложение смогло определить "а как там у нас получилось екзекутнуть и с каким результатом?",
можно сделать IPC между главным GUI и вспомогательным GUI через QLocalServer/Socket к примеру.

Но тут возникает вопрос: а будут ли работать QLocalServer/Socket, если одно работает от админа, а другое от юзера?

Других "простых" мыслей не имею".  Улыбающийся
« Последнее редактирование: Декабрь 18, 2012, 10:31 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #11 : Декабрь 18, 2012, 11:55 »

Я бы еще предложил вариант поиграться с параметрами QProcess. Ибо как показывает практика они тоже играют роль, например поиграться с параметром OpenMode в ф-ции start(), не исключено что поможет.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #12 : Декабрь 18, 2012, 12:15 »

Нет, эти флаги не имеют значения, они не используются.
Записан

ArchLinux x86_64 / Win10 64 bit
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.122 секунд. Запросов: 22.