[RSHELL]
authorDavid Quintana <gigaherz@gmail.com>
Tue, 28 Oct 2014 21:40:50 +0000 (21:40 +0000)
committerDavid Quintana <gigaherz@gmail.com>
Tue, 28 Oct 2014 21:40:50 +0000 (21:40 +0000)
* CMenuBand: Refcount before assigning a return pointer.
* CMenuDeskBar: Revert change and protect the refcounting in case I was wrong to assume there will be exactly one OnFinalMessage for each OnCreate.
* CMenuToolbars: Add a debug message.
* CStartMenu: Refcount correctly.

svn path=/branches/shell-experiments/; revision=65088

base/shell/rshell/CMenuBand.cpp
base/shell/rshell/CMenuDeskBar.cpp
base/shell/rshell/CMenuDeskBar.h
base/shell/rshell/CMenuToolbars.cpp
base/shell/rshell/CStartMenu.cpp
base/shell/rshell/precomp.h
include/reactos/undocshell.h

index b3d162a..a9979b9 100644 (file)
@@ -628,21 +628,22 @@ HRESULT STDMETHODCALLTYPE CMenuBand::SetClient(IUnknown *punkClient)
         return S_OK;
     }
 
-    HRESULT hr = punkClient->QueryInterface(IID_PPV_ARG(IMenuPopup, &m_subMenuChild));
-
-    return hr;
+    return punkClient->QueryInterface(IID_PPV_ARG(IMenuPopup, &m_subMenuChild));
 }
 
 HRESULT STDMETHODCALLTYPE CMenuBand::GetClient(IUnknown **ppunkClient)
 {
     // HACK, so I can test for a submenu in the DeskBar
-    if (ppunkClient)
+    if (!ppunkClient)
+        return E_POINTER;
+    *ppunkClient = NULL;
+
+    if (m_subMenuChild)
     {
-        if (m_subMenuChild)
-            *ppunkClient = m_subMenuChild;
-        else
-            *ppunkClient = NULL;
+        m_subMenuChild->AddRef();
+        *ppunkClient = m_subMenuChild;
     }
+
     return S_OK;
 }
 
index bece0f4..673e793 100644 (file)
@@ -39,7 +39,8 @@ CMenuDeskBar::CMenuDeskBar() :
     m_IconSize(0),
     m_Banner(NULL),
     m_Shown(FALSE),
-    m_ShowFlags(0)
+    m_ShowFlags(0),
+    m_didAddRef(FALSE)
 {
 }
 
@@ -49,7 +50,11 @@ CMenuDeskBar::~CMenuDeskBar()
 
 LRESULT CMenuDeskBar::_OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 {
-    this->AddRef();
+    if (!m_didAddRef)
+    {
+        this->AddRef();
+        m_didAddRef = TRUE;
+    }
 
     bHandled = FALSE;
     return 0;
@@ -57,6 +62,11 @@ LRESULT CMenuDeskBar::_OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &b
 
 void CMenuDeskBar::OnFinalMessage(HWND /* hWnd */)
 {
+    if (m_didAddRef)
+    {
+        this->Release();
+        m_didAddRef = FALSE;
+    }
 }
 
 HRESULT STDMETHODCALLTYPE CMenuDeskBar::Initialize(THIS)
index 51a5cd0..7c63a18 100644 (file)
@@ -50,6 +50,8 @@ private:
     BOOL  m_Shown;
     DWORD m_ShowFlags;
 
+    BOOL m_didAddRef;
+
     virtual void OnFinalMessage(HWND hWnd);
 public:
     CMenuDeskBar();
index 88e885e..aa879a2 100644 (file)
@@ -1374,6 +1374,7 @@ HRESULT CMenuSFToolbar::GetShellFolder(DWORD *pdwFlags, LPITEMIDLIST *ppidl, REF
             pidl = ILClone(m_idList);
             if (!pidl)
             {
+                ERR("ILClone failed!\n");
                 (*reinterpret_cast<IUnknown**>(ppv))->Release();
                 return E_FAIL;
             }
index bc46d5e..79c7864 100644 (file)
@@ -262,16 +262,13 @@ public:
         IBandSite* pBandSite,
         IDeskBar* pDeskBar)
     {
-        m_pShellMenu.Attach(pShellMenu);
-        m_pBandSite.Attach(pBandSite);
-        m_pDeskBar.Attach(pDeskBar);
+        m_pShellMenu = pShellMenu;
+        m_pBandSite = pBandSite;
+        m_pDeskBar = pDeskBar;
     }
 
     ~CShellMenuCallback()
     {
-        m_pShellMenu.Release();
-        m_pBandSite.Release();
-        m_pDeskBar.Release();
     }
 
     HRESULT _SetProgramsFolder(IShellFolder * psf, LPITEMIDLIST pidl)
index 9b23dbe..c1d1fee 100644 (file)
@@ -38,9 +38,9 @@
 #define COBJMACROS
 
 //#define DEBUG_CCOMOBJECT
-//#define DEBUG_CCOMOBJECT_CREATION 1
-//#define DEBUG_CCOMOBJECT_DESTRUCTION 1
-//#define DEBUG_CCOMOBJECT_REFCOUNTING 0
+#define DEBUG_CCOMOBJECT_CREATION 1
+#define DEBUG_CCOMOBJECT_DESTRUCTION 1
+#define DEBUG_CCOMOBJECT_REFCOUNTING 1
 
 #include <windef.h>
 #include <winbase.h>
index 426efea..5b1e785 100644 (file)
@@ -730,6 +730,24 @@ void ReleaseCComPtrExpectZero(CComPtr<T>& cptr, BOOL forceRelease = FALSE)
     }
 }
 
+template<class T, class R>
+HRESULT inline ShellDebugObjectCreator(REFIID riid, R ** ppv)
+{
+    CComPtr<T>       obj;
+    HRESULT          hResult;
+
+    if (ppv == NULL)
+        return E_POINTER;
+    *ppv = NULL;
+    ATLTRY(obj = new CComDebugObject<T>);
+    if (obj.p == NULL)
+        return E_OUTOFMEMORY;
+    hResult = obj->QueryInterface(riid, reinterpret_cast<void **>(ppv));
+    if (FAILED(hResult))
+        return hResult;
+    return S_OK;
+}
+
 template<class T, class R>
 HRESULT inline ShellObjectCreator(REFIID riid, R ** ppv)
 {