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);
+ 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,
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;
}
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)
{
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;
}