Chciwy SHGetFileInfo

Odpowiedz Nowy wątek
2006-03-05 17:18
0

Witam. Mam problem ze złośliwością funkcji systemowej SHGetFileInfo. Alokuje w pamięci ikony jak leci, nie pozwalając wybrać co jest przydatne a co nie, a zależy mi wyłącznie na małych ikonach. O ile ten problem nie jest uciążliwy w większości zbiorów ikon programów, o tyle, np. PDF, ma już potężny zbiór ikonek. W efekcie nażarcie się przez niego kosztuje ponad 1 MB. Czy da się zmusić funkcję do oszczędniejszego gospodarowania pamięcią? Czy jest możliwe odalokowanie niechcianych ikon?

poniżej przedstawiam użyty przeze mnie kod:

ilIkony.Handle := SHGetFileInfo('', 0, PlikInfo, SizeOf(ShFileInfo), SHGFI_SYSICONINDEX or SHGFI_SMALLICON);
SHGetFileInfo(PChar(Plik), Atrybut, PlikInfo, SizeOf(TSHFileInfo),
shgfi_sysiconindex or shgfi_icon or SHGFI_SMALLICON or SHGFI_USEFILEATTRIBUTES);


My jsme Borg. Odpor je marny, budete analovani

Pozostało 580 znaków

2006-03-05 19:41
0

Przyklad z cpp, pobranie tylko malej ikony i wstawienie do pola static.

SHFILEINFO PlikInfo;
ZeroMemory(&PlikInfo, sizeof(PlikInfo));

SHGetFileInfo("c:\\bla.txt", FILE_ATTRIBUTE_NORMAL, &PlikInfo, sizeof(PlikInfo), 
              SHGFI_ICON | SHGFI_SMALLICON );

m_wndIcon.SetIcon(PlikInfo.hIcon); // CStatic w naszym okienku
DeleteObject(PlikInfo.hIcon);

Stwórzmy boga na własne podobieństwo
Niech będzie mały i parszywy,
Wtedy wszyscy w niego uwierzą...

Pozostało 580 znaków

2006-03-05 21:40
0

Fałszywy alarm - błąd w obliczeniach. Dopóki program nie zostaje zrzucony do paska, istotnie Menedżer zadań pokazuje około 10 MB zajętości RAMu, ale po zrzuceniu do paska wartość ta spada do 600 kB, po przywróceniu waha się w granicach 1,5-2 MB. Najwyraźniej podczas uruchamiania i alokacji podbiera sobie dużo pamięci na wyrost. Pozostaje jedynie kwestia, jak zrobić, żeby łaskawie zwolnił zbędną pamięć bez ingerencji użytkownika w minimalizację. Poza tym, gdy następuje zrzut programu do tray'a, w procedurze FormClose nie chce ta dealokacja nijak działać, nawet przy kombinowaniu z minimalizacją. :/


My jsme Borg. Odpor je marny, budete analovani

Pozostało 580 znaków

2006-03-06 20:03
0

To tylko uwaga

jesli uzywa sie SHGetFileInfo z flaga SHGFI_ICON, nalezy zwolnic zasoby ikony potem za pomoca funkcji

DestroyIcon (a nie DeleteObject)


Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0