Cómo utilizar canalizaciones con nombre para comunicación en Visual Basic . NET o Visual Basic 2005 entre procesos

Seleccione idioma Seleccione idioma
Id. de artículo: 871044 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Resumen

En este artículo paso a paso se describe cómo utilizar canalizaciones con nombre en Microsoft Visual Basic . NET o Microsoft Visual Basic 2005 para comunicación entre procesos. Este Este artículo incluye un ejemplo del código que muestra comunicación cliente/servidor utilizando unas canalizaciones con nombre en Visual Basic .NET o Visual Basic 2005. El Este artículo describe la comunicación entre procesos creando un servidor de canalización con nombre y un cliente de canalización con nombre. La comunicación por encima de la canalización se realiza de la forma siguiente:
  • Cree una canalización con nombre.
  • Bloquee la aplicación de servidor utilizando la función ConnectNamedPipe hasta que se conecte un cliente.
  • Se conecta al servidor utilizando la función CallNamedPipe.
  • Llame a la función ReadFile o a la función WriteFile para comunicarse por encima de la canalización.
  • Llame a la función DisconnectNamedPipe cuando el proceso termina de usar la canalización.
  • Llame a la función CloseHandle en la canalización con nombre después de completar la comunicación por encima de la canalización.

INTRODUCCIÓN

Una canalización con nombre es una canalización unidireccional o cara para comunicación entre un servidor de canalización y uno o varios clientes de canalización. Puede usuario llamado canalizaciones para proporcionar comunicación entre procesos en el mismo equipo o procesos en equipos diferentes a través de una red. El término que se refiere "denominó servidor de canalización" a un proceso al que se crea una canalización con nombre y al término que se refiere "denominó cliente de canalización" a un proceso al que se conecta a una instancia de una canalización con nombre.

Puede utilizar Microsoft Visual Basic . NET o Microsoft Visual Basic 2005 para crear aplicaciones que se comunican a otros procesos utilizando denominadas canalizaciones. Este Este artículo contiene un Ejemplo de código que utiliza unas canalizaciones con nombre para comunicarse entre dos aplicaciones de Visual Basic . NET o Visual Basic 2005 Windows.

Requisito

En este artículo se supone que está familiarizado con los temas siguientes
  • Aplicación para Windows
  • Programa Visual Basic .NET
  • Utilizar canalizaciones
En la lista siguiente se describe el hardware, el software, la infraestructura de red y los service pack recomendados que se necesitarán
  • Microsoft Visual Studio .NET o Microsoft Visual Studio 2005
  • Microsoft .NET Framework

Cree un servidor de canalización con nombre

Para crear un servidor de canalización con nombre y a continuación, comunicarse con el cliente por encima de la canalización, siga estos pasos:
  1. Cree una canalización con nombre.
  2. Llame a la función ConnectNamedPipe para bloquear el servidor hasta que se conecte un cliente.
  3. Llame a la función ReadFile o a la función WriteFile para comunicarse por encima de la canalización.
  4. Llame a la función DisconnectNamedPipe cuando el proceso termina de usar la canalización.
  5. Llame a la función CloseHandle en la canalización con nombre.

Vaya a diseñar una aplicación para Windows que crea un servidor de canalización con nombre

Para ir a diseñar una aplicación para Windows que crea un servidor de canalización con nombre utilizando Visual Basic .NET o Visual Basic 2005, siga estos pasos:
  1. Inicie Microsoft Visual Studio .NET o Microsoft Visual Studio 2005.
  2. En el menú Archivo, seleccione Nuevo y a continuación, haga clic en Proyecto.
  3. En Tipos de proyecto, haga clic en Proyectos de Visual Basic y a continuación, haga clic en Aplicación para Windows en Plantillas.

    Nota En Visual Studio 2005, haga clic en Visual Basic en Tipos de proyecto.
  4. En el cuadro Nombre, escriba MyServerApp y a continuación, haga clic en Aceptar. De forma predeterminada, se crea un formulario que se denomina Form1.
  5. Agregue tres controles Button al formulario Form1.
  6. En el menú Ver, haga clic en Ventana Propiedades.
  7. Establezca la propiedad Text de los controles Button en los valores siguientes:
    Contraer esta tablaAmpliar esta tabla
    NombrText
    Button1Cree una canalización con nombre
    Button2Espere para las conexiones de cliente
    Button3Desconecte el servidor
  8. Agregue un control Label al formulario Form1. El control Label Label1 se agrega al formulario Form1.

Agregue todas las declaraciones a un módulo en la aplicación para Windows

Para agregar las declaraciones de función que es necesario implementar la comunicación entre procesos utilizando las canalizaciones con nombre, siga estos pasos:
  1. En Explorador de soluciones, haga clic con el botón secundario en MyServerApp, seleccione Agregar y a continuación, haga clic en Agregar módulo.
  2. En el cuadro de diálogo Add New Item - MyServerApp, haga clic en Abrir.
  3. Agregue el código siguiente al módulo 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
    

Escriba código para crear un servidor de canalización con nombre

Después de crear una canalización con nombre, espere las conexiones del cliente. Cuando el cliente se conecta al servidor, lea o escriba los datos por encima de la canalización. Para ello, siga estos pasos:
  1. En Explorador de soluciones, haga clic con el botón secundario en Form1 y a continuación, haga clic en Abrir.
  2. En vista Diseño del formulario Form1, haga doble clic en Create a named pipe y a continuación, agregue el código siguiente al procedimiento 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. Agregue el código siguiente antes del procedimiento 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. En Explorador de soluciones, haga doble clic en Form1.vb.
  5. En vista Diseño del formulario Form1, haga doble clic en Wait for the client connections y a continuación, agregue el código siguiente al procedimiento 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. En vista Diseño, haga doble clic en Form1 y a continuación, agregue el código siguiente al procedimiento Form1 Load:
    Button2.Visible = False
    Button3.Visible = False
  7. En Explorador de soluciones, haga doble clic en Form1.vb.
  8. En vista Diseño del formulario Form1, haga doble clic en Disconnect the server y a continuación, agregue el código siguiente al procedimiento 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. En el menú Generar, haga clic en Generar solución.

Cree un cliente de canalización con nombre

Para crear un cliente de canalización con nombre que se comunica con el servidor, siga estos pasos:
  1. Llame a la función CreateFile para crear un identificador a la canalización con nombre.
  2. Llame a la función ReadFile o a la función WriteFile para comunicarse por encima de la canalización.
  3. Llame a la función CloseHandle en el identificador creado en la función CreateFile.
También puede utilizar una transacción de canalización con nombre para comunicación cliente/servidor. La transacción de canalización con nombre combina una operación de escritura y una operación de lectura en una operación de red única. Una transacción se puede utilizar sólo en una canalización cara message-type. Los procesos pueden utilizar la función TransactNamedPipe o la función CallNamedPipe para realizar las transacciones de canalización con nombre.

En este ejemplo del código, utiliza la función CallNamedPipe para conectarse al servidor de canalización con nombre, escribir los datos en la canalización y a continuación, leer los datos de la canalización.

Diseñe una aplicación para Windows que se comunica con el servidor de canalización con nombre

Para diseñar una aplicación de Visual Basic . NET o Visual Basic 2005 Windows que se utiliza para conectarse al servidor de canalización con nombre, siga estos pasos:
  1. Inicie Microsoft Visual Studio .NET o Microsoft Visual Studio 2005.
  2. En el menú Archivo, seleccione Nuevo y a continuación, haga clic en Proyecto.
  3. En Tipos de proyecto, haga clic en Proyectos de Visual Basic y a continuación, haga clic en Aplicación para Windows en Plantillas.

    Nota En Visual Studio 2005, haga clic en Visual Basic en Tipos de proyecto.
  4. En el cuadro Nombre, escriba MyClientApp y a continuación, haga clic en Aceptar. De forma predeterminada, se crea un formulario que se denomina Form1.
  5. Agregue un control Button al formulario Form1.
  6. Haga clic con el botón secundario en Button1 y a continuación, haga clic en Propiedades.
  7. Establezca la propiedad Text a Connect to the server.
  8. Agregue un control Label al formulario Form1. El control Label Label1 se agrega a formulario Form1.
  9. Establezca la propiedad de control Label Label1 en False Visible.
  10. Agregue dos control TextBox al formulario Form1.

Escriba código para conectarse al servidor de canalización con nombre

Se conecta al servidor de canalización con nombre utilizando la función CallNamedPipe. Una vez que se conecte al servidor, el CallNamedPipe lee la canalización y a continuación, cierra la canalización al escribir función en la canalización. Para conectarse con el servidor, leer o escribir los datos a continuación, siga estos pasos:
  1. En vista Diseño, haga doble clic en Connect to the server y a continuación, agregue el código siguiente al procedimiento 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. Agregue el código siguiente antes del procedimiento 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. En el menú Generar, haga clic en Generar solución.

Compruebe que el código funciona

Para comprobar que funciona su código, siga estos pasos:
  1. Para iniciar la aplicación de servidor, haga clic en Iniciar en el menú Depuración del proyecto MyServerApp.
  2. En el formulario Form1, haga clic en Create a named pipe y a continuación, haga clic en Wait for the client connections. Ahora, la aplicación se bloquea y espera conexión del cliente.
  3. Para iniciar la aplicación de cliente, haga clic en Iniciar en el menú Depuración del proyecto MyClientApp.
  4. En el formulario Form1, escriba 10 en el cuadro TextBox1 y a continuación, haga clic en Connect to the server. Puede ver la matriz de bytes que se recibe en el cuadro TextBox2.
  5. Para desconectar la aplicación de cliente del servidor, 0 de tipo en el TextBox1 confina la aplicación de cliente y a continuación, hace clic en Connect to the server.
  6. Cierre la aplicación de cliente.
  7. Para desconectar el extremo de servidor de la canalización con nombre y después, cerrar la aplicación de servidor, haga clic en Disconnect the server en el formulario Form1 de las aplicaciones de servidor.

Referencias

Para obtener más información, visite los siguientes sitios Web de Microsoft Developer Network (MSDN)
Canalización con nombre
http://msdn2.microsoft.com/en-us/library/aa365590.aspx
Transacciones en canalización con nombre
http://msdn2.microsoft.com/en-us/library/aa365789.aspx
Funciones de canalización
http://msdn2.microsoft.com/en-us/library/aa365781.aspx

Propiedades

Id. de artículo: 871044 - Última revisión: jueves, 11 de enero de 2007 - Versión: 2.4
La información de este artículo se refiere a:
  • Microsoft Visual Basic 2005
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
Palabras clave: 
kbvs2005swept kbvs2005applies kbserver kbpipes kbipc kbclient kbhowtomaster kbhowto KB871044 KbMtes kbmt
Traducción automática
AVISO: Gracias por utilizar el servicio de Traducción Automática. Este artículo ha sido traducido por un sistema informático sin ayuda humana (Machine Translation). Microsoft ofrece estos artículos a los usuarios que no comprendan el inglés, exclusivamente, con el fin de que puedan entenderlos más fácilmente. Microsoft no se hace responsable de la calidad lingüística de las traducciones ni de la calidad técnica de los contenidos de los artículos así como tampoco de cualesquiera problemas, directos o indirectos, que pudieran surgir como consecuencia de su utilización por los lectores.
Haga clic aquí para ver el artículo original (en inglés): 871044

Enviar comentarios

 

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