Hab da mal eine sache, die mich selbst sehr nachdenklich macht, aber vielleicht kann mir ja hier geholfen werden...
...also ich benutze die (wohl durchaus bekannte) Funktion unten um ein Programm auszuführen. Jedes mal, wenn sich dieses Programm aufhängt (crash und anschließender Popup-Fehler Meldung), bleibt mein Programm - also das aufrufende stehen - und zwar genau so lange, bis ich das Fehler-Fenster geschlossen/bestätigt habe.
Mein Versuch mit einem Timer das aufpoppende Fenster zu suchen und es dann zu killen bleibt ohne Erfolg, da selbst der Timer beim Crash nicht mehr funktioniert und erst wieder weiterläuft, wenn ich das Fehler-Fenster geschlossen habe.
Irgendjemand eine Idee wie ich diesem Misstand beikommen kann? - Von mir aus kann es ja auch eine komplett andere Startroutine sein, ich muss lediglich die ProzessID des gestarteten Programms bekommen, da ich NICHT nach dem Fenstertitel suchen kann, da der wiederum durch den Benutzer eingestellt werden kann und es deshalb mehrere Fenster mit gleichem Titel geben könnte.
Schon mal im Voraus Schönen Dank
Delphi-Quellcode:
function RunProcess(FileName: string; ShowCmd: DWORD; wait: Boolean; ProcID: PDWORD): 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;