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

ShellFolderItem.ExtendedPropertyでさらにプロパティ取得

historyTOP

2006/06/08:作成
2006/06/12:GUID追加

Explorerで確認できるプロパティTOP

多分、次のようなものだと思います。もっとあるのかもしれませんが。ちなみに、それぞれいろんなファイルからかき集めてます。Microsoftが作ったであろうファイルを中心にWindowsフォルダの中をどろどろと探し回った結果です。

 

 
 
 

ShellFolderItemオブジェクトのExtendedプロパティを使うと、上のようなプロパティをバキバキと取り出せるはずです。

ExtendedPropertyの使い方TOP

基本的には前回までに使ってきたFolderItemオブジェクトと同じです。FolderItemとして取り出したつもりでも、勝手にShellFolderItemオブジェクトになっているというか。

それよりなにより、ExtendedPropertyの引数が問題なんですが。

uses
    ComObj, Variants;

{$R *.dfm}

procedure TForm1.Button3Click(Sender: TObject);
var
    Shell: OleVariant;
    Folder: OleVariant;
    FolderItems: OleVariant;
    ItemCount: Integer;
    i: Integer;
    FolderItem: OleVariant;
    SCID: String;
    Value: OleVariant;
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);

        //  拡張プロパティを取り出すための引数
        SCID := '{F29F85E0-4FF9-1068-AB91-08002B27B3D9} 2';

        //  拡張プロパティの値を取り出す
        Value := FolderItem.ExtendedProperty(SCID);

        //  いろんな形式があるので文字列に変換して表示
        Memo2.Lines.Add(VarToStr(Value));
    end;

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

Platform SDKの嘘?TOP

Windows開発のバイブル(いいすぎ)Platform SDKで、ShellFolderItemを検索してみます。

こんなところで、ExtendedPropetyの引数がわかってきます。サンプルコードさえあります。指定方法は2種類あって、1つ目はそのまま取得したいプロパティの名称を指定するというものです。多分、英語版のWindowsを使っていればこの引数に渡すプロパティ名が簡単にわかるんだと思うんですが、日本語版Windowsでは、「タイトル」「コメント」あたりはいいとして、「未更新のリンクオブジェクト」なんてどうすりゃいいんだ? という話です。

Doc_Title = fiWordDoc.ExtendedProperty("Title")

2つ目はなにやら呪文のようですが、サンプルのように「GUID + 数値」で指定する方法です。感じとしては「GUID」でExplorerのプロパティでいうところの「説明」や「イメージ」「オーディオ」など大きなくくりを指定して、「数値」で明細を指定する感じですか。

FMTID_SummaryInfo = "{F29F85E0-4FF9-1068-AB91-08002B27B3D9}"
PID_TITLE = "2"
SCID_TITLE = FMTID_SummaryInfo + "," + PID_TITLE
Doc_Title = fiWordDoc.ExtendedProperty(SCID_TITLE)

それはそれとして、Platform SDKが嘘をついてるんじゃないかというのは、GUIDと数値をつなぐ方法です。上のサンプルでは何をどう見ても「,」でつないでますが、「,」でつなぐと何をどうしても答えが返ってきません。正解(と思われるの)は、「半角スペース」です。

このページを書き始める前にいくつかというか何十個かコンマでつないで試してみましたが全くだめで、ネットで調べて外国の方が「MSDN嘘ついてへんか?」と。「コンマいらんやん」と書いてあるのを見つけて納得したわけで。

これにしたところで全部が全部答えを返すわけじゃあないんですが...。ここで「答えを返さない」というのは、ExtendedPropertyが対応していない文字列を引数に渡すと「空文字(OleStr)」が返ってくることを意味しています。コンマがあるとExtendedPropertyは「そんなプロパティは知らん」ということにして「空文字(OleStr)」を返してくるんです。

長々と書きましたが、Platform SDKの嘘(つきっぽい点)というのは、ExtendedPropertyの引数は「GUIDと数値をつなぐのにコンマはイラン」という所です。

引数のGUID部分TOP

ここで、引数のGUID部分を調べてみることにします。正式名称は「format ID (FMTID)」です。まずはココから。

具体的にどういう内容のプロパティを抱えているのかは後回しにして、ここではGUIDだけを探します。実際のところ、GUIDさえわかってしまえば、数値部分はループで回してもかまわない話だし。

次は、Platform SDKのインストールフォルダ「C:\Program Files\Microsoft SDK\include\」からヘッダファイルをGREPしてみます。検索後は「FMTID」です。Guiddef.h と ShlGuid.h でいくつか見つかりました。

あー、めんどくせ。

2006/06/12TOP

参考サイト。

追加分。

EOFTOP