Главная страница
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.066 c
14-1129621622
Ищущий
2005-10-18 11:47
2005.11.13
DJVU


14-1129361812
Anton_Uz
2005-10-15 11:36
2005.11.13
Компоненты


9-1120154182
cherep36
2005-06-30 21:56
2005.11.13
GLScene


3-1128239095
elysee
2005-10-02 11:44
2005.11.13
Формат CSV(MS-DOS)


11-1111437864
thaddy
2005-03-21 23:44
2005.11.13
for stals