Вывод дочерних процессов на Delphi7
Программа, которая выводит на экран список всех процессов и наименования дочерних процессов для каждого процесса. - Это ТЗ.
С выводом всех процессов разобрался, а как вывести наименования дочерних процессов не пойму. Искал, если что, везде, могу определить являться ли он родительским) Но это не то.
Помогите, пожалуйста, объяснить или кусок кода привести
Заранее спасибо большое
Кусок получение всех процессов.
procedure TForm1.OnCreate(Sender: TObject);
VAR
x,code:Integer;
s:String;
begin
StringGrid1.Cells[0,0]:='#';
StringGrid1.Cells[1,0]:='Name file';
StringGrid1.Cells[2,0]:='Process ID';
StringGrid1.Cells[3,0]:='Number of threads';
StringGrid1.Cells[4,0]:='Base Priority';
pe32.dwSize:=SizeOf(tProcessEntry32);
x:=1;
hProcess:=CreateToolhelp32SnapShot(TH32CS_SNAPPROCESS,0);
Process32First(hProcess,pe32);
{ str(pe32.th32ProcessID,StringGrid1.Cells[2,x]);
val(StringGrid1.Cells[2,x],pe32.th32ProcessID,code);}
str(pe32.th32ProcessID,s);
val(s,pe32.th32ProcessID,code);
Repeat
StringGrid1.Cells[0,x]:=IntToStr(x);
StringGrid1.Cells[1,x]:=pe32.szExeFile;
StringGrid1.Cells[2,x]:=IntToStr(pe32.th32ProcessID);
StringGrid1.Cells[3,x]:=IntToStr(pe32.cntThreads);
StringGrid1.Cells[4,x]:=IntToStr(pe32.pcpriClassBase);
x:=x+1;
StringGrid1.RowCount:=x;
until Process32Next(hProcess,pe32)=False;
end;
UPD. Решение:
procedure TForm1.Button4Click(Sender: TObject);
var
Snapshot: Windows.THandle;
PE: TlHelp32.TProcessEntry32;
EndOfList: Boolean;
Result, po, PID:string;
begin
memo1.Clear;
PID:= Edit1.Text;
Result := '';
Snapshot := TlHelp32.CreateToolHelp32SnapShot(TlHelp32.TH32CS_SNAPPROCESS, 0);
PE.dwSize := SizeOf(PE);
EndOfList := not TlHelp32.Process32First(Snapshot, PE);
while not EndOfList do begin
str(PE.th32ParentProcessID,po);
if po = PID then begin
memo1.Lines.Add(PE.szExeFile);
end;
EndOfList := not TlHelp32.Process32Next(Snapshot, PE);
end;
end;
Ответы (1 шт):
Получили список процессов, в котором в описании процесса имеются PID свой th32ProcessID, и родительский th32ParentProcessID.
Для каждого процесса с th32ProcessID=XXX ищете в списке другие процессы, у которых th32ParentProcessID совпадает c XXX, добавляете их в список его детей.
Количество процессов не слишком велико, от десятков до сотен, поэтому такого примитивного поиска достаточно.