![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Отловить закрытие процесса [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]передать дескриптор второго процесса родителю первого.