Comment utiliser les canaux nommés pour les communications dans Visual Basic .NET ou Visual Basic 2005 interprocessus

Traductions disponibles Traductions disponibles
Numéro d'article: 871044 - Voir les produits auxquels s'applique cet article
Agrandir tout | Réduire tout

Sommaire

Résumé

Cet article étape par étape explique comment utiliser les canaux nommés dans Microsoft Visual Basic .NET ou Microsoft Visual Basic 2005 pour des communications interprocessus. Cet article contient un exemple de code qui illustre la communication client/serveur en utilisant un canal nommé dans Visual Basic .NET ou Visual Basic 2005. L'article décrit la communication interprocessus en créant un serveur de canal nommé et un client de canal nommé. La communication sur le canal est effectuée de la manière suivante :
  • Créez un canal nommé.
  • Bloquez l'application serveur en utilisant la fonction ConnectNamedPipe jusqu'à ce qu'un client connecte se.
  • Vous connectez au serveur en utilisant la fonction CallNamedPipe.
  • Appelez la fonction ReadFile ou si WriteFile fonctionne pour communiquer sur le canal.
  • Appelez la fonction DisconnectNamedPipe lorsque le processus finit d'utiliser le canal.
  • Appelez la fonction CloseHandle sur les canaux nommés après avoir terminé la communication sur le canal.

INTRODUCTION

Un canal nommé est un canal unidirectionnel ou duplex pour la communication entre un serveur de canal et un ou plusieurs clients de canal. Vous pouvez l'utilisateur nommé canaux pour permettre la communication entre des processus sur le même ordinateur ou des processus sur d'autres ordinateurs sur un réseau. Le terme fait référence à un processus à lequel crée un canal nommé et le terme fait référence à un processus à lequel se connecte à une instance d'un canal nommé "a nommé le client de canal" "a nommé le serveur de canal".

Vous pouvez utiliser Microsoft Visual Basic .NET ou Microsoft Visual Basic 2005 pour créer les applications qui communiquent à tous les processus en utilisant canaux nommés. Cet article contient des exemples de code qui utilisent un canal nommé pour communiquer entre deux applications Visual Basic .NET ou Visual Basic 2005 Windows.

Exigences

Cet article suppose que vous maîtrisez les sujets suivants :
  • Application Windows
  • Programmer Visual Basic .NET
  • Utiliser des canaux
La liste suivante indique le matériel les logiciels et l'infrastructure réseau recommandés ainsi que les Service Packs dont vous avez besoin
  • Microsoft Visual Studio .NET ou Microsoft Visual Studio 2005
  • Microsoft .NET Framework

Créez un serveur de canal nommé

Pour créer un serveur de canal nommé et pour communiquer puis, avec le client sur le canal, procédez comme suit :
  1. Créez un canal nommé.
  2. Appelez la fonction ConnectNamedPipe pour bloquer le serveur jusqu'à ce qu'un client connecte se.
  3. Appelez la fonction ReadFile ou si WriteFile fonctionne pour communiquer sur le canal.
  4. Appelez la fonction DisconnectNamedPipe lorsque le processus finit d'utiliser le canal.
  5. Appelez la fonction CloseHandle sur les canaux nommés.

Concevez une application Windows qui crée un serveur de canal nommé

Pour concevoir une application Windows qui crée un serveur de canal nommé en utilisant Visual Basic .NET ou Visual Basic 2005, procédez comme suit :
  1. Démarrez Microsoft Visual Studio .NET ou Microsoft Visual Studio 2005.
  2. Dans le menu Fichier, pointez sur Nouveau et cliquez sur Projet.
  3. Sous Types de projets, cliquez sur Projets Visual Basic et puis cliquez sur Application Windows, sous Modèles.

    Note dans le Visual Studio 2005, cliquez sur Visual Basic, sous Types de projets.
  4. Dans la zone Nom, tapez MyServerApp et puis cliquez sur OK. Un formulaire qui est appelé Form1 est créé par défaut.
  5. Ajoutez trois contrôles Button au formulaire Form1.
  6. Dans le menu Affichage, cliquez sur Fenêtre Propriétés.
  7. Définissez la propriété Text des contrôle Button aux valeurs suivantes :
    Réduire ce tableauAgrandir ce tableau
    NomTexte
    Button1Créez un canal nommé
    Button2Attendez pour les connexions clientes
    Button3Déconnectez le serveur
  8. Ajoutez un contrôle Label au formulaire Form1. Le contrôle Label Label1 est ajouté au formulaire Form1.

Ajoutez toutes les déclarations à un module dans les applications Windows

Pour ajouter les déclarations de fonction est requis d'implémenter la communication interprocessus, les déclarations en utilisant le canal nommé, procédez comme suit :
  1. Dans Explorateur de solutions, cliquez avec le bouton droit sur MyServerApp, pointez sur Ajouter et puis cliquez sur Ajouter un module.
  2. Dans la boîte de dialogue Add New Item - MyServerApp, cliquez sur Ouvrir.
  3. Ajoutez le code suivant au module 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
    

Écrivez le code pour créer un serveur de canal nommé

Après avoir créé un canal nommé, attentez des connexions du client. Lorsque le client se connecte au serveur, lisez ou écrivez les données sur le canal. Exécutez les procédures pour cela :
  1. Dans Explorateur de solutions, cliquez avec le bouton droit sur Form1 et puis cliquez sur Ouvrir.
  2. En mode Création Form1 du formulaire, double-cliquez sur Create a named pipe et ajoutez puis le code suivant à la procédure 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. Ajoutez le code suivant avant la procédure 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. Dans Explorateur de solutions, double-cliquez sur Form1.vb.
  5. En mode Création Form1 du formulaire, double-cliquez sur Wait for the client connections et ajoutez puis le code suivant à la procédure 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. Dans le mode Création, double-cliquez sur Form1 et ajoutez puis le code suivant à la procédure Form1 Load :
    Button2.Visible = False
    Button3.Visible = False
  7. Dans Explorateur de solutions, double-cliquez sur Form1.vb.
  8. En mode Création Form1 du formulaire, double-cliquez sur Disconnect the server et ajoutez puis le code suivant à la procédure 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. Dans le menu Générer, cliquez sur Générer la solution.

Créez un client de canal nommé

Pour créer un client de canal nommé qui communique avec le serveur, procédez comme suit :
  1. Appelez la fonction CreateFile pour créer un handle au canal nommé.
  2. Appelez la fonction ReadFile ou si WriteFile fonctionne pour communiquer sur le canal.
  3. Appelez la fonction CloseHandle sur l'handle créé dans la fonction CreateFile.
Vous pouvez également utiliser une transaction de canal nommé pendant la communication client/serveur. La transaction de canal nommé combine une opération d'écriture et une opération de lecture dans une opération réseau unique. Une transaction peut être utilisée seulement sur un canal message-type recto verso. Les processus peuvent utiliser la fonction TransactNamedPipe ou la fonction CallNamedPipe pour effectuer les transactions de canal nommé.

Vous dans cet exemple de code, utilisez la fonction CallNamedPipe pour vous connecter au serveur de canal nommé, pour écrire les données dans le canal et pour lire les données dans le canal, puis.

Concevez une application Windows qui communique avec le serveur de canal nommé

Pour concevoir une application Visual Basic .NET ou Visual Basic 2005 Windows qui est utilisée pour vous connecter au serveur de canal nommé, procédez comme suit :
  1. Démarrez Microsoft Visual Studio .NET ou Microsoft Visual Studio 2005.
  2. Dans le menu Fichier, pointez sur Nouveau et cliquez sur Projet.
  3. Sous Types de projets, cliquez sur Projets Visual Basic et puis cliquez sur Application Windows, sous Modèles.

    Note dans le Visual Studio 2005, cliquez sur Visual Basic, sous Types de projets.
  4. Dans la zone Nom, tapez MyClientApp et puis cliquez sur OK. Un formulaire qui est appelé Form1 est créé par défaut.
  5. Ajoutez un contrôle Button au formulaire Form1.
  6. Cliquez avec le bouton droit sur Button1 et puis cliquez sur Propriétés.
  7. Définissez la propriété Text à Connect to the server.
  8. Ajoutez un contrôle Label au formulaire Form1. Le contrôle Label Label1 est ajouté au formulaire Form1.
  9. Définissez la propriété Visible de contrôle Label Label1 sur False.
  10. Ajoutez deux contrôles TextBox au formulaire Form1.

Écrivez code pour établir une connexion au serveur de canal nommé

Vous connectez au serveur de canal nommé en utilisant la fonction CallNamedPipe. Après avoir établi une connexion au serveur le CallNamedPipe lit le canal et ferme puis le canal fonction écrit dans le canal. Pour vous connecter ensuite, au serveur, pour lire ou pour écrire les données, procédez comme suit :
  1. Dans le mode Création, double-cliquez sur Connect to the server et ajoutez puis le code suivant à la procédure 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. Ajoutez le code suivant avant la procédure 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. Dans le menu Générer, cliquez sur Générer la solution.

Vérifiez que le code fonctionne

Pour vérifier que votre code fonctionne, procédez comme suit :
  1. Pour démarrer l'application serveur, cliquez sur Démarrer dans le menu Déboguer du projet MyServerApp.
  2. Sur le formulaire Form1, cliquez sur Create a named pipe et puis cliquez sur Wait for the client connections. L'application est bloquée maintenant et attend le client à connecter se.
  3. Pour démarrer l'application cliente, cliquez sur Démarrer dans le menu Déboguer du projet MyClientApp.
  4. Sur le formulaire Form1, tapez 10, dans la zone TextBox1 et puis cliquez sur Connect to the server. Vous pouvez voir le tableau d'octets qui est reçu dans la zone TextBox2.
  5. Pour déconnecter l'application cliente du serveur 0 de type dans le TextBox1 zone dans l'application cliente et clique puis, sur Connect to the server.
  6. Fermez l'application cliente.
  7. Pour déconnecter la fin de serveur du canal nommé et pour fermer l'application serveur, puis, cliquez sur Disconnect the server du formulaire Form1 de l'application serveur.

Références

Pour plus d'informations reportez-vous aux sites Web MSDN (Microsoft Developer Network) aux adresses suivantes
Canaux nommés
http://msdn2.microsoft.com/en-us/library/aa365590.aspx
Transactions sur des canaux nommés
http://msdn2.microsoft.com/en-us/library/aa365789.aspx
Fonctions de canal
http://msdn2.microsoft.com/en-us/library/aa365781.aspx

Propriétés

Numéro d'article: 871044 - Dernière mise à jour: jeudi 11 janvier 2007 - Version: 2.4
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Visual Basic 2005
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
Mots-clés : 
kbvs2005swept kbvs2005applies kbserver kbpipes kbipc kbclient kbhowtomaster kbhowto KB871044 KbMtfr kbmt
Traduction automatique
TRADUCTION AUTOMATIQUE : Cet article technique a été traduit par un système automatique, c'est-à-dire sans aucune intervention humaine. Microsoft propose ce type d?articles en complément de ceux traduits par des traducteurs professionnels. Ces articles sont destinés principalement aux utilisateurs ne comprenant pas l'anglais en leur proposant, en complément, une version française de l?information technique fournie dans la version américaine et originale de l?article. Pour plus de détails, veuillez consulter la page http://support.microsoft.com/gp/mtdetails. Attention : Il est possible que certaines parties de l?article ne soient pas traduites par le système automatique et qu?elles soient restées rédigées en anglais. Microsoft ne garantit pas la qualité linguistique des traductions et ne peut être tenu responsable d?aucun problème, direct ou indirect, dû à une quelconque erreur de traduction du contenu ou de son utilisation par les utilisateurs.
La version anglaise de cet article est la suivante: 871044
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

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