From: Mohamad Al-Jaf mohamadaljaf@gmail.com
Called by IE11.
Signed-off-by: Mohamad Al-Jaf mohamadaljaf@gmail.com --- dlls/shell32/pidl.c | 46 +++++++++++++++++++++++++-------------- dlls/shell32/shell32.spec | 1 + include/shlobj.h | 2 ++ 3 files changed, 33 insertions(+), 16 deletions(-)
diff --git a/dlls/shell32/pidl.c b/dlls/shell32/pidl.c index f9c91a79132..73141c50a0b 100644 --- a/dlls/shell32/pidl.c +++ b/dlls/shell32/pidl.c @@ -1286,49 +1286,63 @@ BOOL WINAPI SHGetPathFromIDListEx(LPCITEMIDLIST pidl, WCHAR *path, DWORD path_si }
/************************************************************************* - * SHBindToParent [shell version 5.0] + * SHBindToFolderIDListParent [SHELL32.@] */ -HRESULT WINAPI SHBindToParent(LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppv, LPCITEMIDLIST *ppidlLast) +HRESULT WINAPI SHBindToFolderIDListParent(IShellFolder *psf, LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppv, LPCITEMIDLIST *ppidlLast) { - IShellFolder * psfDesktop; - HRESULT hr=E_FAIL; + IShellFolder *psfDesktop = NULL; + HRESULT hr;
- TRACE_(shell)("pidl=%p\n", pidl); + TRACE_(shell)("%p,%p,%s\n", psf, pidl, debugstr_guid(riid)); pdump(pidl); - + + if (ppidlLast) + *ppidlLast = NULL; + if (!pidl || !ppv) return E_INVALIDARG; - + *ppv = NULL; - if (ppidlLast) - *ppidlLast = NULL;
- hr = SHGetDesktopFolder(&psfDesktop); - if (FAILED(hr)) - return hr; + if (!psf) + { + hr = SHGetDesktopFolder(&psfDesktop); + if (FAILED(hr)) + return hr; + psf = psfDesktop; + }
if (_ILIsPidlSimple(pidl)) { /* we are on desktop level */ - hr = IShellFolder_QueryInterface(psfDesktop, riid, ppv); + hr = IShellFolder_QueryInterface(psf, riid, ppv); } else { LPITEMIDLIST pidlParent = ILClone(pidl); ILRemoveLastID(pidlParent); - hr = IShellFolder_BindToObject(psfDesktop, pidlParent, NULL, riid, ppv); + hr = IShellFolder_BindToObject(psf, pidlParent, NULL, riid, ppv); SHFree (pidlParent); }
- IShellFolder_Release(psfDesktop); + if (psfDesktop) + IShellFolder_Release(psfDesktop);
if (SUCCEEDED(hr) && ppidlLast) *ppidlLast = ILFindLastID(pidl);
- TRACE_(shell)("-- psf=%p pidl=%p ret=0x%08lx\n", *ppv, (ppidlLast)?*ppidlLast:NULL, hr); + TRACE_(shell)("-- ppv=%p pidl=%p ret=0x%08lx\n", *ppv, (ppidlLast)?*ppidlLast:NULL, hr); return hr; }
+/************************************************************************* + * SHBindToParent [shell version 5.0] + */ +HRESULT WINAPI SHBindToParent(LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppv, LPCITEMIDLIST *ppidlLast) +{ + return SHBindToFolderIDListParent(NULL, pidl, riid, ppv, ppidlLast); +} + HRESULT WINAPI SHBindToObject(IShellFolder *psf, LPCITEMIDLIST pidl, IBindCtx *pbc, REFIID riid, void **ppv) { IShellFolder *psfDesktop = NULL; 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) diff --git a/include/shlobj.h b/include/shlobj.h index feee6cd9b98..724a2b66c11 100644 --- a/include/shlobj.h +++ b/include/shlobj.h @@ -1742,6 +1742,8 @@ HRESULT WINAPI SHGetFolderPathW(HWND hwnd, int nFolder, HANDLE hToken, DWORD dwF */ HRESULT WINAPI SHGetDesktopFolder(IShellFolder * *);
+HRESULT WINAPI SHBindToFolderIDListParent(IShellFolder *psf, LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppv, LPCITEMIDLIST *ppidlLast); + /**************************************************************************** * SHBindToParent API */