D5P: ShellExecute soll warten

Hallo Delphianer,
nachdem ShellExecute ein externes Programm gestartet hat, wird in der Delphi-Anwendung schon die nächste Programmzeile bearbeitete. Gibt es eine Möglichkeit, ShellExecute anzuweisen, so lange zu warten, bis das externe Programm beendet ist?

Ich möchte in der Zeit, wo das externe Programm läuft, die Maus- und Tastatur-Eingaben deaktivieren, auch den Affengriff STRG+ALT+ENTF.

Hättest Du einen Tip oder Hinweis für mich?

Vielen Dank und Gruß Demi

Gibt es eine Möglichkeit, ShellExecute anzuweisen, so lange zu warten, bis das externe Programm beendet ist?

Das geht folgendermaßen:

function ExecuteFileAndWait(FileName, Params, DefaultDir: string; ShowCmd: DWord):boolean;
var
 err:smiley:Word;
 StartupInfo : TStartupInfo;
 ProcessInfo : TProcessInformation;
 zAppName,
 zCurDir : array [0..MAX\_PATH] of char;

begin
 { SW\_SHOWMAXIMIZED Activates the window and displays it as a maximized window.
 SW\_SHOWMINIMIZED Activates the window and displays it as a minimized window.
 SW\_SHOWMINNOACTIVE Displays the window as a minimized window. The active window remains active.
 SW\_SHOWNA Displays the window in its current state. The active window remains active.
 SW\_SHOWNOACTIVATE Displays a window in its most recent size and position. The active window remains active.
 SW\_SHOWNORMAL Activates and displays a window. If the window is minimized or maximized, Windows restores it to its original size and
 position. An application should specify this flag when displaying the window for the first time.
 }

 result:=false;

 FillChar(StartupInfo, Sizeof(StartupInfo), #0);
 StartupInfo.cb := Sizeof(StartupInfo);
 StartupInfo.dwFlags := STARTF\_USESHOWWINDOW;
 StartupInfo.wShowWindow := ShowCMD;

 StrPCopy(zAppname,filename+' '+params);

 if defaultDir='' then
 GetDir(0,DefaultDir);
 StrPCopy(zCurDir,DefaultDir);

 if not CreateProcess(
 nil, { pointer to executable}
 zAppName, { pointer to command line string }
 nil, { pointer to process security attributes }
 nil, { pointer to thread security attributes }
 false, { handle inheritance flag }
 CREATE\_NEW\_CONSOLE or { creation flags }
 NORMAL\_PRIORITY\_CLASS,
 nil, { pointer to new environment block }
 zCurDir, { pointer to current directory name }
 StartupInfo, { pointer to STARTUPINFO }
 ProcessInfo) then { pointer to PROCESS\_INF }
 begin
 showlasterror;
 end
 else
 begin
 // Warten, bis der Process beendet wurde
 repeat
 err:=WaitforSingleObject(ProcessInfo.hProcess,100); // 100 MSec Warten
 application.ProcessMessages;
 until (errWAIT\_TIMEOUT);
 if errWAIT\_FAILED then
 result:=true
 else
 begin
 showmessage(GetLastErrorMsg);
 end;
 end;
end;

Viele Grüße Joachim