2011-12-08 14 views
1

私はredmonを使用して処理のためにpostscriptをdelphiにリダイレクトしています。Redmon&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ちょうど赤いニシン、それは私が正しくstdinを読んでいないか、または私が見落としてしまったどこか奇妙な限界があるのですか?

ありがとうございます。

編集1

65536は赤いニシンです - redmonプリントこのメッセージログ内のすべての64k、ファイル全体がredmonが早く出力を閉じようしかし、ルックない、688759バイトですが、その後、まだ出力し続けとにかく多くのテキスト。

+0

時間。あなたのプロセスはまったく実行されましたか?もしそうなら、どれくらいのデータを読みましたか?それはどれくらい読まれるはずでしたか? Redmonは頻繁に*正確に* 64 KBのデータを生成しますか? –

+1

redmonのログを解釈してください。 –

答えて

3

私はあなたがパイプから実際に読み込んでいると仮定して、ReadFile関数は、バイト数を少なく返すことができると言うので、私はRedMonの動作を知らないが、私はbytesread<SizeOf(Buffer)をEOF条件として頼りません。パイプから読み取っている場合に読み込むバイト数よりも大きくなります。

BytesRead <= 0条件はより信頼性がある(それはRedMonは、パイプの反対側の0バイトを書き込みます場合にのみ、失敗する可能性が、私はそれはそれを行うべきではないと仮定):いくつかの基本的なデバッグのため

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

完璧に働いた、ありがとう。 –

関連する問題