ホーム › System.Rpc › NDR64_NON_ENCAPSULATED_UNION
NDR64_NON_ENCAPSULATED_UNION
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| FormatCode | BYTE | 1 | +0 | +0 | 非カプセル化共用体(判別子が外部)を示すフォーマットコード。 |
| Alignment | BYTE | 1 | +1 | +1 | 共用体のアライメント(バイト数)。 |
| Flags | BYTE | 1 | +2 | +2 | 共用体の属性フラグ。 |
| SwitchType | BYTE | 1 | +3 | +3 | 判別子(switch)の型を示すコード。 |
| MemorySize | DWORD | 4 | +4 | +4 | 共用体本体のメモリ上のサイズ(バイト数)。 |
| Switch | void* | 8/4 | +8 | +8 | 判別子の位置を示す記述(式)へのポインタ。 |
| Reserved | DWORD | 4 | +16 | +12 | 予約フィールド(DWORD)。将来の拡張用。 |
各言語での定義
#include <windows.h>
// NDR64_NON_ENCAPSULATED_UNION (x64 24 / x86 16 バイト)
typedef struct NDR64_NON_ENCAPSULATED_UNION {
BYTE FormatCode;
BYTE Alignment;
BYTE Flags;
BYTE SwitchType;
DWORD MemorySize;
void* Switch;
DWORD Reserved;
} NDR64_NON_ENCAPSULATED_UNION;using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct NDR64_NON_ENCAPSULATED_UNION
{
public byte FormatCode;
public byte Alignment;
public byte Flags;
public byte SwitchType;
public uint MemorySize;
public IntPtr Switch;
public uint Reserved;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure NDR64_NON_ENCAPSULATED_UNION
Public FormatCode As Byte
Public Alignment As Byte
Public Flags As Byte
Public SwitchType As Byte
Public MemorySize As UInteger
Public Switch As IntPtr
Public Reserved As UInteger
End Structureimport ctypes
from ctypes import wintypes
class NDR64_NON_ENCAPSULATED_UNION(ctypes.Structure):
_fields_ = [
("FormatCode", ctypes.c_ubyte),
("Alignment", ctypes.c_ubyte),
("Flags", ctypes.c_ubyte),
("SwitchType", ctypes.c_ubyte),
("MemorySize", wintypes.DWORD),
("Switch", ctypes.c_void_p),
("Reserved", wintypes.DWORD),
]#[repr(C)]
pub struct NDR64_NON_ENCAPSULATED_UNION {
pub FormatCode: u8,
pub Alignment: u8,
pub Flags: u8,
pub SwitchType: u8,
pub MemorySize: u32,
pub Switch: *mut core::ffi::c_void,
pub Reserved: u32,
}import "golang.org/x/sys/windows"
type NDR64_NON_ENCAPSULATED_UNION struct {
FormatCode byte
Alignment byte
Flags byte
SwitchType byte
MemorySize uint32
Switch uintptr
Reserved uint32
}type
NDR64_NON_ENCAPSULATED_UNION = record
FormatCode: Byte;
Alignment: Byte;
Flags: Byte;
SwitchType: Byte;
MemorySize: DWORD;
Switch: Pointer;
Reserved: DWORD;
end;const NDR64_NON_ENCAPSULATED_UNION = extern struct {
FormatCode: u8,
Alignment: u8,
Flags: u8,
SwitchType: u8,
MemorySize: u32,
Switch: ?*anyopaque,
Reserved: u32,
};type
NDR64_NON_ENCAPSULATED_UNION {.bycopy.} = object
FormatCode: uint8
Alignment: uint8
Flags: uint8
SwitchType: uint8
MemorySize: uint32
Switch: pointer
Reserved: uint32struct NDR64_NON_ENCAPSULATED_UNION
{
ubyte FormatCode;
ubyte Alignment;
ubyte Flags;
ubyte SwitchType;
uint MemorySize;
void* Switch;
uint Reserved;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; NDR64_NON_ENCAPSULATED_UNION サイズ: 16 バイト(x86)
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)
; MemorySize : DWORD (+4, 4byte) st.1 = 値 / 値 = st.1 (lpoke/lpeek も可)
; Switch : void* (+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 系を使用。; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; NDR64_NON_ENCAPSULATED_UNION サイズ: 24 バイト(x64)
dim st, 6 ; 4byte整数×6(構造体サイズ 24 / 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)
; MemorySize : DWORD (+4, 4byte) st.1 = 値 / 値 = st.1 (lpoke/lpeek も可)
; Switch : void* (+8, 8byte) qpoke st,8,値 / qpeek(st,8) ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; Reserved : DWORD (+16, 4byte) st.4 = 値 / 値 = st.4 (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global NDR64_NON_ENCAPSULATED_UNION
#field byte FormatCode
#field byte Alignment
#field byte Flags
#field byte SwitchType
#field int MemorySize
#field intptr Switch
#field int Reserved
#endstruct
stdim st, NDR64_NON_ENCAPSULATED_UNION ; NSTRUCT 変数を確保
st->FormatCode = 100
mes "FormatCode=" + st->FormatCode