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この構造体のサイズ (バイト単位)。 RpcAsyncInitializeHandle が呼び出されたときに、環境がこのメンバーを設定します。このメンバーを変更しないでください。
SignatureDWORD4+4+4ランタイム環境は、 RpcAsyncInitializeHandle が呼び出されたときにこのメンバーを設定します。このメンバーを変更しないでください。
LockINT4+8+8ランタイム環境は、 RpcAsyncInitializeHandle が呼び出されたときにこのメンバーを設定します。このメンバーを変更しないでください。
FlagsDWORD4+12+12

flags メンバーには次の値を設定できます。

定数 意味
RPC_C_NOTIFY_ON_SEND_COMPLETE
非同期操作が完了したときに通知メッセージをポストします。

これらのフラグは DCE パイプで使用されます。DCE パイプにより、アプリケーションは複数のブロックに分けてデータを送受信できます。プログラムは連続したデータストリームを送信することも、各ブロックの転送が完了するまで待ってから次のブロックを送信することもできます。待機しない場合、RPC ランタイムライブラリは送信可能になるまで出力をバッファーに保持します。データの転送が完了すると、RPC ライブラリはアプリケーションに通知を送信します。アプリケーションが RPC_C_NOTIFY_ON_SEND_COMPLETE フラグを指定した場合、RPC ライブラリは各送信操作の完了後に RPC_NOTIFICATION_TYPES 列挙型のメンバーを送信します。

StubInfovoid*8/4+16+16スタブが使用するために予約済みです。このメンバーは使用しないでください。
UserInfovoid*8/4+24+20この構造体で追跡したいアプリケーション固有の情報に、このメンバーを使用します。
RuntimeInfovoid*8/4+32+24RPC ランタイム環境が使用するために予約済みです。このメンバーは使用しないでください。
EventRPC_ASYNC_EVENT4+40+28発生したイベントの種類。RPC ランタイム環境は、このフィールドに RPC_ASYNC_EVENT 列挙型のメンバーを設定します。
NotificationTypeRPC_NOTIFICATION_TYPES4+44+32

呼び出しの完了やイベントの完了など、イベントの発生をクライアントに通知するために RPC ランタイムが使用する通知の種類。

意味
RpcNotificationTypeNone
通知は指定されません。RPC_ASYNC_NOTIFICATION_INFO は初期化されません。
RpcNotificationTypeEvent
通知メカニズムは Windows イベントです。
RpcNotificationTypeApc
通知メカニズムは Windows の非同期プロシージャコールです。
RpcNotificationTypeIoc
通知メカニズムは I/O 完了ポートです。
RpcNotificationTypeHwnd
通知メカニズムは Windows のシステムメッセージです。

Windows Server 2003 以降: HWND による通知は非推奨です。この値は使用しないでください。

RpcNotificationTypeCallback
通知メカニズムは関数コールバックです。
uRPC_ASYNC_NOTIFICATION_INFO32/16+48+36

NotificationType で指定されたメカニズムの種類に合わせて構成された、非同期通知情報が格納されます。

メモ Windows Vista より前では、このメンバーには現在 RPC_ASYNC_NOTIFICATION_INFO 共用体で指定されている共用体固有の構文が含まれていました。
ReservedINT_PTR32/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 の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
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 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 非対応)。必要に応じ手動でアクセス。