![]() |
Erkennen wie Programm gestartet wurde
Hallo
Kann ich irgendwie ermitteln, wie mein Programm gestartet wurde? Hintergrund: Ich habe ein Programm, das sich anderst verhalten soll, wenn es im Explorer mit Doppelklick gestartet wird und wenn es per Batch oder cmd oder Taskplaner gestartet wurde. Wenn es per Doppelklick gestartet wird, soll Form1 angezeigt werden. Bei Start per batch oder cmd oder Taskplaner soll man Parameter mitgeben müssen, nun soll direkt Form2 angezeigt werden. Wenn dann keine Parameter angegeben sind, soll eine Fehlermeldung kommen. Danke schon mal. |
Re: Erkennen wie Programm gestartet wurde
Du könntest aus dem Explorer einen bestimmten Parameter mitgeben.
Oder du verwendest die ToolHelp-Funktionen, um die Prozess-Id des Eltern-Prozesses zu erhalten. |
Re: Erkennen wie Programm gestartet wurde
Zitat:
Hast Du da eine konkrete Idee für die ToolsAPI? |
Re: Erkennen wie Programm gestartet wurde
Am Besten verwendest du den Parameter für den Batch/Task
|
Re: Erkennen wie Programm gestartet wurde
Zitat:
Beim Start per Explorer sollen keine Parameter mitgegeben werden. Dann soll die Applikation normal laufen. |
Re: Erkennen wie Programm gestartet wurde
Such mal nach
![]() |
Re: Erkennen wie Programm gestartet wurde
Zitat:
Gibt es nicht so was wie Application.CallingThread oder Application.Caller oder so? P.S. Feierabend. Morgen geht es weiter. :lol: |
Re: Erkennen wie Programm gestartet wurde
|
Re: Erkennen wie Programm gestartet wurde
Process32First geht net. oder hat einer hier Windows CE
Zitat:
|
Re: Erkennen wie Programm gestartet wurde
Zitat:
![]() |
Re: Erkennen wie Programm gestartet wurde
Zitat:
![]() |
Re: Erkennen wie Programm gestartet wurde
oups, in der schnelle das Suchergebnis nicht ganz überflogen
sorry |
Re: Erkennen wie Programm gestartet wurde
Ich finde du solltest dein Konzept nochmal überdenken. Was passiert denn wenn ich das Programm über den TotalCommander oder einen anderen Dateimanager starte? bekomme ich dann die Batch-Version oder die Explorer-Version? Und was passiert wenn ich das Programm nicht über Start->Ausführen starte sondern durch ein anderes Programm? Und was passiert wenn ich es nicht per cmd/batch starte sondern mit einer alternativen cmd-shell?
|
Re: Erkennen wie Programm gestartet wurde
Zitat:
Aber das Tool wird nur intern in unserer Firma eingesetzt. Und hier ist ganz klar definiert, welche Software auf einem Rechner drauf sein darf / muss und welche nicht. Total-Commander oder cmd-Clones sind nicht auf der whitelist drauf. Die Applikation wird mit diesen Möglichkeiten gestartet: - Doppelklick im Explorer (immer ohne Parameter) - aus der cmd.exe (mit Parameter, sonst Fehlermeldung) - aus dem Taskplaner (mit Parameter, sonst Fehler-Eintrag ins Logfile) Wie kann ich nun auf elegante Art die Weise des Startens herausfinden? |
Re: Erkennen wie Programm gestartet wurde
Wie wär's wenn du die Exe überhaupt nicht direkt startest? Nimm doch für jeden der drei Fälle eine Batch-Datei, die dann die Exe mit unterschiedlichen Parametern startet.
|
Re: Erkennen wie Programm gestartet wurde
Zitat:
Dann kennst Du meine Kollegen (vor allem den Chef) nicht. In einem Verzeichnis leigen verschiedene Dateien (*.exe, *.bat, usw.), was wird gestartet? Natürlich die exe, schon nur weil die ein buntes Icon hat. |
Re: Erkennen wie Programm gestartet wurde
Du könntest auch eine Dateierweiterung im Explorer registrieren, in deinem Fall 3 unterschiedliche. Je nach Erweiterung wird dann dein Programm mit unterschiedlichen Parametern gestartet. Dein Programm selbst (also die EXE) legst du irgendwo unter Program Files ab. Verteilen tust du dann nur die "Dokumente" mit deiner Dateierweiterung. Du kannst schöne bunte Icons hinterlegen, alles was du willst.
|
Re: Erkennen wie Programm gestartet wurde
Zitat:
|
Re: Erkennen wie Programm gestartet wurde
Zitat:
Man soll es auch per Doppelklick starten können. Wenn per batch gestartet wird und keine Parameter angegeben werden, nur dann soll ein Fehler angezeigt werden. |
Re: Erkennen wie Programm gestartet wurde
Zitat:
Zitat:
Mittels dem Tool Processexplorer kennst du zum Test die Eltern-Prozesse herausfinden. |
Re: Erkennen wie Programm gestartet wurde
Doch, doch!
Wenn du die Exe startest --> Fehler, weil Exe darf nicht direkt gestartet werden (erkennst du an den fehlenden Parametern) Wenn du über ein Batch startest nimmst du alle Parameter, schiebst vorne noch einen zusätzlichen Parameter ein (über Batch gestartet) und kannst dann in der EXE alle Parameter auswerten. Du hast jetzt zwei Fehlerfälle: -Variante 1 (für cmd und Taskplaner) Batch 1 (also Programm) ohne Parameter gestartet --> Fehlemeldung wegen fehlenden Parametern -Variante 2 (Batch2 über/oder Verknüpfung im Explorer starten) Batch 2 schiebt einen Standard(alibi-)parameter rein und Programm startet normal -Variante 3 Exe wird direkt gestartet -> keine Parameter vorhanden -> Fehlermeldung, dass dieses Programm nicht direkt gestartet werden kann Aber ich vertsehe den Kopfstand nicht. Was ist denn so schlimm daran, wenn aus der cmd das Programm normal wie im Explorer gestartet wird. |
Re: Erkennen wie Programm gestartet wurde
Zitat:
Zitat:
Zitat:
Dann kommt eben die normale Programmoberfläche und der Benutzer kann auswählen, was er machen will. Wenn es per Batch oder Taskplaner gestartet wird MÜSSEN Parameter mitgegeben werden. Dann wir sofort der Konvertierungsprozess gestartet ohne Programmoberfläche. Wenn hier kein Parameter angegeben wird, würde die Programmoberfläche starten und nicht die jeweilige Konvertierung. Das käme natürlich blöd, weil um 02:00 Uhr keiner mehr am Server sitzt und dann weiterklicken könnte. |
Re: Erkennen wie Programm gestartet wurde
Du verstehst mich nicht :cry:
Du hast nachher je eine runme.bat //für den Explorer (oder auch runme.exe) _cmd.bat _taskplaner.bat Und natürlich dein Programm.exe Das Programm direkt zu starten ist generell verboten (kein Parameter). Die runme.bat übergibt einfach einen runme Parameter und gut ist, dann weißt du der start kam aus dem Explorer. Usw. usf. Aber trotz alledem, es ist nur ein Alternativvorschlag zu Process32first/Next, was ich hierfür besser finde. |
Re: Erkennen wie Programm gestartet wurde
Mit Hilfe der Funktion CreateToolHelp32Snapshot sollte es eigentlich funktionieren. Wenn man die Anwendung über den Explorer startet, ist der übergeordnete Process EXPLORER.EXE bei batch oder cmd CMD.EXE und beim Taskplaner SVCHOST.EXE.
Delphi-Quellcode:
uses
TlHelp32, Contnrs; type TProcInfoItem = class private Fth32ProcessID: cardinal; FParentExeName: AnsiString; public property Th32ProcessID: cardinal read Fth32ProcessID write Fth32ProcessID; property ParentExeName: AnsiString read FParentExeName write FParentExeName; end; function TForm1.GetParentProcessExeName: AnsiString; var hProcSnap: THandle; Proc32: TProcessEntry32; i: integer; ProcInfoList: TObjectList; ProcItem: TProcInfoItem; CurrentProcId: Cardinal; begin Result:= ''; CurrentProcId:= GetCurrentProcessId; ProcInfoList:= TObjectList.Create; try hProcSnap := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hProcSnap > 0) and (hProcSnap <> INVALID_HANDLE_VALUE) then try ZeroMemory(@Proc32, SizeOf(TProcessEntry32)); Proc32.dwSize := SizeOf(TProcessEntry32); if Process32First(hProcSnap, Proc32) then repeat ProcItem:= TProcInfoItem.Create; ProcItem.Th32ProcessID:= Proc32.th32ProcessID; ProcItem.ParentExeName:= ExtractFileName(Proc32.szExeFile); ProcInfoList.Add(ProcItem); until not Process32Next(hProcSnap, Proc32) or (CurrentProcId= Proc32.th32ProcessID); finally CloseHandle(hProcSnap); end; for i:= ProcInfoList.Count- 1 downto 0 do if TProcInfoItem(ProcInfoList.Items[i]).th32ProcessID= Proc32.th32ParentProcessID then begin Result:= TProcInfoItem(ProcInfoList.Items[i]).ParentExeName; break; end; finally ProcInfoList.Free; end; end; procedure TForm1.FormCreate(Sender: TObject); begin ShowMessage(GetParentProcessExeName); end; |
Re: Erkennen wie Programm gestartet wurde
Zitat:
dann ist das Ganze flexibel, falls irgendwann dann doch noch eine Aufrufmöglichkeit dazukommt. z.B. in der Form:
Code:
MfG,
[EXPLORER.EXE]
gui=on params=off errorlog=off [CMD.EXE] gui=off params=on errorlog=off [SVCHOST.EXE] gui=off params=on errorlog=on Bug EDIT: Mit minimalen Änderungen (TList statt TObjectList und ohne "Contnrs") läuft der Code sogar unter Delphi3 :thumb: |
Re: Erkennen wie Programm gestartet wurde
Ich habes jetzt mit der Function "GetParentProcessExeName" von bitsetter gelöst.
Funktioniert bestens. Vielen Dank. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:16 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz