Chciwy SHGetFileInfo

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);

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);
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ą. :/

0

To tylko uwaga

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

DestroyIcon (a nie DeleteObject)

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