パイプ サーバーは、CreateNamedPipe 関数の dwPipeMode パラメーターで、パイプの種類モード、読み取りモード、および待機モードを指定します。 パイプ クライアントは、CreateFile 関数を使用して、パイプ ハンドルに対してこれらのパイプ モードを指定できます。
型モード
パイプの型モードによって、名前付きパイプにデータを書き込む方法が決まります。 データは、名前付きパイプを介して、バイト ストリームまたはメッセージのストリームとして送信できます。 パイプ サーバーは、名前付きパイプのインスタンスを作成するために CreateNamedPipe呼び出すときにパイプの種類を指定します。 型モードは、パイプのすべてのインスタンスで同じである必要があります。
バイト型パイプを作成するには、PIPE_TYPE_BYTEを指定するか、既定値を使用します。 データはバイトストリームとしてパイプに書き込まれ、システムは異なる書き込み操作で書き込まれたバイトを区別しません。
メッセージ型パイプを作成するには、PIPE_TYPE_MESSAGEを指定します。 システムは、各書き込み操作でパイプに書き込まれたバイトをメッセージ単位として扱います。 システムは常に、書き込みモードが有効になっているかのように、メッセージ型パイプに対して書き込み操作を実行します。
読み取りモード
パイプの読み取りモードによって、名前付きパイプからデータを読み取る方法が決まります。 パイプ サーバーは、CreateNamedPipeを呼び出すときに、パイプ ハンドル初期読み取りモードを指定します。 データは、バイト読み取りモードまたはメッセージ読み取りモードで読み取ることができます。 バイト型パイプへのハンドルは、バイト読み取りモードでのみ使用できます。 メッセージ型パイプへのハンドルは、バイト読み取りモードでもメッセージ読み取りモードでもかまいません。 メッセージ型パイプの場合、読み取りモードは、同じパイプ インスタンスに対するサーバー ハンドルとクライアント ハンドルで異なる場合があります。
バイト読み取りモードでパイプ ハンドルを作成するには、PIPE_READMODE_BYTEを指定するか、既定値を使用します。 データは、バイト ストリームとしてパイプから読み取られます。 パイプ内のすべての使用可能なバイトが読み取られた場合、または指定されたバイト数が読み取られた場合、読み取り操作は正常に完了します。
メッセージ読み取りモードでパイプ ハンドルを作成するには、PIPE_READMODE_MESSAGEを指定します。 データは、メッセージのストリームとしてパイプから読み取られます。 読み取り操作は、メッセージ全体が読み取られた場合にのみ正常に完了します。 読み取る指定したバイト数が次のメッセージのサイズより小さい場合、関数は 0 を返す前にできるだけ多くのメッセージを読み取ります (GetLastError 関数はERROR_MORE_DATAを返します)。 メッセージの残りの部分は、別の読み取り操作を使用して読み取ることができます。
パイプ クライアントの場合、CreateFile によって返されるパイプ ハンドルは、最初は常にバイト読み取りモードになります。 パイプ クライアントとパイプ サーバーの両方で、SetNamedPipeHandleState 関数を使用して、パイプ ハンドルの読み取りモードを変更できます。 パイプ ハンドルには、FILE_WRITE_ATTRIBUTESアクセス権が必要です。
待機モード
パイプ ハンドルの待機モードは、ReadFile、WriteFile、および ConnectNamedPipe関数、長い操作を処理する方法を決定します。 ブロッキング待機モードでは、関数はパイプのもう一方の端にあるプロセスが操作を完了するまで無期限に待機します。 非ブロッキング待機モードでは、関数は、それ以外の場合は無期限の待機を必要とする状況で直ちに戻ります。
ReadFile 操作は、パイプが空のときにパイプ ハンドルの待機モードの影響を受けます。 ブロッキング待機ハンドルでは、スレッドからパイプのもう一方の端に書き込むデータが使用可能になるまで、操作は正常に完了しません。 非ブロッキング待機ハンドルを使用すると、関数はすぐに 0 を返し、GetLastError 関数はERROR_NO_DATAを返します。
WriteFile 操作は、パイプのバッファーに十分な領域がない場合のパイプ ハンドルの待機モードの影響を受けます。 ブロッキング待機ハンドルでは、パイプのもう一方の端からのスレッド読み取りによってバッファーに十分な領域が作成されるまで、書き込み操作は成功できません。 非ブロッキング待機ハンドルを使用すると、書き込み操作は、バイトを書き込むことなく (メッセージ型パイプの場合)、またはバッファーが保持するバイト数 (バイト型パイプの場合) を書き込まずに、直ちに 0 以外の値を返します。
ConnectNamedPipe 操作は、クライアントが接続されていない場合、またはパイプ インスタンスへの接続を待機している場合に、パイプ ハンドルの待機モードの影響を受けます。 ブロッキング待機ハンドルでは、パイプ クライアントが CreateFile または CallNamedPipe関数を呼び出してパイプ インスタンスに接続するまで、接続操作成功しません。 非ブロッキング待機ハンドルでは、接続操作は直ちに 0 を返し、GetLastError 関数はERROR_PIPE_LISTENINGを返します。
既定では、CreateNamedPipe または CreateFile関数によって返されるすべての名前付きパイプ ハンドルは、ブロッキング待機モードが有効になっている状態で作成されます。 パイプを非ブロッキング待機モードで作成するために、パイプ サーバーは CreateNamedPipe 呼び出すときにPIPE_NOWAITを指定します。
パイプ クライアントとパイプ サーバーの両方で、SetNamedPipeHandleState 関数の呼び出しでPIPE_WAITまたはPIPE_NOWAITを指定することで、パイプ ハンドルの待機モードを変更できます。
手記
非ブロッキング待機モードは、Microsoft LAN Manager バージョン 2.0 との互換性のためにサポートされています。 このモードは、名前付きパイプで重複する入出力 (I/O) を実現するために使用しないでください。 重複した I/O を代わりに使用する必要があります。これは、関数が戻った後にバックグラウンドで時間のかかる操作を実行できるためです。 重複する I/O の詳細については、「同期および重複入力および出力を参照してください。