ホーム › System.WindowsProgramming › IMESTRUCT
IMESTRUCT
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| fnc | DWORD | 4 | +0 | +0 | IME機能(関数)コードを示す値。 |
| wParam | WPARAM | 8/4 | +8 | +4 | 汎用パラメータ(WPARAM)。fncにより意味が異なる。 |
| wCount | DWORD | 4 | +16 | +8 | 処理対象の要素数。 |
| dchSource | DWORD | 4 | +20 | +12 | ソースデータの文字オフセット。 |
| dchDest | DWORD | 4 | +24 | +16 | デスティネーションデータの文字オフセット。 |
| lParam1 | LPARAM | 8/4 | +32 | +20 | 追加パラメータ1(LPARAM)。 |
| lParam2 | LPARAM | 8/4 | +40 | +24 | 追加パラメータ2(LPARAM)。 |
| lParam3 | LPARAM | 8/4 | +48 | +28 | 追加パラメータ3(LPARAM)。 |
各言語での定義
#include <windows.h>
// IMESTRUCT (x64 56 / x86 32 バイト)
typedef struct IMESTRUCT {
DWORD fnc;
WPARAM wParam;
DWORD wCount;
DWORD dchSource;
DWORD dchDest;
LPARAM lParam1;
LPARAM lParam2;
LPARAM lParam3;
} IMESTRUCT;using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct IMESTRUCT
{
public uint fnc;
public UIntPtr wParam;
public uint wCount;
public uint dchSource;
public uint dchDest;
public IntPtr lParam1;
public IntPtr lParam2;
public IntPtr lParam3;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure IMESTRUCT
Public fnc As UInteger
Public wParam As UIntPtr
Public wCount As UInteger
Public dchSource As UInteger
Public dchDest As UInteger
Public lParam1 As IntPtr
Public lParam2 As IntPtr
Public lParam3 As IntPtr
End Structureimport ctypes
from ctypes import wintypes
class IMESTRUCT(ctypes.Structure):
_fields_ = [
("fnc", wintypes.DWORD),
("wParam", ctypes.c_size_t),
("wCount", wintypes.DWORD),
("dchSource", wintypes.DWORD),
("dchDest", wintypes.DWORD),
("lParam1", ctypes.c_ssize_t),
("lParam2", ctypes.c_ssize_t),
("lParam3", ctypes.c_ssize_t),
]#[repr(C)]
pub struct IMESTRUCT {
pub fnc: u32,
pub wParam: usize,
pub wCount: u32,
pub dchSource: u32,
pub dchDest: u32,
pub lParam1: isize,
pub lParam2: isize,
pub lParam3: isize,
}import "golang.org/x/sys/windows"
type IMESTRUCT struct {
fnc uint32
wParam uintptr
wCount uint32
dchSource uint32
dchDest uint32
lParam1 uintptr
lParam2 uintptr
lParam3 uintptr
}type
IMESTRUCT = record
fnc: DWORD;
wParam: NativeUInt;
wCount: DWORD;
dchSource: DWORD;
dchDest: DWORD;
lParam1: NativeInt;
lParam2: NativeInt;
lParam3: NativeInt;
end;const IMESTRUCT = extern struct {
fnc: u32,
wParam: usize,
wCount: u32,
dchSource: u32,
dchDest: u32,
lParam1: isize,
lParam2: isize,
lParam3: isize,
};type
IMESTRUCT {.bycopy.} = object
fnc: uint32
wParam: uint
wCount: uint32
dchSource: uint32
dchDest: uint32
lParam1: int
lParam2: int
lParam3: intstruct IMESTRUCT
{
uint fnc;
size_t wParam;
uint wCount;
uint dchSource;
uint dchDest;
ptrdiff_t lParam1;
ptrdiff_t lParam2;
ptrdiff_t lParam3;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; IMESTRUCT サイズ: 32 バイト(x86)
dim st, 8 ; 4byte整数×8(構造体サイズ 32 / 4 切り上げ)
; fnc : DWORD (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; wParam : WPARAM (+4, 4byte) st.1 = 値 / 値 = st.1 (lpoke/lpeek も可)
; wCount : DWORD (+8, 4byte) st.2 = 値 / 値 = st.2 (lpoke/lpeek も可)
; dchSource : DWORD (+12, 4byte) st.3 = 値 / 値 = st.3 (lpoke/lpeek も可)
; dchDest : DWORD (+16, 4byte) st.4 = 値 / 値 = st.4 (lpoke/lpeek も可)
; lParam1 : LPARAM (+20, 4byte) st.5 = 値 / 値 = st.5 (lpoke/lpeek も可)
; lParam2 : LPARAM (+24, 4byte) st.6 = 値 / 値 = st.6 (lpoke/lpeek も可)
; lParam3 : LPARAM (+28, 4byte) st.7 = 値 / 値 = st.7 (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; IMESTRUCT サイズ: 56 バイト(x64)
dim st, 14 ; 4byte整数×14(構造体サイズ 56 / 4 切り上げ)
; fnc : DWORD (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; wParam : WPARAM (+8, 8byte) qpoke st,8,値 / qpeek(st,8) ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; wCount : DWORD (+16, 4byte) st.4 = 値 / 値 = st.4 (lpoke/lpeek も可)
; dchSource : DWORD (+20, 4byte) st.5 = 値 / 値 = st.5 (lpoke/lpeek も可)
; dchDest : DWORD (+24, 4byte) st.6 = 値 / 値 = st.6 (lpoke/lpeek も可)
; lParam1 : LPARAM (+32, 8byte) qpoke st,32,値 / qpeek(st,32) ※IronHSPのみ。3.7/3.8は lpoke st,32,下位 : lpoke st,36,上位
; lParam2 : LPARAM (+40, 8byte) qpoke st,40,値 / qpeek(st,40) ※IronHSPのみ。3.7/3.8は lpoke st,40,下位 : lpoke st,44,上位
; lParam3 : LPARAM (+48, 8byte) qpoke st,48,値 / qpeek(st,48) ※IronHSPのみ。3.7/3.8は lpoke st,48,下位 : lpoke st,52,上位
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global IMESTRUCT
#field int fnc
#field intptr wParam
#field int wCount
#field int dchSource
#field int dchDest
#field intptr lParam1
#field intptr lParam2
#field intptr lParam3
#endstruct
stdim st, IMESTRUCT ; NSTRUCT 変数を確保
st->fnc = 100
mes "fnc=" + st->fnc