Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Dastes от Июнь 10, 2012, 15:39



Название: Пробелы в QProcess::start
Отправлено: 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\"";

Уже отчаялся. Помогите пожалуйста.


Название: Re: Пробелы в QProcess::start
Отправлено: V1KT0P от Июнь 10, 2012, 15:46
По-любому надо в кавычки заключать. Попробуй не двойные а одинарные использовать.


Название: Re: Пробелы в QProcess::start
Отправлено: Hellraiser от Июнь 10, 2012, 15:49
Код:
arguments << "/S\"E:/test/1 2.txt\"";


Название: Re: Пробелы в QProcess::start
Отправлено: Dastes от Июнь 10, 2012, 15:54
Неа, не помогает.


Название: Re: Пробелы в QProcess::start
Отправлено: V1KT0P от Июнь 10, 2012, 16:07
Неа, не помогает.
Что за программа хоть?


Название: Re: Пробелы в QProcess::start
Отправлено: Dastes от Июнь 10, 2012, 16:12
1c

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

батник отлично отрабатывает не смотря на проблемы в параметрах:
Код:
F:\Progra~1\1cv82\common\1cestart.exe DESIGNER /F"E:\test" /DumpIB"E:\test\dfsd2 gffgh 1.dt"


Название: Re: Пробелы в QProcess::start
Отправлено: V1KT0P от Июнь 10, 2012, 16:28
В пути к экзешнику пробелы воспринимаются нормально, без кавычек и всякого экранирования, а с параметрами херня выходит.
Вообще в документации написано что под виндой оно само экранирует параметр в кавычки, если есть пробел:
Цитировать
Windows: Arguments that contain spaces are wrapped in quotes.


Название: Re: Пробелы в QProcess::start
Отправлено: Dastes от Июнь 10, 2012, 16:38
Придется использовать system(). Что поделаешь.


Название: Re: Пробелы в QProcess::start
Отправлено: Dastes от Июнь 10, 2012, 20:27
C system() ситуация с точностью наоборот. Если в пути к exe есть пробелы то ошибка.

Есть какие-нибудь идеи?


Название: Re: Пробелы в QProcess::start
Отправлено: Hellraiser от Июнь 10, 2012, 21:03
Попробуй вот так
Код:
arguments << "/S\"E:\\test\\1 2.txt\"";


Название: Re: Пробелы в QProcess::start
Отправлено: Igors от Июнь 11, 2012, 09:51
Может стоит взять какой-то др exe-шник, Если с ним все норм, значит Ваш просто не понимает кавычек


Название: Re: Пробелы в QProcess::start
Отправлено: andrew.k от Июнь 11, 2012, 13:09
Кавычки не нужны.
Если бы аргументы передавались одной строкой, то да кавычки нужны. Но они нужны не исполняемой программе, а интерпретатору выполняющему запуск, чтобы корректно передать параметры.
А тут аргументы передаются как список строк, поэтому проблемы с пробелом быть не должно.
Тут очевидно, проблема в самой программе, она почему-то не умеет работать с путями, содержащими пробел.
Чтобы убедить, как сказал Игорс, попробуй другой екзешник, либо попробуй просто из коммандной строки запустить.
Думаю, получишь тот же результат.
Есть, конечно, еще вариант, что это баг в QProcess, но это слишком явный баг, поэтому если бы он был, то к 4.8 его бы уже давно исправили, поэтому проблема в программе, которую ты запускаешь.


Название: Re: Пробелы в QProcess::start
Отправлено: alex312 от Июнь 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();
}
Все работает. Все строки с пробелами надо экранировать кавычками.


Название: Re: Пробелы в QProcess::start
Отправлено: Igors от Июнь 11, 2012, 14:49
Кавычки не нужны.
Если бы аргументы передавались одной строкой, то да кавычки нужны. Но они нужны не исполняемой программе, а интерпретатору выполняющему запуск, чтобы корректно передать параметры.
А тут аргументы передаются как список строк, поэтому проблемы с пробелом быть не должно.
Не знаю где "тут", неск дней назад решал проблемы для Вындоуз приложения которое использовало GetCommandLine ф-цию API, ну и пришлось кавычки разбирать руками


Название: Re: Пробелы в QProcess::start
Отправлено: Alex Custov от Июнь 11, 2012, 15:47
Вот пример запуска:

А зачем ты используешь нативное API для запуска процессов?


Название: Re: Пробелы в QProcess::start
Отправлено: alex312 от Июнь 11, 2012, 16:29
Вот пример запуска:

А зачем ты используешь нативное API для запуска процессов?
Потому что как-то борол-борол такую же проблему как топикстартер, и только так и поборол.


Название: Re: Пробелы в QProcess::start
Отправлено: Alex Custov от Июнь 11, 2012, 16:34
Потому что как-то борол-борол такую же проблему как топикстартер, и только так и поборол.

Эти проблемы решаются через использование
Цитировать
QProcess::execute ( const QString & program, const QStringList & arguments )
, там ничего экранировать не нужно


Название: Re: Пробелы в QProcess::start
Отправлено: alex312 от Июнь 11, 2012, 17:00
Эти проблемы решаются через использование
Цитировать
QProcess::execute ( const QString & program, const QStringList & arguments )
, там ничего экранировать не нужно
Если бы все было так гладко, этого топика не было бы.


Название: Re: Пробелы в QProcess::start
Отправлено: Alex Custov от Июнь 11, 2012, 17:09
Если бы все было так гладко, этого топика не было бы.

Выложи программу (ТС тоже), с которой это не работает. Я проверял и с бинарниками и с батниками, всё работает. Для особо запущенных случаев Hellraiser дал 100% совместимый с cmd вариант.


Название: Re: Пробелы в QProcess::start
Отправлено: alex312 от Июнь 11, 2012, 17:27
Выложи программу (ТС тоже), с которой это не работает. Я проверял и с бинарниками и с батниками, всё работает. Для особо запущенных случаев Hellraiser дал 100% совместимый с cmd вариант.
Я боролся с 1С7.7, у ТС, похоже что 1С8.2  .
сейчас под рукой нет инсталляшки.


Название: Re: Пробелы в QProcess::start
Отправлено: andrew.k от Июнь 11, 2012, 19:24
Кавычки не нужны.
Если бы аргументы передавались одной строкой, то да кавычки нужны. Но они нужны не исполняемой программе, а интерпретатору выполняющему запуск, чтобы корректно передать параметры.
А тут аргументы передаются как список строк, поэтому проблемы с пробелом быть не должно.
Не знаю где "тут", неск дней назад решал проблемы для Вындоуз приложения которое использовало GetCommandLine ф-цию API, ну и пришлось кавычки разбирать руками
"Тут" - это в обсуждаемом QProcess.
И при чем тут API функции не ясно.
И тем более ясно, что если функция возвращает командную строку целиком, то без кавычек не обойтись, я об этом и написал.
Вот в QProcess таких проблем быть не может.


Название: Re: Пробелы в QProcess::start
Отправлено: Dastes от Июнь 11, 2012, 19:49
Да, 1с 8.2
Кое как получилось с System(), но в пути к exe нельзя использовать пробелы, Program Files заменяются сокращенными именами, и если будет нестандартный путь установки с пробелами, то капец. И еще выскакивает на пол секунды черное окно консоли, а в start() его нет.

Если есть желание поковыряться, то вот ссылка на 1с. (~130мб, требуется минутная регистрация). Или где-нибудь на торрентах.
http://1c-dn.com/downloads/index.php?SECTION_ID=56 (http://1c-dn.com/downloads/index.php?SECTION_ID=56)


Название: Re: Пробелы в QProcess::start
Отправлено: andrew.k от Июнь 11, 2012, 19:56
Да, 1с 8.2
Кое как получилось с System(), но в пути к exe нельзя использовать пробелы, Program Files заменяются сокращенными именами, и если будет нестандартный путь установки с пробелами, то капец. И еще выскакивает на пол секунды черное окно консоли, а в start() его нет.

Если есть желание поковыряться, то вот ссылка на 1с. (~130мб, требуется минутная регистрация). Или где-нибудь на торрентах.
http://1c-dn.com/downloads/index.php?SECTION_ID=56 (http://1c-dn.com/downloads/index.php?SECTION_ID=56)
Ты пробовал запускать эту программу из командной строки, так как тебе нужно (с пробелами и кавычками)?
Нормально ли она при этом отрабатывает? Думаю нет.


Название: Re: Пробелы в QProcess::start
Отправлено: Dastes от Июнь 11, 2012, 20:10
бат файл отрабатывает отлично
Код:
"F:\Program Files\1cv82\common\1cestart.exe" DESIGNER /F"E:\test" /DumpIB"E:\test\dfsd2 gffgh 1.dt" /N"asd" /P"123"


Название: Re: Пробелы в QProcess::start
Отправлено: Alex Custov от Июнь 11, 2012, 21:00
Попробуй вот так

Код
C++ (Qt)
bool ok = QProcess::startDetached(
   "F:\Program Files\1cv82\common\1cestart.exe",
   QStringList()
   << "DESIGNER"
   << "/F"
   << "E:\test"
   << "/DumpIB"
   << "E:\test\dfsd2 gffgh 1.dt"
   << "/N"
   << "asd"
   << "/P"
   << "123"
);
 
qDebug("Started: %d", ok);
 


Название: Re: Пробелы в QProcess::start
Отправлено: Dastes от Июнь 11, 2012, 21:13
Процесс не запустился.


Название: Re: Пробелы в QProcess::start
Отправлено: Alex Custov от Июнь 11, 2012, 21:21
запусти через QProcess::start() и отлови stdout/stderr, статус выхода, код возврата, и скопируй сюда код и все эти логи. Теоретически я могу предположить, что 1с не поддерживает раздельные параметры, то есть принимает только
Код:
/N"1 2"
но не
Код:
/N "1 2"
, что будет весьма оригинальным с их стороны.


Название: Re: Пробелы в QProcess::start
Отправлено: Dastes от Июнь 11, 2012, 21:44
Не соображу как логи вывести.

Вот такое выдается предупреждение:
Цитировать
..\testbat\main.cpp:62: warning: unknown escape sequence '\P'
..\testbat\main.cpp:62: warning: unknown escape sequence '\c'


Название: Re: Пробелы в QProcess::start
Отправлено: alex312 от Июнь 11, 2012, 21:51
Не соображу как логи вывести.

Вот такое выдается предупреждение:
Цитировать
..\testbat\main.cpp:62: warning: unknown escape sequence '\P'
..\testbat\main.cpp:62: warning: unknown escape sequence '\c'
Обратную косую надо экранировать!
путь c:\Program Files\1c\bin надо записать как "\"c:\\Program Files\\1c\\bin\""


Название: Re: Пробелы в QProcess::start
Отправлено: andrew.k от Июнь 11, 2012, 22:10
Не соображу как логи вывести.

Вот такое выдается предупреждение:
Цитировать
..\testbat\main.cpp:62: warning: unknown escape sequence '\P'
..\testbat\main.cpp:62: warning: unknown escape sequence '\c'
Обратную косую надо экранировать!
путь c:\Program Files\1c\bin надо записать как "\"c:\\Program Files\\1c\\bin\""


Лучше прямые слеши использовать.

Одно из этого должно правильно передавать параметры (параметры произвольные для примера):
Код
C++ (Qt)
start("F:/Program Files/1cv82/common/1cestart.exe",
   QStringList() << "/F"  << "E:/test/dfsd2 gffgh 1.test");

Код
C++ (Qt)
start("F:/Program Files/1cv82/common/1cestart.exe",
   QStringList() << "/FE:/test/dfsd2 gffgh 1.test");

Если это не работает, значит виноват 1cestart и ничего тут не сделаешь.


Название: Re: Пробелы в QProcess::start
Отправлено: alex312 от Июнь 11, 2012, 22:21

Лучше прямые слеши использовать.

Одно из этого должно правильно передавать параметры (параметры произвольные для примера):
Код
C++ (Qt)
start("F:/Program Files/1cv82/common/1cestart.exe",
   QStringList() << "/F"  << "E:/test/dfsd2 gffgh 1.test");

Код
C++ (Qt)
start("F:/Program Files/1cv82/common/1cestart.exe",
   QStringList() << "/FE:/test/dfsd2 gffgh 1.test");

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


Название: Re: Пробелы в QProcess::start
Отправлено: andrew.k от Июнь 12, 2012, 00:58

Лучше прямые слеши использовать.

Одно из этого должно правильно передавать параметры (параметры произвольные для примера):
Код
C++ (Qt)
start("F:/Program Files/1cv82/common/1cestart.exe",
   QStringList() << "/F"  << "E:/test/dfsd2 gffgh 1.test");

Код
C++ (Qt)
start("F:/Program Files/1cv82/common/1cestart.exe",
   QStringList() << "/FE:/test/dfsd2 gffgh 1.test");

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


Название: Re: Пробелы в QProcess::start
Отправлено: Patrin Andrey от Июнь 12, 2012, 10:28
Код:
bool ok = QProcess::startDetached(
    "F:\Program Files\1cv82\common\1cestart.exe",
    QStringList()
    << "DESIGNER"
    << "/F"
    << "\"E:/test\""
    << "/DumpIB"
    << ""\E:/test/dfsd2 gffgh 1.dt\""
    << "/N"
    << "\"asd\""
    << "/P"
    << "\"123\""
);


Название: Re: Пробелы в QProcess::start
Отправлено: Dastes от Июнь 12, 2012, 19:20
Значит не судьба >:(
Спасибо за помощь