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 Erkennen wie Programm gestartet wurde (https://www.delphipraxis.net/109665-erkennen-wie-programm-gestartet-wurde.html)

RavenIV 5. Mär 2008 16:02


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.

Apollonius 5. Mär 2008 16:03

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.

RavenIV 5. Mär 2008 16:06

Re: Erkennen wie Programm gestartet wurde
 
Zitat:

Zitat von Apollonius
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.

Das Programm soll auf verschiedenen PCs laufen, somit scheidet der Parameter im Explorer schonmal aus.

Hast Du da eine konkrete Idee für die ToolsAPI?

mkinzler 5. Mär 2008 16:08

Re: Erkennen wie Programm gestartet wurde
 
Am Besten verwendest du den Parameter für den Batch/Task

RavenIV 5. Mär 2008 16:12

Re: Erkennen wie Programm gestartet wurde
 
Zitat:

Zitat von mkinzler
Am Besten verwendest du den Parameter für den Batch/Task

Wenn dann aber kein Parameter angegeben wird beim Start per batch/cmd/Taskplaner, dann soll eine Fehlermeldung angezeigt werden.

Beim Start per Explorer sollen keine Parameter mitgegeben werden. Dann soll die Applikation normal laufen.

s-off 5. Mär 2008 16:13

Re: Erkennen wie Programm gestartet wurde
 
Such mal nach MSDN-Library durchsuchenProcess32First

RavenIV 5. Mär 2008 16:17

Re: Erkennen wie Programm gestartet wurde
 
Zitat:

Zitat von s-off
Such mal nach MSDN-Library durchsuchenProcess32First

das hilft mir erstmal nicht weiter.

Gibt es nicht so was wie Application.CallingThread oder Application.Caller oder so?

P.S. Feierabend. Morgen geht es weiter. :lol:

Apollonius 5. Mär 2008 16:22

Re: Erkennen wie Programm gestartet wurde
 
Nur Mut, RavenIV: MSDN-Library durchsuchenCreateToolHelp32Snapshot, MSDN-Library durchsuchenProcess32First, MSDN-Library durchsuchenPROCESSENTRY32

rollstuhlfahrer 5. Mär 2008 16:40

Re: Erkennen wie Programm gestartet wurde
 
Process32First geht net. oder hat einer hier Windows CE
Zitat:

Zitat von Microsoft
OS Versions: Windows CE 2.0 and later.
Header: Tlhelp32.h.
Link Library: Toolhelp.lib.

rollstuhlfahrer

s-off 5. Mär 2008 16:42

Re: Erkennen wie Programm gestartet wurde
 
Zitat:

Zitat von rollstuhlfahrer
Process32First geht net. oder hat einer hier Windows CE
Zitat:

Zitat von Microsoft
OS Versions: Windows CE 2.0 and later.
Header: Tlhelp32.h.
Link Library: Toolhelp.lib.

rollstuhlfahrer

Man sollte schon an der richtigen Stelle schauen ;)

sirius 5. Mär 2008 16:43

Re: Erkennen wie Programm gestartet wurde
 
Zitat:

Zitat von rollstuhlfahrer
Process32First geht net. oder hat einer hier Windows CE

rollstuhlfahrer

Schau noch mal genau hin!

rollstuhlfahrer 5. Mär 2008 16:44

Re: Erkennen wie Programm gestartet wurde
 
oups, in der schnelle das Suchergebnis nicht ganz überflogen

sorry

SirThornberry 5. Mär 2008 18:15

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?

RavenIV 6. Mär 2008 07:48

Re: Erkennen wie Programm gestartet wurde
 
Zitat:

Zitat von SirThornberry
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?

Das sind berechtigte Gedanken.
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?

mquadrat 6. Mär 2008 08:00

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.

RavenIV 6. Mär 2008 08:17

Re: Erkennen wie Programm gestartet wurde
 
Zitat:

Zitat von mquadrat
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.

Und Du meinst, das peilen die Leute?
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.

Jelly 6. Mär 2008 09:52

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.

sirius 6. Mär 2008 10:26

Re: Erkennen wie Programm gestartet wurde
 
Zitat:

Zitat von RavenIV
In einem Verzeichnis leigen verschiedene Dateien (*.exe, *.bat, usw.), was wird gestartet? Natürlich die exe, schon nur weil die ein buntes Icon hat.

Wenn du eh schon Batch-Dateien oder ähnliches verwendest, dann kannst du doch in der Batch-Datei einen anderen Parameter übergeben und ohne Parameter (Chef hat die Exe direkt gestartet) gibst du die Fehlermeldung: "Hallo du Saufkopf" aus!

RavenIV 6. Mär 2008 10:43

Re: Erkennen wie Programm gestartet wurde
 
Zitat:

Zitat von sirius
Zitat:

Zitat von RavenIV
In einem Verzeichnis leigen verschiedene Dateien (*.exe, *.bat, usw.), was wird gestartet? Natürlich die exe, schon nur weil die ein buntes Icon hat.

Wenn du eh schon Batch-Dateien oder ähnliches verwendest, dann kannst du doch in der Batch-Datei einen anderen Parameter übergeben und ohne Parameter (Chef hat die Exe direkt gestartet) gibst du die Fehlermeldung: "Hallo du Saufkopf" aus!

Problem nicht verstanden.
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.

bitsetter 6. Mär 2008 12:19

Re: Erkennen wie Programm gestartet wurde
 
Zitat:

Zitat von Apollonius
Oder du verwendest die ToolHelp-Funktionen, um die Prozess-Id des Eltern-Prozesses zu erhalten.

Zitat:

Zitat von RavenIV
Wenn per batch gestartet wird und keine Parameter angegeben werden, nur dann soll ein Fehler angezeigt werden.

Dann ist der Eltern-Prozesses die CMD.EXE bei einem Start aus dem Explorer mit Doppelklick die Explorer.EXE.
Mittels dem Tool Processexplorer kennst du zum Test die Eltern-Prozesse herausfinden.

sirius 6. Mär 2008 12:24

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.

RavenIV 6. Mär 2008 12:48

Re: Erkennen wie Programm gestartet wurde
 
Zitat:

Zitat von sirius
Doch, doch!

Nein, Nein.
Zitat:

Zitat von sirius
Wenn du die Exe startest --> Fehler, weil Exe darf nicht direkt gestartet werden (erkennst du an den fehlenden Parametern)

Falsch erkannt.
Zitat:

Zitat von sirius
Aber ich vertsehe den Kopfstand nicht. Was ist denn so schlimm daran, wenn aus der cmd das Programm normal wie im Explorer gestartet wird.

Das Programm soll ja auch per Explorer-Doppelklick gestartet werden dürfen, ohne Parameter.
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.

sirius 6. Mär 2008 13:03

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.

bitsetter 6. Mär 2008 18:31

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;

BUG 6. Mär 2008 22:36

Re: Erkennen wie Programm gestartet wurde
 
Zitat:

Zitat von bitsetter
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.

Bei welchen Programmen was geschehen soll, ließe sich dann auch einfach in einer INI-Datei unterbringen,
dann ist das Ganze flexibel, falls irgendwann dann doch noch eine Aufrufmöglichkeit dazukommt.

z.B. in der Form:
Code:
[EXPLORER.EXE]
gui=on
params=off
errorlog=off

[CMD.EXE]
gui=off
params=on
errorlog=off

[SVCHOST.EXE]
gui=off
params=on
errorlog=on
MfG,
Bug

EDIT: Mit minimalen Änderungen (TList statt TObjectList und ohne "Contnrs") läuft der Code sogar unter Delphi3 :thumb:

RavenIV 7. Mär 2008 12:32

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 07:28 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