From 3a54fd538bb97a93047e7ac65998cd2a5bf9ccd8 Mon Sep 17 00:00:00 2001 From: David Quintana Date: Mon, 2 Jun 2014 21:35:32 +0000 Subject: [PATCH] [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. svn path=/branches/shell-experiments/; revision=63535 --- base/shell/rshell/CMenuBand.cpp | 8 ++- base/shell/rshell/CMenuBand.h | 2 + dll/win32/browseui/internettoolbar.cpp | 78 ++++++++++++++++++++++-- dll/win32/browseui/shellbrowser.cpp | 83 ++++++++++++++++++++------ 4 files changed, 146 insertions(+), 25 deletions(-) diff --git a/base/shell/rshell/CMenuBand.cpp b/base/shell/rshell/CMenuBand.cpp index 57157ff0ee0..6806175532d 100644 --- a/base/shell/rshell/CMenuBand.cpp +++ b/base/shell/rshell/CMenuBand.cpp @@ -74,7 +74,8 @@ CMenuBand::CMenuBand() : 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 STDMETHODCALLTYPE CMenuBand::ShowDW(BOOL fShow) { HRESULT hr = S_OK; + if (m_Show == fShow) + return S_OK; + if (m_staticToolbar != NULL) { hr = m_staticToolbar->ShowWindow(fShow); @@ -403,6 +407,8 @@ HRESULT STDMETHODCALLTYPE CMenuBand::ShowDW(BOOL fShow) hr = m_focusManager->PopMenuBar(this); } + m_Show = fShow; + return S_OK; } diff --git a/base/shell/rshell/CMenuBand.h b/base/shell/rshell/CMenuBand.h index 3cbef65c74f..a9f1972ad3c 100644 --- a/base/shell/rshell/CMenuBand.h +++ b/base/shell/rshell/CMenuBand.h @@ -65,6 +65,8 @@ private: CMenuToolbarBase * m_popupBar; INT m_popupItem; + BOOL m_Show; + public: CMenuBand(); ~CMenuBand(); diff --git a/dll/win32/browseui/internettoolbar.cpp b/dll/win32/browseui/internettoolbar.cpp index baeec91e511..28d8d94a49e 100644 --- a/dll/win32/browseui/internettoolbar.cpp +++ b/dll/win32/browseui/internettoolbar.cpp @@ -819,19 +819,87 @@ HRESULT STDMETHODCALLTYPE CInternetToolbar::ContextSensitiveHelp(BOOL fEnterMode HRESULT STDMETHODCALLTYPE CInternetToolbar::ShowDW(BOOL fShow) { - CComPtr dockingWindow; HRESULT hResult; // show the bar here - hResult = ReserveBorderSpace(); - hResult = fMenuBar->QueryInterface(IID_PPV_ARG(IDockingWindow, &dockingWindow)); - hResult = dockingWindow->ShowDW(fShow); + if (fShow) + { + hResult = ReserveBorderSpace(); + } + if (fMenuBar) + { + CComPtr dockingWindow; + hResult = fMenuBar->QueryInterface(IID_PPV_ARG(IDockingWindow, &dockingWindow)); + hResult = dockingWindow->ShowDW(fShow); + } + if (fControlsBar) + { + CComPtr dockingWindow; + hResult = fControlsBar->QueryInterface(IID_PPV_ARG(IDockingWindow, &dockingWindow)); + hResult = dockingWindow->ShowDW(fShow); + } + if (fNavigationBar) + { + CComPtr dockingWindow; + hResult = fNavigationBar->QueryInterface(IID_PPV_ARG(IDockingWindow, &dockingWindow)); + hResult = dockingWindow->ShowDW(fShow); + } + if (fLogoBar) + { + CComPtr dockingWindow; + hResult = fLogoBar->QueryInterface(IID_PPV_ARG(IDockingWindow, &dockingWindow)); + hResult = dockingWindow->ShowDW(fShow); + } return S_OK; } +template +void ReleaseCComPtrExpectZero(CComPtr& 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 dockingWindow; + hResult = fMenuBar->QueryInterface(IID_PPV_ARG(IDockingWindow, &dockingWindow)); + hResult = dockingWindow->CloseDW(dwReserved); + } + ReleaseCComPtrExpectZero(fMenuBar); + if (fControlsBar) + { + CComPtr dockingWindow; + hResult = fControlsBar->QueryInterface(IID_PPV_ARG(IDockingWindow, &dockingWindow)); + hResult = dockingWindow->CloseDW(dwReserved); + } + ReleaseCComPtrExpectZero(fControlsBar); + if (fNavigationBar) + { + CComPtr dockingWindow; + hResult = fNavigationBar->QueryInterface(IID_PPV_ARG(IDockingWindow, &dockingWindow)); + hResult = dockingWindow->CloseDW(dwReserved); + } + ReleaseCComPtrExpectZero(fNavigationBar); + if (fLogoBar) + { + CComPtr dockingWindow; + hResult = fLogoBar->QueryInterface(IID_PPV_ARG(IDockingWindow, &dockingWindow)); + hResult = dockingWindow->CloseDW(dwReserved); + } + ReleaseCComPtrExpectZero(fLogoBar); + return S_OK; } HRESULT STDMETHODCALLTYPE CInternetToolbar::ResizeBorderDW(LPCRECT prcBorder, diff --git a/dll/win32/browseui/shellbrowser.cpp b/dll/win32/browseui/shellbrowser.cpp index 984a807383e..d5214d3700b 100644 --- a/dll/win32/browseui/shellbrowser.cpp +++ b/dll/win32/browseui/shellbrowser.cpp @@ -3062,9 +3062,49 @@ LRESULT CShellBrowser::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &b return 0; } +template +void ReleaseCComPtrExpectZero(CComPtr& 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 @@ LRESULT CShellBrowser::RelayCommands(UINT uMsg, WPARAM wParam, LPARAM lParam, BO static HRESULT ExplorerMessageLoop(IEThreadParamBlock * parameters) { - CComPtr shellBrowser; - CComObject *theCabinet; + CComPtr> theCabinet; HRESULT hResult; MSG Msg; BOOL Ret; - - OleInitialize(NULL); - + ATLTRY(theCabinet = new CComObject); if (theCabinet == NULL) { - hResult = E_OUTOFMEMORY; - goto uninitialize; + return E_OUTOFMEMORY; } - - hResult = theCabinet->QueryInterface(IID_PPV_ARG(IShellBrowser, &shellBrowser)); - if (FAILED(hResult)) - { - delete theCabinet; - goto uninitialize; - } - + 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 @@ static HRESULT ExplorerMessageLoop(IEThreadParamBlock * parameters) if (Msg.message == WM_QUIT) break; } + + //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(); -uninitialize: - OleUninitialize(); return hResult; } DWORD WINAPI BrowserThreadProc(LPVOID lpThreadParameter) { + HRESULT hr; IEThreadParamBlock * parameters = (IEThreadParamBlock *) lpThreadParameter; - return ExplorerMessageLoop(parameters); + + OleInitialize(NULL); + + ATLTRY(hr = ExplorerMessageLoop(parameters)); + + OleUninitialize(); + + return hr; }