Win32 API 日本語リファレンス
ホームSystem.IO › CreateIoCompletionPort

CreateIoCompletionPort

関数
I/O完了ポートを作成しファイルハンドルを関連付ける。
DLLKERNEL32.dll呼出規約winapiSetLastErrorあり対応OSWindows XP 以降

シグネチャ

// KERNEL32.dll
#include <windows.h>

HANDLE CreateIoCompletionPort(
    HANDLE FileHandle,
    HANDLE ExistingCompletionPort,   // optional
    UINT_PTR CompletionKey,
    DWORD NumberOfConcurrentThreads
);

パラメーター

名前方向説明
FileHandleHANDLEin

オープン済みのファイルハンドル、または INVALID_HANDLE_VALUE です。

このハンドルは、オーバーラップ I/O をサポートするオブジェクトに対するものでなければなりません。

ハンドルを指定する場合、そのハンドルはオーバーラップ I/O 完了のためにオープンされている必要があります。たとえば、ハンドルを取得するために CreateFile 関数を使用する際には、FILE_FLAG_OVERLAPPED フラグを指定する必要があります。

INVALID_HANDLE_VALUE を指定した場合、この関数はファイルハンドルに関連付けずに I/O 完了ポートを作成します。この場合、ExistingCompletionPort パラメーターは NULL でなければならず、CompletionKey パラメーターは無視されます。

ExistingCompletionPortHANDLEinoptional

既存の I/O 完了ポートへのハンドル、または NULL です。

このパラメーターに既存の I/O 完了ポートを指定した場合、この関数はそのポートを FileHandle パラメーターで指定されたハンドルに関連付けます。成功した場合は既存の I/O 完了ポートのハンドルを返し、新しい I/O 完了ポートは作成しません。

このパラメーターが NULL の場合、この関数は新しい I/O 完了ポートを作成し、FileHandle パラメーターが有効であればそれを新しい I/O 完了ポートに関連付けます。それ以外の場合、ファイルハンドルの関連付けは行われません。成功した場合は新しい I/O 完了ポートへのハンドルを返します。

CompletionKeyUINT_PTRin指定したファイルハンドルに対するすべての I/O 完了パケットに含まれる、ハンドルごとのユーザー定義の完了キーです。詳細については「解説」セクションを参照してください。
NumberOfConcurrentThreadsDWORDin

オペレーティングシステムが、この I/O 完了ポートの I/O 完了パケットを並行して処理することを許可するスレッドの最大数です。ExistingCompletionPort パラメーターが NULL でない場合、このパラメーターは無視されます。

このパラメーターが 0 の場合、システムはシステム内のプロセッサ数と同じ数のスレッドが並行して実行されることを許可します。

戻り値の型: HANDLE

公式ドキュメント

入出力 (I/O) 完了ポートを作成し、指定したファイルハンドルに関連付けます。または、ファイルハンドルにまだ関連付けられていない I/O 完了ポートを作成し、後から関連付けできるようにします。

戻り値

関数が成功した場合、戻り値は I/O 完了ポートへのハンドルです。

関数が失敗した場合、戻り値は NULL です。拡張エラー情報を取得するには、 GetLastError 関数を呼び出します。

解説(Remarks)

I/O システムに対して、I/O 完了通知パケットを I/O 完了ポートへ送信し、そこでキューに格納するよう指示できます。 CreateIoCompletionPort 関数は、この機能を提供します。

I/O 完了ポートとそのハンドルは、それを作成したプロセスに関連付けられており、プロセス間で共有することはできません。ただし、単一のハンドルは同一プロセス内のスレッド間で共有できます。

CreateIoCompletionPort は、次の 3 つの異なるモードで使用できます。

関連付けずに I/O 完了ポートを作成するには、FileHandle パラメーターを INVALID_HANDLE_VALUE に、ExistingCompletionPort パラメーターを NULL に、CompletionKey パラメーターを 0 (この場合は無視されます) に設定します。NumberOfConcurrentThreads パラメーターには、新しい I/O 完了ポートに対して希望する並行処理数を設定するか、既定値 (システム内のプロセッサ数) を使用する場合は 0 を設定します。

FileHandle パラメーターに渡すハンドルは、オーバーラップ I/O をサポートする任意のハンドルです。最も一般的には、CreateFile 関数で FILE_FLAG_OVERLAPPED フラグを使用してオープンされたハンドル (たとえば、ファイル、メールスロット、パイプ) です。socket など、他の関数によって作成されたオブジェクトも I/O 完了ポートに関連付けることができます。ソケットを使用した例については、AcceptEx を参照してください。1 つのハンドルは 1 つの I/O 完了ポートにのみ関連付けることができ、関連付けが行われると、そのハンドルはクローズされるまでその I/O 完了ポートに関連付けられたままになります。

I/O 完了ポートの理論、使用方法、関連する関数の詳細については、I/O Completion Ports を参照してください。

複数のファイルハンドルを 1 つの I/O 完了ポートに関連付けるには、ExistingCompletionPort パラメーターに同じ I/O 完了ポートハンドルを、FileHandle パラメーターにそのつど異なるファイルハンドルを指定して、CreateIoCompletionPort を複数回呼び出します。

CompletionKey パラメーターは、アプリケーションがどの I/O 操作が完了したかを追跡できるようにするために使用します。この値は CreateIoCompletionPort によって機能制御に使用されるものではなく、I/O 完了ポートへの関連付け時に FileHandle パラメーターで指定されたファイルハンドルに付加されます。この完了キーは各ファイルハンドルに対して一意であることが望ましく、内部の完了キューイング処理を通じてファイルハンドルとともに引き継がれます。完了パケットが到着すると、GetQueuedCompletionStatus 関数の呼び出しで返されます。CompletionKey パラメーターは、独自の特別な目的の完了パケットをキューに格納するために、PostQueuedCompletionStatus 関数でも使用されます。

オープン済みハンドルのインスタンスが I/O 完了ポートに関連付けられた後は、そのハンドルを ReadFileEx 関数や WriteFileEx 関数で使用することはできません。これらの関数は独自の非同期 I/O メカニズムを持っているためです。

I/O 完了ポートに関連付けられたファイルハンドルを、ハンドルの継承や DuplicateHandle 関数の呼び出しによって共有しないことが推奨されます。そのような複製ハンドルを使用して実行された操作は完了通知を生成します。慎重に検討することをお勧めします。

I/O 完了ポートハンドルと、その特定の I/O 完了ポートに関連付けられたすべてのファイルハンドルは、I/O 完了ポートへの参照と呼ばれます。I/O 完了ポートは、それへの参照がなくなったときに解放されます。したがって、I/O 完了ポートとそれに関連付けられたシステムリソースを解放するには、これらのハンドルをすべて適切にクローズする必要があります。これらの条件が満たされた後、CloseHandle 関数を呼び出して I/O 完了ポートハンドルをクローズします。

Windows 8 および Windows Server 2012 では、この関数は次のテクノロジによってサポートされています。

テクノロジ サポート
Server Message Block (SMB) 3.0 プロトコル はい
SMB 3.0 透過的フェールオーバー (TFO) はい
スケールアウトファイル共有 (SO) を使用した SMB 3.0 はい
クラスターの共有ボリュームファイルシステム (CsvFS) はい
回復性ファイルシステム (ReFS) はい
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での呼び出し定義

// KERNEL32.dll
#include <windows.h>

HANDLE CreateIoCompletionPort(
    HANDLE FileHandle,
    HANDLE ExistingCompletionPort,   // optional
    UINT_PTR CompletionKey,
    DWORD NumberOfConcurrentThreads
);
[DllImport("KERNEL32.dll", SetLastError = true, ExactSpelling = true)]
static extern IntPtr CreateIoCompletionPort(
    IntPtr FileHandle,   // HANDLE
    IntPtr ExistingCompletionPort,   // HANDLE optional
    UIntPtr CompletionKey,   // UINT_PTR
    uint NumberOfConcurrentThreads   // DWORD
);
<DllImport("KERNEL32.dll", SetLastError:=True, ExactSpelling:=True)>
Public Shared Function CreateIoCompletionPort(
    FileHandle As IntPtr,   ' HANDLE
    ExistingCompletionPort As IntPtr,   ' HANDLE optional
    CompletionKey As UIntPtr,   ' UINT_PTR
    NumberOfConcurrentThreads As UInteger   ' DWORD
) As IntPtr
End Function
' FileHandle : HANDLE
' ExistingCompletionPort : HANDLE optional
' CompletionKey : UINT_PTR
' NumberOfConcurrentThreads : DWORD
Declare PtrSafe Function CreateIoCompletionPort Lib "kernel32" ( _
    ByVal FileHandle As LongPtr, _
    ByVal ExistingCompletionPort As LongPtr, _
    ByVal CompletionKey As LongPtr, _
    ByVal NumberOfConcurrentThreads As Long) As LongPtr
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

CreateIoCompletionPort = ctypes.windll.kernel32.CreateIoCompletionPort
CreateIoCompletionPort.restype = ctypes.c_void_p
CreateIoCompletionPort.argtypes = [
    wintypes.HANDLE,  # FileHandle : HANDLE
    wintypes.HANDLE,  # ExistingCompletionPort : HANDLE optional
    ctypes.c_size_t,  # CompletionKey : UINT_PTR
    wintypes.DWORD,  # NumberOfConcurrentThreads : DWORD
]
# GetLastError: use ctypes.GetLastError() (or ctypes.WinDLL(use_last_error=True))
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('KERNEL32.dll')
CreateIoCompletionPort = Fiddle::Function.new(
  lib['CreateIoCompletionPort'],
  [
    Fiddle::TYPE_VOIDP,  # FileHandle : HANDLE
    Fiddle::TYPE_VOIDP,  # ExistingCompletionPort : HANDLE optional
    Fiddle::TYPE_UINTPTR_T,  # CompletionKey : UINT_PTR
    -Fiddle::TYPE_INT,  # NumberOfConcurrentThreads : DWORD
  ],
  Fiddle::TYPE_VOIDP)
#[link(name = "kernel32")]
extern "system" {
    fn CreateIoCompletionPort(
        FileHandle: *mut core::ffi::c_void,  // HANDLE
        ExistingCompletionPort: *mut core::ffi::c_void,  // HANDLE optional
        CompletionKey: usize,  // UINT_PTR
        NumberOfConcurrentThreads: u32  // DWORD
    ) -> *mut core::ffi::c_void;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("KERNEL32.dll", SetLastError = true)]
public static extern IntPtr CreateIoCompletionPort(IntPtr FileHandle, IntPtr ExistingCompletionPort, UIntPtr CompletionKey, uint NumberOfConcurrentThreads);
"@
$api = Add-Type -MemberDefinition $sig -Name 'KERNEL32_CreateIoCompletionPort' -Namespace Win32 -PassThru
# $api::CreateIoCompletionPort(FileHandle, ExistingCompletionPort, CompletionKey, NumberOfConcurrentThreads)
#uselib "KERNEL32.dll"
#func global CreateIoCompletionPort "CreateIoCompletionPort" sptr, sptr, sptr, sptr
; CreateIoCompletionPort FileHandle, ExistingCompletionPort, CompletionKey, NumberOfConcurrentThreads   ; 戻り値は stat
; FileHandle : HANDLE -> "sptr"
; ExistingCompletionPort : HANDLE optional -> "sptr"
; CompletionKey : UINT_PTR -> "sptr"
; NumberOfConcurrentThreads : DWORD -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
#uselib "KERNEL32.dll"
#cfunc global CreateIoCompletionPort "CreateIoCompletionPort" sptr, sptr, sptr, int
; res = CreateIoCompletionPort(FileHandle, ExistingCompletionPort, CompletionKey, NumberOfConcurrentThreads)
; FileHandle : HANDLE -> "sptr"
; ExistingCompletionPort : HANDLE optional -> "sptr"
; CompletionKey : UINT_PTR -> "sptr"
; NumberOfConcurrentThreads : DWORD -> "int"
; HANDLE CreateIoCompletionPort(HANDLE FileHandle, HANDLE ExistingCompletionPort, UINT_PTR CompletionKey, DWORD NumberOfConcurrentThreads)
#uselib "KERNEL32.dll"
#cfunc global CreateIoCompletionPort "CreateIoCompletionPort" intptr, intptr, intptr, int
; res = CreateIoCompletionPort(FileHandle, ExistingCompletionPort, CompletionKey, NumberOfConcurrentThreads)
; FileHandle : HANDLE -> "intptr"
; ExistingCompletionPort : HANDLE optional -> "intptr"
; CompletionKey : UINT_PTR -> "intptr"
; NumberOfConcurrentThreads : DWORD -> "int"
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	kernel32 = windows.NewLazySystemDLL("KERNEL32.dll")
	procCreateIoCompletionPort = kernel32.NewProc("CreateIoCompletionPort")
)

// FileHandle (HANDLE), ExistingCompletionPort (HANDLE optional), CompletionKey (UINT_PTR), NumberOfConcurrentThreads (DWORD)
r1, _, err := procCreateIoCompletionPort.Call(
	uintptr(FileHandle),
	uintptr(ExistingCompletionPort),
	uintptr(CompletionKey),
	uintptr(NumberOfConcurrentThreads),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // HANDLE
function CreateIoCompletionPort(
  FileHandle: THandle;   // HANDLE
  ExistingCompletionPort: THandle;   // HANDLE optional
  CompletionKey: NativeUInt;   // UINT_PTR
  NumberOfConcurrentThreads: DWORD   // DWORD
): THandle; stdcall;
  external 'KERNEL32.dll' name 'CreateIoCompletionPort';
result := DllCall("KERNEL32\CreateIoCompletionPort"
    , "Ptr", FileHandle   ; HANDLE
    , "Ptr", ExistingCompletionPort   ; HANDLE optional
    , "UPtr", CompletionKey   ; UINT_PTR
    , "UInt", NumberOfConcurrentThreads   ; DWORD
    , "Ptr")   ; return: HANDLE
●CreateIoCompletionPort(FileHandle, ExistingCompletionPort, CompletionKey, NumberOfConcurrentThreads) = DLL("KERNEL32.dll", "void* CreateIoCompletionPort(void*, void*, int, dword)")
# 呼び出し: CreateIoCompletionPort(FileHandle, ExistingCompletionPort, CompletionKey, NumberOfConcurrentThreads)
# FileHandle : HANDLE -> "void*"
# ExistingCompletionPort : HANDLE optional -> "void*"
# CompletionKey : UINT_PTR -> "int"
# NumberOfConcurrentThreads : DWORD -> "dword"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "kernel32" fn CreateIoCompletionPort(
    FileHandle: ?*anyopaque, // HANDLE
    ExistingCompletionPort: ?*anyopaque, // HANDLE optional
    CompletionKey: usize, // UINT_PTR
    NumberOfConcurrentThreads: u32 // DWORD
) callconv(std.os.windows.WINAPI) ?*anyopaque;
proc CreateIoCompletionPort(
    FileHandle: pointer,  # HANDLE
    ExistingCompletionPort: pointer,  # HANDLE optional
    CompletionKey: uint,  # UINT_PTR
    NumberOfConcurrentThreads: uint32  # DWORD
): pointer {.importc: "CreateIoCompletionPort", stdcall, dynlib: "KERNEL32.dll".}
pragma(lib, "kernel32");
extern(Windows)
void* CreateIoCompletionPort(
    void* FileHandle,   // HANDLE
    void* ExistingCompletionPort,   // HANDLE optional
    size_t CompletionKey,   // UINT_PTR
    uint NumberOfConcurrentThreads   // DWORD
);
ccall((:CreateIoCompletionPort, "KERNEL32.dll"), stdcall, Ptr{Cvoid},
      (Ptr{Cvoid}, Ptr{Cvoid}, Csize_t, UInt32),
      FileHandle, ExistingCompletionPort, CompletionKey, NumberOfConcurrentThreads)
# FileHandle : HANDLE -> Ptr{Cvoid}
# ExistingCompletionPort : HANDLE optional -> Ptr{Cvoid}
# CompletionKey : UINT_PTR -> Csize_t
# NumberOfConcurrentThreads : DWORD -> UInt32
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
void* CreateIoCompletionPort(
    void* FileHandle,
    void* ExistingCompletionPort,
    uintptr_t CompletionKey,
    uint32_t NumberOfConcurrentThreads);
]]
local kernel32 = ffi.load("kernel32")
-- kernel32.CreateIoCompletionPort(FileHandle, ExistingCompletionPort, CompletionKey, NumberOfConcurrentThreads)
-- FileHandle : HANDLE
-- ExistingCompletionPort : HANDLE optional
-- CompletionKey : UINT_PTR
-- NumberOfConcurrentThreads : DWORD
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('KERNEL32.dll');
const CreateIoCompletionPort = lib.func('__stdcall', 'CreateIoCompletionPort', 'void *', ['void *', 'void *', 'uintptr_t', 'uint32_t']);
// CreateIoCompletionPort(FileHandle, ExistingCompletionPort, CompletionKey, NumberOfConcurrentThreads)
// FileHandle : HANDLE -> 'void *'
// ExistingCompletionPort : HANDLE optional -> 'void *'
// CompletionKey : UINT_PTR -> 'uintptr_t'
// NumberOfConcurrentThreads : DWORD -> 'uint32_t'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("KERNEL32.dll", {
  CreateIoCompletionPort: { parameters: ["pointer", "pointer", "usize", "u32"], result: "pointer" },
});
// lib.symbols.CreateIoCompletionPort(FileHandle, ExistingCompletionPort, CompletionKey, NumberOfConcurrentThreads)
// FileHandle : HANDLE -> "pointer"
// ExistingCompletionPort : HANDLE optional -> "pointer"
// CompletionKey : UINT_PTR -> "usize"
// NumberOfConcurrentThreads : DWORD -> "u32"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
void* CreateIoCompletionPort(
    void* FileHandle,
    void* ExistingCompletionPort,
    size_t CompletionKey,
    uint32_t NumberOfConcurrentThreads);
C, "KERNEL32.dll");
// $ffi->CreateIoCompletionPort(FileHandle, ExistingCompletionPort, CompletionKey, NumberOfConcurrentThreads);
// FileHandle : HANDLE
// ExistingCompletionPort : HANDLE optional
// CompletionKey : UINT_PTR
// NumberOfConcurrentThreads : DWORD
// 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
// WINAPI(stdcall): x64 では呼出規約が統一されるため問題なし。x86 では __stdcall 対応のラッパが必要な場合あり。
import com.sun.jna.*;
import com.sun.jna.ptr.*;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.win32.W32APIOptions;

public interface Kernel32 extends StdCallLibrary {
    Kernel32 INSTANCE = Native.load("kernel32", Kernel32.class);
    Pointer CreateIoCompletionPort(
        Pointer FileHandle,   // HANDLE
        Pointer ExistingCompletionPort,   // HANDLE optional
        long CompletionKey,   // UINT_PTR
        int NumberOfConcurrentThreads   // DWORD
    );
}
@[Link("kernel32")]
lib LibKERNEL32
  fun CreateIoCompletionPort = CreateIoCompletionPort(
    FileHandle : Void*,   # HANDLE
    ExistingCompletionPort : Void*,   # HANDLE optional
    CompletionKey : LibC::SizeT,   # UINT_PTR
    NumberOfConcurrentThreads : UInt32   # DWORD
  ) : Void*
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef CreateIoCompletionPortNative = Pointer<Void> Function(Pointer<Void>, Pointer<Void>, UintPtr, Uint32);
typedef CreateIoCompletionPortDart = Pointer<Void> Function(Pointer<Void>, Pointer<Void>, int, int);
final CreateIoCompletionPort = DynamicLibrary.open('KERNEL32.dll')
    .lookupFunction<CreateIoCompletionPortNative, CreateIoCompletionPortDart>('CreateIoCompletionPort');
// FileHandle : HANDLE -> Pointer<Void>
// ExistingCompletionPort : HANDLE optional -> Pointer<Void>
// CompletionKey : UINT_PTR -> UintPtr
// NumberOfConcurrentThreads : DWORD -> Uint32
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function CreateIoCompletionPort(
  FileHandle: THandle;   // HANDLE
  ExistingCompletionPort: THandle;   // HANDLE optional
  CompletionKey: NativeUInt;   // UINT_PTR
  NumberOfConcurrentThreads: DWORD   // DWORD
): THandle; stdcall;
  external 'KERNEL32.dll' name 'CreateIoCompletionPort';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "CreateIoCompletionPort"
  c_CreateIoCompletionPort :: Ptr () -> Ptr () -> CUIntPtr -> Word32 -> IO (Ptr ())
-- FileHandle : HANDLE -> Ptr ()
-- ExistingCompletionPort : HANDLE optional -> Ptr ()
-- CompletionKey : UINT_PTR -> CUIntPtr
-- NumberOfConcurrentThreads : DWORD -> Word32
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let createiocompletionport =
  foreign "CreateIoCompletionPort"
    ((ptr void) @-> (ptr void) @-> size_t @-> uint32_t @-> returning (ptr void))
(* FileHandle : HANDLE -> (ptr void) *)
(* ExistingCompletionPort : HANDLE optional -> (ptr void) *)
(* CompletionKey : UINT_PTR -> size_t *)
(* NumberOfConcurrentThreads : DWORD -> uint32_t *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library kernel32 (t "KERNEL32.dll"))
(cffi:use-foreign-library kernel32)

(cffi:defcfun ("CreateIoCompletionPort" create-io-completion-port :convention :stdcall) :pointer
  (file-handle :pointer)   ; HANDLE
  (existing-completion-port :pointer)   ; HANDLE optional
  (completion-key :uint64)   ; UINT_PTR
  (number-of-concurrent-threads :uint32))   ; DWORD
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $CreateIoCompletionPort = Win32::API::More->new('KERNEL32',
    'HANDLE CreateIoCompletionPort(HANDLE FileHandle, HANDLE ExistingCompletionPort, WPARAM CompletionKey, DWORD NumberOfConcurrentThreads)');
# my $ret = $CreateIoCompletionPort->Call($FileHandle, $ExistingCompletionPort, $CompletionKey, $NumberOfConcurrentThreads);
# FileHandle : HANDLE -> HANDLE
# ExistingCompletionPort : HANDLE optional -> HANDLE
# CompletionKey : UINT_PTR -> WPARAM
# NumberOfConcurrentThreads : DWORD -> DWORD
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

公式の関連項目