ファイルのプロパティー内にある
[概要]の情報はどのように、取得したらよいのでしょうか?
目的は、デジカメのjpgファイルの撮影日を得たいのですが、
CFileFindクラスのGet***Timeでは取得できないのです・・・
どなたか、ご教授願います。
#お役に立てなくてごめんなさい。
おそらく、あの情報は COM の IPropertySetStorage インターフェイス経由で取得でき
るのではないかと思います。
ただし、ファイルから IPropertySetStorage インターフェイスを得る方法がわかりませ
ん。
この方法は俺もずっと探しています。もしわかったら教えていただけないでしょうか。
#お役に立てなくてごめんなさい。
おそらく、あの情報は COM の IPropertySetStorage インターフェイス経由で取得でき
るのではないかと思います。
ただし、ファイルから IPropertySetStorage インターフェイスを得る方法がわかりませ
ん。
この方法は俺もずっと探しています。もしわかったら教えていただけないでしょうか。
#送信ボタンを2回押してしまいました。ごめんなさい。
シャノンさん
ありがとうございます。
なかなか根が深そうですね・・・
興味があったので調べてみました。
こんな感じで取得できました(VC++6.0, WinXP)。
IPropertySetStoragePtr propSet;
StgOpenStorageEx(path,
STGM_READ|STGM_SHARE_EXCLUSIVE,
STGFMT_FILE, 0, 0, 0,
IID_IPropertySetStorage, (void**)&propSet);
IPropertyStoragePtr prop;
propSet->Open(FMTID_SummaryInformation,
STGM_READ|STGM_SHARE_EXCLUSIVE, &prop);
PROPSPEC spec;
spec.ulKind = PRSPEC_PROPID;
spec.propid = PIDSI_TITLE;
PROPVARIANT var;
prop->ReadMultiple(1, &spec, &var);
// var.pszVal に入ってる
PropVariantClear(&var);
関連するところ
The Summary Information Property Set
http://msdn.microsoft.com/library/en-
us/stg/stg/the_summary_information_property_set.asp
IPropertySetStorage-NTFS File System Implementation
http://msdn.microsoft.com/library/en-
us/stg/stg/ipropertysetstorage_ntfs_file_system_implementation.asp
んーと。
それ、対象のファイルは何です? Word 文書とか?
この「概要」タブに出ている情報の出所ってのは大きく3つあると考えています。
1:構造化ストレージという形式のファイルに記録されているプロパティ
Office 文書のタイトルなんかはこれ。
2:NTFS のサブストリームに記録されているプロパティ
プレーンテキストファイルとかでも編集できるプロパティはこれ。
3:その他のファイルのプロパティ
画像ファイルのサイズとか、音楽ファイルのビットレートとかはこれ。
今回の質問にある撮影日もこれ。
で、1と2は取得するサンプルがたくさんあるんですが、3が取れないんですよ。
例では FMTID_SummaryInformation というプロパティセットを使っていますが、(デジ
カメで撮影したのではない)普通の画像ファイルの概要に表示される幅とか高さとか
は、おそらく FMTID_ImageSummaryInformation というプロパティセットだと思います。
デジカメで撮影した画像の情報は、何というプロパティセットに入っているのかわかり
ません(おそらく、FMTID_ImageSummaryInformation ではないでしょう)。
この辺の情報の取得の仕方をご存知の方がいらっしゃいましたら、是非、ご教示願いた
く存じます。
目的が「概要」のプロパティを汎用的に取得する方法ではなくて、JPEG ファイルの撮影
日だけを取れればいいのであれば、JPEG ファイルを開いて中のデータを取得すればいい
んだということに今更気がついた。
このへん
http://www.wotsit.org/
で「Exif」で検索すると出てくるかもしれない。
> で、1と2は取得するサンプルがたくさんあるんですが、3が取れないんですよ。
なるほど。私が示したのは2ですね。
失礼しました。
「概要」のシェル拡張は、PropertyHandler という名で登録するみたいですが、
例えば、HKEY_CLASSES_ROOT\jpegfile\shellex を見ても登録されてませんね。
さらに調べてみると、PerceivedTypes という
ファイルのカテゴリ分け(テキストとか画像とか)があるようです。
http://msdn.microsoft.com/library/en-
us/shellcc/platform/shell/programmersguide/shell_basics/shell_basics_extending/f
ileassociations/fileassoc.asp
で、このPerceivedTypes で Image のところを見てみると、
PropertyHandler が登録されています。
HKEY_CLASSES_ROOT
SystemFileAssociations
image
ShellEx
PropertyHandler
{EB9B1153-3B57-4E68-959A-A3266BC3D7FE}
こいつをインスタンス化して、プロパティを得てみると、
画像関係の「概要」に表示されているものと同じ一覧が取れました。
CLSID clsid = {0xEB9B1153, 0x3B57, 0x4E68,
{0x95,0x9A,0xA3,0x26,0x6B,0xC3,0xD7,0xFE}};
IPropertySetStoragePtr propSet;
propSet.CreateInstance(clsid);
IPersistFilePtr pf = propSet;
hr = pf->Load(path, STGM_READ|STGM_SHARE_EXCLUSIVE);
以下、propSet->Enum() で列挙...
dairygoods さんに示していただいた情報で、確かに画像ファイルのサイズや、デジカメ
の撮影日時が取得できることを確認いたしました。ありがとうございます。
しかし…レジストリの中も複雑ですねぇ。