■3372 / inTopicNo.5) |
Re[4]: 音楽ファイルのプロパティ情報の取得/変更 |
□投稿者/ シャノン (154回)-(2007/05/08(Tue) 14:54:46)
|
2007/05/08(Tue) 14:58:07 編集(投稿者)
■No3367 (lune さん) に返信 >>■No3348 (シャノン さん) に返信 > >>1. レジストリ内で、対象ファイルの関連付けを探して(これが面倒くさい) > >>2. PropertyStorage ハンドラの COM クラスを探して > >>3. CoCreateInstance で COM インスタンスを作成して > >>4. IPropertySetStorage インターフェイスのメソッドで読み書き > > 申し訳ありません、上記の方法にて挑戦したところ、 > >>1. レジストリ内で、対象ファイルの関連付けを探して(これが面倒くさい) > は出来たのですが、その他の3つがよくわかりません。 > 大変恐縮ですが、もう少し詳しくご教授いただけないでしょうか。
1.ができれば2.も難しくないと思います。 1.ができたのに2.ができない場合、1.が間違えているかもしれません。
なお、レジストリの内容は、俺の環境(WinXP SP2)を書いています。環境によっては異なる可能性がありますので、適切に読み替え/応用してください。
1.レジストリ内で、対象ファイルの関連付けを探す 2. PropertyStorage ハンドラの COM クラスを探して
たとえば *.wma ファイルを例にとりましょう。 関連付けは、レジストリの HKEY_CLASSES_ROOT にあります。 まず、HKEY_CLASSES_ROOT \ .wma を見ます。 このキー以下には PropertyHandler というキー(HKEY_CLASSES_ROOT \ .wma \ shellex \ PropertyHandler)がありませんでした。
次に、.wma キーの(既定)の値に注目します。ここには「wmafile」とありました。 そこで、HKEY_CLASSES_ROOT \ wmafileを見ます。 ここにも PropertyHandler(HKEY_CLASSES_ROOT \ wmafile\ shellex \ PropertyHandler)はありません。
次に、.wma キーの下の PerceivedType に注目します。ここには「audio」とありました。 ここで見るべきは、HKEY_CLASSES_ROOT \ SystemFileAssociations \ audio です。 しかし、まだ PropertyHandler(HKEY_CLASSES_ROOT \ SystemFileAssociations \ audio \ shellex \ PropertyHandler)は見つかりません。
どこまで行けば見つかるんでしょうねorz
次は、HKEY_CLASSES_ROOT \ SystemFileAssociations \ .wma です。 おぉ、ここにありましたよ! HKEY_CLASSES_ROOT \ SystemFileAssociations \ .wma \ shellex \ PropertyHandler がありました!
大抵の場合、ここまでしつこく調べれば見つかります。 まだ見つからない場合、以下の文献を参考にしてください。 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/programmersguide/shell_basics/shell_basics_extending/fileassociations/fa_perceived_types.asp
さて、ようやくステップ3.に進めます。
HKEY_CLASSES_ROOT \ SystemFileAssociations \ .wma \ shellex \ PropertyHandler の(既定)の値には、 {875CB1A1-0F29-45de-A1AE-CFB4950D0B78} と書いてありました。これが、PropertyHandler のハンドラの COM クラスの ID です。
レジストリから ID を取得したら、それをもとに Guid 構造体を作ります。コンストラクタに ID 文字列を渡すだけです。 次に、この COM クラスのインスタンスを作ります。
以下のコードで、IPropertySetStorage のインスタンスが得られます。 あらかじめ、Windows SDK や pinvoke.net 等を利用して、必要な宣言をそろえておいてください。
Type t = Type.GetTypeFromCLSID( new Guid( "875CB1A1-0F29-45de-A1AE-CFB4950D0B78" ), true ); object o = Activator.CreateInstance( t ); IPropertySetStorage p = ( o as IPropertySetStorage );
ここから、ステップ4.です。
IPropertySetStorage.Open で、プロイパティセットを開き、IPropertyStorage を得ます。FMTID は、FMTID_MUSIC です。 IPropertyStorage.WriteMultiple で、概要情報を書き込むことができます。PROPSPEC は PIDSI_MUSIC_ARTIST です。
IPropertySetStorage や IPropertyStorage の使い方は、Windows SDK を参照してください。
Activator.CreateInstance や IPropertySetStorage.Open で取得した COM オブジェクトは、適切に破棄してください。 http://jeanne.wankuma.com/tips/programing/releasecom.html 等を参照。
|
|