2012-02-10 18 views
7

Sto usando questo codice per ottenere l'icona della shell (quella visualizzata in Esplora risorse).
Qualcuno ha un'esperienza con un modo più veloce per ottenere queste icone? Il SHGetFileInfo sembra essere piuttosto lento.Il modo più veloce per ottenere l'icona della shell

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; 

Grazie!

+3

Ho usato questo metodo in passato senza problemi da un'applicazione C++. C'è una leggera differenza, ho usato solo i flag 'SHGFI_ICON' e' SHGFI_USEFILEATTRIBUTES'. – alf

+1

Sì, sicuramente usare 'SHGFI_USEFILEATTRIBUTES' se la velocità è un problema. Con questo, 'SHGetFileInfo()' salta interrogando il file reale per i suoi attributi, che può richiedere del tempo. –

risposta

8

Provare a utilizzare il flag SHGFI_USEFILEATTRIBUTES. Vedere gli articoli Tuning SHGetFileInfo for Optimum Performance e What does SHGFI_USEFILEATTRIBUTES mean? per ulteriori informazioni.

+2

+1, una rapida serie di misurazioni (ottenendo il file icona informazioni 10k volte) mi ha confermato che il migliore è il tuo suggerimento (da circa 18 a 11 secondi). Il mio suggerimento (usa l'elenco di immagini della shell) sintonizza fino a ca. 10 secondi in cui circa 0,5 secondi prende il controllo iniziale dell'elenco di immagini. – TLama

3

Ho usato una cache quando ho usato SHGetFileInfo. A meno che non sia un file .exe o .ico (e forse qualche altro) l'icona sarà la stessa per la stessa estensione di file, quindi quando mostri una lista dir puoi usare la stessa icona per i file dello stesso tipo e tu non è necessario chiamare (e attendere) SHGetFileInfo di nuovo.

+2

Come fai a sapere cosa memorizzare nella cache? Qualsiasi tipo può avere icone dinamiche,% 1 per .ico e .bmp etc ed estensioni della shell per qualsiasi tipo ... – Anders

+0

@TLama, l'idea con la cache è di evitare di chiamare SHGetFileInfo per ogni file perché è lento, quindi è solo necessario chiamarlo quando si incontrano nuovi tipi di file. –

+1

@Anders, sì, hai ragione, non è completamente sicuro perché i diversi tipi potrebbero non avere icone fisse. –

Problemi correlati