Win32 API 日本語リファレンス
ホームStorage.IndexServer › STAT_CHUNK

STAT_CHUNK

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

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

フィールド

フィールドサイズx64x86説明
idChunkDWORD4+0+0チャンク識別子です。チャンク識別子は、現在の IFilter インターフェイスのインスタンス内で一意でなければなりません。また、チャンク識別子は昇順でなければなりません。チャンクに番号を付ける順序は、それらがソースドキュメント内に現れる順序と対応している必要があります。検索エンジンによっては、さまざまなプロパティを持つチャンク同士の近接性を利用できるものがあります。その場合、異なるプロパティを持つチャンクが出力される順序は検索エンジンにとって重要になります。
breakTypeCHUNK_BREAKTYPE4+4+4直前のチャンクと現在のチャンクを区切る区切りの種類です。値は CHUNK_BREAKTYPE 列挙型のものです。
flagsCHUNKSTATE4+8+8このチャンクがテキスト型のプロパティを含むのか、値型のプロパティを含むのかを示します。フラグの値は CHUNKSTATE 列挙型から取得されます。CHUNK_TEXT フラグが設定されている場合は、IFilter::GetText を使用してチャンクの内容を単語の並びとして取得します。CHUNK_VALUE フラグが設定されている場合は、IFilter::GetValue を使用して値を取得し、単一のプロパティ値として扱います。同じ内容をテキストとしても値としても扱うようにフィルターが指定する場合は、そのチャンクを 2 つの異なるチャンクとして 2 回出力し、それぞれで一方のフラグを設定する必要があります。
localeDWORD4+12+12テキストのチャンクに関連付けられた言語およびサブ言語です。チャンクのロケールは、テキストの適切な単語分割を行うためにドキュメントインデクサーによって使用されます。チャンクがテキスト型でもなく、データ型が VT_LPWSTRVT_LPSTRVT_BSTR の値型でもない場合、このフィールドは無視されます。
attributeFULLPROPSPEC32/24+16+16チャンクに適用されるプロパティです。FULLPROPSPEC を参照してください。同一のテキストに複数のプロパティを持たせる必要がある場合、フィルターはプロパティごとに別々のチャンクとしてそのテキストを出力する必要があります。
idChunkSourceDWORD4+48+40

チャンクのソースの ID です。idChunkSource メンバーの値は、チャンクの性質によって次のように異なります。

  • チャンクがテキスト型のプロパティである場合、idChunkSource メンバーの値は idChunk メンバーの値と同じでなければなりません。
  • チャンクがテキストの内容から派生した内部的な値型のプロパティである場合、idChunkSource メンバーの値は、その派生元となったテキスト型チャンクのチャンク ID になります。
  • フィルターの属性が内部的な値型のプロパティのみを返すように指定している場合、現在の内部的な値型プロパティの派生元となるコンテンツチャンクは存在しません。この場合、idChunkSource メンバーの値は 0 (無効なチャンクを表します) に設定しなければなりません。
cwcStartSourceDWORD4+52+44派生チャンクのソーステキストが、ソースチャンク内のどこから始まるかを示すオフセットです。
cwcLenSourceDWORD4+56+48現在のチャンクの派生元となったソーステキストの長さ (文字数) です。値が 0 の場合は、ソーステキストと派生テキストが 1 文字ずつ対応していることを示します。0 以外の値は、そのような直接的な対応が存在しないことを意味します。

公式ドキュメント

チャンクの特性を記述します。

解説(Remarks)

最後の 3 つのメンバー (idChunkSourcecwcStartSourcecwcLenSource) は、派生チャンク、つまりテキストのある部分へ逆にマッピングできるチャンクのソースを記述するために使用されます。たとえば、章の見出しはテキスト型のプロパティであると同時に、内部的な値型のプロパティ (見出し) にもなり得ます。この場合、値型のプロパティである「見出し」が派生チャンクになります。現在の値型チャンク (内部的な値型プロパティに由来するもの) のテキストが何らかのテキスト型チャンクから派生している場合、そのテキストは複数回出力しなければなりません。

次の一節は、書籍においてこれがどのように起こり得るかの例です。

The small detective exclaimed, "C'est fini!"

Confessions

The room was silent for several minutes. After thinking very hard about it, the young woman asked, "But how did you know?"

この一節は、次のようにチャンクへ分割される可能性があります。

ID Text BreakType Flags Locale Attribute
1 The small dete N/A CHUNK_TEXT ENGLISH_UK CONTENT
2 ctive exclaimed, CHUNK_NO_BREAK N/A N/A N/A
3 "C'est fini!" CHUNK_EOW CHUNK_TEXT FRENCH_BELGIAN CONTENT
4 Confessions CHUNK_EOC CHUNK_TEXT ENGLISH_UK CHAPTER_NAMES
5 Confessions CHUNK_EOP CHUNK_TEXT ENGLISH_UK CONTENT
6 The room was silent for several minutes. CHUNK_EOP CHUNK_TEXT ENGLISH_UK CONTENT
7 After thinking very hard about it, the young woman asked, "But how did you know?" CHUNK_EOS CHUNK_TEXT ENGLISH_UK CONTENT

idChunkSourcecwcStartSourcecwcLenSource が提供する情報は、ヒット箇所を強調表示する検索エンジンにとって有用です。内部的な値型のプロパティに対してクエリが実行された場合、検索エンジンは、その内部的な値型プロパティのテキストの派生元となった元のテキストを強調表示します。たとえば C++ コードのフィルターでは、内部的な値型プロパティ「関数定義」に対して MyFunction を検索したとき、ブラウザーはファイル内の関数ヘッダーを強調表示します。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での定義

#include <windows.h>

// PROPSPEC  (x64 16 / x86 8 バイト)
typedef struct PROPSPEC {
    PROPSPEC_KIND ulKind;
    _Anonymous_e__Union Anonymous;
} PROPSPEC;

// FULLPROPSPEC  (x64 32 / x86 24 バイト)
typedef struct FULLPROPSPEC {
    GUID guidPropSet;
    PROPSPEC psProperty;
} FULLPROPSPEC;

// STAT_CHUNK  (x64 64 / x86 52 バイト)
typedef struct STAT_CHUNK {
    DWORD idChunk;
    CHUNK_BREAKTYPE breakType;
    CHUNKSTATE flags;
    DWORD locale;
    FULLPROPSPEC attribute;
    DWORD idChunkSource;
    DWORD cwcStartSource;
    DWORD cwcLenSource;
} STAT_CHUNK;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct PROPSPEC
{
    public uint ulKind;
    public _Anonymous_e__Union Anonymous;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct FULLPROPSPEC
{
    public Guid guidPropSet;
    public PROPSPEC psProperty;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct STAT_CHUNK
{
    public uint idChunk;
    public int breakType;
    public int flags;
    public uint locale;
    public FULLPROPSPEC attribute;
    public uint idChunkSource;
    public uint cwcStartSource;
    public uint cwcLenSource;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure PROPSPEC
    Public ulKind As UInteger
    Public Anonymous As _Anonymous_e__Union
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure FULLPROPSPEC
    Public guidPropSet As Guid
    Public psProperty As PROPSPEC
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure STAT_CHUNK
    Public idChunk As UInteger
    Public breakType As Integer
    Public flags As Integer
    Public locale As UInteger
    Public attribute As FULLPROPSPEC
    Public idChunkSource As UInteger
    Public cwcStartSource As UInteger
    Public cwcLenSource As UInteger
End Structure
import ctypes
from ctypes import wintypes

class PROPSPEC(ctypes.Structure):
    _fields_ = [
        ("ulKind", wintypes.DWORD),
        ("Anonymous", _Anonymous_e__Union),
    ]

class FULLPROPSPEC(ctypes.Structure):
    _fields_ = [
        ("guidPropSet", GUID),
        ("psProperty", PROPSPEC),
    ]

class STAT_CHUNK(ctypes.Structure):
    _fields_ = [
        ("idChunk", wintypes.DWORD),
        ("breakType", ctypes.c_int),
        ("flags", ctypes.c_int),
        ("locale", wintypes.DWORD),
        ("attribute", FULLPROPSPEC),
        ("idChunkSource", wintypes.DWORD),
        ("cwcStartSource", wintypes.DWORD),
        ("cwcLenSource", wintypes.DWORD),
    ]
#[repr(C)]
pub struct PROPSPEC {
    pub ulKind: u32,
    pub Anonymous: _Anonymous_e__Union,
}

#[repr(C)]
pub struct FULLPROPSPEC {
    pub guidPropSet: GUID,
    pub psProperty: PROPSPEC,
}

#[repr(C)]
pub struct STAT_CHUNK {
    pub idChunk: u32,
    pub breakType: i32,
    pub flags: i32,
    pub locale: u32,
    pub attribute: FULLPROPSPEC,
    pub idChunkSource: u32,
    pub cwcStartSource: u32,
    pub cwcLenSource: u32,
}
import "golang.org/x/sys/windows"

type PROPSPEC struct {
	ulKind uint32
	Anonymous _Anonymous_e__Union
}

type FULLPROPSPEC struct {
	guidPropSet windows.GUID
	psProperty PROPSPEC
}

type STAT_CHUNK struct {
	idChunk uint32
	breakType int32
	flags int32
	locale uint32
	attribute FULLPROPSPEC
	idChunkSource uint32
	cwcStartSource uint32
	cwcLenSource uint32
}
type
  PROPSPEC = record
    ulKind: DWORD;
    Anonymous: _Anonymous_e__Union;
  end;

  FULLPROPSPEC = record
    guidPropSet: TGUID;
    psProperty: PROPSPEC;
  end;

  STAT_CHUNK = record
    idChunk: DWORD;
    breakType: Integer;
    flags: Integer;
    locale: DWORD;
    attribute: FULLPROPSPEC;
    idChunkSource: DWORD;
    cwcStartSource: DWORD;
    cwcLenSource: DWORD;
  end;
const PROPSPEC = extern struct {
    ulKind: u32,
    Anonymous: _Anonymous_e__Union,
};

const FULLPROPSPEC = extern struct {
    guidPropSet: GUID,
    psProperty: PROPSPEC,
};

const STAT_CHUNK = extern struct {
    idChunk: u32,
    breakType: i32,
    flags: i32,
    locale: u32,
    attribute: FULLPROPSPEC,
    idChunkSource: u32,
    cwcStartSource: u32,
    cwcLenSource: u32,
};
type
  PROPSPEC {.bycopy.} = object
    ulKind: uint32
    Anonymous: _Anonymous_e__Union

  FULLPROPSPEC {.bycopy.} = object
    guidPropSet: GUID
    psProperty: PROPSPEC

  STAT_CHUNK {.bycopy.} = object
    idChunk: uint32
    breakType: int32
    flags: int32
    locale: uint32
    attribute: FULLPROPSPEC
    idChunkSource: uint32
    cwcStartSource: uint32
    cwcLenSource: uint32
struct PROPSPEC
{
    uint ulKind;
    _Anonymous_e__Union Anonymous;
}

struct FULLPROPSPEC
{
    GUID guidPropSet;
    PROPSPEC psProperty;
}

struct STAT_CHUNK
{
    uint idChunk;
    int breakType;
    int flags;
    uint locale;
    FULLPROPSPEC attribute;
    uint idChunkSource;
    uint cwcStartSource;
    uint cwcLenSource;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; STAT_CHUNK サイズ: 52 バイト(x86)
dim st, 13    ; 4byte整数×13(構造体サイズ 52 / 4 切り上げ)
; idChunk : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; breakType : CHUNK_BREAKTYPE (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; flags : CHUNKSTATE (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; locale : DWORD (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; attribute : FULLPROPSPEC (+16, 24byte)  varptr(st)+16 を基点に操作(24byte:入れ子/配列)
; idChunkSource : DWORD (+40, 4byte)  st.10 = 値  /  値 = st.10   (lpoke/lpeek も可)
; cwcStartSource : DWORD (+44, 4byte)  st.11 = 値  /  値 = st.11   (lpoke/lpeek も可)
; cwcLenSource : DWORD (+48, 4byte)  st.12 = 値  /  値 = st.12   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; STAT_CHUNK サイズ: 64 バイト(x64)
dim st, 16    ; 4byte整数×16(構造体サイズ 64 / 4 切り上げ)
; idChunk : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; breakType : CHUNK_BREAKTYPE (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; flags : CHUNKSTATE (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; locale : DWORD (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; attribute : FULLPROPSPEC (+16, 32byte)  varptr(st)+16 を基点に操作(32byte:入れ子/配列)
; idChunkSource : DWORD (+48, 4byte)  st.12 = 値  /  値 = st.12   (lpoke/lpeek も可)
; cwcStartSource : DWORD (+52, 4byte)  st.13 = 値  /  値 = st.13   (lpoke/lpeek も可)
; cwcLenSource : DWORD (+56, 4byte)  st.14 = 値  /  値 = st.14   (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 PROPSPEC
    #field int ulKind
    #field byte Anonymous 8
#endstruct

#defstruct global FULLPROPSPEC
    #field GUID guidPropSet
    #field PROPSPEC psProperty
#endstruct

#defstruct global STAT_CHUNK
    #field int idChunk
    #field int breakType
    #field int flags
    #field int locale
    #field FULLPROPSPEC attribute
    #field int idChunkSource
    #field int cwcStartSource
    #field int cwcLenSource
#endstruct

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