匿名パイプ操作
CreatePipe 関数は、匿名パイプを作成し、パイプへの読み取りハンドルとパイプへの書き込みハンドルの 2 つのハンドルを返します。 読み取りハンドルはパイプへの読み取り専用アクセス権を持ち、書き込みハンドルはパイプへの書き込み専用アクセス権を持っています。 パイプを使用して通信するには、パイプ サーバーがパイプ ハンドルを別のプロセスに渡す必要があります。 通常、これは継承によって行われます。つまり、プロセスでは、子プロセスによってハンドルを継承できます。 また、 DuplicateHandle 関数を使用してパイプ ハンドルを複製し、DDE や共有メモリなどの何らかの形式のプロセス間通信を使用して、関連のないプロセスに送信することもできます。
パイプ サーバーは、クライアントが匿名パイプを使用して情報を送信するか情報を受信するかに応じて、読み取りハンドルまたは書き込みハンドルをパイプ クライアントに送信できます。 パイプから読み取る場合は、 ReadFile 関数の呼び出しでパイプの読み取りハンドルを使用します。 ReadFile 呼び出しは、別のプロセスがパイプに書き込まれたときに を返します。 ReadFile 呼び出しは、パイプへのすべての書き込みハンドルが閉じている場合、または読み取り操作が完了する前にエラーが発生した場合にもを返すことができます。
パイプに書き込むには、 WriteFile 関数の呼び出しでパイプの書き込みハンドルを使用します。 WriteFile 呼び出しは、指定したバイト数をパイプに書き込むか、エラーが発生するまで戻りません。 パイプ バッファーがいっぱいで、書き込むバイト数が多い場合、別のプロセスがパイプから読み取るまで WriteFile は戻らず、バッファー領域を増やします。 パイプ サーバーは、 CreatePipe を呼び出すときにパイプのバッファー サイズを指定します。
非同期 (重複) の読み取り操作と書き込み操作は、匿名パイプではサポートされていません。 つまり、匿名パイプで ReadFileEx 関数と WriteFileEx 関数を 使用することはできません。 さらに、これらの関数を匿名パイプで使用する場合、ReadFile と WriteFile のlpOverlapped パラメーターは無視されます。
匿名パイプは、読み取りと書き込みの両方のパイプ ハンドルが閉じられるまで存在します。 プロセスでは、 CloseHandle 関数を使用してパイプ ハンドルを閉じることができます。 プロセスが終了すると、すべてのパイプ ハンドルも閉じられます。
匿名パイプは、一意の名前を持つ名前付きパイプを使用して実装されます。 そのため、名前付きパイプへのハンドルを必要とする関数に、匿名パイプにハンドルを渡すことができることがよくあります。