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

Criar um cliente de pipe nomeado

Para criar um cliente de pipe nomeado que se comunica com o servidor, execute as seguintes etapas:

  1. Chame a função CreateFile para criar um identificador para o pipe nomeado.
  2. Chame a função ReadFile ou WriteFile para se comunicar através do pipe.
  3. Chame a função CloseHandle no identificador criado na função CreateFile.

Também é possível usar uma transação de pipe nomeado para a comunicação cliente/servidor. A transação de pipe nomeado combina uma operação de escrita e uma operação de leitura em uma única operação de rede. Uma transação pode ser usada apenas em um pipe duplex do tipo mensagem. Os processos podem usar a função TransactNamedPipe ou a função CallNamedPipe para executar transações de pipe nomeado.

Neste exemplo de código, você usa a função CallNamedPipe para conectar ao servidor de pipe nomeado, escrever os dados no pipe e ler os dados no pipe.

Projetar um aplicativo do Windows que se comunica com o servidor de pipe nomeado

Para projetar um aplicativo do Visual Basic .NET ou do Visual Basic 2005 Windows usado para conectar ao servidor de pipe nomeado, 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 clique em MyClientApp e clique em OK. Por padrão, um formulário chamado Form1 é criado.
  5. Adicione um controle Button ao formulário Form1.
  6. Clique com o botão direito do mouse em Button1 e clique em Properties.
  7. Defina a propriedade Text como Connect to the server.
  8. Adicione um controle Label ao formulário Form1. O controle Label Label1 é adicionado ao formulário Form1.
  9. Defina a propriedade Visible do controle Label Label1 como False.
  10. Adicione dois controles TextBox ao formulário Form1.
  11. Escrever código para conectar ao servidor de pipe nomeado

    Conecte ao servidor de pipe nomeado usando a função CallNamedPipe. Depois de conectar ao servidor, a função CallNamedPipe escreve para o pipe, lê no pipe e fecha o pipe. Para conectar ao servidor, ler e escrever os dados, execute as seguintes etapas:

    1. Na exibição Design, clique duas vezes em Connect to the server e adicione o seguinte código ao procedimento 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. Adicione o seguinte código antes do procedimento 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. No menu Build, clique em Build Solution.
    4. Verificar se o código funciona

      Para verificar se o código funciona, execute as seguintes etapas:

      1. Para iniciar o aplicativo do servidor, clique em Start no menu Debug do projeto MyServerApp.
      2. No formulário Form1, clique em Create a named pipe e em Wait for the client connections. Agora, o aplicativo está bloqueado e aguardando o cliente conectar.
      3. Para iniciar o aplicativo cliente, clique em Start no menu Debug do projeto MyClientApp.
      4. No formulário Form1, digite 10 na caixa TextBox1 e clique em Connect to the server. É possível ver a matriz de byte recebida na caixa TextBox2.
      5. Para desconectar o aplicativo cliente do servidor, digite 0 na caixa TextBox1 no aplicativo cliente e clique em Connect to the server.
      6. Feche o aplicativo cliente.
      7. Para desconectar a extremidade do servidor do pipe nomeado e fechar o aplicativo do servidor, clique em Disconnect the server no formulário Form1 do aplicativo do servidor.

fonte: microsoft

:: LUCIANA COSTA::

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 ::

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

Esse artigo discute detalhadamente como usar pipes nomeados no Microsoft Visual Basic .NET ou no Microsoft Visual Basic 2005 para comunicação entre processos. Esse artigo inclui um exemplo de código que demonstra a comunicação cliente/servidor usando um pipe nomeado no Visual Basic .NET ou no Visual Basic 2005. O artigo descreve a comunicação entre processos criando um servidor de pipe nomeado e um cliente de pipe nomeado. A comunicação através do pipe é executada da seguinte maneira:
  • Crie um pipe nomeado.
  • Bloqueie o aplicativo do servidor usando a função ConnectNamedPipe até que um cliente se conecte.
  • Conecte ao servidor usando a função CallNamedPipe.
  • Chame a função ReadFile ou WriteFile para se comunicar através do pipe.
  • Chame a função DisconnectNamedPipe quando o processo terminar de usar o pipe.
  • Chame a função CloseHandle no pipe nomeado após o término da comunicação através do pipe.

Um pipe nomeado é um pipe unidirecional ou duplex para comunicação entre um servidor de pipe e um ou mais clientes de pipe. É possível usar pipes nomeados para fornecer comunicação entre processos no mesmo computador ou entre processos em diferentes computadores através de uma rede. O termo “servidor de pipe nomeado” refere-se a um processo que cria um pipe nomeado e o termo “cliente de pipe nomeado” refere-se a um processo que se conecta a uma instância de um pipe nomeado.

É possível usar o Microsoft Visual Basic .NET ou Microsoft Visual Basic 2005 para criar aplicativos que se comunicam com outros processos usando pipes nomeados. Esse artigo contém um exemplo de código que usa um pipe nomeado para se comunicar entre dois aplicativos do Visual Basic .NET ou Visual Basic 2005 Windows.

Requisitos

Este artigo presume que você esteja familiarizado com os seguintes tópicos:

  • Aplicativos do Windows
  • Programação do Visual Basic .NET
  • Utilização de pipes

A seguinte lista descreve a infra-estrutura de rede, software, hardware e os service packs recomendados:

  • Microsoft Visual Studio .NET ou Microsoft Visual Studio 2005
  • Microsoft .NET Framework
fonte: microsoft

Veja mais no próximo post (parte 2).

:: LUCIANA COSTA ::

VB.Net Básico: Estruturas (FOR/NEXT)

Olá dando presseguimento as estruturas falaremos um pouco sobre a estrutura FOR:

Sintaxe:

FOR Variável_de_controle = Valor_Inicial to falor_Final
 Instruções
Next

 

As Estruturas de Repetição, são conhecidas normalmente por Loop (em portugues – laços) .

As ER´s permitem  que um mesmo  trecho do código seja  executado  várias vezes.

No caso da estrutura FOR (considerado o mais simples de todos)  apenas o utilizamos quando de antemão sabemos  o número de vezes  que o trecho do código  precisa ser executado.

Exemplo :

For i = 0 to 520

 

:: LUCIANA COSTA ::

VB.Net Básico: Estruturas (IF/THEN)

Olá,

Tudo bem? Aproveitando o horário (meio tarde) de almoço e como as coisas andam punk aqui na empresa… sabe como é fechamento de mês… um corre-corre danado! Parametrizações,  reuniões, fechamentos, relatórios (inúmeros!), gráficos e etc etc etc.

O mundo BUSINESS! Mas confesso que este ritmo é bacana !!!

🙂

Dentro desta brecha de tempo optei por colocar um assunto de VB.NET na qual faz parte do cotidiano de qualquier profissional da área de desenvolvimento de apps: a Estrutura IF/Then.

Inclusive coincide com duas turmas que estou ministrando no período. Portanto, turmas de programação… segue o reforço por aqui. Antena ligada!!!!!!!!!

🙂

Dentro do VB.NET BÁSICO falamos normalmente sobre as estruturas (laços). Vamos conhecer um pouco de cada uma delas:

IF/THEN

É utilizada para avaliar uma expressão lógica e com base no resultado obtido (verdadeiro ou falso) o programa deve executar ou não uma determinada ação.

 If <expressão> Then 
   <instrução> 
End If 
EXEMPLO 1 :
 If dblSaldoContaCC < 0 Then
MsgBox (“Não há saldo disponível na conta corrente”)
End If
EXEMPLO 2:
If dblSaldoContaCC < 0 Then    MsgBox (“Não há saldo disponível na conta corrente”) Else    dblSaldoContaCC = dblSaldoContaCC - dblValorDebitoCC End If
Por enquanto ficamos por aqui... espero tê-los apoiado de alguma forma.
:: LUCIANA COSTA::

Em algum fórum na net…

Olá Pessoal,

Aproveitando o breve intervalo da tarde… e passeando por alguns foruns que participo assiduamente… deparei com uma pergunta:

Então VB.NET ñ tem nada a ver pra desenvolvimento em Internet não ? .NET é apenas assim, um nome de uma nova versão ? mellow.gif

Opssssss!!! Não é nada disto! No próprio post um profissional respondeu (antes do meu post ) hehe

A Resposta:
Bom dia a todos.

Mas é claro que o VB.NET tem tudo a ver com desenvolvimento para internet. Inicialmente quando o Visual Basic foi lançado, era tão somente para aplicações desktops indo até a sua versão 6, e não era orientada a objetos, somente aplicações orientadas a Eventos, como disse o nosso amigo.

Com o uso frequente da Internet, a Microsoft adapta um linguagem de script que utiliza alguns códigos do VB para Internet, chamada de VBScript, linguagens estas que são incorporadas as Tags HTML, este conceito foi aprimorado para linguagem ASP (Active Server Pages), só que estas últimas linguagens não dispunha de Interface gráfica, tal qual o VB original dispunha, ou seja, voce arrastar componentes para dentro do Form e já ter todo o código pré-inicial definido, onde posteriormente programava-se os novos eventos e os novos recursos da sua aplicação, em suma, o VBScript, o ASP e o VB passaram a ser linguagens distintas.

O VB.Net, já incorpora um interface gráfica onde o código fonte pré-definido já o ASP com alguns códigos em HTML.

Já as novas versões a partir do Visual Studio 2005, dizem as más línguas, que já é totalmente orientada a objetos, tanto voltada para aplicações desktop, quanto para aplicações de Internet.

Porque voce disse que as más línguas ? Simples, porque eu não programo mais em VB desde 1999, onde programava na versão 6, e posteriormente em 2000 passei a programar em ASP, e depois passei para Delphi, e foi ai que abandonei o VB de vez. Motivo, o Delphi já era orientado o Objetos desde aquela época.

Viu como a Plataforma Net é ampla… e isto é só o começo!
Nos falamos por aqui.
See You!
onde? fórum imasters
:: LUCIANA COSTA ::

Visual Basic.Net – conceito

Não sou muito adepta da enciclopédia livre: wiki. Como para algumas regras existem as exceções, neste assunto (sobre o VB.Net) traduz de forma clara e verídica o conceito de Visual Basic.Net.

Para você que está acompanhando este blog a pouco tempo, olhe as categorias aí ao lado (esquerdo) e temos duas delas destinadas a tal assunto (categorias: Tudo.Bet e Vb.Net). Faça sua visita nestas “catigurias” e leias outros assuntos e dicas correlatos.

Visual Basic.NET é uma linguagem de programação totalmente orientada a objetos e com suporte total a UML, criada pela Microsoft e distribuída com o Visual Studio .NET (Versão seguinte ao Visual Basic 6.0), embora hoje já haja o Visual Basic 2008.

O Visual Basic.NET é um produto extremamente diferente do antigo Visual Basic 6.0, não podendo ser considerada uma versão seguinte. Não apenas a maneira de programar foi alterada, mas todo conceito de orientação a objetos trouxe poder para a linguagem. A Microsoft simplesmente descontinuou o antigo Visual Basic 6.0 tornando o produto parecido com as demais linguagens do Visual Studio, parecido em questões de recursos e portabilidade pois o Visual Basic.NET ainda é muito diferentes de liguagens como o Visual C++, C#, etc. Porém esta nova versão aproximou o Visual Basic.NET das grandes linguagens de programação, aumentando a aceitação dos programadores Java e até mesmo C++, embora programadores Java caso tenham que migrar para plataforma Microsoft preferem o C#. Apesar da linguagem ser parecida com o antigo Visual Basic 6.0 a migração destes programadores para a nova plataforma e utilização do Visual Basic.NET é mais fácil para programadores que utilizam linguagens orientada a objeto por causa da grande diferença. Os programadores do antigo Visual Basic 6.0 acostumados com a orientação a eventos encontram dificuldades para utilizar o Visual Basic.NET.

Bom… caso você tenha algum cometário ou dúvida deixe seu post por aqui (logo abaixo deste artigo).

Abraços

::LUCIANA COSTA::