var
   Security: TSecurityAttributes;
  start: TStartUpInfo;
  ProcessInfo: TProcessInformation;
implementation
{$R *.dfm}
var
  ReadOut, WriteOut, ReadIn, WriteIn: Cardinal;
procedure InitConsole;
begin
  with Security do begin
    nlength := SizeOf(TSecurityAttributes);
    binherithandle := true;
    lpsecuritydescriptor := nil;
  end;
  Createpipe(ReadOut, WriteOut, @Security, 0);
  Createpipe(ReadIn, WriteIn, @Security, 0);
  with Security do begin
    nlength := SizeOf(TSecurityAttributes);
    binherithandle := true;
    lpsecuritydescriptor := nil;
  end;
  FillChar(Start, Sizeof(Start), #0);
  start.cb := SizeOf(start);
  start.hStdOutput := WriteOut;
  start.hStdInput := ReadIn;
  start.hStdError := WriteOut;
  start.dwFlags := STARTF_USESTDHANDLES +
    STARTF_USESHOWWINDOW;
  start.wShowWindow := SW_HIDE;
  CreateProcess(nil,
    PChar('cmd'),
    nil,          //@Security,
    nil,          //@Security,
    true,
    0,//NORMAL_PRIORITY_CLASS,
    nil,
    nil,
    start,
    ProcessInfo)
end;

function ReadFromPipe(Pipe: THandle): string;
var
  Buffer: PChar;
  BytesRead: DWord;
  ReadBuffer: Cardinal;
begin
  Result := '';
  if GetFileSize(Pipe, nil) = 0 then Exit;
  Buffer := AllocMem(ReadBuffer + 1);
  repeat
    BytesRead := 0;
    ReadFile(Pipe, Buffer[0],
      ReadBuffer, BytesRead, nil);
    if BytesRead > 0 then begin
      Buffer[BytesRead] := #0;
      OemToAnsi(Buffer, Buffer);
      Result := string(Buffer);
    end;
  until (BytesRead < ReadBuffer);
  FreeMem(Buffer);
end;

procedure WriteToPipe(Pipe: THandle; Value: string);
var
  len: integer;
  BytesWrite: DWord;
  Buffer: PChar;
begin
  len := Length(Value) + 1;
  Buffer := PChar(Value + #10);
  WriteFile(Pipe, Buffer[0], len, BytesWrite, nil);
end;

procedure TForm1.tmr1Timer(Sender: TObject);
var
  s: string;
begin
  s := ReadFromPipe(ReadOut);
  if s <> '' then begin
    Form1.Mmo1.Lines.Text := Form1.Mmo1.Lines.Text + s;
    Form1.Mmo1.SelStart := length(Form1.Mmo1.Lines.Text);
    Form1.Mmo1.SelLength := 0
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if Trim(cbb1.Text) <> '' then
  begin
    if UpperCase(cbb1.Text) = 'CLS' then
      mmo1.Clear
    else
      WriteToPipe(WriteIn, cbb1.Text);
    if cbb1.ItemIndex > -1 then
      cbb1.Items.Delete(cbb1.ItemIndex);
    cbb1.Items.Insert(0, Trim(cbb1.Text));
    cbb1.Text := '';
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  InitConsole;
end;

procedure TForm1.btn1Click(Sender: TObject);
begin
  if dlgOpen1.Execute then
    cbb1.Text := '"' + dlgOpen1.FileName + '"';
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
  ExitCode: Cardinal;
begin
  TerminateProcess(ProcessInfo.hProcess, ExitCode);
end;

procedure TForm1.cbb1KeyPress(Sender: TObject; var Key: Char);
begin
  if Key = #13 then
    if Trim(cbb1.Text) <> '' then
    begin
      if UpperCase(cbb1.Text) = 'CLS' then
        mmo1.Clear
      else
        WriteToPipe(WriteIn, cbb1.Text);
      if cbb1.ItemIndex > -1 then
        cbb1.Items.Delete(cbb1.ItemIndex);
      cbb1.Items.Insert(0, Trim(cbb1.Text));
      cbb1.Text := '';
    end;
end;