如何进行进程间通信在 VisualBasic.NET 或 Visual Basic 2005 中使用命名管道

注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。如果您发现了错误并希望帮助我们提高机器翻译技术,请完成文章末尾的在线调查。

点击这里察看该文章的英文版: 871044
概要
本文讨论如何在 MicrosoftVisualBasic.NET 或 Microsoft Visual Basic 2005 中使用命名管道进行进程间通信。 本文包含代码示例通过在 VisualBasic.NET 或 Visual Basic 2005 中使用命名管道, 说明客户 / 服务器通讯。 本文介绍进程间通信来创建命名管道服务器和命名管道客户。 通过管道通信通过以下方式执行:
  • 创建命名管道。
  • 通过使用 ConnectNamedPipe 函数直到客户端连接阻止服务器应用程序。
  • 通过使用 CallNamedPipe 函数连接到服务器。
  • 调用 ReadFile 函数或 WriteFile 函数以通过管道通讯。
  • 使用管道过程完成后调用 DisconnectNamedPipe 函数。
  • 命名管道上调用 CloseHandle 函数完成您通过管道通讯。
INTRODUCTION
命名管道是单向或双面管道管道服务器和一个或多个管道客户之间进行通信。 您可以命名管道用户能够提供同一计算机上进程之间或通过网络不同计算机上进程之间通讯。 术语 " 命名管道服务器 " 指向过程创建命名管道和术语 " 命名管道客户 " 指到一个进程, 连接到的命名管道实例。

您可使用 Microsoft Visual Basic .NET 或 Microsoft Visual Basic 2005 来创建应用程序通过命名管道, 与其他进程。 本文包含一个代码示例使用命名管道来两 VisualBasic.NET 或 2005 VisualBasicWindows 应用程序之间通信。

返回页首

要求

本文假定您已熟悉以下主题:
  • Windows 应用程序
  • VisualBasic.NET 编程
  • 使用管道
以下列表概括了推荐硬件、 软件、 网络结构, 以及 ServicePack, 您需要:
  • MicrosoftVisualStudio.NET 或 Microsoft Visual Studio 2005
  • Microsoft.NET 框架
返回页首

创建命名管道服务器

要创建命名管道服务器, 并通过管道, 然后与客户通信请按照下列步骤:
  1. 创建命名管道。
  2. 调用 函数以阻止服务器直到客户端连接。
  3. 调用 函数或 函数以通过管道通讯。
  4. 使用管道过程完成后调用 函数。
  5. 命名管道上调用 函数。
返回页首

设计 Windows 应用程序, 创建命名管道服务器

要设计 Windows 应用程序, 通过使用 VisualBasic.NET 或 Visual Basic 2005, 创建命名管道服务器请按照下列步骤操作:
  1. 启动 MicrosoftVisualStudio.NET 或 Microsoft Visual Studio 2005。
  2. 在 菜单, 指向 , 然后单击 。
  3. , 下单击 , 并单击 下 。

    注意 对于 Visual Studio 2005, 单击 项目类型 VisualBasic
  4. 在 框中, 键入 MyServerApp然后单击 。 默认情况下, 名, 是为 Form 1 窗体创建。
  5. 向窗体 Form 1 添加三个 控件。
  6. 在 菜单上, 单击 。
  7. 将 属性的 控件为下列值:
    名称文本
    Button 1创建命名管道
    Button 2等待客户连接
    Button3断开服务器
  8. 向窗体 添加一个 控件。 Label 1 控件被添加到窗体 Form 1。
返回页首

将所有声明添加到 Windows 应用程序中模块

要添加函数声明都需要通过命名管道, 实现进程间通信请按照下列步骤:
  1. 在 SolutionExplorer@@, 右击 , 指向 , 依次 。
  2. 在 对话框中, 单击 。
  3. 以下代码添加到 模块:
    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. 在 SolutionExplorer@@, 右击 , 并单击 。
  2. 在设计视图窗体 , , 双击并然后将以下代码添加到 过程:
    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. 添加下列代码之前 过程:
    Private Const pipeName As String = "\\.\pipe\MyPipe"Private Const BUFFSIZE As Short = 10000Private Buffer(BUFFSIZE) As BytePrivate hPipe As Integer
  4. 在 SolutionExplorer@@, 双击 。
  5. 在设计视图窗体 Form 1, 双击 , 并然后将以下代码添加到 过程:
    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. 在设计视图, 双击 , 并然后将以下代码添加到 Form 过程:
    Button2.Visible = FalseButton3.Visible = False
  7. 在 SolutionExplorer@@, 双击 。
  8. 在 Form 1 窗体, 设计视图 , 双击并向 过程然后添加以下代码:
    Dim res As Integer'Close the pipe handle when the client makes no requestsCloseHandle(hPipe)Label1.Text = "Disconnected the named pipe"
  9. 在 菜单上, 单击 。
返回页首

创建命名管道客户

要创建命名管道通信客户端与服务器, 请按照下列步骤操作:
  1. 调用 函数以创建到命名管道句柄。
  2. 调用 函数或 函数以通过管道通讯。
  3. 函数中创建句柄上调用 函数。
还用于命名管道事务客户 / 服务器通讯。 命名管道事务组合写操作和单个网络操作中读取操作。 双面, 消息类型管道上只使用一个事务。 进程可使用 函数或 函数进行命名管道事务。

在此代码示例, 使用 函数可以连接到命名管道服务器、 数据写入管道, 并从管道然后读取数据。

返回页首

设计 Windows 应用程序与命名管道服务器通信

要设计用于连接到命名管道服务器, VisualBasic.NET 或 Visual Basic 2005 Windows 应用请按照下列步骤操作:
  1. 启动 MicrosoftVisualStudio.NET 或 Microsoft Visual Studio 2005。
  2. 在 菜单, 指向 , 然后单击 。
  3. , 下单击 , 并单击 下 。

    注意 对于 Visual Studio 2005, 单击 项目类型 VisualBasic
  4. 在 框中, 键入 MyClientApp然后单击 。 默认情况下, 名, 是为 Form 1 窗体创建。
  5. 向窗体 Form 1 添加 控件。
  6. 右键单击 , 然后单击 。
  7. 将 属性以 。
  8. 向窗体 Form 1 添加一个 控件。 Label 1 控件添加到 表单。
  9. 将 Label 1 控件的 属性设置为
  10. 将两个 控件添加到 Form 1 窗。
返回页首

编写代码以连接到命名管道服务器

通过使用 函数连接到命名管道服务器。 连接到服务器, 后 函数写入管道, 从管道, 读取, 然后关闭管道。 要连接到服务器, 和然后读取或写入数据, 请按照下列步骤操作:
  1. 在设计视图, 双击 , 并然后将以下代码添加到 过程:
    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. 添加下列代码之前 过程:
    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. 窗体, Form 1 上 , 依次 。 应用程序现在被阻塞, 等待客户端以连接。
  3. 来启动客户端应用程序, 单击 菜单的 MyClientApp 项目上 。
  4. 在 Form 1 表单, 键入 10 中, 框, 然后单击 。 您可以看到 中接收到字节数组。
  5. 要从服务器, 断开客户端应用程序键入 0 中, 客户端应用程序中, 然后单击 。
  6. 关闭客户端应用程序。
  7. 要断开服务器命名管道, 末尾并关闭服务器应用程序, 然后单击 的服务器应用窗体 Form 1 上。
返回页首
参考
请, 有关访问下列 Microsoft Developer Network (MSDN) Web 站点:返回页首

警告:本文已自动翻译

属性

文章 ID:871044 - 上次审阅时间:01/11/2007 06:36:07 - 修订版本: 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
反馈