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

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

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

Re[6]: 音楽ファイルのプロパティ情報の取得/変更


(過去ログ 12 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■3347 / inTopicNo.1)  音楽ファイルのプロパティ情報の取得/変更
  
□投稿者/ lune (1回)-(2007/05/06(Sun) 01:29:27)

分類:[VB.NET (Windows)] 

皆様、はじめまして。
lune@VB 2005初心者です。

早速ですが、今音楽ファイルのファイル名の情報を取得し、
それを[プロパティ]-[概要]の[タイトル]、[アーティスト]へ
転記するツールを作っているのですが、
プロパティ情報の取得/変更の方法で行き詰ってしまいました。

どうかお分かりになられる方がおられましたら、ご教授のほどをお願いいたします。
引用返信 編集キー/
■3348 / inTopicNo.2)  Re[1]: 音楽ファイルのプロパティ情報の取得/変更
□投稿者/ シャノン (153回)-(2007/05/06(Sun) 03:35:25)
No3347 (lune さん) に返信
> 皆様、はじめまして。
> lune@VB 2005初心者です。
>
> 早速ですが、今音楽ファイルのファイル名の情報を取得し、
> それを[プロパティ]-[概要]の[タイトル]、[アーティスト]へ
> 転記するツールを作っているのですが、
> プロパティ情報の取得/変更の方法で行き詰ってしまいました。
>
> どうかお分かりになられる方がおられましたら、ご教授のほどをお願いいたします。

VB でやる方法はわかりませんが…(基本的には P/Invoke で同じことをしてやればできそうだけど)
IPropertySetStorage という COM インターフェイスを通じて読み書きします。
ごく簡単に言うと、

1. レジストリ内で、対象ファイルの関連付けを探して(これが面倒くさい)
2. PropertyStorage ハンドラの COM クラスを探して
3. CoCreateInstance で COM インスタンスを作成して
4. IPropertySetStorage インターフェイスのメソッドで読み書き

という流れになります。
引用返信 編集キー/
■3354 / inTopicNo.3)  Re[2]: 音楽ファイルのプロパティ情報の取得/変更
□投稿者/ lune (2回)-(2007/05/06(Sun) 23:36:39)
No3348 (シャノン さん) に返信
> 1. レジストリ内で、対象ファイルの関連付けを探して(これが面倒くさい)
> 2. PropertyStorage ハンドラの COM クラスを探して
> 3. CoCreateInstance で COM インスタンスを作成して
> 4. IPropertySetStorage インターフェイスのメソッドで読み書き
>
> という流れになります。

シャノン 様

スレッドに対するリプライありがとうございます。
上記の方法に関して調べてみて、コーディングを行ってみます。

ご教授、誠にありがとうございました。
引用返信 編集キー/
■3367 / inTopicNo.4)  Re[3]: 音楽ファイルのプロパティ情報の取得/変更
□投稿者/ lune (4回)-(2007/05/08(Tue) 00:36:39)
> ■No3348 (シャノン さん) に返信
>>1. レジストリ内で、対象ファイルの関連付けを探して(これが面倒くさい)
>>2. PropertyStorage ハンドラの COM クラスを探して
>>3. CoCreateInstance で COM インスタンスを作成して
>>4. IPropertySetStorage インターフェイスのメソッドで読み書き

申し訳ありません、上記の方法にて挑戦したところ、
>>1. レジストリ内で、対象ファイルの関連付けを探して(これが面倒くさい)
は出来たのですが、その他の3つがよくわかりません。
大変恐縮ですが、もう少し詳しくご教授いただけないでしょうか。

お手数をおかけしてしまいますが、どうぞよろしくお願いいたします。
引用返信 編集キー/
■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 等を参照。
引用返信 編集キー/
■3373 / inTopicNo.6)  Re[5]: 音楽ファイルのプロパティ情報の取得/変更
□投稿者/ シャノン (155回)-(2007/05/08(Tue) 16:13:20)
No3372 (シャノン さん) に返信
サンプルコードを書いてみようとしたけど挫折。
相互運用はワケわからんとですよ。
C++ のサンプルコードでもよければ掲載しますけど。
引用返信 編集キー/
■3417 / inTopicNo.7)  Re[6]: 音楽ファイルのプロパティ情報の取得/変更
□投稿者/ lune (5回)-(2007/05/09(Wed) 23:19:46)
No3373 (シャノン さん) に返信
> ■No3372 (シャノン さん) に返信
> サンプルコードを書いてみようとしたけど挫折。
> 相互運用はワケわからんとですよ。
> C++ のサンプルコードでもよければ掲載しますけど。

シャノン様

詳細なる手ほどきのほど、誠に感謝いたします。
なんとかコードを完成させることが出来ました。
私も貴殿のように他の人が悩んでスレッドしている人の助力が
出来るようにこれからも勉強を続けてまいる所存にあります。

簡単ではありますが、御礼を申し上げます。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -