次の方法で共有


ConnectNamedPipe 関数 (namedpipeapi.h)

名前付きパイプ サーバー プロセスが、クライアント プロセスが名前付きパイプのインスタンスに接続するのを待機できるようにします。 クライアント プロセスは、CreateFile または CallNamedPipe 関数 呼び出すことによって接続します。

構文

BOOL ConnectNamedPipe(
  [in]                HANDLE       hNamedPipe,
  [in, out, optional] LPOVERLAPPED lpOverlapped
);

パラメーター

[in] hNamedPipe

名前付きパイプ インスタンスのサーバー側へのハンドル。 このハンドルは、CreateNamedPipe 関数によって返されます。

[in, out, optional] lpOverlapped

OVERLAPPED 構造体へのポインター。

hNamedPipe FILE_FLAG_OVERLAPPEDで開かれた場合、lpOverlapped パラメーターは NULLできません。 有効な OVERLAPPED 構造体を指している必要があります。 hNamedPipe FILE_FLAG_OVERLAPPEDで開き、lpOverlapped が NULL場合、関数は接続操作が完了したことを誤って報告する可能性があります。

hNamedPipe FILE_FLAG_OVERLAPPEDで作成され、lpOverlapped が NULLされていない場合、OVERLAPPED 構造体には、手動リセット イベント オブジェクト (CreateEvent 関数を使用してサーバーが作成できる) へのハンドルが含まれている必要があります。

hNamedPipe FILE_FLAG_OVERLAPPEDで開かれていた場合、クライアントが接続されるかエラーが発生するまで、関数は戻りません。 同期操作が成功すると、関数が呼び出された後にクライアントが接続した場合、関数は 0 以外の値を返します。

戻り値

操作が同期の場合、ConnectNamedPipe は操作が完了するまで戻りません。 関数が成功した場合、戻り値は 0 以外です。 関数が失敗した場合、戻り値は 0 です。 拡張エラー情報を取得するには、GetLastError呼び出します。

操作が非同期の場合、ConnectNamedPipe はすぐに返されます。 操作がまだ保留中の場合、戻り値は 0 で、GetLastError はERROR_IO_PENDINGを返します。 (HasOverlappedIoCompleted マクロを使用して、操作がいつ終了したかを判断できます)。関数が失敗した場合、戻り値は 0 で、GetLastError ERROR_IO_PENDINGまたはERROR_PIPE_CONNECTED以外の値が返されます。

クライアントが関数を呼び出す前に接続すると、関数は 0 を返し、GetLastError ERROR_PIPE_CONNECTED返します。 これは、クライアントが CreateNamedPipe への呼び出しと ConnectNamedPipeの呼び出し 呼び出しの間 間隔で接続した場合に発生する可能性があります。 この状況では、関数が 0 を返す場合でも、クライアントとサーバーの間に良好な接続があります。

備考

名前付きパイプ サーバー プロセスでは、新しく作成されたパイプ インスタンス ConnectNamedPipe を使用できます。 また、以前に別のクライアント プロセスに接続されていたインスタンスと共に使用することもできます。この場合、サーバー プロセスは、ハンドルを新しいクライアントに再接続する前に、最初に DisconnectNamedPipe 関数を呼び出して、前のクライアントからハンドルを切断する必要があります。 それ以外の場合、ConnectNamedPipe は 0 を返し、GetLastError は、前のクライアントがハンドルを閉じた場合はERROR_NO_DATA、ハンドルを閉じていない場合はERROR_PIPE_CONNECTEDを返します。

ConnectNamedPipe の動作は、パイプ ハンドルの待機モードがブロックモードに設定されているか非ブロッキングに設定されているか、関数が同期的に実行されるように設定されているか、重複モードで実行されるように設定されているかという 2 つの条件によって異なります。 サーバーは最初に、CreateNamedPipe 関数でパイプ ハンドルの待機モードを指定します。SetNamedPipeHandleState 関数を使用して変更できます。

サーバー プロセスは、待機関数 または SleepExを使用して、イベント オブジェクトの状態が通知されるタイミングを判断し、HasOverlappedIoCompleted マクロを使用して、ConnectNamedPipe 操作がいつ完了するかを判断できます。

指定したパイプ ハンドルが非ブロッキング モードの場合、ConnectNamedPipe は常に直ちに返されます。 非ブロッキング モードでは、ConnectNamedPipe は、前のクライアントから切断されたパイプ インスタンスに対して最初に呼び出されるときに、0 以外の値を返します。 これは、パイプが新しいクライアント プロセスに接続できるようになったことを示します。 パイプ ハンドルが非ブロッキング モードの場合、他のすべての状況では、ConnectNamedPipe 0 が返されます。 このような状況では、GetLastError は、クライアントが接続されていない場合はERROR_PIPE_LISTENINGを返し、クライアントが接続されている場合はERROR_PIPE_CONNECTEDし、前のクライアントがパイプ ハンドルを閉じてもサーバーが切断されていない場合はERROR_NO_DATAします。 クライアントとサーバーの間に適切な接続が存在するのは、ERROR_PIPE_CONNECTED エラーが発生した後であることに注意してください。

非ブロッキング モードは、Microsoft LAN Manager バージョン 2.0 との互換性のためにサポートされており、名前付きパイプを使用した非同期入出力 (I/O) を実現するために使用しないでください。
 
Windows 10 バージョン 1709 以降: パイプを使用してアプリ コンテナー間の通信を行うことはできません。つまり、1 つの UWP プロセスから、同じアプリに含まれていない別の UWP プロセスまでです。 また、app-containers 内の名前付きパイプでは、パイプ名に構文 '\\.\pipe\LOCAL\' を使用する必要があります。

例については、「マルチスレッド パイプ サーバー」を参照してください。

必要条件

要件 価値
サポートされる最小クライアント Windows 2000 Professional [デスクトップ アプリ |UWP アプリ]
サポートされる最小サーバー Windows 2000 Server [デスクトップ アプリ |UWP アプリ]
ターゲット プラットフォーム の ウィンドウズ
ヘッダー namedpipeapi.h
ライブラリ Kernel32.lib
DLL Kernel32.dll

関連項目

CallNamedPipe の

CreateEvent の

CreateFile の

CreateNamedPipe の

DisconnectNamedPipe の

GetOverlappedResult の

重複する を する

パイプ関数 を する

パイプの概要

SetNamedPipeHandleState の

SleepEx を する