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

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

indietro all'alto

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
indietro all'alto

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 per bloccare il server finché si connette un client.
  3. Chiamare la funzione o la funzione per comunicare oltre la pipa.
  4. Chiamare la funzione quando il processo si finisce di utilizzare la pipa.
  5. Chiamare la funzione sopra la pipa denominata.
indietro all'alto

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 , scegliere e quindi scegliere .
  3. In , selezionare e quindi scegliere in .

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

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 , scegliere e quindi scegliere .
  2. Nella finestra di dialogo , selezionare .
  3. Aggiungere il seguente codice al modulo :
    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
indietro all'alto

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 e quindi scegliere .
  2. In visualizzazione Struttura della maschera, fare doppio clic su e quindi aggiungere il codice riportato di seguito alla routine :
    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. Aggiungere il seguente codice prima della routine :
    Private Const pipeName As String = "\\.\pipe\MyPipe"Private Const BUFFSIZE As Short = 10000Private Buffer(BUFFSIZE) As BytePrivate hPipe As Integer
  4. In Esplora soluzioni, fare doppio clic su .
  5. In visualizzazione Struttura Form1 della maschera, fare doppio clic su e quindi aggiungere il codice riportato di seguito alla routine :
    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. In visualizzazione Struttura, fare doppio clic su e quindi aggiungere il codice riportato di seguito alla routine :
    Button2.Visible = FalseButton3.Visible = False
  7. In Esplora soluzioni, fare doppio clic su .
  8. In visualizzazione Struttura Form1 della maschera, fare doppio clic su e quindi aggiungere il codice riportato di seguito alla routine :
    Dim res As Integer'Close the pipe handle when the client makes no requestsCloseHandle(hPipe)Label1.Text = "Disconnected the named pipe"
  9. Dal menu , scegliere .
indietro all'alto

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 per creare un handle sulla pipa denominata.
  2. Chiamare la funzione o la funzione per comunicare oltre la pipa.
  3. Chiamare la funzione sopra l'handle creato nella funzione .
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 o la funzione possibile per eseguire le transazioni di pipa denominata.

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

indietro all'alto

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 , scegliere e quindi scegliere .
  3. In , selezionare e quindi scegliere in .

    Nota: In Visual Studio 2005, fare clic su Visual Basic in Tipi progetto.
  4. Nella casella , digitare MyClientApp, e quindi sceglie . Per l'impostazione predefinita, si crea un form che si denomina Form1.
  5. Aggiungere un controllo al form Form1.
  6. Fare clic con il pulsante destro di e quindi scegliere .
  7. Impostare la proprietà a .
  8. Aggiungere un controllo al form Form1. Il controllo Label1 si aggiunge al form .
  9. Impostare la proprietà di controllo Label1 su .
  10. Aggiungere due controlli al form Form1.
indietro all'alto

Il codice scrivere connettersi al server pipa denominata

Connettere al server pipa denominata utilizzando la funzione . Dopo connettersi al server, il 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 e quindi aggiungere il codice riportato di seguito alla routine :
    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. Aggiungere il seguente codice prima della routine :
    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. Dal menu , scegliere .
indietro all'alto

Verificare che il codice funzioni

Attenere a questa seguente procedura a verificare che il codice funzioni:
  1. Per avviare l'applicazione server, scegliere dal menu del progetto MyServerApp.
  2. Sopra il modulo Form1, fare clic su e quindi scegliere . Ora, l'applicazione è bloccata e attende che si connette il client.
  3. Per avviare l'applicazione client, scegliere dal menu del progetto MyClientApp.
  4. Della maschera Form1, digitare 10 Nella casella e quindi scegliere . È possibile visualizzare la matrice di byte che si riceve nella casella .
  5. Per disconnettere l'applicazione client dal server, digitare 0 Nel , boxing nell'applicazione client e quindi scegliere .
  6. Chiudere l'applicazione client.
  7. Per disconnettere il fine di server della pipa denominata e quindi chiudere l'applicazione server, scegliere della maschera Form1 dell'applicazione server.
indietro all'alto
Riferimenti
Per ulteriori informazioni, visitare il seguente sito Web Network (MSDN) Microsoft Developer:
Transazioni sopra le pipe denominate
http://msdn2.microsoft.com/en-us/library/aa365789.aspx
indietro all'alto

Avviso: questo articolo è stato tradotto automaticamente

Proprietà

ID articolo: 871044 - Ultima revisione: 01/11/2007 06:36:07 - Revisione: 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 KbMtit kbmt
Feedback