X-Finder プログラミング メモ

X-Finderのプログラム関連のメモです。
エラー処理などは省いていますので、実装する際はSucceeded(等を用いて下さい。

■ライブラリのカラムを取得する

Windows7のライブラリのカラムの内容は IShellFolder2.GetDetailsOf では空になってしまいます。
X-Finderでは以下のようにMapColumnToSCIDとGetDetailsExを使ってカラムを取得しています。

1.IShellFolder2.MapColumnToSCID(iColumn, SHCOLUMNID);
カラムの番号(iColumn)から SHCOLUMNID を取得します。

2.IShellFolder2.GetDetailsEx(pidlCHILD, SHCOLUMNID, VARIANT);
SHCOLUMNID から VARIANT型でカラムの内容を取得します。

3.IPropertyUI.FormatForDisplay(fmtid, pid, PROPVARIANT, PUIFFDF_DEFAULT, pwszText, cchText);
PROPVARIANT型 から 文字列型でカラムの内容を取得します。

※MSDNではIPropertyUIは「Developers should use IPropertyDescription instead.」という事になっていますので、IPropertyDescription.FormatForDisplay か IPropertySystem.FormatForDisplay(Alloc) か API の PSFormatForDisplay(Alloc) を使用した方が良いと思います。ただ、どれも家のXP SP3では動作しないので、X-FinderではWindows2000から対応しているIPropertyUIを使用しています。
※IPropertyUIの取得方法
CoCreateInstance(CLSID_PropertiesUI, NULL, CLSCTX_INPROC, IPropertyUI, ...);
※3のFormatForDisplayを使用しないとWin7/Vistaの場合、属性が数字になったりします。XPまではVARIANTの型で文字、数字、日付で場合分けすればほとんどOKだと思います。

※VARIANT型からPROPVARIANT型を得るのに X-Finder では「TPropVariant(TVariantArg(VARIANT))」というキャストを用いています。もっと良い方法がありましたら教えてください。
※Delphi6PersonalではIShellFolder2の定義が違ってMapColumnToSCIDではなくMapNameToSCIDとなっています。また、IIDも違うのでX-Finderでは別にIShellFolder2を定義しています。