https://git.reactos.org/?p=reactos.git;a=commitdiff;h=143c3060066f1d67ca11c4...
commit 143c3060066f1d67ca11c48d4773d42e50726f18 Author: Giannis Adamopoulos gadamopoulos@reactos.org AuthorDate: Sun Oct 22 18:59:01 2017 +0300
[BROWSEUI] CBandSiteMenu: Use CSimpleArray and CComHeapPtr. --- dll/win32/browseui/precomp.h | 1 + dll/win32/browseui/shellbars/CBandSiteMenu.cpp | 108 +++++++++---------------- dll/win32/browseui/shellbars/CBandSiteMenu.h | 6 +- dll/win32/browseui/shellbars/CMakeLists.txt | 3 + dll/win32/browseui/shellbars/shellbars.h | 1 + 5 files changed, 45 insertions(+), 74 deletions(-)
diff --git a/dll/win32/browseui/precomp.h b/dll/win32/browseui/precomp.h index 26ff15a23d..3303834b13 100644 --- a/dll/win32/browseui/precomp.h +++ b/dll/win32/browseui/precomp.h @@ -21,6 +21,7 @@ #include <atlbase.h> #include <atlcom.h> #include <atlwin.h> +#include <atlsimpcoll.h> #include <undocuser.h> #include <perhist.h> #include <exdispid.h> diff --git a/dll/win32/browseui/shellbars/CBandSiteMenu.cpp b/dll/win32/browseui/shellbars/CBandSiteMenu.cpp index 0f8089791d..ea0f9cf9b6 100644 --- a/dll/win32/browseui/shellbars/CBandSiteMenu.cpp +++ b/dll/win32/browseui/shellbars/CBandSiteMenu.cpp @@ -32,7 +32,6 @@ #define FIRST_COMCAT_MENU_ID 0x5
CBandSiteMenu::CBandSiteMenu(): - m_comcatDsa(NULL), m_hmenu(NULL), m_DesktopPidl(NULL), m_QLaunchPidl(NULL) @@ -44,15 +43,6 @@ CBandSiteMenu::~CBandSiteMenu() if (m_hmenu) DestroyMenu(m_hmenu);
- if (m_comcatDsa) - DSA_Destroy(m_comcatDsa); - - if (m_DesktopPidl) - ILFree(m_DesktopPidl); - - if (m_QLaunchPidl) - ILFree(m_QLaunchPidl); - m_BandSite = NULL; }
@@ -67,7 +57,7 @@ HRESULT WINAPI CBandSiteMenu::FinalConstruct() if (FAILED_UNEXPECTEDLY(hr)) return hr;
- m_QLaunchPidl = ILCreateFromPathW(buffer); + m_QLaunchPidl.Attach(ILCreateFromPathW(buffer)); if (m_QLaunchPidl == NULL) return E_FAIL;
@@ -90,18 +80,11 @@ HRESULT CBandSiteMenu::_CreateMenuPart() if (m_hmenu) DestroyMenu(m_hmenu);
- if (m_comcatDsa) - DSA_Destroy(m_comcatDsa); - /* Load the template we will fill in */ m_hmenu = LoadMenuW(GetModuleHandleW(L"browseui.dll"), MAKEINTRESOURCEW(IDM_TASKBAR_TOOLBARS)); if (!m_hmenu) return HRESULT_FROM_WIN32(GetLastError());
- m_comcatDsa = DSA_Create(sizeof(GUID), 5); - if (!m_comcatDsa) - return E_OUTOFMEMORY; - /* Get the handle of the submenu where the available items will be shown */ hmenuToolbars = GetSubMenu(m_hmenu, 0);
@@ -110,6 +93,8 @@ HRESULT CBandSiteMenu::_CreateMenuPart() if (FAILED_UNEXPECTEDLY(hr)) return hr;
+ m_ComCatGuids.RemoveAll(); + /* Enumerate the classes in the CATID_DeskBand category */ cBands = 0; do @@ -128,8 +113,8 @@ HRESULT CBandSiteMenu::_CreateMenuPart() SHGetValue(HKEY_CLASSES_ROOT, wRegKey, NULL, NULL, wszBandName, &dwDataSize);
/* Insert it */ - InsertMenu(hmenuToolbars, cBands, MF_BYPOSITION, DSA_GetItemCount(m_comcatDsa) + FIRST_COMCAT_MENU_ID, wszBandName); - DSA_AppendItem(m_comcatDsa, &iter); + InsertMenu(hmenuToolbars, cBands, MF_BYPOSITION, m_ComCatGuids.GetSize() + FIRST_COMCAT_MENU_ID, wszBandName); + m_ComCatGuids.Add(iter); cBands++; } while (dwRead > 0); @@ -148,24 +133,21 @@ HRESULT CBandSiteMenu::_CreateNewISFBand(HWND hwnd, REFIID riid, void** ppv) else bi.lpszTitle = L"Choose a folder";
- LPITEMIDLIST pidlSelected = SHBrowseForFolderW(&bi); + CComHeapPtr<ITEMIDLIST> pidlSelected; + pidlSelected.Attach(SHBrowseForFolderW(&bi)); if (pidlSelected == NULL) return S_FALSE;
CComPtr<IShellFolderBand> pISFB; HRESULT hr = CISFBand_CreateInstance(IID_IShellFolderBand, (PVOID*)&pISFB); if (FAILED_UNEXPECTEDLY(hr)) - goto done; + return hr;
hr = pISFB->InitializeSFB(NULL, pidlSelected); if (FAILED_UNEXPECTEDLY(hr)) - goto done; - - hr = pISFB->QueryInterface(riid, ppv); + return hr;
-done: - ILFree(pidlSelected); - return hr; + return pISFB->QueryInterface(riid, ppv); }
HRESULT CBandSiteMenu::_CreateBuiltInISFBand(UINT uID, REFIID riid, void** ppv) @@ -206,15 +188,19 @@ HRESULT CBandSiteMenu::_AddISFBandToMenu(HMENU hmenu, UINT indexMenu, UINT idCmd if (FAILED_UNEXPECTEDLY(hr)) return hr;
- if (!bi.pidl) + CComHeapPtr<ITEMIDLIST> pidl(bi.pidl); + if (!pidl) + { + ERR("Failed to get the pidl of the CISFBand\n"); return E_OUTOFMEMORY; + }
WCHAR buffer[MAX_PATH]; - hr = ILGetDisplayNameEx(NULL, bi.pidl, buffer, ILGDN_INFOLDER) ? S_OK : E_FAIL; + hr = ILGetDisplayNameEx(NULL, pidl, buffer, ILGDN_INFOLDER) ? S_OK : E_FAIL; if (FAILED_UNEXPECTEDLY(hr)) return hr;
- UINT id = idCmdFirst + DSA_GetItemCount(m_comcatDsa) + FIRST_COMCAT_MENU_ID + dwBandID; + UINT id = idCmdFirst + m_ComCatGuids.GetSize() + FIRST_COMCAT_MENU_ID + dwBandID; if (id >= idCmdLast) return E_FAIL;
@@ -225,60 +211,39 @@ HRESULT CBandSiteMenu::_AddISFBandToMenu(HMENU hmenu, UINT indexMenu, UINT idCmd
UINT CBandSiteMenu::_GetMenuIdFromISFBand(IUnknown *pBand) { - UINT ret = UINT_MAX; - CComPtr<IShellFolderBand> psfb; HRESULT hr = pBand->QueryInterface(IID_PPV_ARG(IShellFolderBand, &psfb)); if (FAILED_UNEXPECTEDLY(hr)) - return ret; + return UINT_MAX;
BANDINFOSFB bi = {ISFB_MASK_IDLIST}; hr = psfb->GetBandInfoSFB(&bi); if (FAILED_UNEXPECTEDLY(hr)) - return ret; + return UINT_MAX;
- CComPtr<IShellFolder> psfDesktop; - LPITEMIDLIST pidl = bi.pidl; + CComHeapPtr<ITEMIDLIST> pidl(bi.pidl); if (!pidl) - return ret; + { + ERR("Failed to get the pidl of the CISFBand\n"); + return UINT_MAX; + }
if (pidl->mkid.cb == 0) { - ret = IDM_TASKBAR_TOOLBARS_DESKTOP; - goto done; + return IDM_TASKBAR_TOOLBARS_DESKTOP; }
+ CComPtr<IShellFolder> psfDesktop; hr = SHGetDesktopFolder(&psfDesktop); if (FAILED_UNEXPECTEDLY(hr)) - goto done; + return UINT_MAX;
hr = psfDesktop->CompareIDs(0, pidl, m_QLaunchPidl); if (FAILED_UNEXPECTEDLY(hr)) - goto done; + return UINT_MAX;
if (HRESULT_CODE(hr) == 0) - ret = IDM_TASKBAR_TOOLBARS_QUICKLAUNCH; - -done: - if (pidl) - ILFree(pidl); - - return ret; -} - -UINT CBandSiteMenu::_GetMenuIdFromBand(CLSID *BandCLSID) -{ - /* Try to find the clsid of the band in the dsa */ - UINT count = DSA_GetItemCount(m_comcatDsa); - for (UINT i = 0; i < count; i++) - { - GUID* pdsaGUID = (GUID*)DSA_GetItemPtr(m_comcatDsa, i); - if (IsEqualGUID(*pdsaGUID, *BandCLSID)) - { - /* The index in the dsa is also the index in the menu */ - return i + FIRST_COMCAT_MENU_ID; - } - } + return IDM_TASKBAR_TOOLBARS_QUICKLAUNCH;
return UINT_MAX; } @@ -294,7 +259,7 @@ UINT CBandSiteMenu::_GetBandIdFromClsid(CLSID* pclsid) if (FAILED(m_BandSite->GetBandObject(dwBandID, IID_PPV_ARG(IPersist, &pBand)))) continue;
- if (FAILED(pBand->GetClassID(&BandCLSID))) + if (FAILED_UNEXPECTEDLY(pBand->GetClassID(&BandCLSID))) continue;
if (IsEqualGUID(*pclsid, BandCLSID)) @@ -315,7 +280,7 @@ UINT CBandSiteMenu::_GetBandIdForBuiltinISFBand(UINT uID) if (FAILED(m_BandSite->GetBandObject(dwBandID, IID_PPV_ARG(IPersist, &pBand)))) continue;
- if (FAILED(pBand->GetClassID(&BandCLSID))) + if (FAILED_UNEXPECTEDLY(pBand->GetClassID(&BandCLSID))) continue;
if (!IsEqualGUID(BandCLSID, CLSID_ISFBand)) @@ -360,7 +325,7 @@ HRESULT STDMETHODCALLTYPE CBandSiteMenu::QueryContextMenu( if (FAILED(m_BandSite->GetBandObject(dwBandID, IID_PPV_ARG(IPersist, &pBand)))) continue;
- if (FAILED(pBand->GetClassID(&BandCLSID))) + if (FAILED_UNEXPECTEDLY(pBand->GetClassID(&BandCLSID))) continue;
UINT menuID; @@ -378,7 +343,8 @@ HRESULT STDMETHODCALLTYPE CBandSiteMenu::QueryContextMenu( } else { - menuID = _GetMenuIdFromBand(&BandCLSID); + int i = m_ComCatGuids.Find(BandCLSID); + menuID = (i == -1 ? UINT_MAX : i + FIRST_COMCAT_MENU_ID); }
if (menuID != UINT_MAX) @@ -411,9 +377,9 @@ HRESULT STDMETHODCALLTYPE CBandSiteMenu::InvokeCommand(LPCMINVOKECOMMANDINFO lpi
return S_OK; } - else if (uID > (UINT)DSA_GetItemCount(m_comcatDsa) + FIRST_COMCAT_MENU_ID ) + else if (uID > (UINT) m_ComCatGuids.GetSize() + FIRST_COMCAT_MENU_ID ) { - dwBandID = uID - (DSA_GetItemCount(m_comcatDsa) + FIRST_COMCAT_MENU_ID ); + dwBandID = uID - (m_ComCatGuids.GetSize() + FIRST_COMCAT_MENU_ID );
m_BandSite->RemoveBand(dwBandID);
@@ -441,7 +407,7 @@ HRESULT STDMETHODCALLTYPE CBandSiteMenu::InvokeCommand(LPCMINVOKECOMMANDINFO lpi }
/* Get the GUID of the item that was clicked */ - GUID *pguidToolbar = (GUID *)DSA_GetItemPtr(m_comcatDsa, uID - FIRST_COMCAT_MENU_ID); + GUID *pguidToolbar = &m_ComCatGuids[uID - FIRST_COMCAT_MENU_ID]; if (!pguidToolbar) return E_FAIL;
diff --git a/dll/win32/browseui/shellbars/CBandSiteMenu.h b/dll/win32/browseui/shellbars/CBandSiteMenu.h index f05107b529..6a78ae7c54 100644 --- a/dll/win32/browseui/shellbars/CBandSiteMenu.h +++ b/dll/win32/browseui/shellbars/CBandSiteMenu.h @@ -29,10 +29,10 @@ class CBandSiteMenu : public IShellService { CComPtr<IBandSite> m_BandSite; - HDSA m_comcatDsa; + CSimpleArray<GUID> m_ComCatGuids; HMENU m_hmenu; - LPITEMIDLIST m_DesktopPidl; - LPITEMIDLIST m_QLaunchPidl; + CComHeapPtr<ITEMIDLIST> m_DesktopPidl; + CComHeapPtr<ITEMIDLIST> m_QLaunchPidl;
HRESULT _CreateMenuPart(); HRESULT _CreateNewISFBand(HWND hwnd, REFIID riid, void** ppv); diff --git a/dll/win32/browseui/shellbars/CMakeLists.txt b/dll/win32/browseui/shellbars/CMakeLists.txt index d52e71807c..28c55176b5 100644 --- a/dll/win32/browseui/shellbars/CMakeLists.txt +++ b/dll/win32/browseui/shellbars/CMakeLists.txt @@ -3,6 +3,7 @@ PROJECT(SHELL) set_cpp(WITH_RUNTIME)
add_definitions(-DUNICODE -D_UNICODE) +add_definitions(-D_ATL_NO_EXCEPTIONS)
include_directories(${REACTOS_SOURCE_DIR}/sdk/lib/atl)
@@ -16,6 +17,8 @@ list(APPEND SOURCE add_library(shellbars ${SOURCE}) add_dependencies(shellbars xdk)
+target_link_libraries(shellbars atlnew) + if(NOT MSVC) if(NOT CMAKE_C_COMPILER_ID STREQUAL "Clang") add_target_compile_flags(shellbars "-Wno-unused-but-set-variable") diff --git a/dll/win32/browseui/shellbars/shellbars.h b/dll/win32/browseui/shellbars/shellbars.h index ae1e6ed218..b6ebf70d6c 100644 --- a/dll/win32/browseui/shellbars/shellbars.h +++ b/dll/win32/browseui/shellbars/shellbars.h @@ -18,6 +18,7 @@ #include <atlbase.h> #include <atlcom.h> #include <atlwin.h> +#include <atlsimpcoll.h> #include <undocuser.h> #include <shlwapi.h> #include <shlwapi_undoc.h>