wrongwrongな開発日記

情報系大学生が挑戦したことや日常を書いていきます

【VB】GetDetailsOfメソッドのiColumn番号と内容の対応【.Net】

背景

最近VBffmpegと連携したコードのメンテナンス(と言っていいのだろうか)をしています。その中で、「導入が面倒なのでできるだけffmpegを使わない形でコードを置き換えられないか」という要望を受けました。
そのコードではオーディオの長さなどを扱っており、それの置き換えとして以下の記事の手順を参考にGetDetailsOfメソッドでやってみるのがいいんじゃないかと思いました。

MP3ファイルからタイトルやアーティスト名などを取得するには?[C#、VB] - @IT

が、どうにもiColumn番号と取れている情報が違うように見えます。ググっても中に何が入ってるのかイマイチ情報を調べ切れませんでした。
というわけで、自分で調べてみました。

環境

調査を行った環境です。

環境 バージョン
OS Windows10 Pro ビルド16299
.Net 4.6.1

調査結果

長いので結果は折りたたみます。調査方法は後述。
1000番まで調べましたが、iColumn=316以降は全部空でした。

調査結果から

思ったより色々な情報が取得できました。何が入ってるか分からないような情報もありますが、その辺は調べたら書くかもしれません。
個人的に欲しかったのは27番の長さ情報でしたが、他にもffmpegでフレーム高やフレーム幅を取得するコードがあるので、そこはGetDetailsOfメソッドに置き換えていけそうでしょうか。
まあこれはこれで変更が掛かるかもしれないんですが……。
フレーム高/幅関連で意味の分からないエラーを吐かれ続ける苦行をやる前にこれを知りたかったです。VBは9日に始めたばかりなので、もっとVBWindowsについて勉強が必要ですね。

調査方法

調査に用いたプロジェクトは以下の通りGitHubにアップロードしています。
github.com
このコードは冒頭で挙げた記事とほぼ同じです。
MP3ファイルからタイトルやアーティスト名などを取得するには?[C#、VB] - @IT

Shell32の参照設定

GetDetailsOfメソッドを利用するにはShell32をImportsする必要があります。
導入は以下の記事を参考に、C:\WINDOWS\system32\shell32.dllを参照に追加して行いました。
blog.masahiko.info

コード

ただのコンソールアプリです。
本来GetDetailsOfメソッドは特定のファイルに対して実行し、内容の記述があればその記述を、無ければ""を返しますが、何もファイルを指定しない/無いファイルを指定すると、そのiColumn番号に何が記述されているかを返すので、それを用いて調査を行いました。

Imports Shell32

Module Module1
    Sub Main()
        Dim dir As String = "C:" ' MP3ファイルのあるディレクトリ
        Dim file As String = ""

        Dim shell As New Shell()
        Dim f As Folder = shell.NameSpace(dir)
        Dim item As FolderItem = f.ParseName(file)

        For i As Integer = 0 To 320
            Console.WriteLine(i.ToString + ":" + f.GetDetailsOf(item, i))
        Next

        Console.ReadKey()
    End Sub
End Module

参考にしたページ

直接関係無いですが折りたたみをお借りしました。
nn-hokuson.hatenablog.com