現在オフラインです。再接続するためにインターネットの接続を待っています

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

重要: このサポート技術情報 (以下「KB」) は、翻訳者による翻訳の代わりに、マイクロソフト機械翻訳システムによって翻訳されたものです。マイクロソフトは、お客様に、マイクロソフトが提供している全ての KB を日本語でご利用いただけるように、翻訳者による翻訳 KB に加え機械翻訳 KB も提供しています。しかしながら、機械翻訳の品質は翻訳者による翻訳ほど十分ではありません。誤訳や、文法、言葉使い、その他、たとえば日本語を母国語としない方が日本語を話すときに間違えるようなミスを含んでいる可能性があります。マイクロソフトは、機械翻訳の品質、及び KB の内容の誤訳やお客様が KB を利用されたことによって生じた直接または間接的な問題や損害については、いかなる責任も負わないものとします。マイクロソフトは、機械翻訳システムの改善を継続的に行っています。

英語版 KB:871044
概要
この資料では、プロセス間通信の Microsoft Visual Basic .NET または Microsoft Visual Basic 2005年の名前付きパイプを使用する方法について説明します。この資料には、Visual Basic .NET または Visual Basic 2005年では、名前付きパイプを使用するクライアントとサーバー間の通信を示すコード サンプルが含まれています。名前付きパイプ サーバーと名前付きパイプ クライアントを作成することにより、プロセス間通信について説明します。パイプ経由での通信は、次のように実行されます。
  • 名前付きパイプを作成します。
  • クライアントが接続するまでに、ConnectNamedPipe 関数を使用してサーバー アプリケーションをブロックします。
  • CallNamedPipe 関数を使用してサーバーに接続します。
  • ReadFile 関数またはパイプ経由で通信するのには、WriteFile 関数を呼び出します。
  • パイプを使用してプロセスが終了するときは、DisconnectNamedPipe 関数を呼び出します。
  • パイプ経由の通信が完了した後は、名前付きパイプを CloseHandle 関数を呼び出します。
はじめに
名前付きパイプは、パイプ サーバーと 1 つ以上のパイプ クライアント間の通信用の一方向または双方向のパイプです。ユーザーが名前付きパイプと同じコンピューター上のプロセスの間、またはネットワーク上の異なるコンピューター上のプロセス間の通信を提供することができます。という用語は、名前付きパイプを作成するプロセスおよび名前付きパイプのインスタンスに接続するプロセスには、「名前付きパイプ クライアント」という用語は、「名前付きパイプ サーバー」。

Microsoft Visual Basic .NET または Microsoft Visual Basic 2005年を使用すると、名前付きパイプを使用して他のプロセスに通信するアプリケーションを作成します。この資料には、2 つの Visual Basic .NET または Visual Basic 2005年の Windows アプリケーション間の通信に名前付きパイプを使用するコード サンプルが含まれています。

先頭に戻る

要件

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

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

名前付きパイプ サーバーを作成し、パイプ経由でクライアントと通信し、次の手順を実行します。
  1. 名前付きパイプを作成します。
  2. クライアントが接続されるまで、サーバーをブロックするConnectNamedPipe関数を呼び出します。
  3. ReadFile関数またはパイプ経由で通信するのには、 WriteFile関数を呼び出します。
  4. パイプを使用してプロセスが終了するときは、 DisconnectNamedPipe関数を呼び出します。
  5. 名前付きパイプをCloseHandle関数を呼び出します。
先頭に戻る

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

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

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

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

名前付きパイプを使用してプロセス間の通信を実装するために必要な関数宣言を追加するには、次の手順を実行します。
  1. ソリューション エクスプ ローラーで、 MyServerAppを右クリックし、[追加] をポイントし、モジュールの追加] をクリックします。
  2. [新しい項目の追加 - MyServerApp ] ダイアログ ボックスで、[開く] をクリックします。
  3. Module1.vbモジュールに次のコードを追加します。
    Public Const FILE_ATTRIBUTE_NORMAL As Short = &H80SPublic Const FILE_FLAG_NO_BUFFERING As Integer = &H20000000Public Const FILE_FLAG_WRITE_THROUGH As Integer = &H80000000Public Const PIPE_ACCESS_DUPLEX As Short = &H3SPublic Const PIPE_READMODE_MESSAGE As Short = &H2SPublic Const PIPE_TYPE_MESSAGE As Short = &H4SPublic Const PIPE_WAIT As Short = &H0SPublic Const INVALID_HANDLE_VALUE As Short = -1Declare 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 IntegerDeclare Function ConnectNamedPipe Lib "kernel32" _    (ByVal hNamedPipe As Integer, ByVal lpOverlapped As Integer) As IntegerDeclare Function DisconnectNamedPipe Lib "kernel32" _    (ByVal hNamedPipe As Integer) As IntegerDeclare 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 IntegerDeclare 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 IntegerDeclare Function FlushFileBuffers Lib "kernel32" _    (ByVal hFile As Integer) As IntegerDeclare Function CloseHandle Lib "kernel32" _    (ByVal hObject As Integer) As Integer
先頭に戻る

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

名前付きパイプを作成した後は、クライアントからの接続を待ちます。クライアントは、サーバーに接続するときは、読み取りまたはパイプ経由でデータを記述します。これを行うには、以下の手順を実行します。
  1. ソリューション エクスプ ローラーで、 Form1を右クリックし、[開く] をクリックします。
  2. デザイン ビューで Form1 フォームを開き、[名前付きパイプを作成する] をダブルクリックし、Button1_Click プロシージャに次のコードを追加します。
    Dim openMode, pipeMode As Integer'Create the named pipeopenMode = PIPE_ACCESS_DUPLEX Or FILE_FLAG_WRITE_THROUGHpipeMode = PIPE_WAIT Or PIPE_TYPE_MESSAGE Or PIPE_READMODE_MESSAGEhPipe = CreateNamedPipe(pipeName, openMode, pipeMode, 10, 10000, 2000, 10000, IntPtr.Zero)Label1.Text = "Created the named pipe and waiting for the clients."Button1.Visible = FalseButton2.Visible = TrueButton3.Visible = True
  3. Button1_Click プロシージャの前に次のコードを追加します。
    Private Const pipeName As String = "\\.\pipe\MyPipe"Private Const BUFFSIZE As Short = 10000Private Buffer(BUFFSIZE) As BytePrivate hPipe As Integer
  4. ソリューション エクスプ ローラーでForm1.vbをダブルクリックします。
  5. デザイン ビューで Form1 フォームを開き、[クライアントの接続を待つ] をダブルクリックし、 Button2_Click プロシージャに次のコードを追加します。
    Dim byteCount, i, res, cbnCount As IntegerFor i = 0 To BUFFSIZE - 1 'Fill an array of numbers   Buffer(i) = i Mod 256Next i'Wait for a connection, block until a client connectsLabel1.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 = 0Label1.Text = "Read or Write completed"Button2.Visible = False
  6. デザイン ビューでForm1をダブルクリックし、 Form1_Loadプロシージャに次のコードを追加します。
    Button2.Visible = FalseButton3.Visible = False
  7. ソリューション エクスプ ローラーでForm1.vbをダブルクリックします。
  8. Form1 フォームのデザイン ビューでは、サーバーの切断をダブルクリックし、 Button3_Clickプロシージャに次のコードを追加します。
    Dim res As Integer'Close the pipe handle when the client makes no requestsCloseHandle(hPipe)Label1.Text = "Disconnected the named pipe"
  9. [ビルド] メニューで、ソリューションのビルドをクリックします。
先頭に戻る

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

サーバーと通信する名前付きパイプ クライアントを作成するには、次の手順を実行します。
  1. 名前付きパイプへのハンドルを作成するのには、 CreateFile関数を呼び出します。
  2. ReadFile関数またはパイプ経由で通信するのには、 WriteFile関数を呼び出します。
  3. CreateFile関数で作成されたハンドルをCloseHandle関数を呼び出します。
名前付きパイプのトランザクションは、クライアント/サーバー間の通信にも使用できます。名前付きパイプのトランザクションは、書き込み操作および読み取り操作、1 つのネットワーク操作で結合します。トランザクションは、両面印刷、メッセージの種類のパイプでのみ使用できます。プロセスでは、名前付きパイプのトランザクションを実行するのには、 TransactNamedPipeまたはCallNamedPipe関数を使用できます。

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

先頭に戻る

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

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

    <b>Visual Studio 2005では、 Visual Basic の[プロジェクトの種類] の下にクリックします。
  4. [名前] ボックスで次のように入力します。 MyClientAppと入力し、[OK] をクリックします。デフォルトで Form1 というフォームが作成されます。
  5. Form1 フォームにボタンコントロールを追加します。
  6. Button1を右クリックし、[プロパティ] をクリックします。
  7. サーバーに接続するためには、 Textプロパティを設定します。
  8. ラベルコントロールを Form1 フォームに追加します。Label1ラベルコントロールは、 Form1フォームに追加されます。
  9. Label1ラベルコントロールのVisibleプロパティをFalseに設定します。
  10. Form1 フォームに 2 つのTextBoxコントロールを追加します。
先頭に戻る

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

CallNamedPipe関数を使用して名前付きパイプ サーバーに接続します。サーバーに接続したら、 CallNamedPipe関数は、パイプに書き込みます、パイプから読み取るし、パイプを閉じます。サーバーへの接続ししを読み書きするデータ、以下の手順を実行します。
  1. デザイン ビューでは、サーバーへの接続をダブルクリックし、 Button1_Clickプロシージャに次のコードを追加します。
    Dim i, res, cbRead,numBytes As IntegerDim bArray() As ByteDim temp As StringnumBytes = CInt(TextBox1.Text)If numBytes < 0 Then    MessageBox.Show("Value must be at least 0.", MsgBoxStyle.OKOnly)    Exit SubEnd IfIf numBytes = 0 Then    Label1.Visible = True    Label1.Text = "The connection to the server is disconnected."    Button1.Visible = False    TextBox1.Visible = False    TextBox2.Visible = FalseEnd IfIf numBytes > BUFFSIZE Then    numBytes = BUFFSIZEEnd IfReDim 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 boxIf 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 = tempElseMessageBox.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 = 10000Private hpipe As Integer    Public Const INVALID_HANDLE_VALUE As Short = -1Public 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 フォームで、次のように入力します。 10TextBox1のボックス、およびサーバーへの接続] をクリックします。TextBox2 ] ボックスで受信したバイト配列を表示できます。
  5. クライアント アプリケーションをサーバーから切断するのには次のように入力します。 0TextBox1では、クライアント アプリケーションでは、ボックスし、サーバーへの接続] をクリックします。
  6. クライアント アプリケーションを閉じます。
  7. 名前付きパイプのサーバー側の接続を切断し、サーバー アプリケーションを閉じて、サーバー アプリケーションの Form1 のフォームで、サーバーの切断] をクリックします。
先頭に戻る
関連情報
詳細については、次の Microsoft Developer Network (MSDN) Web サイトを参照してください。
名前付きパイプ上のトランザクション
http://msdn2.microsoft.com/en-us/library/aa365789.aspx
先頭に戻る

警告: この記事は自動翻訳されています

プロパティ

文書番号:871044 - 最終更新日: 07/03/2016 14:13:00 - リビジョン: 3.0

Microsoft Visual Basic 2005, Microsoft Visual Basic .NET 2003 Standard Edition, Microsoft Visual Basic .NET 2002 Standard Edition

  • kbvs2005swept kbvs2005applies kbserver kbpipes kbipc kbclient kbhowtomaster kbhowto kbmt KB871044 KbMtja
フィードバック