Delphi-PRAXiS
Seite 3 von 3     123   

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)

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:25 Uhr.
Seite 3 von 3     123   

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