Comment dire à Windows Explorer d’actualiser ses icons?

Une fois que mon installateur a fini d’installer les nouvelles versions de l’exécutable de mon application, j’aimerais dire à Explorer d’utiliser les icons du nouvel exe pour ses raccourcis. Cependant, je ne peux pas comprendre comment faire cela.

D’après la lecture en ligne, il semble que le problème est que la liste des images système met en cache une ancienne version de l’icône. J’ai essayé d’appeler SHChangeNotify avec un paramètre SHCNE_UPDATEIMAGE . J’ai essayé d’appeler SHUpdateImage . J’ai même essayé l’ approche sledgehammer de la diffusion WM_SETTINGCHANGE . Rien ne semble fonctionner.

Il est tout à fait possible que je fasse quelque chose de mal. Toute aide serait appréciée.

Avertissement: Un code de test très laid suit.

 #if 1 // First attempt: using shell functions wchar_t icon_path[MAX_PATH]; int icon_index; UINT icon_flags; IShellFolder *desktop_folder; IShellFolder *sub_folder; IExtractIcon *extract_icon; LPITEMIDLIST pidl; SHGetDesktopFolder(&desktop_folder); wchar_t *folder_path = L"C:\\Documents and Settings\\All Users\\Start Menu\\Programs\\MyCompany\\"; desktop_folder->ParseDisplayName(NULL, NULL, folder_path, NULL, &pidl, NULL); desktop_folder->BindToObject(pidl, NULL, IID_IShellFolder, (void**) &sub_folder); sub_folder->ParseDisplayName(NULL, NULL, L"MyApp.lnk", NULL, &pidl, NULL); sub_folder->GetUIObjectOf(NULL, 1, (LPCITEMIDLIST*) &pidl, IID_IExtractIcon, NULL, (void**) &extract_icon); extract_icon->GetIconLocation(0, icon_path, MAX_PATH, &icon_index, &icon_flags); SHFILEINFO sfi; DWORD_PTR result = SHGetFileInfo(shortcut_path, 0, &sfi, sizeof(sfi), SHGFI_SYSICONINDEX | SHGFI_LARGEICON); SHUpdateImage(icon_path, icon_index, icon_flags, sfi.iIcon); // sfi.iIcon should be correct, but we'll try both, just for fun... SHChangeNotify(SHCNE_UPDATEIMAGE, SHCNF_DWORD, NULL, (LPCVOID) icon_index); SHChangeNotify(SHCNE_UPDATEIMAGE, SHCNF_DWORD, NULL, (LPCVOID) sfi.iIcon); #else // Second attempt: broadcasting a settings change HKEY reg; RegCreateKeyEx(HKEY_CURRENT_USER, L"Control Panel\\Desktop\\WindowMesortingcs", 0, NULL, 0, KEY_SET_VALUE, NULL, &reg, NULL); DWORD value; value = 33; RegSetValueEx(reg, L"Shell Icon Size", 0, REG_DWORD, (BYTE*) &value, sizeof(value)); value = 32; SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS, (int) L"WindowMesortingcs"); RegSetValueEx(reg, L"Shell Icon Size", 0, REG_DWORD, (BYTE*) &value, sizeof(value)); SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS, (int) L"WindowMesortingcs"); #endif 

Votre approche au marteau est celle que j’ai vue utiliser pour y parvenir. Un oops dans votre code cependant, la valeur “Shell Icon Size” est un REG_SZ , pas un REG_DWORD . Toujours VERIFY () la fonction API renvoie des valeurs …