.net/C# で GetDetailsOf を使う

音楽や動画ファイルのメタデータを取得する際、 taglib などの外部ライブラリを使用しても良いのですが、使う範囲が限られているのであれば、 Windows 標準の shell32.dll を使用するのも一つの選択肢です。

ただ、これには弱点があり、 XP/Vista/7 間で微妙に互換性がないことと、特に AAC/mp4 ファイルのメタデータ取得ができたりできなかったり、という問題があります。

エクスプローラーの詳細表示と同じ情報を取得できるので、特に文字化けを気にしなくて済むというのは利点ですが、AAC 系のファイルは XP では扱いづらいこと、また未だに XP マシンが跋扈している現状、使い勝手は正直良くないですが、とりあえず載せてみます。

3OS 間で互換性がない、というのは、 Shell32.ShellClass のインスタンスを作成する際、例えば 7 で開発したものをそのまま XP に持って行くと、 InvalidCastException が発生し、インスタンスを作れない、というものです。これを回避するには、 Activator.CreateInstance メソッドを利用します。

shell32.dll は未だに COM Component ですので、参照設定から "Microsoft Shell Controls And Automation" を登録しておきます。

public void test()
{
  Shell32.Folder folder = null;

  string someDirectory = @"c:\hoge\fuga";
  string someFile = @"test.mp3";

  try
  {
    Type wshell = Type.GetTypeFromProgID("Shell.Application");
    object wshInstance = Activator.CreateInstance(wshell);
    folder = (Shell32.Folder)wshell.InvokeMember("NameSpace", System.Reflection.BindingFlags.InvokeMethod, null, wshInstance, new object[] { someDirectory });
  }
  catch {  }

  Shell32.FolderItem folderitem = folder.ParseName(someFile);

  // 再生時間の表示。ただし7上。XPでは 27 ではなく 21 となる。
  System.Diagnostics.Debug.WriteLine(folder.GetDetailsOf(folderitem, 27));
}