【问题标题】:Redmon & capturing stdin with DelphiRedmon & 使用 Delphi 捕获标准输入
【发布时间】:2011-12-08 15:12:21
【问题描述】:

我正在使用redmon 将postscript 重定向到delphi 进行处理。

我正在使用以下代码将标准输入读取到文件中:

var
  Stdin: THandleStream;
  FStream: TFileStream;
  BytesRead:Int64;
  Buffer: array[0..1023] of Byte; 

StdIn := THandleStream.Create(GetStdHandle(STD_INPUT_HANDLE));
try
  tempps:=GetTempFile('.ps');
  FStream:=tfilestream.Create(tempps,fmCreate or fmOpenReadWrite);
  StdIn.Seek(0,0);
  try
    repeat
      BytesRead:=StdIn.Read(Buffer,1024);
      FStream.Write(Buffer,BytesRead);
    until bytesread<SizeOf(Buffer);
  finally
    InputSize:=FStream.Size;
    FStream.Free;
  end;
finally
  StdIn.Free;
end;

这适用于大多数情况,除了 redmon 日志文件显示的情况:

REDMON WritePort: OK  count=65536 written=65536

REDMON WritePort: Process not running. Returning TRUE.
    Ignoring 65536 bytes

它是 65536 只是一个红鲱鱼,是我没有正确阅读标准输入,还是我忽略了一些奇怪的限制?

提前致谢。

编辑 1

65536 是一条红鲱鱼 - redmon 在日志中每 64k 打印一次此消息,整个文件为 688759 字节,但看起来 redmon 提前关闭了输出,但无论如何仍会继续输出更多文本。

【问题讨论】:

  • 是时候进行一些基本的调试了。你的进程运行了吗?如果是这样,它读取了多少数据?它应该读多少? Redmon 是否经常恰好生成 64 KB 的数据?
  • 请为我们解读redmon日志。

标签: delphi console-application


【解决方案1】:

我不知道 RedMon 是如何工作的,但我不会依赖 bytesread&lt;SizeOf(Buffer) 作为 EOF 条件,因为我想你实际上是从管道中读取的,并且 ReadFile 函数正如 MSDN 文档所说可以返回的数量读取的字节数少于从管道读取的字节数。

BytesRead &lt;= 0 条件更可靠(只有当 RedMon 将在管道的另一端写入 0 字节时它才会失败,我想它不应该这样做):

repeat
  BytesRead:=StdIn.Read(Buffer,1024);
  if BytesRead > 0 then
    FStream.WriteBuffer(Buffer,BytesRead);
until BytesRead <= 0;

【讨论】:

    猜你喜欢
    • 2010-10-02
    • 2013-05-11
    • 2017-07-21
    • 1970-01-01
    • 2011-04-17
    • 2021-10-20
    • 2021-05-21
    • 2023-03-15
    相关资源
    最近更新 更多