SHGetFileInfo 에서 아이콘 가져올때 조심 사용~ ㅠㅠ

2015. 6. 16. 15:22IT-개발/winapi 및 MFC

반응형


SHGetFileInfo(strPath,0,&sfi,sizeof(sfi),SHGFI_TYPENAME | SHGFI_ATTRIBUTES | SHGFI_ICON);


LVITEM lvItem;

memset(&lvItem, 0x00, sizeof(lvItem));


lvItem.mask = LVIF_TEXT | LVIF_IMAGE;

lvItem.iItem = 0;

lvItem.pszText =(LPWSTR) (LPCTSTR)strName;//_T("");

lvItem.iImage = sfi.iIcon;

int idx = CListCtrl::InsertItem(&lvItem);



// 요렇게 하면 strPath 경로에 있는 파일의 아이콘이 list 컨트롤에 들어간다. 근데~ ㅠㅠ 문제가 생긴다.





GDI 개수가 왕창 증가 ~ 참고로 윈도우에서 Process당 GDI object 개수를 10000 미만으로 한정하고 있어서 9999 개 이후 


부터는 프로그램의 UI가 깨어지는 현상이 나타나기 시작합니다~


함수 실행할때 마다 ㅠㅠ.. 이건 뭔일?? msdn 보면... 개발자가 알아서 HICON 을 Release 해주라네요~


그래서...


위 코드에... DestroyIcon((HICON)sfi.hIcon); 만 호출해주면 되네요~


SHGetFileInfo(strPath,0,&sfi,sizeof(sfi),SHGFI_TYPENAME | SHGFI_ATTRIBUTES | SHGFI_ICON);


LVITEM lvItem;

memset(&lvItem, 0x00, sizeof(lvItem));


lvItem.mask = LVIF_TEXT | LVIF_IMAGE;

lvItem.iItem = 0;

lvItem.pszText =(LPWSTR) (LPCTSTR)strName;//_T("");

lvItem.iImage = sfi.iIcon;

int idx = CListCtrl::InsertItem(&lvItem);

      DestroyIcon((HICON)sfi.hIcon);


// 요렇게만 해주면 GDI 개수가 계속 올라가는 현상 없어집니다. ^_^... 아~ 옛날에 경험한거 같은데~

// CListCtrl 상에 icon은 DestroyIcon 호출한 후에도 잘 나오니 걱정 않해도 됩니다.