system () и CreateProcess () / CreateProcessW () - PullRequest
4 голосов
/ 02 апреля 2012

Я хочу выполнить 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".

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

Ответы [ 3 ]

6 голосов
/ 02 апреля 2012

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

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

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

2 голосов
/ 02 апреля 2012

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

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

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

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

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

0 голосов
/ 14 января 2016

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 чтобы получить код завершения процесса.

...