Visual Basic でのプロセス間の通信に名前付きパイプを使用する方法です。NET または Visual Basic 2005

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

目次

概要

この資料では、マイクロソフトの Visual Basic での名前付きパイプを使用する方法について説明します。NET または Microsoft Visual Basic 2005 のプロセス間の通信します。Visual Basic では、名前付きパイプを使用してクライアント/サーバー間の通信を示すコード サンプルについて説明します。NET または 2005 年の Visual Basic。「、名前付きパイプ サーバーと名前付きパイプ クライアントを作成することによって、プロセス間通信をについて説明します。次のように、パイプを経由した通信が行われます。
  • 名前付きパイプを作成します。
  • サーバー アプリケーションは、クライアントが接続するまでに、ConnectNamedPipe 関数を使用してブロックします。
  • サーバーには、CallNamedPipe 関数を使用して接続します。
  • ReadFile 関数またはパイプ経由で通信するために、WriteFile 関数を呼び出します。
  • パイプを使用して、プロセスを終了すると、DisconnectNamedPipe 関数を呼び出します。
  • パイプ経由の通信を完了すると、名前付きパイプを CloseHandle 関数を呼び出します。

はじめに

名前付きパイプは一方向または双方向のパイプは、パイプ サーバーと 1 つ以上のパイプ クライアント間の通信です。名前付きパイプのユーザーが同じコンピューター上のプロセス間やネットワーク経由で別のコンピューター上のプロセス間の通信を提供することができます。「パイプ サーバー名」「パイプ クライアント名前付き」名前付きパイプのインスタンスに接続するプロセスを指します、名前付きパイプを作成するプロセスを指します。

マイクロソフトの Visual Basic を使用できます。名前付きパイプを NET または Microsoft Visual Basic 2005年を使用して他のプロセスからの通信アプリケーションを作成します。ここでは、2 つの Visual Basic の間の通信に名前付きパイプを使用するコード サンプルを示します。NET または Visual Basic 2005年の Windows アプリケーション。

要件

この資料では、次のトピックに精通しているを前提としています。
  • Windows アプリケーション
  • Visual Basic。NET プログラミング
  • パイプを使用してください。
推奨されるハードウェア、ソフトウェア、ネットワーク インフラストラクチャ、および必要な service pack を以下に示します。
  • マイクロソフトの Visual Studio。NET またはマイクロソフトの Visual Studio 2005
  • [マイクロソフト]。NET Framework

名前付きパイプ サーバーを作成します。

名前付きパイプ サーバーを作成し、クライアントには、パイプ経由で通信するには、次の手順を実行します。
  1. 名前付きパイプを作成します。
  2. 呼び出して、 ConnectNamedPipe クライアントが接続するまで、サーバーをブロックする関数です。
  3. 呼び出して、 Readfile 関数 関数または、 WriteFile パイプ経由で通信するために機能します。
  4. 呼び出して、 DisconnectNamedPipe パイプを使用して、処理の終了時の関数です。
  5. 呼び出して、 CloseHandle 名前付きパイプ上の関数です。

名前付きパイプ サーバーを作成する Windows アプリケーションを設計します。

Visual Basic を使用して、名前付きパイプ サーバーを作成する Windows アプリケーションを作成します。NET または 2005 年これらの手順を実行、します。
  1. Microsoft Visual Studio を起動します。NET またはマイクロソフトの Visual Studio 2005。
  2. で、 ファイル メニューのポイント 新しい、し プロジェクト.
  3. 下にあります。 [プロジェクトの種類をクリックして Visual Basic プロジェクト、し Windows アプリケーション 下にあります。 テンプレート.

    メモ Visual Studio 2005 年にをクリックします。 Visual Basic 下にあります。 [プロジェクトの種類.
  4. で、 名前 ボックスの種類 MyServerApp、し [OK].既定では、Form1 という名前はのフォームが作成されます。
  5. 3 つを追加します。 ボタン Form1 フォームにコントロールします。
  6. で、 ビュー メニューをクリックして [プロパティ] ウィンドウ.
  7. 設定は、 テキスト プロパティが ボタン コントロールには、次の値:
    元に戻す全体を表示する
    名前テキスト
    Button1名前付きパイプを作成します。
    Button2クライアントの接続を待つ
    Button3サーバーを切断します。
  8. 追加します。 ラベル 制御するのには Form1 フォームです。Label1 ラベル コントロールを Form1 フォームに追加されます。

すべての宣言を追加するのには、Windows アプリケーション内のモジュール

名前付きパイプを使用して、プロセス間の通信を実装するために必要な関数の宣言を追加するには、次の手順を実行します。
  1. ソリューション エクスプ ローラーで右クリックします。 MyServerApp、ポイント 追加、し モジュールを追加します。.
  2. で、 MyServerApp-[新しい項目の追加します。 ダイアログ ボックス、クリックして ファイルを開く.
  3. 次のコードを追加、 Module1.vb モジュール:
    Public Const FILE_ATTRIBUTE_NORMAL As Short = &H80S
    Public Const FILE_FLAG_NO_BUFFERING As Integer = &H20000000
    Public Const FILE_FLAG_WRITE_THROUGH As Integer = &H80000000
    
    Public Const PIPE_ACCESS_DUPLEX As Short = &H3S
    Public Const PIPE_READMODE_MESSAGE As Short = &H2S
    Public Const PIPE_TYPE_MESSAGE As Short = &H4S
    Public Const PIPE_WAIT As Short = &H0S
    
    Public Const INVALID_HANDLE_VALUE As Short = -1
    
    Declare Function CreateNamedPipe Lib "kernel32" Alias "CreateNamedPipeA" _
    (ByVal lpName As String, ByVal dwOpenMode As Integer, _
    ByVal dwPipeMode As Integer, ByVal nMaxInstances As Integer, _
    ByVal nOutBufferSize As Integer, ByVal nInBufferSize As Integer, _
    ByVal nDefaultTimeOut As Integer, ByVal lpSecurityAttributes As IntPtr _
    ) As Integer
    
    Declare Function ConnectNamedPipe Lib "kernel32" _
        (ByVal hNamedPipe As Integer, ByVal lpOverlapped As Integer) As Integer
    
    Declare Function DisconnectNamedPipe Lib "kernel32" _
        (ByVal hNamedPipe As Integer) As Integer
    
    Declare Function WriteFile Lib "kernel32" _
    (ByVal hFile As Integer, ByRef lpBuffer() As Byte, _
    ByVal nNumberOfBytesToWrite As Integer, ByRef lpNumberOfBytesWritten As Integer, _
    ByVal lpOverlapped As Integer _
    ) As Integer
    
    Declare Function ReadFile Lib "kernel32" _
    (ByVal hFile As Integer, ByRef lpBuffer As Integer, _
    ByVal nNumberOfBytesToRead As Integer, ByRef lpNumberOfBytesRead As Integer, _
    ByVal lpOverlapped As Integer _
    ) As Integer
    
    Declare Function FlushFileBuffers Lib "kernel32" _
        (ByVal hFile As Integer) As Integer
    
    Declare Function CloseHandle Lib "kernel32" _
        (ByVal hObject As Integer) As Integer
    

名前付きパイプ サーバーを作成するコードを記述します。

名前付きパイプを作成すると、クライアントからの接続を待ちます。クライアントがサーバーに接続すると、読み取りまたは、パイプを介してデータを書き込みます。これを行うには、次の手順を実行します。
  1. ソリューション エクスプ ローラーで右クリックします。 Form1、し ファイルを開く.
  2. デザイン ビューで、 Form1 フォームで、ダブルクリック 名前付きパイプを作成します。は、次のコードを追加し、 Button1_Click 手順:
    Dim openMode, pipeMode As Integer
    'Create the named pipe
    openMode = PIPE_ACCESS_DUPLEX Or FILE_FLAG_WRITE_THROUGH
    pipeMode = PIPE_WAIT Or PIPE_TYPE_MESSAGE Or PIPE_READMODE_MESSAGE
    hPipe = CreateNamedPipe(pipeName, openMode, pipeMode, 10, 10000, 2000, 10000, IntPtr.Zero)
    Label1.Text = "Created the named pipe and waiting for the clients."
    Button1.Visible = False
    Button2.Visible = True
    Button3.Visible = True
  3. 前に、次のコードを追加、 Button1_Click 手順:
    Private Const pipeName As String = "\\.\pipe\MyPipe"
    Private Const BUFFSIZE As Short = 10000
    Private Buffer(BUFFSIZE) As Byte
    Private hPipe As Integer
  4. ソリューション エクスプ ローラーでダブルクリックします。 Form1.vb.
  5. Form1 フォームのデザイン ビューでをダブルクリックします。 クライアントの接続を待つは、次のコードを追加し、 Button2_Click 手順:
    Dim byteCount, i, res, cbnCount As Integer
    For i = 0 To BUFFSIZE - 1 'Fill an array of numbers
       Buffer(i) = i Mod 256
    Next i
    'Wait for a connection, block until a client connects
    Label1.Text = "Waiting for client connections"
    Me.Refresh()
    Do
       res = ConnectNamedPipe(hPipe, 0)
       'Read the data sent by the client over the pipe
       cbnCount = 4
       res = ReadFile(hPipe, byteCount, Len(byteCount), cbnCount, 0)
       If byteCount > BUFFSIZE Then 'Client requested for byteCount bytes
           byteCount = BUFFSIZE 'but only send up to 20000 bytes
       End If
       'Write the number of bytes requested by the client 
       res = WriteFile(hPipe, Buffer, byteCount, cbnCount, 0)
       res = FlushFileBuffers(hPipe)
       'Disconnect the named pipe.
       res = DisconnectNamedPipe(hPipe)
       'Loop until the client makes no more requests for data. 
    Loop Until byteCount = 0
    Label1.Text = "Read or Write completed"
    Button2.Visible = False
  6. デザイン ビューでをダブルクリックします。 Form1は、次のコードを追加し、 Form1_Load 手順:
    Button2.Visible = False
    Button3.Visible = False
  7. ソリューション エクスプ ローラーでダブルクリックします。 Form1.vb.
  8. Form1 フォームのデザイン ビューでをダブルクリックします。 サーバーを切断します。は、次のコードを追加し、 Button3_Click 手順:
    Dim res As Integer
    'Close the pipe handle when the client makes no requests
    CloseHandle(hPipe)
    Label1.Text = "Disconnected the named pipe"
  9. で、 ビルド メニューをクリックして ソリューションをビルドします。.

名前付きパイプ クライアントを作成します。

サーバーとの通信に名前付きパイプ クライアントを作成するには、次の手順を実行します。
  1. 呼び出して、 CreateFile 名前付きパイプへのハンドルを作成するには、[関数] をクリックします。
  2. 呼び出して、 Readfile 関数 関数または、 WriteFile パイプ経由で通信するために機能します。
  3. 呼び出して、 CloseHandle 関数で作成されたハンドルは、 CreateFile 関数です。
クライアント/サーバー間の通信は、名前付きパイプのトランザクションをことすることもできます。名前付きパイプのトランザクションが書き込み操作および読み取り操作では、1 つのネットワーク操作を組み合わせたものです。トランザクションが二重メッセージ型パイプでのみ使用できます。プロセスで使用できる、 TransactNamedPipe 関数または、 CallNamedPipe 名前付きパイプのトランザクションを実行する関数です。

このコード サンプルでは、使用して、 CallNamedPipe 名前付きパイプ サーバーに接続し、パイプにデータを書き込む、パイプからデータを読み取る機能。

名前付きパイプのサーバーと通信する Windows アプリケーションを設計します。

デザインは、Visual Basic にします。名前付きパイプ サーバーに接続するために使用する NET または Visual Basic 2005年の Windows のアプリケーション次の手順を実行します。
  1. Microsoft Visual Studio を起動します。NET またはマイクロソフトの Visual Studio 2005。
  2. で、 ファイル メニューのポイント 新しい、し プロジェクト.
  3. 下にあります。 [プロジェクトの種類をクリックして Visual Basic プロジェクト、し Windows アプリケーション 下にあります。 テンプレート.

    メモ Visual Studio 2005 年にをクリックします。 Visual Basic 下にあります。 [プロジェクトの種類.
  4. で、 名前 ボックスの種類 MyClientApp、し [OK].既定では、Form1 という名前はのフォームが作成されます。
  5. 追加します。 ボタン Form1 フォームに制御します。
  6. 右クリックします。 Button1、し プロパティ.
  7. 設定は、 テキスト プロパティ サーバーへの接続します。.
  8. 追加します。 ラベル Form1 フォームに制御します。Label1 ラベル コントロールを追加します。 Form1 フォームです。
  9. 設定は、 表示 Label1 のプロパティ ラベル 制御するのには False.
  10. 2 つを追加します。 テキスト ボックス Form1 フォームにコントロールします。

名前付きパイプ サーバーに接続するコードを記述します。

使用して、名前付きパイプのサーバーへの接続、 CallNamedPipe 関数です。サーバーに接続して、 CallNamedPipe 関数は、パイプに書き込みます、パイプから読み込んで、パイプを閉じます。サーバーへの接続、読み取りまたはデータの書き込みするには、次の手順を実行します。
  1. デザイン ビューでをダブルクリックします。 サーバーへの接続します。は、次のコードを追加し、 Button1_Click 手順:
    Dim i, res, cbRead,numBytes As Integer
    Dim bArray() As Byte
    Dim temp As String
    
    numBytes = CInt(TextBox1.Text)
    If numBytes < 0 Then
        MessageBox.Show("Value must be at least 0.", MsgBoxStyle.OKOnly)
        Exit Sub
    End If
    If numBytes = 0 Then
        Label1.Visible = True
        Label1.Text = "The connection to the server is disconnected."
        Button1.Visible = False
        TextBox1.Visible = False
        TextBox2.Visible = False
    End If
    If numBytes > BUFFSIZE Then
        numBytes = BUFFSIZE
    End If
    
    ReDim bArray(numBytes) 'Create the return buffer
    'Call the CallNamedPipe function to do the transactions
     res = CallNamedPipe(pipeName, numBytes, Len(numBytes), bArray(0), numBytes, cbRead, 30000) 
    'Wait up to 30 seconds for a response
    'Format the data received, and then display the data in the text box
    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
        TextBox2.Text = temp
    Else
    MessageBox.Show("Error number " & Err.LastDllError & _
    "while trying to call the CallNamedPipe function.", MsgBoxStyle.OKOnly)
    End If
  2. 前に、次のコードを追加、 Button1_Click 手順:
    Private Const pipeName As String = "\\.\pipe\MyPipe"
    Private Const BUFFSIZE As Integer = 10000
    Private hpipe As Integer
        
    Public Const INVALID_HANDLE_VALUE As Short = -1
    Public Declare Function CallNamedPipe Lib "kernel32" Alias "CallNamedPipeA" _
    (ByVal lpNamedPipeName As String, _
    ByRef lpInBuffer As Integer, _
    ByVal nInBufferSize As Integer, _
    ByRef lpOutBuffer As Byte, _
    ByVal nOutBufferSize As Integer, _
    ByRef lpBytesRead As Integer, ByVal nTimeOut As Integer) As Integer
  3. で、 ビルド メニューをクリックして ソリューションをビルドします。.

コードの動作を確認してください。

コードの動作を確認するには、次の手順を実行します。
  1. サーバー アプリケーションを開始するには 開始 で、 デバッグ プロジェクト メニューの MyServerApp。
  2. Form1 フォームをクリックします。 名前付きパイプを作成します。、し クライアントの接続を待つ.アプリケーションがブロックされているし、クライアントが接続するまでの待機します。
  3. クライアント アプリケーションを起動するをクリックしてください。 開始 で、 デバッグ プロジェクト メニューの MyClientApp。
  4. Form1 フォームを入力します。 10 で、 TextBox1 ボックスとクリック サーバーへの接続します。.受信されるバイトの配列を参照してください、 TextBox2 ボックス。
  5. クライアント アプリケーションがサーバーから切断するには、入力します。 0 で、 TextBox1 クライアント アプリケーションでは、ボックスし、クリックしてください サーバーへの接続します。.
  6. クライアント アプリケーションを終了します。
  7. サーバー側が名前付きパイプの接続を切断してからサーバー アプリケーションを終了するをクリックしてください。 サーバーを切断します。 サーバー アプリケーションの Form1 のフォームでは。

関連情報

詳細については、次のマイクロソフト開発ネットワーク (MSDN) Web サイトを参照してください。
名前付きパイプ
http://msdn2.microsoft.com/en-us/library/aa365590.aspx
名前付きパイプでのトランザクション
http://msdn2.microsoft.com/en-us/library/aa365789.aspx
パイプの機能
http://msdn2.microsoft.com/en-us/library/aa365781.aspx

プロパティ

文書番号: 871044 - 最終更新日: 2011年7月30日 - リビジョン: 2.0
キーワード:?
kbhowto kbhowtomaster kbpipes kbserver kbipc kbclient kbvs2005applies kbvs2005swept kbmt KB871044 KbMtja
機械翻訳の免責
重要: このサポート技術情報 (以下「KB」) は、翻訳者による翻訳の代わりに、マイクロソフト機械翻訳システムによって翻訳されたものです。マイクロソフトは、お客様に、マイクロソフトが提供している全ての KB を日本語でご利用いただけるように、翻訳者による翻訳 KB に加え機械翻訳 KB も提供しています。しかしながら、機械翻訳の品質は翻訳者による翻訳ほど十分ではありません。誤訳や、文法、言葉使い、その他、たとえば日本語を母国語としない方が日本語を話すときに間違えるようなミスを含んでいる可能性があります。マイクロソフトは、機械翻訳の品質、及び KB の内容の誤訳やお客様が KB を利用されたことによって生じた直接または間接的な問題や損害については、いかなる責任も負わないものとします。マイクロソフトは、機械翻訳システムの改善を継続的に行っています。
英語版 KB:871044
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