<Return[T]><Top>

TransactNamedPipe

Declare Function Api_TransactNamedPipe& Lib "kernel32" Alias "TransactNamedPipe" (ByVal hNamedPipe&, lpInBuffer As Any, ByVal nInBufferSize&, lpOutBuffer As Any, ByVal nOutBufferSize&, lpBytesRead&, lpOverlapped As OVERLAPPED)

Declare Function TransactNamedPipe Lib "kernel32" Alias "TransactNamedPipe" (ByVal hNamedPipe As Long, lpInBuffer As Any, ByVal nInBufferSize As Long, lpOutBuffer As Any, ByVal nOutBufferSize As Long, lpBytesRead As Long, lpOverlapped As OVERLAPPED) As Long

指定された名前付きパイプに対する書き込み操作と読み取り操作を組み合わせ、1 回のネットワーク操作を形成する。

パラメータ
hNamedPipe
    名前付きパイプのハンドルを指定する。このハンドルは、CreateNamedPipe 関数または 関数が返したものである。
    Windows NT/2000:このパラメータで、CreatePipe 関数が返した名前なしパイプのハンドルを指定することもできる。
lpInBuffer
    パイプに書き込むべきデータを保持している、1 個のバッファへのポインタを指定する。
nInBufferSize
     書き込みバッファのサイズを、バイト単位で指定する。
lpOutBuffer
    1 個のバッファへのポインタを指定する。関数から制御が返ると、このバッファに、パイプから読み取ったデータが格納される。
nOutBufferSize
    読み取りバッファのサイズを、バイト単位で指定する。
lpBytesRead
    1 個の変数へのポインタを指定する。関数から制御が返ると、この変数に、パイプから読み取ったバイト数が格納される。
    lpOverlapped パラメータで NULL を指定したときは、lpByteRead パラメータで NULL を指定できない。
    lpOverlapped パラメータで NULL 以外の値を指定した場合、lpByteRead パラメータで NULL を指定できる。オーバーラップ(非同期)読み

    取り操作を行う場合、 関数を呼び出すと、読み取ったバイト数を取得できる。hNamedPipe ハンドルが I/O 完了ポートに関連付けられてい

    る場合、 関数を呼び出すと、読み取ったバイト数を取得できる。
lpOverlapped
    1 個の 構造体へのポインタを指定する。hNamedPipe パラメータが、FILE_FLAG_OVERLAPPED フラグを指定して開いたパイプのハンド

    ルを指している場合、この構造体を指定する必要がある。
    hNamedPipe パラメータが、FILE_FLAG_OVERLAPPED フラグを指定して開いたパイプのハンドルを指している場合、lpOverlapped パラ

    メータで NULL を指定することはできない。このような場合に lpOverlapped パラメータで NULL を指定すると、実際には接続操作が完了

    していないのに、この関数は接続操作が完了したと報告することがある。
    hNamedPipe パラメータが、FILE_FLAG_OVERLAPPED フラグを指定して開いたパイプのハンドルを指していて、lpOverlapped パラメー

    タが NULL ではない場合、TransactNamedPipe 関数はオーバーラップ(非同期)操作として実行される。OVERLAPPED 構造体で、 関

    数を使って作成した手動リセットイベントオブジェクトを指定するべきである。指定された操作をすぐに完了できない場合、

    TransactNamedPipe 関数は 0(FALSE)を返し、GetLastError 関数は ERROR_IO_PENDING を返す。この場合、このイベントオブジェ

    クトは、関数が制御を返す前に非シグナル状態に設定され、操作が完了すると、シグナル状態になる。
    hNamedPipe パラメータが、FILE_FLAG_OVERLAPPED を指定せずに開いた名前付きパイプのハンドルを指している場合、

    TransactNamedPipe 関数は、操作が完了するまで制御を返さない。

戻り値
    関数が成功すると、0 以外の値が返る。
    関数が失敗すると、0 が返る。拡張エラー情報を取得するには、 関数を使う。

解説
    サーバーがメッセージタイプを指定せずにパイプを作成した場合や、パイプハンドルの読み取りモードがメッセージモードではなかった場合、こ

    の関数は失敗する。たとえば、クライアントプロセスがサーバープロセスと同じコンピュータで動作していて、\\.\pipe\pipename の形式を使

    ってパイプを開いた場合、名前付きファイルシステム(NPFS)はそのパイプをバイトモードで開く。クライアントが \\server\pipe\pipename の

    形式を使った場合、リダイレクタはそのパイプをメッセージモードで開く。SetNamedPipeHandleState 関数を使うと、バイトモードのパイプハ

    ンドルをメッセージ読み取りモードへ変更できる。
    パラメータで指定したバッファへのデータの書き込みが完了するまでは、この関数が成功して終了することはない。操作がバックグラウンドで

    実行されている間に、呼び出し側スレッドが他の操作を実行できるように、lpOverlapped パラメータが用意されている。
    読み取るべきメッセージが、nOutBufferSize パラメータで指定したサイズよりも長かった場合、この関数は 0(FALSE)を返し、

    GetLastError 関数は ERROR_MORE_DATA を返する。続けて、ReadFile、ReadFileEx、PeekNamedPipe のいずれかの関数を呼び

    出すと、残りのメッセージを読み取ることができる。