[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
This commit is contained in:
David Quintana 2014-06-02 21:35:32 +00:00
parent 13c7cade20
commit 3a54fd538b
4 changed files with 146 additions and 25 deletions

View file

@ -74,7 +74,8 @@ CMenuBand::CMenuBand() :
m_hotBar(NULL), m_hotBar(NULL),
m_hotItem(-1), m_hotItem(-1),
m_popupBar(NULL), m_popupBar(NULL),
m_popupItem(-1) m_popupItem(-1),
m_Show(FALSE)
{ {
m_focusManager = CMenuFocusManager::AcquireManager(); m_focusManager = CMenuFocusManager::AcquireManager();
} }
@ -363,6 +364,9 @@ HRESULT STDMETHODCALLTYPE CMenuBand::ShowDW(BOOL fShow)
{ {
HRESULT hr = S_OK; HRESULT hr = S_OK;
if (m_Show == fShow)
return S_OK;
if (m_staticToolbar != NULL) if (m_staticToolbar != NULL)
{ {
hr = m_staticToolbar->ShowWindow(fShow); hr = m_staticToolbar->ShowWindow(fShow);
@ -403,6 +407,8 @@ HRESULT STDMETHODCALLTYPE CMenuBand::ShowDW(BOOL fShow)
hr = m_focusManager->PopMenuBar(this); hr = m_focusManager->PopMenuBar(this);
} }
m_Show = fShow;
return S_OK; return S_OK;
} }

View file

@ -65,6 +65,8 @@ private:
CMenuToolbarBase * m_popupBar; CMenuToolbarBase * m_popupBar;
INT m_popupItem; INT m_popupItem;
BOOL m_Show;
public: public:
CMenuBand(); CMenuBand();
~CMenuBand(); ~CMenuBand();

View file

@ -819,19 +819,87 @@ HRESULT STDMETHODCALLTYPE CInternetToolbar::ContextSensitiveHelp(BOOL fEnterMode
HRESULT STDMETHODCALLTYPE CInternetToolbar::ShowDW(BOOL fShow) HRESULT STDMETHODCALLTYPE CInternetToolbar::ShowDW(BOOL fShow)
{ {
CComPtr<IDockingWindow> dockingWindow;
HRESULT hResult; HRESULT hResult;
// show the bar here // show the bar here
if (fShow)
{
hResult = ReserveBorderSpace(); hResult = ReserveBorderSpace();
}
if (fMenuBar)
{
CComPtr<IDockingWindow> dockingWindow;
hResult = fMenuBar->QueryInterface(IID_PPV_ARG(IDockingWindow, &dockingWindow)); hResult = fMenuBar->QueryInterface(IID_PPV_ARG(IDockingWindow, &dockingWindow));
hResult = dockingWindow->ShowDW(fShow); 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; 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) 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, HRESULT STDMETHODCALLTYPE CInternetToolbar::ResizeBorderDW(LPCRECT prcBorder,

View file

@ -3062,9 +3062,49 @@ LRESULT CShellBrowser::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &b
return 0; 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) LRESULT CShellBrowser::OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
{ {
HRESULT hr;
// TODO: rip down everything // 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); PostQuitMessage(0);
return 0; return 0;
} }
@ -3312,31 +3352,20 @@ LRESULT CShellBrowser::RelayCommands(UINT uMsg, WPARAM wParam, LPARAM lParam, BO
static HRESULT ExplorerMessageLoop(IEThreadParamBlock * parameters) static HRESULT ExplorerMessageLoop(IEThreadParamBlock * parameters)
{ {
CComPtr<IShellBrowser> shellBrowser; CComPtr<CComObject<CShellBrowser>> theCabinet;
CComObject<CShellBrowser> *theCabinet;
HRESULT hResult; HRESULT hResult;
MSG Msg; MSG Msg;
BOOL Ret; BOOL Ret;
OleInitialize(NULL);
ATLTRY(theCabinet = new CComObject<CShellBrowser>); ATLTRY(theCabinet = new CComObject<CShellBrowser>);
if (theCabinet == NULL) if (theCabinet == NULL)
{ {
hResult = E_OUTOFMEMORY; return E_OUTOFMEMORY;
goto uninitialize;
}
hResult = theCabinet->QueryInterface(IID_PPV_ARG(IShellBrowser, &shellBrowser));
if (FAILED(hResult))
{
delete theCabinet;
goto uninitialize;
} }
hResult = theCabinet->Initialize(parameters->directoryPIDL, 0, 0, 0); hResult = theCabinet->Initialize(parameters->directoryPIDL, 0, 0, 0);
if (FAILED(hResult)) if (FAILED(hResult))
goto uninitialize; return E_OUTOFMEMORY;
while ((Ret = GetMessage(&Msg, NULL, 0, 0)) != 0) while ((Ret = GetMessage(&Msg, NULL, 0, 0)) != 0)
{ {
@ -3356,13 +3385,29 @@ static HRESULT ExplorerMessageLoop(IEThreadParamBlock * parameters)
break; break;
} }
uninitialize: //TerminateProcess(GetCurrentProcess(), hResult);
OleUninitialize();
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; return hResult;
} }
DWORD WINAPI BrowserThreadProc(LPVOID lpThreadParameter) DWORD WINAPI BrowserThreadProc(LPVOID lpThreadParameter)
{ {
HRESULT hr;
IEThreadParamBlock * parameters = (IEThreadParamBlock *) lpThreadParameter; IEThreadParamBlock * parameters = (IEThreadParamBlock *) lpThreadParameter;
return ExplorerMessageLoop(parameters);
OleInitialize(NULL);
ATLTRY(hr = ExplorerMessageLoop(parameters));
OleUninitialize();
return hr;
} }