<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>https://wiki.shelek.ru/index.php?action=history&amp;feed=atom&amp;title=FAQ%3AWinAPI_VCPP%3A%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</id>
		<title>FAQ:WinAPI VCPP:ожидание завершения процесса - История изменений</title>
		<link rel="self" type="application/atom+xml" href="https://wiki.shelek.ru/index.php?action=history&amp;feed=atom&amp;title=FAQ%3AWinAPI_VCPP%3A%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"/>
		<link rel="alternate" type="text/html" href="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&amp;action=history"/>
		<updated>2026-05-27T10:41:58Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.25.1</generator>

	<entry>
		<id>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&amp;diff=764&amp;oldid=prev</id>
		<title>RXL: Новая: ===Я запускаю экзешник при помощи ::ShellExecute(). Процедура тут же возвращает управление, а как дождаться, ко...</title>
		<link rel="alternate" type="text/html" href="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&amp;diff=764&amp;oldid=prev"/>
				<updated>2009-10-03T16:41:45Z</updated>
		
		<summary type="html">&lt;p&gt;Новая: ===Я запускаю экзешник при помощи ::ShellExecute(). Процедура тут же возвращает управление, а как дождаться, ко...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;===Я запускаю экзешник при помощи ::ShellExecute(). Процедура тут же возвращает управление, а как дождаться, когда запущенный процесс завершится, только потом продолжить выполнение программы?===&lt;br /&gt;
&lt;br /&gt;
Нужно использовать функции&lt;br /&gt;
&lt;br /&gt;
* CreateProcess()&lt;br /&gt;
* WaitForSingeObject()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
STARTUPINFO	StartupInfo;&lt;br /&gt;
PROCESS_INFORMATION ProcessInfo;&lt;br /&gt;
DWORD dwRetValue;&lt;br /&gt;
&lt;br /&gt;
RtlZeroMemory(&amp;amp;StartupInfo, sizeof(StartupInfo));&lt;br /&gt;
StartupInfo.cb = sizeof(StartupInfo);&lt;br /&gt;
&lt;br /&gt;
// запуск экзешника&lt;br /&gt;
if (!CreateProcess(&lt;br /&gt;
	szApplicationName,&lt;br /&gt;
	szCommandLine, // командная строка (можно указать NULL)&lt;br /&gt;
	NULL, NULL, FALSE,&lt;br /&gt;
	NORMAL_PRIORITY_CLASS,&lt;br /&gt;
	NULL,&lt;br /&gt;
	szCurrentDirectory, // рабочая директория (можно указать NULL)&lt;br /&gt;
	&amp;amp;StartupInfo,&lt;br /&gt;
	&amp;amp;ProcessInfo))&lt;br /&gt;
{&lt;br /&gt;
	// ошибка запуска&lt;br /&gt;
	// определяем ошибку&lt;br /&gt;
	DWORD dwdErr = GetLastError();&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
	// ждём 30 секунд момента, пока процесс завершится&lt;br /&gt;
	// (ProcessInfo.hProcess перейдёт в сигнальное состояние)&lt;br /&gt;
	// если задать INFINITE, будет ждать до бесконечности&lt;br /&gt;
	DWORD dwd = WaitForSingleObject(ProcessInfo.hProcess, 30000);&lt;br /&gt;
&lt;br /&gt;
	// dwd покажет причину завершения процедуры WaitForSingleObject&lt;br /&gt;
	// WAIT_OBJECT_0 - Состояние объекта переведено в сигнальное &lt;br /&gt;
	// WAIT_TIMEOUT - Кончился таймаут&lt;br /&gt;
&lt;br /&gt;
	// к теме не относится, но для мутекса ещё есть возвращаемое значение:&lt;br /&gt;
	// WAIT_ABANDONED - Объект является мутексом, который был занят потоком,&lt;br /&gt;
	// затем поток завершился, не разблокировав мутекс. Мутекс находится&lt;br /&gt;
	// в несигнальном состоянии&lt;br /&gt;
&lt;br /&gt;
	// если нужно - смотрим, какое значение вернуло приложение&lt;br /&gt;
	GetExitCodeProcess(ProcessInfo.hProcess, &amp;amp;dwRetValue);&lt;br /&gt;
&lt;br /&gt;
	// освобождаем хендлы, открытые CreateProcess&lt;br /&gt;
	CloseHandle(ProcessInfo.hThread);&lt;br /&gt;
	CloseHandle(ProcessInfo.hProcess);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В szApplicationName может быть либо полный путь к файлу, либо только имя файла. В последнем случае файл будет искаться в текущем каталоге.&lt;br /&gt;
&lt;br /&gt;
szCommandLine может быть NULL, если не надо передавать командную строку запускаемому процессу.&lt;br /&gt;
&lt;br /&gt;
szCurrentDirectory может быть NULL, тогда текущий каталог будет как у родительского процесса.&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ:WinAPI VCPP]]&lt;/div&gt;</summary>
		<author><name>RXL</name></author>	</entry>

	</feed>