Конференция "WinAPI" » Проверить существование родительского процесса [D7, WinXP]
 
  • lexi (19.06.10 16:12) [0]
    Подскажите как можно это сделать? На ум приходит разве что проверка времени..

    Сам родительский процесс ищется стандартно, через CreateToolhelp32Snapshot и th32ParentProcessID
  • sniknik © (19.06.10 18:26) [1]
    > Сам родительский процесс ищется стандартно ...
    т.е. найти свой по текущему id и вытащить из информации о нем id родителя проблем не представляет, а вот попытаться найти по вытащенному id процесс и посмотреть находит его или нет проблема? ... жуть, и вам хватает наглости писать в винапи, а не в начинающие.
  • [true]trix © (19.06.10 18:54) [2]
    Что-то типа того, погугри инет по этому коду.

    function GetProcessModules(hWind:thandle;ProcName : String;
    FullPath : Boolean;
    IncludeData : Boolean) : TStringList;
    var
    s : String;
    Found : Boolean;
    Done : Boolean;
    AList : TStringList;
    ProcHandle : THandle;
    ModHandle : THandle;
    AProcEntry : TProcessEntry32;
    AModEntry : TModuleEntry32;

    begin
    AList := TStringList.Create;
    Result := AList;
    AList.Sorted := True;

    ProcHandle := CreateToolHelp32Snapshot
    (TH32CS_SNAPALL, 0);
    if ProcHandle = -1 then Exit;

    AProcEntry.dwSize := sizeof(TProcessEntry32);
    AModEntry.dwSize := sizeof(TModuleEntry32);

    if Process32First(ProcHandle, AProcEntry)
     then begin
           { Просматриваем процессы, пока не будет
           найдено совпадение http://www.chipdisk.ru }

           Found :=
    UpperCase(AProcEntry.szExeFile) =
    UpperCase(ProcName);
           if not Found
            then repeat
    Done := not Process32Next(ProcHandle, AProcEntry);
    if not Done
    then Found := UpperCase(AProcEntry.szExeFile) =
                                 UpperCase(ProcName);
                 until Done or Found;

           if Found
            then begin
    ModHandle :=
     CreateToolHelp32Snapshot(TH32CS_SNAPMODULE,
    AProcEntry.th32ProcessID);
    if Module32First(ModHandle, AModEntry)
    then begin
    { Обработка первого модуля первого http://byteme.ru процесса }
          if IncludeData
           then s := '' +
    IntToStr(AModEntry.GlblcntUsage)
           else s := '';

          if FullPath
           then s := AModEntry.szExePath + s
           else s := AModEntry.szModule + s;
         AList.Add(s);
          { Обработка остальных модулей
            первого процесса }

    while Module32Next(ModHandle, AModEntry) do
           begin
            if IncludeData
             then s := '' +
    IntToStr(AModEntry.GlblcntUsage)
                            else s := '';

    if FullPath
    then s := AModEntry.szExePath + s
    else s := AModEntry.szModule + s;
    AList.Add(s);
    writeln(s);
      end;
    end;
                  CloseHandle(ModHandle);

                 end;
          end;
    CloseHandle(ProcHandle);
    end;

  • lexi (19.06.10 20:12) [3]
    @sniknik
    Насколько я помню, Id не уникальны. И после закрытия родительского процесса этот Id может оказаться у другого, нового процесса.
  • lexi (19.06.10 20:22) [4]
    @[true]trix
    Ok, буду проверять ещё и по имени. Спасибо.
  • sniknik © (20.06.10 11:07) [5]
    > Id не уникальны.
    не уникальны... в общем. но в частности не выдается дубль используемого, т.к. иначе не возможно будет построить правильно дерево процессов. а оно системой используется. ну, это насколько я помню.

    > И после закрытия родительского процесса этот Id может оказаться у другого, нового процесса.
    не может, т.к. занят системой, вот когда ты и свою закроешь и освободишь его, тогда пожалуйста...

    > Ok, буду проверять ещё и по имени. Спасибо.
    данный пример не рабочий в 64битной среде. так для информации.
  • Посторонний (20.06.10 16:29) [6]

    > а оно системой используется.


    не используется
  • sniknik © (20.06.10 16:46) [7]
    > не используется
    зачем голословные утверждения? просто приведи пример дубля id процесса выделенного системой до того как освободится старый. и все, спор умрет не родившись.
  • Посторонний (20.06.10 17:49) [8]
    sniknik ©   (20.06.10 16:46) [7]

    То, что дерево не используется, не влечет за собой дублирования ID процессов. Читай уже Соломона с Руссиновичем
 
Конференция "WinAPI" » Проверить существование родительского процесса [D7, WinXP]
Есть новые Нет новых   [134431   +11][b:0][p:0.002]