diff --git a/dll/win32/shell32/dialogs/dialogs.cpp b/dll/win32/shell32/dialogs/dialogs.cpp index f266e79787..24c38f7ecf 100644 --- a/dll/win32/shell32/dialogs/dialogs.cpp +++ b/dll/win32/shell32/dialogs/dialogs.cpp @@ -48,6 +48,8 @@ typedef struct HWND hDlgCtrl; WCHAR szName[MAX_PATH]; INT Index; + INT nIcons; + HICON *phIcons; } PICK_ICON_CONTEXT, *PPICK_ICON_CONTEXT; BOOL CALLBACK EnumPickIconResourceProc(HMODULE hModule, @@ -58,21 +60,17 @@ BOOL CALLBACK EnumPickIconResourceProc(HMODULE hModule, { WCHAR szName[100]; int index; - HICON hIcon; - HWND hDlgCtrl = (HWND)lParam; + PPICK_ICON_CONTEXT pPickIcon = PPICK_ICON_CONTEXT(lParam); + HWND hDlgCtrl = pPickIcon->hDlgCtrl; if (IS_INTRESOURCE(lpszName)) swprintf(szName, L"%u", (DWORD)lpszName); else StringCbCopyW(szName, sizeof(szName), lpszName); - hIcon = LoadIconW(hModule, lpszName); - if (hIcon == NULL) - return TRUE; - index = SendMessageW(hDlgCtrl, LB_ADDSTRING, 0, (LPARAM)szName); if (index != LB_ERR) - SendMessageW(hDlgCtrl, LB_SETITEMDATA, index, (LPARAM)hIcon); + SendMessageW(hDlgCtrl, LB_SETITEMDATA, index, (LPARAM)pPickIcon->phIcons[index]); return TRUE; } @@ -116,7 +114,10 @@ INT_PTR CALLBACK PickIconProc(HWND hwndDlg, SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pIconContext); pIconContext->hDlgCtrl = GetDlgItem(hwndDlg, IDC_PICKICON_LIST); SendMessageW(pIconContext->hDlgCtrl, LB_SETCOLUMNWIDTH, 32, 0); - EnumResourceNamesW(pIconContext->hLibrary, RT_ICON, EnumPickIconResourceProc, (LPARAM)pIconContext->hDlgCtrl); + pIconContext->nIcons = (INT)(INT_PTR)ExtractIconExW(pIconContext->szName, -1, NULL, NULL, 0); + pIconContext->phIcons = new HICON[pIconContext->nIcons]; + ExtractIconExW(pIconContext->szName, 0, pIconContext->phIcons, NULL, pIconContext->nIcons); + EnumResourceNamesW(pIconContext->hLibrary, RT_GROUP_ICON, EnumPickIconResourceProc, (LPARAM)pIconContext); if (ExpandEnvironmentStringsW(pIconContext->szName, szText, MAX_PATH)) SetDlgItemTextW(hwndDlg, IDC_EDIT_PATH, szText); else @@ -139,10 +140,12 @@ INT_PTR CALLBACK PickIconProc(HWND hwndDlg, pIconContext->Index = index; GetDlgItemTextW(hwndDlg, IDC_EDIT_PATH, pIconContext->szName, MAX_PATH); DestroyIconList(pIconContext->hDlgCtrl); + delete[] pIconContext->phIcons; EndDialog(hwndDlg, 1); break; case IDCANCEL: DestroyIconList(pIconContext->hDlgCtrl); + delete[] pIconContext->phIcons; EndDialog(hwndDlg, 0); break; case IDC_PICKICON_LIST: @@ -230,10 +233,10 @@ BOOL WINAPI PickIconDlg( int res; PICK_ICON_CONTEXT IconContext; - hLibrary = LoadLibraryExW(lpstrFile, NULL, LOAD_LIBRARY_AS_DATAFILE | LOAD_LIBRARY_AS_IMAGE_RESOURCE); + hLibrary = LoadLibraryExW(lpstrFile, NULL, LOAD_LIBRARY_AS_DATAFILE); IconContext.hLibrary = hLibrary; IconContext.Index = *lpdwIconIndex; - StringCchCopyNW(IconContext.szName, _countof(IconContext.szName), lpstrFile, nMaxFile); + StringCchCopyW(IconContext.szName, _countof(IconContext.szName), lpstrFile); res = DialogBoxParamW(shell32_hInstance, MAKEINTRESOURCEW(IDD_PICK_ICON), hWndOwner, PickIconProc, (LPARAM)&IconContext); if (res)