Собственно сабж я реализовал и все работает, но мне не нравится. Как реализовал: Запустил программу с помощью CreateProcess. Из структуры PROCESS_INFORMATION взял hProcess (hThread закрыл сразу CloseHandle'ом) и использовал его в качестве параметра GetExitCodeProcess, которую вызываю в цикле до тех пор пока она возвращает lpExitCode равный STILL_ACTIVE. Ну естессно закрыл по выходу из цикла hProcess. Что не нравится: Мне кажется CreateProcess слишком массивна (в плане оформления в программе), а использую я оттуда только hProcess (почти все остальное, включая структуры, забито нулями). Не подскажете, нет ли чего-нибудь по проще, например с использованием просто ShellExecute для запуска (только не перебирая после этого в цикле список процессов, ожидая пока имя соответствующего процесса наконец там исчезнет: ИМХО это еще массивнее и выполняться будет дольше)? Есть ли что-нибудь менее чайниковское, чем вызывать в цикле GetExitCodeProcess (например WaitForSingleObject: только я не знаю как его применительно к процессам использовать)? Т.е. что-нибудь, что, возможно, требует меньше ресурсов системы.
asmfan О. Большое спасибо! А я думал, что WaitForSingleObject может вернуться не только по завершению работы процесса, а еще и по какому-то другому событию, и про ShellExecuteEx забыл. Еще раз спасибо.
Great Даже видя эту фразу перед собой и зная о ее наличии в MSDN, не могу ее найти. С большим трудом нашел похожую с тем же смыслом. Но разумеется не в описании функции WaitForSingleObject: там только список объектов с которыми работает WaitForSingleObject. А вообще спасибо: бум знать.
Хмм... Долго искал эту фразу в MSDN к VS2005 и VS 6.0 - не нашел, хотя точно помню, что читал ее, и не раз =/ В итоге нашел в гугле в описании функции WaitForSingleObject, но далеко не на M$-вском сайте. Great, у тебя какой MSDN?
Atlantic У меня не совсем MSDN, а небольшая выжимка из него. Причем довольно древняя, к сожалению ( Видимо, при ее составлении юзали не только MSDN. В мсдне я действительного такого не нашел Вот полный текст у меня для WaitForSingleObject:
Код (Text): if CreateProcess (nil, PChar(sPath + '.exe'), nil, nil, False, NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo) then bRunning := True else bRunning := False; {Произошла ошибка запуска процесса} while bRunning do begin Application.ProcessMessages; if WaitForSingleObject (ProcessInfo.hProcess, 0) = WAIT_OBJECT_0 then bRunning := False; end; Что-то типа этого
Zhelezovsky Ну...спасибо за Bemühung, но: Во-первых, я написал, что хочу отказаться от CreateProcess. Во-вторых, asmfan мне сразу дал ответ, удовлетворяющий всем условиям и причем на всеми любимом ассемблере (хотя мне все-равно на чем, тем более, что я писал на VB ). В-третьих, не уверен, что Ваш код вообще целесообразен начиная с самого цикла: собственно цикл ИМХО не нужен, т.к. выполнится один единственный раз. Отсюда же не нужен Application.ProcessMessages, т.к. поток все равно повиснет в ожидании возврата из WaitForSingleObject. To All Поправьте, если я в пункте "В-третьих" не прав. А в остальном тема закрыта. Zhelezovsky P.S. Извиняюсь. Не заметил нуля в качестве времени ожидания. Но вариант с INFINITE мне нравится больше, т.к. опять-таки я хотел отказаться от цикла.
PROFi Потому что программка должна не просто запускать другую и ждать завершения. Она делает "чуть" по больше.
l_inc Извинения приняты. Как кому нравится. Мне CreateProcess нравится больше, чем ShellExec. Чисто субъективно. А INFINITE мне не подошло, потому что сообщения необходимо было обрабатывать, вот и сделал цикл.