IShellItemArray
COM公式ドキュメント
シェルアイテム配列を作成および操作するためのメソッドを公開します。
解説(Remarks)
シェルアイテム配列は、次のいずれかの関数を使用して作成できます。
メソッド 7
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
指定されたハンドラーを通じてオブジェクトにバインドします。
| pbc | IBindCtx* | in | バインドコンテキストオブジェクトの IBindCtx インターフェースへのポインター。 |
| bhid | GUID* | in | ハンドラーを決定する、Shlguid.h で定義された次のいずれかの値。 BHID_SFUIObject使用を GetUIObjectOf に限定します。このハンドラー型は、すべてのアイテムが同じフォルダー内にあるフラットなアイテム配列に対してのみ使用してください。 BHID_DataObjectWindows Vista で導入: アイテムまたはアイテムの配列で使用する IDataObject オブジェクトを取得します。このハンドラー型は、フラットなデータオブジェクト、または SHCreateShellItemArrayFromDataObject によって作成されたアイテム配列に対してのみ使用してください。 BHID_AssociationArrayWindows Vista で導入: アイテムまたはアイテムの配列で使用する IQueryAssociations オブジェクトを取得します。これは IShellItemArray 内の最初のアイテムに対する関連付け配列オブジェクトのみを取得します。 |
| riid | GUID* | in | 取得するオブジェクト型の IID。 |
| ppvOut | void** | out | このメソッドが返るとき、rbhid で指定されたハンドラーによって返される、riid で指定されたオブジェクトが格納されます。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
プロパティストアを取得します。
| flags | GETPROPERTYSTOREFLAGS | in | GETPROPERTYSTOREFLAGS 定数のいずれか。 |
| riid | GUID* | in | 取得するオブジェクト型の IID。 |
| ppv | void** | out | このメソッドが返るとき、riid で要求されたインターフェースポインターが格納されます。これは通常、IPropertyStore または IPropertyStoreCapabilities です。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
このメソッドは、シェルアイテム配列内のすべてのアイテムから収集したプロパティを集約する読み取り専用のプロパティストアを取得するために使用します。
シェルアイテム配列内に複数のアイテムがある場合、結果として得られるプロパティストアは、各プロパティによって決定される一連の規則に従って各アイテムの値を集約します。プロパティストアから読み取られる値は、集約の前に CoerceToCanonicalValue で説明されている正規形に変換されます。IPropertyStore::GetValue の呼び出しの出力は、次のように計算されます。
- 単一値プロパティは、プロパティ記述スキーマの 集約型 文字列で指定された規則に従います。
-
- 集約型が "DateRange" でプロパティ型が filetime の場合、2 つの値の VT_VECTOR | VT_FILETIME を返します。値が同一であった場合は VT_FILETIME 値を返します。
- 集約型が "First" の場合、最初の空でない値を返します。
- 集約型が "Sum" の場合、合計を返します。
- 集約型が "Average" の場合、すべての空でない値の平均を返します。
- 集約型が "Minimum" の場合、最小値を返します。
- 集約型が "Union" でプロパティ型が文字列の場合、値の和集合を含む VT_VECTOR | VT_LPWSTR を返します。値の順序は規定されていません。
- 集約型が未指定、非互換、または "Default" の場合、配列内のすべてのアイテムで同一であればその単一の値を返し、一部のアイテム間で値が異なる場合はそれを示す特別な値を返します。特別な値は、"Multiple" と "Values" という 2 つの文字列を含む VT_VECTOR | VT_LPWSTR です。呼び出し側アプリケーションは、GetTypeFlags がプロパティを単一値と示している場合に VT_VECTOR | VT_LPWSTR を確認することで、この特別な値をチェックする必要があります。
- 複数値の文字列プロパティは、それらの文字列の積集合を返します。順序は規定されていません。
呼び出し側アプリケーションは、個々のシェルアイテムとそのプロパティストアに直接アクセスすることで、他の集約動作を実現できます。IPropertyStore::GetCount、IPropertyStore::GetAt、GetPropertyStore を参照してください。
シェルアイテムの配列への書き込みは、IFileOperation API を通じてサポートされます。
シェルアイテム配列内のアイテムのプロパティ記述リストを取得します。
| keyType | PROPERTYKEY* | in | 取得するプロパティリストを指定する PROPERTYKEY 構造体への参照。 |
| riid | GUID* | in | 取得するオブジェクト型の IID。 |
| ppv | void** | out | このメソッドが返るとき、riid で要求されたインターフェースが格納されます。これは通常、IPropertyDescriptionList です。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
この関数は、一連のシェルアイテムに適用可能なプロパティのリストを決定するために使用します。リストの型は PROPERTYKEY 構造体で指定します。サポートされるリスト型には次のものが含まれますが、これらに限定されません。
- PKEY_PropList_PreviewDetails
- PKEY_PropList_PreviewTitle
- PKEY_PropList_FullDetails
- PKEY_PropList_TileInfo
- PKEY_PropList_ExtendedTileInfo
- PKEY_PropList_InfoTip
- PKEY_PropList_QuickTip
- PKEY_PropList_FileOperationPrompt
- PKEY_PropList_ConflictPrompt
- PKEY_PropList_SetDefaultsFor
- PKEY_PropList_NonPersonal
- PKEY_NewMenuPreferredTypes
- PKEY_NewMenuAllowedTypes
IShellItemArray に含まれるアイテムのセットの属性を取得します。
| AttribFlags | SIATTRIBFLAGS | in | 配列に単一のアイテムが含まれる場合、このメソッドは GetAttributes と同じ結果を提供します。ただし、配列に複数のアイテムが含まれる場合、すべてのアイテムの属性セットが単一の属性セットに結合され、psfgaoAttribs が指す値に返されます。このパラメーターは、その最終的な属性セットの決定方法を定義するために、次のいずれかの値を取ります。 SIATTRIBFLAGS_AND (0x00000001)0x00000001。配列に複数のアイテムがある場合、ビットごとの AND を使用してアイテム間で属性を結合します。たとえば、配列に 2 つのアイテムが含まれ、一方のアイテムは移動可能 (SFGAO_CANMOVE) で他方は移動できない場合、このメソッドはその属性ビットに対して (1 & 0) つまり 0 を返します。 SIATTRIBFLAGS_OR (0x00000002)0x00000002。配列に複数のアイテムがある場合、ビットごとの OR を使用してアイテム間で属性を結合します。たとえば、配列に 2 つのアイテムが含まれ、一方のアイテムは移動可能 (SFGAO_CANMOVE) で他方は移動できない場合、このメソッドはその属性ビットに対して (1 | 0) つまり 1 を返します。 SIATTRIBFLAGS_APPCOMPAT (0x00000003)0x00000003。属性を Shell データソースから直接取得します。この値を使用するには、シェルアイテム配列が、子 PIDL の配列としてその内容を指定した IShellFolder として初期化されている必要があります。 SIATTRIBFLAGS_MASK (0x00000003)0x00000003。SIATTRIBFLAGS_AND、SIATTRIBFLAGS_OR、SIATTRIBFLAGS_APPCOMPAT のマスク。通常、呼び出し側はこの値を使用しません。 SIATTRIBFLAGS_ALLITEMS (0x00004000)0x00004000。Windows 7 以降。配列内のすべてのアイテムを調べて属性を計算します。これは大きな配列ではパフォーマンスの低下を招く可能性があるため、必要な場合にのみ使用してください。このフラグを渡すケースは極めてまれです。詳細は「解説」を参照してください。 |
| sfgaoMask | SFGAO_FLAGS | in | 要求する特定の属性を指定するマスク。1 つ以上の SFGAO 値のビットごとの OR。 |
| psfgaoAttribs | SFGAO_FLAGS* | out | このメソッドが正常に返ったとき、要求された属性の値を含むビットマップ。 |
戻り値
型: HRESULT
返された属性が sfgaoMask で要求されたものと完全に一致する場合は S_OK、属性が完全には一致しない場合は S_FALSE、それ以外の場合は標準の COM エラー値を返します。
解説(Remarks)
シェルアイテム配列は、個々の属性が決定された後にそれらをキャッシュします。
このメソッドは、配列を走査して属性情報を収集する際、ある属性の値が確定して以降は通常その属性の調査を停止します。たとえば、SIATTRIBFLAGS_AND フラグが設定されている場合、あるアイテムで属性が設定されていない (値が 0) ことが判明した後は、AND 演算の結果が常に 0 になるため、他のアイテムでその属性値を調べ続ける必要はありません。したがって、最終的な属性セットは通常、配列の最初の数個のアイテムのみを調べることで計算され、それだけで最終値を得るのに十分です。配列内のすべてのアイテムを調べる必要がある場合は、SIATTRIBFLAGS_ALLITEMS フラグを設定します。ただし、これはメソッドの戻りをかなり遅くする可能性があるため、理由なく設定しないでください。
指定された IShellItem 配列内のアイテムの数を取得します。
| pdwNumItems | DWORD* | out | このメソッドが返るとき、IShellItemArray 内のアイテムの数が格納されます。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
IShellItemArray 内の指定されたインデックスのアイテムを取得します。
| dwIndex | DWORD | in | IShellItemArray 内で要求される IShellItem のインデックス。 |
| ppsi | IShellItem** | out | このメソッドが返るとき、要求された IShellItem ポインターが格納されます。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
要求されたインデックスが IShellItemArray の範囲外である場合、この関数は E_FAIL を返します。
配列内のアイテムの列挙子を取得します。
| ppenumShellItems | IEnumShellItems** | out | このメソッドが返るとき、配列内の シェルアイテム を列挙する IEnumShellItems ポインターが格納されます。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IShellItemArray "{B63EA76D-1F85-456F-A19C-48159EFA858B}" #usecom global IShellItemArray IID_IShellItemArray "{}" #comfunc global IShellItemArray_BindToHandler 3 sptr,var,var,sptr #comfunc global IShellItemArray_GetPropertyStore 4 int,var,sptr #comfunc global IShellItemArray_GetPropertyDescriptionList 5 var,var,sptr #comfunc global IShellItemArray_GetAttributes 6 int,int,var #comfunc global IShellItemArray_GetCount 7 var #comfunc global IShellItemArray_GetItemAt 8 int,sptr #comfunc global IShellItemArray_EnumItems 9 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IShellItemArray "{B63EA76D-1F85-456F-A19C-48159EFA858B}" #usecom global IShellItemArray IID_IShellItemArray "{}" #comfunc global IShellItemArray_BindToHandler 3 sptr,sptr,sptr,sptr #comfunc global IShellItemArray_GetPropertyStore 4 int,sptr,sptr #comfunc global IShellItemArray_GetPropertyDescriptionList 5 sptr,sptr,sptr #comfunc global IShellItemArray_GetAttributes 6 int,int,sptr #comfunc global IShellItemArray_GetCount 7 sptr #comfunc global IShellItemArray_GetItemAt 8 int,sptr #comfunc global IShellItemArray_EnumItems 9 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。