https://wiki.shelek.ru/index.php?title=FAQ:WinAPI_VCPP:%D0%BE%D0%B6%D0%B8%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B2%D0%B5%D1%80%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%D0%B0&feed=atom&action=historyFAQ:WinAPI VCPP:ожидание завершения процесса - История изменений2024-03-29T11:16:09ZИстория изменений этой страницы в викиMediaWiki 1.25.1https://wiki.shelek.ru/index.php?title=FAQ:WinAPI_VCPP:%D0%BE%D0%B6%D0%B8%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B7%D0%B0%D0%B2%D0%B5%D1%80%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%D0%B0&diff=764&oldid=prevRXL: Новая: ===Я запускаю экзешник при помощи ::ShellExecute(). Процедура тут же возвращает управление, а как дождаться, ко...2009-10-03T16:41:45Z<p>Новая: ===Я запускаю экзешник при помощи ::ShellExecute(). Процедура тут же возвращает управление, а как дождаться, ко...</p>
<p><b>Новая страница</b></p><div>===Я запускаю экзешник при помощи ::ShellExecute(). Процедура тут же возвращает управление, а как дождаться, когда запущенный процесс завершится, только потом продолжить выполнение программы?===<br />
<br />
Нужно использовать функции<br />
<br />
* CreateProcess()<br />
* WaitForSingeObject()<br />
<br />
<syntaxhighlight lang="cpp"><br />
STARTUPINFO StartupInfo;<br />
PROCESS_INFORMATION ProcessInfo;<br />
DWORD dwRetValue;<br />
<br />
RtlZeroMemory(&StartupInfo, sizeof(StartupInfo));<br />
StartupInfo.cb = sizeof(StartupInfo);<br />
<br />
// запуск экзешника<br />
if (!CreateProcess(<br />
szApplicationName,<br />
szCommandLine, // командная строка (можно указать NULL)<br />
NULL, NULL, FALSE,<br />
NORMAL_PRIORITY_CLASS,<br />
NULL,<br />
szCurrentDirectory, // рабочая директория (можно указать NULL)<br />
&StartupInfo,<br />
&ProcessInfo))<br />
{<br />
// ошибка запуска<br />
// определяем ошибку<br />
DWORD dwdErr = GetLastError();<br />
}<br />
else<br />
{<br />
// ждём 30 секунд момента, пока процесс завершится<br />
// (ProcessInfo.hProcess перейдёт в сигнальное состояние)<br />
// если задать INFINITE, будет ждать до бесконечности<br />
DWORD dwd = WaitForSingleObject(ProcessInfo.hProcess, 30000);<br />
<br />
// dwd покажет причину завершения процедуры WaitForSingleObject<br />
// WAIT_OBJECT_0 - Состояние объекта переведено в сигнальное <br />
// WAIT_TIMEOUT - Кончился таймаут<br />
<br />
// к теме не относится, но для мутекса ещё есть возвращаемое значение:<br />
// WAIT_ABANDONED - Объект является мутексом, который был занят потоком,<br />
// затем поток завершился, не разблокировав мутекс. Мутекс находится<br />
// в несигнальном состоянии<br />
<br />
// если нужно - смотрим, какое значение вернуло приложение<br />
GetExitCodeProcess(ProcessInfo.hProcess, &dwRetValue);<br />
<br />
// освобождаем хендлы, открытые CreateProcess<br />
CloseHandle(ProcessInfo.hThread);<br />
CloseHandle(ProcessInfo.hProcess);<br />
}<br />
</syntaxhighlight><br />
<br />
В szApplicationName может быть либо полный путь к файлу, либо только имя файла. В последнем случае файл будет искаться в текущем каталоге.<br />
<br />
szCommandLine может быть NULL, если не надо передавать командную строку запускаемому процессу.<br />
<br />
szCurrentDirectory может быть NULL, тогда текущий каталог будет как у родительского процесса.<br />
<br />
[[Category:FAQ:WinAPI VCPP]]</div>RXL