2013-03-25 86 views
3

我有IconHandler更改某些文件的圖標。但其他文件圖標變爲空白。如何爲其他文件保留默認圖標?如何更改文件類型的某些文件的圖標?

HRESULT CSimpleShlExt::GetIconLocation(UINT uFlags, 
    PTSTR pszIconFile, 
    UINT cchMax, 
    int *piIndex, 
    UINT *pwFlags) 
{ 
    if (condition)){ 
     // works well 
     lstrcpyn(pszIconFile, L"C:\\Windows\\System32\\shell32.dll", cchMax); 
     *piIndex = 5; 
     *pwFlags = 0; 
    } else { 
     // blank icon :(
     *pwFlags = GIL_PERINSTANCE | GIL_NOTFILENAME;// | GIL_DONTCACHE ; 
    } 
    return S_OK; 
} 

這裏是我的.RGS文件:

HKCR 
{ 
    NoRemove CLSID 
{ 
    ForceRemove {B70B7A24-5180-4092-B3BA-6266F914C053} = s 'My Shell Extension' 
    { 
     InprocServer32 = s '%MODULE%' 
     { 
      val ThreadingModel = s 'Apartment' 
     } 
     TypeLib = s '{62C6D1EB-C172-4E05-BFD2-5F9313832CC3}' 
     Version = s '1.0' 
    } 
} 
    NoRemove txtfile 
    { 
     NoRemove ShellEx 
     { 
      ForceRemove IconHandler = s '{B70B7A24-5180-4092-B3BA-6266F914C053}' 
     } 
    } 
} 

回答

0

此代碼:

HRESULT CSimpleShlExt::GetIconLocation(UINT uFlags, 
PTSTR pszIconFile, 
UINT cchMax, 
int *piIndex, 
UINT *pwFlags) 
{ 

    if (condition)) 
    { 
     lstrcpyn(pszIconFile, L"C:\\Windows\\System32\\Test.dll", cchMax); 

     *piIndex = 0; 
    } 
    else 
    { 
     *piIndex = 1; 

    } 

    *pwFlags = 0; 
    return S_OK; 

} 

HRESULT CSimpleShlExt::Extract(
LPCTSTR pszFile, 
UINT nIconIndex, 
HICON *phiconLarge, 
HICON *phiconSmall, 
UINT nIconSize) 
{ 
    return S_FALSE; 
} 

改變.RGS文件:

HKCR 
{ 
    NoRemove CLSID 
{ 
    ForceRemove {B70B7A24-5180-4092-B3BA-6266F914C053} = s 'My Shell Extension' 
    { 
     InprocServer32 = s '%MODULE%' 
     { 
      val ThreadingModel = s 'Apartment' 
     } 
     TypeLib = s '{62C6D1EB-C172-4E05-BFD2-5F9313832CC3}' 
     Version = s '1.0' 
    } 
} 
    NoRemove txtfile 
    { 
     NoRemove DefaultIcon = s '%%1' 
     NoRemove ShellEx 
     { 
      ForceRemove IconHandler = s '{B70B7A24-5180-4092-B3BA-6266F914C053}' 
     } 
    } 
} 

從 'MSDN' - How to Create Icon Handlers

註冊圖標處理程序

當您靜態註冊的文件類型的圖標,你創建的ProgID下 的DefaultIcon子項的文件類型。其默認值 的值設置爲包含圖標的文件。要註冊圖標 處理程序,必須仍具有DefaultIcon子項,但其默認值 值必須設置爲「%1」。

+0

它不起作用 – barbaris 2013-03-29 07:15:26

+0

如何註冊您的擴展?哪種文件類型?請上傳您的reg文件。 – Xearinox 2013-03-29 18:56:20

+0

我在問題中加入了 – barbaris 2013-03-31 11:43:50

0

您可以通過虛擬名稱來傳遞SHGetFileInfo。例如,

HRESULT CSimpleShlExt::GetIconLocation(UINT uFlags, 
    PTSTR pszIconFile, 
    UINT cchMax, 
    int *piIndex, 
    UINT *pwFlags) 
{ 
    if (condition){ 
     // works well 
     lstrcpyn(pszIconFile, L"C:\\Windows\\System32\\shell32.dll", cchMax); 
     *piIndex = 5; 
     *pwFlags = 0; 
    } else { 
     SHFILEINFO sfi; 
     SHGetFileInfo(L"dummy", FILE_ATTRIBUTE_NORMAL, &sfi, sizeof(sfi), 
      SHGFI_ICONLOCATION | SHGFI_USEFILEATTRIBUTES); 
     StringCchCopy(pszIconFile, cchMax, sfi.szDisplayName); 
     *piIndex = sfi.iIcon; 
     *pwFlags = 0; 
    } 
    return S_OK; 
} 

,關鍵是要通過SHGFI_USEFILEATTRIBUTES標誌,這意味着你提供不需要指真正的文件的文件名。 提供一個沒有文件擴展名的文件名(如上例)將意味着你找回系統的默認文件圖標。 最後,SHGFI_ICONLOCATION標誌返回SHFILEINFO結構的字段中的圖標路徑和索引。

+0

您仍然需要將DefaultIcon鍵設置爲%1。 – Xearinox 2013-04-02 07:35:19

+0

增加賞金,但你的答案不是真正的答案。 – Xearinox 2013-04-09 20:55:12

+0

哦,謝謝你的賞金!但現在我覺得這是不應該的。確切地說,爲什麼這個答案沒有幫助?當你嘗試時發生了什麼? – 2013-04-09 21:44:14

相關問題