Autor Beitrag
Frankieboy
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 65



BeitragVerfasst: Di 13.07.10 13:25 
Hallo,

habe mal wieder eine Frage:
Wie bekommt man beim eigenen Programm raus, ob es von einem anderen Programm gestartet wurde und wenn ja von welchem, oder ob es der Benutzer direkt (z.B. über den Explorer) aufgerufen hat?

Danke schon mal für die tolle Hilfe im Forum,

viele Grüße,

Frank


Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Di 13.07.2010 um 14:26
Moderiert von user profile iconNarses: Titel erweitert.
SAiBOT
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 323
Erhaltene Danke: 6

XP SP2; 7
D7; D2009
BeitragVerfasst: Di 13.07.10 19:07 
AFAIK geht das nur, wenn deine Awendung eine ParentProcessID aufweisen kann.
Suche im MSDN PROCESS32FIRST, Suche im MSDN PROCESS32NEXT

_________________
Debuggers don't remove bugs, they only show them in slow-motion.


Zuletzt bearbeitet von SAiBOT am Do 22.07.10 18:41, insgesamt 1-mal bearbeitet
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19313
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 13.07.10 19:10 
Abzufragen geht das auch bequem über WMI (Win32_Process):
msdn.microsoft.com/e...ibrary/aa394372.aspx
Gerd Kayser
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: Mi 14.07.10 13:37 
Beispiel:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
// uses TlHelp32;
procedure TForm1.Button1Click(Sender: TObject);
var 
  PE_Exe    : TProcessEntry32;
  PE_Parent : TProcessEntry32;
  HProcList : THandle;
  ExeName   : string;
  HExe      : THandle;
begin
  ExeName := ExtractFileName(Application.ExeName); 
  HExe := GetCurrentProcessID;
  PE_Exe.dwSize := SizeOf(TProcessEntry32);
  PE_Parent.dwSize := SizeOf(TProcessEntry32);

  // Schnapschuss der aktuellen Prozess-Liste
  HProcList := CreateToolHelp32SnapShot(TH32CS_SnapAll, 0);

  // eigenen Prozess finden
  Process32First(HProcList, PE_Exe);
  repeat
  until (PE_Exe.th32ProcessID = HExe)
    or (not Process32Next(HProcList, PE_Exe));

  // Prozess suchen, der den eigenen Prozess gestartet hat
  Process32First(HProcList, PE_Parent);
  repeat
  until (PE_Parent.th32ProcessID = PE_Exe.th32ParentProcessID)
    or (not Process32Next(HProcList, PE_Parent));

  // Parent-Prozess existiert noch und trägt einen anderen Namen als die Exe
  if (UpperCase(PE_Parent.szExeFile) <> UpperCase(ExeName)) then
    ShowMessage('Programm wurde von ' + PE_Parent.szExeFile + ' gestartet.')
  else
  // Entweder Parent-Prozess nicht mehr verfügbar
  // (dann wird der Name der eigenen Exe zurück gegeben)
    if (PE_Exe.th32ProcessID = PE_Parent.th32ProcessID) then
      ShowMessage('Aufrufender Prozess nicht mehr feststellbar.')
    else
  // oder Parent-Prozess existiert noch, hat aber den gleichen Namen
  // (z. B. Parent-Name = Project1 und Exe-Name = Project1).
      ShowMessage('Programm wurde von ' + PE_Parent.szExeFile + ' gestartet.');

  CloseHandle(HProcList);
end;

Edit1: CloseHandle nachgetragen.
Edit2: Suchen des eigenen Prozesses auf ProcessID umgestellt. Falls mehrere Programme mit dem gleichen Namen laufen, wird jetzt immer der richtige Prozess ermittelt.