CreateNamedPipeA-Funktion (winbase.h)

Erstellt eine instance einer Named Pipe und gibt ein Handle für nachfolgende Pipevorgänge zurück. Ein Named Pipe-Serverprozess verwendet diese Funktion, um entweder die erste instance einer bestimmten Named Pipe zu erstellen und dessen Basisattribute festzulegen oder um eine neue instance einer vorhandenen Named Pipe zu erstellen.

Syntax

HANDLE CreateNamedPipeA(
  [in]           LPCSTR                lpName,
  [in]           DWORD                 dwOpenMode,
  [in]           DWORD                 dwPipeMode,
  [in]           DWORD                 nMaxInstances,
  [in]           DWORD                 nOutBufferSize,
  [in]           DWORD                 nInBufferSize,
  [in]           DWORD                 nDefaultTimeOut,
  [in, optional] LPSECURITY_ATTRIBUTES lpSecurityAttributes
);

Parameter

[in] lpName

Der eindeutige Pipename. Diese Zeichenfolge muss die folgende Form aufweisen:

\\.\pipe\pipename

Der Pipename-Teil des Namens kann jedes andere Zeichen als einen umgekehrten Schrägstrich enthalten, einschließlich Zahlen und Sonderzeichen. Die gesamte Pipenamenzeichenfolge kann bis zu 256 Zeichen lang sein. Bei Pipenamen wird die Groß-/Kleinschreibung nicht beachtet.

[in] dwOpenMode

Der geöffnete Modus.

Die Funktion schlägt fehl, wenn dwOpenMode etwas anderes als 0 oder die in den folgenden Tabellen aufgeführten Flags angibt.

Dieser Parameter muss einen der folgenden Pipezugriffsmodi angeben. Für jede instance der Pipe muss derselbe Modus angegeben werden.

Mode Bedeutung
PIPE_ACCESS_DUPLEX
0x00000003
Die Pipe ist bidirektional; Sowohl Server- als auch Clientprozesse können aus der Pipe lesen und in diese schreiben. In diesem Modus erhält der Server das Äquivalent zu GENERIC_READ und GENERIC_WRITE Zugriff auf die Pipe. Der Client kann GENERIC_READ oder GENERIC_WRITE oder beides angeben, wenn er mithilfe der CreateFile-Funktion eine Verbindung mit der Pipe herstellt.
PIPE_ACCESS_INBOUND
0x00000001
Der Datenfluss in der Pipe geht nur vom Client zum Server. Dieser Modus gibt dem Server das Äquivalent zu GENERIC_READ Zugriff auf die Pipe. Der Client muss beim Herstellen einer Verbindung mit der Pipe GENERIC_WRITE Zugriff angeben. Wenn der Client Pipeeinstellungen lesen muss, indem er die Funktionen GetNamedPipeInfo oder GetNamedPipeHandleState aufruft , muss der Client beim Herstellen einer Verbindung mit der Pipe GENERIC_WRITE und FILE_READ_ATTRIBUTES Zugriff angeben.
PIPE_ACCESS_OUTBOUND
0x00000002
Der Datenfluss in der Pipe geht nur vom Server zum Client. Dieser Modus gibt dem Server das Äquivalent GENERIC_WRITE Zugriff auf die Pipe. Der Client muss beim Herstellen einer Verbindung mit der Pipe GENERIC_READ Zugriff angeben. Wenn der Client pipe-Einstellungen durch Aufrufen der Funktion SetNamedPipeHandleState ändern muss, muss der Client beim Herstellen einer Verbindung mit der Pipe GENERIC_READ und FILE_WRITE_ATTRIBUTES Zugriff angeben.
 

Dieser Parameter kann auch ein oder mehrere der folgenden Flags enthalten, die den Durchschreibmodus und den Überlappungsmodus ermöglichen. Diese Modi können für verschiedene Instanzen derselben Pipe unterschiedlich sein.

Mode Bedeutung
FILE_FLAG_FIRST_PIPE_INSTANCE
0x00080000
Wenn Sie versuchen, mehrere Instanzen einer Pipe mit diesem Flag zu erstellen, ist die Erstellung des ersten instance erfolgreich, aber die Erstellung der nächsten instance schlägt mit ERROR_ACCESS_DENIED fehl.
FILE_FLAG_WRITE_THROUGH
0x80000000
Der Durchschreibmodus ist aktiviert. Dieser Modus wirkt sich nur auf Schreibvorgänge für Bytetyppipes und dann nur aus, wenn sich die Client- und Serverprozesse auf unterschiedlichen Computern befinden. Wenn dieser Modus aktiviert ist, werden Funktionen, die in eine Named Pipe schreiben, erst zurückgegeben, wenn die geschriebenen Daten über das Netzwerk übertragen werden und sich auf dem Remotecomputer im Puffer der Pipe befinden. Wenn dieser Modus nicht aktiviert ist, erhöht das System die Effizienz von Netzwerkvorgängen, indem Daten gepuffert werden, bis sich eine minimale Anzahl von Bytes ansammelt oder eine maximale Zeit verstrichen ist.
FILE_FLAG_OVERLAPPED
0x40000000
Der Überlappungsmodus ist aktiviert. Wenn dieser Modus aktiviert ist, können Funktionen, die Lese-, Schreib- und Verbindungsvorgänge ausführen, die einen längeren Zeitraum in Anspruch nehmen können, sofort zurückgegeben werden. In diesem Modus kann der Thread, der den Vorgang gestartet hat, andere Vorgänge ausführen, während der zeitaufwändige Vorgang im Hintergrund ausgeführt wird. Im überlappenden Modus kann ein Thread beispielsweise gleichzeitige Eingabe- und Ausgabevorgänge (E/A) auf mehreren Instanzen einer Pipe verarbeiten oder gleichzeitig Lese- und Schreibvorgänge für dasselbe Pipehandle ausführen. Wenn der Überlappungsmodus nicht aktiviert ist, werden Funktionen, die Lese-, Schreib- und Verbindungsvorgänge für das Pipehandle ausführen, erst zurückgegeben, wenn der Vorgang abgeschlossen ist. Die Funktionen ReadFileEx und WriteFileEx können nur mit einem Pipehandle im überlappenden Modus verwendet werden. Die Funktionen ReadFile, WriteFile, ConnectNamedPipe und TransactNamedPipe können entweder synchron oder als überlappende Vorgänge ausgeführt werden.
 

Dieser Parameter kann eine beliebige Kombination der folgenden Sicherheitszugriffsmodi enthalten. Diese Modi können für verschiedene Instanzen derselben Pipe unterschiedlich sein.

Mode Bedeutung
WRITE_DAC
0x00040000L
Der Aufrufer hat Schreibzugriff auf die freie Zugriffssteuerungsliste (ACL) der Named Pipe.
WRITE_OWNER
0x00080000L
Der Aufrufer hat Schreibzugriff auf den Besitzer der Named Pipe.
ACCESS_SYSTEM_SECURITY
0x01000000L
Der Aufrufer hat Schreibzugriff auf die SACL der benannten Pipe. Weitere Informationen finden Sie unter Zugriffssteuerungs-Listen (ACLs) und SACL-Zugriffsberechtigung.

[in] dwPipeMode

Der Pipemodus.

Die Funktion schlägt fehl, wenn dwPipeMode etwas anderes als 0 oder die in den folgenden Tabellen aufgeführten Flags angibt.

Einer der folgenden Typmodi kann angegeben werden. Für jede instance der Pipe muss derselbe Typmodus angegeben werden.

Mode Bedeutung
PIPE_TYPE_BYTE
0x00000000
Daten werden als Bytestrom in die Pipe geschrieben. Dieser Modus kann nicht mit PIPE_READMODE_MESSAGE verwendet werden. Die Pipe unterscheidet keine Bytes, die während verschiedener Schreibvorgänge geschrieben wurden.
PIPE_TYPE_MESSAGE
0x00000004
Daten werden als Nachrichtenstrom in die Pipe geschrieben. Die Pipe behandelt die bei jedem Schreibvorgang geschriebenen Bytes als Nachrichteneinheit. Die GetLastError-Funktion gibt ERROR_MORE_DATA zurück, wenn eine Nachricht nicht vollständig gelesen wird. Dieser Modus kann mit PIPE_READMODE_MESSAGE oder PIPE_READMODE_BYTE verwendet werden.
 

Einer der folgenden Lesemodi kann angegeben werden. Verschiedene Instanzen derselben Pipe können unterschiedliche Lesemodi angeben.

Mode Bedeutung
PIPE_READMODE_BYTE
0x00000000
Daten werden aus der Pipe als Bytestrom gelesen. Dieser Modus kann mit PIPE_TYPE_MESSAGE oder PIPE_TYPE_BYTE verwendet werden.
PIPE_READMODE_MESSAGE
0x00000002
Daten werden aus der Pipe als Nachrichtenstrom gelesen. Dieser Modus kann nur verwendet werden, wenn auch PIPE_TYPE_MESSAGE angegeben ist.
 

Einer der folgenden Wartemodi kann angegeben werden. Verschiedene Instanzen derselben Pipe können unterschiedliche Wartemodi angeben.

Mode Bedeutung
PIPE_WAIT
0x00000000
Der Blockierungsmodus ist aktiviert. Wenn das Pipehandle in der ReadFile-, WriteFile- oder ConnectNamedPipe-Funktion angegeben ist, werden die Vorgänge erst abgeschlossen, wenn Daten gelesen, alle Daten geschrieben oder ein Client verbunden ist. Die Verwendung dieses Modus kann bedeuten, dass in einigen Situationen unbegrenzt darauf gewartet wird, dass ein Clientprozess eine Aktion ausführt.
PIPE_NOWAIT
0x00000001
Der Nichtblockierungsmodus ist aktiviert. In diesem Modus werden ReadFile, WriteFile und ConnectNamedPipe immer sofort zurückgegeben.

Beachten Sie, dass der Nichtblockierungsmodus aus Gründen der Kompatibilität mit Microsoft LAN Manager Version 2.0 unterstützt wird und nicht verwendet werden sollte, um asynchrone E/A mit Named Pipes zu erreichen. Weitere Informationen zur asynchronen Pipe-E/A finden Sie unter Synchrone und überlappende Eingabe und Ausgabe.

 

Einer der folgenden Remoteclientmodi kann angegeben werden. Verschiedene Instanzen derselben Pipe können unterschiedliche Remoteclientmodi angeben.

Mode Bedeutung
PIPE_ACCEPT_REMOTE_CLIENTS
0x00000000
Connections von Remoteclients können akzeptiert und mit dem Sicherheitsdeskriptor für die Pipe überprüft werden.
PIPE_REJECT_REMOTE_CLIENTS
0x00000008
Connections von Remoteclients werden automatisch abgelehnt.

[in] nMaxInstances

Die maximale Anzahl von Instanzen, die für diese Pipe erstellt werden können. Der erste instance der Pipe kann diesen Wert angeben. Die gleiche Anzahl muss für andere Instanzen der Pipe angegeben werden. Zulässige Werte liegen im Bereich von 1 bis PIPE_UNLIMITED_INSTANCES (255).

Wenn dieser Parameter PIPE_UNLIMITED_INSTANCES ist, wird die Anzahl der Pipeinstanzen, die erstellt werden können, nur durch die Verfügbarkeit von Systemressourcen begrenzt. Wenn nMaxInstances größer als PIPE_UNLIMITED_INSTANCES ist, wird der Rückgabewert INVALID_HANDLE_VALUE und GetLastErrorgibt ERROR_INVALID_PARAMETER zurück.

[in] nOutBufferSize

Die Anzahl der Bytes, die für den Ausgabepuffer reserviert werden sollen. Eine Erläuterung zur Größenanpassung von Named Pipe-Puffern finden Sie im folgenden Abschnitt hinweise.

[in] nInBufferSize

Die Anzahl der Bytes, die für den Eingabepuffer reserviert werden sollen. Eine Erläuterung zur Größenanpassung von Named Pipe-Puffern finden Sie im folgenden Abschnitt hinweise.

[in] nDefaultTimeOut

Der Standardtimeoutwert in Millisekunden, wenn die WaitNamedPipe-FunktionNMPWAIT_USE_DEFAULT_WAIT angibt. Jede instance einer Named Pipe muss den gleichen Wert angeben.

Der Wert 0 (null) führt zu einem Standardtimeout von 50 Millisekunden.

[in, optional] lpSecurityAttributes

Ein Zeiger auf eine SECURITY_ATTRIBUTES-Struktur , die einen Sicherheitsdeskriptor für die neue Named Pipe angibt und bestimmt, ob untergeordnete Prozesse das zurückgegebene Handle erben können. Wenn lpSecurityAttributesNULL ist, ruft die Named Pipe einen Standardsicherheitsdeskriptor ab, und das Handle kann nicht geerbt werden. Die ACLs im Standardsicherheitsdeskriptor für eine Named Pipe gewähren dem LocalSystem-Konto, den Administratoren und dem Erstellerbesitzer vollste Kontrolle. Außerdem gewähren sie Mitgliedern der Gruppe "Jeder" und dem anonymen Konto Lesezugriff.

Rückgabewert

Wenn die Funktion erfolgreich ist, ist der Rückgabewert ein Handle an das Serverende einer Named Pipe instance.

Wenn die Funktion fehlschlägt, ist der Rückgabewert INVALID_HANDLE_VALUE. Um erweiterte Fehlerinformationen zu erhalten, rufen Sie GetLastError auf.

Hinweise

Um eine instance einer Named Pipe mithilfe von CreateNamedPipe zu erstellen, muss der Benutzer über FILE_CREATE_PIPE_INSTANCE Zugriff auf das Named Pipe-Objekt verfügen. Wenn eine neue Named Pipe erstellt wird, definiert die Zugriffssteuerungsliste (Access Control List, ACL) aus dem Parameter "Sicherheitsattribute" die freie Zugriffssteuerung für die Benannte Pipe.

Alle Instanzen einer Named Pipe müssen denselben Pipetyp (Bytetyp oder Nachrichtentyp), Pipezugriff (Duplex, eingehende oder ausgehende) instance Anzahl und Timeoutwert angeben. Wenn unterschiedliche Werte verwendet werden, schlägt diese Funktion fehl, und GetLastError gibt ERROR_ACCESS_DENIED zurück.

Ein Clientprozess stellt mithilfe der Funktion CreateFile oder CallNamedPipe eine Verbindung mit einer Named Pipe her. Die Clientseite einer Named Pipe beginnt im Bytemodus, auch wenn sich die Serverseite im Nachrichtenmodus befindet. Um Probleme beim Empfangen von Daten zu vermeiden, legen Sie auch den Client auf den Nachrichtenmodus fest. Um den Modus der Pipe zu ändern, muss der Pipeclient eine schreibgeschützte Pipe mit GENERIC_READ und FILE_WRITE_ATTRIBUTES Zugriff öffnen.

Der Pipeserver sollte erst dann einen blockierenden Lesevorgang ausführen, wenn der Pipeclient gestartet wurde. Andernfalls kann eine Racebedingung auftreten. Dies tritt in der Regel auf, wenn Initialisierungscode, z. B. die C-Laufzeit, geerbte Handles sperren und untersuchen muss.

Jedes Mal, wenn eine Named Pipe erstellt wird, erstellt das System die eingehenden und/oder ausgehenden Puffer mithilfe eines nicht auslagerten Pools, d. h. des physischen Speichers, der vom Kernel verwendet wird. Die Anzahl der Pipeinstanzen (sowie Objekte wie Threads und Prozesse), die Sie erstellen können, wird durch den verfügbaren Pool ohne Auslager beschränkt. Jede Lese- oder Schreibanforderung erfordert Speicherplatz im Puffer für die Lese- oder Schreibdaten sowie zusätzlichen Speicherplatz für die internen Datenstrukturen.

Die Größe des Eingabe- und Ausgabepuffers ist eine Empfehlung. Die tatsächliche Puffergröße, die für jedes Ende der Named Pipe reserviert ist, ist entweder der Systemstandard, das Mindest- oder Maximum des Systems oder die angegebene Größe, die auf die nächste Zuordnungsgrenze aufgerundet ist. Die angegebene Puffergröße sollte klein genug sein, damit Ihr Prozess nicht aus dem nicht auslagerten Pool auskommt, sondern groß genug ist, um typische Anforderungen zu erfüllen.

Wenn ein Pipeschreibvorgang auftritt, versucht das System zuerst, den Arbeitsspeicher mit dem Pipeschreibkontingent aufzuladen. Wenn das verbleibende Pipeschreibkontingent ausreicht, um die Anforderung zu erfüllen, wird der Schreibvorgang sofort abgeschlossen. Wenn das verbleibende Pipeschreibkontingent zu klein ist, um die Anforderung zu erfüllen, versucht das System, die Puffer zu erweitern, um die Daten mithilfe eines für den Prozess reservierten, nicht auslagerten Pools aufzunehmen. Der Schreibvorgang wird blockiert, bis die Daten aus der Pipe gelesen werden, sodass das zusätzliche Pufferkontingent freigegeben werden kann. Wenn die angegebene Puffergröße zu klein ist, vergrößert das System den Puffer nach Bedarf, aber der Nachteil ist, dass der Vorgang blockiert wird. Wenn der Vorgang überlappend ist, wird ein Systemthread blockiert. Andernfalls wird der Anwendungsthread blockiert.

Um ressourcen freizugeben, die von einer Named Pipe verwendet werden, sollte die Anwendung Handles immer schließen, wenn sie nicht mehr benötigt werden. Dies erfolgt entweder durch Aufrufen der CloseHandle-Funktion oder wenn der Prozess beendet wird, der der instance Handles zugeordnet ist. Beachten Sie, dass einer instance einer Named Pipe möglicherweise mehr als ein Handle zugeordnet ist. Ein instance einer Named Pipe wird immer gelöscht, wenn das letzte Handle zum instance der Named Pipe geschlossen wird.

Windows 10 Version 1709: Pipes werden nur innerhalb eines App-Containers unterstützt, d. h. von einem UWP-Prozess zu einem anderen UWP-Prozess, der Teil derselben App ist. Außerdem müssen Named Pipes die Syntax \\.\pipe\LOCAL\ für den Pipenamen verwenden.

Beispiele

Ein Beispiel finden Sie unter Multithreaded Pipe Server.

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Windows 2000 Professional [Desktop-Apps | UWP-Apps]
Unterstützte Mindestversion (Server) Windows 2000 Server [Desktop-Apps | UWP-Apps]
Zielplattform Windows
Kopfzeile winbase.h (Windows.h einschließen)
Bibliothek Kernel32.lib
DLL Kernel32.dll

Siehe auch

ConnectNamedPipe

CreateFile

Pipefunktionen

Übersicht über Pipes

ReadFile

ReadFileEx

SECURITY_ATTRIBUTES

TransactNamedPipe

WaitNamedPipe

WriteFile

WriteFileEx