TransactNamedPipe, fonction (namedpipeapi.h)

Combine les fonctions qui écrivent un message dans et lisent un message à partir du canal nommé spécifié en une seule opération.

Syntaxe

BOOL TransactNamedPipe(
  [in]                HANDLE       hNamedPipe,
  [in]                LPVOID       lpInBuffer,
  [in]                DWORD        nInBufferSize,
  [out]               LPVOID       lpOutBuffer,
  [in]                DWORD        nOutBufferSize,
  [out]               LPDWORD      lpBytesRead,
  [in, out, optional] LPOVERLAPPED lpOverlapped
);

Paramètres

[in] hNamedPipe

Handle du canal nommé retourné par la fonction CreateNamedPipe ou CreateFile .

Ce paramètre peut également être un handle vers un canal anonyme, tel que retourné par la fonction CreatePipe .

[in] lpInBuffer

Pointeur vers la mémoire tampon contenant les données à écrire dans le canal.

[in] nInBufferSize

Taille, en octets, de la mémoire tampon d’entrée.

[out] lpOutBuffer

Pointeur vers la mémoire tampon qui reçoit les données lues à partir du canal.

[in] nOutBufferSize

Taille de la mémoire tampon de sortie en octets.

[out] lpBytesRead

Pointeur vers la variable qui reçoit le nombre d’octets lus à partir du canal.

Si lpOverlapped a la valeur NULL, lpBytesRead ne peut pas être NULL.

Si lpOverlapped n’a pas la valeur NULL, lpBytesRead peut être NULL. S’il s’agit d’une opération de lecture qui se chevauche, vous pouvez obtenir le nombre d’octets lus en appelant GetOverlappedResult. Si hNamedPipe est associé à un port d’achèvement des E/S, vous pouvez obtenir le nombre d’octets lus en appelant GetQueuedCompletionStatus.

[in, out, optional] lpOverlapped

Pointeur vers une structure OVERLAPPED. Cette structure est requise si hNamedPipe a été ouvert avec FILE_FLAG_OVERLAPPED.

Si hNamedPipe a été ouvert avec FILE_FLAG_OVERLAPPED, le paramètre lpOverlapped ne doit pas être NULL. Il doit pointer vers une structure CHEVAUCHEMENT VALIDE . Si hNamedPipe a été créé avec FILE_FLAG_OVERLAPPED et que lpOverlapped a la valeur NULL, la fonction peut signaler à tort que l’opération est terminée.

Si hNamedPipe a été ouvert avec FILE_FLAG_OVERLAPPED et que lpOverlapped n’a pas la valeur NULL, TransactNamedPipe est exécuté comme une opération qui se chevauche. La structure OVERLAPPED doit contenir un objet d’événement de réinitialisation manuelle (qui peut être créé à l’aide de la fonction CreateEvent ). Si l’opération ne peut pas être effectuée immédiatement, TransactNamedPipe renvoie FALSE et GetLastError renvoie ERROR_IO_PENDING. Dans ce cas, l’objet d’événement est défini sur l’état non signé avant le retour de TransactNamedPipe , et il est défini sur l’état signalé lorsque la transaction est terminée. En outre, vous pouvez être averti lorsqu’une opération qui se chevauche se termine à l’aide des fonctions GetQueuedCompletionStatus ou GetQueuedCompletionStatusEx . Dans ce cas, vous n’avez pas besoin d’affecter l’événement de réinitialisation manuelle dans la structure OVERLAPPED , et l’achèvement se produit sur hNamedPipe de la même façon qu’une opération de lecture ou d’écriture asynchrone. Pour plus d’informations sur les opérations qui se chevauchent, consultez Canaux.

Si hNamedPipe n’a pas été ouvert avec FILE_FLAG_OVERLAPPED, TransactNamedPipe ne retourne pas tant que l’opération n’est pas terminée.

Valeur retournée

Si la fonction réussit, la valeur de retour est différente de zéro.

Si la fonction échoue, la valeur de retour est égale à zéro. Pour obtenir des informations détaillées sur l’erreur, appelez GetLastError.

Si le message à lire est plus long que la mémoire tampon spécifiée par le paramètre nOutBufferSize , TransactNamedPipe retourne FALSE et la fonction GetLastError retourne ERROR_MORE_DATA. Le reste du message peut être lu par un appel ultérieur à ReadFile, ReadFileEx ou PeekNamedPipe.

Remarques

TransactNamedPipe échoue si le serveur n’a pas créé le canal en tant que canal de type message ou si le handle de canal n’est pas en mode lecture de message. Par exemple, si un client s’exécute sur la même machine que le serveur et utilise le format \.\pipename\pipename pour ouvrir le canal, le canal est ouvert en mode octet par le système de fichiers de canal nommé (NPFS). Si le client utilise la forme \\server\pipe\pipename, le redirecteur ouvre le canal en mode message. Un handle de canal en mode octet peut être remplacé par le mode de lecture de message avec la fonction SetNamedPipeHandleState .

La fonction ne peut pas être exécutée correctement tant que les données n’ont pas été écrites dans la mémoire tampon spécifiée par le paramètre lpOutBuffer . Le paramètre lpOverlapped est disponible pour permettre au thread appelant d’effectuer d’autres tâches pendant que l’opération s’exécute en arrière-plan.

La taille maximale garantie d’une transaction de canal nommé est de 64 kilo-octets. Dans certains cas limités, les transactions au-delà de 64 kilo-octets sont possibles, en fonction des versions du système d’exploitation participant à la transaction et des conditions réseau dynamiques. Toutefois, il n’existe aucune garantie que les transactions supérieures à 64 kilo-octets réussissent. Par conséquent, il est recommandé de limiter les transactions de canal nommé à 64 kilo-octets de données.

Windows 10, version 1709 : les canaux ne sont pris en charge que dans un conteneur d’application, c’est-à-dire, d’un processus UWP à un autre processus UWP qui fait partie de la même application. En outre, les canaux nommés doivent utiliser la syntaxe \\.\pipe\LOCAL\ du nom du canal.

Exemples

Pour obtenir un exemple, consultez Transactions sur des canaux nommés.

Configuration requise

Condition requise Valeur
Client minimal pris en charge Windows 2000 Professionnel [applications de bureau | Applications UWP]
Serveur minimal pris en charge Windows 2000 Server [applications de bureau | Applications UWP]
Plateforme cible Windows
En-tête namedpipeapi.h
Bibliothèque Kernel32.lib
DLL Kernel32.dll

Voir aussi

CreateEvent

CreateFile

CreateNamedPipe

GetOverlappedResult

GetQueuedCompletionStatus

OVERLAPPED

PeekNamedPipe

Fonctions de canal

Vue d’ensemble des canaux

ReadFile

ReadFileEx

SetNamedPipeHandleState