[SHELL32] CShellItem: Fix GetDisplayName and Compare
authorGiannis Adamopoulos <gadamopoulos@reactos.org>
Tue, 20 Feb 2018 14:59:00 +0000 (16:59 +0200)
committerGiannis Adamopoulos <gadamopoulos@reactos.org>
Tue, 20 Feb 2018 14:59:00 +0000 (16:59 +0200)
The two methods were completely broken because they passed a full pidl to the parent folder (and not desktop folder).
Compile SHGetNameFromIDList to use it in CShellItem but don't export it.

dll/win32/shell32/CShellItem.cpp
dll/win32/shell32/wine/pidl.c

index f0a6ee6..d403adc 100644 (file)
@@ -159,52 +159,7 @@ HRESULT WINAPI CShellItem::GetParent(IShellItem **ppsi)
 
 HRESULT WINAPI CShellItem::GetDisplayName(SIGDN sigdnName, LPWSTR *ppszName)
 {
-    HRESULT hr;
-    CComPtr<IShellFolder>        parent_folder;
-    STRRET name;
-    DWORD uFlags;
-
-    TRACE("(%p,%x,%p)\n", this, sigdnName, ppszName);
-
-    if (sigdnName & SIGDN_URL)
-        return E_NOTIMPL;
-
-    if (ppszName == NULL)
-        return E_POINTER;
-
-    *ppszName = NULL;
-
-    hr = get_parent_shellfolder(&parent_folder);
-    if (SUCCEEDED(hr))
-    {
-        switch (sigdnName)
-        {
-        case SIGDN_PARENTRELATIVEEDITING:
-            uFlags = SHGDN_FOREDITING | SHGDN_INFOLDER;
-            break;
-        case SIGDN_DESKTOPABSOLUTEEDITING:
-            uFlags = SHGDN_FOREDITING;
-            break;
-        case SIGDN_PARENTRELATIVEPARSING:
-            uFlags = SHGDN_FORPARSING | SHGDN_INFOLDER;
-            break;
-        case SIGDN_DESKTOPABSOLUTEPARSING:
-            uFlags = SHGDN_FORPARSING;
-            break;
-        default:
-            uFlags = SHGDN_NORMAL;
-            break;
-        }
-
-        hr = parent_folder->GetDisplayNameOf(m_pidl, uFlags, &name);
-        if (SUCCEEDED(hr))
-        {
-            StrRetToStrW(&name, m_pidl, ppszName);
-            return S_OK;
-        }
-    }
-
-    return hr;
+    return SHGetNameFromIDList(m_pidl, sigdnName, ppszName);
 }
 
 HRESULT WINAPI CShellItem::GetAttributes(SFGAOF sfgaoMask, SFGAOF *psfgaoAttribs)
@@ -237,7 +192,7 @@ HRESULT WINAPI CShellItem::Compare(IShellItem *oth, SICHINTF hint, int *piOrder)
 {
     HRESULT hr;
     CComPtr<IPersistIDList>      pIDList;
-    CComPtr<IShellFolder>        parent_folder;
+    CComPtr<IShellFolder>        psfDesktop;
     LPITEMIDLIST pidl;
 
     TRACE("(%p,%p,%x,%p)\n", this, oth, hint, piOrder);
@@ -251,11 +206,11 @@ HRESULT WINAPI CShellItem::Compare(IShellItem *oth, SICHINTF hint, int *piOrder)
         hr = pIDList->GetIDList(&pidl);
         if (SUCCEEDED(hr))
         {
-            hr = get_parent_shellfolder(&parent_folder);
+            hr = SHGetDesktopFolder(&psfDesktop);
             if (SUCCEEDED(hr))
             {
-                hr = parent_folder->CompareIDs(hint, m_pidl, pidl);
-                *piOrder = static_cast<int>(SCODE_CODE(hr));
+                hr = psfDesktop->CompareIDs(hint, m_pidl, pidl);
+                *piOrder = (int)(short)SCODE_CODE(hr);
             }
             ILFree(pidl);
         }
index 15faf04..4f917e1 100644 (file)
@@ -1403,8 +1403,6 @@ HRESULT WINAPI SHParseDisplayName(LPCWSTR pszName, IBindCtx *pbc,
     return hr;
 }
 
-#ifndef __REACTOS__
-
 /*************************************************************************
  * SHGetNameFromIDList             [SHELL32.@]
  */
@@ -1466,6 +1464,8 @@ HRESULT WINAPI SHGetNameFromIDList(PCIDLIST_ABSOLUTE pidl, SIGDN sigdnName, PWST
     return ret;
 }
 
+#ifndef __REACTOS__
+
 /*************************************************************************
  * SHGetIDListFromObject             [SHELL32.@]
  */