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

FolderItemオブジェクト

historyTOP

2006/06/02:作成

2006/06/02TOP

やっと、という感じですが、これからプロパティを取得することができるようになります。FolderItemオブジェクトの説明をPlatform SDKでよんでいると、ショートカットやフォルダやファイルやマイドキュメントなどを同じように扱えると書いてあるので、そういうファイルの多い場所としてデスクトップを選び、デスクトップにある全てのモノのプロパティを取得できるだけ取得してみよう、というのが今回の趣旨です。

ただし、FolderItemオブジェクトやそこから取得できるオブジェクトがサポートしている明示的なプロパティに限定しています。これまでもこれからも読み取り操作しかするつもりはありませんが、多分、ショートカットのアイコンをセットすることもできるようです。

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

コード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 を返す場合の処理

//-----------------------------------------------------------------------------
//  特殊フォルダを列挙
type
    TShellSpecialFolderConstants =
    (
        ssfALTSTARTUP = $1d,
        ssfAPPDATA = $1a,
        ssfBITBUCKET = $a,
        ssfCOMMONALTSTARTUP = $1e,
        ssfCOMMONAPPDATA = $23,
        ssfCOMMONDESKTOPDIR = $19,
        ssfCOMMONFAVORITES = $1f,
        ssfCOMMONPROGRAMS = $17,
        ssfCOMMONSTARTMENU = $16,
        ssfCOMMONSTARTUP = $18,
        ssfCONTROLS = $3,
        ssfCOOKIES = $21,
        ssfDESKTOP = $0,
        ssfDESKTOPDIRECTORY = $10,
        ssfDRIVES = $11,
        ssfFAVORITES = $6,
        ssfFONTS = $14,
        ssfHISTORY = $22,
        ssfINTERNETCACHE = $20,
        ssfLOCALAPPDATA = $1c,
        ssfMYPICTURES = $27,
        ssfNETHOOD = $13,
        ssfNETWORK = $12,
        ssfPERSONAL = $5,
        ssfPRINTERS = $4,
        ssfPRINTHOOD = $1b,
        ssfPROFILE = $28,
        ssfPROGRAMFILES = $26,
        ssfPROGRAMS = $2,
        ssfRECENT = $8,
        ssfSENDTO = $9,
        ssfSTARTMENU = $b,
        ssfSTARTUP = $7,
        ssfSYSTEM = $25,
        ssfTEMPLATES = $15,
        ssfWINDOWS = $24
    );

//-----------------------------------------------------------------------------
//  デスクトップの全てのオブジェクトを列挙していろいろ表示
procedure TForm1.Button1Click(Sender: TObject);
var
    Shell: OleVariant;
    Folder: OleVariant;
    FolderItems: OleVariant;
    ItemCount: Integer;
    i: Integer;
    FolderItem: OleVariant;
    Line: String;
    ShellLinkObject: OleVariant;
    //iHotkey: Integer;
    //iShowCommand: Integer;
    iIcon: Integer;
    IconPath: String;
begin
    //  Shellオブジェクト取得
    Shell := CreateOleObject('Shell.Application');

    //  デスクトップのFolderオブジェクト取得
    Folder := Shell.NameSpace(ssfDESKTOP);

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

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

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

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

        //  パス
        Line := '[Path] ' + FolderItem.Path;
        Memo1.Lines.Add(Line);

        //  名称(書き込みもできるらしい)
        Line := '[Name] ' + FolderItem.Name;
        Memo1.Lines.Add(Line);

        //  ブラウズ可能(意味不明)
        Line := '[IsBrowsable] ' + BoolToStr(FolderItem.IsBrowsable, True);
        Memo1.Lines.Add(Line);

        //  ファイルシステムかどうか
        Line := '[IsFileSystem] ' + BoolToStr(FolderItem.IsFileSystem, True);
        Memo1.Lines.Add(Line);

        //  フォルダかどうか
        Line := '[IsFolder] ' + BoolToStr(FolderItem.IsFolder, True);
        Memo1.Lines.Add(Line);

        //  ショートカットかどうか
        Line := '[IsLink] ' + BoolToStr(FolderItem.IsLink, True);
        Memo1.Lines.Add(Line);
        
        //  更新日(書き込みもできるらしい)
        Line := '[ModifyDate] ' + DateTimeToStr(FolderItem.ModifyDate);
        Memo1.Lines.Add(Line);

        //  バイトサイズ
        Line := '[Size] ' + FormatFloat('#,##0 "bytes"', FolderItem.Size);
        Memo1.Lines.Add(Line);

        //  種類
        Line := '[Type] ' + FolderItem.Type;
        Memo1.Lines.Add(Line);

        //  ショートカットの場合
        if (FolderItem.IsLink) then
        begin
            //  ShellLinkObjectオブジェクト取得
            ShellLinkObject := FolderItem.GetLink;

            //  引数
            Line := ' [Arguments] ' + ShellLinkObject.Arguments;
            Memo1.Lines.Add(Line);

            //  説明
            Line := ' [Description] ' + ShellLinkObject.Description;
            Memo1.Lines.Add(Line);

            //  パス
            Line := ' [Path] ' + ShellLinkObject.Path;
            Memo1.Lines.Add(Line);

            //  作業フォルダ
            Line := ' [WorkingDirectory] ' + ShellLinkObject.WorkingDirectory;
            Memo1.Lines.Add(Line);

            //  ホットキー(メンバが見つかりません。エラー)
            //ShellLinkObject.Hotkey(iHotkey);
            //Line := ' [Hotkey] ' + IntToStr(iHotkey);     
            //Memo1.Lines.Add(Line);
            
            //  表示スタイル(メンバが見つかりません。エラー)
            //ShellLinkObject.ShowCommand(iShowCommand);
            //Line := ' [ShowCommand] ' + IntToStr(iShowCommand);
            //Memo1.Lines.Add(Line);

            //  アイコン
            iIcon := ShellLinkObject.GetIconLocation(IconPath);
            Line := ' [GetIconLocation] ' + Format('%d番目 in %s', [iIcon, IconPath]);
            Memo1.Lines.Add(Line);
        end;
    end;

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

EOFTOP