DOS - roda um comando dos e captura saida num memo

Top  Previous  Next

// roda um comando dos e captura saida num memo

{

This function runs a program (console or batch) and adds its output

to Memo1

}

 

{....}

//  private

//    function RunCaptured(const _dirName, _exeName, _cmdLine: string): Boolean;

 

{....}

 

function TForm1.RunCaptured(const _dirName, _exeName, _cmdLine: string): Boolean;

var

  start: TStartupInfo;

  procInfo: TProcessInformation;

  tmpName: string;

  tmp: Windows.THandle;

  tmpSec: TSecurityAttributes;

  res: TStringList;

  return: Cardinal;

begin

  Result := False;

  try

    // set a temporary file

    tmpName := 'Test.tmp';

    FillChar(tmpSec, SizeOf(tmpSec), #0);

    tmpSec.nLength := SizeOf(tmpSec);

    tmpSec.bInheritHandle := True;

    tmp := Windows.CreateFile(PChar(tmpName),

           Generic_Write, File_Share_Write,

           @tmpSec, Create_Always, File_Attribute_Normal, 0);

    try

      FillChar(start, SizeOf(start), #0);

      start.cb          := SizeOf(start);

      start.hStdOutput  := tmp;

      start.dwFlags     := StartF_UseStdHandles or StartF_UseShowWindow;

      start.wShowWindow := SW_Minimize;

      // Start the program

      if CreateProcess(nil, PChar(_exeName + ' ' + _cmdLine), nil, nil, True,

                       0, nil, PChar(_dirName), start, procInfo) then

      begin

        SetPriorityClass(procInfo.hProcess, Idle_Priority_Class);

        WaitForSingleObject(procInfo.hProcess, Infinite);

        GetExitCodeProcess(procInfo.hProcess, return);

        Result := (return = 0);

        CloseHandle(procInfo.hThread);

        CloseHandle(procInfo.hProcess);

        Windows.CloseHandle(tmp);

        // Add the output

        res := TStringList.Create;

        try

          res.LoadFromFile(tmpName);

          Memo1.Lines.AddStrings(res);

        finally

          res.Free;

        end;

        Windows.DeleteFile(PChar(tmpName));

      end

      else

        Application.MessageBox(PChar(SysErrorMessage(GetLastError())), 'RunCaptured Error', MB_OK);

    except

      Windows.CloseHandle(tmp);

      Windows.DeleteFile(PChar(tmpName));

      raise;

    end;

  finally

  end;

end;

 

// Example:

procedure TForm1.Button1Click(Sender: TObject);

begin

  RunCaptured('C:\''cmd.exe''/c dir');

end;