Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Parent Prozess ID ermitteln (https://www.delphipraxis.net/83232-parent-prozess-id-ermitteln.html)

charms 29. Dez 2006 15:05


Parent Prozess ID ermitteln
 
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

Luckie 29. Dez 2006 15:07

Re: Parent Prozess ID ermitteln
 
Strate deinen Prozess mit MSDN-Library durchsuchenCreateProcess und du bekommst alles, was du benötigst.

charms 29. Dez 2006 15:10

Re: Parent Prozess ID ermitteln
 
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

mpth 29. Dez 2006 15:24

Re: Parent Prozess ID ermitteln
 
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;

Luckie 29. Dez 2006 15:30

Re: Parent Prozess ID ermitteln
 
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.

mpth 29. Dez 2006 15:54

Re: Parent Prozess ID ermitteln
 
Zitat:

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 :lol:

Zitat:

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:

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?

Luckie 29. Dez 2006 18:19

Re: Parent Prozess ID ermitteln
 
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;

charms 4. Jan 2007 11:17

Re: Parent Prozess ID ermitteln
 
Hallo zusammen,

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

Danke euch,

Christian

Olli 7. Jan 2007 06:03

Re: Parent Prozess ID ermitteln
 
Zitat:

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 ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:04 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