2012-02-10 18 views
7

Kabuk simgesini (Windows Gezgini'nde görüntülenen) almak için bu kodu kullanıyorum.
Herkesin bu simgeleri almanın daha hızlı bir yolu var mı? SHGetFileInfo oldukça yavaş görünüyor.Kabuk simgesini almanın en hızlı yolu

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; 

Teşekkürler!

+3

Bu yöntemi geçmişte bir C++ uygulamasından sorun olmadan kullanmıştım. Ancak hafif bir fark var, sadece SHGFI_ICON ve SHGFI_USEFILEATTRIBUTES bayraklarını kullandım. – alf

+1

Evet, hızı bir sorun ise "SHGFI_USEFILEATTRIBUTES" işlevini kullanın. Bununla birlikte, SHGetFileInfo() ', öznitelikleri için gerçek dosyayı sorgulamayı atlar; bu da biraz zaman alabilir. –

cevap

8

SHGFI_USEFILEATTRIBUTES bayrağını da kullanmayı deneyin. Daha fazla bilgi için Tuning SHGetFileInfo for Optimum Performance ve What does SHGFI_USEFILEATTRIBUTES mean? makalelerine bakın.

+2

+1, hızlı bir dizi ölçüm (dosya ikon bilgisini 10k kez almak) bana en iyi öneri olduğunu doğruladı (yaklaşık 18s'den 11s'e). Benim önerim (kabuk görüntü listesini kullan), yakl. Görüntü listesi tanıtıcısının ilk alması yaklaşık 0,5 saniye sürer. – TLama

3

SHGetFileInfo kullandığımda bir önbellek kullandım. Bir .exe veya .ico dosyası (ve belki birkaç tane daha) olmadığı sürece, bu simge aynı dosya uzantısı için aynı olacaktır, bu yüzden bir dir listesi gösterdiğinizde aynı türde ve aynı türde dosyalar için aynı simgeyi kullanabilirsiniz. tekrar SHGetFileInfo çağırmak (ve bekleyin) zorunda değilsiniz.

+2

Önbelleği neyi bilirsiniz? Herhangi bir tür, dinamik simgeler, .ico ve .bmp vb için% 1 ve herhangi bir tür için kabuk uzantıları olabilir ... – Anders

+0

@TLama, önbellek ile fikir her dosya için SHGetFileInfo çağırmaktan kaçınmak çünkü yavaş olduğundan Yeni dosya türleri ile karşılaşıldığında bunu aramak için gerekli. –

+1

@Anders, evet, haklısınız, tamamen güvenli değil çünkü farklı türlerde sabit simgeler olmayabilir. –

İlgili konular