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

RPC_ASYNC_STATE

構造体
サイズx64: 112 バイト / x86: 68 バイト

サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。

フィールド

フィールドサイズx64x86説明
SizeDWORD4+0+0この構造体のサイズをバイト単位で表す。
SignatureDWORD4+4+4構造体の整合性検証用シグネチャ。
LockINT4+8+8内部ロック状態を示す値。INT型。
FlagsDWORD4+12+12非同期呼び出しの動作を制御するフラグ。
StubInfovoid*8/4+16+16スタブ情報へのポインター。内部利用。
UserInfovoid*8/4+24+20ユーザー定義のコンテキストポインター。
RuntimeInfovoid*8/4+32+24ランタイム情報へのポインター。内部利用。
EventRPC_ASYNC_EVENT4+40+28非同期イベントの種別。RPC_ASYNC_EVENTで表す。
NotificationTypeRPC_NOTIFICATION_TYPES4+44+32完了通知の方式。RPC_NOTIFICATION_TYPESで表す。
uRPC_ASYNC_NOTIFICATION_INFO32/16+48+36通知方式に応じた通知情報。RPC_ASYNC_NOTIFICATION_INFOで表す。
ReservedINT_PTR32/16+80+52予約済みフィールド。INT_PTRサイズ。

各言語での定義

#include <windows.h>

// RPC_ASYNC_NOTIFICATION_INFO  (x64 32 / x86 16 バイト)
typedef struct RPC_ASYNC_NOTIFICATION_INFO {
    _APC_e__Struct APC;
    _IOC_e__Struct IOC;
    _IntPtr_e__Struct IntPtr;
    HANDLE hEvent;
    PFN_RPCNOTIFICATION_ROUTINE NotificationRoutine;
} RPC_ASYNC_NOTIFICATION_INFO;

// RPC_ASYNC_STATE  (x64 112 / x86 68 バイト)
typedef struct RPC_ASYNC_STATE {
    DWORD Size;
    DWORD Signature;
    INT Lock;
    DWORD Flags;
    void* StubInfo;
    void* UserInfo;
    void* RuntimeInfo;
    RPC_ASYNC_EVENT Event;
    RPC_NOTIFICATION_TYPES NotificationType;
    RPC_ASYNC_NOTIFICATION_INFO u;
    INT_PTR Reserved[4];
} RPC_ASYNC_STATE;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct RPC_ASYNC_NOTIFICATION_INFO
{
    public _APC_e__Struct APC;
    public _IOC_e__Struct IOC;
    public _IntPtr_e__Struct IntPtr;
    public IntPtr hEvent;
    public IntPtr NotificationRoutine;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct RPC_ASYNC_STATE
{
    public uint Size;
    public uint Signature;
    public int Lock;
    public uint Flags;
    public IntPtr StubInfo;
    public IntPtr UserInfo;
    public IntPtr RuntimeInfo;
    public int Event;
    public int NotificationType;
    public RPC_ASYNC_NOTIFICATION_INFO u;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public IntPtr[] Reserved;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure RPC_ASYNC_NOTIFICATION_INFO
    Public APC As _APC_e__Struct
    Public IOC As _IOC_e__Struct
    Public IntPtr As _IntPtr_e__Struct
    Public hEvent As IntPtr
    Public NotificationRoutine As IntPtr
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure RPC_ASYNC_STATE
    Public Size As UInteger
    Public Signature As UInteger
    Public Lock As Integer
    Public Flags As UInteger
    Public StubInfo As IntPtr
    Public UserInfo As IntPtr
    Public RuntimeInfo As IntPtr
    Public Event As Integer
    Public NotificationType As Integer
    Public u As RPC_ASYNC_NOTIFICATION_INFO
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=4)> Public Reserved() As IntPtr
End Structure
import ctypes
from ctypes import wintypes

class RPC_ASYNC_NOTIFICATION_INFO(ctypes.Structure):
    _fields_ = [
        ("APC", _APC_e__Struct),
        ("IOC", _IOC_e__Struct),
        ("IntPtr", _IntPtr_e__Struct),
        ("hEvent", ctypes.c_void_p),
        ("NotificationRoutine", ctypes.c_void_p),
    ]

class RPC_ASYNC_STATE(ctypes.Structure):
    _fields_ = [
        ("Size", wintypes.DWORD),
        ("Signature", wintypes.DWORD),
        ("Lock", ctypes.c_int),
        ("Flags", wintypes.DWORD),
        ("StubInfo", ctypes.c_void_p),
        ("UserInfo", ctypes.c_void_p),
        ("RuntimeInfo", ctypes.c_void_p),
        ("Event", ctypes.c_int),
        ("NotificationType", ctypes.c_int),
        ("u", RPC_ASYNC_NOTIFICATION_INFO),
        ("Reserved", ctypes.c_ssize_t * 4),
    ]
#[repr(C)]
pub struct RPC_ASYNC_NOTIFICATION_INFO {
    pub APC: _APC_e__Struct,
    pub IOC: _IOC_e__Struct,
    pub IntPtr: _IntPtr_e__Struct,
    pub hEvent: *mut core::ffi::c_void,
    pub NotificationRoutine: *mut core::ffi::c_void,
}

#[repr(C)]
pub struct RPC_ASYNC_STATE {
    pub Size: u32,
    pub Signature: u32,
    pub Lock: i32,
    pub Flags: u32,
    pub StubInfo: *mut core::ffi::c_void,
    pub UserInfo: *mut core::ffi::c_void,
    pub RuntimeInfo: *mut core::ffi::c_void,
    pub Event: i32,
    pub NotificationType: i32,
    pub u: RPC_ASYNC_NOTIFICATION_INFO,
    pub Reserved: [isize; 4],
}
import "golang.org/x/sys/windows"

type RPC_ASYNC_NOTIFICATION_INFO struct {
	APC _APC_e__Struct
	IOC _IOC_e__Struct
	IntPtr _IntPtr_e__Struct
	hEvent uintptr
	NotificationRoutine uintptr
}

type RPC_ASYNC_STATE struct {
	Size uint32
	Signature uint32
	Lock int32
	Flags uint32
	StubInfo uintptr
	UserInfo uintptr
	RuntimeInfo uintptr
	Event int32
	NotificationType int32
	u RPC_ASYNC_NOTIFICATION_INFO
	Reserved [4]uintptr
}
type
  RPC_ASYNC_NOTIFICATION_INFO = record
    APC: _APC_e__Struct;
    IOC: _IOC_e__Struct;
    IntPtr: _IntPtr_e__Struct;
    hEvent: Pointer;
    NotificationRoutine: Pointer;
  end;

  RPC_ASYNC_STATE = record
    Size: DWORD;
    Signature: DWORD;
    Lock: Integer;
    Flags: DWORD;
    StubInfo: Pointer;
    UserInfo: Pointer;
    RuntimeInfo: Pointer;
    Event: Integer;
    NotificationType: Integer;
    u: RPC_ASYNC_NOTIFICATION_INFO;
    Reserved: array[0..3] of NativeInt;
  end;
const RPC_ASYNC_NOTIFICATION_INFO = extern struct {
    APC: _APC_e__Struct,
    IOC: _IOC_e__Struct,
    IntPtr: _IntPtr_e__Struct,
    hEvent: ?*anyopaque,
    NotificationRoutine: ?*anyopaque,
};

const RPC_ASYNC_STATE = extern struct {
    Size: u32,
    Signature: u32,
    Lock: i32,
    Flags: u32,
    StubInfo: ?*anyopaque,
    UserInfo: ?*anyopaque,
    RuntimeInfo: ?*anyopaque,
    Event: i32,
    NotificationType: i32,
    u: RPC_ASYNC_NOTIFICATION_INFO,
    Reserved: [4]isize,
};
type
  RPC_ASYNC_NOTIFICATION_INFO {.bycopy.} = object
    APC: _APC_e__Struct
    IOC: _IOC_e__Struct
    IntPtr: _IntPtr_e__Struct
    hEvent: pointer
    NotificationRoutine: pointer

  RPC_ASYNC_STATE {.bycopy.} = object
    Size: uint32
    Signature: uint32
    Lock: int32
    Flags: uint32
    StubInfo: pointer
    UserInfo: pointer
    RuntimeInfo: pointer
    Event: int32
    NotificationType: int32
    u: RPC_ASYNC_NOTIFICATION_INFO
    Reserved: array[4, int]
struct RPC_ASYNC_NOTIFICATION_INFO
{
    _APC_e__Struct APC;
    _IOC_e__Struct IOC;
    _IntPtr_e__Struct IntPtr;
    void* hEvent;
    void* NotificationRoutine;
}

struct RPC_ASYNC_STATE
{
    uint Size;
    uint Signature;
    int Lock;
    uint Flags;
    void* StubInfo;
    void* UserInfo;
    void* RuntimeInfo;
    int Event;
    int NotificationType;
    RPC_ASYNC_NOTIFICATION_INFO u;
    ptrdiff_t[4] Reserved;
}

HSP用 定義

HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; RPC_ASYNC_STATE サイズ: 68 バイト(x86)
dim st, 17    ; 4byte整数×17(構造体サイズ 68 / 4 切り上げ)
; Size : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; Signature : DWORD (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; Lock : INT (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; Flags : DWORD (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; StubInfo : void* (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; UserInfo : void* (+20, 4byte)  st.5 = 値  /  値 = st.5   (lpoke/lpeek も可)
; RuntimeInfo : void* (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; Event : RPC_ASYNC_EVENT (+28, 4byte)  st.7 = 値  /  値 = st.7   (lpoke/lpeek も可)
; NotificationType : RPC_NOTIFICATION_TYPES (+32, 4byte)  st.8 = 値  /  値 = st.8   (lpoke/lpeek も可)
; u : RPC_ASYNC_NOTIFICATION_INFO (+36, 16byte)  varptr(st)+36 を基点に操作(16byte:入れ子/配列)
; Reserved : INT_PTR (+52, 16byte)  varptr(st)+52 を基点に操作(16byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; RPC_ASYNC_STATE サイズ: 112 バイト(x64)
dim st, 28    ; 4byte整数×28(構造体サイズ 112 / 4 切り上げ)
; Size : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; Signature : DWORD (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; Lock : INT (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; Flags : DWORD (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; StubInfo : void* (+16, 8byte)  qpoke st,16,値 / qpeek(st,16)  ※IronHSPのみ。3.7/3.8は lpoke st,16,下位 : lpoke st,20,上位
; UserInfo : void* (+24, 8byte)  qpoke st,24,値 / qpeek(st,24)  ※IronHSPのみ。3.7/3.8は lpoke st,24,下位 : lpoke st,28,上位
; RuntimeInfo : void* (+32, 8byte)  qpoke st,32,値 / qpeek(st,32)  ※IronHSPのみ。3.7/3.8は lpoke st,32,下位 : lpoke st,36,上位
; Event : RPC_ASYNC_EVENT (+40, 4byte)  st.10 = 値  /  値 = st.10   (lpoke/lpeek も可)
; NotificationType : RPC_NOTIFICATION_TYPES (+44, 4byte)  st.11 = 値  /  値 = st.11   (lpoke/lpeek も可)
; u : RPC_ASYNC_NOTIFICATION_INFO (+48, 32byte)  varptr(st)+48 を基点に操作(32byte:入れ子/配列)
; Reserved : INT_PTR (+80, 32byte)  varptr(st)+80 を基点に操作(32byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global RPC_ASYNC_STATE
    #field int Size
    #field int Signature
    #field int Lock
    #field int Flags
    #field intptr StubInfo
    #field intptr UserInfo
    #field intptr RuntimeInfo
    #field int Event
    #field int NotificationType
    #field byte u 32
    #field intptr Reserved 4
#endstruct

stdim st, RPC_ASYNC_STATE        ; NSTRUCT 変数を確保
st->Size = 100
mes "Size=" + st->Size
; ※union フィールドは byte 列で確保(NSTRUCT は union 非対応)。必要に応じ手動でアクセス。