Win32 API 日本語リファレンス
ホームNetworking.WinSock › ProcessSocketNotifications

ProcessSocketNotifications

関数
完了ポート経由でソケット通知を登録し処理する。
DLLWS2_32.dll呼出規約winapi

シグネチャ

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

DWORD ProcessSocketNotifications(
    HANDLE completionPort,
    DWORD registrationCount,
    SOCK_NOTIFY_REGISTRATION* registrationInfos,   // optional
    DWORD timeoutMs,
    DWORD completionCount,
    OVERLAPPED_ENTRY* completionPortEntries,   // optional
    DWORD* receivedEntryCount   // optional
);

パラメーター

名前方向
completionPortHANDLEin
registrationCountDWORDin
registrationInfosSOCK_NOTIFY_REGISTRATION*inoutoptional
timeoutMsDWORDin
completionCountDWORDin
completionPortEntriesOVERLAPPED_ENTRY*outoptional
receivedEntryCountDWORD*outoptional

戻り値の型: DWORD

各言語での呼び出し定義

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

DWORD ProcessSocketNotifications(
    HANDLE completionPort,
    DWORD registrationCount,
    SOCK_NOTIFY_REGISTRATION* registrationInfos,   // optional
    DWORD timeoutMs,
    DWORD completionCount,
    OVERLAPPED_ENTRY* completionPortEntries,   // optional
    DWORD* receivedEntryCount   // optional
);
[DllImport("WS2_32.dll", ExactSpelling = true)]
static extern uint ProcessSocketNotifications(
    IntPtr completionPort,   // HANDLE
    uint registrationCount,   // DWORD
    IntPtr registrationInfos,   // SOCK_NOTIFY_REGISTRATION* optional, in/out
    uint timeoutMs,   // DWORD
    uint completionCount,   // DWORD
    IntPtr completionPortEntries,   // OVERLAPPED_ENTRY* optional, out
    IntPtr receivedEntryCount   // DWORD* optional, out
);
<DllImport("WS2_32.dll", ExactSpelling:=True)>
Public Shared Function ProcessSocketNotifications(
    completionPort As IntPtr,   ' HANDLE
    registrationCount As UInteger,   ' DWORD
    registrationInfos As IntPtr,   ' SOCK_NOTIFY_REGISTRATION* optional, in/out
    timeoutMs As UInteger,   ' DWORD
    completionCount As UInteger,   ' DWORD
    completionPortEntries As IntPtr,   ' OVERLAPPED_ENTRY* optional, out
    receivedEntryCount As IntPtr   ' DWORD* optional, out
) As UInteger
End Function
' completionPort : HANDLE
' registrationCount : DWORD
' registrationInfos : SOCK_NOTIFY_REGISTRATION* optional, in/out
' timeoutMs : DWORD
' completionCount : DWORD
' completionPortEntries : OVERLAPPED_ENTRY* optional, out
' receivedEntryCount : DWORD* optional, out
Declare PtrSafe Function ProcessSocketNotifications Lib "ws2_32" ( _
    ByVal completionPort As LongPtr, _
    ByVal registrationCount As Long, _
    ByVal registrationInfos As LongPtr, _
    ByVal timeoutMs As Long, _
    ByVal completionCount As Long, _
    ByVal completionPortEntries As LongPtr, _
    ByVal receivedEntryCount As LongPtr) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

ProcessSocketNotifications = ctypes.windll.ws2_32.ProcessSocketNotifications
ProcessSocketNotifications.restype = wintypes.DWORD
ProcessSocketNotifications.argtypes = [
    wintypes.HANDLE,  # completionPort : HANDLE
    wintypes.DWORD,  # registrationCount : DWORD
    ctypes.c_void_p,  # registrationInfos : SOCK_NOTIFY_REGISTRATION* optional, in/out
    wintypes.DWORD,  # timeoutMs : DWORD
    wintypes.DWORD,  # completionCount : DWORD
    ctypes.c_void_p,  # completionPortEntries : OVERLAPPED_ENTRY* optional, out
    ctypes.POINTER(wintypes.DWORD),  # receivedEntryCount : DWORD* optional, out
]
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('WS2_32.dll')
ProcessSocketNotifications = Fiddle::Function.new(
  lib['ProcessSocketNotifications'],
  [
    Fiddle::TYPE_VOIDP,  # completionPort : HANDLE
    -Fiddle::TYPE_INT,  # registrationCount : DWORD
    Fiddle::TYPE_VOIDP,  # registrationInfos : SOCK_NOTIFY_REGISTRATION* optional, in/out
    -Fiddle::TYPE_INT,  # timeoutMs : DWORD
    -Fiddle::TYPE_INT,  # completionCount : DWORD
    Fiddle::TYPE_VOIDP,  # completionPortEntries : OVERLAPPED_ENTRY* optional, out
    Fiddle::TYPE_VOIDP,  # receivedEntryCount : DWORD* optional, out
  ],
  -Fiddle::TYPE_INT)
#[link(name = "ws2_32")]
extern "system" {
    fn ProcessSocketNotifications(
        completionPort: *mut core::ffi::c_void,  // HANDLE
        registrationCount: u32,  // DWORD
        registrationInfos: *mut SOCK_NOTIFY_REGISTRATION,  // SOCK_NOTIFY_REGISTRATION* optional, in/out
        timeoutMs: u32,  // DWORD
        completionCount: u32,  // DWORD
        completionPortEntries: *mut OVERLAPPED_ENTRY,  // OVERLAPPED_ENTRY* optional, out
        receivedEntryCount: *mut u32  // DWORD* optional, out
    ) -> u32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("WS2_32.dll")]
public static extern uint ProcessSocketNotifications(IntPtr completionPort, uint registrationCount, IntPtr registrationInfos, uint timeoutMs, uint completionCount, IntPtr completionPortEntries, IntPtr receivedEntryCount);
"@
$api = Add-Type -MemberDefinition $sig -Name 'WS2_32_ProcessSocketNotifications' -Namespace Win32 -PassThru
# $api::ProcessSocketNotifications(completionPort, registrationCount, registrationInfos, timeoutMs, completionCount, completionPortEntries, receivedEntryCount)
#uselib "WS2_32.dll"
#func global ProcessSocketNotifications "ProcessSocketNotifications" sptr, sptr, sptr, sptr, sptr, sptr, sptr
; ProcessSocketNotifications completionPort, registrationCount, varptr(registrationInfos), timeoutMs, completionCount, varptr(completionPortEntries), varptr(receivedEntryCount)   ; 戻り値は stat
; completionPort : HANDLE -> "sptr"
; registrationCount : DWORD -> "sptr"
; registrationInfos : SOCK_NOTIFY_REGISTRATION* optional, in/out -> "sptr"
; timeoutMs : DWORD -> "sptr"
; completionCount : DWORD -> "sptr"
; completionPortEntries : OVERLAPPED_ENTRY* optional, out -> "sptr"
; receivedEntryCount : DWORD* optional, out -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "WS2_32.dll"
#cfunc global ProcessSocketNotifications "ProcessSocketNotifications" sptr, int, var, int, int, var, var
; res = ProcessSocketNotifications(completionPort, registrationCount, registrationInfos, timeoutMs, completionCount, completionPortEntries, receivedEntryCount)
; completionPort : HANDLE -> "sptr"
; registrationCount : DWORD -> "int"
; registrationInfos : SOCK_NOTIFY_REGISTRATION* optional, in/out -> "var"
; timeoutMs : DWORD -> "int"
; completionCount : DWORD -> "int"
; completionPortEntries : OVERLAPPED_ENTRY* optional, out -> "var"
; receivedEntryCount : DWORD* optional, out -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; DWORD ProcessSocketNotifications(HANDLE completionPort, DWORD registrationCount, SOCK_NOTIFY_REGISTRATION* registrationInfos, DWORD timeoutMs, DWORD completionCount, OVERLAPPED_ENTRY* completionPortEntries, DWORD* receivedEntryCount)
#uselib "WS2_32.dll"
#cfunc global ProcessSocketNotifications "ProcessSocketNotifications" intptr, int, var, int, int, var, var
; res = ProcessSocketNotifications(completionPort, registrationCount, registrationInfos, timeoutMs, completionCount, completionPortEntries, receivedEntryCount)
; completionPort : HANDLE -> "intptr"
; registrationCount : DWORD -> "int"
; registrationInfos : SOCK_NOTIFY_REGISTRATION* optional, in/out -> "var"
; timeoutMs : DWORD -> "int"
; completionCount : DWORD -> "int"
; completionPortEntries : OVERLAPPED_ENTRY* optional, out -> "var"
; receivedEntryCount : DWORD* optional, out -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	ws2_32 = windows.NewLazySystemDLL("WS2_32.dll")
	procProcessSocketNotifications = ws2_32.NewProc("ProcessSocketNotifications")
)

// completionPort (HANDLE), registrationCount (DWORD), registrationInfos (SOCK_NOTIFY_REGISTRATION* optional, in/out), timeoutMs (DWORD), completionCount (DWORD), completionPortEntries (OVERLAPPED_ENTRY* optional, out), receivedEntryCount (DWORD* optional, out)
r1, _, err := procProcessSocketNotifications.Call(
	uintptr(completionPort),
	uintptr(registrationCount),
	uintptr(registrationInfos),
	uintptr(timeoutMs),
	uintptr(completionCount),
	uintptr(completionPortEntries),
	uintptr(receivedEntryCount),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // DWORD
function ProcessSocketNotifications(
  completionPort: THandle;   // HANDLE
  registrationCount: DWORD;   // DWORD
  registrationInfos: Pointer;   // SOCK_NOTIFY_REGISTRATION* optional, in/out
  timeoutMs: DWORD;   // DWORD
  completionCount: DWORD;   // DWORD
  completionPortEntries: Pointer;   // OVERLAPPED_ENTRY* optional, out
  receivedEntryCount: Pointer   // DWORD* optional, out
): DWORD; stdcall;
  external 'WS2_32.dll' name 'ProcessSocketNotifications';
result := DllCall("WS2_32\ProcessSocketNotifications"
    , "Ptr", completionPort   ; HANDLE
    , "UInt", registrationCount   ; DWORD
    , "Ptr", registrationInfos   ; SOCK_NOTIFY_REGISTRATION* optional, in/out
    , "UInt", timeoutMs   ; DWORD
    , "UInt", completionCount   ; DWORD
    , "Ptr", completionPortEntries   ; OVERLAPPED_ENTRY* optional, out
    , "Ptr", receivedEntryCount   ; DWORD* optional, out
    , "UInt")   ; return: DWORD
●ProcessSocketNotifications(completionPort, registrationCount, registrationInfos, timeoutMs, completionCount, completionPortEntries, receivedEntryCount) = DLL("WS2_32.dll", "dword ProcessSocketNotifications(void*, dword, void*, dword, dword, void*, void*)")
# 呼び出し: ProcessSocketNotifications(completionPort, registrationCount, registrationInfos, timeoutMs, completionCount, completionPortEntries, receivedEntryCount)
# completionPort : HANDLE -> "void*"
# registrationCount : DWORD -> "dword"
# registrationInfos : SOCK_NOTIFY_REGISTRATION* optional, in/out -> "void*"
# timeoutMs : DWORD -> "dword"
# completionCount : DWORD -> "dword"
# completionPortEntries : OVERLAPPED_ENTRY* optional, out -> "void*"
# receivedEntryCount : DWORD* optional, out -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。