2009-11-18 2 views
3

내 설치 프로그램이 내 응용 프로그램의 exe의 새 버전 설치를 마친 후에는 바로 가기에 새 exe의 아이콘을 사용하도록 Explorer에 알려야합니다. 그러나, 나는 이것을하는 방법을 알아낼 수 없습니다.Windows 탐색기에서 아이콘을 새로 고치는 방법은 무엇입니까?

온라인에서 읽을 때, system image list이 아이콘의 이전 버전을 캐싱하고 있다는 것이 문제인 것처럼 보입니다. SHCNE_UPDATEIMAGE 매개 변수를 사용하여 SHChangeNotify에 전화를 걸려고했습니다. 나는 SHUpdateImage에 전화를 걸었다. 나는 심지어 WM_SETTINGCHANGE 방송의 sledgehammer approach을 시도했다. 아무것도 작동하는 것 같습니다.

전 완전히 잘못된 것일 수 있습니다. 어떤 도움을 주시면 감사하겠습니다.

경고 : 아주 못생긴 테스트 코드가 뒤 따른다.

#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\\WindowMetrics", 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"WindowMetrics"); 
    RegSetValueEx(reg, L"Shell Icon Size", 0, REG_DWORD, (BYTE*) &value, 
     sizeof(value)); 
    SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS, 
     (int) L"WindowMetrics"); 
#endif 
+0

그냥 물어 보았습니까? (죄송합니다, 도와 드릴 수 없습니다.) –

+0

@Dustin : 시도하겠습니다. 시작 -> 실행 -> "explorer --refresh-my-icons-please"를 클릭하십시오. 탐색기에서 "경로 '--refresh-my-icons-please'가 없거나 디렉토리가 아닙니다." 아니, 작동하지 않았다. –

답변

2

썰매 망치의 접근법은이 작업을 수행하는 데 사용되는 것으로 나타났습니다. 그러나 코드에서 "쉘 아이콘 크기"값은 이고 REG_DWORD이 아닙니다. 항상 VERIFY() API 함수 반환 값 ...

관련 문제