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

Вниз

Отловить закрытие процесса   Найти похожие ветки 

 
Dmitry   (2004-11-12 23:35) [0]

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


 
KilkennyCat ©   (2004-11-12 23:36) [1]

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


 
GuAV ©   (2004-11-12 23:48) [2]

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


 
GuAV ©   (2004-11-13 00:23) [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-13 00:32) [4]

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

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


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


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

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

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



Страницы: 1 вся ветка

Текущий архив: 2004.11.28;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.037 c
3-1099136559
Black
2004-10-30 15:42
2004.11.28
Проверка элемента базы на пустоту


14-1099847186
Undert
2004-11-07 20:06
2004.11.28
Помогите пожалуйста с SQL запросом


14-1099976334
Defunct
2004-11-09 07:58
2004.11.28
разговаривать на любые отвлеченные темы


1-1100351083
Norfolk
2004-11-13 16:04
2004.11.28
Стандартные сообщения


3-1099197241
ali_t
2004-10-31 07:34
2004.11.28
размер колонок в TDBGrid