2017-02-25 5 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なく、システムイメージリストのインデックスではありません!この例で使用されているSIID_*の値は、this pageにあります。あなたがシステムのimagelistインデックスしか知っていない場合、IDefaultExtractIconInitを使用できるかどうかはわかりません。

ネームスペースの拡張子がの場合、はシステムのimagelistからアイコンを返します。シェルフォルダの実装ではIShellIconをサポートするだけでなくなります。それ以外の場合は、カスタムIExtractIconオブジェクトを作成する必要があります。

+0

ファイルシステム 'IShellFolder' +単純なpidlに' IExtractIcon'を単に委譲する方が簡単です。 –

+0

あなたの専門知識を共有していただきありがとう、Raymond。 –

関連する問題