Форум: "Начинающим";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];
ВнизCreateProcess Найти похожие ветки
← →
Molchanov (2005-10-20 18:03) [0]Запускаю 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-20 18:12) [1]
> WaitforSingleObject(ProcessInfo.hThread, 0)
почему hThread ?
объектом синхронизации д.б. hProcess !
← →
umbra © (2005-10-20 18:14) [2]МСДН гласит:
Созданный процесс присутствует в системе до тех пор, пока не завершатся все потоки в процессе и пока все хэндлы процесса и всех его потоков не будут закрыты с помощью функции CloseHandle. С помощью этой функции должны быть закрыты хэндлы как процесса, так и его основного потока. Эсли в этих хэндлах нет необходимости, лучше всего закрыть их немедленно после создания процесса
← →
Molchanov (2005-10-20 18:23) [3]>объектом синхронизации д.б. hProcess !
Конечно hProcess, опечатка.
Проблема в том, что процесс не завершается. Если я после CreateProcess сразу же вызываю CloseHandle и выхожу из процедуры без ожидания, то вижу запущенный мной процесс Taskmanager"ом.
Пробовал запускать "cmd /C " + имя_файла - то же самое + доп. окно.
Как обойти сию засаду?
← →
umbra © (2005-10-20 18:48) [4]Если пользоваться
CreateProcess
, то вызывающее ее приложение не может узнать об аварии, поскольку эта функция не дожидается завершения инициализации процесса. Аварийным завершением должна заниматься вызываемая программа
← →
Digitman © (2005-10-21 08:57) [5]как-то не стыкуется это
> процесс умирает
и это
> вижу запущенный мной процесс
?
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.039 c