【问题标题】:Read program STDIN in Delphi在 Delphi 中读取程序 STDIN
【发布时间】:2011-08-14 01:59:11
【问题描述】:

我有以下批处理脚本:

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数据,会导致EInputOutput异常(I/O错误)代码6。

【问题讨论】:

    标签: delphi stdin


    【解决方案1】:

    GUI 应用程序没有自动分配标准输入、标准输出或标准错误。您可以执行以下操作:

    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 的消息框。在这两种情况下,都会显示表单。

    【讨论】:

    • 好的,效果很好!我要一直读到Count<sizeOf(Buffer)吗?
    • 是的,继续阅读直到 Count
    • FWIW,虽然我在这里回答问题,但我主要是来这里学习的。尤其是 Objective-C,还有 C、C++ 和算法之类的东西。
    【解决方案2】:

    尝试使用流方法代替Read(buff)

    InputStream := THandleStream.Create(GetStdHandle(STD_INPUT_HANDLE));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多