AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Erkennen wie Programm gestartet wurde
Thema durchsuchen
Ansicht
Themen-Optionen

Erkennen wie Programm gestartet wurde

Ein Thema von RavenIV · begonnen am 5. Mär 2008 · letzter Beitrag vom 7. Mär 2008
Antwort Antwort
Seite 3 von 3     123   
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#21

Re: Erkennen wie Programm gestartet wurde

  Alt 6. Mär 2008, 13:24
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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von RavenIV
RavenIV

Registriert seit: 12. Jan 2005
Ort: Waldshut-Tiengen
2.875 Beiträge
 
Delphi 2007 Enterprise
 
#22

Re: Erkennen wie Programm gestartet wurde

  Alt 6. Mär 2008, 13:48
Zitat von sirius:
Doch, doch!
Nein, Nein.
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 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.
Klaus E.
Linux - das längste Text-Adventure aller Zeiten...
Wer nie Linux mit dem vi konfiguriert hat, der hat am Leben vorbei geklickt.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#23

Re: Erkennen wie Programm gestartet wurde

  Alt 6. Mär 2008, 14:03
Du verstehst mich nicht

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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von bitsetter
bitsetter

Registriert seit: 17. Jan 2007
1.169 Beiträge
 
Turbo Delphi für Win32
 
#24

Re: Erkennen wie Programm gestartet wurde

  Alt 6. Mär 2008, 19:31
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;
Gruß bitsetter
"Viele Wege führen nach Rom"
Wolfgang Mocker (geb. 1954), dt. Satiriker und Aphoristiker
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#25

Re: Erkennen wie Programm gestartet wurde

  Alt 6. Mär 2008, 23:36
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
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.
  Mit Zitat antworten Zitat
Benutzerbild von RavenIV
RavenIV

Registriert seit: 12. Jan 2005
Ort: Waldshut-Tiengen
2.875 Beiträge
 
Delphi 2007 Enterprise
 
#26

Re: Erkennen wie Programm gestartet wurde

  Alt 7. Mär 2008, 13:32
Ich habes jetzt mit der Function "GetParentProcessExeName" von bitsetter gelöst.
Funktioniert bestens.

Vielen Dank.
Klaus E.
Linux - das längste Text-Adventure aller Zeiten...
Wer nie Linux mit dem vi konfiguriert hat, der hat am Leben vorbei geklickt.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:54 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