<Return[C]><Top>

CreateNamedPipe

Declare Function Api_CreateNamedPipe& Lib "kernel32" Alias "CreateNamedPipeA" (ByVal Name$, ByVal dwOpenMode&, ByVal PipeMode&, ByVal MaxInst&, ByVal OutBufferSize&, ByVal nInBufferSize&, ByVal nDefaultTimeOut&, SecurityAttributes As SECURITY_ATTRIBUTES)

Declare Function CreateNamedPipe Lib "kernel32" Alias "CreateNamedPipeA" (ByVal lpName As String, ByVal dwOpenMode As Long, ByVal dwPipeMode As Long, ByVal nMaxInstances As Long, ByVal nOutBufferSize As Long, ByVal nInBufferSize As Long, ByVal nDefaultTimeOut As Long, lpSecurityAttributes As SECURITY_ATTRIBUTES) As Long

名前付きパイプのインスタンスを作成し、そのインスタンスのハンドルを返す。その後、そのハンドルを使ってパイプの操作を行える。名前付きパイプのサーバープロセスはこの関数を使って、新しい名前付きパイプの最初のインスタンスを作成して基本的な属性を設定したり、既存の名前付きパイプの新しいインスタンスを作成できる。

パラメータ
lpName
    パイプの名前を保持している、NULL で終わる一意の文字列へのポインタを指定する。文字列の形式は次のとおりである。
    \\.\pipe\pipename
    pipename の部分では、円記号(\)を除き、数字や記号を含む任意の文字を指定できる。パイプ名全体の最大の長さは 256 文字である。

    パイプ名では、大文字と小文字を区別しない。
dwOpenMode
    パイプハンドルのパイプアクセス、オーバーラップ(非同期)、ライトスルー、セキュリティの各モードを指定する。
dwOpenMode パラメータで、以下の表に掲載されていないフラグを指定すると、CreateNamedPipe 関数は失敗する。
    アクセスモードは、次の値のいずれかで指定する。パイプの各インスタンスで、同じ値を指定しなければならない。

    値                                          

説明                                                                                                           

    PIPE_ACCESS_DUPLEX

 

 

 

パイプは双方向である。サーバーとクライアントの両方がパイプの読み書きを行えるす。GENERIC_READ | GENERIC_WRITE アクセスを指定することに相当する。クライアント側は 関数を使ってパイプへ接続する際に、GENERIC_READ と GENERIC_WRITE アクセスの一方または両方を指定できる。

    PIPE_ACCESS_INBOUND

 

 

パイプ内のデータの流れを、クライアントからサーバーへの方向に限定する。サーバー側でそのパイプに対して GENERIC_READ アクセスを指定することに相当する。クライアント側はこのパイプへ接続する際に、GENERIC_WRITE アクセスを指定しなければならない。

    PIPE_ACCESS_OUTBOUND

 

 

パイプ内のデータの流れを、サーバーからクライアントへの方向に限定する。サーバー側でそのパイプに対して GENERIC_WRITE アクセスを指定することに相当する。クライアント側はこのパイプへ接続する際に、GENERIC_READ アクセスを指定しなければならない。

    ライトスルーモードとオーバーラップモードは、次の値の任意の組み合わせで指定する。これらのモードは、同じパイプの各インスタンスで異な

    っていてもかまわない。
 

    値                                                  

説明                                                                                                            

    FILE_FLAG_WRITE_THROUGH

 

 

 

 

ライトスルーモードを有効にする。クライアントプロセスとサーバープロセスを異なったコンピュータで実行していて、バイトタイプのパイプを使っている場合にのみ、このモードが影響を及ぼす。このモードが有効な場合、名前付きパイプにデータを書き込む関数は、書き込んだデータがネットワーク経由で送信されて、リモートコンピュータ上にあるパイプのバッファに格納されるまで、制御を返さない。このモードが無効な場合、システムは最小バイト数が蓄積されるまで、または最大の時間が経過するまでデータのバッファリングを行うことにより、ネットワークの使用効率を向上させる。

    FILE_FLAG_OVERLAPPED

 

 

 

オーバーラップ(非同期)モードを有効にする。このモードが有効な場合、読み取り、書き込み、接続など完了するまでにかなり長い時間がかかる可能性のある操作を行う関数は、すぐに制御を返す。スレッドはこのモードを使うと、時間のかかる操作をバックグラウンドで実行している間に、他の操作を開始できる。このモードが無効な場合、パイプの読み取り、書き込み、接続を行う関数は、その操作が完了するまで制御を返さない。

    セキュリティモードは、次の値の任意の組み合わせで指定する。これらのモードは、同じパイプの各インスタンスで異なっていてもかまわな

    い。パラメータの他のモードでどのような値を指定したかにかかわりなく、これらの値を指定できる。

    値                                              

説明                                                                                                            

    WRITE_DAC

呼び出し側に、名前付きパイプの DACL(随意アクセス制御リスト)への書き込みアクセス権を割り当てる。

    WRITE_OWNER

呼び出し側に、名前付きパイプのオーナーへの書き込みアクセス権を割り当てる。

    ACCESS_SYSTEM_SECURITY

 

呼び出し側に、名前付きパイプの SACL(システムアクセス制御リスト)への書き込みアクセス権を割り当てる。

dwPipeMode
    パイプハンドルのタイプ、読み取りモード、待機モードを指定する。
    パイプハンドルのタイプモードは、次の値のいずれかで指定する。パイプの各インスタンスで、同じタイプモードを指定しなければならない。

    0 を指定すると、既定としてバイトタイプモードが割り当てられる。

    値                                    

説明                                                                                                                     

    PIPE_TYPE_BYTE

 

バイトストリームのデータをパイプに書き込む。PIPE_READMODE_MESSAGE と同時に指定することはできない。

    PIPE_TYPE_MESSAGE

 

メッセージストリームのデータをパイプに書き込む。PIPE_READMODE_MESSAGE または PIPE_READMODE_BYTE のいずれかと組み合わせて指定できる。

    読み取りモードは、次の値のいずれかで指定する。これらのモードは、パイプの各インスタンスで異なっていてもかまわない。0 を指定する

    と、既定としてバイト読み取りモードが割り当てられる。

    値                                             

説明                                                                                                            

    PIPE_READMODE_BYTE

 

パイプのデータを、バイトストリームのデータとして読み取る。PIPE_TYPE_MESSAGE または PIPE_TYPE_BYTE のいずれかと組み合わせて指定できる。

    PIPE_READMODE_MESSAGE

 

パイプのデータをメッセージストリームのデータとして読み取る。PIPE_TYPE_MESSAGE を指定した場合にのみ、PIPE_READMODE_MESSAGE を指定できる。

    待機モードは、次の値のいずれかで指定する。これらのモードは、同じパイプの各インスタンスで異なっていてもかまわない。0 を指定する

    と、既定としてブロッキングモードが割り当てられる。
 

    値                                       

説明                                                                                                                 

    PIPE_WAIT

 

 

 

ブロッキングモードを有効にする。このモードでは、 関数は読み取るデータが発生するまで、 関数はデータがすべて書き込まれるまで、ConnectNamedPipe 関数はクライアントに接続されるまで制御を返さない。このモードを使うと、特定の状況では、クライアントプロセスが何か操作を行うまで長い時間待機する可能性がある。

    PIPE_NOWAIT

 

ノンブロッキングモードを有効にする。このモードでは、ReadFile、WriteFile、ConnectNamedPipe の各関数は必ず、即座に制御を返す。

    ノンブロッキングモードは、Microsoft LAN Lanager 2.0 との互換性を保つ目的でサポートされている。名前付きパイプで非同期入出力

    (I/O)を行うために使うことは避ける。
nMaxInstances
    このパイプに対して作成できるインスタンスの最大数を指定する。パイプの各インスタンスで同じ値を指定しなければならない。

    1〜PIPE_UNLIMITED_INSTANCES(Winbase.h で 255 と定義されている)の値を指定する。PIPE_UNLIMITED_INSTANCES を指

    定すると、システムのリソースが利用できる限り、インスタンスを作成できる。
nOutBufferSize
    出力バッファで予約するべきバイト数を指定する。
nInBufferSize
    入力バッファで予約するべきバイト数を指定する。
nDefaultTimeOut
    WaitNamedPipe 関数で NMPWAIT_USE_DEFAULT_WAIT を指定した場合に適用される、既定のタイムアウト値をミリ秒(ms)単位で

    指定する。パイプの各インスタンスで同じ値を指定しなければならない。
lpSecurityAttributes
    1 個の 構造体へのポインタを指定する。この構造体で、子プロセスが、返されたハンドルを継承できるかどうかを指定する。このパラメータ

    で NULL を指定すると、既定のセキュリティ記述子が使われ、ハンドルを継承できない。

戻り値
    関数が成功すると、名前付きパイプのインスタンスのサーバー側のハンドルが返る。
    関数が失敗すると、INVALID_HANDLE_VALUE が返る。拡張エラー情報を取得するには、 関数を使う。nMaxInstances パラメータ

    の値が PIPE_UNLIMITED_INSTANCES より大きい場合、ERROR_INVALID_PARAMETER が返る。

解説
    CreateNamedPipe 関数を使って名前付きパイプのインスタンスを作成するには、ユーザーはその名前付きパイプオブジェクトへの

    FILE_CREATE_PIPE_INSTANCE アクセス権を持っていなければならない。新しい名前付きパイプを作成する場合、セキュリティ属性に

    関係するパラメータで指定されたアクセス制御リスト(ACL)が、その名前付きパイプの随意アクセス制御リスト(DACL)を定義する。
    1 つの名前付きパイプのすべてのインスタンスで、パイプハンドルのタイプ(バイトタイプまたはメッセージタイプ)、アクセスモード(双方向、着

    信、発信のいずれか)、インスタンスの最大数、タイムアウト値の同じ値を指定しなければならない。異なる値を指定すると、

    CreateNamedPipe 関数は失敗し、GetLastError 関数は ERROR_ACCESS_DENIED を返す。
    名前付きパイプのサーバー側がメッセージモードに設定されている場合でも、クライアント側はバイトモードで開始される。データを受信する際

    に問題が発生することを防止するために、必要に応じてクライアント側をメッセージモードに設定する。
    入力バッファと出力バッファで指定したサイズは、参考として使われるだけである。名前付きパイプの両側で割り当てられる実際のバッファサ

   イズは、システムの既定値、システムの最小値、システムの最大値、指定されたサイズをすぐ上の割り当て境界値へ丸めた値のいずれか

    である。
    パイプのサーバー側は、パイプのクライアントが処理を開始するまでは、ブロッキングモードの読み取り操作を行うべきではない。さもないと、

    競合が発生することがある。C のランタイムなどの初期化コードは、継承されたハンドルをロックして検討する必要があるが、通常、この競

    合が発生するのは、このような場合である。
    名前付きパイプの 1 つのインスタンスに対して 1 つまたは複数のハンドルを作成した後、最後のハンドルを閉じると、そのインスタンスは必ず

    削除される。