From 079da15e395ca0b3d9e994221c82d97bf542ed67 Mon Sep 17 00:00:00 2001 From: David Quintana Date: Wed, 3 Dec 2014 16:11:46 +0000 Subject: [PATCH] [BROWSEUI] * Add a stubbed CExplorerBand, which I will be using to investigate how the windows shell implements the sidebar panels. This will never be called in ReactOS because our shell view doesn't handle the buttons for opening the sidebars, so it never asks the shell browser to open one. CORE-8815 svn path=/trunk/; revision=65554 --- reactos/dll/win32/browseui/CMakeLists.txt | 1 + reactos/dll/win32/browseui/browseui.cpp | 1 + reactos/dll/win32/browseui/browseui.rc | 1 + reactos/dll/win32/browseui/explorerband.cpp | 698 ++++++++++++++++++ reactos/dll/win32/browseui/explorerband.h | 227 ++++++ reactos/dll/win32/browseui/precomp.h | 1 + .../dll/win32/browseui/res/explorerband.rgs | 13 + reactos/dll/win32/browseui/resource.h | 1 + reactos/dll/win32/browseui/shellbrowser.cpp | 24 +- 9 files changed, 964 insertions(+), 3 deletions(-) create mode 100644 reactos/dll/win32/browseui/explorerband.cpp create mode 100644 reactos/dll/win32/browseui/explorerband.h create mode 100644 reactos/dll/win32/browseui/res/explorerband.rgs diff --git a/reactos/dll/win32/browseui/CMakeLists.txt b/reactos/dll/win32/browseui/CMakeLists.txt index 8283f0f85b7..83ea3c099e0 100644 --- a/reactos/dll/win32/browseui/CMakeLists.txt +++ b/reactos/dll/win32/browseui/CMakeLists.txt @@ -22,6 +22,7 @@ list(APPEND SOURCE browseuiord.cpp commonbrowser.cpp desktopipc.cpp + explorerband.cpp globalfoldersettings.cpp internettoolbar.cpp parsecmdline.cpp diff --git a/reactos/dll/win32/browseui/browseui.cpp b/reactos/dll/win32/browseui/browseui.cpp index d39fb7c64fc..77bf0101e06 100644 --- a/reactos/dll/win32/browseui/browseui.cpp +++ b/reactos/dll/win32/browseui/browseui.cpp @@ -38,6 +38,7 @@ OBJECT_ENTRY(CLSID_CCommonBrowser, CCommonBrowser) OBJECT_ENTRY(CLSID_GlobalFolderSettings, CGlobalFolderSettings) OBJECT_ENTRY(CLSID_InternetToolbar, CInternetToolbar) OBJECT_ENTRY(CLSID_CRegTreeOptions, CRegTreeOptions) +OBJECT_ENTRY(CLSID_ExplorerBand, CExplorerBand) END_OBJECT_MAP() CBrowseUIModule gModule; diff --git a/reactos/dll/win32/browseui/browseui.rc b/reactos/dll/win32/browseui/browseui.rc index 94a65973501..e70ff04d0f7 100644 --- a/reactos/dll/win32/browseui/browseui.rc +++ b/reactos/dll/win32/browseui/browseui.rc @@ -41,6 +41,7 @@ IDR_COMMONBROWSER REGISTRY "res/commonbrowser.rgs" IDR_GLOBALFOLDERSETTINGS REGISTRY "res/globalfoldersettings.rgs" IDR_INTERNETTOOLBAR REGISTRY "res/internettoolbar.rgs" IDR_REGTREEOPTIONS REGISTRY "res/regtreeoptions.rgs" +IDR_EXPLORERBAND REGISTRY "res/explorerband.rgs" /* * Everything specific to any language goes diff --git a/reactos/dll/win32/browseui/explorerband.cpp b/reactos/dll/win32/browseui/explorerband.cpp new file mode 100644 index 00000000000..6833f3eaa28 --- /dev/null +++ b/reactos/dll/win32/browseui/explorerband.cpp @@ -0,0 +1,698 @@ +#include "precomp.h" + +#if 1 +#undef UNIMPLEMENTED + +#define UNIMPLEMENTED DbgPrint("%s is UNIMPLEMENTED!\n", __FUNCTION__) +#endif + +extern "C" +HRESULT WINAPI CExplorerBand_Constructor(REFIID riid, LPVOID *ppv) +{ + return ShellObjectCreator(riid, ppv); +} + +CExplorerBand::CExplorerBand() : + m_internalBand(NULL), + m_internalDeskBand(NULL), + m_internalObjectWithSite(NULL), + m_internalInputObject(NULL), + m_internalPersistStream(NULL), + m_internalOleCommandTarget(NULL), + m_internalServiceProvider(NULL), + m_internalBandNavigate(NULL), + m_internalWinEventHandler(NULL), + m_internalNamespaceProxy(NULL), + m_internalDispatch(NULL), + m_OnWinEventShown(FALSE) +{ + HRESULT hResult = CoCreateInstance(CLSID_ExplorerBand, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARG(IUnknown, &m_internalBand)); + if (FAILED(hResult)) + { + ERR("Could not create internal band (hr=%08lx).\n", hResult); + m_internalBand = NULL; + return; + } + hResult = m_internalBand->QueryInterface(IID_PPV_ARG(IDeskBand, &m_internalDeskBand)); + if (FAILED(hResult)) + { + ERR("Could not obtain interface IDeskBand from internal band (hr=%08lx).\n", hResult); + m_internalBand = NULL; + m_internalDeskBand = NULL; + return; + } + hResult = m_internalBand->QueryInterface(IID_PPV_ARG(IObjectWithSite, &m_internalObjectWithSite)); + if (FAILED(hResult)) + { + ERR("Could not obtain interface IObjectWithSite from internal band (hr=%08lx).\n", hResult); + m_internalBand = NULL; + m_internalDeskBand = NULL; + m_internalObjectWithSite = NULL; + return; + } + hResult = m_internalBand->QueryInterface(IID_PPV_ARG(IInputObject, &m_internalInputObject)); + if (FAILED(hResult)) + { + ERR("Could not obtain interface IInputObject from internal band (hr=%08lx).\n", hResult); + m_internalBand = NULL; + m_internalDeskBand = NULL; + m_internalObjectWithSite = NULL; + m_internalInputObject = NULL; + return; + } + hResult = m_internalBand->QueryInterface(IID_PPV_ARG(IPersistStream, &m_internalPersistStream)); + if (FAILED(hResult)) + { + ERR("Could not obtain interface IPersistStream from internal band (hr=%08lx).\n", hResult); + m_internalBand = NULL; + m_internalDeskBand = NULL; + m_internalObjectWithSite = NULL; + m_internalInputObject = NULL; + m_internalPersistStream = NULL; + return; + } + hResult = m_internalBand->QueryInterface(IID_PPV_ARG(IOleCommandTarget, &m_internalOleCommandTarget)); + if (FAILED(hResult)) + { + ERR("Could not obtain interface IOleCommandTarget from internal band (hr=%08lx).\n", hResult); + m_internalBand = NULL; + m_internalDeskBand = NULL; + m_internalObjectWithSite = NULL; + m_internalInputObject = NULL; + m_internalPersistStream = NULL; + m_internalOleCommandTarget = NULL; + return; + } + hResult = m_internalBand->QueryInterface(IID_PPV_ARG(IServiceProvider, &m_internalServiceProvider)); + if (FAILED(hResult)) + { + ERR("Could not obtain interface IServiceProvider from internal band (hr=%08lx).\n", hResult); + m_internalBand = NULL; + m_internalDeskBand = NULL; + m_internalObjectWithSite = NULL; + m_internalInputObject = NULL; + m_internalPersistStream = NULL; + m_internalOleCommandTarget = NULL; + m_internalServiceProvider = NULL; + return; + } + hResult = m_internalBand->QueryInterface(IID_PPV_ARG(IBandNavigate, &m_internalBandNavigate)); + if (FAILED(hResult)) + { + ERR("Could not obtain interface IBandNavigate from internal band (hr=%08lx).\n", hResult); + m_internalBand = NULL; + m_internalDeskBand = NULL; + m_internalObjectWithSite = NULL; + m_internalInputObject = NULL; + m_internalPersistStream = NULL; + m_internalOleCommandTarget = NULL; + m_internalServiceProvider = NULL; + m_internalBandNavigate = NULL; + return; + } + hResult = m_internalBand->QueryInterface(IID_PPV_ARG(IWinEventHandler, &m_internalWinEventHandler)); + if (FAILED(hResult)) + { + ERR("Could not obtain interface IWinEventHandler from internal band (hr=%08lx).\n", hResult); + m_internalBand = NULL; + m_internalDeskBand = NULL; + m_internalObjectWithSite = NULL; + m_internalInputObject = NULL; + m_internalPersistStream = NULL; + m_internalOleCommandTarget = NULL; + m_internalServiceProvider = NULL; + m_internalBandNavigate = NULL; + m_internalWinEventHandler = NULL; + return; + } + hResult = m_internalBand->QueryInterface(IID_PPV_ARG(INamespaceProxy, &m_internalNamespaceProxy)); + if (FAILED(hResult)) + { + ERR("Could not obtain interface INamespaceProxy from internal band (hr=%08lx).\n", hResult); + m_internalBand = NULL; + m_internalDeskBand = NULL; + m_internalObjectWithSite = NULL; + m_internalInputObject = NULL; + m_internalPersistStream = NULL; + m_internalOleCommandTarget = NULL; + m_internalServiceProvider = NULL; + m_internalBandNavigate = NULL; + m_internalWinEventHandler = NULL; + m_internalNamespaceProxy = NULL; + return; + } + hResult = m_internalBand->QueryInterface(IID_PPV_ARG(IDispatch, &m_internalDispatch)); + if (FAILED(hResult)) + { + ERR("Could not obtain interface INamespaceProxy from internal band (hr=%08lx).\n", hResult); + m_internalBand = NULL; + m_internalDeskBand = NULL; + m_internalObjectWithSite = NULL; + m_internalInputObject = NULL; + m_internalPersistStream = NULL; + m_internalOleCommandTarget = NULL; + m_internalServiceProvider = NULL; + m_internalBandNavigate = NULL; + m_internalWinEventHandler = NULL; + m_internalNamespaceProxy = NULL; + m_internalDispatch = NULL; + return; + } +} + +CExplorerBand::~CExplorerBand() +{ +} + +// *** IOleWindow methods *** +HRESULT STDMETHODCALLTYPE CExplorerBand::GetWindow(HWND *lphwnd) +{ + HRESULT hr; + if (m_internalDeskBand) + { + DbgPrint("HRESULT STDMETHODCALLTYPE CExplorerBand::GetWindow(HWND *lphwnd=%p)\n", lphwnd); + hr = m_internalDeskBand->GetWindow(lphwnd); + if (lphwnd) + DbgPrint("\t*lphwnd=%p\n", *lphwnd); + DbgPrint("CExplorerBand::GetWindow returning %08lx\n", hr); + return hr; + } + + UNIMPLEMENTED; + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CExplorerBand::ContextSensitiveHelp(BOOL fEnterMode) +{ + HRESULT hr; + if (m_internalDeskBand) + { + DbgPrint("HRESULT STDMETHODCALLTYPE CExplorerBand::ContextSensitiveHelp(BOOL fEnterMode=%s)\n", fEnterMode ? "TRUE" : "FALSE"); + hr = m_internalDeskBand->ContextSensitiveHelp(fEnterMode); + DbgPrint("CExplorerBand::ContextSensitiveHelp returning %08lx\n", hr); + return hr; + } + + UNIMPLEMENTED; + return E_NOTIMPL; +} + + +// *** IDockingWindow methods *** +HRESULT STDMETHODCALLTYPE CExplorerBand::CloseDW(DWORD dwReserved) +{ + HRESULT hr; + if (m_internalDeskBand) + { + DbgPrint("HRESULT STDMETHODCALLTYPE CExplorerBand::CloseDW(DWORD dwReserved=%u)\n", dwReserved); + hr = m_internalDeskBand->CloseDW(dwReserved); + DbgPrint("CExplorerBand::CloseDW returning %08lx\n", hr); + return hr; + } + + UNIMPLEMENTED; + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CExplorerBand::ResizeBorderDW(const RECT *prcBorder, IUnknown *punkToolbarSite, BOOL fReserved) +{ + HRESULT hr; + if (m_internalDeskBand) + { + DbgPrint("HRESULT STDMETHODCALLTYPE CExplorerBand::ResizeBorderDW(const RECT *prcBorder=%p, IUnknown *punkToolbarSite=%p, BOOL fReserved=%s)\n", + prcBorder, punkToolbarSite, fReserved ? "TRUE" : "FALSE"); + if (prcBorder) + DbgPrint("\t*prcBorder={%u, %u, %u, %u}\n", prcBorder->left, prcBorder->top, prcBorder->right, prcBorder->bottom); + hr = m_internalDeskBand->ResizeBorderDW(prcBorder, punkToolbarSite, fReserved); + DbgPrint("CExplorerBand::ResizeBorderDW returning %08lx\n", hr); + return hr; + } + + UNIMPLEMENTED; + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CExplorerBand::ShowDW(BOOL fShow) +{ + HRESULT hr; + if (m_internalDeskBand) + { + DbgPrint("HRESULT STDMETHODCALLTYPE CExplorerBand::ShowDW(BOOL fShow=%s)\n", fShow ? "TRUE" : "FALSE"); + hr = m_internalDeskBand->ShowDW(fShow); + DbgPrint("CExplorerBand::ShowDW returning %08lx\n", hr); + return hr; + } + + UNIMPLEMENTED; + return E_NOTIMPL; +} + + +// *** IDeskBand methods *** +HRESULT STDMETHODCALLTYPE CExplorerBand::GetBandInfo(DWORD dwBandID, DWORD dwViewMode, DESKBANDINFO *pdbi) +{ + HRESULT hr; + if (m_internalDeskBand) + { + DbgPrint("HRESULT STDMETHODCALLTYPE CExplorerBand::GetBandInfo(DWORD dwBandID=%u, DWORD dwViewMode=%u, DESKBANDINFO *pdbi=%p)\n", + dwBandID, dwViewMode, pdbi); + if (pdbi) + DbgPrint("\t*pdbi={dwMask=%u, ...}\n", pdbi->dwMask); + hr = m_internalDeskBand->GetBandInfo(dwBandID, dwViewMode, pdbi); + if (pdbi) + DbgPrint("\t*pdbi={dwMask=%u, crBkgnd=%u, ...}\n", pdbi->dwMask, pdbi->crBkgnd); + DbgPrint("CExplorerBand::GetBandInfo returning %08lx\n", hr); + return hr; + } + + UNIMPLEMENTED; + return E_NOTIMPL; +} + + +// *** IObjectWithSite methods *** +HRESULT STDMETHODCALLTYPE CExplorerBand::SetSite(IUnknown *pUnkSite) +{ + HRESULT hr; + if (m_internalObjectWithSite) + { + DbgPrint("HRESULT STDMETHODCALLTYPE CExplorerBand::SetSite(IUnknown *pUnkSite=%p)\n", pUnkSite); + hr = m_internalObjectWithSite->SetSite(pUnkSite); + DbgPrint("CExplorerBand::SetSite returning %08lx\n", hr); + return hr; + } + + UNIMPLEMENTED; + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CExplorerBand::GetSite(REFIID riid, void **ppvSite) +{ + HRESULT hr; + if (m_internalObjectWithSite) + { + DbgPrint("HRESULT STDMETHODCALLTYPE CExplorerBand::GetSite(REFIID riid=%s, void **ppvSite=%p)\n", wine_dbgstr_guid(&riid), ppvSite); + hr = m_internalObjectWithSite->GetSite(riid, ppvSite); + if (ppvSite) + DbgPrint("\t*ppvSite=%p\n", *ppvSite); + DbgPrint("CExplorerBand::GetSite returning %08lx\n", hr); + return hr; + } + + UNIMPLEMENTED; + return E_NOTIMPL; +} + + +// *** IOleCommandTarget methods *** +HRESULT STDMETHODCALLTYPE CExplorerBand::QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds [], OLECMDTEXT *pCmdText) +{ + HRESULT hr; + if (m_internalOleCommandTarget) + { + DbgPrint("HRESULT STDMETHODCALLTYPE CExplorerBand::QueryStatus(const GUID *pguidCmdGroup=%s, ULONG cCmds=%08x, OLECMD prgCmds []=%p, OLECMDTEXT *pCmdText=%p)\n", + wine_dbgstr_guid(pguidCmdGroup), cCmds, prgCmds, pCmdText); + hr = m_internalOleCommandTarget->QueryStatus(pguidCmdGroup, cCmds, prgCmds, pCmdText); + DbgPrint("CExplorerBand::QueryStatus returning %08lx\n", hr); + return hr; + } + + UNIMPLEMENTED; + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CExplorerBand::Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut) +{ + HRESULT hr; + if (m_internalOleCommandTarget) + { + DbgPrint("HRESULT STDMETHODCALLTYPE CExplorerBand::Exec(const GUID *pguidCmdGroup=%s, DWORD nCmdID=%u, DWORD nCmdexecopt=%u, VARIANT *pvaIn=%p, VARIANT *pvaOut=%p)\n", + wine_dbgstr_guid(pguidCmdGroup), nCmdID, nCmdexecopt, pvaIn, pvaOut); + hr = m_internalOleCommandTarget->Exec(pguidCmdGroup, nCmdID, nCmdexecopt, pvaIn, pvaOut); + DbgPrint("CExplorerBand::Exec returning %08lx\n", hr); + return hr; + } + + UNIMPLEMENTED; + return E_NOTIMPL; +} + + +// *** IServiceProvider methods *** +HRESULT STDMETHODCALLTYPE CExplorerBand::QueryService(REFGUID guidService, REFIID riid, void **ppvObject) +{ + HRESULT hr; + if (m_internalServiceProvider) + { + DbgPrint("HRESULT STDMETHODCALLTYPE CExplorerBand::QueryService(REFGUID guidService=%s, REFIID riid=%s, void **ppvObject=%p)\n", + wine_dbgstr_guid(&guidService), wine_dbgstr_guid(&riid), ppvObject); + hr = m_internalServiceProvider->QueryService(guidService, riid, ppvObject); + if (ppvObject) + DbgPrint("\t*ppvObject=%p\n", *ppvObject); + DbgPrint("CExplorerBand::QueryService returning %08lx\n", hr); + return hr; + } + + UNIMPLEMENTED; + return E_NOTIMPL; +} + + +// *** IInputObject methods *** +HRESULT STDMETHODCALLTYPE CExplorerBand::UIActivateIO(BOOL fActivate, LPMSG lpMsg) +{ + HRESULT hr; + if (m_internalInputObject) + { + DbgPrint("HRESULT STDMETHODCALLTYPE CExplorerBand::UIActivateIO(BOOL fActivate=%s, LPMSG lpMsg=%p)\n", + fActivate ? "TRUE" : "FALSE", lpMsg); + hr = m_internalInputObject->UIActivateIO(fActivate, lpMsg); + if (lpMsg) + DbgPrint("\t*lpMsg={hwnd=%p, message=%x, wParam=%x, lParam=%x, time=%x, pt={%u %u}}\n", + lpMsg->hwnd, lpMsg->message, lpMsg->wParam, lpMsg->lParam, lpMsg->time, lpMsg->pt.x, lpMsg->pt.y); + DbgPrint("CExplorerBand::UIActivateIO returning %08lx\n", hr); + return hr; + } + + UNIMPLEMENTED; + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CExplorerBand::HasFocusIO() +{ + HRESULT hr; + if (m_internalInputObject) + { + DbgPrint("HRESULT STDMETHODCALLTYPE CExplorerBand::HasFocusIO()\n"); + hr = m_internalInputObject->HasFocusIO(); + DbgPrint("CExplorerBand::HasFocusIO returning %08lx\n", hr); + return hr; + } + + UNIMPLEMENTED; + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CExplorerBand::TranslateAcceleratorIO(LPMSG lpMsg) +{ + HRESULT hr; + if (m_internalInputObject) + { + DbgPrint("HRESULT STDMETHODCALLTYPE CExplorerBand::TranslateAcceleratorIO(LPMSG lpMsg=%p)\n", lpMsg); + hr = m_internalInputObject->TranslateAcceleratorIO(lpMsg); + if (lpMsg) + DbgPrint("\t*lpMsg={hwnd=%p, message=%x, wParam=%x, lParam=%x, time=%x, pt={%u %u}}\n", + lpMsg->hwnd, lpMsg->message, lpMsg->wParam, lpMsg->lParam, lpMsg->time, lpMsg->pt.x, lpMsg->pt.y); + DbgPrint("CExplorerBand::TranslateAcceleratorIO returning %08lx\n", hr); + return hr; + } + + UNIMPLEMENTED; + return E_NOTIMPL; +} + + +// *** IPersist methods *** +HRESULT STDMETHODCALLTYPE CExplorerBand::GetClassID(CLSID *pClassID) +{ + HRESULT hr; + if (m_internalPersistStream) + { + DbgPrint("HRESULT STDMETHODCALLTYPE CExplorerBand::GetClassID(CLSID *pClassID=%p)\n", pClassID); + hr = m_internalPersistStream->GetClassID(pClassID); + if (pClassID) + DbgPrint("\t*pClassID=%s\n", wine_dbgstr_guid(pClassID)); + DbgPrint("CExplorerBand::GetClassID returning %08lx\n", hr); + return hr; + } + + UNIMPLEMENTED; + return E_NOTIMPL; +} + + +// *** IPersistStream methods *** +HRESULT STDMETHODCALLTYPE CExplorerBand::IsDirty() +{ + HRESULT hr; + if (m_internalPersistStream) + { + DbgPrint("HRESULT STDMETHODCALLTYPE CExplorerBand::IsDirty()\n"); + hr = m_internalPersistStream->IsDirty(); + DbgPrint("CExplorerBand::IsDirty returning %08lx\n", hr); + return hr; + } + + UNIMPLEMENTED; + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CExplorerBand::Load(IStream *pStm) +{ + HRESULT hr; + if (m_internalPersistStream) + { + DbgPrint("HRESULT STDMETHODCALLTYPE CExplorerBand::Load(IStream *pStm=%p)\n", pStm); + hr = m_internalPersistStream->Load(pStm); + DbgPrint("CExplorerBand::Load returning %08lx\n", hr); + return hr; + } + + UNIMPLEMENTED; + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CExplorerBand::Save(IStream *pStm, BOOL fClearDirty) +{ + HRESULT hr; + if (m_internalPersistStream) + { + DbgPrint("HRESULT STDMETHODCALLTYPE CExplorerBand::Save(IStream *pStm=%p, BOOL fClearDirty=%s)\n", + pStm, fClearDirty ? "TRUE" : "FALSE"); + hr = m_internalPersistStream->Save(pStm, fClearDirty); + DbgPrint("CExplorerBand::Save returning %08lx\n", hr); + return hr; + } + + UNIMPLEMENTED; + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CExplorerBand::GetSizeMax(ULARGE_INTEGER *pcbSize) +{ + HRESULT hr; + if (m_internalPersistStream) + { + DbgPrint("HRESULT STDMETHODCALLTYPE CExplorerBand::GetSizeMax(ULARGE_INTEGER *pcbSize=%p)\n", pcbSize); + hr = m_internalPersistStream->GetSizeMax(pcbSize); + if (pcbSize) + DbgPrint("\t*pcbSize=%llx\n", pcbSize->QuadPart); + DbgPrint("CExplorerBand::GetSizeMax returning %08lx\n", hr); + return hr; + } + + UNIMPLEMENTED; + return E_NOTIMPL; +} + + +// *** IWinEventHandler methods *** +HRESULT STDMETHODCALLTYPE CExplorerBand::OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult) +{ + HRESULT hr; + if (m_internalWinEventHandler) + { + if (m_OnWinEventShown) + return m_internalWinEventHandler->OnWinEvent(hWnd, uMsg, wParam, lParam, theResult); + m_OnWinEventShown = TRUE; + + DbgPrint("HRESULT STDMETHODCALLTYPE CExplorerBand::OnWinEvent(HWND hWnd=%x, UINT uMsg=%x, WPARAM wParam=%x, LPARAM lParam=%x, LRESULT *theResult=%p)\n", + hWnd, uMsg, wParam, lParam, theResult); + hr = m_internalWinEventHandler->OnWinEvent(hWnd, uMsg, wParam, lParam, theResult); + if (theResult) + DbgPrint("\t*theResult=%x\n", *theResult); + DbgPrint("CExplorerBand::OnWinEvent returning %08lx\n", hr); + return hr; + } + + UNIMPLEMENTED; + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CExplorerBand::IsWindowOwner(HWND hWnd) +{ + HRESULT hr; + if (m_internalWinEventHandler) + { + DbgPrint("HRESULT STDMETHODCALLTYPE CExplorerBand::IsWindowOwner(HWND hWnd=%x)\n", hWnd); + hr = m_internalWinEventHandler->IsWindowOwner(hWnd); + DbgPrint("CExplorerBand::IsWindowOwner returning %08lx\n", hr); + return hr; + } + + UNIMPLEMENTED; + return E_NOTIMPL; +} + + +// *** IBandNavigate methods *** +HRESULT STDMETHODCALLTYPE CExplorerBand::Select(long paramC) +{ + HRESULT hr; + if (m_internalBandNavigate) + { + DbgPrint("HRESULT STDMETHODCALLTYPE CExplorerBand::Select(long paramC=%x)\n", paramC); + hr = m_internalBandNavigate->Select(paramC); + DbgPrint("CExplorerBand::Select returning %08lx\n", hr); + return hr; + } + + UNIMPLEMENTED; + return E_NOTIMPL; +} + + +// *** INamespaceProxy *** +HRESULT STDMETHODCALLTYPE CExplorerBand::GetNavigateTarget(long paramC, long param10, long param14) +{ + HRESULT hr; + if (m_internalNamespaceProxy) + { + DbgPrint("HRESULT STDMETHODCALLTYPE CExplorerBand::GetNavigateTarget(long paramC=%08x, long param10=%08x, long param14=%08x)\n", + paramC, param10, param14); + hr = m_internalNamespaceProxy->GetNavigateTarget(paramC, param10, param14); + DbgPrint("CExplorerBand::GetNavigateTarget returning %08lx\n", hr); + return hr; + } + + UNIMPLEMENTED; + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CExplorerBand::Invoke(long paramC) +{ + HRESULT hr; + if (m_internalNamespaceProxy) + { + DbgPrint("HRESULT STDMETHODCALLTYPE CExplorerBand::Invoke(long paramC=%08x)\n", paramC); + hr = m_internalNamespaceProxy->Invoke(paramC); + DbgPrint("CExplorerBand::Invoke returning %08lx\n", hr); + return hr; + } + + UNIMPLEMENTED; + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CExplorerBand::OnSelectionChanged(long paramC) +{ + HRESULT hr; + if (m_internalNamespaceProxy) + { + DbgPrint("HRESULT STDMETHODCALLTYPE CExplorerBand::OnSelectionChanged(long paramC=%08x)\n", paramC); + hr = m_internalNamespaceProxy->OnSelectionChanged(paramC); + DbgPrint("CExplorerBand::OnSelectionChanged returning %08lx\n", hr); + return hr; + } + + UNIMPLEMENTED; + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CExplorerBand::RefreshFlags(long paramC, long param10, long param14) +{ + HRESULT hr; + if (m_internalNamespaceProxy) + { + DbgPrint("HRESULT STDMETHODCALLTYPE CExplorerBand::RefreshFlags(long paramC=%08x, long param10=%08x, long param14=%08x)\n", + paramC, param10, param14); + hr = m_internalNamespaceProxy->RefreshFlags(paramC, param10, param14); + DbgPrint("CExplorerBand::RefreshFlags returning %08lx\n", hr); + return hr; + } + + UNIMPLEMENTED; + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CExplorerBand::CacheItem(long paramC) +{ + HRESULT hr; + if (m_internalNamespaceProxy) + { + DbgPrint("HRESULT STDMETHODCALLTYPE CExplorerBand::CacheItem(long paramC=%08x)\n", paramC); + hr = m_internalNamespaceProxy->CacheItem(paramC); + DbgPrint("CExplorerBand::CacheItem returning %08lx\n", hr); + return hr; + } + + UNIMPLEMENTED; + return E_NOTIMPL; +} + + +// *** IDispatch methods *** +HRESULT STDMETHODCALLTYPE CExplorerBand::GetTypeInfoCount(UINT *pctinfo) +{ + HRESULT hr; + if (m_internalDispatch) + { + DbgPrint("HRESULT STDMETHODCALLTYPE CExplorerBand::GetTypeInfoCount(UINT *pctinfo=%p)\n", pctinfo); + hr = m_internalDispatch->GetTypeInfoCount(pctinfo); + if (pctinfo) + DbgPrint("\t*pctinfo=%08x\n", *pctinfo); + DbgPrint("CExplorerBand::GetTypeInfoCount returning %08lx\n", hr); + return hr; + } + + UNIMPLEMENTED; + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CExplorerBand::GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo) +{ + HRESULT hr; + if (m_internalDispatch) + { + DbgPrint("HRESULT STDMETHODCALLTYPE CExplorerBand::GetTypeInfo(UINT iTInfo=%u, LCID lcid=%08x, ITypeInfo **ppTInfo=%p)\n", + iTInfo, lcid, ppTInfo); + hr = m_internalDispatch->GetTypeInfo(iTInfo, lcid, ppTInfo); + if (ppTInfo) + DbgPrint("\t*ppTInfo=%08x\n", *ppTInfo); + DbgPrint("CExplorerBand::GetTypeInfo returning %08lx\n", hr); + return hr; + } + + UNIMPLEMENTED; + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CExplorerBand::GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId) +{ + HRESULT hr; + if (m_internalDispatch) + { + DbgPrint("HRESULT STDMETHODCALLTYPE CExplorerBand::GetIDsOfNames(REFIID riid=%s, LPOLESTR *rgszNames=%S, UINT cNames=%u, LCID lcid=%08x, DISPID *rgDispId=%p)\n", + wine_dbgstr_guid(&riid), rgszNames, cNames, lcid, rgDispId); + hr = m_internalDispatch->GetIDsOfNames(riid, rgszNames, cNames, lcid, rgDispId); + if (rgDispId && SUCCEEDED(hr)) + { + for (UINT i = 0; i < cNames; i++) + { + DbgPrint("\trgDispId[%d]=%08x\n", rgDispId[i]); + } + } + DbgPrint("CExplorerBand::GetTypeInfo returning %08lx\n", hr); + return hr; + } + + UNIMPLEMENTED; + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CExplorerBand::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) +{ + UNIMPLEMENTED; + return E_NOTIMPL; +} + diff --git a/reactos/dll/win32/browseui/explorerband.h b/reactos/dll/win32/browseui/explorerband.h new file mode 100644 index 00000000000..97193fb9d7b --- /dev/null +++ b/reactos/dll/win32/browseui/explorerband.h @@ -0,0 +1,227 @@ +#pragma once + +#if 0 +// Is this a CToolsBand that implements a toolbar? +class CToolBand : + public CComObjectRootEx, + public IDeskBand, + public IObjectWithSite, + public IInputObject, + public IPersistStream, + public IOleCommandTarget, + public IServiceProvider +{ +public: + // *** IOleWindow methods *** + virtual HRESULT STDMETHODCALLTYPE GetWindow(HWND *lphwnd); + virtual HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(BOOL fEnterMode); + + // *** IDockingWindow methods *** + virtual HRESULT STDMETHODCALLTYPE CloseDW(DWORD dwReserved); + virtual HRESULT STDMETHODCALLTYPE ResizeBorderDW(const RECT *prcBorder, IUnknown *punkToolbarSite, BOOL fReserved); + virtual HRESULT STDMETHODCALLTYPE ShowDW(BOOL fShow); + + // *** IDeskBand methods *** + virtual HRESULT STDMETHODCALLTYPE GetBandInfo(DWORD dwBandID, DWORD dwViewMode, DESKBANDINFO *pdbi); + + // *** IObjectWithSite methods *** + virtual HRESULT STDMETHODCALLTYPE SetSite(IUnknown *pUnkSite); + virtual HRESULT STDMETHODCALLTYPE GetSite(REFIID riid, void **ppvSite); + + // *** IOleCommandTarget methods *** + virtual HRESULT STDMETHODCALLTYPE QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds [], OLECMDTEXT *pCmdText); + virtual HRESULT STDMETHODCALLTYPE Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut); + + // *** IServiceProvider methods *** + virtual HRESULT STDMETHODCALLTYPE QueryService(REFGUID guidService, REFIID riid, void **ppvObject); + + // *** IInputObject methods *** + virtual HRESULT STDMETHODCALLTYPE UIActivateIO(BOOL fActivate, LPMSG lpMsg); + virtual HRESULT STDMETHODCALLTYPE HasFocusIO(); + virtual HRESULT STDMETHODCALLTYPE TranslateAcceleratorIO(LPMSG lpMsg); + + // *** IPersist methods *** + virtual HRESULT STDMETHODCALLTYPE GetClassID(CLSID *pClassID); + + // *** IPersistStream methods *** + virtual HRESULT STDMETHODCALLTYPE IsDirty(); + virtual HRESULT STDMETHODCALLTYPE Load(IStream *pStm); + virtual HRESULT STDMETHODCALLTYPE Save(IStream *pStm, BOOL fClearDirty); + virtual HRESULT STDMETHODCALLTYPE GetSizeMax(ULARGE_INTEGER *pcbSize); + + BEGIN_COM_MAP(CToolBand) + COM_INTERFACE_ENTRY2_IID(IID_IOleWindow, IOleWindow, IDeskBand) + COM_INTERFACE_ENTRY2_IID(IID_IDockingWindow, IDockingWindow, IDeskBand) + COM_INTERFACE_ENTRY_IID(IID_IDeskBand, IDeskBand) + COM_INTERFACE_ENTRY_IID(IID_IObjectWithSite, IObjectWithSite) + COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget, IOleCommandTarget) + COM_INTERFACE_ENTRY_IID(IID_IServiceProvider, IServiceProvider) + COM_INTERFACE_ENTRY_IID(IID_IInputObject, IInputObject) + COM_INTERFACE_ENTRY2_IID(IID_IPersist, IPersist, IPersistStream) + COM_INTERFACE_ENTRY_IID(IID_IPersistStream, IPersistStream) + END_COM_MAP() +}; + +class CNSCBand : + public CToolBand, + public IDeskBand, + public IObjectWithSite, + public IInputObject, + public IPersistStream, + public IOleCommandTarget, + public IServiceProvider, + public IBandNavigate, + public IWinEventHandler, + public INamespaceProxy +{ +public: + // *** IWinEventHandler methods *** + virtual HRESULT STDMETHODCALLTYPE OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult); + virtual HRESULT STDMETHODCALLTYPE IsWindowOwner(HWND hWnd); + + // *** IBandNavigate methods *** + virtual HRESULT STDMETHODCALLTYPE Select(long paramC); + + // *** INamespaceProxy *** + virtual HRESULT STDMETHODCALLTYPE GetNavigateTarget(long paramC, long param10, long param14); + virtual HRESULT STDMETHODCALLTYPE Invoke(long paramC); + virtual HRESULT STDMETHODCALLTYPE OnSelectionChanged(long paramC); + virtual HRESULT STDMETHODCALLTYPE RefreshFlags(long paramC, long param10, long param14); + virtual HRESULT STDMETHODCALLTYPE CacheItem(long paramC); + + BEGIN_COM_MAP(CNSCBand) + COM_INTERFACE_ENTRY_IID(IID_IWinEventHandler, IWinEventHandler) + COM_INTERFACE_ENTRY_IID(IID_IBandNavigate, IBandNavigate) + COM_INTERFACE_ENTRY_IID(IID_INamespaceProxy, INamespaceProxy) +#if 0 + COM_INTERFACE_ENTRY_CHAIN(CToolBand) +#else + COM_INTERFACE_ENTRY2_IID(IID_IOleWindow, IOleWindow, IDeskBand) + COM_INTERFACE_ENTRY2_IID(IID_IDockingWindow, IDockingWindow, IDeskBand) + COM_INTERFACE_ENTRY_IID(IID_IInputObject, IInputObject) + COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget, IOleCommandTarget) + COM_INTERFACE_ENTRY_IID(IID_IServiceProvider, IServiceProvider) + COM_INTERFACE_ENTRY_IID(IID_IPersistStream, IPersistStream) + COM_INTERFACE_ENTRY2_IID(IID_IPersist, IPersist, IPersistStream) + COM_INTERFACE_ENTRY_IID(IID_IObjectWithSite, IObjectWithSite) +#endif + END_COM_MAP() +}; +#endif + +class CExplorerBand : + public CComCoClass, +#if 0 + public CNSCBand, +#else + public CComObjectRootEx, +#endif + public IDeskBand, + public IObjectWithSite, + public IInputObject, + public IPersistStream, + public IOleCommandTarget, + public IServiceProvider, + public IBandNavigate, + public IWinEventHandler, + public INamespaceProxy +{ + CComPtr m_internalBand; + + CComPtr m_internalDeskBand; + CComPtr m_internalObjectWithSite; + CComPtr m_internalInputObject; + CComPtr m_internalPersistStream; + CComPtr m_internalOleCommandTarget; + CComPtr m_internalServiceProvider; + CComPtr m_internalBandNavigate; + CComPtr m_internalWinEventHandler; + CComPtr m_internalNamespaceProxy; + CComPtr m_internalDispatch; + + bool m_OnWinEventShown; +public: + CExplorerBand(); + virtual ~CExplorerBand(); + + // *** IOleWindow methods *** + virtual HRESULT STDMETHODCALLTYPE GetWindow(HWND *lphwnd); + virtual HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(BOOL fEnterMode); + + // *** IDockingWindow methods *** + virtual HRESULT STDMETHODCALLTYPE CloseDW(DWORD dwReserved); + virtual HRESULT STDMETHODCALLTYPE ResizeBorderDW(const RECT *prcBorder, IUnknown *punkToolbarSite, BOOL fReserved); + virtual HRESULT STDMETHODCALLTYPE ShowDW(BOOL fShow); + + // *** IDeskBand methods *** + virtual HRESULT STDMETHODCALLTYPE GetBandInfo(DWORD dwBandID, DWORD dwViewMode, DESKBANDINFO *pdbi); + + // *** IObjectWithSite methods *** + virtual HRESULT STDMETHODCALLTYPE SetSite(IUnknown *pUnkSite); + virtual HRESULT STDMETHODCALLTYPE GetSite(REFIID riid, void **ppvSite); + + // *** IOleCommandTarget methods *** + virtual HRESULT STDMETHODCALLTYPE QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds [], OLECMDTEXT *pCmdText); + virtual HRESULT STDMETHODCALLTYPE Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut); + + // *** IServiceProvider methods *** + virtual HRESULT STDMETHODCALLTYPE QueryService(REFGUID guidService, REFIID riid, void **ppvObject); + + // *** IInputObject methods *** + virtual HRESULT STDMETHODCALLTYPE UIActivateIO(BOOL fActivate, LPMSG lpMsg); + virtual HRESULT STDMETHODCALLTYPE HasFocusIO(); + virtual HRESULT STDMETHODCALLTYPE TranslateAcceleratorIO(LPMSG lpMsg); + + // *** IPersist methods *** + virtual HRESULT STDMETHODCALLTYPE GetClassID(CLSID *pClassID); + + // *** IPersistStream methods *** + virtual HRESULT STDMETHODCALLTYPE IsDirty(); + virtual HRESULT STDMETHODCALLTYPE Load(IStream *pStm); + virtual HRESULT STDMETHODCALLTYPE Save(IStream *pStm, BOOL fClearDirty); + virtual HRESULT STDMETHODCALLTYPE GetSizeMax(ULARGE_INTEGER *pcbSize); + + // *** IWinEventHandler methods *** + virtual HRESULT STDMETHODCALLTYPE OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult); + virtual HRESULT STDMETHODCALLTYPE IsWindowOwner(HWND hWnd); + + // *** IBandNavigate methods *** + virtual HRESULT STDMETHODCALLTYPE Select(long paramC); + + // *** INamespaceProxy *** + virtual HRESULT STDMETHODCALLTYPE GetNavigateTarget(long paramC, long param10, long param14); + virtual HRESULT STDMETHODCALLTYPE Invoke(long paramC); + virtual HRESULT STDMETHODCALLTYPE OnSelectionChanged(long paramC); + virtual HRESULT STDMETHODCALLTYPE RefreshFlags(long paramC, long param10, long param14); + virtual HRESULT STDMETHODCALLTYPE CacheItem(long paramC); + + // *** IDispatch methods *** + virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT *pctinfo); + virtual HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo); + virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId); + virtual HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr); + + DECLARE_REGISTRY_RESOURCEID(IDR_EXPLORERBAND) + DECLARE_NOT_AGGREGATABLE(CExplorerBand) + + DECLARE_PROTECT_FINAL_CONSTRUCT() + + BEGIN_COM_MAP(CExplorerBand) + COM_INTERFACE_ENTRY_IID(IID_IDispatch, IDeskBand) + COM_INTERFACE_ENTRY_IID(IID_IWinEventHandler, IWinEventHandler) + COM_INTERFACE_ENTRY_IID(IID_IBandNavigate, IBandNavigate) + COM_INTERFACE_ENTRY_IID(IID_INamespaceProxy, INamespaceProxy) + COM_INTERFACE_ENTRY2_IID(IID_IOleWindow, IOleWindow, IDeskBand) + COM_INTERFACE_ENTRY2_IID(IID_IDockingWindow, IDockingWindow, IDeskBand) + COM_INTERFACE_ENTRY_IID(IID_IDeskBand, IDeskBand) + COM_INTERFACE_ENTRY_IID(IID_IObjectWithSite, IObjectWithSite) + COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget, IOleCommandTarget) + COM_INTERFACE_ENTRY_IID(IID_IServiceProvider, IServiceProvider) + COM_INTERFACE_ENTRY_IID(IID_IInputObject, IInputObject) + COM_INTERFACE_ENTRY2_IID(IID_IPersist, IPersist, IPersistStream) + COM_INTERFACE_ENTRY_IID(IID_IPersistStream, IPersistStream) + END_COM_MAP() +}; + +extern "C" +HRESULT WINAPI CExplorerBand_Constructor(REFIID riid, LPVOID *ppv); \ No newline at end of file diff --git a/reactos/dll/win32/browseui/precomp.h b/reactos/dll/win32/browseui/precomp.h index eab21d7f6f1..bfebc0d519e 100644 --- a/reactos/dll/win32/browseui/precomp.h +++ b/reactos/dll/win32/browseui/precomp.h @@ -41,6 +41,7 @@ #include "commonbrowser.h" #include "globalfoldersettings.h" #include "regtreeoptions.h" +#include "explorerband.h" #include WINE_DEFAULT_DEBUG_CHANNEL(browseui); diff --git a/reactos/dll/win32/browseui/res/explorerband.rgs b/reactos/dll/win32/browseui/res/explorerband.rgs new file mode 100644 index 00000000000..0b1059774b5 --- /dev/null +++ b/reactos/dll/win32/browseui/res/explorerband.rgs @@ -0,0 +1,13 @@ +HKCR +{ + NoRemove CLSID + { + ForceRemove {EFA24E64-B078-11D0-89E4-00C04FC9E26E} = s 'Explorer TreeView Band' + { + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Apartment' + } + } + } +} diff --git a/reactos/dll/win32/browseui/resource.h b/reactos/dll/win32/browseui/resource.h index 7d5e8a42834..5fa13414553 100644 --- a/reactos/dll/win32/browseui/resource.h +++ b/reactos/dll/win32/browseui/resource.h @@ -77,6 +77,7 @@ #define IDR_INTERNETTOOLBAR 136 #define IDR_GLOBALFOLDERSETTINGS 137 #define IDR_REGTREEOPTIONS 138 +#define IDR_EXPLORERBAND 139 #define IDS_SMALLICONS 12301 #define IDS_LARGEICONS 12302 diff --git a/reactos/dll/win32/browseui/shellbrowser.cpp b/reactos/dll/win32/browseui/shellbrowser.cpp index 59691cc0bb6..41a8ed89469 100644 --- a/reactos/dll/win32/browseui/shellbrowser.cpp +++ b/reactos/dll/win32/browseui/shellbrowser.cpp @@ -24,6 +24,8 @@ #include #include +#define USE_CUSTOM_EXPLORERBAND 1 + extern "C" BOOL WINAPI Shell_GetImageLists( _Out_ HIMAGELIST *phiml, @@ -1179,9 +1181,24 @@ HRESULT CShellBrowser::ShowBand(const CLSID &classID, bool vertical) hResult = GetBaseBar(vertical, (IUnknown **)&theBaseBar); if (FAILED_UNEXPECTEDLY(hResult)) return hResult; - hResult = CoCreateInstance(classID, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARG(IUnknown, &newBand)); - if (FAILED_UNEXPECTEDLY(hResult)) - return hResult; + +#if USE_CUSTOM_EXPLORERBAND + TRACE("ShowBand called for CLSID %s, vertical=%d...\n", wine_dbgstr_guid(&classID), vertical); + if (IsEqualCLSID(CLSID_ExplorerBand, classID)) + { + TRACE("CLSID_ExplorerBand requested, building internal band.\n"); + hResult = CExplorerBand_Constructor(IID_PPV_ARG(IUnknown, &newBand)); + if (FAILED_UNEXPECTEDLY(hResult)) + return hResult; + } + else +#endif + { + TRACE("A different CLSID requested, using CoCreateInstance.\n"); + hResult = CoCreateInstance(classID, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARG(IUnknown, &newBand)); + if (FAILED_UNEXPECTEDLY(hResult)) + return hResult; + } hResult = theBaseBar->QueryInterface(IID_PPV_ARG(IDeskBar, &deskBar)); if (FAILED_UNEXPECTEDLY(hResult)) return hResult; @@ -1199,6 +1216,7 @@ HRESULT CShellBrowser::ShowBand(const CLSID &classID, bool vertical) hResult = dockingWindow->ShowDW(TRUE); if (FAILED_UNEXPECTEDLY(hResult)) return hResult; + return S_OK; }