Hallo zusammen.
Ich nutze bisher folgenden Code, um einen Prozess mit Parametern zu starten und auf die Beendigung zu warten (ich nutze vorgabebeding einige Returncodes):
Delphi-Quellcode:
function ExecuteAndWait(Filename, Params: Widestring;
WindowState: Word = SW_SHOWNORMAL): Integer;
var
ShExecInfoW: SHELLEXECUTEINFOW;
r : Cardinal;
ExitCode: Cardinal;
res: Boolean;
begin
Result := -50;
if Filename = '' then Exit;
if not FileExists(FileName) then
begin
Exit(-100);
end;
ShExecInfoW.Wnd := GetForegroundWindow;
ShExecInfoW.cbSize := sizeof(SHELLEXECUTEINFOW);
ShExecInfoW.fMask := SEE_MASK_NOCLOSEPROCESS;
ShExecInfoW.lpVerb := 'open';
ShExecInfoW.lpFile := PWideChar(Filename);
ShExecInfoW.lpParameters := PWideChar(Params);
ShExecInfoW.lpDirectory := PWideChar(ExtractFileDir(Filename));
ShExecInfoW.nShow := WindowState;
res := ShellExecuteExW(@ShExecInfoW);
try
if res then
begin
r := WaitForSingleObject(ShExecInfoW.hProcess, INFINITE);
if not GetExitCodeProcess(ShExecInfoW.hProcess, ExitCode)
then Result := -1;
end;
finally
CloseHandle(ShExecInfoW.hProcess);
Result := ExitCode;
end;
end;
Das klappte bisher sehr gut, aber unter Windows 8 friert mein Programm ein und der andere Prozess wird nicht gestartet. Wenn ich dann mein Programm über den Debugger kille, dann wird endlich (aber zu spät natürlich) der andere Prozess gestartet. Was habe ich nicht bedacht?