Код завершения cmd.exe в CreateProcess
От: FMikle  
Дата: 17.06.03 12:21
Оценка:
Необходимо выполнить cmd-шный файл в CreateProcess. Как получить код завершения cmd-шного файла. GetExitCodeProcess всегда возвращает 0.
Re: Код завершения cmd.exe в CreateProcess
От: sercher Украина  
Дата: 17.06.03 12:38
Оценка:
Если надо код завершения твоей программы, а не cmd.exe, то в CreateProcess() прямо эту программу и запускай. А не "cmd.exe proga.exe"
Re[2]: Код завершения cmd.exe в CreateProcess
От: FMikle  
Дата: 17.06.03 12:44
Оценка:
Здравствуйте, sercher, Вы писали:


S>Если надо код завершения твоей программы, а не cmd.exe, то в CreateProcess() прямо эту программу и запускай. А не "cmd.exe proga.exe"

Если б так можно было. Мне необходимо выполнить целую кучу команд типа "net user" и т.п. Вот и хочется сгенерировать и потом получить код ошибки которым закончилось выполнение cmd-шного скрипта.
Re: Код завершения cmd.exe в CreateProcess
От: Кодт Россия  
Дата: 17.06.03 12:56
Оценка:
Здравствуйте, FMikle, Вы писали:

FM>Необходимо выполнить cmd-шный файл в CreateProcess. Как получить код завершения cmd-шного файла. GetExitCodeProcess всегда возвращает 0.


Ну так он и выдает код завершения 0.
Чтобы возвращать нечто иное — завершай бат-файл командой
EXIT /b nnn

опция /b позволит полноценно обрабатывать вызовы этого бат-файла из внешних батов

Еще можно в бат-файле пользоваться переменной %errorlevel%
Перекуём баги на фичи!
Re[3]: Код завершения cmd.exe в CreateProcess
От: Кодт Россия  
Дата: 17.06.03 12:59
Оценка:
Здравствуйте, FMikle, Вы писали:

FM>Если б так можно было. Мне необходимо выполнить целую кучу команд типа "net user" и т.п. Вот и хочется сгенерировать и потом получить код ошибки которым закончилось выполнение cmd-шного скрипта.


net blablabla
if errorlevel 1 goto errors

net trirubla
if errorlevel 1 goto errors

......

:okay
exit /b 0

:errors
exit /b %errorlevel%
Перекуём баги на фичи!
Re[4]: Код завершения cmd.exe в CreateProcess
От: FMikle  
Дата: 17.06.03 13:05
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, FMikle, Вы писали:


К>
К>net blablabla
К>if errorlevel 1 goto errors

К>net trirubla
К>if errorlevel 1 goto errors

К>......

К>:okay
К>exit /b 0

К>:errors
К>exit /b %errorlevel%
К>


Спасибо большое, попробую!
Re[5]: Код завершения cmd.exe в CreateProcess
От: Кодт Россия  
Дата: 17.06.03 13:27
Оценка: 3 (1)
Здравствуйте, FMikle, Вы писали:

FM>Спасибо большое, попробую!


Я сейчас решил попробовать по-всякому вызывать и смотреть, что получится.
Итог:

Чтобы передавать код возврата из cmd.exe /c MyScript.bat params
нужно таки выполнять просто exit nnn без /b.

Такой скрипт нельзя вызывать из других бат-файлов командой call — он моментально их вышибет.
Можно — командой cmd /c, при этом вызывающая сторона получит правильное значение errorlevel
Перекуём баги на фичи!
Re[2]: Код завершения cmd.exe в CreateProcess
От: Vadim B  
Дата: 17.06.03 18:18
Оценка:
Здравствуйте, Кодт, Вы писали:

FM>>Необходимо выполнить cmd-шный файл в CreateProcess. Как получить код завершения cmd-шного файла. GetExitCodeProcess всегда возвращает 0.


К>Ну так он и выдает код завершения 0.

К>Чтобы возвращать нечто иное — завершай бат-файл командой
К>
К>EXIT /b nnn
К>

К>опция /b позволит полноценно обрабатывать вызовы этого бат-файла из внешних батов

Это... Или я чего-то не понимаю, или CreateProcess возвращает управление сразу после создания и инициализации нового процесса, когда его код возврата в общем случае еще не может быть известен, просто потому что процесс еще не завершился. MSDN тоже ничего не говорит о возврате кода завершения процесса, а только о том, что в случае успеха CreateProcess вернет не-нуль.

Я бы в данном случае вызывал функцию system() из C/C++ run-time library.
Re[3]: Код завершения процесса запущенного CreateProcess
От: Vet  
Дата: 17.06.03 20:37
Оценка:
Здравствуйте, Vadim B, Вы писали:

VB>Это... Или я чего-то не понимаю, или CreateProcess возвращает управление сразу после создания и инициализации нового процесса, когда его код возврата в общем случае еще не может быть известен, просто потому что процесс еще не завершился. MSDN тоже ничего не говорит о возврате кода завершения процесса, а только о том, что в случае успеха CreateProcess вернет не-нуль.

VB>Я бы в данном случае вызывал функцию system() из C/C++ run-time library.

CreateProcess действительно возвращает управление сразу после создания и инициализации нового процесса
если вы хотите дождаться завершения запущенного процесса, то вызывайте после вызова CreateProcess
вызывайте WaitForSingleObject
DWORD exit_code;//Код завершения процесса
PROCESS_INFORMATION lpProcessInformation;
CreateProcess(... ,&ProcessInformation);
CloseHandle(ProcessInformation.hThread);
WaitForSingleObject(ProcessInformation.hProcess,INFINITE);
GetExitCodeProcess(ProcessInformation.hProcess,&exit_code);
CloseHandle(ProcessInformation.hProcess);
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.