2017-02-25 3 views
0

네임 스페이스 확장의 가상 파일에 아이콘을 추가하려고합니다. 파일은 .docx, .pdf 및 기타 Windows 이외의 기본 확장명이지만이 작업을 수행하는 방법은 분명하지 않습니다. IDefaultExtractIconInit::SetNormalIcon(LPCWSTR pszFile, int iIcon)은 아이콘 및 아이콘 ID에 대한 파일 경로를 허용합니다. SHGetFileInfo를 호출하여 아이콘 경로 및 인덱스를 가져 오지 못하면 경로를 반환하지 못하고 성공을 반환합니다. SHGetFileInfo는 올바른 아이콘 인덱스를 시스템 아이콘 캐시에 반환하고 사용하고 싶습니다. 그러나 해당 인덱스를 SetNormalIcon (NULL, idx)에 전달하면 올바른 아이콘을 설정할 수 없습니다. 파일 아이콘은 어떻게 설정합니까?네임 스페이스 확장에서 아이콘을 가상 파일로 설정하는 방법은 무엇입니까?

STDMETHODIMP CShellFolder::GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT *rgfReserved, void **ppv) { 
    *ppv  = NULL; 
    HRESULT hr = E_NOTIMPL; 
    if (IID_IExtractIcon == riid) { 
     IDefaultExtractIconInit *pdxi = NULL; 
     hr        = SHCreateDefaultExtractIcon(IID_PPV_ARGS(&pdxi)); 
     if (SUCCEEDED(hr)) { 
      BOOL isFolder = FALSE; 
      hr    = m_pPidlMgr->IsFolder(apidl[0], &isFolder); 
      if(SUCCEEDED(hr)) { 
       pdxi->SetFlags(GIL_FORSHELL); 
       hr = pdxi->SetNormalIcon(L"Shell32.dll", isFolder ? 4 : 1); 
       if (SUCCEEDED(hr)) 
        hr = pdxi->QueryInterface(riid, ppv); 
      } 
      pdxi->Release(); 
     } 
    } 
    return hr; 
} 

답변

0

정말 문서화 그러나 당신은 파일 이름으로 NULL 통과 할 때 인덱스는 SHSTOCKICONID value 아닌 시스템 이미지리스트의 인덱스하지! 이 예에서 this page에 사용 된 SIID_* 값을 볼 수 있습니다. 나는 당신이 단지 시스템 목록 색인을 알고 있다면 IDefaultExtractIconInit이 사용될 수 있는지 확신하지 못한다.

네임 스페이스 확장하면

당신이 당신 셸 폴더 구현에 IShellIcon을 지원 멀리 얻을 수 있습니다 이미지리스트 시스템에서 돌아 아이콘. 그렇지 않으면 사용자 지정 IExtractIcon 개체를 만들어야 할 수 있습니다.

+0

쉽게 파일 시스템'IShellFolder' + 단순한 pidl에'IExtractIcon'을 위임하는 것이 더 쉽습니다. –

+0

전문 지식을 공유해 주셔서 감사합니다, Raymond. –

관련 문제