名前付きパイプ Visual Basic 32 ビット プログラムでの使用方法

文書翻訳 文書翻訳
文書番号: 177696
すべて展開する | すべて折りたたむ

目次

概要

Visual Basic の他のプロセスと通信するアプリケーションを作成できます。名前付きパイプを使用して。Windows 2000 や Windows NT の名前付きパイプを作成する必要があります。ただし、読み取りおよびそのパイプの書き込み任意の 32 ビット プラットフォームです。

この資料で名前付きパイプを使用してクライアント/サーバー通信を示しています。Visual Basic。

詳細

この記事では、NamedPipe を作成するプロセスは、サーバーと呼ばれます、名前付きパイプに接続するプロセスは、クライアントと呼ばれます。

名前付きパイプ サーバーを作成するのには、6 つの手順のとおりです。
  1. (にへのアクセスを許可するのには、パイプのセキュリティ トークンを作成します。利用可能なすべてのプロセスがセキュリティ トークンを作成するには名前付きパイプ随意アクセス制御リスト (0 個のエントリが DACL))。
  2. 名前付きパイプを作成します。
  3. クライアントが接続するまでブロックするのには、ConnectNamedPipe を呼び出します。
  4. ReadFile および WriteFile は、パイプ経由で通信するために呼び出します。
  5. DisconnectNamedPipe を呼び出して、処理が完了すると、パイプを使用します。
  6. か、CloseHandle を名前付きパイプ、または手順 4 に進みます。
名前付きパイプのクライアントからの名前付きパイプを使用するのには、3 つの手順があります。
  1. 名前付きパイプへのハンドルを取得するには、CreateFile を呼び出してください。
  2. ReadFile および WriteFile は、パイプ経由で通信するために呼び出します。
  3. CreateFile で作成したファイルハンドルの CloseHandle を呼び出します。
代わりが 1 回だけ実行する CallNamedPipe を呼び出す可能性があります。パイプ経由のトランザクション。CallNamedPipe は、パイプへの書き込みが開き、、それを読み取るし、パイプを閉じます。これは、次のクライアントの機能です。

次の例では、名前付きパイプ サーバーを作成する方法を示していて、クライアント。それが、最も基本的な機能のみを行うために必要な実装します。そのため、最低限のエラー チェックをします。完全なプログラム呼び出される api の場合、戻り値を確認してくださいではなく成功したと仮定します。

名前付きパイプ サーバー

  1. 新しいプロジェクトを作成します。デフォルトで Form1 が作成されます。
  2. 次のコードをフォームに追加します。
       Option Explicit
       Private Const szPipeName = "\\.\pipe\bigtest"
       Private Const BUFFSIZE = 20000
       Private BigBuffer(BUFFSIZE) As Byte, pSD As Long
       Private sa As SECURITY_ATTRIBUTES
       Private hPipe As Long
    
       Private Sub Form_Click()
          Dim i As Long, dwOpenMode As Long, dwPipeMode As Long
          Dim res As Long, nCount As Long, cbnCount As Long
          For i = 0 To BUFFSIZE - 1       'Fill an array of numbers
             BigBuffer(i) = i Mod 256
          Next i
    
          'Create the NULL security token for the pipe
          pSD = GlobalAlloc(GPTR, SECURITY_DESCRIPTOR_MIN_LENGTH)
          res = InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION)
          res = SetSecurityDescriptorDacl(pSD, -1, 0, 0)
          sa.nLength = LenB(sa)
          sa.lpSecurityDescriptor = pSD
          sa.bInheritHandle = True
    
          'Create the Named Pipe
          dwOpenMode = PIPE_ACCESS_DUPLEX Or FILE_FLAG_WRITE_THROUGH
          dwPipeMode = PIPE_WAIT Or PIPE_TYPE_MESSAGE Or PIPE_READMODE_MESSAGE
          hPipe = CreateNamedPipe(szPipeName, dwOpenMode, dwPipeMode, _
                                  10, 10000, 2000, 10000, sa)
    
          Do  'Wait for a connection, block until a client connects
             res = ConnectNamedPipe(hPipe, ByVal 0)
    
             'Read/Write data over the pipe
             cbnCount = 4
    
             res = ReadFile(hPipe, nCount, LenB(nCount), cbnCount, ByVal 0)
    
             If nCount <> 0 Then
    
                If nCount > BUFFSIZE Then 'Client requested nCount bytes
                   nCount = BUFFSIZE      'but only send up to 20000 bytes
                End If
                'Write the number of bytes requested
                res = WriteFile(hPipe, BigBuffer(0), nCount, cbnCount, ByVal 0)
                'Make sure the write is finished
                res = FlushFileBuffers(hPipe)
             End If
    
             'Disconnect the NamedPipe
             res = DisconnectNamedPipe(hPipe)
          Loop Until nCount = 0
    
          'Close the pipe handle
          CloseHandle hPipe
          GlobalFree (pSD)
          End
       End Sub
    					
  3. 新しいモジュールを作成し、次の宣言を追加します。
       Option Explicit
    
       Public Const FILE_ATTRIBUTE_NORMAL = &H80
       Public Const FILE_FLAG_NO_BUFFERING = &H20000000
       Public Const FILE_FLAG_WRITE_THROUGH = &H80000000
    
       Public Const PIPE_ACCESS_DUPLEX = &H3
       Public Const PIPE_READMODE_MESSAGE = &H2
       Public Const PIPE_TYPE_MESSAGE = &H4
       Public Const PIPE_WAIT = &H0
    
       Public Const INVALID_HANDLE_VALUE = -1
    
       Public Const SECURITY_DESCRIPTOR_MIN_LENGTH = (20)
       Public Const SECURITY_DESCRIPTOR_REVISION = (1)
    
       Type SECURITY_ATTRIBUTES
               nLength As Long
               lpSecurityDescriptor As Long
               bInheritHandle As Long
       End Type
    
       Public Const GMEM_FIXED = &H0
       Public Const GMEM_ZEROINIT = &H40
       Public Const GPTR = (GMEM_FIXED Or GMEM_ZEROINIT)
    
       Declare Function GlobalAlloc Lib "kernel32" ( _
          ByVal wFlags As Long, ByVal dwBytes As Long) As Long
       Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
       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 Any) As Long
    
       Declare Function InitializeSecurityDescriptor Lib "advapi32.dll" ( _
          ByVal pSecurityDescriptor As Long, _
          ByVal dwRevision As Long) As Long
    
       Declare Function SetSecurityDescriptorDacl Lib "advapi32.dll" ( _
          ByVal pSecurityDescriptor As Long, _
          ByVal bDaclPresent As Long, _
          ByVal pDacl As Long, _
          ByVal bDaclDefaulted As Long) As Long
    
       Declare Function ConnectNamedPipe Lib "kernel32" ( _
          ByVal hNamedPipe As Long, _
          lpOverlapped As Any) As Long
    
       Declare Function DisconnectNamedPipe Lib "kernel32" ( _
          ByVal hNamedPipe As Long) As Long
    
       Declare Function WriteFile Lib "kernel32" ( _
          ByVal hFile As Long, _
          lpBuffer As Any, _
          ByVal nNumberOfBytesToWrite As Long, _
          lpNumberOfBytesWritten As Long, _
          lpOverlapped As Any) As Long
    
       Declare Function ReadFile Lib "kernel32" ( _
          ByVal hFile As Long, _
          lpBuffer As Any, _
          ByVal nNumberOfBytesToRead As Long, _
          lpNumberOfBytesRead As Long, _
          lpOverlapped As Any) As Long
    
       Declare Function FlushFileBuffers Lib "kernel32" ( _
          ByVal hFile As Long) As Long
    
       Declare Function CloseHandle Lib "kernel32" ( _
          ByVal hObject As Long) As Long
    					
  4. フォームを保存します。

名前付きパイプ クライアント

  1. 新しいプロジェクトを作成します。デフォルトで Form1 が作成されます。
  2. 次のコントロールをフォームに追加します。
       Type             Name               Caption/Default Value
       ----             ----               ---------------------
       TextBox          cbBytes            500
       CommandButton    cmdCallNamedPipe   Call Named Pipe
       TextBox          txtReceive
    					
  3. 次のコードをフォームに追加します。
       Option Explicit
       Private Const szPipeName = "\\.\pipe\bigtest", BUFFSIZE = 20000
       Private Declare Function CallNamedPipe Lib "kernel32" Alias _
          "CallNamedPipeA" ( _
          ByVal lpNamedPipeName As String, _
          lpInBuffer As Any, _
          ByVal nInBufferSize As Long, _
          lpOutBuffer As Any, _
          ByVal nOutBufferSize As Long, _
          lpBytesRead As Long, _
          ByVal nTimeOut As Long) As Long
    
       Private Sub cmdCallNamedPipe_Click()
          Dim res As Long, myStr As String, i As Long, cbRead As Long
          Dim numBytes As Long, bArray() As Byte, temp As String
    
          numBytes = cbBytes.Text
          If cbBytes.Text < 0 Then
             MsgBox "Value must be at least 0.", vbOKOnly
             Exit Sub
          End If
          If numBytes > BUFFSIZE Then
             numBytes = BUFFSIZE
          End If
          ReDim bArray(numBytes)  'Build the return buffer
    
          'Call CallNamedPipe to do the transaction all at once
          res = CallNamedPipe(szPipeName, numBytes, LenB(numBytes), _
             bArray(0), numBytes, _
             cbRead, 30000) 'Wait up to 30 seconds for a response
    
          If res > 0 Then
             temp = Format(bArray(0), " 000")
             For i = 1 To cbRead - 1
                If (i Mod 16) = 0 Then temp = temp & vbCrLf
                temp = temp & " " & Format(bArray(i), "000")
             Next i
             txtReceive.Text = temp
          Else
             MsgBox "Error number " & Err.LastDllError & _
                    " attempting to call CallNamedPipe.", vbOKOnly
          End If
       End Sub
    
    					
  4. 以外の場所でサーバーが実行されている場合は、クライアントは、変更する必要があります、'します' で、変数 szPipeName に、。サーバー コンピューターの名前です。
  5. フォームを保存します。上記のコードをテストするには、まずサーバーを起動し、クリックして、、フォームです。サーバー アプリケーションは、ブロックしているようになりましたとがハングに表示されます、しかし、実際にクライアントが接続するを待機しています。[クライアント] を開始します。アプリケーションと"呼び出し名前付きパイプします。] をクリックします。クライアントが送信する必要があります、500 バイトまでのデータと応答はサーバーの 500 の値です。行うことができます。cbBytes テキスト ボックスに 0 から 20000 バイトに設定します。停止するのにはサーバーでは、送信の 0 (ゼロ) クライアントからだけです。クライアントが表示されます可能性があります。エラー 233 (ERROR_PIPE_NOT_CONNECTED) が、これは正常です。

    別の改善、サンプル IO 完了の使用を含めることができます。ポートやノン ・ ブロッキング読み取りとオーバー ラップ IO を使用して書き込まれます。行うことができます。これらの詳細については、Microsoft プラットフォーム SDK で検索します。

関連情報

利用可能ないくつかのプロセス間通信 (IPC) 方法があります。Windows 2000、Windows NT および Windows 95 は複数のプロセス間でデータの一方向または双方向転送を許可します。各プラットフォームで使用可能な IPC の方法の完全な一覧については、次の資料では、Microsoft Knowledge Base を参照してください。
95900します。 Windows NT、Windows 95、および Win32s プロセス間の通信

プロパティ

文書番号: 177696 - 最終更新日: 2011年7月6日 - リビジョン: 4.0
キーワード:?
kbhowto kbapi kbmt KB177696 KbMtja
機械翻訳の免責
重要: このサポート技術情報 (以下「KB」) は、翻訳者による翻訳の代わりに、マイクロソフト機械翻訳システムによって翻訳されたものです。マイクロソフトは、お客様に、マイクロソフトが提供している全ての KB を日本語でご利用いただけるように、翻訳者による翻訳 KB に加え機械翻訳 KB も提供しています。しかしながら、機械翻訳の品質は翻訳者による翻訳ほど十分ではありません。誤訳や、文法、言葉使い、その他、たとえば日本語を母国語としない方が日本語を話すときに間違えるようなミスを含んでいる可能性があります。マイクロソフトは、機械翻訳の品質、及び KB の内容の誤訳やお客様が KB を利用されたことによって生じた直接または間接的な問題や損害については、いかなる責任も負わないものとします。マイクロソフトは、機械翻訳システムの改善を継続的に行っています。
英語版 KB:177696
Microsoft Knowledge Base の免責: Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com