Parte2: Como usar pipes nomeados para comunicação entre processos no Visual Basic .NET ou no Visual Basic 2005

Criar um servidor de pipe nomeado

Para criar um servidor de pipe nomeado e se comunicar com o cliente através do pipe, execute as seguintes etapas:

  1. Crie um pipe nomeado.
  2. Chame a função ConnectNamedPipe para bloquear o servidor até que um cliente se conecte.
  3. Chame a função ReadFile ou WriteFile para se comunicar através do pipe.
  4. Chame a função DisconnectNamedPipe quando o processo terminar de usar o pipe.
  5. Chame a função CloseHandle no pipe nomeado.

 

Projetar um aplicativo do Windows que cria um servidor de pipe nomeado

Para projetar um aplicativo do Windows que cria um servidor de pipe nomeado usando o Visual Basic .NET ou Visual Basic 2005, execute as seguintes etapas:

  1. Inicie o Microsoft Visual Studio .NET ou o Microsoft Visual Studio 2005.
  2. No menu File, aponte para New e clique em Project.
  3. Em Project Types, clique em Visual Basic Projects e clique em Windows Application em Templates.

    Observação No Visual Studio 2005, clique em Visual Basic em Project Types.

  4. Na caixa Name, digite MyServerApp e clique em OK. Por padrão, um formulário chamado Form1 é criado.
  5. Adicione três controles Button ao formulário Form1.
  6. No menu View, clique em Properties Window.
  7. Defina a propriedade Text dos controles Button aos seguintes valores:
    Recolher esta tabelaExpandir esta tabela
    Name Text
    Button1 Crie um pipe nomeado
    Button2 Aguarde as conexões do cliente
    Button3 Desconecte o servidor
  8. Adicione um controle Label ao formulário Form1. O controle Label Label1 é adicionado ao formulário Form1.

Adicionar todas as declarações a um módulo no aplicativo do Windows

Para adicionar as declarações da função necessárias para implementar a comunicação entre processos usando o pipe nomeado, execute as seguintes etapas:

  1. No Solution Explorer, clique com o botão direito do mouse em MyServerApp, aponte para Add e clique em Add Module.
  2. Na caixa de diálogo Add New Item – MyServerApp, clique em Open.
  3. Adicione o seguinte código ao 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

Escrever código para criar um servidor de pipe nomeado

Após a criação de um pipe nomeado, aguarde as conexões do cliente. Quando o cliente conecta ao servidor, leia ou escreva as dados através do pipe. Para fazer isto, execute as seguintes etapas:
  1. No Solution Explorer, clique com o botão direito do mouse em Form1 e clique em Open.
  2. Na exibição Design do formulário Form1, clique duas vezes em Create a named pipe e adicione o seguinte código ao procedimento 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. Adicione o seguinte código antes do procedimento 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. No Solution Explorer, clique duas vezes em Form1.vb.
  5. Na exibição Design do formulário Form1, clique duas vezes em Wait for the client connections e adicione o seguinte código ao procedimento 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. Na exibição Design, clique duas vezes em Form1 e adicione o seguinte código ao procedimento Form1_Load:

    Button2.Visible = False
    Button3.Visible = False

  7. No Solution Explorer, clique duas vezes em Form1.vb.
  8. Na exibição Design do formulário Form1, clique duas vezes em Disconnect the server e adicione o seguinte código ao procedimento 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. No menu Build, clique em Build Solution.

Acompanhe a continuação da matéria no próximo post.

::LUCIANA COSTA ::

Anúncios

Um comentário sobre “Parte2: Como usar pipes nomeados para comunicação entre processos no Visual Basic .NET ou no Visual Basic 2005

  1. Luciana, tenho um programa fornecido por uma corretora de bolsa de valores que possibilita atualizar planilha de Excel através de um link DDE, conforme as cotações das ações vão variando. Como se sabe, as versões atuais do VB abandonaram o DDE.
    O que eu preciso é atualizar, dinamicamente, um form com os campos do programa da corretora. Pergunto: é possível fazer isso através dos pipes nomeados?

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s