2013-03-25 10 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 파일 : 'MSDN'에서

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}' 
     } 
    } 
} 

-How to Create Icon Handlers :

당신이 정적 파일 형식의 아이콘을 등록 할 때 17,451,515,

등록 아이콘 핸들러

, 당신은 파일 형식에 대한 ProgID를 아래 DefaultIcon은 하위 키를 만들 수 있습니다. 기본값 값은 아이콘이 포함 된 파일로 설정됩니다. 아이콘을 등록하려면 DefaultIcon 하위 키가 있어야하지만 기본값 인 값을 "% 1"(으)로 설정해야합니다.

+0

작동하지 않습니다. – barbaris

+0

확장 프로그램은 어떻게 등록됩니까? 어떤 파일 유형입니까? reg 파일을 업로드하십시오. – Xearinox

+0

질문에 대답을 추가했습니다. – barbaris

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

+0

추가 된 bounty,하지만 당신의 대답은 진짜 대답이 아닙니다. – Xearinox

+0

아, 현상금 감사합니다. 하지만 지금은 그것이 가치가없는 것처럼 느껴집니다. 정확히 왜이 답변이 도움이되지 않았습니까? 당신이 그것을 시도했을 때 무슨 일이 일어 났습니까? –