...run a console application and get its output?

Author: Superhausi 

Homepage: http://www.superhausi.ch

1 Comment to this tip [Write new comment]

[ Print tip ]    

 

Tip Rating (14):   

Skill:  

Useful:  

Overall:  

 

 

 

{

Diese Funktion führt ein Programm (Konsole oder Batch-File) aus und fügt

die Ausgaben zu Memo1 hinzu

}

 

 

{

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

    { Setze ein Temporäres File }

    { 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;

      { Starte das Programm }

      { 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);

        { Die Ausgaben hinzufügen }

        { Add the output }

        res := TStringList.Create;

        try

          res.LoadFromFile(tmpName);

          Memo1.Lines.AddStrings(res);

        finally

          res.Free;

        end;

        Windows.DeleteFile(PChar(tmpName));

      end

      else

      begin

        Application.MessageBox(PChar(SysErrorMessage(GetLastError())),

          'RunCaptured Error', MB_OK);

      end;

    except

      Windows.CloseHandle(tmp);

      Windows.DeleteFile(PChar(tmpName));

      raise;

    end;

  finally

  end;

end;

 

 

// Beispiel:

// Example:

 

procedure TForm1.Button1Click(Sender: TObject);

begin

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

end;