![]() |
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:18 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