ホーム › System.Com › FUNCDESC
FUNCDESC
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| memid | INT | 4 | +0 | +0 | この関数のメンバID(ディスパッチID)。 |
| lprgscode | INT* | 8/4 | +8 | +4 | 返しうるエラーコード配列へのポインタ。 |
| lprgelemdescParam | ELEMDESC* | 8/4 | +16 | +8 | 各パラメータの記述(ELEMDESC)配列へのポインタ。 |
| funckind | FUNCKIND | 4 | +24 | +12 | 関数の種別(FUNC_VIRTUAL/DISPATCH等)。 |
| invkind | INVOKEKIND | 4 | +28 | +16 | 呼び出し種別(INVOKE_FUNC/PROPERTYGET等)。 |
| callconv | CALLCONV | 4 | +32 | +20 | 呼び出し規約(CC_STDCALL等)。 |
| cParams | SHORT | 2 | +36 | +24 | パラメータの総数。 |
| cParamsOpt | SHORT | 2 | +38 | +26 | 省略可能なパラメータの数。-1で可変長引数。 |
| oVft | SHORT | 2 | +40 | +28 | 仮想関数テーブル内のオフセット。 |
| cScodes | SHORT | 2 | +42 | +30 | lprgscodeに含まれるエラーコードの数。 |
| elemdescFunc | ELEMDESC | 32/16 | +48 | +32 | 関数の戻り値の型情報(ELEMDESC)。 |
| wFuncFlags | FUNCFLAGS | 2 | +80 | +48 | 関数の属性フラグ(FUNCFLAG_系)。 |
各言語での定義
#include <windows.h>
// TYPEDESC (x64 16 / x86 8 バイト)
typedef struct TYPEDESC {
_Anonymous_e__Union Anonymous;
VARENUM vt;
} TYPEDESC;
// ELEMDESC (x64 32 / x86 16 バイト)
typedef struct ELEMDESC {
TYPEDESC tdesc;
_Anonymous_e__Union Anonymous;
} ELEMDESC;
// FUNCDESC (x64 88 / x86 52 バイト)
typedef struct FUNCDESC {
INT memid;
INT* lprgscode;
ELEMDESC* lprgelemdescParam;
FUNCKIND funckind;
INVOKEKIND invkind;
CALLCONV callconv;
SHORT cParams;
SHORT cParamsOpt;
SHORT oVft;
SHORT cScodes;
ELEMDESC elemdescFunc;
FUNCFLAGS wFuncFlags;
} FUNCDESC;using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct TYPEDESC
{
public _Anonymous_e__Union Anonymous;
public ushort vt;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct ELEMDESC
{
public TYPEDESC tdesc;
public _Anonymous_e__Union Anonymous;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct FUNCDESC
{
public int memid;
public IntPtr lprgscode;
public IntPtr lprgelemdescParam;
public int funckind;
public int invkind;
public int callconv;
public short cParams;
public short cParamsOpt;
public short oVft;
public short cScodes;
public ELEMDESC elemdescFunc;
public ushort wFuncFlags;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure TYPEDESC
Public Anonymous As _Anonymous_e__Union
Public vt As UShort
End Structure
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure ELEMDESC
Public tdesc As TYPEDESC
Public Anonymous As _Anonymous_e__Union
End Structure
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure FUNCDESC
Public memid As Integer
Public lprgscode As IntPtr
Public lprgelemdescParam As IntPtr
Public funckind As Integer
Public invkind As Integer
Public callconv As Integer
Public cParams As Short
Public cParamsOpt As Short
Public oVft As Short
Public cScodes As Short
Public elemdescFunc As ELEMDESC
Public wFuncFlags As UShort
End Structureimport ctypes
from ctypes import wintypes
class TYPEDESC(ctypes.Structure):
_fields_ = [
("Anonymous", _Anonymous_e__Union),
("vt", ctypes.c_ushort),
]
class ELEMDESC(ctypes.Structure):
_fields_ = [
("tdesc", TYPEDESC),
("Anonymous", _Anonymous_e__Union),
]
class FUNCDESC(ctypes.Structure):
_fields_ = [
("memid", ctypes.c_int),
("lprgscode", ctypes.c_void_p),
("lprgelemdescParam", ctypes.c_void_p),
("funckind", ctypes.c_int),
("invkind", ctypes.c_int),
("callconv", ctypes.c_int),
("cParams", ctypes.c_short),
("cParamsOpt", ctypes.c_short),
("oVft", ctypes.c_short),
("cScodes", ctypes.c_short),
("elemdescFunc", ELEMDESC),
("wFuncFlags", ctypes.c_ushort),
]#[repr(C)]
pub struct TYPEDESC {
pub Anonymous: _Anonymous_e__Union,
pub vt: u16,
}
#[repr(C)]
pub struct ELEMDESC {
pub tdesc: TYPEDESC,
pub Anonymous: _Anonymous_e__Union,
}
#[repr(C)]
pub struct FUNCDESC {
pub memid: i32,
pub lprgscode: *mut core::ffi::c_void,
pub lprgelemdescParam: *mut core::ffi::c_void,
pub funckind: i32,
pub invkind: i32,
pub callconv: i32,
pub cParams: i16,
pub cParamsOpt: i16,
pub oVft: i16,
pub cScodes: i16,
pub elemdescFunc: ELEMDESC,
pub wFuncFlags: u16,
}import "golang.org/x/sys/windows"
type TYPEDESC struct {
Anonymous _Anonymous_e__Union
vt uint16
}
type ELEMDESC struct {
tdesc TYPEDESC
Anonymous _Anonymous_e__Union
}
type FUNCDESC struct {
memid int32
lprgscode uintptr
lprgelemdescParam uintptr
funckind int32
invkind int32
callconv int32
cParams int16
cParamsOpt int16
oVft int16
cScodes int16
elemdescFunc ELEMDESC
wFuncFlags uint16
}type
TYPEDESC = record
Anonymous: _Anonymous_e__Union;
vt: Word;
end;
ELEMDESC = record
tdesc: TYPEDESC;
Anonymous: _Anonymous_e__Union;
end;
FUNCDESC = record
memid: Integer;
lprgscode: Pointer;
lprgelemdescParam: Pointer;
funckind: Integer;
invkind: Integer;
callconv: Integer;
cParams: Smallint;
cParamsOpt: Smallint;
oVft: Smallint;
cScodes: Smallint;
elemdescFunc: ELEMDESC;
wFuncFlags: Word;
end;const TYPEDESC = extern struct {
Anonymous: _Anonymous_e__Union,
vt: u16,
};
const ELEMDESC = extern struct {
tdesc: TYPEDESC,
Anonymous: _Anonymous_e__Union,
};
const FUNCDESC = extern struct {
memid: i32,
lprgscode: ?*anyopaque,
lprgelemdescParam: ?*anyopaque,
funckind: i32,
invkind: i32,
callconv: i32,
cParams: i16,
cParamsOpt: i16,
oVft: i16,
cScodes: i16,
elemdescFunc: ELEMDESC,
wFuncFlags: u16,
};type
TYPEDESC {.bycopy.} = object
Anonymous: _Anonymous_e__Union
vt: uint16
ELEMDESC {.bycopy.} = object
tdesc: TYPEDESC
Anonymous: _Anonymous_e__Union
FUNCDESC {.bycopy.} = object
memid: int32
lprgscode: pointer
lprgelemdescParam: pointer
funckind: int32
invkind: int32
callconv: int32
cParams: int16
cParamsOpt: int16
oVft: int16
cScodes: int16
elemdescFunc: ELEMDESC
wFuncFlags: uint16struct TYPEDESC
{
_Anonymous_e__Union Anonymous;
ushort vt;
}
struct ELEMDESC
{
TYPEDESC tdesc;
_Anonymous_e__Union Anonymous;
}
struct FUNCDESC
{
int memid;
void* lprgscode;
void* lprgelemdescParam;
int funckind;
int invkind;
int callconv;
short cParams;
short cParamsOpt;
short oVft;
short cScodes;
ELEMDESC elemdescFunc;
ushort wFuncFlags;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; FUNCDESC サイズ: 52 バイト(x86)
dim st, 13 ; 4byte整数×13(構造体サイズ 52 / 4 切り上げ)
; memid : INT (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; lprgscode : INT* (+4, 4byte) st.1 = 値 / 値 = st.1 (lpoke/lpeek も可)
; lprgelemdescParam : ELEMDESC* (+8, 4byte) varptr(st)+8 を基点に操作(4byte:入れ子/配列)
; funckind : FUNCKIND (+12, 4byte) st.3 = 値 / 値 = st.3 (lpoke/lpeek も可)
; invkind : INVOKEKIND (+16, 4byte) st.4 = 値 / 値 = st.4 (lpoke/lpeek も可)
; callconv : CALLCONV (+20, 4byte) st.5 = 値 / 値 = st.5 (lpoke/lpeek も可)
; cParams : SHORT (+24, 2byte) wpoke st,24,値 / 値 = wpeek(st,24)
; cParamsOpt : SHORT (+26, 2byte) wpoke st,26,値 / 値 = wpeek(st,26)
; oVft : SHORT (+28, 2byte) wpoke st,28,値 / 値 = wpeek(st,28)
; cScodes : SHORT (+30, 2byte) wpoke st,30,値 / 値 = wpeek(st,30)
; elemdescFunc : ELEMDESC (+32, 16byte) varptr(st)+32 を基点に操作(16byte:入れ子/配列)
; wFuncFlags : FUNCFLAGS (+48, 2byte) wpoke st,48,値 / 値 = wpeek(st,48)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; FUNCDESC サイズ: 88 バイト(x64)
dim st, 22 ; 4byte整数×22(構造体サイズ 88 / 4 切り上げ)
; memid : INT (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; lprgscode : INT* (+8, 8byte) qpoke st,8,値 / qpeek(st,8) ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; lprgelemdescParam : ELEMDESC* (+16, 8byte) varptr(st)+16 を基点に操作(8byte:入れ子/配列)
; funckind : FUNCKIND (+24, 4byte) st.6 = 値 / 値 = st.6 (lpoke/lpeek も可)
; invkind : INVOKEKIND (+28, 4byte) st.7 = 値 / 値 = st.7 (lpoke/lpeek も可)
; callconv : CALLCONV (+32, 4byte) st.8 = 値 / 値 = st.8 (lpoke/lpeek も可)
; cParams : SHORT (+36, 2byte) wpoke st,36,値 / 値 = wpeek(st,36)
; cParamsOpt : SHORT (+38, 2byte) wpoke st,38,値 / 値 = wpeek(st,38)
; oVft : SHORT (+40, 2byte) wpoke st,40,値 / 値 = wpeek(st,40)
; cScodes : SHORT (+42, 2byte) wpoke st,42,値 / 値 = wpeek(st,42)
; elemdescFunc : ELEMDESC (+48, 32byte) varptr(st)+48 を基点に操作(32byte:入れ子/配列)
; wFuncFlags : FUNCFLAGS (+80, 2byte) wpoke st,80,値 / 値 = wpeek(st,80)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global TYPEDESC
#field byte Anonymous 8
#field short vt
#endstruct
#defstruct global ELEMDESC
#field TYPEDESC tdesc
#field byte Anonymous 16
#endstruct
#defstruct global FUNCDESC
#field int memid
#field intptr lprgscode
#field intptr lprgelemdescParam
#field int funckind
#field int invkind
#field int callconv
#field short cParams
#field short cParamsOpt
#field short oVft
#field short cScodes
#field ELEMDESC elemdescFunc
#field short wFuncFlags
#endstruct
stdim st, FUNCDESC ; NSTRUCT 変数を確保
st->memid = 100
mes "memid=" + st->memid