From 67f99833cdb861a11720ad03685b439b599e3233 Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Thu, 15 Feb 2018 00:58:22 +0200 Subject: [PATCH] [SHELL32] CNewMenu: Don't use CWM_GETISHELLBROWSER. CDefaultContextMenu: Set the site for context menu extensions CNewMenu: Get SID_IFolderView service of the site to get the IShellView --- dll/win32/shell32/CDefaultContextMenu.cpp | 3 +++ dll/win32/shell32/CNewMenu.cpp | 21 +++++++++------------ dll/win32/shell32/CNewMenu.h | 2 +- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/dll/win32/shell32/CDefaultContextMenu.cpp b/dll/win32/shell32/CDefaultContextMenu.cpp index dcb754bd96e..0834995abd9 100644 --- a/dll/win32/shell32/CDefaultContextMenu.cpp +++ b/dll/win32/shell32/CDefaultContextMenu.cpp @@ -376,6 +376,9 @@ CDefaultContextMenu::LoadDynamicContextMenuHandler(HKEY hKey, const CLSID *pclsi return hr; } + if (m_site) + IUnknown_SetSite(pcm, m_site); + PDynamicShellEntry pEntry = (DynamicShellEntry *)HeapAlloc(GetProcessHeap(), 0, sizeof(DynamicShellEntry)); if (!pEntry) return E_OUTOFMEMORY; diff --git a/dll/win32/shell32/CNewMenu.cpp b/dll/win32/shell32/CNewMenu.cpp index 8dd1d86f747..4a17e9b58b2 100644 --- a/dll/win32/shell32/CNewMenu.cpp +++ b/dll/win32/shell32/CNewMenu.cpp @@ -404,7 +404,7 @@ CNewMenu::SHELLNEW_ITEM *CNewMenu::FindItemFromIdOffset(UINT IdOffset) return pItem; } -HRESULT CNewMenu::SelectNewItem(LPCMINVOKECOMMANDINFO lpici, LONG wEventId, UINT uFlags, LPWSTR pszName) +HRESULT CNewMenu::SelectNewItem(LONG wEventId, UINT uFlags, LPWSTR pszName) { CComPtr lpSB; CComPtr lpSV; @@ -415,16 +415,13 @@ HRESULT CNewMenu::SelectNewItem(LPCMINVOKECOMMANDINFO lpici, LONG wEventId, UINT /* Notify the view object about the new item */ SHChangeNotify(wEventId, uFlags, (LPCVOID) pszName, NULL); - /* FIXME: I think that this can be implemented using callbacks to the shell folder */ + if (!m_pSite) + return S_OK; - /* Note: CWM_GETISHELLBROWSER returns shell browser without adding reference */ - lpSB = (LPSHELLBROWSER)SendMessageA(lpici->hwnd, CWM_GETISHELLBROWSER, 0, 0); - if (!lpSB) - return E_FAIL; - - hr = lpSB->QueryActiveShellView(&lpSV); - if (FAILED(hr)) - return hr; + /* Get a pointer to the shell view */ + hr = IUnknown_QueryService(m_pSite, SID_IFolderView, IID_PPV_ARG(IShellView, &lpSV)); + if (FAILED_UNEXPECTEDLY(hr)) + return S_OK; /* Attempt to get the pidl of the new item */ hr = SHILCreateFromPathW(pszName, &pidl, NULL); @@ -466,7 +463,7 @@ HRESULT CNewMenu::CreateNewFolder(LPCMINVOKECOMMANDINFO lpici) return E_FAIL; /* Show and select the new item in the def view */ - SelectNewItem(lpici, SHCNE_MKDIR, SHCNF_PATHW, wszName); + SelectNewItem(SHCNE_MKDIR, SHCNF_PATHW, wszName); return S_OK; } @@ -572,7 +569,7 @@ HRESULT CNewMenu::CreateNewItem(SHELLNEW_ITEM *pItem, LPCMINVOKECOMMANDINFO lpcm if (bSuccess) { TRACE("Notifying fs %s\n", debugstr_w(wszName)); - SelectNewItem(lpcmi, SHCNE_CREATE, SHCNF_PATHW, wszName); + SelectNewItem(SHCNE_CREATE, SHCNF_PATHW, wszName); } else { diff --git a/dll/win32/shell32/CNewMenu.h b/dll/win32/shell32/CNewMenu.h index 2d2c52a355a..2475e725a9c 100644 --- a/dll/win32/shell32/CNewMenu.h +++ b/dll/win32/shell32/CNewMenu.h @@ -71,7 +71,7 @@ private: SHELLNEW_ITEM *FindItemFromIdOffset(UINT IdOffset); HRESULT CreateNewFolder(LPCMINVOKECOMMANDINFO lpici); HRESULT CreateNewItem(SHELLNEW_ITEM *pItem, LPCMINVOKECOMMANDINFO lpcmi); - HRESULT SelectNewItem(LPCMINVOKECOMMANDINFO lpici, LONG wEventId, UINT uFlags, LPWSTR pszName); + HRESULT SelectNewItem(LONG wEventId, UINT uFlags, LPWSTR pszName); public: CNewMenu();