[BlueLeaf1336]> PROBLEMS> DelphiでShellオブジェクトを使う>
| history | TOP |
2006/06/02:作成
| 2006/06/02 | TOP |
やっと、という感じですが、これからプロパティを取得することができるようになります。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;
| EOF | TOP |