Come utilizzare le pipe denominate per le comunicazioni interprocesso in Visual Basic .NET o Visual Basic 2005

Traduzione articoli Traduzione articoli
Identificativo articolo: 871044 - Visualizza i prodotti a cui si riferisce l?articolo.
Espandi tutto | Chiudi tutto

In questa pagina

Sommario

In questo articolo dettagliato si illustra come utilizzare le pipe denominate in Microsoft Visual Basic . NET o Microsoft Visual Basic 2005 per le comunicazioni interprocesso. Questo articolo include un esempio del codice in cui Ŕ illustrata la comunicazione client/server utilizzando una pipa denominata in Visual Basic .NET o Visual Basic 2005. Nell'articolo si descrive la comunicazione interprocesso creando un server pipa denominata e un client pipa denominata. La comunicazione oltre la pipa si esegue nel seguente modo:
  • Creare una pipa denominata.
  • Bloccare l'applicazione server utilizzando la funzione ConnectNamedPipe finchÚ si connette un client.
  • Connettere al server utilizzando la funzione CallNamedPipe.
  • Chiamare la funzione ReadFile o la funzione WriteFile per comunicare oltre la pipa.
  • Chiamare la funzione DisconnectNamedPipe quando il processo si finisce di utilizzare la pipa.
  • Chiamare la funzione CloseHandle sopra la pipa denominata dopo aver completato la comunicazione oltre la pipa.

INTRODUZIONE

Una pipa denominata Ŕ una pipa unidirezionale o duplex per la comunicazione tra un server pipa e un o pi¨ client pipa. L'utente denominate le pipe Ŕ possibile per fornire la comunicazione fra i processi nello stesso computer o fra i processi su diversi computer in una rete. Il termino che si riferisce "ha denominato il server pipa" a un processo a cui crea una pipa denominata e al termine che si riferisce "ha denominato il client pipa" a un processo a cui si connette su un'istanza di una pipa denominata.

Utilizzare Microsoft Visual Basic . NET o Microsoft Visual Basic 2005 Ŕ possibile per creare le applicazioni che comunicano a altri processi utilizzando denominate le pipe. Questo articolo contiene un esempio di codice che utilizza una pipa denominata per comunicare tra due applicazioni di Visual Basic . NET o Visual Basic 2005 Windows.

Requisiti

In questo articolo si presume la conoscenza dei seguenti argomenti:
  • Applicazioni Windows
  • Programmazione Visual Basic .NE
  • Utilizzare le pipe
L'hardware consigliato, il software, l'infrastruttura di rete e i Service Pack necessari elencati sono di seguito:
  • Microsoft Visual Studio .NET o Microsoft Visual Studio 2005
  • Microsoft .NET Framework

Creare un server pipa denominata

Per creare un server pipa denominata e quindi comunicare con il client oltre la pipa, procedere come segue:
  1. Creare una pipa denominata.
  2. Chiamare la funzione ConnectNamedPipe per bloccare il server finchÚ si connette un client.
  3. Chiamare la funzione ReadFile o la funzione WriteFile per comunicare oltre la pipa.
  4. Chiamare la funzione DisconnectNamedPipe quando il processo si finisce di utilizzare la pipa.
  5. Chiamare la funzione CloseHandle sopra la pipa denominata.

Progettare un'applicazione per Windows che crea un server pipa denominata

Per progettare un'applicazione per Windows che crea un server pipa denominata utilizzando Visual Basic .NET o Visual Basic 2005, procedere come segue:
  1. Avviare Microsoft Visual Studio .NET o Microsoft Visual Studio 2005.
  2. Dal menu File, scegliere Nuovo e quindi scegliere Project.
  3. In Tipi progetto, selezionare Progetti di Visual Basic e quindi scegliere Applicazione Windows in Modelli.

    Nota: In Visual Studio 2005, fare clic su Visual Basic in Tipi progetto.
  4. Nella casella Nome, digitare MyServerApp, e quindi sceglie OK. Per l'impostazione predefinita, si crea un form che si denomina Form1.
  5. Aggiungere tre controlli Button al form Form1.
  6. Dal menu Visualizza, scegliere Finestra ProprietÓ.
  7. Impostare la proprietÓ Text dei controlli Button sui seguenti valori:
    Riduci questa tabellaEspandi questa tabella
    NomTesto
    Button1Creare una pipa denominata
    Button2Attendere per le connessioni client
    Button3Disconnettere il server
  8. Aggiungere un controllo Label al form Form1. Il controllo Label Label1 si aggiunge al form Form1.

Aggiungere tutte le dichiarazioni a un modulo nelle applicazioni Windows

Attenere a questa seguente procedura a aggiungere le dichiarazioni di funzione che Ŕ necessario implementare la comunicazione interprocesso utilizzando la pipa denominata:
  1. In Esplora soluzioni, fare clic con il pulsante destro di MyServerApp, scegliere Aggiungi e quindi scegliere Aggiungi modulo.
  2. Nella finestra di dialogo Add New Item - MyServerApp, selezionare Apri.
  3. Aggiungere il seguente codice al modulo 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
    

Il codice scrivere creare un server pipa denominata

Dopo aver creato una pipa denominata, attendere per le connessioni dal client. Quando il client si connette al server, leggere o scrivere i dati oltre la pipa. Attenere a questa seguente procedura a eseguire l'operazione:
  1. In Esplora soluzioni, fare clic con il pulsante destro di Form1 e quindi scegliere Apri.
  2. In visualizzazione Struttura Form1 della maschera, fare doppio clic su Create a named pipe e quindi aggiungere il codice riportato di seguito alla routine 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. Aggiungere il seguente codice prima della routine 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. In Esplora soluzioni, fare doppio clic su Form1.vb.
  5. In visualizzazione Struttura Form1 della maschera, fare doppio clic su Wait for the client connections e quindi aggiungere il codice riportato di seguito alla routine 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. In visualizzazione Struttura, fare doppio clic su Form1 e quindi aggiungere il codice riportato di seguito alla routine Form1 Load:
    Button2.Visible = False
    Button3.Visible = False
  7. In Esplora soluzioni, fare doppio clic su Form1.vb.
  8. In visualizzazione Struttura Form1 della maschera, fare doppio clic su Disconnect the server e quindi aggiungere il codice riportato di seguito alla routine 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. Dal menu Genera, scegliere Genera soluzione.

Creare un client pipa denominata

Attenere a questa seguente procedura a creare un client pipa denominata che comunica con il server:
  1. Chiamare alla funzione CreateFile per creare un handle sulla pipa denominata.
  2. Chiamare la funzione ReadFile o la funzione WriteFile per comunicare oltre la pipa.
  3. Chiamare la funzione CloseHandle sopra l'handle creato nella funzione CreateFile.
Utilizzare una transazione di pipa denominata Ŕ inoltre possibile per la comunicazione client/server. La transazione di pipa denominata combina un'operazione di scrittura e un'operazione di lettura in un'operazione di singola rete. Una transazione pu˛ essere utilizzata solo sopra una pipa fronte message-type. ╚ che utilizzino la funzione TransactNamedPipe o la funzione CallNamedPipe possibile per eseguire le transazioni di pipa denominata.

Nel codice di questo esempio, si utilizza la funzione CallNamedPipe per connettersi al server pipa denominata, scrivere i dati nella pipa e quindi leggere i dati dalla pipa.

Progettare un'applicazione con il server pipa denominata per Windows che comunica

Per progettare un'applicazione di Visual Basic . NET o Visual Basic 2005 Windows che si utilizza per connettersi al server pipa denominata, procedere come segue:
  1. Avviare Microsoft Visual Studio .NET o Microsoft Visual Studio 2005.
  2. Dal menu File, scegliere Nuovo e quindi scegliere Project.
  3. In Tipi progetto, selezionare Progetti di Visual Basic e quindi scegliere Applicazione Windows in Modelli.

    Nota: In Visual Studio 2005, fare clic su Visual Basic in Tipi progetto.
  4. Nella casella Nome, digitare MyClientApp, e quindi sceglie OK. Per l'impostazione predefinita, si crea un form che si denomina Form1.
  5. Aggiungere un controllo Button al form Form1.
  6. Fare clic con il pulsante destro di Button1 e quindi scegliere ProprietÓ.
  7. Impostare la proprietÓ Text a Connect to the server.
  8. Aggiungere un controllo Label al form Form1. Il controllo Label Label1 si aggiunge al form Form1.
  9. Impostare la proprietÓ di controllo Label Label1 su False Visible.
  10. Aggiungere due controlli TextBox al form Form1.

Il codice scrivere connettersi al server pipa denominata

Connettere al server pipa denominata utilizzando la funzione CallNamedPipe. Dopo connettersi al server, il CallNamedPipe legge la pipa e quindi chiude la pipa che la funzione scrive nella pipa. Quindi per connettersi al server, leggere o scrivere i dati, procedere come segue:
  1. In visualizzazione Struttura, fare doppio clic su Connect to the server e quindi aggiungere il codice riportato di seguito alla routine 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. Aggiungere il seguente codice prima della routine 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. Dal menu Genera, scegliere Genera soluzione.

Verificare che il codice funzioni

Attenere a questa seguente procedura a verificare che il codice funzioni:
  1. Per avviare l'applicazione server, scegliere Avvia dal menu Debug del progetto MyServerApp.
  2. Sopra il modulo Form1, fare clic su Create a named pipe e quindi scegliere Wait for the client connections. Ora, l'applicazione Ŕ bloccata e attende che si connette il client.
  3. Per avviare l'applicazione client, scegliere Avvia dal menu Debug del progetto MyClientApp.
  4. Della maschera Form1, digitare 10 Nella casella TextBox1 e quindi scegliere Connect to the server. ╚ possibile visualizzare la matrice di byte che si riceve nella casella TextBox2.
  5. Per disconnettere l'applicazione client dal server, digitare 0 Nel TextBox1, boxing nell'applicazione client e quindi scegliere Connect to the server.
  6. Chiudere l'applicazione client.
  7. Per disconnettere il fine di server della pipa denominata e quindi chiudere l'applicazione server, scegliere Disconnect the server della maschera Form1 dell'applicazione server.

Riferimenti

Per ulteriori informazioni, visitare il seguente sito Web Network (MSDN) Microsoft Developer:
Le pipe denominate
http://msdn2.microsoft.com/en-us/library/aa365590.aspx
Transazioni sopra le pipe denominate
http://msdn2.microsoft.com/en-us/library/aa365789.aspx
Funzioni di pipa
http://msdn2.microsoft.com/en-us/library/aa365781.aspx

ProprietÓ

Identificativo articolo: 871044 - Ultima modifica: giovedý 11 gennaio 2007 - Revisione: 2.4
Le informazioni in questo articolo si applicano a
  • Microsoft Visual Basic 2005
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
Chiavi:á
kbvs2005swept kbvs2005applies kbserver kbpipes kbipc kbclient kbhowtomaster kbhowto KB871044 KbMtit kbmt
Traduzione automatica articoli
Il presente articolo Ŕ stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell?utente. Tuttavia, un articolo tradotto in modo automatico non Ŕ sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, pi¨ o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non Ŕ la sua. Microsoft non Ŕ responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell?utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica. Nel caso in cui si riscontrino degli errori e si desideri inviare dei suggerimenti, Ŕ possibile completare il questionario riportato alla fine del presente articolo.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 871044
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

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