Win32 API 日本語リファレンス
ホームMedia.Speech › SPPARSEINFO

SPPARSEINFO

構造体
サイズx64: 80 バイト / x86: 56 バイト

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

フィールド

フィールドサイズx64x86説明
cbSizeDWORD4+0+0この構造体のサイズをバイトで示す。
hRuleSPRULEHANDLE8/4+8+4解析に使われたルールのハンドル(SPRULEHANDLE)。
ullAudioStreamPositionULONGLONG8+16+8解析対象音声の開始位置をストリームバイトオフセットで示す。
ulAudioSizeDWORD4+24+16解析対象音声のバイト数。
cTransitionsDWORD4+28+20解析経路の遷移数。
pPathSPPATHENTRY*8/4+32+24解析経路エントリ(SPPATHENTRY)配列へのポインタ。
SREngineIDGUID16+40+28認識エンジンを識別するGUID。
ulSREnginePrivateDataSizeDWORD4+56+44エンジン固有データのバイト数。
pSREnginePrivateDataBYTE*8/4+64+48エンジン固有データへのポインタ。NULL可。
fHypothesisBOOL4+72+52暫定(仮説)結果ならTRUEとなる真偽値。

各言語での定義

#include <windows.h>

// SPPARSEINFO  (x64 80 / x86 56 バイト)
typedef struct SPPARSEINFO {
    DWORD cbSize;
    SPRULEHANDLE hRule;
    ULONGLONG ullAudioStreamPosition;
    DWORD ulAudioSize;
    DWORD cTransitions;
    SPPATHENTRY* pPath;
    GUID SREngineID;
    DWORD ulSREnginePrivateDataSize;
    BYTE* pSREnginePrivateData;
    BOOL fHypothesis;
} SPPARSEINFO;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct SPPARSEINFO
{
    public uint cbSize;
    public IntPtr hRule;
    public ulong ullAudioStreamPosition;
    public uint ulAudioSize;
    public uint cTransitions;
    public IntPtr pPath;
    public Guid SREngineID;
    public uint ulSREnginePrivateDataSize;
    public IntPtr pSREnginePrivateData;
    [MarshalAs(UnmanagedType.Bool)] public bool fHypothesis;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure SPPARSEINFO
    Public cbSize As UInteger
    Public hRule As IntPtr
    Public ullAudioStreamPosition As ULong
    Public ulAudioSize As UInteger
    Public cTransitions As UInteger
    Public pPath As IntPtr
    Public SREngineID As Guid
    Public ulSREnginePrivateDataSize As UInteger
    Public pSREnginePrivateData As IntPtr
    <MarshalAs(UnmanagedType.Bool)> Public fHypothesis As Boolean
End Structure
import ctypes
from ctypes import wintypes

class SPPARSEINFO(ctypes.Structure):
    _fields_ = [
        ("cbSize", wintypes.DWORD),
        ("hRule", ctypes.c_void_p),
        ("ullAudioStreamPosition", ctypes.c_ulonglong),
        ("ulAudioSize", wintypes.DWORD),
        ("cTransitions", wintypes.DWORD),
        ("pPath", ctypes.c_void_p),
        ("SREngineID", GUID),
        ("ulSREnginePrivateDataSize", wintypes.DWORD),
        ("pSREnginePrivateData", ctypes.c_void_p),
        ("fHypothesis", wintypes.BOOL),
    ]
#[repr(C)]
pub struct SPPARSEINFO {
    pub cbSize: u32,
    pub hRule: *mut core::ffi::c_void,
    pub ullAudioStreamPosition: u64,
    pub ulAudioSize: u32,
    pub cTransitions: u32,
    pub pPath: *mut core::ffi::c_void,
    pub SREngineID: GUID,
    pub ulSREnginePrivateDataSize: u32,
    pub pSREnginePrivateData: *mut core::ffi::c_void,
    pub fHypothesis: i32,
}
import "golang.org/x/sys/windows"

type SPPARSEINFO struct {
	cbSize uint32
	hRule uintptr
	ullAudioStreamPosition uint64
	ulAudioSize uint32
	cTransitions uint32
	pPath uintptr
	SREngineID windows.GUID
	ulSREnginePrivateDataSize uint32
	pSREnginePrivateData uintptr
	fHypothesis int32
}
type
  SPPARSEINFO = record
    cbSize: DWORD;
    hRule: Pointer;
    ullAudioStreamPosition: UInt64;
    ulAudioSize: DWORD;
    cTransitions: DWORD;
    pPath: Pointer;
    SREngineID: TGUID;
    ulSREnginePrivateDataSize: DWORD;
    pSREnginePrivateData: Pointer;
    fHypothesis: BOOL;
  end;
const SPPARSEINFO = extern struct {
    cbSize: u32,
    hRule: ?*anyopaque,
    ullAudioStreamPosition: u64,
    ulAudioSize: u32,
    cTransitions: u32,
    pPath: ?*anyopaque,
    SREngineID: GUID,
    ulSREnginePrivateDataSize: u32,
    pSREnginePrivateData: ?*anyopaque,
    fHypothesis: i32,
};
type
  SPPARSEINFO {.bycopy.} = object
    cbSize: uint32
    hRule: pointer
    ullAudioStreamPosition: uint64
    ulAudioSize: uint32
    cTransitions: uint32
    pPath: pointer
    SREngineID: GUID
    ulSREnginePrivateDataSize: uint32
    pSREnginePrivateData: pointer
    fHypothesis: int32
struct SPPARSEINFO
{
    uint cbSize;
    void* hRule;
    ulong ullAudioStreamPosition;
    uint ulAudioSize;
    uint cTransitions;
    void* pPath;
    GUID SREngineID;
    uint ulSREnginePrivateDataSize;
    void* pSREnginePrivateData;
    int fHypothesis;
}

HSP用 定義

HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; SPPARSEINFO サイズ: 56 バイト(x86)
dim st, 14    ; 4byte整数×14(構造体サイズ 56 / 4 切り上げ)
; cbSize : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; hRule : SPRULEHANDLE (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; ullAudioStreamPosition : ULONGLONG (+8, 8byte)  qpoke st,8,値 / qpeek(st,8)  ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; ulAudioSize : DWORD (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; cTransitions : DWORD (+20, 4byte)  st.5 = 値  /  値 = st.5   (lpoke/lpeek も可)
; pPath : SPPATHENTRY* (+24, 4byte)  varptr(st)+24 を基点に操作(4byte:入れ子/配列)
; SREngineID : GUID (+28, 16byte)  varptr(st)+28 を基点に操作(16byte:入れ子/配列)
; ulSREnginePrivateDataSize : DWORD (+44, 4byte)  st.11 = 値  /  値 = st.11   (lpoke/lpeek も可)
; pSREnginePrivateData : BYTE* (+48, 4byte)  st.12 = 値  /  値 = st.12   (lpoke/lpeek も可)
; fHypothesis : BOOL (+52, 4byte)  st.13 = 値  /  値 = st.13   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; SPPARSEINFO サイズ: 80 バイト(x64)
dim st, 20    ; 4byte整数×20(構造体サイズ 80 / 4 切り上げ)
; cbSize : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; hRule : SPRULEHANDLE (+8, 8byte)  qpoke st,8,値 / qpeek(st,8)  ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; ullAudioStreamPosition : ULONGLONG (+16, 8byte)  qpoke st,16,値 / qpeek(st,16)  ※IronHSPのみ。3.7/3.8は lpoke st,16,下位 : lpoke st,20,上位
; ulAudioSize : DWORD (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; cTransitions : DWORD (+28, 4byte)  st.7 = 値  /  値 = st.7   (lpoke/lpeek も可)
; pPath : SPPATHENTRY* (+32, 8byte)  varptr(st)+32 を基点に操作(8byte:入れ子/配列)
; SREngineID : GUID (+40, 16byte)  varptr(st)+40 を基点に操作(16byte:入れ子/配列)
; ulSREnginePrivateDataSize : DWORD (+56, 4byte)  st.14 = 値  /  値 = st.14   (lpoke/lpeek も可)
; pSREnginePrivateData : BYTE* (+64, 8byte)  qpoke st,64,値 / qpeek(st,64)  ※IronHSPのみ。3.7/3.8は lpoke st,64,下位 : lpoke st,68,上位
; fHypothesis : BOOL (+72, 4byte)  st.18 = 値  /  値 = st.18   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global GUID, pack=1
    #field int Data1
    #field short Data2
    #field short Data3
    #field byte Data4 8
#endstruct

#defstruct global SPPARSEINFO
    #field int cbSize
    #field intptr hRule
    #field int64 ullAudioStreamPosition
    #field int ulAudioSize
    #field int cTransitions
    #field intptr pPath
    #field GUID SREngineID
    #field int ulSREnginePrivateDataSize
    #field intptr pSREnginePrivateData
    #field bool fHypothesis
#endstruct

stdim st, SPPARSEINFO        ; NSTRUCT 変数を確保
st->cbSize = 100
mes "cbSize=" + st->cbSize