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.Objectと
VARIANT型を相互変換する処理には(すべての種類ではないが)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