[PATCH] shell32: Implement SHBindToFolderIDListParent.

Dmitry Timoshkov dmitry at baikal.ru
Thu Jun 9 06:47:34 CDT 2022


Based on SHBindToParent and SHBindToObject implementations.

Signed-off-by: Dmitry Timoshkov <dmitry at baikal.ru>
---
 dlls/shell32/pidl.c       | 56 +++++++++++++++++++++++++++++++++++++++
 dlls/shell32/shell32.spec |  1 +
 2 files changed, 57 insertions(+)

diff --git a/dlls/shell32/pidl.c b/dlls/shell32/pidl.c
index f9c91a79132..f004b2ff1b6 100644
--- a/dlls/shell32/pidl.c
+++ b/dlls/shell32/pidl.c
@@ -1364,6 +1364,62 @@ HRESULT WINAPI SHBindToObject(IShellFolder *psf, LPCITEMIDLIST pidl, IBindCtx *p
 }
 
 
+HRESULT WINAPI SHBindToFolderIDListParent(IShellFolder *psf, LPCITEMIDLIST pidl,
+    REFIID riid, void **ppv, LPCITEMIDLIST *ppidlLast)
+{
+    IShellFolder *psfDesktop = NULL;
+    LPITEMIDLIST pidlChild;
+    LPITEMIDLIST pidlParent;
+    HRESULT hr;
+
+    TRACE_(shell)("%p,%p,%s,%p,%p\n", psf, pidl, debugstr_guid(riid), ppv, ppidlLast);
+    pdump(pidl);
+
+    if (!ppv)
+        return E_INVALIDARG;
+
+    *ppv = NULL;
+
+    if (!psf)
+    {
+        hr = SHGetDesktopFolder(&psfDesktop);
+        if (FAILED(hr))
+            return hr;
+        psf = psfDesktop;
+    }
+
+    if (ppidlLast)
+        *ppidlLast = NULL;
+
+    if (_ILIsPidlSimple(pidl))
+    {
+        /* we are on desktop level */
+        if (ppidlLast)
+            *ppidlLast = ILClone(pidl);
+        hr = SHGetDesktopFolder((IShellFolder **)ppv);
+    }
+    else
+    {
+        pidlChild = ILClone(ILFindLastID(pidl));
+        pidlParent = ILClone(pidl);
+        ILRemoveLastID(pidlParent);
+
+        hr = IShellFolder_BindToObject(psf, pidlParent, NULL, riid, ppv);
+        if (SUCCEEDED(hr) && ppidlLast)
+            *ppidlLast = pidlChild;
+        else
+            ILFree(pidlChild);
+        ILFree(pidlParent);
+    }
+
+    if (psfDesktop)
+        IShellFolder_Release(psfDesktop);
+
+    TRACE_(shell)("-- ppv=%p ret=0x%08lx\n", *ppv, hr);
+    return hr;
+}
+
+
 /*************************************************************************
  * SHParseDisplayName             [SHELL32.@]
  */
diff --git a/dlls/shell32/shell32.spec b/dlls/shell32/shell32.spec
index f8bf8f246e8..5b812774e1f 100644
--- a/dlls/shell32/shell32.spec
+++ b/dlls/shell32/shell32.spec
@@ -334,6 +334,7 @@
 @ stdcall SHAssocEnumHandlers(wstr long ptr)
 @ stdcall SHBindToObject(ptr ptr ptr ptr ptr)
 @ stdcall SHBindToParent(ptr ptr ptr ptr)
+@ stdcall SHBindToFolderIDListParent(ptr ptr ptr ptr ptr)
 @ stdcall SHBrowseForFolder(ptr) SHBrowseForFolderA
 @ stdcall SHBrowseForFolderA(ptr)
 @ stdcall SHBrowseForFolderW(ptr)
-- 
2.36.1




More information about the wine-devel mailing list