ホーム › Networking.WindowsWebServices › WS_STRUCT_DESCRIPTION
WS_STRUCT_DESCRIPTION
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| size | DWORD | 4 | +0 | +0 | 構造体全体のサイズ(バイト数)。 |
| alignment | DWORD | 4 | +4 | +4 | 構造体のメモリアライメント(バイト境界)。 |
| fields | WS_FIELD_DESCRIPTION** | 8/4 | +8 | +8 | フィールド記述の配列へのポインタ。各要素はフィールド記述へのポインタ。 |
| fieldCount | DWORD | 4 | +16 | +12 | fields配列の要素数。 |
| typeLocalName | WS_XML_STRING* | 8/4 | +24 | +16 | この型に対応するXMLローカル名へのポインタ。NULL可。 |
| typeNs | WS_XML_STRING* | 8/4 | +32 | +20 | この型に対応するXML名前空間URIへのポインタ。NULL可。 |
| parentType | WS_STRUCT_DESCRIPTION* | 8/4 | +40 | +24 | 継承元となる親構造体の記述へのポインタ。NULL可。 |
| subTypes | WS_STRUCT_DESCRIPTION** | 8/4 | +48 | +28 | 派生サブタイプの記述配列へのポインタ。各要素は構造体記述へのポインタ。NULL可。 |
| subTypeCount | DWORD | 4 | +56 | +32 | subTypes配列の要素数。 |
| structOptions | DWORD | 4 | +60 | +36 | 構造体のシリアライズ動作を制御するフラグの組み合わせ。 |
各言語での定義
#include <windows.h>
// WS_STRUCT_DESCRIPTION (x64 64 / x86 40 バイト)
typedef struct WS_STRUCT_DESCRIPTION {
DWORD size;
DWORD alignment;
WS_FIELD_DESCRIPTION** fields;
DWORD fieldCount;
WS_XML_STRING* typeLocalName;
WS_XML_STRING* typeNs;
WS_STRUCT_DESCRIPTION* parentType;
WS_STRUCT_DESCRIPTION** subTypes;
DWORD subTypeCount;
DWORD structOptions;
} WS_STRUCT_DESCRIPTION;using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct WS_STRUCT_DESCRIPTION
{
public uint size;
public uint alignment;
public IntPtr fields;
public uint fieldCount;
public IntPtr typeLocalName;
public IntPtr typeNs;
public IntPtr parentType;
public IntPtr subTypes;
public uint subTypeCount;
public uint structOptions;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure WS_STRUCT_DESCRIPTION
Public size As UInteger
Public alignment As UInteger
Public fields As IntPtr
Public fieldCount As UInteger
Public typeLocalName As IntPtr
Public typeNs As IntPtr
Public parentType As IntPtr
Public subTypes As IntPtr
Public subTypeCount As UInteger
Public structOptions As UInteger
End Structureimport ctypes
from ctypes import wintypes
class WS_STRUCT_DESCRIPTION(ctypes.Structure):
_fields_ = [
("size", wintypes.DWORD),
("alignment", wintypes.DWORD),
("fields", ctypes.c_void_p),
("fieldCount", wintypes.DWORD),
("typeLocalName", ctypes.c_void_p),
("typeNs", ctypes.c_void_p),
("parentType", ctypes.c_void_p),
("subTypes", ctypes.c_void_p),
("subTypeCount", wintypes.DWORD),
("structOptions", wintypes.DWORD),
]#[repr(C)]
pub struct WS_STRUCT_DESCRIPTION {
pub size: u32,
pub alignment: u32,
pub fields: *mut core::ffi::c_void,
pub fieldCount: u32,
pub typeLocalName: *mut core::ffi::c_void,
pub typeNs: *mut core::ffi::c_void,
pub parentType: *mut core::ffi::c_void,
pub subTypes: *mut core::ffi::c_void,
pub subTypeCount: u32,
pub structOptions: u32,
}import "golang.org/x/sys/windows"
type WS_STRUCT_DESCRIPTION struct {
size uint32
alignment uint32
fields uintptr
fieldCount uint32
typeLocalName uintptr
typeNs uintptr
parentType uintptr
subTypes uintptr
subTypeCount uint32
structOptions uint32
}type
WS_STRUCT_DESCRIPTION = record
size: DWORD;
alignment: DWORD;
fields: Pointer;
fieldCount: DWORD;
typeLocalName: Pointer;
typeNs: Pointer;
parentType: Pointer;
subTypes: Pointer;
subTypeCount: DWORD;
structOptions: DWORD;
end;const WS_STRUCT_DESCRIPTION = extern struct {
size: u32,
alignment: u32,
fields: ?*anyopaque,
fieldCount: u32,
typeLocalName: ?*anyopaque,
typeNs: ?*anyopaque,
parentType: ?*anyopaque,
subTypes: ?*anyopaque,
subTypeCount: u32,
structOptions: u32,
};type
WS_STRUCT_DESCRIPTION {.bycopy.} = object
size: uint32
alignment: uint32
fields: pointer
fieldCount: uint32
typeLocalName: pointer
typeNs: pointer
parentType: pointer
subTypes: pointer
subTypeCount: uint32
structOptions: uint32struct WS_STRUCT_DESCRIPTION
{
uint size;
uint alignment;
void* fields;
uint fieldCount;
void* typeLocalName;
void* typeNs;
void* parentType;
void* subTypes;
uint subTypeCount;
uint structOptions;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; WS_STRUCT_DESCRIPTION サイズ: 40 バイト(x86)
dim st, 10 ; 4byte整数×10(構造体サイズ 40 / 4 切り上げ)
; size : DWORD (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; alignment : DWORD (+4, 4byte) st.1 = 値 / 値 = st.1 (lpoke/lpeek も可)
; fields : WS_FIELD_DESCRIPTION** (+8, 4byte) varptr(st)+8 を基点に操作(4byte:入れ子/配列)
; fieldCount : DWORD (+12, 4byte) st.3 = 値 / 値 = st.3 (lpoke/lpeek も可)
; typeLocalName : WS_XML_STRING* (+16, 4byte) varptr(st)+16 を基点に操作(4byte:入れ子/配列)
; typeNs : WS_XML_STRING* (+20, 4byte) varptr(st)+20 を基点に操作(4byte:入れ子/配列)
; parentType : WS_STRUCT_DESCRIPTION* (+24, 4byte) varptr(st)+24 を基点に操作(4byte:入れ子/配列)
; subTypes : WS_STRUCT_DESCRIPTION** (+28, 4byte) varptr(st)+28 を基点に操作(4byte:入れ子/配列)
; subTypeCount : DWORD (+32, 4byte) st.8 = 値 / 値 = st.8 (lpoke/lpeek も可)
; structOptions : DWORD (+36, 4byte) st.9 = 値 / 値 = st.9 (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; WS_STRUCT_DESCRIPTION サイズ: 64 バイト(x64)
dim st, 16 ; 4byte整数×16(構造体サイズ 64 / 4 切り上げ)
; size : DWORD (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; alignment : DWORD (+4, 4byte) st.1 = 値 / 値 = st.1 (lpoke/lpeek も可)
; fields : WS_FIELD_DESCRIPTION** (+8, 8byte) varptr(st)+8 を基点に操作(8byte:入れ子/配列)
; fieldCount : DWORD (+16, 4byte) st.4 = 値 / 値 = st.4 (lpoke/lpeek も可)
; typeLocalName : WS_XML_STRING* (+24, 8byte) varptr(st)+24 を基点に操作(8byte:入れ子/配列)
; typeNs : WS_XML_STRING* (+32, 8byte) varptr(st)+32 を基点に操作(8byte:入れ子/配列)
; parentType : WS_STRUCT_DESCRIPTION* (+40, 8byte) varptr(st)+40 を基点に操作(8byte:入れ子/配列)
; subTypes : WS_STRUCT_DESCRIPTION** (+48, 8byte) varptr(st)+48 を基点に操作(8byte:入れ子/配列)
; subTypeCount : DWORD (+56, 4byte) st.14 = 値 / 値 = st.14 (lpoke/lpeek も可)
; structOptions : DWORD (+60, 4byte) st.15 = 値 / 値 = st.15 (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global WS_STRUCT_DESCRIPTION
#field int size
#field int alignment
#field intptr fields
#field int fieldCount
#field intptr typeLocalName
#field intptr typeNs
#field intptr parentType
#field intptr subTypes
#field int subTypeCount
#field int structOptions
#endstruct
stdim st, WS_STRUCT_DESCRIPTION ; NSTRUCT 変数を確保
st->size = 100
mes "size=" + st->size