Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Отловить закрытие процесса [D6, WinXP]


Dmitry ©   (2004-11-12 23:35:00) 

Создаю процесс функцией CreateProcess, который в свою очередь создает другой процесс и сразу же (первый) закрывается. Как отловить закрытие второго процесса?


GuAV   (2004-11-13 00:54:00) [1]

GuAV ©   (13.11.04 0:23) [3]
WaitForInputIdle

WaitForSingleObject ес-сно... это типа Ctrl+C - Ctrl+V error :)


GuAV   (2004-11-13 00:32:00) [2]

GuAV ©   (13.11.04 0:23) [3]
if Process32First(SS, PE) then
try

точнее наоборот
try
  if Process32First(SS, PE) then


Возможны и другие баги, но идея думаю понятна.


GuAV   (2004-11-13 00:23:00) [3]

[2] попробовал - получилось. вот мой код:
uses TlHelp32;

procedure TForm1.Button1Click(Sender: TObject);
var
SI: TStartupInfo;
PI: TProcessInformation;
SS: THandle;
PE: TProcessEntry32;
Id: DWORD;
hProcess: THandle;
begin
 FillChar(SI, SizeOf(SI), 0);
 SI.cb:=SizeOf(SI);
 if not CreateProcess(nil, 'PROCESS1.EXE', nil,
   nil, False, 0, nil, nil, SI, PI) then
   RaiseLastOSError;
 CloseHandle(PI.hThread);
 WaitForInputIdle(PI.hProcess, INFINITE);
 CloseHandle(PI.hProcess);
 SS := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 if SS = INVALID_HANDLE_VALUE then
   RaiseLastOSError;
 Id := 0;
 if Process32First(SS, PE) then
 try
   repeat
     if PE.th32ParentProcessID = PI.dwProcessId then
     begin
       Id := PE.th32ProcessID;
       {SetLastError(ERROR_NO_MORE_FILES);}
       Break;
     end;
   until not Process32Next(SS, PE);
   if Id = 0 then
   {if GetLastError <>  ERROR_NO_MORE_FILES then}
     RaiseLastOSError;
 finally
   CloseHandle(SS);
 end;
 hProcess := OpenProcess(PROCESS_ALL_ACCESS, False, Id);
 if hProcess = 0 then RaiseLastOSError;
 WaitForSingleObject(hProcess, INFINITE);
 ShowMessage('Process 2 closed');
 CloseHandle(hProcess);
end;


GuAV   (2004-11-12 23:48:00) [4]

Не уверен, но возможно так:
После завершения первого процесса, имея его ProcessId использовать функции из модуля TlHelp32 для перебора всех процессов, искать процесс у которого в PROCESSENTRY32 th32ParentProcessID равен ProcessId первого процесса.


KilkennyCat   (2004-11-12 23:36:00) [5]

передать дескриптор второго процесса родителю первого.


Наверх

Титульная страница Поиск, карта сайта Написать письмо