diff --git a/dlls/shell32/cpanelfolder.c b/dlls/shell32/cpanelfolder.c index 114eb6babd3..f2e845e5dab 100644 --- a/dlls/shell32/cpanelfolder.c +++ b/dlls/shell32/cpanelfolder.c @@ -524,15 +524,15 @@ static HRESULT WINAPI ISF_ControlPanel_fnCreateViewObject(IShellFolder2 *iface, if (IsEqualIID(riid, &IID_IDropTarget)) { WARN("IDropTarget not implemented\n"); hr = E_NOTIMPL; - } else if (IsEqualIID(riid, &IID_IContextMenu)) { - WARN("IContextMenu not implemented\n"); - hr = E_NOTIMPL; } else if (IsEqualIID(riid, &IID_IShellView)) { pShellView = IShellView_Constructor((IShellFolder *) iface); if (pShellView) { hr = IShellView_QueryInterface(pShellView, riid, ppvOut); IShellView_Release(pShellView); } + } else { + FIXME("invalid/unsupported interface %s\n", shdebugstr_guid(riid)); + hr = E_NOINTERFACE; } } TRACE("--(%p)->(interface=%p)\n", This, ppvOut); diff --git a/dlls/shell32/recyclebin.c b/dlls/shell32/recyclebin.c index 49e7f5da322..971239a5f20 100644 --- a/dlls/shell32/recyclebin.c +++ b/dlls/shell32/recyclebin.c @@ -490,6 +490,8 @@ static HRESULT WINAPI RecycleBin_CreateViewObject(IShellFolder2 *iface, HWND hwn *ppv = tmp; return ret; } + else + FIXME("invalid/unsupported interface %s\n", debugstr_guid(riid)); return E_NOINTERFACE; } diff --git a/dlls/shell32/shfldr_desktop.c b/dlls/shell32/shfldr_desktop.c index 938871ee066..26f8c8cbd06 100644 --- a/dlls/shell32/shfldr_desktop.c +++ b/dlls/shell32/shfldr_desktop.c @@ -428,8 +428,7 @@ static HRESULT WINAPI ISF_Desktop_fnCreateViewObject (IShellFolder2 * iface, } else if (IsEqualIID (riid, &IID_IContextMenu)) { - WARN ("IContextMenu not implemented\n"); - hr = E_NOTIMPL; + hr = BackgroundMenu_Constructor((IShellFolder*)iface, TRUE, riid, ppvOut); } else if (IsEqualIID (riid, &IID_IShellView)) { diff --git a/dlls/shell32/shfldr_fs.c b/dlls/shell32/shfldr_fs.c index 22f568a592f..5b616c5242e 100644 --- a/dlls/shell32/shfldr_fs.c +++ b/dlls/shell32/shfldr_fs.c @@ -467,8 +467,7 @@ IShellFolder_fnCreateViewObject (IShellFolder2 * iface, HWND hwndOwner, if (IsEqualIID (riid, &IID_IDropTarget)) { hr = IShellFolder2_QueryInterface (iface, &IID_IDropTarget, ppvOut); } else if (IsEqualIID (riid, &IID_IContextMenu)) { - FIXME ("IContextMenu not implemented\n"); - hr = E_NOTIMPL; + hr = BackgroundMenu_Constructor((IShellFolder*)iface, FALSE, riid, ppvOut); } else if (IsEqualIID (riid, &IID_IShellView)) { pShellView = IShellView_Constructor ((IShellFolder *) iface); if (pShellView) { diff --git a/dlls/shell32/shfldr_mycomp.c b/dlls/shell32/shfldr_mycomp.c index 6a31e8ce1e6..7f5aaeb13fc 100644 --- a/dlls/shell32/shfldr_mycomp.c +++ b/dlls/shell32/shfldr_mycomp.c @@ -438,8 +438,7 @@ static HRESULT WINAPI ISF_MyComputer_fnCreateViewObject (IShellFolder2 *iface, } else if (IsEqualIID (riid, &IID_IContextMenu)) { - WARN ("IContextMenu not implemented\n"); - hr = E_NOTIMPL; + hr = BackgroundMenu_Constructor((IShellFolder*)iface, FALSE, riid, ppvOut); } else if (IsEqualIID (riid, &IID_IShellView)) { diff --git a/dlls/shell32/shfldr_netplaces.c b/dlls/shell32/shfldr_netplaces.c index 71b21c5e73d..e74336544f3 100644 --- a/dlls/shell32/shfldr_netplaces.c +++ b/dlls/shell32/shfldr_netplaces.c @@ -321,11 +321,6 @@ static HRESULT WINAPI ISF_NetworkPlaces_fnCreateViewObject (IShellFolder2 * ifac WARN ("IDropTarget not implemented\n"); hr = E_NOTIMPL; } - else if (IsEqualIID (riid, &IID_IContextMenu)) - { - WARN ("IContextMenu not implemented\n"); - hr = E_NOTIMPL; - } else if (IsEqualIID (riid, &IID_IShellView)) { pShellView = IShellView_Constructor ((IShellFolder *) iface); @@ -335,6 +330,11 @@ static HRESULT WINAPI ISF_NetworkPlaces_fnCreateViewObject (IShellFolder2 * ifac IShellView_Release (pShellView); } } + else + { + FIXME ("invalid/unsupported interface %s\n", shdebugstr_guid (riid)); + hr = E_NOINTERFACE; + } TRACE ("-- (%p)->(interface=%p)\n", This, ppvOut); return hr; } diff --git a/dlls/shell32/shfldr_printers.c b/dlls/shell32/shfldr_printers.c index 8e25e58857b..76375525c52 100644 --- a/dlls/shell32/shfldr_printers.c +++ b/dlls/shell32/shfldr_printers.c @@ -195,7 +195,10 @@ static HRESULT WINAPI IShellFolder_Printers_fnCreateViewObject(IShellFolder2 *if } } else - WARN("unsupported interface %s\n", shdebugstr_guid (riid)); + { + FIXME("unsupported interface %s\n", shdebugstr_guid (riid)); + hr = E_NOINTERFACE; + } return hr; } diff --git a/dlls/shell32/shfldr_unixfs.c b/dlls/shell32/shfldr_unixfs.c index 48d5fe4ecb6..cdd3951efb0 100644 --- a/dlls/shell32/shfldr_unixfs.c +++ b/dlls/shell32/shfldr_unixfs.c @@ -1117,6 +1117,8 @@ static HRESULT WINAPI ShellFolder2_CreateViewObject(IShellFolder2* iface, HWND h } } else if (IsEqualIID(&IID_IDropTarget, riid)) { hr = IShellFolder2_QueryInterface(iface, &IID_IDropTarget, ppv); + } else if (IsEqualIID(&IID_IContextMenu, riid)) { + hr = BackgroundMenu_Constructor((IShellFolder*)iface, FALSE, riid, ppv); } return hr; diff --git a/dlls/shell32/tests/shlfolder.c b/dlls/shell32/tests/shlfolder.c index a2c15d9f40e..cb238c959cd 100644 --- a/dlls/shell32/tests/shlfolder.c +++ b/dlls/shell32/tests/shlfolder.c @@ -4471,6 +4471,77 @@ static void test_GetUIObject(void) Cleanup(); } +static void test_CreateViewObject_contextmenu(void) +{ + IShellFolder *desktop; + IShellFolder *folder; + IContextMenu *cmenu; + WCHAR path[MAX_PATH]; + LPITEMIDLIST pidl; + HRESULT hr; + DWORD ret; + + hr = CoCreateInstance(&CLSID_ControlPanel, NULL, CLSCTX_INPROC_SERVER, &IID_IShellFolder, (void**)&folder); + ok(SUCCEEDED(hr), "got 0x%08x\n", hr); + hr = IShellFolder_CreateViewObject(folder, NULL, &IID_IContextMenu, (void**)&cmenu); + ok(hr == E_NOINTERFACE, "got 0x%08x\n", hr); + if (SUCCEEDED(hr)) + IContextMenu_Release(cmenu); + IShellFolder_Release(folder); + + hr = CoCreateInstance(&CLSID_MyComputer, NULL, CLSCTX_INPROC_SERVER, &IID_IShellFolder, (void**)&folder); + ok(SUCCEEDED(hr), "got 0x%08x\n", hr); + hr = IShellFolder_CreateViewObject(folder, NULL, &IID_IContextMenu, (void**)&cmenu); + ok(hr == S_OK, "got 0x%08x\n", hr); + if (SUCCEEDED(hr)) + IContextMenu_Release(cmenu); + IShellFolder_Release(folder); + + hr = CoCreateInstance(&CLSID_NetworkPlaces, NULL, CLSCTX_INPROC_SERVER, &IID_IShellFolder, (void**)&folder); + ok(SUCCEEDED(hr), "got 0x%08x\n", hr); + hr = IShellFolder_CreateViewObject(folder, NULL, &IID_IContextMenu, (void**)&cmenu); + ok(hr == E_NOINTERFACE, "got 0x%08x\n", hr); + if (SUCCEEDED(hr)) + IContextMenu_Release(cmenu); + IShellFolder_Release(folder); + + hr = CoCreateInstance(&CLSID_Printers, NULL, CLSCTX_INPROC_SERVER, &IID_IShellFolder, (void**)&folder); + ok(SUCCEEDED(hr), "got 0x%08x\n", hr); + hr = IShellFolder_CreateViewObject(folder, NULL, &IID_IContextMenu, (void**)&cmenu); + ok(hr == E_NOINTERFACE, "got 0x%08x\n", hr); + if (SUCCEEDED(hr)) + IContextMenu_Release(cmenu); + IShellFolder_Release(folder); + + hr = CoCreateInstance(&CLSID_RecycleBin, NULL, CLSCTX_INPROC_SERVER, &IID_IShellFolder, (void**)&folder); + ok(SUCCEEDED(hr), "got 0x%08x\n", hr); + hr = IShellFolder_CreateViewObject(folder, NULL, &IID_IContextMenu, (void**)&cmenu); + ok(hr == E_NOINTERFACE, "got 0x%08x\n", hr); + if (SUCCEEDED(hr)) + IContextMenu_Release(cmenu); + IShellFolder_Release(folder); + + hr = SHGetDesktopFolder(&desktop); + ok(hr == S_OK, "got 0x%08x\n", hr); + hr = IShellFolder_CreateViewObject(desktop, NULL, &IID_IContextMenu, (void**)&cmenu); + ok(hr == S_OK, "got 0x%08x\n", hr); + if (SUCCEEDED(hr)) + IContextMenu_Release(cmenu); + ret = GetCurrentDirectoryW(MAX_PATH, path); + ok(ret, "got %d\n", GetLastError()); + hr = IShellFolder_ParseDisplayName(desktop, NULL, NULL, path, NULL, &pidl, 0); + ok(hr == S_OK, "got 0x%08x\n", hr); + hr = IShellFolder_BindToObject(desktop, pidl, NULL, &IID_IShellFolder, (void**)&folder); + ok(hr == S_OK, "got 0x%08x\n", hr); + hr = IShellFolder_CreateViewObject(folder, NULL, &IID_IContextMenu, (void**)&cmenu); + ok(hr == S_OK, "got 0x%08x\n", hr); + if (SUCCEEDED(hr)) + IContextMenu_Release(cmenu); + IShellFolder_Release(folder); + ILFree(pidl); + IShellFolder_Release(desktop); +} + #define verify_pidl(i,p) r_verify_pidl(__LINE__, i, p) static void r_verify_pidl(unsigned l, LPCITEMIDLIST pidl, const WCHAR *path) { @@ -5313,6 +5384,7 @@ START_TEST(shlfolder) test_ShellItemArrayEnumItems(); test_desktop_IPersist(); test_GetUIObject(); + test_CreateViewObject_contextmenu(); test_SHSimpleIDListFromPath(); test_ParseDisplayNamePBC(); test_SHGetNameFromIDList();