Главная страница
    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.036 c
1-1100291712
Dmitry
2004-11-12 23:35
2004.11.28
Отловить закрытие процесса


9-1090864227
RyDmi
2004-07-26 21:50
2004.11.28
Как делать анимированные спрайты?


4-1097843275
Charly22
2004-10-15 16:27
2004.11.28
Скрытые ключи реестра


14-1100427297
Кириешки
2004-11-14 13:14
2004.11.28
Перезагружается комп!!!!!!!


14-1099994659
YurikGL
2004-11-09 13:04
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский