RPC_ASYNC_STATE
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 | ||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Size | DWORD | 4 | +0 | +0 | この構造体のサイズ (バイト単位)。 RpcAsyncInitializeHandle が呼び出されたときに、環境がこのメンバーを設定します。このメンバーを変更しないでください。 | ||||||||||||||
| Signature | DWORD | 4 | +4 | +4 | ランタイム環境は、 RpcAsyncInitializeHandle が呼び出されたときにこのメンバーを設定します。このメンバーを変更しないでください。 | ||||||||||||||
| Lock | INT | 4 | +8 | +8 | ランタイム環境は、 RpcAsyncInitializeHandle が呼び出されたときにこのメンバーを設定します。このメンバーを変更しないでください。 | ||||||||||||||
| Flags | DWORD | 4 | +12 | +12 | flags メンバーには次の値を設定できます。
これらのフラグは DCE パイプで使用されます。DCE パイプにより、アプリケーションは複数のブロックに分けてデータを送受信できます。プログラムは連続したデータストリームを送信することも、各ブロックの転送が完了するまで待ってから次のブロックを送信することもできます。待機しない場合、RPC ランタイムライブラリは送信可能になるまで出力をバッファーに保持します。データの転送が完了すると、RPC ライブラリはアプリケーションに通知を送信します。アプリケーションが RPC_C_NOTIFY_ON_SEND_COMPLETE フラグを指定した場合、RPC ライブラリは各送信操作の完了後に RPC_NOTIFICATION_TYPES 列挙型のメンバーを送信します。 | ||||||||||||||
| StubInfo | void* | 8/4 | +16 | +16 | スタブが使用するために予約済みです。このメンバーは使用しないでください。 | ||||||||||||||
| UserInfo | void* | 8/4 | +24 | +20 | この構造体で追跡したいアプリケーション固有の情報に、このメンバーを使用します。 | ||||||||||||||
| RuntimeInfo | void* | 8/4 | +32 | +24 | RPC ランタイム環境が使用するために予約済みです。このメンバーは使用しないでください。 | ||||||||||||||
| Event | RPC_ASYNC_EVENT | 4 | +40 | +28 | 発生したイベントの種類。RPC ランタイム環境は、このフィールドに RPC_ASYNC_EVENT 列挙型のメンバーを設定します。 | ||||||||||||||
| NotificationType | RPC_NOTIFICATION_TYPES | 4 | +44 | +32 | 呼び出しの完了やイベントの完了など、イベントの発生をクライアントに通知するために RPC ランタイムが使用する通知の種類。
| ||||||||||||||
| u | RPC_ASYNC_NOTIFICATION_INFO | 32/16 | +48 | +36 | NotificationType で指定されたメカニズムの種類に合わせて構成された、非同期通知情報が格納されます。 メモ Windows Vista より前では、このメンバーには現在 RPC_ASYNC_NOTIFICATION_INFO 共用体で指定されている共用体固有の構文が含まれていました。
| ||||||||||||||
| Reserved | INT_PTR | 32/16 | +80 | +52 | 将来のバージョンとの互換性のために予約済みです (存在する場合)。このメンバーは使用しないでください。 |
公式ドキュメント
RPC_ASYNC_STATE 構造体は、非同期リモートプロシージャコールの状態を保持します。RPC_ASYNC_STATE はこの構造体へのハンドルであり、非同期呼び出しの待機、照会、応答、キャンセルに使用されます。
解説(Remarks)
クライアントは RPC_ASYNC_STATE 構造体と関連するハンドルのための領域を割り当て、 RpcAsyncInitializeHandle を呼び出して構造体を初期化します。ランタイム環境が構造体の初期化に成功した後、クライアントは NotificationType と、RPC_ASYNC_NOTIFICATION_INFO 共用体内の次の構造体のうち、いずれか 1 つだけを初期化します。Windows の非同期プロシージャコールの場合は APC、I/O 完了ポートの場合は IOC、Windows のシステムメッセージの場合は HWND、Windows イベントの場合は hEvent です。選択した通知方法が RpcNotificationTypeNone の場合、共用体のフィールドを初期化する必要はありません。RPC クライアントは、必要に応じて UserInfo フィールドも初期化できます。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での定義
#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 非対応)。必要に応じ手動でアクセス。