シェルアイテムの表示名やファイル名の取得

(2004.04.22)
    // 表示名やファイル名の取得
    // DWORD uFlags = SHGDN_NORMAL;                            // 表示名
    // DWORD uFlags = SHGDN_INFOLDER | SHGDN_FORPARSING;    // 親からの相対パス
    // DWORD uFlags = SHGDN_NORMAL | SHGDN_FORPARSING;        // フルパス
    static CString GetDisplayName(IShellFolderPtr spShellFolder, LPCITEMIDLIST pidl, DWORD uFlags)
    {
        if ((spShellFolder == NULL) || (pidl == NULL))
        {
            return _T("");
        }
 
        HRESULT hr = S_OK;
 
        STRRET strret;
        hr = spShellFolder->GetDisplayNameOf(pidl, uFlags, &strret);
        if (FAILED(hr))
        {
            return _T("");
        }
 
        return StrRetToString(&strret, pidl);
    }
 
 
    // APIラッパ
    static CString StrRetToString(LPSTRRET pstr, LPCITEMIDLIST pidl)
    {
        HRESULT hr = S_OK;
 
        TCHAR szResult[1024];
        hr = ::StrRetToBuf(pstr, pidl, szResult, sizeof(szResult));                    // SHLWAPI 5.0
        if (FAILED(hr))
        {
            return CString();
        }
 
        return szResult;
    }
    // APIエミュレーション
    // SHLWAPI 5.0 互換
    static HRESULT Emulete_StrRetToBuf(LPSTRRET pstr, LPCITEMIDLIST pidl, LPTSTR pszBuf, UINT cchBuf)
    {
        if (pstr == NULL || pidl == NULL)
        {
            return E_INVALIDARG;
        }
 
        if (pszBuf == NULL)
        {
            return E_POINTER;
        }
 
        CString strResult = _StrRetToString(pstr, pidl);
        lstrcpyn(pszBuf, strResult, cchBuf);
 
        return S_OK;
    }
    // SHLWAPI 5.0 互換
    HRESULT Emulate_StrRetToStr(LPSTRRET pstr, LPCITEMIDLIST pidl, LPTSTR* ppszName)
    {
        return E_NOTIMPL;
    }
    // SHLWAPI 5.5 互換
    static HRESULT Emulete_StrRetToBSTR(STRRET* pstr, LPCITEMIDLIST pidl, BSTR* pbstr)
    {
        if (pstr == NULL || pidl == NULL)
        {
            return E_INVALIDARG;
        }
 
        if (pbstr == NULL)
        {
            return E_POINTER;
        }
 
        CString strResult = _StrRetToString(pstr, pidl);
        *pbstr = strResult.AllocSysString();
 
        return S_OK;
    }
    static CString _StrRetToString(LPSTRRET pstr, LPCITEMIDLIST pidl)
    {
        CString strResult;
        switch (pstr->uType)
        {
        case STRRET_WSTR:
            strResult = pstr->pOleStr;
            break;
        case STRRET_CSTR:
            strResult = pstr->cStr;
            break;
        case STRRET_OFFSET:
            char* p = (char*)pidl;
            p = p + pstr->uOffset;
            strResult = p;
            break;
        }
 
        return strResult;
    }
一覧に戻る
© 2003 WAC.com All Right Reserved.