AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Parent Prozess ID ermitteln

Ein Thema von charms · begonnen am 29. Dez 2006 · letzter Beitrag vom 7. Jan 2007
Antwort Antwort
charms

Registriert seit: 29. Dez 2006
3 Beiträge
 
Delphi 2006 Enterprise
 
#1

Parent Prozess ID ermitteln

  Alt 29. Dez 2006, 16:05
Hallo zusammen,

ich schreibe gerade an einem Delphi-Programm für Win32 und benötige in meinem Programm die aktuelle Prozess-ID als auch die Prozess-ID des Programms welches mein Programm gestartet hat.
Die aktuelle Prozess-ID bekomme ich ja einfach durch GetCurrentProcessId. Nur leider finde ich keine Möglichkeit die Parent-Prozess-ID zu ermitteln.

Kann mit hierbei jemand helfen oder zumindest einen Ansatzpunkt geben. Ich tappe hier völlig im dunkeln.

Viele Grüße,
Christian
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Parent Prozess ID ermitteln

  Alt 29. Dez 2006, 16:07
Strate deinen Prozess mit MSDN-Library durchsuchenCreateProcess und du bekommst alles, was du benötigst.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
charms

Registriert seit: 29. Dez 2006
3 Beiträge
 
Delphi 2006 Enterprise
 
#3

Re: Parent Prozess ID ermitteln

  Alt 29. Dez 2006, 16:10
Hi,
danke für die Antwort, doch leider habe ich auf das starten keinen einfluss. Mein Programm wird von einem beliebigem Programm heraus gestartet und ich muss nun herausfinden welche Prozess-ID der Aufrufer hat.


Viele Grüße,
Christian
  Mit Zitat antworten Zitat
Benutzerbild von mpth
mpth

Registriert seit: 29. Dez 2006
Ort: Saarbrücken
13 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Parent Prozess ID ermitteln

  Alt 29. Dez 2006, 16:24
das funktioniert wohl nur mit den tool help apis:

Delphi-Quellcode:
...

uses
  tlhelp32;

...

function GetParentProcessID: integer;
var
  h: THandle;
  rec: TProcessEntry32W;
begin
  Result := 0;
  h := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  try
    rec.dwSize := sizeof(rec); // initialisierung
    if Process32FirstW(h, rec) then
    repeat
      if rec.th32ProcessID = GetCurrentProcessID then
      begin
        Result := rec.th32ParentProcessID;
        Break;
      end;
    until not Process32NextW(h, rec);
  finally
    CloseHandle(h);
  end;
end;
hexen ist keine kunst, sondern harte arbeit!
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Parent Prozess ID ermitteln

  Alt 29. Dez 2006, 16:30
Und noch eine Version:
Delphi-Quellcode:
uses
  tlhelp32;

function GetParentID(ID: DWORD; var IDParent: DWORD): DWORD;
var
  hSnapShot: THandle;
  pe32: TProcessEntry32;
begin
  hSnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if hSnapShot <> 0 then
  begin
    pe32.dwSize := sizeof(TProcessEntry32);
    if Process32First(hSnapShot, pe32) then
    begin
      repeat
        if pe32.th32ProcessID = GetCurrentProcessId then
        begin
          IDParent := pe32.th32ParentProcessID;
          break;
        end;
      until Process32Next(hSnapShot, pe32) = False;
    end;
    CloseHandle(hSnapShot);
  end;
  result := GetLastError;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  ParentID: DWORD;
  dwReturn: DWORD;
begin
  dwReturn := GetParentID(GetCurrentProcessId, ParentID);
  if dwReturn = 0 then
    ShowMessage(IntToStr(ParentID))
  else
    ShowMessage(SysErrorMessage(dwReturn));
end;
@mpth: API Funktionen lösen keine Exceptions aus. Das try-finally Konstrukt ist also überflüssig. Und ohne zu prüfen, ob du ein gültiges Handle hast, ist es nicht ratsam in die Schleife zu gehen. Desweiteren vermisse ich bei dir eine Fehlerbehandlung. Ich weiß immer gerne, warum etwas nicht funktioniert hat, wenn ein Fehler aufgetreten ist. Meine Funktion liefert den letzten Systemfehler des Pozesses zurück, den man dann auswerten kann.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von mpth
mpth

Registriert seit: 29. Dez 2006
Ort: Saarbrücken
13 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Parent Prozess ID ermitteln

  Alt 29. Dez 2006, 16:54
Zitat von Luckie:
@mpth: API Funktionen lösen keine Exceptions aus. Das try-finally Konstrukt ist also überflüssig.
sorry, aber ich habe heute schon zu viele snippets gesehen, in denen erzeugen, verwenden und freigeben von objektinstanzen nicht in try...finally gekapselt waren, da bin ich jetzt bei der api etwas übereifrig geworden

Zitat von Luckie:
Und ohne zu prüfen, ob du ein gültiges Handle hast, ist es nicht ratsam in die Schleife zu gehen.
da hast du vollkommen recht... asche über mein haupt

Zitat von Luckie:
Desweiteren vermisse ich bei dir eine Fehlerbehandlung. Ich weiß immer gerne, warum etwas nicht funktioniert hat, wenn ein Fehler aufgetreten ist. Meine Funktion liefert den letzten Systemfehler des Pozesses zurück, den man dann auswerten kann.
aha... wird durch CloseHandle() denn der systemfehler nicht auf 0 gesetzt, sodass etwaige vorangegangene fehler in den tool help-prozessaufrufen gar nicht mehr erst zurückgegeben werden?
hexen ist keine kunst, sondern harte arbeit!
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Parent Prozess ID ermitteln

  Alt 29. Dez 2006, 19:19
Hat ein else gefehlt:
Delphi-Quellcode:
function GetParentID(ID: DWORD; var IDParent: DWORD): DWORD;
var
  hSnapShot: THandle;
  pe32: TProcessEntry32;
begin
  result := 0;
  hSnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if hSnapShot <> 0 then
  begin
    pe32.dwSize := sizeof(TProcessEntry32);
    if Process32First(hSnapShot, pe32) then
    begin
      repeat
        if pe32.th32ProcessID = GetCurrentProcessId then
        begin
          IDParent := pe32.th32ParentProcessID;
          break;
        end;
      until Process32Next(hSnapShot, pe32) = False;
    end;
    CloseHandle(hSnapShot);
  end
  else
    result := GetLastError;
end;
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
charms

Registriert seit: 29. Dez 2006
3 Beiträge
 
Delphi 2006 Enterprise
 
#8

Re: Parent Prozess ID ermitteln

  Alt 4. Jan 2007, 12:17
Hallo zusammen,

super! Beide Prozeduren funktionieren einwandfrei und sind genau das was ich gesucht habe.

Danke euch,

Christian
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#9

Re: Parent Prozess ID ermitteln

  Alt 7. Jan 2007, 07:03
Zitat von Luckie:
@mpth: API Funktionen lösen keine Exceptions aus. Das try-finally Konstrukt ist also überflüssig.
Faszinierende Behauptung, die aber so nicht stehenbleiben kann. Auch wenn die meisten API-Funktionen selber das SEH übernehmen, ist es zumindest dann nicht sinnlos, wenn man selber bspw. mit Heapspeicher rumfummelt. Es ist ja nun nicht gerade so, daß hier nur APIs aufgerufen werden, sondern es gibt ja noch anderen Code. (Zumal es dich im Usermode nicht viel kostet SEH hinzuzufügen. Im Kernelmode mußt du auf die Stackbeschränkungen achten, die deutlich strikter sind.)

Den Rest deiner Bemerkung finde ich da deutlich sinnvoller
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:30 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz