AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Fehler in RunProcess Funktion?!

Ein Thema von alleinherrscher · begonnen am 2. Dez 2009 · letzter Beitrag vom 2. Dez 2009
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von alleinherrscher
alleinherrscher

Registriert seit: 8. Jul 2004
Ort: Aachen
797 Beiträge
 
Delphi XE2 Professional
 
#1

Fehler in RunProcess Funktion?!

  Alt 2. Dez 2009, 10:52
Hi@all!

Ich versuche gerade für einen Kunden ein Programm zu schreiben, was neben anderen hauptaufgaben versuchen soll, einen anderen Prozess zu überwachen, ob dieser ausgeführt wird. Dabei überprüfe ich 1 innerhalb eines vorgegebenen Zeitraums, ob das Prozesshandle =0 ist, und falls dem so ist, benutze ich die "RunProcess" Funktion aus dem Forum hier, um den Prozess neuzustarten:

Delphi-Quellcode:
function RunProcess(FileName: string; ShowCmd: DWORD; wait: Boolean; ProcID: PCardinal): Longword;
var
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
begin
  FillChar(StartupInfo, SizeOf(StartupInfo), #0);
  StartupInfo.cb := SizeOf(StartupInfo);
  StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK;
  StartupInfo.wShowWindow := ShowCmd;
  if not CreateProcess(nil,
    @Filename[1],
    nil,
    nil,
    False,
    CREATE_NEW_CONSOLE or
    NORMAL_PRIORITY_CLASS,
    nil,
    nil,
    StartupInfo,
    ProcessInfo)
    then
      Result := WAIT_FAILED
  else
  begin
    if wait = FALSE then
    begin
      if ProcID <> nil then ProcID^ := ProcessInfo.dwProcessId;
      exit;
    end;
    WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
    GetExitCodeProcess(ProcessInfo.hProcess, Result);
  end;
  if ProcessInfo.hProcess <> 0 then
    CloseHandle(ProcessInfo.hProcess);
  if ProcessInfo.hThread <> 0 then
    CloseHandle(ProcessInfo.hThread);
end;
Dabei habe ich folgendes Verhalten festgestellt: Wenn CreateProcess nicht erfolgreich war und "False" zurückgibt (bei mir simuliert durch einen falschen Dateinamen), bekomme ich eine Exception in der Zeile "CloseHandle(ProcessInfo.hProcess)".

Wäre es nicht richtiger, die beiden "CloseHandles" nur dann aufzurufen, wenn das CreateProcess zuvor ein "True" zurückgegeben hat?

Viele Grüße und besten Dank,

Euer Michael
„Software wird schneller langsamer als Hardware schneller wird. “ (Niklaus Wirth, 1995)

Mein Netzwerktool: Lan.FS
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.115 Beiträge
 
Delphi 12 Athens
 
#2

Re: Fehler in RunProcess Funktion?!

  Alt 2. Dez 2009, 10:58
Eigentlich hatte ich es noch nie erlebt, daß CloseHandle eine Exception wirft

Aber bevor man hier erstmal weiter rumspielt:
Bist du sicher, daß diese Funktion überhaupt für dich von nutzen ist?

Es wird hier ja gewartet, bis sich der andere Prozess beendet hat, was für eine Überwachung doch nicht so vorteilhaft sein sollte.

ganz übersehn, daß man dieses abschalten kann

bin gleich zurück

[edit]
so,
- das fehlende Result wird gesetzt
- die Handles werden korrekt und vorallem IMMER geschlossen (im Original wurde das oftmals vergessen)
Delphi-Quellcode:
function RunProcess(const FileName: string; ShowCmd: LongWord; Wait: Boolean; ProcessID: PLongWord = nil): LongWord;
var
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
begin
  ZeroMemory(@StartupInfo, SizeOf(StartupInfo));
  StartupInfo.cb := SizeOf(StartupInfo);
  StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK;
  StartupInfo.wShowWindow := ShowCmd;
  if CreateProcess(nil, PChar(Filename), nil, nil, False,
      CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil,
      StartupInfo, ProcessInfo) then
  begin
    try
      CloseHandle(ProcessInfo.hThread);
      if Wait then
      begin
        WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
        GetExitCodeProcess(ProcessInfo.hProcess, Result);
      end
      else
      begin
        if Assigned(ProcessID) then ProcessID^ := ProcessInfo.dwProcessId;
        Result := S_OK;
      end;
    finally
      CloseHandle(ProcessInfo.hProcess);
    end;
  end else Result := WAIT_FAILED;
end;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von alleinherrscher
alleinherrscher

Registriert seit: 8. Jul 2004
Ort: Aachen
797 Beiträge
 
Delphi XE2 Professional
 
#3

Re: Fehler in RunProcess Funktion?!

  Alt 2. Dez 2009, 11:14
Okay, schaut gut aus...keine korrektur:

  ZeroMemory(@StartupInfo, SizeOf(StartupInfo)); Aber warum müssen die Handles geschlossen werden, wenn das Programm gar nicht gestartet werden konnte?
„Software wird schneller langsamer als Hardware schneller wird. “ (Niklaus Wirth, 1995)

Mein Netzwerktool: Lan.FS
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.115 Beiträge
 
Delphi 12 Athens
 
#4

Re: Fehler in RunProcess Funktion?!

  Alt 2. Dez 2009, 11:31
da müssen sie garnicht

Luckie hätte für diesen Fall auch den ProcessInfo initialisieren sollen,
da CreateProcess nur bei Erfolg die Handle/IDs dort einträgt und sonst nix macht.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von alleinherrscher
alleinherrscher

Registriert seit: 8. Jul 2004
Ort: Aachen
797 Beiträge
 
Delphi XE2 Professional
 
#5

Re: Fehler in RunProcess Funktion?!

  Alt 2. Dez 2009, 12:20
Okay, dann sollten wir das vielleicht mal in der Code-Library ändern...entweder meine Änderung, oder Himitsu's

Mein Vorschlag wäre ja:

Delphi-Quellcode:
function RunProcess(FileName: string; ShowCmd: DWORD; wait: Boolean; ProcID: PCardinal): Longword;
var
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
begin
  FillChar(StartupInfo, SizeOf(StartupInfo), #0);
  StartupInfo.cb := SizeOf(StartupInfo);
  StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK;
  StartupInfo.wShowWindow := ShowCmd;
  if not CreateProcess(nil,
    @Filename[1],
    nil,
    nil,
    False,
    CREATE_NEW_CONSOLE or
    NORMAL_PRIORITY_CLASS,
    nil,
    nil,
    StartupInfo,
    ProcessInfo)
    then
      Result := WAIT_FAILED
  else
  begin
    if wait = FALSE then
    begin
      if ProcID <> nil then ProcID^ := ProcessInfo.dwProcessId;
      exit;
    end;
    WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
    GetExitCodeProcess(ProcessInfo.hProcess, Result);
    if ProcessInfo.hProcess <> 0 then
      CloseHandle(ProcessInfo.hProcess);
    if ProcessInfo.hThread <> 0 then
      CloseHandle(ProcessInfo.hThread);
  end;
end;
„Software wird schneller langsamer als Hardware schneller wird. “ (Niklaus Wirth, 1995)

Mein Netzwerktool: Lan.FS
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.115 Beiträge
 
Delphi 12 Athens
 
#6

Re: Fehler in RunProcess Funktion?!

  Alt 2. Dez 2009, 12:26
bei dir dürftest du die if ProcessInfo.xxx <> 0 then weglassen können, da an dieser Stelle die Handles ja vorhanden sein sollten.


PS:
bei if wait = FALSE then ... exit; wären die Handles nicht freigegeben worden

und auch das Result wäre da undefiniert geblieben (meckert diesbezüglich eigentlich Delphi nicht? )

Delphi-Quellcode:
function RunProcess(FileName: string; ShowCmd: DWORD; wait: Boolean; ProcID: PCardinal): Longword;
var
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
begin
  FillChar(StartupInfo, SizeOf(StartupInfo), #0);
  StartupInfo.cb := SizeOf(StartupInfo);
  StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK;
  StartupInfo.wShowWindow := ShowCmd;
  if not CreateProcess(nil,
    @Filename[1],
    nil,
    nil,
    False,
    CREATE_NEW_CONSOLE or
    NORMAL_PRIORITY_CLASS,
    nil,
    nil,
    StartupInfo,
    ProcessInfo)
    then
      Result := WAIT_FAILED
  else
  begin
    try
      if not wait then
      begin
        if ProcID <> nil then ProcID^ := ProcessInfo.dwProcessId;
        Result := S_OK;
        exit;
      end;
      WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
      GetExitCodeProcess(ProcessInfo.hProcess, Result);
    finally
      CloseHandle(ProcessInfo.hProcess);
      CloseHandle(ProcessInfo.hThread);
    end;
  end;
end;
Zitat von alleinherrscher:
Okay, dann sollten wir das vielleicht mal in der Code-Library ändern...
hatte es schon gemeldet und mal sehn ob/wann sich ein Mod drum kümmert


[edit]
noch schnell das Result:=S_OK; eingefügt
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Fehler in RunProcess Funktion?!

  Alt 2. Dez 2009, 12:27
So könnte der Rückgabewert aber undefiniert sein. Anderer Vorschlag:
Delphi-Quellcode:
function RunProcess(FileName: string; ShowCmd: DWORD; wait: Boolean; ProcID: PCardinal): Longword;
var
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
begin
  FillChar(StartupInfo, SizeOf(StartupInfo), #0);
  StartupInfo.cb := SizeOf(StartupInfo);
  StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK;
  StartupInfo.wShowWindow := ShowCmd;
  if not CreateProcess(nil,
    @Filename[1],
    nil,
    nil,
    False,
    CREATE_NEW_CONSOLE or
    NORMAL_PRIORITY_CLASS,
    nil,
    nil,
    StartupInfo,
    ProcessInfo)
    then
      Result := WAIT_FAILED
  else
  begin
    Result := S_OK;
    if wait then
      begin
      WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
      GetExitCodeProcess(ProcessInfo.hProcess, Result);
      if ProcessInfo.hProcess <> 0 then
        CloseHandle(ProcessInfo.hProcess);
      if ProcessInfo.hThread <> 0 then
        CloseHandle(ProcessInfo.hThread);
      end
    else
      if ProcID <> nil then ProcID^ := ProcessInfo.dwProcessId;
  end;
end;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.115 Beiträge
 
Delphi 12 Athens
 
#8

Re: Fehler in RunProcess Funktion?!

  Alt 2. Dez 2009, 12:32
@DeddyH: bei Wait=False bleiben die Handle offen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von alleinherrscher
alleinherrscher

Registriert seit: 8. Jul 2004
Ort: Aachen
797 Beiträge
 
Delphi XE2 Professional
 
#9

Re: Fehler in RunProcess Funktion?!

  Alt 2. Dez 2009, 12:34
Okay, ihr habt recht... Himitsus Vorschlag schaut sehr gut aus...
„Software wird schneller langsamer als Hardware schneller wird. “ (Niklaus Wirth, 1995)

Mein Netzwerktool: Lan.FS
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: Fehler in RunProcess Funktion?!

  Alt 2. Dez 2009, 12:35
Jaja, Sch**ß C&P. Dafür hatte ich immerhin Delphi-Tags gesetzt
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 15:21 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