gpt4 book ai didi

delphi - Redmon 和使用 Delphi 捕获标准输入

转载 作者:行者123 更新时间:2023-12-03 07:05:38 25 4
gpt4 key购买 nike

我正在使用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 是如何工作的,但我不会依赖bytesread<SizeOf(Buffer)作为 EOF 条件,因为我想您实际上是从管道中读取,并且 ReadFile如果您从管道读取数据,MSDN 文档中提到的函数可以返回读取的字节数小于要读取的字节数。

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

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

关于delphi - Redmon 和使用 Delphi 捕获标准输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8433134/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com