![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
CreateProcess [D7, Win2k]
Molchanov © (2005-10-20 18:03:00)Запускаю EXE-файл, котому не хватает статически загружаемых DLL-файлов, из файлового менеджера. Вижу соотв. сообщение, после чего процесс умирает.
Запускаю тот-же файл из свой программы с помощью CreateProcess, вижу сообщение, после чего процесс не умирает, а моя программа подвисает на ожидании его завершения.
Код запуска:
procedure ExecFile(const Cmd: string);
var StartUpInfo: TStartUpInfo;
ProcessInfo: TProcessInformation;
begin
FillChar(StartupInfo, SizeOf(StartupInfo), #0);
StartupInfo.cb := SizeOf(StartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := SW_SHOWNORMAL;
if CreateProcess(nil, PChar(Cmd), nil, nil, False, CREATE_NEW_CONSOLE,
nil, nil, StartupInfo, ProcessInfo) then
begin
try
repeat
Application.ProcessMessages;
if Application.Terminated then Halt(0);
until WaitforSingleObject(ProcessInfo.hThread, 0) <> WAIT_TIMEOUT;
finally
with ProcessInfo do
begin
CloseHandle(hThread);
CloseHandle(hProcess);
end
end
end
end;
Как запускать процесс, чтобы он завершался в случае аварии?
Временно поставил WaitForInputIdle на 5 сек и TerminateProcess, но думаю, что вопрос можно решить более правильно.
Digitman (2005-10-21 08:57:00) [1]как-то не стыкуется это
> процесс умирает
и это
> вижу запущенный мной процесс
?
umbra (2005-10-20 18:48:00) [2]Если пользоваться
CreateProcess, то вызывающее ее приложение не может узнать об аварии, поскольку эта функция не дожидается завершения инициализации процесса. Аварийным завершением должна заниматься вызываемая программа
Molchanov (2005-10-20 18:23:00) [3]>объектом синхронизации д.б. hProcess !
Конечно hProcess, опечатка.
Проблема в том, что процесс не завершается. Если я после CreateProcess сразу же вызываю CloseHandle и выхожу из процедуры без ожидания, то вижу запущенный мной процесс Taskmanager'ом.
Пробовал запускать 'cmd /C ' + имя_файла - то же самое + доп. окно.
Как обойти сию засаду?
umbra (2005-10-20 18:14:00) [4]МСДН гласит:
Созданный процесс присутствует в системе до тех пор, пока не завершатся все потоки в процессе и пока все хэндлы процесса и всех его потоков не будут закрыты с помощью функции CloseHandle. С помощью этой функции должныбыть закрыты хэндлы как процесса, так и его основного потока. Эсли в этих хэндлах нет необходимости, лучше всего закрыть их немедленно после создания процесса
Digitman (2005-10-20 18:12:00) [5]
> WaitforSingleObject(ProcessInfo. hThread, 0)
почему hThread ?
объектом синхронизации д.б. hProcess!