system () и CreateProcess () / CreateProcessW ()

Я хочу выполнить TEST.exe в программе C. Пока я использую

system( "TEST.exe <input-file> output-file" );

Я могу получить то, что ожидал.

Но CreateProcessW () не работал должным образом, когда я использовал следующий код (см. Как запустить внешнюю программу?):

if (CreateProcessW(const_cast<LPCWSTR>(FullPathToExe.c_str()), 
    pwszParam, 0, 0, false, 
    CREATE_DEFAULT_ERROR_MODE, 0, 0, 
    &siStartupInfo, &piProcessInfo) != false) 
{ 
    /* Watch the process. */ 
    dwExitCode = WaitForSingleObject(piProcessInfo.hProcess,  (SecondsToWait * 1000)); 
    iReturnVal = GetLastError(); 
} 
else 
{ 
    /* CreateProcess failed */ 
    iReturnVal = GetLastError(); 
} 

где

FullPathToExe="TEST.exe", pwszParam="TEST.exe <input-file> output-file".

И WaitForSingleObject () возвращает 258, GetLastError () возвращает 1813 («Указанный тип ресурса не может быть найден в файле изображения.»).

Кроме того, приведенный выше код CreateProcessW () отлично работает, когда я запускаю свой собственный HelloProcess.exe (распечатайте привет и спите несколько секунд, определяемых следующим числом, затем выйдите.) С

FullPathToExe="HelloProcess.exe", pwszParam="HelloProcess.exe 10".

Любые идеи? Спасибо за любые подсказки!


person dehiker    schedule 02.04.2012    source источник
comment
FullPathToExe - это строка или wstring?   -  person zdan    schedule 02.04.2012
comment
Это струна. Я думаю, что типы переменных в порядке, поскольку код хорошо работает с моим собственным * .exe. Интересно, есть ли проблема с ‹/› в параметрах?   -  person dehiker    schedule 02.04.2012
comment
Заголовок следует изменить на «Перенаправление ввода / вывода: system () vs. CreateProcess ()», но мне нельзя его редактировать. Также интервал несущественен - ​​и, следовательно, вводит в заблуждение - в <input-file> output-file. Символы <> являются префиксами, но интервал OP подразумевает, что это круглые скобки. Интервал, который не вводит в заблуждение: <output-file >input-file.   -  person 7vujy0f0hy    schedule 02.04.2017


Ответы (3)


system фактически порождает cmd экземпляр, в котором выполняется ваша команда:

Функция system передает команду интерпретатору команд, который выполняет строку как команду операционной системы. система относится к переменным среды COMSPEC и PATH, которые определяют местонахождение файла интерпретатора команд (файл с именем CMD.EXE в Windows NT). Если command имеет значение NULL, функция просто проверяет, существует ли интерпретатор команд.
- Документация по system

Вот почему работают такие операторы перенаправления, как < и >. Это не относится к CreateProcess, который на самом деле просто порождает процесс, а не оболочку, выполняющую другой процесс. Поскольку операторы перенаправления являются функцией оболочки, а не ОС, вам придется вручную вводить и выводить данные для процесса.

person Joey    schedule 02.04.2012
comment
Большое спасибо за ваше объяснение. И теперь я нахожу решение своей проблемы, ура !! - person dehiker; 02.04.2012

Я делаю то, что мне говорит CreateProcess и аргументы командной строки, и устраняю проблему! Спасибо, ребята, за внимание!

Для вашего удобства вот цитата ответа:

Вы не можете напрямую использовать операторы перенаправления командной строки с CreateProcess (). Вы должны создать экземпляр cmd.exe и вместо этого передать ему операторы, например:

CreateProcess( "C:\\windows\\system32\\cmd.exe", t_str2, ...)) 

Где t_str2 - "/ C C: \ Temp \ sift.exe‹ C: \ img1.pgm> C: \ img1.key ". Фактический путь к cmd.exe можно определить, прочитав переменную среды% COMSPEC%.

person dehiker    schedule 02.04.2012

WaitForSingleObject () возвращает результат ожидания, а не код выхода. https://msdn.microsoft.com/en-us/library/windows/desktop/ms687032(v=vs.85).aspx

258 - это WAIT_TIMEOUT. Вы должны повторять этот код ошибки, пока не получите возвращаемое значение 0 (WAIT_OBJECT_0) или другую ошибку.

После этого используйте GetExitCodeProcess https://msdn.microsoft.com/en-us/library/windows/desktop/ms683189(v=vs.85).aspx, чтобы получить код завершения процесса.

person Hari Krishna S    schedule 14.01.2016