[BlueLeaf1336]> PROBLEMS> DelphiでShellオブジェクトを使う>

Folder.GetDetailsOfでもっとプロパティ取得

historyTOP

2006/06/02:作成
2007/11/12: Folder.GetDetailsOf(FolderItem, 31); は撮影日?

2006/06/02TOP

前回は、明示的にオブジェクトが公開しているプロパティに限定して操作しましたが、今回は、なんとなればforループでまわして取得することすらできるプロパティを扱います。

これは、FolderオブジェクトのGetDetailsOfというメソッドを使って行います。このメソッドの引数には、プロパティを取り出したいFolderItemオブジェクトを渡す必要があり、それなら元からFolderItemオブジェクトのメソッドでええやん、と突っ込みたくなる感じです。

また、どのプロパティを取り出すかについては、整数値でインデックスを指定するようになっています。

ところが、このインデックスでPlatform SDKに明記してあるのは、-1 から 4 までとなっていて、名前や種類・サイズ程度だけとなっています。エクスプローラで右クリックプロパティの詳細表示したときにごちゃごちゃと表示される他のプロパティは取り出せないのか、というとそうでもなくて、コード中のリンクのどれかにあるように、もっと大きなインデックスにも意味があるようです。

というわけで、参考サイトでやっていた 40 までのインデックスに対応するプロパティが何かを調べることにしました。方法は、テキストファイルや動画・画像・Office文書などのプロパティに実際に内容を書き込めるだけ書き込んで、それが何番目のインデックスに対応して表示されるかをちまちまと見ていくものです。

半分ほど終わったあたりで、ふと、エクスプローラで詳細表示したときの表示する列の一覧の存在を思い出しました。こんなやつですが、今まで貼り付けた画像の中で一番長い感じです。

これちゃうかと。上から順に、0番目から対応しているんじゃないかと。それを確かめたのが今回やったことです。大体一致しており、いくつかは違っているというのが実態でした。何の保障もできませんが。

今回のプログラムは、画像やいろんな種類のファイルが入っているフォルダで実行するとそれなりの結果を確認できます。というのも、この範囲のプロパティは画像専用、こっちは音楽ファイル専用などとなっていて、今のところ種類を一切判断せずに全プロパティを出力しているので、テキストファイルしかないようなフォルダで実行するとほとんどが空っぽとなってしまうからです。だからどうというわけでもありません。

Level4.zip(173,672Bytes) ソースコードと実行ファイルです。

でもアレです。GetDetailsOfでも取得できないプロパティがごろごろしています。ひょっとして、と考えて、200程度までインデックスを試してみましたがだめだったのが、たとえば、画像のExif情報(一番最初の目標)や、動画ファイルの「データ速度」「ストリーム名」などのより突っ込んだ項目です。

そんなこんなで、まだ続きます。次は、ShellFolderItemオブジェクトです。「FolderItemオブジェクトに比べて2つのメソッドが追加されている」と書いてあり、ExtendedProparty(拡張プロパティ)を取得できるようになっています。

少し試したところ、今までFolderItemオブジェクトとして扱ってきた箇所を、なんにも考えずにShellFolderItemオブジェクトのつもりにしても動作しました。

なんか無駄にコードだけ長いシリーズになってきました。

コードTOP

uses
    ComObj, Variants;

{$R *.dfm}

//  http://www2.moug.net/bbs/wordvba/20060517000002.htm
//  http://leed.issp.u-tokyo.ac.jp/~takeuchi/delphi/article/043/043760.html
//  http://pc.2ch.net/tech/kako/1019/10196/1019654975.html
//  ms-help://MS.PSDK.1033/shellcc/platform/shell/reference/objects/shell/shell.htm
//  ms-help://MS.PSDK.1033/shellcc/platform/shell/reference/objects/shell/browseforfolder.htm
//  ms-help://MS.PSDK.1033/shellcc/platform/shell/reference/structures/browseinfo.htm
//  Subject: [Delphi:81788] Re: OLE Object  がObject を返す場合の処理

//-----------------------------------------------------------------------------
//  起動フォルダ内のファイルのプロパティを表示
procedure TForm1.Button2Click(Sender: TObject);
var
    Shell: OleVariant;
    Folder: OleVariant;
    FolderItems: OleVariant;
    ItemCount: Integer;
    i: Integer;
    FolderItem: OleVariant;
    Line: String;
begin
    //  Shellオブジェクト取得
    Shell := CreateOleObject('Shell.Application');

    //  起動フォルダのFolderオブジェクト取得
    Folder := Shell.NameSpace(OleVariant(ExtractFilePath(ParamStr(0))));

    //  その全てのアイテムにアクセスするためのFolderItemsオブジェクト取得
    FolderItems := Folder.Items;

    //  アイテム数
    ItemCount := FolderItems.Count;

    //  順番に
    for i := 0 to ItemCount - 1 do
    begin
        //  アイテム取得
        FolderItem := FolderItems.Item(i);

        //  プロパティ列挙
        Line := StringOfChar('-', 20);
        Memo2.Lines.Add(Line);

        //  フルパス
        Line := FolderItem.Path;
        Memo2.Lines.Add(Line);

        Line := '[ツールチップ            ] ' + Folder.GetDetailsOf(FolderItem, -1);
        Memo2.Lines.Add(Line);

        Line := '[名前                    ] ' + Folder.GetDetailsOf(FolderItem, 0);
        Memo2.Lines.Add(Line);

        Line := '[サイズ                  ] ' + Folder.GetDetailsOf(FolderItem, 1);
        Memo2.Lines.Add(Line);

        Line := '[種類                    ] ' + Folder.GetDetailsOf(FolderItem, 2);
        Memo2.Lines.Add(Line);

        Line := '[更新日時                ] ' + Folder.GetDetailsOf(FolderItem, 3);
        Memo2.Lines.Add(Line);

        Line := '[作成日時                ] ' + Folder.GetDetailsOf(FolderItem, 4);
        Memo2.Lines.Add(Line);

        Line := '[アクセス日時            ] ' + Folder.GetDetailsOf(FolderItem, 5);
        Memo2.Lines.Add(Line);

        Line := '[属性                    ] ' + Folder.GetDetailsOf(FolderItem, 6);
        Memo2.Lines.Add(Line);

        Line := '[状態                    ] ' + Folder.GetDetailsOf(FolderItem, 7);
        Memo2.Lines.Add(Line);

        Line := '[所有者                  ] ' + Folder.GetDetailsOf(FolderItem, 8);
        Memo2.Lines.Add(Line);

        Line := '[作成者                  ] ' + Folder.GetDetailsOf(FolderItem, 9);
        Memo2.Lines.Add(Line);

        Line := '[タイトル                ] ' + Folder.GetDetailsOf(FolderItem, 10);
        Memo2.Lines.Add(Line);

        Line := '[表題                    ] ' + Folder.GetDetailsOf(FolderItem, 11);
        Memo2.Lines.Add(Line);

        Line := '[カテゴリ                ] ' + Folder.GetDetailsOf(FolderItem, 12);
        Memo2.Lines.Add(Line);

        Line := '[ページ数                ] ' + Folder.GetDetailsOf(FolderItem, 13);
        Memo2.Lines.Add(Line);

        Line := '[コメント                ] ' + Folder.GetDetailsOf(FolderItem, 14);
        Memo2.Lines.Add(Line);

        Line := '[著作権                  ] ' + Folder.GetDetailsOf(FolderItem, 15);
        Memo2.Lines.Add(Line);

        Line := '[アーティスト            ] ' + Folder.GetDetailsOf(FolderItem, 16);
        Memo2.Lines.Add(Line);

        Line := '[アルバムのタイトル      ] ' + Folder.GetDetailsOf(FolderItem, 17);
        Memo2.Lines.Add(Line);

        Line := '[年                      ] ' + Folder.GetDetailsOf(FolderItem, 18);
        Memo2.Lines.Add(Line);

        Line := '[トラック番号            ] ' + Folder.GetDetailsOf(FolderItem, 19);
        Memo2.Lines.Add(Line);

        Line := '[ジャンル                ] ' + Folder.GetDetailsOf(FolderItem, 20);
        Memo2.Lines.Add(Line);

        Line := '[長さ                    ] ' + Folder.GetDetailsOf(FolderItem, 21);
        Memo2.Lines.Add(Line);

        Line := '[ビットレート            ] ' + Folder.GetDetailsOf(FolderItem, 22);
        Memo2.Lines.Add(Line);

        Line := '[保護                    ] ' + Folder.GetDetailsOf(FolderItem, 23);
        Memo2.Lines.Add(Line);

        Line := '[カメラのモデル          ] ' + Folder.GetDetailsOf(FolderItem, 24);
        Memo2.Lines.Add(Line);

        //  写真の撮影日(年月日時分)
        Line := '[写真の撮影日            ] ' + Folder.GetDetailsOf(FolderItem, 25);
        Memo2.Lines.Add(Line);

        Line := '[大きさ                  ] ' + Folder.GetDetailsOf(FolderItem, 26);
        Memo2.Lines.Add(Line);

        Line := '[幅                      ] ' + Folder.GetDetailsOf(FolderItem, 27);
        Memo2.Lines.Add(Line);

        Line := '[高さ                    ] ' + Folder.GetDetailsOf(FolderItem, 28);
        Memo2.Lines.Add(Line);

        Line := '[29 ?                    ] ' + Folder.GetDetailsOf(FolderItem, 29);
        Memo2.Lines.Add(Line);

        Line := '[30 ?                    ] ' + Folder.GetDetailsOf(FolderItem, 30);
        Memo2.Lines.Add(Line);

        //  写真の撮影日(年月日時分秒)(?)
        //  Delphi Q & A掲示板 でのやりとりより
        Line := '[写真の撮影日(?)         ] ' + Folder.GetDetailsOf(FolderItem, 31);
        Memo2.Lines.Add(Line);

        Line := '[オーディオサンプルサイズ] ' + Folder.GetDetailsOf(FolderItem, 32);
        Memo2.Lines.Add(Line);

        Line := '[オーディオサンプルレート] ' + Folder.GetDetailsOf(FolderItem, 33);
        Memo2.Lines.Add(Line);

        Line := '[チャンネル              ] ' + Folder.GetDetailsOf(FolderItem, 34);
        Memo2.Lines.Add(Line);

        Line := '[会社名                  ] ' + Folder.GetDetailsOf(FolderItem, 35);
        Memo2.Lines.Add(Line);

        Line := '[説明                    ] ' + Folder.GetDetailsOf(FolderItem, 36);
        Memo2.Lines.Add(Line);

        Line := '[ファイルバージョン      ] ' + Folder.GetDetailsOf(FolderItem, 37);
        Memo2.Lines.Add(Line);

        Line := '[製品名                  ] ' + Folder.GetDetailsOf(FolderItem, 38);
        Memo2.Lines.Add(Line);

        Line := '[製品バージョン          ] ' + Folder.GetDetailsOf(FolderItem, 39);
        Memo2.Lines.Add(Line);

        Line := '[Keywords                ] ' + Folder.GetDetailsOf(FolderItem, 40);
        Memo2.Lines.Add(Line);

        //  この回のタイトル
        //  プログラムの説明
    end;

    //  解放
    Folder := Unassigned;
    Shell := Unassigned;
end;

EOFTOP