[WIN|LIN] Namen des Parent-Prozesses ermitteln

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
X0r
Beiträge: 2770
Registriert: 15.03.2007 21:47
Kontaktdaten:

[WIN|LIN] Namen des Parent-Prozesses ermitteln

Beitrag von X0r »

Die Idee habe ich von hier: http://www.codeproject.com/KB/threads/ParentPID.aspx
(Nochmal Danke an TomS, der mir den Link zu dieser Seite geschickt hat)

Für Windows:

Code: Alles auswählen

EnableExplicit

Procedure.s GetProcessName(ProcID.i)
  Protected hSnap, ProcEntry.PROCESSENTRY32, result.s
  
  hSnap=CreateToolhelp32Snapshot_(#TH32CS_SNAPPROCESS,0)
  If hSnap
    ProcEntry\dwSize=SizeOf(PROCESSENTRY32)
    If Process32First_(hSnap,@ProcEntry)
      Repeat
        If ProcID=ProcEntry\th32ProcessID
          result=PeekS(@ProcEntry\szExeFile,260,#PB_Ascii)
          Break
        EndIf
      Until Not Process32Next_(hSnap,@ProcEntry)
    EndIf   
    CloseHandle_ (hSnap)
  EndIf
  ProcedureReturn result
EndProcedure


Procedure.s GetParentProcessName()
  Protected hSnap, ProcEntry.PROCESSENTRY32, cProcID=GetCurrentProcessId_(), result.s
  
  hSnap=CreateToolhelp32Snapshot_(#TH32CS_SNAPPROCESS,0)
  If hSnap
    ProcEntry\dwSize=SizeOf(PROCESSENTRY32)
    If Process32First_(hSnap,@ProcEntry)
      Repeat
        If cProcID=ProcEntry\th32ProcessID
          result=GetProcessName(ProcEntry\th32ParentProcessID)
          Break
        EndIf
      Until Not Process32Next_(hSnap,@ProcEntry)
    EndIf   
    CloseHandle_ (hSnap)
  EndIf
  ProcedureReturn result
EndProcedure

Debug GetParentProcessName()
Für Linux (von Marvin):

Code: Alles auswählen

Procedure.s GetParentProcessName()
    fd = ReadFile(-1, "/proc/" + Str(getppid_()) + "/status")
    If Not fd
        ProcedureReturn ""
    EndIf
    Repeat
        line.s = ReadString(fd)
        If Left(line, 5) = "Name:"
            CloseFile(fd)
            ProcedureReturn Mid(line, 7)
        EndIf
    Until Eof(fd)
    CloseFile(fd)
    ProcedureReturn ""
EndProcedure

OpenConsole()
PrintN("Parent: " + GetParentProcessName())
Zuletzt geändert von X0r am 05.02.2010 01:56, insgesamt 2-mal geändert.
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: [WIN] Namen des Parent-Prozesses ermitteln

Beitrag von Josh »

nice, aber unicodeunterstützung wäre vieleicht noch ganz gut :)
Marvin
Beiträge: 497
Registriert: 17.07.2005 14:42
Wohnort: Krikkit

Re: [WIN] Namen des Parent-Prozesses ermitteln

Beitrag von Marvin »

So, und jetzt das ganze für Linux:

Code: Alles auswählen

EnableExplicit

Procedure.s GetParentProcessName()
    Protected.l fd
    Protected.s line
    fd = ReadFile(-1, "/proc/" + Str(getppid_()) + "/status")
    If Not fd
        ProcedureReturn ""
    EndIf
    Repeat
        line.s = ReadString(fd)
        If Left(line, 5) = "Name:"
            CloseFile(fd)
            ProcedureReturn Mid(line, 7)
        EndIf
    Until Eof(fd)
    CloseFile(fd)
    ProcedureReturn ""
EndProcedure

OpenConsole()
PrintN("Parent: " + GetParentProcessName())
EDIT: EnableExplicit
Zuletzt geändert von Marvin am 05.02.2010 22:45, insgesamt 2-mal geändert.
- chris -
Beiträge: 195
Registriert: 24.08.2005 19:52
Wohnort: Stadtallendorf

Re: [WIN] Namen des Parent-Prozesses ermitteln

Beitrag von - chris - »

Mit unicodeunterstützung

Code: Alles auswählen

EnableExplicit

Procedure.s GetProcessName(ProcID.i)
  Protected hSnap, ProcEntry.PROCESSENTRY32, result.s

  hSnap = CreateToolhelp32Snapshot_(#TH32CS_SNAPPROCESS, 0)
  If hSnap
    ProcEntry\dwSize = SizeOf(PROCESSENTRY32)
    If Process32First_(hSnap, @ProcEntry)
      Repeat
        If ProcID = ProcEntry\th32ProcessID
          CompilerIf #PB_Compiler_Unicode
            result = PeekS(@ProcEntry\szExeFile, 260, #PB_Unicode)
          CompilerElse
            result = PeekS(@ProcEntry\szExeFile, 260, #PB_Ascii) 
          CompilerEndIf   
          Break
        EndIf
      Until Not Process32Next_(hSnap, @ProcEntry)
    EndIf
    CloseHandle_(hSnap)
  EndIf
  ProcedureReturn result
EndProcedure

Procedure.s GetParentProcessName()
  Protected hSnap, ProcEntry.PROCESSENTRY32, cProcID, result.s

  cProcID = GetCurrentProcessId_()

  hSnap = CreateToolhelp32Snapshot_(#TH32CS_SNAPPROCESS, 0)
  If hSnap
    ProcEntry\dwSize = SizeOf(PROCESSENTRY32)
    If Process32First_(hSnap, @ProcEntry)
      Repeat
        If cProcID = ProcEntry\th32ProcessID
          result = GetProcessName(ProcEntry\th32ParentProcessID)
          Break
        EndIf
      Until Not Process32Next_(hSnap, @ProcEntry)
    EndIf
    CloseHandle_(hSnap)
  EndIf
  ProcedureReturn result
EndProcedure

Debug GetParentProcessName()
PB v5.72 x86/x64
Windows 10 Pro 64bit
Benutzeravatar
X0r
Beiträge: 2770
Registriert: 15.03.2007 21:47
Kontaktdaten:

Re: [WIN] Namen des Parent-Prozesses ermitteln

Beitrag von X0r »

Sorry - chris -,
aber mein Code läuft auch im Unicode-Modus perfekt, deiner hingegen fehlerhaft.

@Marvin: Hab deinen Code mal meinem 1. Beitrag hinzugefügt. :D
(Wäre aber noch gut, wenn du ihn den hier im Unterforum erwünschten Standards anpassen würdest. Oder soll ich das machen?)
Marvin
Beiträge: 497
Registriert: 17.07.2005 14:42
Wohnort: Krikkit

Re: [WIN|LIN] Namen des Parent-Prozesses ermitteln

Beitrag von Marvin »

X0r hat geschrieben:Hab deinen Code mal meinem 1. Beitrag hinzugefügt.
Ohne, dass ihn jemand außer mir getestet hat? Na, viel Glück. :mrgreen:
X0r hat geschrieben:(Wäre aber noch gut, wenn du ihn den hier im Unterforum erwünschten Standards anpassen würdest. Oder soll ich das machen?)
Meinst du die Einrückung? Na ja, in deinem Post kann ich das ja sowieso nicht anpassen, und für meinen müsste ich erstmal wissen, was genau du meinst. :wink:
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: [WIN|LIN] Namen des Parent-Prozesses ermitteln

Beitrag von Kiffi »

Marvin hat geschrieben:und für meinen müsste ich erstmal wissen, was genau du meinst. :wink:
ne ordentliche Deklaration Deiner Variablen wäre schon
mal ein Schritt in die richtige Richtung ;-)

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
X0r
Beiträge: 2770
Registriert: 15.03.2007 21:47
Kontaktdaten:

Re: [WIN|LIN] Namen des Parent-Prozesses ermitteln

Beitrag von X0r »

ne ordentliche Deklaration Deiner Variablen wäre schon
mal ein Schritt in die richtige Richtung ;-)
Jo. Und auch dieser Teil des Codes ist etwas fragwürdig:

Code: Alles auswählen

If Not fd
        ProcedureReturn ""
    EndIf
Das kannste cleverer lösen. :wink:
Marvin
Beiträge: 497
Registriert: 17.07.2005 14:42
Wohnort: Krikkit

Re: [WIN|LIN] Namen des Parent-Prozesses ermitteln

Beitrag von Marvin »

X0r hat geschrieben:Das kannste cleverer lösen. :wink:
Hm, da steh ich auf dem Schlauch... NULL zurückgeben? RaiseError(#PB_OnError_Breakpoint)?
Benutzeravatar
X0r
Beiträge: 2770
Registriert: 15.03.2007 21:47
Kontaktdaten:

Re: [WIN|LIN] Namen des Parent-Prozesses ermitteln

Beitrag von X0r »

Hm, da steh ich auf dem Schlauch... NULL zurückgeben? RaiseError(#PB_OnError_Breakpoint)?
:mrgreen: ?
Es reicht doch einfach, wenn du

Code: Alles auswählen

if fd
schreibst.

Zudem ist es auch nicht ganz elegant, mitten in der Schleife ProcedureReturn und nochmal CloseFile zu schreiben. Das kannst du ebenfalls cleverer lösen. Schau dir mal meinen Code an.
Antworten