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

NDR64_ENCAPSULATED_UNION

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

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

フィールド

フィールドサイズx64x86説明
FormatCodeBYTE1+0+0カプセル化共用体(判別子を内包)を示すフォーマットコード。
AlignmentBYTE1+1+1共用体のアライメント(バイト数)。
FlagsBYTE1+2+2共用体の属性フラグ。
SwitchTypeBYTE1+3+3判別子(switch)の型を示すコード。
MemoryOffsetDWORD4+4+4判別子から共用体本体までのメモリオフセット(バイト数)。
MemorySizeDWORD4+8+8共用体本体のメモリ上のサイズ(バイト数)。
ReservedDWORD4+12+12予約フィールド(DWORD)。将来の拡張用。

各言語での定義

#include <windows.h>

// NDR64_ENCAPSULATED_UNION  (x64 16 / x86 16 バイト)
typedef struct NDR64_ENCAPSULATED_UNION {
    BYTE FormatCode;
    BYTE Alignment;
    BYTE Flags;
    BYTE SwitchType;
    DWORD MemoryOffset;
    DWORD MemorySize;
    DWORD Reserved;
} NDR64_ENCAPSULATED_UNION;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct NDR64_ENCAPSULATED_UNION
{
    public byte FormatCode;
    public byte Alignment;
    public byte Flags;
    public byte SwitchType;
    public uint MemoryOffset;
    public uint MemorySize;
    public uint Reserved;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure NDR64_ENCAPSULATED_UNION
    Public FormatCode As Byte
    Public Alignment As Byte
    Public Flags As Byte
    Public SwitchType As Byte
    Public MemoryOffset As UInteger
    Public MemorySize As UInteger
    Public Reserved As UInteger
End Structure
import ctypes
from ctypes import wintypes

class NDR64_ENCAPSULATED_UNION(ctypes.Structure):
    _fields_ = [
        ("FormatCode", ctypes.c_ubyte),
        ("Alignment", ctypes.c_ubyte),
        ("Flags", ctypes.c_ubyte),
        ("SwitchType", ctypes.c_ubyte),
        ("MemoryOffset", wintypes.DWORD),
        ("MemorySize", wintypes.DWORD),
        ("Reserved", wintypes.DWORD),
    ]
#[repr(C)]
pub struct NDR64_ENCAPSULATED_UNION {
    pub FormatCode: u8,
    pub Alignment: u8,
    pub Flags: u8,
    pub SwitchType: u8,
    pub MemoryOffset: u32,
    pub MemorySize: u32,
    pub Reserved: u32,
}
import "golang.org/x/sys/windows"

type NDR64_ENCAPSULATED_UNION struct {
	FormatCode byte
	Alignment byte
	Flags byte
	SwitchType byte
	MemoryOffset uint32
	MemorySize uint32
	Reserved uint32
}
type
  NDR64_ENCAPSULATED_UNION = record
    FormatCode: Byte;
    Alignment: Byte;
    Flags: Byte;
    SwitchType: Byte;
    MemoryOffset: DWORD;
    MemorySize: DWORD;
    Reserved: DWORD;
  end;
const NDR64_ENCAPSULATED_UNION = extern struct {
    FormatCode: u8,
    Alignment: u8,
    Flags: u8,
    SwitchType: u8,
    MemoryOffset: u32,
    MemorySize: u32,
    Reserved: u32,
};
type
  NDR64_ENCAPSULATED_UNION {.bycopy.} = object
    FormatCode: uint8
    Alignment: uint8
    Flags: uint8
    SwitchType: uint8
    MemoryOffset: uint32
    MemorySize: uint32
    Reserved: uint32
struct NDR64_ENCAPSULATED_UNION
{
    ubyte FormatCode;
    ubyte Alignment;
    ubyte Flags;
    ubyte SwitchType;
    uint MemoryOffset;
    uint MemorySize;
    uint Reserved;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; NDR64_ENCAPSULATED_UNION サイズ: 16 バイト(x64)
dim st, 4    ; 4byte整数×4(構造体サイズ 16 / 4 切り上げ)
; FormatCode : BYTE (+0, 1byte)  poke st,0,値  /  値 = peek(st,0)
; Alignment : BYTE (+1, 1byte)  poke st,1,値  /  値 = peek(st,1)
; Flags : BYTE (+2, 1byte)  poke st,2,値  /  値 = peek(st,2)
; SwitchType : BYTE (+3, 1byte)  poke st,3,値  /  値 = peek(st,3)
; MemoryOffset : DWORD (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; MemorySize : DWORD (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; Reserved : DWORD (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global NDR64_ENCAPSULATED_UNION
    #field byte FormatCode
    #field byte Alignment
    #field byte Flags
    #field byte SwitchType
    #field int MemoryOffset
    #field int MemorySize
    #field int Reserved
#endstruct

stdim st, NDR64_ENCAPSULATED_UNION        ; NSTRUCT 変数を確保
st->FormatCode = 100
mes "FormatCode=" + st->FormatCode