PROBLEM GELÖST
Delphi-Quellcode:
function ExecAndWait(Filename, Params: string; WindowState: word = SW_SHOWNORMAL): boolean;
var
ShExecInfo: SHELLEXECUTEINFO;
r : Cardinal;
const
SEE_MASK_NOASYNC= $100;
begin
Result := false;
if Filename = '' then
exit;
if not FileExists(FileName) then
Begin
ShowMessage('Datei nicht existent!');
Exit;
End;
ZeroMemory(@ShExecInfo, SizeOf(ShExecInfo));
ShExecInfo.Wnd := application.MainFormHandle; //GetForegroundWindow;
ShExecInfo.cbSize := sizeof(SHELLEXECUTEINFOA);
ShExecInfo.fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_NOASYNC;
ShExecInfo.lpVerb := 'open';
ShExecInfo.lpFile := PChar(Filename);
ShExecInfo.lpParameters := PChar(Params);
ShExecInfo.lpDirectory := PChar(ExtractFileDir(Filename));
ShExecInfo.nShow := WindowState;
Result := ShellExecuteEx(@ShExecInfo);
try
if Result then
begin
repeat
R := MsgWaitForMultipleObjects(1, ShExecInfo.hProcess, False, INFINITE,QS_ALLINPUT);
if r <> WAIT_OBJECT_0 then
Application.ProcessMessages;
until r = WAIT_OBJECT_0;
end
else
Showmessage('Fehler beim Starten der Anwendung:' + Filename +
#13#10'System Fehler: ' + SysErrorMessage(GetLastError));
finally
CloseHandle(ShExecInfo.hProcess);
end;
end;
WaitForSingleObject produziert scheinbar wie vorgesehen einen deadlock wenn der aufgerufen prozess ein neues Fenster erzeugt.
Und die
msdn hatte recht...(seltsam) mit MsgWaitForMultipleObjects geht es dann trotzdem.
Delphi-Quellcode:
repeat
R := MsgWaitForMultipleObjects(1, ShExecInfo.hProcess, False, INFINITE,QS_ALLINPUT);
if r <> WAIT_OBJECT_0 then
Application.ProcessMessages;
until r = WAIT_OBJECT_0;
Und danke für die Code Verschönerungstips, sieht jetzt auch viel übersichtlicher aus!