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