Damjan Jovanovic : shell32: Implement IID_IContextMenu in CreateViewObject() methods for shell folders that support it.

Alexandre Julliard julliard at winehq.org
Mon May 3 16:37:05 CDT 2021


Module: wine
Branch: master
Commit: ad412b11a7ea17b708994ed6609f8ed0cbfb169b
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=ad412b11a7ea17b708994ed6609f8ed0cbfb169b

Author: Damjan Jovanovic <damjan.jov at gmail.com>
Date:   Mon May  3 03:12:07 2021 +0200

shell32: Implement IID_IContextMenu in CreateViewObject() methods for shell folders that support it.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=39841
Signed-off-by: Damjan Jovanovic <damjan.jov at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/shell32/cpanelfolder.c     |  6 ++--
 dlls/shell32/recyclebin.c       |  2 ++
 dlls/shell32/shfldr_desktop.c   |  3 +-
 dlls/shell32/shfldr_fs.c        |  3 +-
 dlls/shell32/shfldr_mycomp.c    |  3 +-
 dlls/shell32/shfldr_netplaces.c | 10 +++---
 dlls/shell32/shfldr_printers.c  |  5 ++-
 dlls/shell32/shfldr_unixfs.c    |  2 ++
 dlls/shell32/tests/shlfolder.c  | 72 +++++++++++++++++++++++++++++++++++++++++
 9 files changed, 91 insertions(+), 15 deletions(-)

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();




More information about the wine-cvs mailing list