+static BOOL
+DoLoadIcons(HWND hwndDlg, PICK_ICON_CONTEXT *pIconContext, LPCWSTR pszFile)
+{
+ // destroy previous
+ DestroyIconList(pIconContext->hDlgCtrl, pIconContext);
+ SendMessageW(pIconContext->hDlgCtrl, LB_RESETCONTENT, 0, 0);
+ delete[] pIconContext->phIcons;
+
+ // store paths
+ if (pIconContext->szPath != pszFile)
+ StringCchCopyW(pIconContext->szPath, _countof(pIconContext->szPath), pszFile);
+ ExpandEnvironmentStringsW(pszFile, pIconContext->szExpandedPath, _countof(pIconContext->szExpandedPath));
+
+ // load DLL if possible
+ HMODULE hLibrary = LoadLibraryExW(pIconContext->szExpandedPath, NULL, LOAD_LIBRARY_AS_DATAFILE);
+ if (pIconContext->hLibrary)
+ FreeLibrary(pIconContext->hLibrary);
+ pIconContext->hLibrary = hLibrary;
+
+ if (pIconContext->hLibrary)
+ {
+ // load icons from DLL
+ pIconContext->nIcons = ExtractIconExW(pIconContext->szExpandedPath, -1, NULL, NULL, 0);
+ pIconContext->phIcons = new HICON[pIconContext->nIcons];
+
+ if (ExtractIconExW(pIconContext->szExpandedPath, 0, pIconContext->phIcons, NULL, pIconContext->nIcons))
+ {
+ EnumResourceNamesW(pIconContext->hLibrary, RT_GROUP_ICON, EnumPickIconResourceProc, (LPARAM)pIconContext);
+ }
+ else
+ {
+ pIconContext->nIcons = 0;
+ }
+ }
+ else
+ {
+ // *.ico
+ pIconContext->nIcons = 1;
+ pIconContext->phIcons = new HICON[1];
+
+ if (ExtractIconExW(pIconContext->szExpandedPath, 0, pIconContext->phIcons, NULL, pIconContext->nIcons))
+ {
+ SendMessageW(pIconContext->hDlgCtrl, LB_ADDSTRING, 0, 0);
+ }
+ else
+ {
+ pIconContext->nIcons = 0;
+ }
+ }
+
+ // set text
+ SetDlgItemTextW(hwndDlg, IDC_EDIT_PATH, pIconContext->szPath);
+
+ if (pIconContext->nIcons == 0)
+ {
+ delete[] pIconContext->phIcons;
+ pIconContext->phIcons = NULL;
+ }
+
+ return pIconContext->nIcons > 0;
+}
+
+static const LPCWSTR s_pszDefaultPath = L"%SystemRoot%\\system32\\shell32.dll";
+
+static void NoIconsInFile(HWND hwndDlg, PICK_ICON_CONTEXT *pIconContext)
+{
+ // show message
+ CStringW strText, strTitle(MAKEINTRESOURCEW(IDS_PICK_ICON_TITLE));
+ strText.Format(IDS_NO_ICONS, pIconContext->szPath);
+ MessageBoxW(hwndDlg, strText, strTitle, MB_ICONWARNING);
+
+ // load default icons
+ DoLoadIcons(hwndDlg, pIconContext, s_pszDefaultPath);
+}
+
+// icon size
+#define CX_ICON GetSystemMetrics(SM_CXICON)
+#define CY_ICON GetSystemMetrics(SM_CYICON)
+
+// item size
+#define CX_ITEM (CX_ICON + 4)
+#define CY_ITEM (CY_ICON + 12)
+