2012-06-11 5 views
2

몇 시간 전 아이콘을 얻는 속도를 조정 한 fastest way to get shell icon을 요청했지만 문제는 일부 시스템 바로 가기 (lnk 파일)가 올바른 아이콘을 표시하지 않는다는 것입니다. 예 중 하나로서 시스템 바로 가기에서 바로 가기 쉘 아이콘을 얻는 방법은 무엇입니까?

는 다음과 같은 코드를 사용하는 경우 Windows Fax and Scan.lnk 파일, ...
procedure TForm2.Button1Click(Sender: TObject); 
var 
    Icon: TIcon; 
    FileInfo: TSHFileInfo; 
begin 
    FillChar(FileInfo, SizeOf(FileInfo), 0); 
    SHGetFileInfo(PChar('C:\Windows Fax and Scan.lnk'), FILE_ATTRIBUTE_NORMAL, 
    FileInfo, SizeOf(FileInfo), SHGFI_USEFILEATTRIBUTES or SHGFI_ICON or 
    SHGFI_SMALLICON); 
    Icon := TIcon.Create; 
    try 
    Icon.Handle := FileInfo.hIcon; 
    Canvas.Draw(10, 10, Icon); 
    finally 
    Icon.Free; 
    end; 
end; 

대신이 아이콘으로 표시됩니다 ...

enter image description here

들을 수 있습니다 종류의 기본 바로 가기 아이콘 ...

enter image description here

바로 가기 파일에서 시스템 아이콘 (첫 번째 이미지의 아이콘)을 가져 오는 방법을 알고 계십니까?

답변

1

SHGFI_USEFILEATTRIBUTES은 디스크에 액세스하지 않으려 고합니다. 즉,이 파일이 실제로 존재하지 않고 a.txt을 조회하도록 지시 할 수 있으며 .txt 파일의 일반 아이콘을 제공합니다. this과 같은 올바른 결과를 제공하지는 않을 것입니다.이 경우 사용자 정의 아이콘 처리기가 호출되고 디스크에 액세스해야합니다. .lnk 파일은 아이콘의 위치를 ​​저장하므로 사용자는 디스크에 액세스하지 않고이 정보에 액세스 할 수 없습니다 (가능한 캐시 제외).

IExtractIcon

당신이 정말로 당신이 일반적인 아이콘을 표시하고 백그라운드 스레드에서 실제 아이콘을 받아야 속도를 원한다면 ...

MSDN에 따라 SHGetFileInfo보다 빠른하지만,