C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 12 を表示中)
■3372 / )  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 等を参照。
返信 編集キー/


管理者用

- Child Tree -