Здравствуйте, FMikle, Вы писали:
FM>Спасибо большое, попробую!
Я сейчас решил попробовать по-всякому вызывать и смотреть, что получится.
Итог:
Чтобы передавать код возврата из cmd.exe /c MyScript.bat params
нужно таки выполнять просто exit nnn без /b.
Такой скрипт нельзя вызывать из других бат-файлов командой call — он моментально их вышибет.
Можно — командой cmd /c, при этом вызывающая сторона получит правильное значение errorlevel
S>Если надо код завершения твоей программы, а не cmd.exe, то в CreateProcess() прямо эту программу и запускай. А не "cmd.exe proga.exe"
Если б так можно было. Мне необходимо выполнить целую кучу команд типа "net user" и т.п. Вот и хочется сгенерировать и потом получить код ошибки которым закончилось выполнение cmd-шного скрипта.
Здравствуйте, FMikle, Вы писали:
FM>Необходимо выполнить cmd-шный файл в CreateProcess. Как получить код завершения cmd-шного файла. GetExitCodeProcess всегда возвращает 0.
Ну так он и выдает код завершения 0.
Чтобы возвращать нечто иное — завершай бат-файл командой
EXIT /b nnn
опция /b позволит полноценно обрабатывать вызовы этого бат-файла из внешних батов
Еще можно в бат-файле пользоваться переменной %errorlevel%
Здравствуйте, 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%
Здравствуйте, Кодт, Вы писали:
FM>>Необходимо выполнить cmd-шный файл в CreateProcess. Как получить код завершения cmd-шного файла. GetExitCodeProcess всегда возвращает 0.
К>Ну так он и выдает код завершения 0. К>Чтобы возвращать нечто иное — завершай бат-файл командой К>
К>EXIT /b nnn
К>
К>опция /b позволит полноценно обрабатывать вызовы этого бат-файла из внешних батов
Это... Или я чего-то не понимаю, или CreateProcess возвращает управление сразу после создания и инициализации нового процесса, когда его код возврата в общем случае еще не может быть известен, просто потому что процесс еще не завершился. MSDN тоже ничего не говорит о возврате кода завершения процесса, а только о том, что в случае успеха CreateProcess вернет не-нуль.
Я бы в данном случае вызывал функцию system() из C/C++ run-time library.
Re[3]: Код завершения процесса запущенного CreateProcess
Здравствуйте, 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);