Search code examples
windowsdelphishellexecute

how to tell when an external application ends in delphi


I am using ShellExecute to run external application How can i tell when the external application ends ?

Here my code

theProgram     :=  'MySql.exe';
itsParameters  :=  ' -u user1 -ppassword -e "create database abc"’;
rslt := ShellExecute(0, 'open',
                       pChar (theProgram),
                       pChar (itsParameters),
                       nil,
                       SW_SHOW);

Solution

  • Try the following function. WaitForSingleObject does what you need.

    function ExecAppAndWait(const sApp, sParams: String; wShow: Word; sCurrentDirectory: String = ''): DWord;
    { Parameter wShow: SW_HIDE, SW_SHOWNORMAL, SW_NORMAL, SW_MAXIMIZE ...}
    var
      aSI     : TStartupInfo;        // Win32 : STARTUPINFO
      aPI     : TProcessInformation; // Win32 : PROCESS_INFORMATION
      aProc   : THandle;             // Win32
      aCurrentDirectory: PChar;
      s: String;
    begin
      s := sApp + ' ' + sParams;
      FillChar(aSI, SizeOf(aSI), 0);
      aSI.cb := SizeOf(aSI);
      aSI.wShowWindow := wShow;
      aSi.dwFlags := STARTF_USESHOWWINDOW;
    
    
      if sCurrentDirectory = '' then
        aCurrentDirectory := nil
      else
        aCurrentDirectory := PChar(sCurrentDirectory);
    
      Win32Check(CreateProcess(nil, PChar(s), nil, nil,
                 False, Normal_Priority_Class, nil, aCurrentDirectory, aSI, aPI));
       // in TProcessInformation.hProcess -> Process-Handle
      aProc := aPI.hProcess;
    
      CloseHandle(aPI.hThread);
    
    
      if WaitForSingleObject(aProc, Infinite) <> Wait_Failed then
        GetExitCodeProcess(aProc, Result);
      // free Ressource
      CloseHandle(aProc);
    end;