2017-02-25 78 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

如果你的命名空间扩展只有返回系统图像列表中的图标,你可能会在shell文件夹实现中支持IShellIcon。否则,您可能必须创建一个自定义的IExtractIcon对象。

+0

更容易的是将'IExtractIcon'委托给文件系统'IShellFolder' +一个简单的pidl。 –

+0

我很感谢你分享你的专业知识,雷蒙德。 –