From 1f73f3a5910d3d48e5e9a83c1139299f3debb070 Mon Sep 17 00:00:00 2001 From: David Hedberg Date: Tue, 24 Aug 2010 10:56:20 +0200 Subject: [PATCH] shell32: Support BHID_SFUIObject and BHID_DataObject in IShellItem::BindToHandler. --- dlls/shell32/shellitem.c | 20 +++++++++++++ dlls/shell32/tests/shlfolder.c | 51 ++++++++++++++++++++++++---------- 2 files changed, 57 insertions(+), 14 deletions(-) diff --git a/dlls/shell32/shellitem.c b/dlls/shell32/shellitem.c index 32840201288..d9e7e7b6877 100644 --- a/dlls/shell32/shellitem.c +++ b/dlls/shell32/shellitem.c @@ -190,6 +190,26 @@ static HRESULT WINAPI ShellItem_BindToHandler(IShellItem *iface, IBindCtx *pbc, } return ret; } + else if (IsEqualGUID(rbhid, &BHID_SFUIObject)) + { + IShellFolder *psf_parent; + if (_ILIsDesktop(This->pidl)) + ret = SHGetDesktopFolder(&psf_parent); + else + ret = ShellItem_get_parent_shellfolder(This, &psf_parent); + + if (SUCCEEDED(ret)) + { + LPCITEMIDLIST pidl = ILFindLastID(This->pidl); + ret = IShellFolder_GetUIObjectOf(psf_parent, NULL, 1, &pidl, riid, NULL, ppvOut); + IShellFolder_Release(psf_parent); + } + return ret; + } + else if (IsEqualGUID(rbhid, &BHID_DataObject)) + { + return ShellItem_BindToHandler((IShellItem*)This, pbc, &BHID_SFUIObject, &IID_IDataObject, ppvOut); + } FIXME("Unsupported BHID %s.\n", debugstr_guid(rbhid)); diff --git a/dlls/shell32/tests/shlfolder.c b/dlls/shell32/tests/shlfolder.c index e21b44d2a04..34bf59da5f7 100644 --- a/dlls/shell32/tests/shlfolder.c +++ b/dlls/shell32/tests/shlfolder.c @@ -1888,7 +1888,7 @@ static void test_SHCreateShellItem(void) { IShellItem *shellitem, *shellitem2; IPersistIDList *persistidl; - LPITEMIDLIST pidl_cwd=NULL, pidl_testfile, pidl_abstestfile, pidl_test; + LPITEMIDLIST pidl_cwd=NULL, pidl_testfile, pidl_abstestfile, pidl_test, pidl_desktop; HRESULT ret; char curdirA[MAX_PATH]; WCHAR curdirW[MAX_PATH]; @@ -1910,6 +1910,17 @@ static void test_SHCreateShellItem(void) return; } + if(pSHGetSpecialFolderLocation) + { + ret = pSHGetSpecialFolderLocation(NULL, CSIDL_DESKTOP, &pidl_desktop); + ok(ret == S_OK, "Got 0x%08x\n", ret); + } + else + { + win_skip("pSHGetSpecialFolderLocation missing.\n"); + pidl_desktop = NULL; + } + MultiByteToWideChar(CP_ACP, 0, curdirA, -1, curdirW, MAX_PATH); ret = SHGetDesktopFolder(&desktopfolder); @@ -2058,6 +2069,17 @@ static void test_SHCreateShellItem(void) } IPersistIDList_Release(persistidl); } + + IShellItem_Release(shellitem); + } + + ret = pSHCreateShellItem(NULL, NULL, pidl_desktop, &shellitem); + ok(SUCCEEDED(ret), "SHCreateShellItem returned %x\n", ret); + if (SUCCEEDED(ret)) + { + ret = IShellItem_GetParent(shellitem, &shellitem2); + ok(FAILED(ret), "Got 0x%08x\n", ret); + if(SUCCEEDED(ret)) IShellItem_Release(shellitem2); IShellItem_Release(shellitem); } @@ -2161,6 +2183,7 @@ static void test_SHCreateShellItem(void) DeleteFileA(".\\testfile"); pILFree(pidl_abstestfile); pILFree(pidl_testfile); + pILFree(pidl_desktop); pILFree(pidl_cwd); IShellFolder_Release(currentfolder); IShellFolder_Release(desktopfolder); @@ -3270,16 +3293,21 @@ static void test_ShellItemBindToHandler(void) IPersistFolder2_Release(ppf2); } + /* BHID_SFUIObject */ + hr = IShellItem_BindToHandler(psi, NULL, &BHID_SFUIObject, &IID_IDataObject, (void**)&punk); + ok(hr == S_OK || broken(hr == E_NOINTERFACE /* XP */), "Got 0x%08x\n", hr); + if(SUCCEEDED(hr)) IUnknown_Release(punk); + hr = IShellItem_BindToHandler(psi, NULL, &BHID_SFUIObject, &IID_IContextMenu, (void**)&punk); + ok(hr == S_OK || broken(hr == E_NOINTERFACE /* XP */), "Got 0x%08x\n", hr); + if(SUCCEEDED(hr)) IUnknown_Release(punk); + + /* BHID_DataObject */ + hr = IShellItem_BindToHandler(psi, NULL, &BHID_DataObject, &IID_IDataObject, (void**)&punk); + ok(hr == S_OK || broken(hr == MK_E_NOOBJECT /* XP */), "Got 0x%08x\n", hr); + if(SUCCEEDED(hr)) IUnknown_Release(punk); + todo_wine { - /* BHID_SFUIObject */ - hr = IShellItem_BindToHandler(psi, NULL, &BHID_SFUIObject, &IID_IDataObject, (void**)&punk); - ok(hr == S_OK || broken(hr == E_NOINTERFACE /* XP */), "Got 0x%08x\n", hr); - if(SUCCEEDED(hr)) IUnknown_Release(punk); - hr = IShellItem_BindToHandler(psi, NULL, &BHID_SFUIObject, &IID_IContextMenu, (void**)&punk); - ok(hr == S_OK || broken(hr == E_NOINTERFACE /* XP */), "Got 0x%08x\n", hr); - if(SUCCEEDED(hr)) IUnknown_Release(punk); - /* BHID_SFViewObject */ hr = IShellItem_BindToHandler(psi, NULL, &BHID_SFViewObject, &IID_IShellView, (void**)&punk); ok(hr == S_OK, "Got 0x%08x\n", hr); @@ -3319,11 +3347,6 @@ static void test_ShellItemBindToHandler(void) ok(hr == S_OK || broken(hr == MK_E_NOOBJECT /* XP */), "Got 0x%08x\n", hr); if(SUCCEEDED(hr)) IUnknown_Release(punk); - /* BHID_DataObject */ - hr = IShellItem_BindToHandler(psi, NULL, &BHID_DataObject, &IID_IDataObject, (void**)&punk); - ok(hr == S_OK || broken(hr == MK_E_NOOBJECT /* XP */), "Got 0x%08x\n", hr); - if(SUCCEEDED(hr)) IUnknown_Release(punk); - /* BHID_Filter */ hr = IShellItem_BindToHandler(psi, NULL, &BHID_Filter, &IID_IUnknown, (void**)&punk); ok(hr == S_OK || broken(hr == MK_E_NOOBJECT /* XP */), "Got 0x%08x\n", hr);