Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.13;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.032 c
14-1129697671
boalse
2005-10-19 08:54
2005.11.13
Час суда и т.п.


6-1122488131
nippo
2005-07-27 22:15
2005.11.13
IMarkupServices::ParseString Method


4-1125041654
user51
2005-08-26 11:34
2005.11.13
блокировка FLASH (сьемного накопителя usb )


6-1122136315
kami
2005-07-23 20:31
2005.11.13
Переслать несколько больших файлов Client/Serv Socket


2-1130222516
Шурик Ш
2005-10-25 10:41
2005.11.13
Есть перемнная типа TForm