[BlueLeaf1336]> PROBLEMS> DelphiでShellオブジェクトを使う>
| history | TOP |
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/12 | TOP |
参考サイト。
追加分。
| EOF | TOP |