Форум: "Основная";
Текущий архив: 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