箕荷vハ炳鋪竪ーの取得 – プログラミング – Home

箕荷vハ炳鋪竪ーの取得
 
通知
すべてクリア

箕荷vハ炳鋪竪ーの取得


Dai
 Dai
(@Dai)
ゲスト
結合: 22年前
投稿: 13
Topic starter  

ファイルのプロパティー内にある
[概要]の情報はどのように、取得したらよいのでしょうか?
目的は、デジカメのjpgファイルの撮影日を得たいのですが、
CFileFindクラスのGet***Timeでは取得できないのです・・・
どなたか、ご教授願います。


引用解決済
トピックタグ
aetos
(@aetos)
Noble Member
結合: 6年前
投稿: 1480
 

#お役に立てなくてごめんなさい。

おそらく、あの情報は COM の IPropertySetStorage インターフェイス経由で取得でき
るのではないかと思います。
ただし、ファイルから IPropertySetStorage インターフェイスを得る方法がわかりませ
ん。
この方法は俺もずっと探しています。もしわかったら教えていただけないでしょうか。


返信引用
aetos
(@aetos)
Noble Member
結合: 6年前
投稿: 1480
 

#お役に立てなくてごめんなさい。

おそらく、あの情報は COM の IPropertySetStorage インターフェイス経由で取得でき
るのではないかと思います。
ただし、ファイルから IPropertySetStorage インターフェイスを得る方法がわかりませ
ん。
この方法は俺もずっと探しています。もしわかったら教えていただけないでしょうか。


返信引用
aetos
(@aetos)
Noble Member
結合: 6年前
投稿: 1480
 

#送信ボタンを2回押してしまいました。ごめんなさい。


返信引用
Dai
 Dai
(@Dai)
ゲスト
結合: 22年前
投稿: 13
Topic starter  

シャノンさん
ありがとうございます。
なかなか根が深そうですね・・・


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

興味があったので調べてみました。
こんな感じで取得できました(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


返信引用
aetos
(@aetos)
Noble Member
結合: 6年前
投稿: 1480
 

んーと。
それ、対象のファイルは何です? Word 文書とか?

この「概要」タブに出ている情報の出所ってのは大きく3つあると考えています。

1:構造化ストレージという形式のファイルに記録されているプロパティ
  Office 文書のタイトルなんかはこれ。

2:NTFS のサブストリームに記録されているプロパティ
  プレーンテキストファイルとかでも編集できるプロパティはこれ。

3:その他のファイルのプロパティ
  画像ファイルのサイズとか、音楽ファイルのビットレートとかはこれ。
  今回の質問にある撮影日もこれ。

で、1と2は取得するサンプルがたくさんあるんですが、3が取れないんですよ。


返信引用
aetos
(@aetos)
Noble Member
結合: 6年前
投稿: 1480
 

例では FMTID_SummaryInformation というプロパティセットを使っていますが、(デジ
カメで撮影したのではない)普通の画像ファイルの概要に表示される幅とか高さとか
は、おそらく FMTID_ImageSummaryInformation というプロパティセットだと思います。
デジカメで撮影した画像の情報は、何というプロパティセットに入っているのかわかり
ません(おそらく、FMTID_ImageSummaryInformation ではないでしょう)。
この辺の情報の取得の仕方をご存知の方がいらっしゃいましたら、是非、ご教示願いた
く存じます。


返信引用
aetos
(@aetos)
Noble Member
結合: 6年前
投稿: 1480
 

目的が「概要」のプロパティを汎用的に取得する方法ではなくて、JPEG ファイルの撮影
日だけを取れればいいのであれば、JPEG ファイルを開いて中のデータを取得すればいい
んだということに今更気がついた。

このへん
http://www.wotsit.org/
で「Exif」で検索すると出てくるかもしれない。


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

> で、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() で列挙...


返信引用
aetos
(@aetos)
Noble Member
結合: 6年前
投稿: 1480
 

dairygoods さんに示していただいた情報で、確かに画像ファイルのサイズや、デジカメ
の撮影日時が取得できることを確認いたしました。ありがとうございます。
しかし…レジストリの中も複雑ですねぇ。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました