Прочитайте программу STDIN в Delphi - PullRequest
8 голосов
/ 14 августа 2011

У меня есть следующий пакетный скрипт:

dir | myapp.exe

И у программы есть этот источник (более или менее):

procedure TForm1.FormCreate(Sender: TObject);
var buff: String;
begin
  Read(buff);
  Memo1.Lines.Text:=buff;
end;

И вывод в памятке:

Том на диске C не имеет метки.

Я пытался:

  • поместить часть чтения в цикл с eof в качестве условия- каким-то образом вызывая бесконечный цикл
  • запись цикла для продолжения чтения до тех пор, пока strlen(buff) не станет равным 0 - по какой-то причине он завершается второй раз
  • , считывая каждые 0,5 секунды (я думал об асинхронномпишет в stdin), это тоже не удалось

Кстати, прямой запуск программы без данных stdin вызывает исключение EInputOutput (I / O Error), код 6.

Ответы [ 2 ]

10 голосов
/ 14 августа 2011

Приложения с графическим интерфейсом не имеют назначенных stdin, stdout или stderr автоматически.Вы можете сделать что-то вроде:

procedure TForm1.FormCreate(Sender: TObject);
var
  Buffer: array[0..1000] of Byte;
  StdIn: TStream;
  Count: Integer;
begin
  StdIn := THandleStream.Create(GetStdHandle(STD_INPUT_HANDLE));
  Count := StdIn.Read(Buffer, 1000);
  StdIn.Free;
  ShowMessageFmt('%d', [Count]);
end;

Если вы сделаете

dir *.pas | myapp.exe

Вы увидите сообщение с номером> 0, и если вы сделаете:

myapp.exe

Вы увидите окно сообщения с 0. В обоих случаях будет показана форма.

3 голосов
/ 14 августа 2011

вместо этого попробуйте использовать потоковый подход Read(buff)

InputStream := THandleStream.Create(GetStdHandle(STD_INPUT_HANDLE));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...