uses 에 ShlObj 추가.

 

// 즐겨찾기를 TStrings 형태로 반환
function GetIEFavorites(const favpath: String): TStrings;
var
  Str: TStrings;
  SearchRec: TSearchRec;
  Path, Dir, FileName: String;
  Buffer: array [0..2047] of Char;
  Found: Integer;

 

begin
  Str:=TStringList.Create;

  // 일단 .URL 파일을 뒤지고
  Path:=FavPath+'\*.url';
  Dir:=ExtractFilePath(Path);
  Found:=FindFirst(Path, faAnyFile, SearchRec);
  while Found=0 do begin
    // Buffer 의 내용을 GetPrivateProfileString 길이만큼 FileName 으로 복사
    SetString(
      FileName,
      Buffer,
      // INI 형식의 파일에서 특정 Key 읽어오기
      // 즐겨찾기 파일인 .URL도 INI 형식으로 저장되어 있음.

      GetPrivateProfileString('InternetShortcut'{대분류}
                              PChar('URL'),        {키 이름}
                              nil,                 {Default 값}
                              Buffer,              {내용을 복사할 버퍼}
                              SizeOf(Buffer),      {복사할 크기}
                              PChar(Dir+SearchRec.Name)) {읽어올 파일 경로}
      );
    Str.Add(FileName);
    Found:=FindNext(SearchRec);
  end;

 

  // 디렉토리일 경우엔 재귀 호출로 파고 들어감
  Found:=FindFirst(Dir+'\*.*', faAnyFile, SearchRec);
  while found=0 do begin
    if ((SearchRec.Attr and faDirectory)>0) and (SearchRec.Name[1]<>'.') then begin
      Str.AddStrings(GetIEFavorites(Dir+'\'+SearchRec.Name));
    end;
    Found:=FindNext(SearchRec);
  end;

 

  FindClose(SearchRec);
  Result:=Str;
end;

 

 

 

사용법은 이렇다.

이 함수로 굴리면 리스트박스에 URL만 자동으로 추가됨.

 

procedure TForm1.Button1Click(Sender: TObject);
var
  pIDList: PItemIDList;
  FavPath: Array [0..MAX_PATH] of Char;


begin
  // pIDList에 CSIDL_FAVORITES(즐겨찾기폴더)에 해당하는 포인터 지정
  if SHGetSpecialFolderLocation(Handle, CSIDL_FAVORITES, pIDList)=S_OK then begin
    // pIDList에 있는 Path 경로를 FavPath 에 대입
    if SHGetPathFromIDList(pIDList, FavPath) then begin
      //ShowMessage(FavPath);
      ListBox1.Items:=GetIEFavorites(StrPas(FavPath));
    end
    else
ShowMessage('Error: SHGetPathFromIDList');
  end
  else
ShowMessage('Error<>S_OK');
end;







Posted by bloodguy
,