Author: dquintana
Date: Mon Jun 2 21:35:32 2014
New Revision: 63535
URL:
http://svn.reactos.org/svn/reactos?rev=63535&view=rev
Log:
[BROWSEUI/RSHELL]
* Begin fixing the process of destroying the related objects when closing the window, so
that eventually the filebrowser/explorer process will properly exit cleanly when no more
windows are open.
Modified:
branches/shell-experiments/base/shell/rshell/CMenuBand.cpp
branches/shell-experiments/base/shell/rshell/CMenuBand.h
branches/shell-experiments/dll/win32/browseui/internettoolbar.cpp
branches/shell-experiments/dll/win32/browseui/shellbrowser.cpp
Modified: branches/shell-experiments/base/shell/rshell/CMenuBand.cpp
URL:
http://svn.reactos.org/svn/reactos/branches/shell-experiments/base/shell/rs…
==============================================================================
--- branches/shell-experiments/base/shell/rshell/CMenuBand.cpp [iso-8859-1] (original)
+++ branches/shell-experiments/base/shell/rshell/CMenuBand.cpp [iso-8859-1] Mon Jun 2
21:35:32 2014
@@ -74,7 +74,8 @@
m_hotBar(NULL),
m_hotItem(-1),
m_popupBar(NULL),
- m_popupItem(-1)
+ m_popupItem(-1),
+ m_Show(FALSE)
{
m_focusManager = CMenuFocusManager::AcquireManager();
}
@@ -363,6 +364,9 @@
{
HRESULT hr = S_OK;
+ if (m_Show == fShow)
+ return S_OK;
+
if (m_staticToolbar != NULL)
{
hr = m_staticToolbar->ShowWindow(fShow);
@@ -402,6 +406,8 @@
else
hr = m_focusManager->PopMenuBar(this);
}
+
+ m_Show = fShow;
return S_OK;
}
Modified: branches/shell-experiments/base/shell/rshell/CMenuBand.h
URL:
http://svn.reactos.org/svn/reactos/branches/shell-experiments/base/shell/rs…
==============================================================================
--- branches/shell-experiments/base/shell/rshell/CMenuBand.h [iso-8859-1] (original)
+++ branches/shell-experiments/base/shell/rshell/CMenuBand.h [iso-8859-1] Mon Jun 2
21:35:32 2014
@@ -65,6 +65,8 @@
CMenuToolbarBase * m_popupBar;
INT m_popupItem;
+ BOOL m_Show;
+
public:
CMenuBand();
~CMenuBand();
Modified: branches/shell-experiments/dll/win32/browseui/internettoolbar.cpp
URL:
http://svn.reactos.org/svn/reactos/branches/shell-experiments/dll/win32/bro…
==============================================================================
--- branches/shell-experiments/dll/win32/browseui/internettoolbar.cpp [iso-8859-1]
(original)
+++ branches/shell-experiments/dll/win32/browseui/internettoolbar.cpp [iso-8859-1] Mon Jun
2 21:35:32 2014
@@ -819,19 +819,87 @@
HRESULT STDMETHODCALLTYPE CInternetToolbar::ShowDW(BOOL fShow)
{
- CComPtr<IDockingWindow> dockingWindow;
HRESULT hResult;
// show the bar here
- hResult = ReserveBorderSpace();
- hResult = fMenuBar->QueryInterface(IID_PPV_ARG(IDockingWindow,
&dockingWindow));
- hResult = dockingWindow->ShowDW(fShow);
- return S_OK;
+ if (fShow)
+ {
+ hResult = ReserveBorderSpace();
+ }
+ if (fMenuBar)
+ {
+ CComPtr<IDockingWindow> dockingWindow;
+ hResult = fMenuBar->QueryInterface(IID_PPV_ARG(IDockingWindow,
&dockingWindow));
+ hResult = dockingWindow->ShowDW(fShow);
+ }
+ if (fControlsBar)
+ {
+ CComPtr<IDockingWindow> dockingWindow;
+ hResult = fControlsBar->QueryInterface(IID_PPV_ARG(IDockingWindow,
&dockingWindow));
+ hResult = dockingWindow->ShowDW(fShow);
+ }
+ if (fNavigationBar)
+ {
+ CComPtr<IDockingWindow> dockingWindow;
+ hResult = fNavigationBar->QueryInterface(IID_PPV_ARG(IDockingWindow,
&dockingWindow));
+ hResult = dockingWindow->ShowDW(fShow);
+ }
+ if (fLogoBar)
+ {
+ CComPtr<IDockingWindow> dockingWindow;
+ hResult = fLogoBar->QueryInterface(IID_PPV_ARG(IDockingWindow,
&dockingWindow));
+ hResult = dockingWindow->ShowDW(fShow);
+ }
+ return S_OK;
+}
+
+template<class T>
+void ReleaseCComPtrExpectZero(CComPtr<T>& cptr)
+{
+ if (cptr.p != NULL)
+ {
+ int nrc = cptr->Release();
+ if (nrc > 0)
+ {
+ DbgPrint("WARNING: Unexpected RefCount > 0!\n");
+ }
+ cptr.Detach();
+ }
}
HRESULT STDMETHODCALLTYPE CInternetToolbar::CloseDW(DWORD dwReserved)
{
- return E_NOTIMPL;
+ HRESULT hResult;
+
+ if (fMenuBar)
+ {
+ CComPtr<IDockingWindow> dockingWindow;
+ hResult = fMenuBar->QueryInterface(IID_PPV_ARG(IDockingWindow,
&dockingWindow));
+ hResult = dockingWindow->CloseDW(dwReserved);
+ }
+ ReleaseCComPtrExpectZero(fMenuBar);
+ if (fControlsBar)
+ {
+ CComPtr<IDockingWindow> dockingWindow;
+ hResult = fControlsBar->QueryInterface(IID_PPV_ARG(IDockingWindow,
&dockingWindow));
+ hResult = dockingWindow->CloseDW(dwReserved);
+ }
+ ReleaseCComPtrExpectZero(fControlsBar);
+ if (fNavigationBar)
+ {
+ CComPtr<IDockingWindow> dockingWindow;
+ hResult = fNavigationBar->QueryInterface(IID_PPV_ARG(IDockingWindow,
&dockingWindow));
+ hResult = dockingWindow->CloseDW(dwReserved);
+ }
+ ReleaseCComPtrExpectZero(fNavigationBar);
+ if (fLogoBar)
+ {
+ CComPtr<IDockingWindow> dockingWindow;
+ hResult = fLogoBar->QueryInterface(IID_PPV_ARG(IDockingWindow,
&dockingWindow));
+ hResult = dockingWindow->CloseDW(dwReserved);
+ }
+ ReleaseCComPtrExpectZero(fLogoBar);
+ return S_OK;
}
HRESULT STDMETHODCALLTYPE CInternetToolbar::ResizeBorderDW(LPCRECT prcBorder,
Modified: branches/shell-experiments/dll/win32/browseui/shellbrowser.cpp
URL:
http://svn.reactos.org/svn/reactos/branches/shell-experiments/dll/win32/bro…
==============================================================================
--- branches/shell-experiments/dll/win32/browseui/shellbrowser.cpp [iso-8859-1]
(original)
+++ branches/shell-experiments/dll/win32/browseui/shellbrowser.cpp [iso-8859-1] Mon Jun 2
21:35:32 2014
@@ -3062,9 +3062,49 @@
return 0;
}
+template<class T>
+void ReleaseCComPtrExpectZero(CComPtr<T>& cptr)
+{
+ if (cptr.p != NULL)
+ {
+ int nrc = cptr->Release();
+ if (nrc > 0)
+ {
+ DbgPrint("WARNING: Unexpected RefCount > 0!\n");
+ }
+ cptr.Detach();
+ }
+}
+
LRESULT CShellBrowser::OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL
&bHandled)
{
+ HRESULT hr;
// TODO: rip down everything
+ {
+ fCurrentShellView->DestroyViewWindow();
+ fCurrentShellView->UIActivate(SVUIA_DEACTIVATE);
+ ReleaseCComPtrExpectZero(fCurrentShellView);
+
+ for (int i = 0; i < 3; i++)
+ {
+ if (fClientBars[i].clientBar == NULL)
+ continue;
+ IDockingWindow * pdw;
+ hr = fClientBars[i].clientBar->QueryInterface(IID_PPV_ARG(IDockingWindow,
&pdw));
+ if (FAILED_UNEXPECTEDLY(hr))
+ continue;
+ pdw->ShowDW(FALSE);
+ pdw->CloseDW(0);
+ pdw->Release();
+ ReleaseCComPtrExpectZero(fClientBars[i].clientBar);
+ }
+ ReleaseCComPtrExpectZero(fTravelLog);
+
+ fCurrentShellFolder.Release();
+ ILFree(fCurrentDirectoryPIDL);
+ ::DestroyWindow(fStatusBar);
+ DestroyMenu(fCurrentMenuBar);
+ }
PostQuitMessage(0);
return 0;
}
@@ -3312,31 +3352,20 @@
static HRESULT ExplorerMessageLoop(IEThreadParamBlock * parameters)
{
- CComPtr<IShellBrowser> shellBrowser;
- CComObject<CShellBrowser> *theCabinet;
+ CComPtr<CComObject<CShellBrowser>> theCabinet;
HRESULT hResult;
MSG Msg;
BOOL Ret;
-
- OleInitialize(NULL);
-
+
ATLTRY(theCabinet = new CComObject<CShellBrowser>);
if (theCabinet == NULL)
{
- hResult = E_OUTOFMEMORY;
- goto uninitialize;
- }
-
- hResult = theCabinet->QueryInterface(IID_PPV_ARG(IShellBrowser,
&shellBrowser));
- if (FAILED(hResult))
- {
- delete theCabinet;
- goto uninitialize;
- }
-
+ return E_OUTOFMEMORY;
+ }
+
hResult = theCabinet->Initialize(parameters->directoryPIDL, 0, 0, 0);
if (FAILED(hResult))
- goto uninitialize;
+ return E_OUTOFMEMORY;
while ((Ret = GetMessage(&Msg, NULL, 0, 0)) != 0)
{
@@ -3355,14 +3384,30 @@
if (Msg.message == WM_QUIT)
break;
}
-
-uninitialize:
+
+ //TerminateProcess(GetCurrentProcess(), hResult);
+
+ int nrc = theCabinet->Release();
+ if (nrc > 0)
+ {
+ DbgPrint("WARNING: There are %d references to the CShellBrowser active or
leaked, process will never terminate.\n");
+ }
+
+ theCabinet.Detach();
+
+ return hResult;
+}
+
+DWORD WINAPI BrowserThreadProc(LPVOID lpThreadParameter)
+{
+ HRESULT hr;
+ IEThreadParamBlock * parameters = (IEThreadParamBlock *) lpThreadParameter;
+
+ OleInitialize(NULL);
+
+ ATLTRY(hr = ExplorerMessageLoop(parameters));
+
OleUninitialize();
- return hResult;
-}
-
-DWORD WINAPI BrowserThreadProc(LPVOID lpThreadParameter)
-{
- IEThreadParamBlock * parameters = (IEThreadParamBlock *) lpThreadParameter;
- return ExplorerMessageLoop(parameters);
-}
+
+ return hr;
+}