즐겨찾기 리스트를 리스트박스로 출력하기



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 SB패밀리

댓글을 달아 주세요