2012-02-10 23 views
7

Estoy usando este código para obtener el icono de shell (el que se muestra en el Explorador de Windows).
¿Alguien tiene una experiencia con una forma más rápida de obtener estos íconos? El SHGetFileInfo parece ser bastante lento.La forma más rápida de obtener el icono de 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; 

Gracias!

+3

He usado este método en el pasado sin problemas de una aplicación C++. Sin embargo, hay una pequeña diferencia, solo usé las banderas 'SHGFI_ICON' y' SHGFI_USEFILEATTRIBUTES'. – alf

+1

Sí, definately use 'SHGFI_USEFILEATTRIBUTES' si la velocidad es un problema. Con eso, 'SHGetFileInfo()' omite consultar el archivo real para sus atributos, lo que puede llevar algo de tiempo. –

Respuesta

8

Pruebe usar la bandera SHGFI_USEFILEATTRIBUTES también. Consulte los artículos Tuning SHGetFileInfo for Optimum Performance y What does SHGFI_USEFILEATTRIBUTES mean? para obtener más información.

+2

+1, una serie de mediciones rápidas (obtener el ícono del archivo 10 veces) me confirmó que es lo mejor (desde aproximadamente 18 segundos hasta 11 años). Mi sugerencia (use la lista de imágenes de shell) sintonice hasta aprox. 10s donde aproximadamente 0.5s toma la obtención inicial del identificador de la lista de imágenes. – TLama

3

He utilizado un caché cuando utilicé SHGetFileInfo. A menos que sea un archivo .exe o .ico (y quizás algunos más), el ícono será el mismo para la misma extensión de archivo, de modo que cuando muestre una lista de directorios, puede usar el mismo ícono para archivos del mismo tipo y usted no es necesario volver a llamar (y esperar) a SHGetFileInfo.

+2

¿Cómo sabes qué caché? Cualquier tipo puede tener iconos dinámicos,% 1 para .ico y .bmp, etc. y extensiones de shell para cualquier tipo ... – Anders

+0

@TLama, la idea con el caché es evitar llamar a SHGetFileInfo para cada archivo porque es lento, por lo que solo es necesario para llamarlo cuando encuentre nuevos tipos de archivos. –

+1

@Anders, sí, tiene razón, no es completamente seguro porque los diferentes tipos pueden no tener iconos fijos. –

Cuestiones relacionadas