Архив за месяц: Декабрь 2014

Delphi. Получение PID дочернего процесса.

Пишем на Delphi.
Потребовалось найти PPID. Т.е. PID потомка процесса порождающего его.

//******************************************************************************
//функция получает ПИД дочернего процесса , передается ПИД процесса родителя
//******************************************************************************
function Get_PIDchild_process(PIDparent:Cardinal):Cardinal;
var
  HandleSnapShot      : THandle;
  EntryParentProc     : TProcessEntry32;
  fnd: boolean;
begin
result := 0;    //если процесс не существует
HandleSnapShot     := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);//делаем снапшот процессов или чего там (короче диспетчера задач)
EntryParentProc.dwSize := SizeOf(EntryParentProc);     //я так понимаю создаем структуру , этакий шаблон , для получения данных
fnd := Process32First(HandleSnapShot, EntryParentProc); // Находим первый процесс. передавая снапшота в структуру данных
while fnd do // Цыкл перебора всех процессов в системе (снапшоте).
  begin
  if (EntryParentProc.th32ParentProcessID = PIDparent) then   //если найден процеесс у которого родитель его то
    begin
    fnd := false; //заканчиваем цыкл
    result := EntryParentProc.th32ProcessID;  //возвращааем PID процесса потомка
    ShowMessage(inttostr(PIDparent)+'   '+inttostr(EntryParentProc.th32ProcessID)+'   '+EntryParentProc.szExeFile);
    end;
  fnd := Process32Next(HandleSnapShot, EntryParentProc);  // Схожий процесс не найден, продолжаем перебор
  end;
CloseHandle(HandleSnapShot);  // Закрываем наш снепшот.
end;

Прокомментирую, в кратце.
Делаем «снапшот» всех процессов в системе. Создаем структур (массив) — в которую будем передавать снапшот, а дальше просто цыклом перебираем. И тем самым находим по PID родителя PID потока.