通过 SHGetSpecialFolderLocation、SHGetPathFromIDList 函数获取常用路径

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1
= class(TForm)
    Memo1: TMemo;
   
procedure FormCreate(Sender: TObject);
 
end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses ShlObj; {SHGetSpecialFolderLocation、SHGetPathFromIDList 函数来自这个单元}

{获取常用路径的函数}
function GetPath(FID: Integer): string;
var
  pidl: PItemIDList;
  path:
array[0..MAX_PATH] of Char;
begin
  SHGetSpecialFolderLocation(
0, FID, pidl);
  SHGetPathFromIDList(pidl, path);
  Result :
= path;
end;

{测试时, 我把 SHGetSpecialFolderLocation 函数需要的参数定义成了一个常数数组}
const
  arr:
array[0..57] of Integer = (
    CSIDL_DESKTOP                 ,
{ = $0000 }
    CSIDL_INTERNET                ,
{ = $0001 }
    CSIDL_PROGRAMS                ,
{ = $0002 }
    CSIDL_CONTROLS                ,
{ = $0003 }
    CSIDL_PRINTERS                ,
{ = $0004 }
    CSIDL_PERSONAL                ,
{ = $0005 }
    CSIDL_FAVORITES               ,
{ = $0006 }
    CSIDL_STARTUP                 ,
{ = $0007 }
    CSIDL_RECENT                  ,
{ = $0008 }
    CSIDL_SENDTO                  ,
{ = $0009 }
    CSIDL_BITBUCKET               ,
{ = $000a }
    CSIDL_STARTMENU               ,
{ = $000b }
    CSIDL_MYDOCUMENTS             ,
{ = $000c }
    CSIDL_MYMUSIC                 ,
{ = $000d }
    CSIDL_MYVIDEO                 ,
{ = $000e }
    CSIDL_DESKTOPDIRECTORY        ,
{ = $0010 }
    CSIDL_DRIVES                  ,
{ = $0011 }
    CSIDL_NETWORK                 ,
{ = $0012 }
    CSIDL_NETHOOD                 ,
{ = $0013 }
    CSIDL_FONTS                   ,
{ = $0014 }
    CSIDL_TEMPLATES               ,
{ = $0015 }
    CSIDL_COMMON_STARTMENU        ,
{ = $0016 }
    CSIDL_COMMON_PROGRAMS         ,
{ = $0017 }
    CSIDL_COMMON_STARTUP          ,
{ = $0018 }
    CSIDL_COMMON_DESKTOPDIRECTORY ,
{ = $0019 }
    CSIDL_APPDATA                 ,
{ = $001a }
    CSIDL_PRINTHOOD               ,
{ = $001b }
    CSIDL_LOCAL_APPDATA           ,
{ = $001c }
    CSIDL_ALTSTARTUP              ,
{ = $001d }
    CSIDL_COMMON_ALTSTARTUP       ,
{ = $001e }
    CSIDL_COMMON_FAVORITES        ,
{ = $001f }
    CSIDL_INTERNET_CACHE          ,
{ = $0020 }
    CSIDL_COOKIES                 ,
{ = $0021 }
    CSIDL_HISTORY                 ,
{ = $0022 }
    CSIDL_COMMON_APPDATA          ,
{ = $0023 }
    CSIDL_WINDOWS                 ,
{ = $0024 }
    CSIDL_SYSTEM                  ,
{ = $0025 }
    CSIDL_PROGRAM_FILES           ,
{ = $0026 }
    CSIDL_MYPICTURES              ,
{ = $0027 }
    CSIDL_PROFILE                 ,
{ = $0028 }
    CSIDL_SYSTEMX86               ,
{ = $0029 }
    CSIDL_PROGRAM_FILESX86        ,
{ = $002a }
    CSIDL_PROGRAM_FILES_COMMON    ,
{ = $002b }
    CSIDL_PROGRAM_FILES_COMMONX86 ,
{ = $002c }
    CSIDL_COMMON_TEMPLATES        ,
{ = $002d }
    CSIDL_COMMON_DOCUMENTS        ,
{ = $002e }
    CSIDL_COMMON_ADMINTOOLS       ,
{ = $002f }
    CSIDL_ADMINTOOLS              ,
{ = $0030 }
    CSIDL_CONNECTIONS             ,
{ = $0031 }
    CSIDL_COMMON_MUSIC            ,
{ = $0035 }
    CSIDL_COMMON_PICTURES         ,
{ = $0036 }
    CSIDL_COMMON_VIDEO            ,
{ = $0037 }
    CSIDL_RESOURCES               ,
{ = $0038 }
    CSIDL_RESOURCES_LOCALIZED     ,
{ = $0039 }
    CSIDL_COMMON_OEM_LINKS        ,
{ = $003a }
    CSIDL_CDBURN_AREA             ,
{ = $003b }
    CSIDL_COMPUTERSNEARME         ,
{ = $003d }
    CSIDL_PROFILES                 
{ = $003e }
  );

{测试}
procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
  s:
string;
begin
  Memo1.Clear;
 
for i := 0 to Length(Arr) - 1 do
 
begin
    s :
= GetPath(Arr[i]);
   
if s<>'' then Memo1.Lines.Add(Format('%d:'#9'%s', [Arr[i], s]));
 
end;
end;

end.

来源:http://www.cnblogs.com/jxgxy/archive/2008/12/06/1348997.html

posted @ 2010-09-12 09:57  覆雨翻云  阅读(232)  评论(0)    收藏  举报