Try this one. I have just wrapped a version of "WinExecAndWait32". This one DEFINITELY 
waits correctly.
HTH

Chris

procedure ExecuteProgram(sPath: string; bWait: Boolean);
  function WinExecAndWait32(Path: PChar; Visibility: Word;
    Timeout: DWORD): integer;
  var
    WaitResult: integer;
    StartupInfo: TStartupInfo;
    ProcessInfo: TProcessInformation;
  begin
    FillChar(StartupInfo, SizeOf(TStartupInfo), 0);
    with StartupInfo do
    begin
      cb := SizeOf(TStartupInfo);
      dwFlags := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK;
    { you could pass sw_show or sw_hide as parameter: }
      wShowWindow := visibility;
    end;
    if CreateProcess(nil, path, nil, nil, False,
      NORMAL_PRIORITY_CLASS, nil, nil,
      StartupInfo, ProcessInfo) then
    begin
      WaitResult := WaitForSingleObject(ProcessInfo.hProcess, timeout);
      { timeout is in miliseconds or INFINITE if
      you want to wait forever }
      result := WaitResult;
    end
    else
    { error occurs during CreateProcess see help for details }
      result := GetLastError;
  end;
begin
  SetCurrentDir(ExtractFilePath(Application.ExeName)); {Set this so relative paths 
will work}
  if not FileExists(sPath) then begin
    DlgError('Unable to run "' + sPath + '"'+NL+'The program cannot be found.');
  end else begin
    if bWait then begin
      WinExecAndWait32(PChar(sPath), SW_SHOW, INFINITE);
    end else begin
      WinExecAndWait32(PChar(sPath), SW_SHOW, 0);
    end;
  end;
end;



> -----Original Message-----
> From: vss [mailto:vss@;vss.co.nz]
> Sent: Monday, 11 November 2002 3:08 p.m.
> To: Multiple recipients of list delphi
> Subject: [DUG]: Execute and wait
> 
> 
> Hi All.
> I have a bit of code that does an execute and waits for the app. to 
> close.
> What I want to do is execute a game and know when its 
> finished, BUT when 
> I use my code, it starts to execute the app, but then it stops and 
> returns an error code of zero which means its finished...BUT it never 
> started.
> This is teh code I use. anyone got anything better?
> 
> Jeremy
> 
> 
> function TfrmMain.WinExecAndWait32(Path: PChar; Visibility: Word): 
> integer;
> var Msg: TMsg;
>     lpExitCode: cardinal;
>     StartupInfo: TStartupInfo;
>     ProcessInfo: TProcessInformation;
> begin
>   FillChar(StartupInfo, SizeOf(TStartupInfo), 0);
>   with StartupInfo do
>   begin
>     cb := SizeOf(TStartupInfo);
>     dwFlags := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK;
>     wShowWindow := visibility; {you could pass sw_show or sw_hide as 
> parameter}
>   end;
> 
>   if CreateProcess(nil, path, nil, nil, False, NORMAL_PRIORITY_CLASS, 
> nil, nil, StartupInfo,
>                    ProcessInfo) then
>   begin
>     repeat
>       while PeekMessage(Msg, 0, 0, 0, pm_Remove) do
>       begin
>         if Msg.Message = wm_Quit then Halt(Msg.WParam);
>         TranslateMessage(Msg);
>         DispatchMessage(Msg);
>       end;
>       GetExitCodeProcess(ProcessInfo.hProcess,lpExitCode);
>     until lpExitCode <> Still_Active;
> 
>     with ProcessInfo do {not sure this is necessary but seen 
> in in some 
> code elsewhere}
>     begin
>       CloseHandle(hThread);
>       CloseHandle(hProcess);
>     end;
>     Result := 0; {success}
>   end else Result := GetLastError;
> end;
> 
> --------------------------------------------------------------
> -------------
>     New Zealand Delphi Users group - Delphi List - 
> [EMAIL PROTECTED]
>                   Website: http://www.delphi.org.nz
> To UnSub, send email to: [EMAIL PROTECTED] 
> with body of "unsubscribe delphi"
> Web Archive at: http://www.mail-archive.com/delphi%40delphi.org.nz/
> 
---------------------------------------------------------------------------
    New Zealand Delphi Users group - Delphi List - [EMAIL PROTECTED]
                  Website: http://www.delphi.org.nz
To UnSub, send email to: [EMAIL PROTECTED]
with body of "unsubscribe delphi"
Web Archive at: http://www.mail-archive.com/delphi%40delphi.org.nz/

Reply via email to