[PATCH] shell32: Implement SHBindToFolderIDListParent.
Nikolay Sivov
nsivov at codeweavers.com
Thu Jun 9 07:25:16 CDT 2022
On 6/9/22 14:47, Dmitry Timoshkov wrote:
> 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);
> + }
This could use a test. For example, passed root folder ignored for
simple pidl case, riid is ignored there as well. Returned last pidls are
allocated, and they are not allocated in SHBindToParent().
> +
> + 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)
More information about the wine-devel
mailing list