diff --git a/reactos/dll/win32/browseui/addressband.cpp b/reactos/dll/win32/browseui/addressband.cpp index 97d672f2589..3cc67e02d1c 100644 --- a/reactos/dll/win32/browseui/addressband.cpp +++ b/reactos/dll/win32/browseui/addressband.cpp @@ -197,7 +197,10 @@ HRESULT STDMETHODCALLTYPE CAddressBand::CloseDW(DWORD dwReserved) m_hWnd = NULL; - IUnknown_SetSite(fAddressEditBox, NULL); + CComPtr pservice; + HRESULT hres = fAddressEditBox->QueryInterface(IID_PPV_ARG(IShellService, &pservice)); + if (SUCCEEDED(hres )) + pservice->SetOwner(NULL); if (fAddressEditBox) fAddressEditBox.Release(); if (fSite) fSite.Release(); diff --git a/reactos/dll/win32/browseui/addresseditbox.cpp b/reactos/dll/win32/browseui/addresseditbox.cpp index 9d0380354b7..9633d881507 100644 --- a/reactos/dll/win32/browseui/addresseditbox.cpp +++ b/reactos/dll/win32/browseui/addresseditbox.cpp @@ -43,8 +43,16 @@ CAddressEditBox::~CAddressEditBox() { } -HRESULT STDMETHODCALLTYPE CAddressEditBox::SetOwner(IUnknown *) +HRESULT STDMETHODCALLTYPE CAddressEditBox::SetOwner(IUnknown *pOwner) { + if (!pOwner) + { + CComPtr browserService; + HRESULT hResult = IUnknown_QueryService(fSite, SID_SShellBrowser, IID_PPV_ARG(IBrowserService, &browserService)); + if (SUCCEEDED(hResult)) + AtlUnadvise(browserService, DIID_DWebBrowserEvents, fAdviseCookie); + fSite = NULL; + } // connect to browser connection point return 0; } diff --git a/reactos/dll/win32/browseui/basebar.cpp b/reactos/dll/win32/browseui/basebar.cpp index 6a30462e0b4..bd84b4a7985 100644 --- a/reactos/dll/win32/browseui/basebar.cpp +++ b/reactos/dll/win32/browseui/basebar.cpp @@ -328,6 +328,10 @@ HRESULT STDMETHODCALLTYPE CBaseBar::SetClient(IUnknown *punkClient) WS_VISIBLE | WS_CHILDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, WS_EX_TOOLWINDOW); ReserveBorderSpace(); } + else + { + DestroyWindow(); + } return S_OK; } diff --git a/reactos/dll/win32/browseui/internettoolbar.cpp b/reactos/dll/win32/browseui/internettoolbar.cpp index 64393afea46..8b5717b21c2 100644 --- a/reactos/dll/win32/browseui/internettoolbar.cpp +++ b/reactos/dll/win32/browseui/internettoolbar.cpp @@ -934,6 +934,8 @@ HRESULT STDMETHODCALLTYPE CInternetToolbar::CloseDW(DWORD dwReserved) return hResult; ReleaseCComPtrExpectZero(fLogoBar); } + + SetSite(NULL); return S_OK; } diff --git a/reactos/dll/win32/browseui/shellbrowser.cpp b/reactos/dll/win32/browseui/shellbrowser.cpp index 63c58694caa..db050150bcc 100644 --- a/reactos/dll/win32/browseui/shellbrowser.cpp +++ b/reactos/dll/win32/browseui/shellbrowser.cpp @@ -179,7 +179,7 @@ private: CComPtr fExplorerToolbar; public: void Initialize(HWND parent, IUnknown *explorerToolbar); - + void Destroy(); private: // message handlers @@ -207,6 +207,12 @@ void CToolbarProxy::Initialize(HWND parent, IUnknown *explorerToolbar) } } +void CToolbarProxy::Destroy() +{ + DestroyWindow(); + fExplorerToolbar = NULL; +} + LRESULT CToolbarProxy::OnAddBitmap(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) { long int result; @@ -1116,6 +1122,7 @@ HRESULT CShellBrowser::GetBaseBar(bool vertical, REFIID riid, void **theBaseBar) // we have to store our basebar into cache now *cache = newBaseBar; + newBaseBar->AddRef(); // tell the new base bar about the shell browser hResult = IUnknown_SetSite(newBaseBar, static_cast(this)); @@ -3362,9 +3369,10 @@ LRESULT CShellBrowser::OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL & // TODO: rip down everything { + fToolbarProxy.Destroy(); + fCurrentShellView->DestroyViewWindow(); fCurrentShellView->UIActivate(SVUIA_DEACTIVATE); - ReleaseCComPtrExpectZero(fCurrentShellView); for (int i = 0; i < 3; i++) { @@ -3393,16 +3401,14 @@ LRESULT CShellBrowser::OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL & } } pdw->CloseDW(0); + + pClient = NULL; + pBarSite = NULL; pdw = NULL; - /* For some reasons, it's like we miss some AddRef in ATL when QueryInterface on - * same interface or inherited one, so we are removing already removed (!) object. - * TODO: check with MSVC's ATL to see if this behaviour happens too - */ - bar.Detach(); - pClient.Detach(); - pBarSite.Detach(); + bar = NULL; ReleaseCComPtrExpectZero(fClientBars[i].clientBar); } + ReleaseCComPtrExpectZero(fCurrentShellView); ReleaseCComPtrExpectZero(fTravelLog); fCurrentShellFolder.Release();