次の方法で共有


CreateNamedPipeA 関数 (winbase.h)

名前付きパイプのインスタンスを作成し、後続のパイプ操作のハンドルを返します。 名前付きパイプ サーバー プロセスでは、この関数を使用して、特定の名前付きパイプの最初のインスタンスを作成し、その基本属性を確立するか、既存の名前付きパイプの新しいインスタンスを作成します。

構文

HANDLE CreateNamedPipeA(
  [in]           LPCSTR                lpName,
  [in]           DWORD                 dwOpenMode,
  [in]           DWORD                 dwPipeMode,
  [in]           DWORD                 nMaxInstances,
  [in]           DWORD                 nOutBufferSize,
  [in]           DWORD                 nInBufferSize,
  [in]           DWORD                 nDefaultTimeOut,
  [in, optional] LPSECURITY_ATTRIBUTES lpSecurityAttributes
);

パラメーター

[in] lpName

一意のパイプ名。 この文字列は、次の形式である必要があります。

\\.\pipe\pipename

名前のパイプ名部分には、円記号以外の任意の文字 (数字や特殊文字を含む) を含めることができます。 パイプ名の文字列全体は、最大 256 文字です。 パイプ名では大文字と小文字は区別されません。

[in] dwOpenMode

開いているモード。

dwOpenMode 0 以外の値または次の表に示すフラグを指定すると、関数は失敗します。

このパラメーターは、次のいずれかのパイプ アクセス モードを指定する必要があります。 パイプのインスタンスごとに同じモードを指定する必要があります。

モード 意味
PIPE_ACCESS_DUPLEX
0x00000003
パイプは双方向です。サーバー プロセスとクライアント プロセスの両方で、パイプの読み取りと書き込みを行うことができます。 このモードにより、サーバーはパイプに対する GENERIC_READGENERIC_WRITE アクセスに相当します。 クライアントは、CreateFile 関数を使用してパイプに接続するときに、GENERIC_READ または GENERIC_WRITEまたはその両方を指定できます。
PIPE_ACCESS_INBOUND
0x00000001
パイプ内のデータフローは、クライアントからサーバーにのみ送られます。 このモードにより、サーバーはパイプに対する GENERIC_READ アクセスに相当します。 クライアントは、パイプに接続するときに GENERIC_WRITE アクセスを指定する必要があります。 GetNamedPipeInfoまたは GetNamedPipeHandleState 関数を呼び出してパイプ設定を読み取る必要がある場合、クライアントはパイプに接続するときに GENERIC_WRITEFILE_READ_ATTRIBUTES アクセスを指定する必要があります。
PIPE_ACCESS_OUTBOUND
0x00000002
パイプ内のデータフローは、サーバーからクライアントにのみ送信されます。 このモードにより、サーバーはパイプへの GENERIC_WRITE アクセスに相当します。 クライアントは、パイプに接続するときに GENERIC_READ アクセスを指定する必要があります。 SetNamedPipeHandleState 関数を呼び出して、クライアントがパイプ設定を変更する必要がある場合、クライアントはパイプに接続するときに GENERIC_READFILE_WRITE_ATTRIBUTES アクセスを指定する必要があります。
 

このパラメーターには、書き込みモードと重複モードを有効にする次のフラグを 1 つ以上含めることもできます。 これらのモードは、同じパイプのインスタンスごとに異なる場合があります。

モード 意味
FILE_FLAG_FIRST_PIPE_INSTANCE
0x00080000
このフラグを使用してパイプの複数のインスタンスを作成しようとすると、最初のインスタンスの作成は成功しますが、次のインスタンスの作成は ERROR_ACCESS_DENIEDで失敗します。
FILE_FLAG_WRITE_THROUGH
0x80000000
ライトスルー モードが有効になっています。 このモードは、バイト型パイプに対する書き込み操作にのみ影響し、クライアントプロセスとサーバー プロセスが異なるコンピューター上にある場合にのみ影響します。 このモードが有効な場合、名前付きパイプに書き込む関数は、書き込まれたデータがネットワーク経由で送信され、リモート コンピューター上のパイプのバッファー内にあるまで戻りません。 このモードが有効でない場合、最小バイト数が蓄積されるまで、または最大時間が経過するまでデータをバッファリングすることで、システムはネットワーク操作の効率を高めます。
FILE_FLAG_OVERLAPPED
0x40000000
重複モードが有効になっています。 このモードが有効になっている場合、完了するまでにかなりの時間がかかる可能性がある読み取り、書き込み、接続の操作を実行する関数は、すぐに戻ることができます。 このモードを使用すると、操作を開始したスレッドは、時間のかかる操作がバックグラウンドで実行されている間、他の操作を実行できます。 たとえば、重複モードでは、スレッドは、パイプの複数のインスタンスに対する同時入出力 (I/O) 操作を処理したり、同じパイプ ハンドルに対して同時読み取りと書き込み操作を実行したりできます。 重複モードが有効になっていない場合、パイプ ハンドルに対して読み取り、書き込み、接続操作を実行する関数は、操作が完了するまで戻りません。 ReadFileEx 関数と writeFileEx 関数 は、重複モードのパイプ ハンドルでのみ使用できます。 ReadFileWriteFileConnectNamedPipe、および TransactNamedPipe 関数 は、同期的または重複した操作として実行できます。
 

このパラメーターには、次のセキュリティ アクセス モードの任意の組み合わせを含めることができます。 これらのモードは、同じパイプのインスタンスごとに異なる場合があります。

モード 意味
WRITE_DAC
0x00040000L
呼び出し元は、名前付きパイプの随意アクセス制御リスト (ACL) への書き込みアクセス権を持ちます。
WRITE_OWNER
0x00080000L
呼び出し元は、名前付きパイプの所有者への書き込みアクセス権を持ちます。
ACCESS_SYSTEM_SECURITY
0x01000000L
呼び出し元は、名前付きパイプの SACL への書き込みアクセス権を持ちます。 詳細については、「Access-Control リスト (ACL)」および「SACL アクセス権限」を参照してください。

[in] dwPipeMode

パイプ モード。

dwPipeMode が 0 以外の値または次の表に示すフラグを指定した場合、関数は失敗します。

次のいずれかの型モードを指定できます。 パイプのインスタンスごとに同じ型モードを指定する必要があります。

モード 意味
PIPE_TYPE_BYTE
0x00000000
データは、バイト ストリームとしてパイプに書き込まれます。 このモードは、PIPE_READMODE_MESSAGEでは使用できません。 パイプは、異なる書き込み操作中に書き込まれたバイトを区別しません。
PIPE_TYPE_MESSAGE
0x00000004
データは、メッセージのストリームとしてパイプに書き込まれます。 パイプは、各書き込み操作中に書き込まれたバイトをメッセージ単位として扱います。 GetLastError 関数は、メッセージが完全に読み取られない場合に ERROR_MORE_DATA を返します。 このモードは、PIPE_READMODE_MESSAGE または PIPE_READMODE_BYTEで使用できます。
 

次のいずれかの読み取りモードを指定できます。 同じパイプのインスタンスごとに、異なる読み取りモードを指定できます。

モード 意味
PIPE_READMODE_BYTE
0x00000000
データは、バイト ストリームとしてパイプから読み取られます。 このモードは、PIPE_TYPE_MESSAGE または PIPE_TYPE_BYTEで使用できます。
PIPE_READMODE_MESSAGE
0x00000002
データは、メッセージのストリームとしてパイプから読み取られます。 このモードは、PIPE_TYPE_MESSAGE も指定されている場合にのみ使用できます。
 

次のいずれかの待機モードを指定できます。 同じパイプのインスタンスごとに、異なる待機モードを指定できます。

モード 意味
PIPE_WAIT
0x00000000
ブロック モードが有効になっています。 パイプ ハンドルが ReadFileWriteFile、または ConnectNamedPipe 関数 指定されている場合、読み取るデータ、すべてのデータが書き込まれる、またはクライアントが接続されるまで、操作は完了しません。 このモードを使用すると、クライアント プロセスがアクションを実行するために、状況によっては無期限に待機することを意味する場合があります。
PIPE_NOWAIT
0x00000001
非ブロッキング モードが有効になっています。 このモードでは、ReadFile、WriteFile、ConnectNamedPipe 常にすぐに戻ります。

非ブロッキング モードは Microsoft LAN Manager バージョン 2.0 との互換性のためにサポートされており、名前付きパイプで非同期 I/O を実現するために使用しないでください。 非同期パイプ I/O の詳細については、「同期および重複入力と出力のを参照してください。

 

次のいずれかのリモート クライアント モードを指定できます。 同じパイプのインスタンスごとに、異なるリモート クライアント モードを指定できます。

モード 意味
PIPE_ACCEPT_REMOTE_CLIENTS
0x00000000
リモート クライアントからの接続を受け入れ、パイプのセキュリティ記述子に対して確認できます。
PIPE_REJECT_REMOTE_CLIENTS
0x00000008
リモート クライアントからの接続は自動的に拒否されます。

[in] nMaxInstances

このパイプに対して作成できるインスタンスの最大数。 パイプの最初のインスタンスでは、この値を指定できます。パイプの他のインスタンスに対して同じ番号を指定する必要があります。 使用可能な値は、1 ~ PIPE_UNLIMITED_INSTANCES (255) の範囲です。

このパラメーターが PIPE_UNLIMITED_INSTANCESされている場合、作成できるパイプ インスタンスの数は、システム リソースの可用性によってのみ制限されます。 nMaxInstancesPIPE_UNLIMITED_INSTANCESより大きい場合、戻り値は INVALID_HANDLE_VALUE され、GetLastError ERROR_INVALID_PARAMETERを返します。

[in] nOutBufferSize

出力バッファー用に予約するバイト数。 名前付きパイプ バッファーのサイズ設定については、次の「解説」セクションを参照してください。

[in] nInBufferSize

入力バッファー用に予約するバイト数。 名前付きパイプ バッファーのサイズ設定については、次の「解説」セクションを参照してください。

[in] nDefaultTimeOut

WaitNamedPipe 関数が NMPWAIT_USE_DEFAULT_WAITを指定する場合の、既定のタイムアウト値 (ミリ秒単位)。 名前付きパイプの各インスタンスは、同じ値を指定する必要があります。

値が 0 の場合、既定のタイムアウトは 50 ミリ秒になります。

[in, optional] lpSecurityAttributes

新しい名前付きパイプのセキュリティ記述子を指定し、子プロセスが返されたハンドルを継承できるかどうかを判断する SECURITY_ATTRIBUTES 構造体へのポインター。 lpSecurityAttributes が NULL場合、名前付きパイプは既定のセキュリティ記述子を取得し、ハンドルを継承できません。 名前付きパイプの既定のセキュリティ記述子の ACL は、LocalSystem アカウント、管理者、および作成者所有者にフル コントロールを付与します。 また、Everyone グループと匿名アカウントのメンバーに読み取りアクセス権を付与します。

戻り値

関数が成功した場合、戻り値は名前付きパイプ インスタンスのサーバー末尾へのハンドルです。

関数が失敗した場合、戻り値は INVALID_HANDLE_VALUE。 拡張エラー情報を取得するには、GetLastError呼び出します。

備考

CreateNamedPipeを使用して名前付きパイプのインスタンス 作成するには、名前付きパイプ オブジェクトに FILE_CREATE_PIPE_INSTANCE アクセスできる必要があります。 新しい名前付きパイプを作成する場合は、セキュリティ属性パラメーターのアクセス制御リスト (ACL) によって、名前付きパイプの随意アクセス制御が定義されます。

名前付きパイプのすべてのインスタンスは、同じパイプの種類 (バイト型またはメッセージ型)、パイプ アクセス (双方向、受信、または送信)、インスタンス数、タイムアウト値を指定する必要があります。 異なる値が使用されている場合、この関数は失敗し、GetLastError ERROR_ACCESS_DENIEDを返します。

クライアント プロセスは、CreateFile または CallNamedPipe 関数 使用して、名前付きパイプに接続します。 サーバー側がメッセージ モードの場合でも、名前付きパイプのクライアント側はバイト モードで開始されます。 データの受信に関する問題を回避するには、クライアント側もメッセージ モードに設定します。 パイプのモードを変更するには、パイプ クライアントは、GENERIC_READFILE_WRITE_ATTRIBUTES アクセス権を持つ読み取り専用パイプを開く必要があります。

パイプ サーバーは、パイプ クライアントが起動するまでブロック読み取り操作を実行しないでください。 そうしないと、競合状態が発生する可能性があります。 これは通常、C ランタイムなどの初期化コードで、継承されたハンドルをロックして調べる必要がある場合に発生します。

名前付きパイプが作成されるたびに、システムは非ページ プール (カーネルによって使用される物理メモリ) を使用して受信バッファーまたは送信バッファーを作成します。 作成できるパイプ インスタンス (およびスレッドやプロセスなどのオブジェクト) の数は、使用可能な非ページ プールによって制限されます。 各読み取りまたは書き込み要求には、読み取りまたは書き込みデータ用のバッファー内の領域と、内部データ構造用の追加の領域が必要です。

入力バッファー サイズと出力バッファー サイズはアドバイザリです。 名前付きパイプの各端に予約されている実際のバッファー サイズは、システムの既定値、システムの最小値または最大値、または次の割り当て境界に切り上げられた指定されたサイズのいずれかです。 指定するバッファー サイズは、プロセスが非ページ プールを使い果たさないほど小さく、一般的な要求に対応できるだけの大きさにする必要があります。

パイプ書き込み操作が発生するたびに、システムはまず、パイプ書き込みクォータに対してメモリの充電を試みます。 残りのパイプ書き込みクォータが要求を満たすのに十分な場合、書き込み操作はすぐに完了します。 残りのパイプ書き込みクォータが小さすぎて要求を満たしていない場合、システムは、プロセス用に予約された非ページ プールを使用して、データに対応するようにバッファーを拡張しようとします。 書き込み操作は、追加のバッファー クォータを解放できるように、パイプからデータが読み取られるまでブロックされます。 したがって、指定したバッファー サイズが小さすぎると、システムは必要に応じてバッファーを拡張しますが、欠点は操作がブロックされるということです。 操作が重複している場合、システム スレッドはブロックされます。それ以外の場合、アプリケーション スレッドはブロックされます。

名前付きパイプで使用されるリソースを解放するには、アプリケーションは、必要なくなったときに常にハンドルを閉じる必要があります。これは、CloseHandle 関数を呼び出すか、インスタンス ハンドルに関連付けられているプロセスが終了したときに実行されます。 名前付きパイプのインスタンスには、複数のハンドルが関連付けられている場合があることに注意してください。 名前付きパイプのインスタンスの最後のハンドルが閉じられると、名前付きパイプのインスタンスは常に削除されます。

Windows 10 バージョン 1709: パイプは、アプリ コンテナー内でのみサポートされます。つまり、1 つの UWP プロセスから、同じアプリの一部である別の UWP プロセスまでです。 また、名前付きパイプでは、パイプ名の構文 \\.\pipe\LOCAL\ を使用する必要があります。

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

必要条件

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

関連項目

ConnectNamedPipe の

CreateFile の

パイプ関数 を する

パイプの概要

ReadFile の

ReadFileEx の

SECURITY_ATTRIBUTES

TransactNamedPipe の

WaitNamedPipe の

WriteFile の

WriteFileEx の