/************************************************************************** * CDesktopFolder::GetDisplayNameOf * * NOTES * special case: pidl = null gives desktop-name back */ HRESULT WINAPI CDesktopFolder::GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet) { TRACE ("(%p)->(pidl=%p,0x%08x,%p)\n", this, pidl, dwFlags, strRet); pdump (pidl); if (!strRet) return E_INVALIDARG; if (!_ILIsPidlSimple (pidl)) { return SHELL32_GetDisplayNameOfChild(this, pidl, dwFlags, strRet); } else if (_ILIsDesktop(pidl)) { if ((GET_SHGDN_RELATION(dwFlags) == SHGDN_NORMAL) && (GET_SHGDN_FOR(dwFlags) & SHGDN_FORPARSING)) return SHSetStrRet(strRet, sPathTarget); else return HCR_GetClassName(CLSID_ShellDesktop, strRet); } /* file system folder or file rooted at the desktop */ CComPtr<IShellFolder2> psf; HRESULT hr = _GetSFFromPidl(pidl, &psf); if (FAILED_UNEXPECTEDLY(hr)) return hr; return psf->GetDisplayNameOf(pidl, dwFlags, strRet); }
HRESULT WINAPI CRegFolder::GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet) { if (!strRet || (!_ILIsSpecialFolder(pidl) && pidl != NULL)) return E_INVALIDARG; if (!pidl || !pidl->mkid.cb) { if ((GET_SHGDN_RELATION(dwFlags) == SHGDN_NORMAL) && (GET_SHGDN_FOR(dwFlags) & SHGDN_FORPARSING)) { LPWSTR pszPath = (LPWSTR)CoTaskMemAlloc((MAX_PATH + 1) * sizeof(WCHAR)); if (!pszPath) return E_OUTOFMEMORY; /* parsing name like ::{...} */ pszPath[0] = ':'; pszPath[1] = ':'; SHELL32_GUIDToStringW(m_guid, &pszPath[2]); strRet->uType = STRRET_WSTR; strRet->pOleStr = pszPath; return S_OK; } else { return HCR_GetClassName(m_guid, strRet); } } HRESULT hr; GUID const *clsid = _ILGetGUIDPointer (pidl); /* First of all check if we need to query the name from the child item */ if (GET_SHGDN_FOR (dwFlags) == SHGDN_FORPARSING && GET_SHGDN_RELATION (dwFlags) == SHGDN_NORMAL) { int bWantsForParsing = FALSE; /* * We can only get a filesystem path from a shellfolder if the * value WantsFORPARSING in CLSID\\{...}\\shellfolder exists. * * Exception: The MyComputer folder doesn't have this key, * but any other filesystem backed folder it needs it. */ if (IsEqualIID (*clsid, CLSID_MyComputer)) { bWantsForParsing = TRUE; } else { HKEY hkeyClass; if (HCR_RegOpenClassIDKey(*clsid, &hkeyClass)) { LONG res = SHGetValueW(hkeyClass, L"Shellfolder", L"WantsForParsing", NULL, NULL, NULL); bWantsForParsing = (res == ERROR_SUCCESS); RegCloseKey(hkeyClass); } } if (bWantsForParsing) { /* * we need the filesystem path to the destination folder. * Only the folder itself can know it */ return SHELL32_GetDisplayNameOfChild (this, pidl, dwFlags, strRet); } } /* Allocate the buffer for the result */ LPWSTR pszPath = (LPWSTR)CoTaskMemAlloc((MAX_PATH + 1) * sizeof(WCHAR)); if (!pszPath) return E_OUTOFMEMORY; hr = S_OK; if (GET_SHGDN_FOR (dwFlags) == SHGDN_FORPARSING) { wcscpy(pszPath, m_rootPath); PWCHAR pItemName = &pszPath[wcslen(pszPath)]; /* parsing name like ::{...} */ pItemName[0] = ':'; pItemName[1] = ':'; SHELL32_GUIDToStringW (*clsid, &pItemName[2]); } else { /* user friendly name */ if (!HCR_GetClassNameW (*clsid, pszPath, MAX_PATH)) hr = E_FAIL; } if (SUCCEEDED(hr)) { strRet->uType = STRRET_WSTR; strRet->pOleStr = pszPath; } else { CoTaskMemFree(pszPath); } return hr; }