如何使用具名管道進行處理序間通訊在 Visual Basic . NET 或 Visual Basic 2005 中,

文章翻譯 文章翻譯
文章編號: 871044 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

在此頁中

結論

本文將逐步告訴討論如何在 Microsoft Visual Basic . NET 或 Microsoft Visual Basic 2005 中使用具名管道進行處理序間通訊。 本文包含程式碼範例示範藉由使用在 Visual Basic . NET 或 Visual Basic 2005 中的具名管道用戶端 / 伺服器通訊。 本文將告訴您藉由建立具名管道伺服器及具名管道用戶端處理序間通訊。 透過管道通訊會以下列方式執行:
  • 建立具名管道。
  • 只要使用 ConnectNamedPipe 函式, 直到用戶端連線封鎖伺服器應用程式。
  • 經由使用 CallNamedPipe 函數連線到伺服器。
  • 呼叫 ReadFile 函式或 WriteFile 函式, 以透過管道進行通訊。
  • 使用管道處理序完成時呼叫 DisconnectNamedPipe 函式。
  • 當您完成透過管道通訊在具名管道呼叫 CloseHandle 函式)。

INTRODUCTION

具名管道是一個單向或雙向傳輸管道管道伺服器和一或多個管道用戶端之間進行通訊。 您可以使用具名管道者, 提供在處理序在同一台電腦上或在網路上不同電腦上處理序之間通訊。 詞彙管道伺服器名為 " " 參照到建立具名管道, 處理程序和一詞名為 「 管道用戶端 」 參照到連接至的具名管道執行個體的處理序 (Process)。

您可以使用 Microsoft Visual Basic . NET 或 Microsoft Visual Basic 2005 來建立應用程式藉由使用具名管道通訊至其他處理序。 這份文件包含程式碼範例使用具名管道來在兩個 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 應用程式所建立的具名管道伺服器

若要設計 Windows 應用程式, 建立具名管道伺服器藉由使用 Visual Basic . NET 或 Visual Basic 2005, 請依照下列步驟執行:
  1. 啟動 Microsoft Visual Studio . NET 或 Microsoft Visual Studio 2005。
  2. 在 [ 檔案 ] 功能表, 指向 New , 及 [ 專案 。
  3. 專案類型 ] 下按一下 [ Visual Basic 專案 , 及在 [ 範本 ] [ Windows 應用程式 。

    在 Visual Studio 2005, 按 注意 [ 專案類型 ] 之下 [ Visual Basic
  4. 在 [ 名稱 ] 方塊, 鍵入 MyServerApp然後按一下 [ 確定 ] 根據預設值, 會建立名為 Form 1 表單。
  5. 將三個 Button 控制項加入至 Form 1 表單。
  6. 在 [ 檢視 ] 功能表, 按一下 [ 屬性 ] 視窗 ] 。
  7. Button 控制項的 Text 屬性設為下列值:
    摺疊此表格展開此表格
    名稱文字
    Button 1建立具名管道
    Button 2等候用戶端連線
    Button 3伺服器中斷連線
  8. 新增 Label 控制項加入至 Form 1 表單。 Label 1 標籤 控制項會加入 Form 1 表單。

將所有宣告加入至模組在 Windows 應用程式

如果要新增為藉由使用的具名管道, 實作處理序間通訊所需函式宣告請依照下列步驟執行:
  1. 在 [ 方案總管 ], MyServerApp 以滑鼠右鍵按一下指向 Add , 然後按一下 [ 新增模組 。
  2. 在 [ 加入新項目 - MyServerApp ] 對話方塊, 按一下 開啟 。
  3. 加入下列程式碼加入至 Module 1. 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. 在 [ 方案總管 ], 以滑鼠右鍵按一下 Form 1 , 及 [ 開啟 ] 。
  2. 在 Form 1 表單, ] 的 [ 設計 ] 檢視中連按兩下, 建立具名管道 , 然後再將下列程式碼加入 Button 1 _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. 加入下列程式碼 Button 1 _Click 程序之前:
    Private Const pipeName As String = "\\.\pipe\MyPipe"
    Private Const BUFFSIZE As Short = 10000
    Private Buffer(BUFFSIZE) As Byte
    Private hPipe As Integer
  4. 在 [ 方案總管 ], 按兩下 Form 1. vb 。
  5. 在 Form 1 表單, ] 的 [ 設計 ] 檢視中連按兩下 Wait 為用戶端連線 , 然後再加入下列程式碼加入 Button 2 _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. 在 [ 設計 ] 檢視, 連按兩下 Form 1 , 然後再將下列程式碼加入至 Form 1 _Load 程序:
    Button2.Visible = False
    Button3.Visible = False
  7. 在 [ 方案總管 ], 按兩下 Form 1. vb 。
  8. 在 Form 1 表單, ] 的 [ 設計 ] 檢視中連按兩下 伺服器中斷連線 , 然後加入下列程式碼至 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. CreateFile 函式中建立控制代碼上呼叫 CloseHandle 函式。
您也可以使用具名管道交易來進行用戶端 / 伺服器通訊 具名管道異動結合在單一網路作業讀取作業和寫入作業。 交易只可以用於雙工, 訊息型別的管道。 執行具名管道交易處理序可以用來 TransactNamedPipe 函式或 CallNamedPipe 函式。

在這個程式碼範例, 您使用 CallNamedPipe 函式來連接到已命名的管道伺服器、 將資料寫入至管道, 和從管道然後讀取資料。

設計與具名管道伺服器通訊的 Windows 應用程式

如果要設計 Visual Basic . NET 或 Visual Basic 2005 Windows 應用程式可用來連線到具名管道伺服器, 請依照下列步驟執行:
  1. 啟動 Microsoft Visual Studio . NET 或 Microsoft Visual Studio 2005。
  2. 在 [ 檔案 ] 功能表, 指向 New , 及 [ 專案 。
  3. 專案類型 ] 下按一下 [ Visual Basic 專案 , 及在 [ 範本 ] [ Windows 應用程式 。

    在 Visual Studio 2005, 按 注意 [ 專案類型 ] 之下 [ Visual Basic
  4. 在 [ 名稱 ] 方塊, 鍵入 MyClientApp然後按一下 [ 確定 ] 根據預設值, 會建立名為 Form 1 表單。
  5. 將 Button 控制項加入至 Form 1 表單。
  6. 在 Button 1 , 按一下滑鼠右鍵, 然後按一下 [ 內容 ] 。
  7. 將 Text 屬性來 連線至伺服器 。
  8. 新增 Label 控制項加入至 Form 1 表單。 Label 1 標籤 控制項會加入 Form 1 表單。
  9. 將 Label 1 標籤 控制項的 Visible 屬性設 為 False 。
  10. 將兩個 TextBox 控制項加入至 Form 1 表單。

撰寫程式碼, 以連線到具名管道伺服器

經由使用 CallNamedPipe 函數連線到具名管道伺服器。 在連線到伺服器, CallNamedPipe 函式將至管道, 讀取管道, 然後關閉管道。 以連線到伺服器, 然後讀取或寫入資料, 請依照下列步驟執行:
  1. 在 [ 設計 ] 檢視, 連按兩下 連接到伺服器 , 然後加入下列程式碼加入 Button 1 _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. 加入下列程式碼 Button 1 _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. 在 Form 1 表單, 再按一下 [ 建立具名管道 , 及 等候進行用戶端連線 。 應用程式現在會被封鎖並等候用戶端連線。
  3. 若要啟動用戶端應用程式, 請按一下 [ 開始 ] 的 MyClientApp 專案 偵錯 功能表上。
  4. 在 Form 1 表單, 輸入 10 TextBox 1 中的, ] 方塊, 然後按一下 [ 連線到伺服器 ] 您可以看到 TextBox 2 中所接收的位元組陣列。
  5. 若要從伺服器, 中斷連線用戶端應用程式輸入 0 在用戶端應用程式, 在 TextBox 1 ] 方塊, 然後按一下 [ 連接到伺服器 。
  6. 請關閉用戶端應用程式。
  7. 若要中斷連線之伺服器端的具名管道, 並關閉伺服器應用程式, 請按一下 [ Form 1 表單的伺服器應用程式上的 伺服器中斷連線 。

?考

如需詳細資訊,請造訪下列 Microsoft Developer Network (MSDN) 網站::
具名管道
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 - 上次校閱: 2007年1月11日 - 版次: 2.4
這篇文章中的資訊適用於:
  • 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 KB871044 KbMtzh kbmt
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。如果您發現錯誤,並想要協助我們進行改善,請填寫本篇文章下方的問卷。
按一下這裡查看此文章的英文版本:871044
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

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