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

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

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: Пробелы в QProcess::start  (Прочитано 17151 раз)
Dastes
Гость
« : Июнь 10, 2012, 15:39 »

Здравствуйте.
Есть проблема с пробелами в параметрах запуска:

Код:
arguments << "/SE:/test/1 2.txt";

myProcess->start(program, arguments);

При запуске создается файл "1" в E:/test.

Как пытался решить:
Код:
arguments << "/SE:\\test\\1 2.txt";

arguments << "/SE:\\test\\1\ 2.txt";

arguments << "/S\"E:/test/1 2.txt\"";

arguments << "/S\"E:/test/1\ 2.txt\"";

Уже отчаялся. Помогите пожалуйста.
Записан
V1KT0P
Гость
« Ответ #1 : Июнь 10, 2012, 15:46 »

По-любому надо в кавычки заключать. Попробуй не двойные а одинарные использовать.
Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #2 : Июнь 10, 2012, 15:49 »

Код:
arguments << "/S\"E:/test/1 2.txt\"";
Записан
Dastes
Гость
« Ответ #3 : Июнь 10, 2012, 15:54 »

Неа, не помогает.
Записан
V1KT0P
Гость
« Ответ #4 : Июнь 10, 2012, 16:07 »

Неа, не помогает.
Что за программа хоть?
Записан
Dastes
Гость
« Ответ #5 : Июнь 10, 2012, 16:12 »

1c

В пути к экзешнику пробелы воспринимаются нормально, без кавычек и всякого экранирования, а с параметрами херня выходит.

батник отлично отрабатывает не смотря на проблемы в параметрах:
Код:
F:\Progra~1\1cv82\common\1cestart.exe DESIGNER /F"E:\test" /DumpIB"E:\test\dfsd2 gffgh 1.dt"
Записан
V1KT0P
Гость
« Ответ #6 : Июнь 10, 2012, 16:28 »

В пути к экзешнику пробелы воспринимаются нормально, без кавычек и всякого экранирования, а с параметрами херня выходит.
Вообще в документации написано что под виндой оно само экранирует параметр в кавычки, если есть пробел:
Цитировать
Windows: Arguments that contain spaces are wrapped in quotes.
Записан
Dastes
Гость
« Ответ #7 : Июнь 10, 2012, 16:38 »

Придется использовать system(). Что поделаешь.
Записан
Dastes
Гость
« Ответ #8 : Июнь 10, 2012, 20:27 »

C system() ситуация с точностью наоборот. Если в пути к exe есть пробелы то ошибка.

Есть какие-нибудь идеи?
Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #9 : Июнь 10, 2012, 21:03 »

Попробуй вот так
Код:
arguments << "/S\"E:\\test\\1 2.txt\"";
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Июнь 11, 2012, 09:51 »

Может стоит взять какой-то др exe-шник, Если с ним все норм, значит Ваш просто не понимает кавычек
Записан
andrew.k
Гость
« Ответ #11 : Июнь 11, 2012, 13:09 »

Кавычки не нужны.
Если бы аргументы передавались одной строкой, то да кавычки нужны. Но они нужны не исполняемой программе, а интерпретатору выполняющему запуск, чтобы корректно передать параметры.
А тут аргументы передаются как список строк, поэтому проблемы с пробелом быть не должно.
Тут очевидно, проблема в самой программе, она почему-то не умеет работать с путями, содержащими пробел.
Чтобы убедить, как сказал Игорс, попробуй другой екзешник, либо попробуй просто из коммандной строки запустить.
Думаю, получишь тот же результат.
Есть, конечно, еще вариант, что это баг в QProcess, но это слишком явный баг, поэтому если бы он был, то к 4.8 его бы уже давно исправили, поэтому проблема в программе, которую ты запускаешь.
Записан
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #12 : Июнь 11, 2012, 13:21 »

Вот пример запуска:
Код:
SharedExtProcess ExternalProcess::create(const QString &cmd, const QString &params)
{
    PROCESS_INFORMATION processInformation;
    STARTUPINFO startupInfo;
    memset(&processInformation, 0, sizeof(processInformation));
    memset(&startupInfo, 0, sizeof(startupInfo));
    startupInfo.cb = sizeof(startupInfo);

    BOOL result;
    QString c = QString("%1 %2").arg(cmd).arg(params);
    result = CreateProcess(NULL, (wchar_t*)c.utf16(),NULL, NULL, FALSE, 0, NULL, NULL,
                           &startupInfo, &processInformation);
    QString err = ErrorExit();
    qDebug()<<"try start result "<<result;
    if(result != 0)
        {
            SharedExtProcess res =
                    SharedExtProcess(new ExternalProcess(processInformation.dwProcessId));
            return res;
        }
    else
        {
            qDebug()<< err ;
        }
    return SharedExtProcess();
}
Все работает. Все строки с пробелами надо экранировать кавычками.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #13 : Июнь 11, 2012, 14:49 »

Кавычки не нужны.
Если бы аргументы передавались одной строкой, то да кавычки нужны. Но они нужны не исполняемой программе, а интерпретатору выполняющему запуск, чтобы корректно передать параметры.
А тут аргументы передаются как список строк, поэтому проблемы с пробелом быть не должно.
Не знаю где "тут", неск дней назад решал проблемы для Вындоуз приложения которое использовало GetCommandLine ф-цию API, ну и пришлось кавычки разбирать руками
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #14 : Июнь 11, 2012, 15:47 »

Вот пример запуска:

А зачем ты используешь нативное API для запуска процессов?
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


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