Anonyme Pipevorgänge
Die CreatePipe-Funktion erstellt eine anonyme Pipe und gibt zwei Handles zurück: ein Lesehandle für die Pipe und ein Schreibhandle für die Pipe. Das Lesehandle hat schreibgeschützten Zugriff auf die Pipe, und das Schreibhandle hat schreibgeschützten Zugriff auf die Pipe. Um mit der Pipe zu kommunizieren, muss der Pipeserver ein Pipehandle an einen anderen Prozess übergeben. In der Regel erfolgt dies durch Vererbung; Das heißt, der Prozess ermöglicht es, das Handle von einem untergeordneten Prozess zu vererben. Der Prozess kann auch ein Pipehandle-Handle mit der DuplicateHandle-Funktion duplizieren und mithilfe einer Form der Interprozesskommunikation, z. B. DDE oder shared memory, an einen unabhängigen Prozess senden.
Ein Pipeserver kann entweder das Lesehandle oder das Schreibhandle an den Pipeclient senden, je nachdem, ob der Client die anonyme Pipe verwenden soll, um Informationen zu senden oder Informationen zu empfangen. Um aus der Pipe zu lesen, verwenden Sie das Lesehandle der Pipe in einem Aufruf der ReadFile-Funktion . Der ReadFile-Aufruf gibt zurück, wenn ein anderer Prozess in die Pipe geschrieben wurde. Der ReadFile-Aufruf kann auch zurückgegeben werden, wenn alle Schreibhandles an die Pipe geschlossen wurden oder wenn ein Fehler auftritt, bevor der Lesevorgang abgeschlossen wurde.
Um in die Pipe zu schreiben, verwenden Sie das Schreibhandle der Pipe in einem Aufruf der WriteFile-Funktion . Der WriteFile-Aufruf wird erst zurückgegeben, wenn er die angegebene Anzahl von Bytes in die Pipe geschrieben hat oder ein Fehler auftritt. Wenn der Pipepuffer voll ist und mehr Bytes geschrieben werden müssen, wird WriteFile erst zurückgegeben, wenn ein anderer Prozess aus der Pipe gelesen wird, sodass mehr Pufferspeicher verfügbar ist. Der Pipeserver gibt die Puffergröße für die Pipe an, wenn CreatePipe aufgerufen wird.
Asynchrone (überlappende) Lese- und Schreibvorgänge werden von anonymen Pipes nicht unterstützt. Dies bedeutet, dass Sie die Funktionen ReadFileEx und WriteFileEx nicht mit anonymen Pipes verwenden können. Darüber hinaus wird der lpOverlapped-Parameter von ReadFile und WriteFile ignoriert, wenn diese Funktionen mit anonymen Pipes verwendet werden.
Eine anonyme Pipe ist vorhanden, bis alle Pipehandles , sowohl Lese- als auch Schreibvorgänge, geschlossen wurden. Ein Prozess kann seine Pipehandles mithilfe der CloseHandle-Funktion schließen. Alle Pipehandles werden ebenfalls geschlossen, wenn der Prozess beendet wird.
Anonyme Pipes werden mithilfe einer benannten Pipe mit einem eindeutigen Namen implementiert. Daher können Sie ein Handle häufig an eine anonyme Pipe an eine Funktion übergeben, die ein Handle an eine benannte Pipe erfordert.