CreateIoCompletionPort-Funktion (ioapiset.h)

Erstellt einen E/A-Abschlussport und ordnet ihn einem angegebenen Dateihandle zu, oder erstellt einen E/A-Abschlussport, der noch keinem Dateihandle zugeordnet ist und eine spätere Zuordnung gestattet.

Das Zuordnen einer Instanz eines geöffneten Dateihandles zu einem E/A-Abschlussport ermöglicht einem Prozess, eine Benachrichtigung über den Abschluss asynchroner E/A-Vorgänge zu erhalten, die dieses Dateihandle betreffen.

Hinweis  

Der hier verwendete Begriff Dateihandle bezieht sich auf eine Systemabstraktion, die einen überlappenden E/A-Endpunkt darstellt, nicht nur eine Datei auf einem Datenträger. Alle Systemobjekte, die überlappende E/A unterstützen , z. B. Netzwerkendpunkte, TCP-Sockets, Named Pipes und E-Mail-Slots, können als Dateihandles verwendet werden. Weitere Informationen finden Sie im Abschnitt „Bemerkungen“.

 

Syntax

HANDLE CreateIoCompletionPort(
  [in]           HANDLE    FileHandle,
  [in, optional] HANDLE    ExistingCompletionPort,
  [in]           ULONG_PTR CompletionKey,
  [in]           DWORD     NumberOfConcurrentThreads
);

Parameter

[in] FileHandle

Ein geöffnetes Dateihandle oder INVALID_HANDLE_VALUE.

Das Handle muss auf ein Objekt verweisen, das überlappende E/A unterstützt.

Wenn ein Handle bereitgestellt wird, muss es für den überlappenden E/A-Abschluss geöffnet worden sein. Beispielsweise müssen Sie das FILE_FLAG_OVERLAPPED-Flag angeben, wenn Sie die CreateFile-Funktion verwenden, um das Handle abzurufen.

Wenn INVALID_HANDLE_VALUE angegeben ist, erstellt die Funktion einen E/A-Abschlussport, ohne ihn einem Dateihandle zuzuordnen. In diesem Fall muss der ExistingCompletionPort-Parameter NULL sein, und der CompletionKey-Parameter wird ignoriert.

[in, optional] ExistingCompletionPort

Ein Handle für einen vorhandenen E/A-Abschlussport oder NULL.

Wenn dieser Parameter einen vorhandenen E/A-Abschlussport angibt, ordnet die Funktion ihn dem durch den FileHandle-Parameter angegebenen Handle zu. Die Funktion gibt bei erfolgreicher Ausführung das Handle des vorhandenen E/A-Abschlussports zurück. Es wird kein neuer E/A-Abschlussport erstellt.

Wenn dieser Parameter NULL ist, erstellt die Funktion einen neuen E/A-Abschlussport und ordnet ihn, wenn der FileHandle-Parameter gültig ist, dem neuen E/A-Abschlussport zu. Andernfalls erfolgt keine Zuordnung des Dateihandles. Die Funktion gibt bei erfolgreicher Ausführung das Handle an den neuen E/A-Abschlussport zurück.

[in] CompletionKey

Der pro Handle benutzerdefinierte Abschlussschlüssel, der in jedem E/A-Abschlusspaket für das angegebene Dateihandle enthalten ist. Weitere Informationen finden Sie im Abschnitt mit Hinweisen.

[in] NumberOfConcurrentThreads

Die maximale Anzahl von Threads, die das Betriebssystem zum gleichzeitigen Verarbeiten von E/A-Abschlusspaketen für den E/A-Abschlussport zulassen kann. Dieser Parameter wird ignoriert, wenn der ExistingCompletionPort-Parameter nicht NULL ist.

Wenn dieser Parameter null (0) ist, lässt das System so viele gleichzeitig ausgeführte Threads zu, wie Prozessoren im System vorhanden sind.

Rückgabewert

Wenn die Funktion erfolgreich ist, ist der Rückgabewert das Handle für einen E/A-Abschlussport:

  • Wenn der ExistingCompletionPort-Parameter NULL war, ist der Rückgabewert ein neues Handle.
  • Wenn der ExistingCompletionPort-Parameter ein gültiges E/A-Abschlussporthandle war, entspricht der Rückgabewert demselben Handle.
  • Wenn der FileHandle-Parameter ein gültiges Handle war, ist dieses Dateihandle nun dem zurückgegebenen E/A-Abschlussport zugeordnet.
Wenn bei der Funktion ein Fehler auftritt, ist der Rückgabewert NULL. Um erweiterte Fehlerinformationen zu erhalten, rufen Sie die GetLastError-Funktion auf.

Bemerkungen

Das E/A-System kann angewiesen werden, E/A-Abschlussportbenachrichtigungspakete an E/A-Abschlussports zu senden, wo sie sich in der Warteschlange befinden. Die CreateIoCompletionPort-Funktion stellt diese Funktionalität bereit.

Ein E/A-Abschlussport und sein Handle sind dem Prozess zugeordnet, der ihn erstellt hat, und können nicht von Prozessen gemeinsam genutzt werden. Ein einzelnes Handle kann jedoch von Threads im selben Prozess gemeinsam genutzt werden.

CreateIoCompletionPort kann in drei verschiedenen Modi verwendet werden:

  • Ausschließliches Erstellen eines E/A-Abschlussports, ohne ihn einem Dateihandle zuzuordnen.
  • Zuordnen eines vorhandenen E/A-Abschlussports zu einem Dateihandle.
  • Durchführen sowohl der Erstellung als auch der Zuordnung in einem einzigen Aufruf.
Um einen E/A-Abschlussport zu erstellen, ohne ihn zuzuordnen, legen Sie den FileHandle-Parameter auf INVALID_HANDLE_VALUE, den ExistingCompletionPort-Parameter auf NULL und den CompletionKey-Parameter auf null (0; wird in diesem Fall ignoriert) fest. Legen Sie den NumberOfConcurrentThreads-Parameter auf den gewünschten Parallelitätswert für den neuen E/A-Abschlussport oder null (0) für den Standardwert (Anzahl der Prozessoren im System) fest.

Das im FileHandle-Parameter übergebene Handle kann ein beliebiges Handle sein, das überlappende E/A unterstützt. In der Regel handelt es sich um ein Handle, das von der CreateFile-Funktion mit dem FILE_FLAG_OVERLAPPED-Flag geöffnet wird (z. B. für Dateien, E-Mail-Slots und Pipes). Objekte, die von anderen Funktionen wie socket erstellt werden, können auch einem E/A-Abschlussport zugeordnet werden. Ein Beispiel für die Verwendung von Sockets finden Sie unter AcceptEx. Ein Handle kann nur einem E/A-Abschlussport zugeordnet werden, und nachdem die Zuordnung vorgenommen wurde, bleibt das Handle diesem E/A-Abschlussport zugeordnet, bis es geschlossen wird.

Weitere Informationen zur E/A-Abschlussporttheorie, zur Verwendung und zu den zugehörigen Funktionen finden Sie unter E/A-Abschlussports.

Mehrere Dateihandles können einem einzelnen E/A-Abschlussport zugeordnet werden, indem CreateIoCompletionPort mehrmals mit demselben E/A-Abschlussporthandle im ExistingCompletionPort-Parameter und jedes Mal ein anderes Dateihandle im FileHandle-Parameter aufgerufen wird.

Verwenden Sie den CompletionKey-Parameter, um Ihre Anwendung dabei zu unterstützen, nachzuverfolgen, welche E/A-Vorgänge abgeschlossen wurden. Dieser Wert wird von CreateIoCompletionPort nicht für die Funktionssteuerung verwendet. Stattdessen wird er dem Dateihandle angefügt, das im FileHandle-Parameter zum Zeitpunkt der Zuordnung zu einem E/A-Abschlussport angegeben ist. Dieser Abschlussschlüssel sollte für jedes Dateihandle eindeutig sein und begleitet das Dateihandle während des internen Abschlusswarteschlangenprozesses. Er wird im GetQueuedCompletionStatus-Funktionsaufruf zurückgegeben, wenn ein Abschlusspaket eingeht. Der CompletionKey-Parameter wird auch von der PostQueuedCompletionStatus-Funktion verwendet, um Ihre eigenen speziellen Abschlusspakete in die Warteschlange zu stellen.

Nachdem eine Instanz eines geöffneten Handles einem E/A-Abschlussport zugeordnet wurde, kann sie nicht in der ReadFileEx- oder WriteFileEx-Funktion verwendet werden, da diese Funktionen über eigene asynchrone E/A-Mechanismen verfügen.

Ein Dateihandle, das einem E/A-Abschlussport zugeordnet ist, sollte nicht mittels Handlevererbung oder einen Aufruf der DuplicateHandle-Funktion gemeinsam verwendet werden. Vorgänge, die mit solchen doppelten Handles ausgeführt werden, generieren Abschlussbenachrichtigungen. Eine sorgfältige Abwägung ist ratsam.

Das Handle des E/A-Abschlussports und jedes diesem bestimmten E/A-Abschlussport zugeordnete Dateihandle werden als Verweise auf den E/A-Abschlussport bezeichnet. Der E/A-Abschlussport wird freigegeben, wenn keine Verweise darauf mehr vorhanden sind. Daher müssen alle diese Handles ordnungsgemäß geschlossen werden, um den E/A-Abschlussport und die zugehörigen Systemressourcen freizugeben. Sobald diese Bedingungen erfüllt sind, schließen Sie das Handle des E/A-Abschlussports durch Aufruf der CloseHandle-Funktion.

Unter Windows 8 und Windows Server 2012 wird diese Funktion von den folgenden Technologien unterstützt.

Technologie Unterstützt
SMB 3.0-Protokoll (Server Message Block) Ja
SMB 3.0 Transparent Failover (TFO) Ja
SMB 3.0 mit Dateifreigaben mit horizontaler Skalierung (SO) Ja
Dateisystem mit freigegebenen Clustervolumes (CsvFS) Ja
Robustes Dateisystem (Resilient File System, ReFS) Ja

Anforderungen

   
Unterstützte Mindestversion (Client) Windows XP [Desktop-Apps | UWP-Apps]
Unterstützte Mindestversion (Server) Windows Server 2003 [Desktop-Apps | UWP-Apps]
Zielplattform Windows
Kopfzeile ioapiset.h (Einschließen von Windows.h)
Bibliothek Kernel32.lib
DLL Kernel32.dll

Siehe auch

AcceptEx

CreateFile

DuplicateHandle

Dateiverwaltungsfunktionen

Funktionen

GetQueuedCompletionStatus

GetQueuedCompletionStatusEx

E/A-Abschlussports

Übersichtsthemen

PostQueuedCompletionStatus

ReadFileEx

Verwenden der Windows-Header

Windows Sockets 2

WriteFileEx