Вывод дочерних процессов на 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 шт):

Автор решения: MBo

Получили список процессов, в котором в описании процесса имеются PID свой th32ProcessID, и родительский th32ParentProcessID.

Для каждого процесса с th32ProcessID=XXX ищете в списке другие процессы, у которых th32ParentProcessID совпадает c XXX, добавляете их в список его детей.

Количество процессов не слишком велико, от десятков до сотен, поэтому такого примитивного поиска достаточно.

→ Ссылка