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

FUNCDESC

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

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

フィールド

フィールドサイズx64x86説明
memidINT4+0+0この関数のメンバID(ディスパッチID)。
lprgscodeINT*8/4+8+4返しうるエラーコード配列へのポインタ。
lprgelemdescParamELEMDESC*8/4+16+8各パラメータの記述(ELEMDESC)配列へのポインタ。
funckindFUNCKIND4+24+12関数の種別(FUNC_VIRTUAL/DISPATCH等)。
invkindINVOKEKIND4+28+16呼び出し種別(INVOKE_FUNC/PROPERTYGET等)。
callconvCALLCONV4+32+20呼び出し規約(CC_STDCALL等)。
cParamsSHORT2+36+24パラメータの総数。
cParamsOptSHORT2+38+26省略可能なパラメータの数。-1で可変長引数。
oVftSHORT2+40+28仮想関数テーブル内のオフセット。
cScodesSHORT2+42+30lprgscodeに含まれるエラーコードの数。
elemdescFuncELEMDESC32/16+48+32関数の戻り値の型情報(ELEMDESC)。
wFuncFlagsFUNCFLAGS2+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 Structure
import 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: uint16
struct 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