// 表示名やファイル名の取得
// 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;
}