2011-10-21 29 views
2

サービス: 名前付きパイプでstd out、errを作成します。それらを作成するプロセスに接続します。名前付きパイプのバイトなし

HANDLE hStdOut = CreateNamedPipe(szStdOutPipeName, 
      PIPE_ACCESS_DUPLEX, 
      PIPE_TYPE_BYTE, 
      1, 
      100, 
      100, 
      15000, 
      pSa); 
yStartupInfo.hStdOutput = hStdOut; 
CreateProcessAsUserW(..., yStartupInfo, ...); 

この部分は動作します。作成されたプロセスの出力がパイプにリダイレクトされています。

クライアント: 名前付きパイプへの接続、成功しました。ピークで読み込むバイトがあるかどうかをチェックします(この時点で、バイトはパイプにプッシュされます)。その後、パイプからバイトを読み込みます。

hStdOutPide = CreateFileW(szPipeNameStdOut, 
          GENERIC_READ|GENERIC_WRITE, 
          FILE_SHARE_READ|FILE_SHARE_WRITE, 
          NULL, 
          OPEN_EXISTING, 
          0, 
          NULL); 
PeekNamedPipe(hStdOutPide, 
       szBuffer, 
       kunBufferSize, 
       &ulBytesRead, 
       &ulBytesAvailable, 
       &ulRemainingBytes); 
if(ulBytesAvailable > 0) 
     ReadFile(hStdOutPide, szBuffer, 1000, &ulBytesRead, NULL) 

ハンドルが有効でプロセスが実行中であることを確認する周囲のコードを削除しました。

The Peekは、ulRemainingBytesであることを示しています。常に0です。誰が私のエラーがどこにあるのか見ていますか?私はこれをしばらくの間稼動させようとしており、何のための適切なフラグがもはや何であるかを知らない。より多くの情報が必要かどうか尋ねてください!

セキュリティCreateNamesPipeのセキュリティ属性は、メソッドから生成されます。それはコードの他の多くの場所で使用されているので、問題はそこにあるとは思わない。

ありがとうございました。

答えて

1

PeekNamedPipe()は、確認する必要があるBOOLを返します。

失敗した場合は(FALSEまたは0)、理由を理解するためにGetLastError()を使用してください。

また、戻り値CreateFile()hStdOutPide)とINVALID_HANDLE_VALUEの戻り値も確認する必要があります。返されたハンドルが無効な場合は、PeekNamedPipe()が失敗する可能性があります。

とりわけ、撮影には多すぎる(良い)結果が得られているようです。しないでください!あなたのリターンコードを確認し、決して運に頼らないでください。

もう1つだけ:共有フラグが正しく設定されていない可能性があります。彼らはあなたがしたいことと矛盾していないことを確認してください。いずれにしても、CreateFile()が失敗した場合、GetLastError()はそのような問題について再度通知します。

+0

を使用してIPCのためにこの質問を参照してください。 CreateFileの戻り値をINVALID_HANDLE_VALUEに対してチェックしています。ヒントをありがとうが、私はしばらくの間これに固執されていない場合stackoverflowに投稿していないだろう。 –

+0

@Padawan Learner:あなたはどんなエラーを見ていますか?あなたが記述した動作はエラーを示唆しており、コードではエラーチェックが不十分であるためです。 – 0xC0000022L

関連する問題