Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Получения вывода консоли


Автор: WolfON 17.5.2006, 16:15
Все никак не могу получать то, что пишет запущенная в консоли делфей.
Особенно разочаровался узнав, что пример из drkb не пашет.

ЗЫЖ нужно обязательно динамически получать - по пуступлении новых строк вывода 

Автор: _hunter 17.5.2006, 17:28
что за программа в чем именно проблема? 

Автор: WolfON 17.5.2006, 20:22
любая, скажем ping =)
надо получить своей программой в дельфе, что напишет в консоль вызванный пинг 

Автор: Yanis 17.5.2006, 21:40
В примере из DRKB как раз ping и показан. 

Автор: WolfON 17.5.2006, 21:54
Но он не работает =) 

Автор: _hunter 18.5.2006, 10:53
ты его, явно, не правильно используеш.
+ покопаться в коде и определить что именно "не работает" слабо? 

Автор: x77 19.5.2006, 00:05
у меня он тоже глючил, и я что-то переделывал, но сейчас, глядя на свои исходники, разницы не вижу:

Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Edit1: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure RunInMemo (Cmd: string; Memo: TCustomMemo; RefreshTime: integer);
const
  bufsize = 2000;
var
  sa: TSecurityAttributes;
  si: TStartupInfo;
  pi: TProcessInformation;
  rp, wp: THandle;
  buf: pchar;
  ec: dword;
  bread: dword;
begin
  with sa do begin
    nLength := SizeOf (TSecurityAttributes);
    bInheritHandle := TRUE;
    lpSecurityDescriptor := nil;
  end;
  if CreatePipe (rp, wp, @sa, 0) then begin
    FillChar (si, SizeOf (TStartupInfo), #0);
    with si do begin
      cb := SizeOf (si);
      hStdInput := rp;
      hStdOutput := wp;
      dwFlags := STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW;
      wShowWindow := SW_HIDE;
    end;
    buf := AllocMem (bufsize + 1);
    try
      if CreateProcess (nil, pchar (Cmd), @sa, @sa, TRUE, NORMAL_PRIORITY_CLASS, nil, nil, si, pi) then begin
        repeat
          ec := WaitForSingleObject (pi.hProcess, RefreshTime);
          ReadFile (rp, buf [0], bufsize, bread, nil);
          buf [bread] := #0;
          OemToAnsi (buf, buf);
          Memo.Text := Memo.Text + string (buf);
          Application.ProcessMessages;
        until ec <> WAIT_TIMEOUT;
      end;
    finally
      FreeMem (buf);
      CloseHandle(pi.hProcess);
      CloseHandle(pi.hThread);
      CloseHandle(rp);
      CloseHandle(wp);
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  RunInMemo (Edit1.Text, Memo1, 100);
end;

end.


по сравнению с вариантом Song'а добавлен RefreshInterval.

единственное что, задержку перед чтением из канализации можно и нужно варьировать, одни и те же проги у меня лично глючат при определённых значениях RefreshInterval, который в drkb задан жёстко (соотв. некоторые проги глючат перманентно). 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)