2012-02-10 17 views
7

私はこのコードをシェルアイコン(Windowsのエクスプローラに表示されるアイコン)を取得するために使用しています。
誰かがこれらのアイコンを取得するためのより速い方法を経験していますか? 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; 

ありがとうございます!

+3

私はこれまで、このメソッドをC++アプリケーションから問題なく使用しました。しかし、少し違いはありますが、フラグ 'SHGFI_ICON'と' SHGFI_USEFILEATTRIBUTES'だけを使用しました。 – alf

+1

速度が問題であれば、確かに 'SHGFI_USEFILEATTRIBUTES'を使用してください。これにより、 'SHGetFileInfo()'は実際のファイルの属性を問い合わせるのをスキップします。時間がかかることがあります。 –

答えて

8

SHGFI_USEFILEATTRIBUTESフラグも使用してください。詳細については、Tuning SHGetFileInfo for Optimum PerformanceおよびWhat does SHGFI_USEFILEATTRIBUTES mean?の記事を参照してください。

+2

+1(ファイルアイコンの情報を10k回取得する)の迅速な一連の測定では、あなたの提案が(約18秒から11秒まで)最善のものであることが確認されました。私の提案(シェルイメージリストを使用する)は、それをおよそ最大まで調整します。画像リストハンドルの初期取得に約0.5秒かかります。 – TLama

3

私はSHGetFileInfoを使用したときにキャッシュを使用しました。 .exeファイルや.icoファイル(そしておそらくそれ以上)以外のアイコンは、同じファイル拡張子で同じアイコンになります。ディレクトリリストを表示すると、同じタイプのファイルに対して同じアイコンを使用できます。 SHGetFileInfoを再度呼び出す(そして待つ)必要はありません。

+2

キャッシュする内容をどのように知っていますか?どんなタイプでも動的アイコン、.icoと.bmpのための%1、そして任意のタイプのシェル拡張子を持つことができます... – Anders

+0

@traama、キャッシュ付きのアイデアは、ファイルが遅いのでSHGetFileInfoを呼び出さないようにすることです新しいファイルタイプに遭遇したときにそれを呼び出すために必要です。 –

+1

@アンダー、はい、そうですが、種類によってはアイコンが固定されていない可能性があるため、完全に安全ではありません。 –

関連する問題