Самый быстрый способ получить значок оболочки - PullRequest
7 голосов
/ 10 февраля 2012

Я использую этот код для получения значка оболочки (который отображается в Windows Explorer).
У кого-нибудь есть опыт с более быстрым способом получения этих значков?SHGetFileInfo кажется довольно медленным.

procedure TForm2.Button1Click(Sender: TObject);
var
  FileInfo: TSHFileInfo;
begin
  FillChar(FileInfo, SizeOf(FileInfo), 0);
  if SHGetFileInfo(PChar('c:\windows\'), 0, FileInfo, SizeOf(FileInfo),
    SHGFI_ICON or SHGFI_SMALLICON or SHGFI_SYSICONINDEX) <> 0 then 
    DrawIconEx(Canvas.Handle, 10, 10, FileInfo.hIcon, 0, 16, 16, 0, DI_IMAGE or 
      DI_MASK);
end;

Спасибо!

Ответы [ 2 ]

8 голосов
/ 10 февраля 2012

Попробуйте также использовать флаг SHGFI_USEFILEATTRIBUTES . См. Статьи Tuning SHGetFileInfo for Optimum Performance и What does SHGFI_USEFILEATTRIBUTES mean? для получения дополнительной информации.

3 голосов
/ 10 февраля 2012

Я использовал кеш, когда использовал SHGetFileInfo. Если это не файл .exe или .ico (и, возможно, несколько), значок будет одинаковым для того же расширения файла, поэтому, когда вы показываете список dir, вы можете использовать тот же значок для файлов того же типа, и вы не нужно снова вызывать (и ждать) SHGetFileInfo.

...