Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.11.28;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.047 c
8-1093770518
DimOn2
2004-08-29 13:08
2004.11.28
Avi


10-1066399363
val_5
2003-10-17 18:02
2004.11.28
Развертывание 3-х звенн приложения


1-1100192842
novice_man
2004-11-11 20:07
2004.11.28
Access violation at adress ...


14-1100018313
ОлегЪ
2004-11-09 19:38
2004.11.28
Новые программки...


8-1093499666
widoms
2004-08-26 09:54
2004.11.28
Хранение изображений.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский