ホーム › System.Rpc › RPC_ASYNC_STATE
RPC_ASYNC_STATE
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| Size | DWORD | 4 | +0 | +0 | この構造体のサイズをバイト単位で表す。 |
| Signature | DWORD | 4 | +4 | +4 | 構造体の整合性検証用シグネチャ。 |
| Lock | INT | 4 | +8 | +8 | 内部ロック状態を示す値。INT型。 |
| Flags | DWORD | 4 | +12 | +12 | 非同期呼び出しの動作を制御するフラグ。 |
| StubInfo | void* | 8/4 | +16 | +16 | スタブ情報へのポインター。内部利用。 |
| UserInfo | void* | 8/4 | +24 | +20 | ユーザー定義のコンテキストポインター。 |
| RuntimeInfo | void* | 8/4 | +32 | +24 | ランタイム情報へのポインター。内部利用。 |
| Event | RPC_ASYNC_EVENT | 4 | +40 | +28 | 非同期イベントの種別。RPC_ASYNC_EVENTで表す。 |
| NotificationType | RPC_NOTIFICATION_TYPES | 4 | +44 | +32 | 完了通知の方式。RPC_NOTIFICATION_TYPESで表す。 |
| u | RPC_ASYNC_NOTIFICATION_INFO | 32/16 | +48 | +36 | 通知方式に応じた通知情報。RPC_ASYNC_NOTIFICATION_INFOで表す。 |
| Reserved | INT_PTR | 32/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 Structureimport 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 非対応)。必要に応じ手動でアクセス。