Chapter.19

ドキュメントプロパティ

2006/7/10
 ・FMTIDのメディアプロパティに関する説明を修正。

1.ドキュメントプロパティ

この章で扱うドキュメントプロパティとは、下図で示すようにファイルのプロパティでカスタムタブや概要タブに表示される内容のことです。
ファイルプロパティのカスタムタブ ファイルプロパティの概要タブ
この内容のことをOLEの世界では単純にプロパティと呼んでいます。そして、プロパティをグループ化したものをプロパティセットと呼んでいます。
上図ではタイトルや表題がプロパティ、タブ全体がプロパティセットということになります。

これらドキュメントプロパティを読み取るサンプルソースです。例によってVB.NETとC#を用意しました。

VB.NETサンプルソース:chap19.vb.lzh (38KB 2006/6/12)
C#サンプルソース:chap19.cs.lzh (38KB 2006/6/12)

なお、VB.NETでは符号なし整数を扱うことが出来ないため、上の二つは完全に同じ物ではありません。

このサンプルではドキュメントプロパティを書き込むことが出来ないため、実際にプロパティのデータを更新して確認するには、上記のファイルのプロパティを使用して更新してください。


2.IPropertySetStorageとIPropertyStorage

プロパティはプロパティセットに含まれています。そのため、まずはプロパティセットを扱うインターフェースを構造化ストレージオブジェクトから取得する必要があります。 プロパティセットを扱うインターフェースはIPropertySetStorageです。 このインターフェースはルートストレージに実装されているため、ルートストレージに対してQueryInterfaceすることにより取得できます。

プロパティセットはFMTIDと呼ばれる識別子で管理されており、このFMTIDによりプロパティセットで扱う内容が異なります。 FMTIDは実際にはGUIDの別名です。 以下にOLEで定義されたFMTIDを挙げます。
FMTID
GUID
概要
FMTID_SummaryInformation
{F29F85E0-4FF9-1068-AB91-08002B27B3D9}
オブジェクトの概要を格納します。ファイルのプロパティで概要タブで扱うことのできるプロパティセットです。
FMTID_DocSummaryInformation
{D5CDD502-2E9C-101B-9397-08002B2CF9AE}
ドキュメントの概要を格納します。アプリケーション自体が使用するプロパティセットです。例えば、ワード文書では文字数、行数およびページ数等を格納しています。
FMTID_UserDefinedProperties
{D5CDD505-2E9C-101B-9397-08002B2CF9AE}
ユーザー定義のプロパティを格納します。ファイルのプロパティでカスタムタブで扱うことのできるプロパティセットです。
FMTID_DiscardableInformation
{D725EBB0-C9B8-11D1-89BC-0000F804B057}
これはMSDNライブラリに解説がありませんので、OLE標準のプロパティセットでは無いのかもしれません。多分、サムネイルイメージ等の揮発性データを格納していると思います。
FMTID_ImageSummaryInformation
{6444048F-4C8B-11D1-8B70-080036B11A03}
これら4つのプロパティセットはOLE標準のプロパティセットではありません。メディアプレイヤー等に表示するためのコンテンツに対する説明(アーティスト名等)を格納します。メディアファイルは構造化ストレージではないため、これらのプロパティセットを扱おうとするとファイルシステム上に実装されたプロパティセットを使用することになりますが、メディアのファイル内に記録されたデータを扱うプロパティセットを使用しなければなりませんが、本サンプルでは残念ながら扱うことは出来ません。
FMTID_AudioSummaryInformation
{64440490-4C8B-11D1-8B70-080036B11A03}
FMTID_VideoSummaryInformation
{64440491-4C8B-11D1-8B70-080036B11A03}
FMTID_MediaFileSummaryInformation
{64440492-4C8B-11D1-8B70-080036B11A03}

プロパティセット内のプロパティを読み書きする際に使用するインターフェースはIPropertyStorageです。 このインターフェースはIPropertySetStorage.CreateメソッドとIPropertySetStorage.Openメソッドによって取得します。 各プロパティはPROPIDという識別子によって区別します。これは数が多いので解説は省きます。サンプルで他に不明な点がある場合、WWWで検索したりMSDNライブラリを見るなりしてください。


3.まとめ

今回はPROPVARIANT型変換にえらい苦労しましたので、書き込みはパスの方向で・・・。
実際のところ.NET Frameworkからドキュメントプロパティを扱うには、DSOFILE.DLL、Officeオートメーション、Shellオートメーション等の方法があるので、今回みたいな苦労は基本的に不要です。 また、逆コンパイルしてソースを見ると分かりますが、CCW/RCWのSystem.ObjectVARIANT型を相互変換する処理には(すべての種類ではないが)CA構造体をマーシャリングするコードも含まれています。ですので、今回のサンプルのPROPVARIANT型変換処理は.NET Frameworkに肩代わりさせることも出来るはずです。

リンクコンテナの解説からは脱線して行ってますが、.NET Framework 2.0でCOMをどれぐらい扱えるようになっているかも検証して行きたいですね。


前へ 次へ
OLE on .NET Frameworkへ
総合トップへ

サンプルで使用しているキーワード
FMTID_SummaryInformation FMTID_DocSummaryInformation FMTID_UserDefinedProperties FMTID_DiscardableInformation FMTID_ImageSummaryInformation FMTID_AudioSummaryInformation FMTID_VideoSummaryInformation FMTID_MediaFileSummaryInformation IEnumSTATPROPSTG IPropertySetStorage IPropertyStorage PROPSPEC PROPVARIANT STATPROPSTG StgOpenStorage