[SHELL32]

* Fix gcc compilation.

[BROWSEUI/RSHELL]
* Use virtual destructors and cleanup with delete in the creator functions.
* Try to fix a bit the "close" flow, so that less circular references remain when the filebrowser windows are closed.

svn path=/branches/shell-experiments/; revision=63539
This commit is contained in:
David Quintana 2014-06-04 16:25:48 +00:00
parent 580b89e9b6
commit 72aa759dd4
16 changed files with 328 additions and 266 deletions

View file

@ -52,7 +52,7 @@ HRESULT WINAPI CMenuBand_Constructor(REFIID riid, LPVOID *ppv)
hr = site->QueryInterface(riid, ppv); hr = site->QueryInterface(riid, ppv);
if (FAILED_UNEXPECTEDLY(hr)) if (FAILED_UNEXPECTEDLY(hr))
site->Release(); delete site;
#endif #endif
return hr; return hr;
@ -255,8 +255,7 @@ HRESULT STDMETHODCALLTYPE CMenuBand::GetSite(REFIID riid, PVOID *ppvSite)
return m_site->QueryInterface(riid, ppvSite); return m_site->QueryInterface(riid, ppvSite);
} }
HRESULT STDMETHODCALLTYPE CMenuBand::GetWindow( HRESULT STDMETHODCALLTYPE CMenuBand::GetWindow(HWND *phwnd)
HWND *phwnd)
{ {
if (m_SFToolbar != NULL) if (m_SFToolbar != NULL)
return m_SFToolbar->GetWindow(phwnd); return m_SFToolbar->GetWindow(phwnd);
@ -264,6 +263,8 @@ HRESULT STDMETHODCALLTYPE CMenuBand::GetWindow(
if (m_staticToolbar != NULL) if (m_staticToolbar != NULL)
return m_staticToolbar->GetWindow(phwnd); return m_staticToolbar->GetWindow(phwnd);
if (phwnd) *phwnd = NULL;
return E_FAIL; return E_FAIL;
} }
@ -417,10 +418,25 @@ HRESULT STDMETHODCALLTYPE CMenuBand::CloseDW(DWORD dwReserved)
ShowDW(FALSE); ShowDW(FALSE);
if (m_staticToolbar != NULL) if (m_staticToolbar != NULL)
return m_staticToolbar->Close(); {
m_staticToolbar->Close();
delete m_staticToolbar;
m_staticToolbar = NULL;
}
if (m_SFToolbar != NULL) if (m_SFToolbar != NULL)
return m_SFToolbar->Close(); {
m_SFToolbar->Close();
delete m_staticToolbar;
m_staticToolbar = NULL;
}
if (m_site) m_site.Release();
if (m_psmc) m_psmc.Release();
if (m_subMenuChild) m_subMenuChild.Release();
if (m_subMenuParent) m_subMenuParent.Release();
if (m_childBand) m_childBand.Release();
if (m_parentBand) m_parentBand.Release();
return S_OK; return S_OK;
} }

View file

@ -69,7 +69,7 @@ private:
public: public:
CMenuBand(); CMenuBand();
~CMenuBand(); virtual ~CMenuBand();
DECLARE_NOT_AGGREGATABLE(CMenuBand) DECLARE_NOT_AGGREGATABLE(CMenuBand)
DECLARE_PROTECT_FINAL_CONSTRUCT() DECLARE_PROTECT_FINAL_CONSTRUCT()

View file

@ -47,7 +47,7 @@ HRESULT WINAPI CMenuDeskBar_Constructor(REFIID riid, LPVOID *ppv)
hr = deskbar->QueryInterface(riid, ppv); hr = deskbar->QueryInterface(riid, ppv);
if (FAILED_UNEXPECTEDLY(hr)) if (FAILED_UNEXPECTEDLY(hr))
deskbar->Release(); delete deskbar;
#endif #endif
return hr; return hr;

View file

@ -52,7 +52,7 @@ private:
public: public:
CMenuDeskBar(); CMenuDeskBar();
~CMenuDeskBar(); virtual ~CMenuDeskBar();
DECLARE_NOT_AGGREGATABLE(CMenuDeskBar) DECLARE_NOT_AGGREGATABLE(CMenuDeskBar)
DECLARE_PROTECT_FINAL_CONSTRUCT() DECLARE_PROTECT_FINAL_CONSTRUCT()

View file

@ -45,7 +45,7 @@ HRESULT WINAPI CMenuSite_Constructor(REFIID riid, LPVOID *ppv)
hr = site->QueryInterface(riid, ppv); hr = site->QueryInterface(riid, ppv);
if (FAILED_UNEXPECTEDLY(hr)) if (FAILED_UNEXPECTEDLY(hr))
site->Release(); delete site;
#endif #endif
return hr; return hr;

View file

@ -39,7 +39,7 @@ private:
public: public:
CMenuSite(); CMenuSite();
~CMenuSite() {} virtual ~CMenuSite() {}
DECLARE_WND_CLASS_EX(_T("MenuSite"), 0, COLOR_MENU) DECLARE_WND_CLASS_EX(_T("MenuSite"), 0, COLOR_MENU)

View file

@ -36,7 +36,7 @@ private:
public: public:
CEnumMergedFolder() : m_UserLocal(NULL), m_AllUSers(NULL), m_FirstDone(FALSE) {} CEnumMergedFolder() : m_UserLocal(NULL), m_AllUSers(NULL), m_FirstDone(FALSE) {}
~CEnumMergedFolder() {} virtual ~CEnumMergedFolder() {}
DECLARE_NOT_AGGREGATABLE(CEnumMergedFolder) DECLARE_NOT_AGGREGATABLE(CEnumMergedFolder)
DECLARE_PROTECT_FINAL_CONSTRUCT() DECLARE_PROTECT_FINAL_CONSTRUCT()
@ -139,7 +139,7 @@ HRESULT WINAPI CMergedFolder_Constructor(IShellFolder* userLocal, IShellFolder*
hr = fld->QueryInterface(riid, ppv); hr = fld->QueryInterface(riid, ppv);
if (FAILED_UNEXPECTEDLY(hr)) if (FAILED_UNEXPECTEDLY(hr))
fld->Release(); delete fld;
return hr; return hr;
} }

View file

@ -29,7 +29,7 @@ private:
public: public:
CMergedFolder() {} CMergedFolder() {}
~CMergedFolder() {} virtual ~CMergedFolder() {}
HRESULT _SetSources(IShellFolder* userLocal, IShellFolder* allUSers); HRESULT _SetSources(IShellFolder* userLocal, IShellFolder* allUSers);

View file

@ -111,15 +111,9 @@ HRESULT STDMETHODCALLTYPE CAddressBand::GetBandInfo(DWORD dwBandID, DWORD dwView
HRESULT STDMETHODCALLTYPE CAddressBand::SetSite(IUnknown *pUnkSite) HRESULT STDMETHODCALLTYPE CAddressBand::SetSite(IUnknown *pUnkSite)
{ {
CComPtr<IBrowserService> browserService; CComPtr<IBrowserService> browserService;
CComPtr<IOleWindow> oleWindow;
CComPtr<IShellService> shellService; CComPtr<IShellService> shellService;
CComPtr<IUnknown> offset34;
HWND parentWindow; HWND parentWindow;
HWND combobox; HWND combobox;
static const TBBUTTON buttonInfo[] = { {0, 1, TBSTATE_ENABLED, 0} };
HIMAGELIST normalImagelist;
HIMAGELIST hotImageList;
HINSTANCE shellInstance;
HRESULT hResult; HRESULT hResult;
if (pUnkSite == NULL) if (pUnkSite == NULL)
@ -137,7 +131,7 @@ HRESULT STDMETHODCALLTYPE CAddressBand::SetSite(IUnknown *pUnkSite)
// get window handle of parent // get window handle of parent
parentWindow = NULL; parentWindow = NULL;
hResult = IUnknown_GetWindow(pUnkSite, &parentWindow); hResult = IUnknown_GetWindow(fSite, &parentWindow);
if (!::IsWindow(parentWindow)) if (!::IsWindow(parentWindow))
return E_FAIL; return E_FAIL;
@ -182,6 +176,13 @@ HRESULT STDMETHODCALLTYPE CAddressBand::SetSite(IUnknown *pUnkSite)
// TODO: properly initialize this from registry // TODO: properly initialize this from registry
fGoButtonShown = true; fGoButtonShown = true;
if (fGoButtonShown)
{
const TBBUTTON buttonInfo [] = { { 0, 1, TBSTATE_ENABLED, 0 } };
HIMAGELIST normalImagelist;
HIMAGELIST hotImageList;
HINSTANCE shellInstance;
shellInstance = GetModuleHandle(_T("shell32.dll")); shellInstance = GetModuleHandle(_T("shell32.dll"));
normalImagelist = ImageList_LoadImageW(shellInstance, MAKEINTRESOURCE(IDB_GOBUTTON_NORMAL), normalImagelist = ImageList_LoadImageW(shellInstance, MAKEINTRESOURCE(IDB_GOBUTTON_NORMAL),
20, 0, RGB(255, 0, 255), IMAGE_BITMAP, LR_CREATEDIBSECTION); 20, 0, RGB(255, 0, 255), IMAGE_BITMAP, LR_CREATEDIBSECTION);
@ -200,7 +201,7 @@ HRESULT STDMETHODCALLTYPE CAddressBand::SetSite(IUnknown *pUnkSite)
SendMessage(fGoButton, TB_SETHOTIMAGELIST, 0, reinterpret_cast<LPARAM>(hotImageList)); SendMessage(fGoButton, TB_SETHOTIMAGELIST, 0, reinterpret_cast<LPARAM>(hotImageList));
SendMessage(fGoButton, TB_ADDSTRINGW, SendMessage(fGoButton, TB_ADDSTRINGW,
reinterpret_cast<WPARAM>(_AtlBaseModule.GetResourceInstance()), IDS_GOBUTTONLABEL); reinterpret_cast<WPARAM>(_AtlBaseModule.GetResourceInstance()), IDS_GOBUTTONLABEL);
SendMessage(fGoButton, TB_ADDBUTTONSW, 1, (LPARAM)&buttonInfo); SendMessage(fGoButton, TB_ADDBUTTONSW, 1, (LPARAM) &buttonInfo);
IImageList * piml; IImageList * piml;
HRESULT hr = SHGetImageList(SHIL_SMALL, IID_PPV_ARG(IImageList, &piml)); HRESULT hr = SHGetImageList(SHIL_SMALL, IID_PPV_ARG(IImageList, &piml));
@ -212,6 +213,7 @@ HRESULT STDMETHODCALLTYPE CAddressBand::SetSite(IUnknown *pUnkSite)
{ {
SendMessageW(combobox, CBEM_SETIMAGELIST, 0, reinterpret_cast<LPARAM>(piml)); SendMessageW(combobox, CBEM_SETIMAGELIST, 0, reinterpret_cast<LPARAM>(piml));
} }
}
// take advice to watch events // take advice to watch events
hResult = IUnknown_QueryService(pUnkSite, SID_SShellBrowser, IID_PPV_ARG(IBrowserService, &browserService)); hResult = IUnknown_QueryService(pUnkSite, SID_SShellBrowser, IID_PPV_ARG(IBrowserService, &browserService));
@ -252,6 +254,9 @@ HRESULT STDMETHODCALLTYPE CAddressBand::CloseDW(DWORD dwReserved)
m_hWnd = NULL; m_hWnd = NULL;
if (fAddressEditBox) fAddressEditBox.Release();
if (fSite) fSite.Release();
return S_OK; return S_OK;
} }
@ -662,7 +667,7 @@ LRESULT CAddressBand::OnWindowPosChanging(UINT uMsg, WPARAM wParam, LPARAM lPara
HRESULT CreateAddressBand(REFIID riid, void **ppv) HRESULT CreateAddressBand(REFIID riid, void **ppv)
{ {
CComObject<CAddressBand> *theMenuBar; CAddressBand *theMenuBar;
HRESULT hResult; HRESULT hResult;
if (ppv == NULL) if (ppv == NULL)

View file

@ -45,7 +45,7 @@ private:
DWORD fAdviseCookie; DWORD fAdviseCookie;
public: public:
CAddressBand(); CAddressBand();
~CAddressBand(); virtual ~CAddressBand();
private: private:
void FocusChange(BOOL bFocus); void FocusChange(BOOL bFocus);
public: public:

View file

@ -95,6 +95,44 @@ HRESULT IUnknown_TranslateAcceleratorIO(IUnknown * punk, MSG * pmsg)
return pio->TranslateAcceleratorIO(pmsg); return pio->TranslateAcceleratorIO(pmsg);
} }
HRESULT IUnknown_RelayWinEvent(IUnknown * punk, HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult)
{
CComPtr<IWinEventHandler> menuWinEventHandler;
HRESULT hResult = punk->QueryInterface(IID_PPV_ARG(IWinEventHandler, &menuWinEventHandler));
if (FAILED_UNEXPECTEDLY(hResult))
return hResult;
hResult = menuWinEventHandler->IsWindowOwner(hWnd);
if (FAILED_UNEXPECTEDLY(hResult))
return hResult;
if (hResult == S_OK)
return menuWinEventHandler->OnWinEvent(hWnd, uMsg, wParam, lParam, theResult);
return S_FALSE;
}
HRESULT IUnknown_ShowDW(IUnknown * punk, BOOL fShow)
{
CComPtr<IDockingWindow> dockingWindow;
HRESULT hResult = punk->QueryInterface(IID_PPV_ARG(IDockingWindow, &dockingWindow));
if (FAILED_UNEXPECTEDLY(hResult))
return hResult;
hResult = dockingWindow->ShowDW(fShow);
if (FAILED_UNEXPECTEDLY(hResult))
return hResult;
return S_OK;
}
HRESULT IUnknown_CloseDW(IUnknown * punk, DWORD dwReserved)
{
CComPtr<IDockingWindow> dockingWindow;
HRESULT hResult = punk->QueryInterface(IID_PPV_ARG(IDockingWindow, &dockingWindow));
if (FAILED_UNEXPECTEDLY(hResult))
return hResult;
hResult = dockingWindow->CloseDW(dwReserved);
if (FAILED_UNEXPECTEDLY(hResult))
return hResult;
return S_OK;
}
typedef HRESULT(*PMENUBAND_CONSTRUCTOR)(REFIID riid, void **ppv); typedef HRESULT(*PMENUBAND_CONSTRUCTOR)(REFIID riid, void **ppv);
class CInternetToolbar; class CInternetToolbar;
@ -180,31 +218,19 @@ CDockSite::~CDockSite()
HRESULT CDockSite::Initialize(IUnknown *containedBand, CInternetToolbar *browser, HWND hwnd, int bandID, int flags) HRESULT CDockSite::Initialize(IUnknown *containedBand, CInternetToolbar *browser, HWND hwnd, int bandID, int flags)
{ {
CComPtr<IObjectWithSite> child;
CComPtr<IOleWindow> oleWindow;
CComPtr<IDeskBand> deskBand;
TCHAR textBuffer[40]; TCHAR textBuffer[40];
REBARBANDINFOW bandInfo; REBARBANDINFOW bandInfo;
HRESULT hResult; HRESULT hResult;
hResult = containedBand->QueryInterface(IID_PPV_ARG(IObjectWithSite, &child));
if (FAILED(hResult))
return hResult;
hResult = containedBand->QueryInterface(IID_PPV_ARG(IOleWindow, &oleWindow));
if (FAILED(hResult))
return hResult;
hResult = containedBand->QueryInterface(IID_PPV_ARG(IDeskBand, &deskBand));
if (FAILED(hResult))
return hResult;
fContainedBand = containedBand; fContainedBand = containedBand;
fToolbar = browser; fToolbar = browser;
fRebarWindow = hwnd; fRebarWindow = hwnd;
fBandID = bandID; fBandID = bandID;
fFlags = flags; fFlags = flags;
hResult = child->SetSite(static_cast<IOleWindow *>(this)); hResult = IUnknown_SetSite(containedBand, static_cast<IOleWindow *>(this));
if (FAILED(hResult)) if (FAILED(hResult))
return hResult; return hResult;
hResult = oleWindow->GetWindow(&fChildWindow); hResult = IUnknown_GetWindow(containedBand, &fChildWindow);
if (FAILED(hResult)) if (FAILED(hResult))
return hResult; return hResult;
@ -533,10 +559,9 @@ CInternetToolbar::~CInternetToolbar()
void CInternetToolbar::AddDockItem(IUnknown *newItem, int bandID, int flags) void CInternetToolbar::AddDockItem(IUnknown *newItem, int bandID, int flags)
{ {
CDockSite *newSite; CComPtr<CDockSite> newSite;
newSite = new CComObject<CDockSite>; newSite = new CComObject<CDockSite>;
newSite->AddRef();
newSite->Initialize(newItem, this, fMainReBar, bandID, flags); newSite->Initialize(newItem, this, fMainReBar, bandID, flags);
} }
@ -624,10 +649,7 @@ HRESULT CInternetToolbar::CreateMenuBar(IShellMenu **menuBar)
hResult = (*menuBar)->SetMenu((HMENU)V_INTREF(&menuOut), ownerWindow, SMSET_DONTOWN); hResult = (*menuBar)->SetMenu((HMENU)V_INTREF(&menuOut), ownerWindow, SMSET_DONTOWN);
if (FAILED(hResult)) if (FAILED(hResult))
return hResult; return hResult;
hResult = (*menuBar)->QueryInterface(IID_PPV_ARG(IOleCommandTarget, &commandTarget)); hResult = IUnknown_Exec(*menuBar, CGID_MenuBand, 3, 1, NULL, NULL);
if (FAILED(hResult))
return hResult;
hResult = commandTarget->Exec(&CGID_MenuBand, 3, 1, NULL, NULL);
if (FAILED(hResult)) if (FAILED(hResult))
return hResult; return hResult;
return S_OK; return S_OK;
@ -635,43 +657,25 @@ HRESULT CInternetToolbar::CreateMenuBar(IShellMenu **menuBar)
HRESULT CInternetToolbar::CreateBrandBand(IUnknown **logoBar) HRESULT CInternetToolbar::CreateBrandBand(IUnknown **logoBar)
{ {
CComPtr<IUnknown> tempBand;
HRESULT hResult;
#if 1 #if 1
hResult = ::CreateBrandBand(IID_PPV_ARG(IUnknown, logoBar)); return ::CreateBrandBand(IID_PPV_ARG(IUnknown, logoBar));
#else #else
hResult = CoCreateInstance(CLSID_BrandBand, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARG(IUnknown, logoBar)); return CoCreateInstance(CLSID_BrandBand, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARG(IUnknown, logoBar));
#endif #endif
if (FAILED(hResult))
return hResult;
return S_OK;
} }
HRESULT CInternetToolbar::CreateToolsBar(IUnknown **toolsBar) HRESULT CInternetToolbar::CreateToolsBar(IUnknown **toolsBar)
{ {
HRESULT hResult; return ::CreateToolsBar(IID_PPV_ARG(IUnknown, toolsBar));
hResult = ::CreateToolsBar(IID_PPV_ARG(IUnknown, toolsBar));
if (FAILED(hResult))
return hResult;
return S_OK;
} }
HRESULT CInternetToolbar::CreateAddressBand(IUnknown **toolsBar) HRESULT CInternetToolbar::CreateAddressBand(IUnknown **toolsBar)
{ {
CComPtr<IAddressBand> addressBand;
HRESULT hResult;
#if 1 #if 1
hResult = ::CreateAddressBand(IID_PPV_ARG(IUnknown, toolsBar)); return ::CreateAddressBand(IID_PPV_ARG(IUnknown, toolsBar));
#else #else
hResult = CoCreateInstance(CLSID_SH_AddressBand, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARG(IUnknown, toolsBar)); return CoCreateInstance(CLSID_SH_AddressBand, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARG(IUnknown, toolsBar));
#endif #endif
if (FAILED(hResult))
return hResult;
hResult = (*toolsBar)->QueryInterface(IID_PPV_ARG(IAddressBand, &addressBand));
return S_OK;
} }
HRESULT CInternetToolbar::LockUnlockToolbars(bool locked) HRESULT CInternetToolbar::LockUnlockToolbars(bool locked)
@ -825,43 +829,54 @@ HRESULT STDMETHODCALLTYPE CInternetToolbar::ShowDW(BOOL fShow)
if (fShow) if (fShow)
{ {
hResult = ReserveBorderSpace(); hResult = ReserveBorderSpace();
if (FAILED_UNEXPECTEDLY(hResult))
return hResult;
} }
if (fMenuBar) if (fMenuBar)
{ {
CComPtr<IDockingWindow> dockingWindow; hResult = IUnknown_ShowDW(fMenuBar, fShow);
hResult = fMenuBar->QueryInterface(IID_PPV_ARG(IDockingWindow, &dockingWindow)); if (FAILED_UNEXPECTEDLY(hResult))
hResult = dockingWindow->ShowDW(fShow); return hResult;
} }
if (fControlsBar) if (fControlsBar)
{ {
CComPtr<IDockingWindow> dockingWindow; hResult = IUnknown_ShowDW(fControlsBar, fShow);
hResult = fControlsBar->QueryInterface(IID_PPV_ARG(IDockingWindow, &dockingWindow)); if (FAILED_UNEXPECTEDLY(hResult))
hResult = dockingWindow->ShowDW(fShow); return hResult;
} }
if (fNavigationBar) if (fNavigationBar)
{ {
CComPtr<IDockingWindow> dockingWindow; hResult = IUnknown_ShowDW(fNavigationBar, fShow);
hResult = fNavigationBar->QueryInterface(IID_PPV_ARG(IDockingWindow, &dockingWindow)); if (FAILED_UNEXPECTEDLY(hResult))
hResult = dockingWindow->ShowDW(fShow); return hResult;
} }
if (fLogoBar) if (fLogoBar)
{ {
CComPtr<IDockingWindow> dockingWindow; hResult = IUnknown_ShowDW(fLogoBar, fShow);
hResult = fLogoBar->QueryInterface(IID_PPV_ARG(IDockingWindow, &dockingWindow)); if (FAILED_UNEXPECTEDLY(hResult))
hResult = dockingWindow->ShowDW(fShow); return hResult;
} }
return S_OK; return S_OK;
} }
template<class T> template<class T>
void ReleaseCComPtrExpectZero(CComPtr<T>& cptr) void ReleaseCComPtrExpectZero(CComPtr<T>& cptr, BOOL forceRelease = FALSE)
{ {
if (cptr.p != NULL) if (cptr.p != NULL)
{ {
int nrc = cptr->Release(); int nrc = cptr->Release();
if (nrc > 0) if (nrc > 0)
{ {
DbgPrint("WARNING: Unexpected RefCount > 0!\n"); DbgPrint("WARNING: Unexpected RefCount > 0 (%d)!\n", nrc);
if (forceRelease)
{
while (nrc > 0)
{
nrc = cptr->Release();
}
}
} }
cptr.Detach(); cptr.Detach();
} }
@ -873,32 +888,32 @@ HRESULT STDMETHODCALLTYPE CInternetToolbar::CloseDW(DWORD dwReserved)
if (fMenuBar) if (fMenuBar)
{ {
CComPtr<IDockingWindow> dockingWindow; hResult = IUnknown_CloseDW(fMenuBar, dwReserved);
hResult = fMenuBar->QueryInterface(IID_PPV_ARG(IDockingWindow, &dockingWindow)); if (FAILED_UNEXPECTEDLY(hResult))
hResult = dockingWindow->CloseDW(dwReserved); return hResult;
}
ReleaseCComPtrExpectZero(fMenuBar); ReleaseCComPtrExpectZero(fMenuBar);
}
if (fControlsBar) if (fControlsBar)
{ {
CComPtr<IDockingWindow> dockingWindow; hResult = IUnknown_CloseDW(fControlsBar, dwReserved);
hResult = fControlsBar->QueryInterface(IID_PPV_ARG(IDockingWindow, &dockingWindow)); if (FAILED_UNEXPECTEDLY(hResult))
hResult = dockingWindow->CloseDW(dwReserved); return hResult;
}
ReleaseCComPtrExpectZero(fControlsBar); ReleaseCComPtrExpectZero(fControlsBar);
}
if (fNavigationBar) if (fNavigationBar)
{ {
CComPtr<IDockingWindow> dockingWindow; hResult = IUnknown_CloseDW(fNavigationBar, dwReserved);
hResult = fNavigationBar->QueryInterface(IID_PPV_ARG(IDockingWindow, &dockingWindow)); if (FAILED_UNEXPECTEDLY(hResult))
hResult = dockingWindow->CloseDW(dwReserved); return hResult;
}
ReleaseCComPtrExpectZero(fNavigationBar); ReleaseCComPtrExpectZero(fNavigationBar);
}
if (fLogoBar) if (fLogoBar)
{ {
CComPtr<IDockingWindow> dockingWindow; hResult = IUnknown_CloseDW(fLogoBar, dwReserved);
hResult = fLogoBar->QueryInterface(IID_PPV_ARG(IDockingWindow, &dockingWindow)); if (FAILED_UNEXPECTEDLY(hResult))
hResult = dockingWindow->CloseDW(dwReserved); return hResult;
}
ReleaseCComPtrExpectZero(fLogoBar); ReleaseCComPtrExpectZero(fLogoBar);
}
return S_OK; return S_OK;
} }
@ -971,9 +986,6 @@ HRESULT STDMETHODCALLTYPE CInternetToolbar::InitNew()
CComPtr<IUnknown> logoBar; CComPtr<IUnknown> logoBar;
CComPtr<IUnknown> toolsBar; CComPtr<IUnknown> toolsBar;
CComPtr<IUnknown> navigationBar; CComPtr<IUnknown> navigationBar;
CComPtr<IOleWindow> menuOleWindow;
CComPtr<IOleWindow> toolbarOleWindow;
CComPtr<IOleWindow> navigationOleWindow;
HRESULT hResult; HRESULT hResult;
/* Create and attach the menubar to the rebar */ /* Create and attach the menubar to the rebar */
@ -982,8 +994,7 @@ HRESULT STDMETHODCALLTYPE CInternetToolbar::InitNew()
return hResult; return hResult;
AddDockItem(menuBar, ITBBID_MENUBAND, CDockSite::ITF_NOTITLE | CDockSite::ITF_NEWBANDALWAYS | CDockSite::ITF_GRIPPERALWAYS); AddDockItem(menuBar, ITBBID_MENUBAND, CDockSite::ITF_NOTITLE | CDockSite::ITF_NEWBANDALWAYS | CDockSite::ITF_GRIPPERALWAYS);
hResult = menuBar->QueryInterface(IID_PPV_ARG(IOleWindow, &menuOleWindow)); hResult = IUnknown_GetWindow(menuBar, &fMenuBandWindow);
hResult = menuOleWindow->GetWindow(&fMenuBandWindow);
fMenuBar.Attach(menuBar.Detach()); // transfer the ref count fMenuBar.Attach(menuBar.Detach()); // transfer the ref count
// FIXME: The ros Rebar does not properly support fixed-size items such as the brandband, // FIXME: The ros Rebar does not properly support fixed-size items such as the brandband,
@ -1003,10 +1014,7 @@ HRESULT STDMETHODCALLTYPE CInternetToolbar::InitNew()
return hResult; return hResult;
AddDockItem(toolsBar, ITBBID_TOOLSBAND, CDockSite::ITF_NOTITLE | CDockSite::ITF_NEWBANDALWAYS | CDockSite::ITF_GRIPPERALWAYS); AddDockItem(toolsBar, ITBBID_TOOLSBAND, CDockSite::ITF_NOTITLE | CDockSite::ITF_NEWBANDALWAYS | CDockSite::ITF_GRIPPERALWAYS);
fControlsBar.Attach(toolsBar.Detach()); // transfer the ref count fControlsBar.Attach(toolsBar.Detach()); // transfer the ref count
hResult = fControlsBar->QueryInterface(IID_PPV_ARG(IOleWindow, &toolbarOleWindow)); hResult = IUnknown_GetWindow(fControlsBar, &fToolbarWindow);
if (FAILED(hResult))
return hResult;
hResult = toolbarOleWindow->GetWindow(&fToolbarWindow);
if (FAILED(hResult)) if (FAILED(hResult))
return hResult; return hResult;
@ -1015,9 +1023,8 @@ HRESULT STDMETHODCALLTYPE CInternetToolbar::InitNew()
if (FAILED(hResult)) if (FAILED(hResult))
return hResult; return hResult;
AddDockItem(navigationBar, ITBBID_ADDRESSBAND, CDockSite::ITF_NEWBANDALWAYS | CDockSite::ITF_GRIPPERALWAYS); AddDockItem(navigationBar, ITBBID_ADDRESSBAND, CDockSite::ITF_NEWBANDALWAYS | CDockSite::ITF_GRIPPERALWAYS);
hResult = navigationBar->QueryInterface(IID_PPV_ARG(IOleWindow, &navigationOleWindow));
hResult = navigationOleWindow->GetWindow(&fNavigationWindow);
fNavigationBar.Attach(navigationBar.Detach()); fNavigationBar.Attach(navigationBar.Detach());
hResult = IUnknown_GetWindow(fNavigationBar, &fNavigationWindow);
return S_OK; return S_OK;
} }
@ -1330,16 +1337,27 @@ HRESULT STDMETHODCALLTYPE CInternetToolbar::QueryService(REFGUID guidService, RE
HRESULT STDMETHODCALLTYPE CInternetToolbar::OnWinEvent( HRESULT STDMETHODCALLTYPE CInternetToolbar::OnWinEvent(
HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult) HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult)
{ {
CComPtr<IWinEventHandler> menuWinEventHandler;
HRESULT hResult; HRESULT hResult;
if (fMenuBar) if (fMenuBar)
{ {
hResult = fMenuBar->QueryInterface(IID_PPV_ARG(IWinEventHandler, &menuWinEventHandler)); hResult = IUnknown_RelayWinEvent(fMenuBar, hWnd, uMsg, wParam, lParam, theResult);
if (menuWinEventHandler->IsWindowOwner(hWnd) == S_OK) if (hResult != S_FALSE)
{ return hResult;
return menuWinEventHandler->OnWinEvent(fMenuBandWindow, uMsg, wParam, lParam, theResult);
} }
if (fNavigationBar)
{
hResult = IUnknown_RelayWinEvent(fNavigationBar, hWnd, uMsg, wParam, lParam, theResult);
if (hResult != S_FALSE)
return hResult;
}
if (fLogoBar)
{
hResult = IUnknown_RelayWinEvent(fLogoBar, hWnd, uMsg, wParam, lParam, theResult);
if (hResult != S_FALSE)
return hResult;
} }
return S_FALSE; return S_FALSE;
@ -1347,16 +1365,19 @@ HRESULT STDMETHODCALLTYPE CInternetToolbar::OnWinEvent(
HRESULT STDMETHODCALLTYPE CInternetToolbar::IsWindowOwner(HWND hWnd) HRESULT STDMETHODCALLTYPE CInternetToolbar::IsWindowOwner(HWND hWnd)
{ {
UNIMPLEMENTED;
return E_NOTIMPL; return E_NOTIMPL;
} }
HRESULT STDMETHODCALLTYPE CInternetToolbar::AddBand(IUnknown *punk) HRESULT STDMETHODCALLTYPE CInternetToolbar::AddBand(IUnknown *punk)
{ {
UNIMPLEMENTED;
return E_NOTIMPL; return E_NOTIMPL;
} }
HRESULT STDMETHODCALLTYPE CInternetToolbar::EnumBands(UINT uBand, DWORD *pdwBandID) HRESULT STDMETHODCALLTYPE CInternetToolbar::EnumBands(UINT uBand, DWORD *pdwBandID)
{ {
UNIMPLEMENTED;
return E_NOTIMPL; return E_NOTIMPL;
} }
@ -1751,37 +1772,12 @@ LRESULT CInternetToolbar::OnCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOO
{ {
LRESULT theResult; LRESULT theResult;
HRESULT hResult; HRESULT hResult;
HWND target = (HWND) lParam;
if (fMenuBar) hResult = OnWinEvent((HWND) lParam, uMsg, wParam, lParam, &theResult);
{
CComPtr<IWinEventHandler> menuWinEventHandler;
hResult = fMenuBar->QueryInterface(IID_PPV_ARG(IWinEventHandler, &menuWinEventHandler));
if (SUCCEEDED(hResult))
{
if (menuWinEventHandler->IsWindowOwner(target) == S_OK)
{
hResult = menuWinEventHandler->OnWinEvent(target, uMsg, wParam, lParam, &theResult);
return FAILED(hResult) ? 0 : theResult;
}
}
}
if (fNavigationBar) bHandled = hResult == S_OK;
{
CComPtr<IWinEventHandler> menuWinEventHandler;
hResult = fNavigationBar->QueryInterface(IID_PPV_ARG(IWinEventHandler, &menuWinEventHandler));
if (SUCCEEDED(hResult))
{
if (menuWinEventHandler->IsWindowOwner(target) == S_OK)
{
hResult = menuWinEventHandler->OnWinEvent(target, uMsg, wParam, lParam, &theResult);
return FAILED(hResult) ? 0 : theResult;
}
}
}
return 0; return FAILED_UNEXPECTEDLY(hResult) ? 0 : theResult;
} }
LRESULT CInternetToolbar::OnNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) LRESULT CInternetToolbar::OnNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
{ {
@ -1789,37 +1785,13 @@ LRESULT CInternetToolbar::OnNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL
LRESULT theResult; LRESULT theResult;
HRESULT hResult; HRESULT hResult;
notifyHeader = (NMHDR *) lParam; notifyHeader = reinterpret_cast<NMHDR *>(lParam);
if (fMenuBar) hResult = OnWinEvent(notifyHeader->hwndFrom, uMsg, wParam, lParam, &theResult);
{
CComPtr<IWinEventHandler> menuWinEventHandler;
hResult = fMenuBar->QueryInterface(IID_PPV_ARG(IWinEventHandler, &menuWinEventHandler));
if (SUCCEEDED(hResult))
{
if (menuWinEventHandler->IsWindowOwner(notifyHeader->hwndFrom) == S_OK)
{
hResult = menuWinEventHandler->OnWinEvent(notifyHeader->hwndFrom, uMsg, wParam, lParam, &theResult);
return FAILED(hResult) ? 0 : theResult;
}
}
}
if (fNavigationBar) bHandled = hResult == S_OK;
{
CComPtr<IWinEventHandler> menuWinEventHandler;
hResult = fNavigationBar->QueryInterface(IID_PPV_ARG(IWinEventHandler, &menuWinEventHandler));
if (SUCCEEDED(hResult))
{
if (menuWinEventHandler->IsWindowOwner(notifyHeader->hwndFrom) == S_OK)
{
hResult = menuWinEventHandler->OnWinEvent(notifyHeader->hwndFrom, uMsg, wParam, lParam, &theResult);
return FAILED(hResult) ? 0 : theResult;
}
}
}
return 0; return FAILED_UNEXPECTEDLY(hResult) ? 0 : theResult;
} }
LRESULT CInternetToolbar::OnLDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) LRESULT CInternetToolbar::OnLDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
@ -1884,7 +1856,7 @@ LRESULT CInternetToolbar::OnLUp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &b
HRESULT CreateInternetToolbar(REFIID riid, void **ppv) HRESULT CreateInternetToolbar(REFIID riid, void **ppv)
{ {
CComObject<CInternetToolbar> *theToolbar; CInternetToolbar *theToolbar;
HRESULT hResult; HRESULT hResult;
if (ppv == NULL) if (ppv == NULL)

View file

@ -45,7 +45,7 @@ private:
CComPtr<IShellMenu> fFavoritesMenu; CComPtr<IShellMenu> fFavoritesMenu;
public: public:
CMenuCallback(); CMenuCallback();
~CMenuCallback(); virtual ~CMenuCallback();
HRESULT STDMETHODCALLTYPE GetObject(LPSMDATA psmd, REFIID riid, void **ppvObject); HRESULT STDMETHODCALLTYPE GetObject(LPSMDATA psmd, REFIID riid, void **ppvObject);
public: public:
@ -94,7 +94,7 @@ public:
LONG fStartHeight; LONG fStartHeight;
public: public:
CInternetToolbar(); CInternetToolbar();
~CInternetToolbar(); virtual ~CInternetToolbar();
void AddDockItem(IUnknown *newItem, int bandID, int flags); void AddDockItem(IUnknown *newItem, int bandID, int flags);
HRESULT ReserveBorderSpace(LONG maxHeight = -1); HRESULT ReserveBorderSpace(LONG maxHeight = -1);
HRESULT CreateMenuBar(IShellMenu **menuBar); HRESULT CreateMenuBar(IShellMenu **menuBar);

View file

@ -82,6 +82,78 @@ Win32DbgPrint(const char *filename, int line, const char *lpFormat, ...)
#define FAILED_UNEXPECTEDLY(hr) FAILED(hr) #define FAILED_UNEXPECTEDLY(hr) FAILED(hr)
#endif #endif
template <class Base>
class CComDebugObject : public Base
{
public:
CComDebugObject(void * = NULL)
{
_pAtlModule->Lock();
}
virtual ~CComDebugObject()
{
this->FinalRelease();
_pAtlModule->Unlock();
}
STDMETHOD_(ULONG, AddRef)()
{
int rc = this->InternalAddRef();
DbgPrint("RefCount is now %d(++)!\n", rc);
return rc;
}
STDMETHOD_(ULONG, Release)()
{
ULONG newRefCount;
newRefCount = this->InternalRelease();
DbgPrint("RefCount is now %d(--)!\n", newRefCount);
if (newRefCount == 0)
delete this;
return newRefCount;
}
STDMETHOD(QueryInterface)(REFIID iid, void **ppvObject)
{
return this->_InternalQueryInterface(iid, ppvObject);
}
static HRESULT WINAPI CreateInstance(CComDebugObject<Base> **pp)
{
CComDebugObject<Base> *newInstance;
HRESULT hResult;
ATLASSERT(pp != NULL);
if (pp == NULL)
return E_POINTER;
hResult = E_OUTOFMEMORY;
newInstance = NULL;
ATLTRY(newInstance = new CComDebugObject<Base>())
if (newInstance != NULL)
{
newInstance->SetVoid(NULL);
newInstance->InternalFinalConstructAddRef();
hResult = newInstance->_AtlInitialConstruct();
if (SUCCEEDED(hResult))
hResult = newInstance->FinalConstruct();
if (SUCCEEDED(hResult))
hResult = newInstance->_AtlFinalConstruct();
newInstance->InternalFinalConstructRelease();
if (hResult != S_OK)
{
delete newInstance;
newInstance = NULL;
}
}
*pp = newInstance;
return hResult;
}
};
WINE_DEFAULT_DEBUG_CHANNEL(browseui); WINE_DEFAULT_DEBUG_CHANNEL(browseui);
#endif /* _BROWSEUI_PCH_ */ #endif /* _BROWSEUI_PCH_ */

View file

@ -29,6 +29,8 @@ BOOL WINAPI Shell_GetImageLists(
_Out_ HIMAGELIST *phimlSmall _Out_ HIMAGELIST *phimlSmall
); );
extern HRESULT IUnknown_ShowDW(IUnknown * punk, BOOL fShow);
#include "newatlinterfaces.h" #include "newatlinterfaces.h"
/* /*
@ -732,12 +734,9 @@ CShellBrowser::~CShellBrowser()
HRESULT CShellBrowser::Initialize(LPITEMIDLIST pidl, long b, long c, long d) HRESULT CShellBrowser::Initialize(LPITEMIDLIST pidl, long b, long c, long d)
{ {
CComPtr<IDockingWindow> dockingWindow;
CComPtr<IStream> settingsStream;
CComPtr<IPersistStreamInit> persistStreamInit; CComPtr<IPersistStreamInit> persistStreamInit;
CComPtr<IOleCommandTarget> commandTarget;
CComPtr<IObjectWithSite> objectSite;
HRESULT hResult; HRESULT hResult;
CComPtr<IUnknown> clientBar;
_AtlInitialConstruct(); _AtlInitialConstruct();
@ -756,55 +755,46 @@ HRESULT CShellBrowser::Initialize(LPITEMIDLIST pidl, long b, long c, long d)
if (FAILED(hResult)) if (FAILED(hResult))
return hResult; return hResult;
#else #else
hResult = CreateInternetToolbar(IID_PPV_ARG(IUnknown, &fClientBars[BIInternetToolbar].clientBar)); hResult = CreateInternetToolbar(IID_PPV_ARG(IUnknown, &clientBar));
if (FAILED(hResult)) if (FAILED(hResult))
return hResult; return hResult;
#endif #endif
fClientBars[BIInternetToolbar].clientBar = clientBar;
// create interfaces // create interfaces
hResult = fClientBars[BIInternetToolbar].clientBar->QueryInterface( hResult = clientBar->QueryInterface(IID_PPV_ARG(IPersistStreamInit, &persistStreamInit));
IID_PPV_ARG(IDockingWindow, &dockingWindow)); if (FAILED_UNEXPECTEDLY(hResult))
if (FAILED(hResult))
return hResult; return hResult;
hResult = fClientBars[BIInternetToolbar].clientBar->QueryInterface(
IID_PPV_ARG(IPersistStreamInit, &persistStreamInit)); hResult = IUnknown_SetSite(clientBar, static_cast<IShellBrowser *>(this));
if (FAILED(hResult))
return hResult;
hResult = fClientBars[BIInternetToolbar].clientBar->QueryInterface(
IID_PPV_ARG(IOleCommandTarget, &commandTarget));
if (FAILED(hResult))
return hResult;
hResult = fClientBars[BIInternetToolbar].clientBar->QueryInterface(
IID_PPV_ARG(IObjectWithSite, &objectSite));
if (FAILED(hResult)) if (FAILED(hResult))
return hResult; return hResult;
hResult = objectSite->SetSite(static_cast<IShellBrowser *>(this)); hResult = IUnknown_Exec(clientBar, CGID_PrivCITCommands, 1, 1 /* or 0 */, NULL, NULL);
if (FAILED(hResult))
return hResult;
hResult = commandTarget->Exec(&CGID_PrivCITCommands, 1, 1 /* or 0 */, NULL, NULL);
if (FAILED(hResult)) if (FAILED(hResult))
return hResult; return hResult;
// TODO: create settingsStream from registry entry // TODO: create settingsStream from registry entry
if (settingsStream.p == NULL) //if (settingsStream.p)
//{
// hResult = persistStreamInit->Load(settingsStream);
// if (FAILED_UNEXPECTEDLY(hResult))
// return hResult;
//}
//else
{ {
hResult = persistStreamInit->InitNew(); hResult = persistStreamInit->InitNew();
if (FAILED(hResult)) if (FAILED(hResult))
return hResult; return hResult;
} }
else
{ hResult = IUnknown_ShowDW(clientBar, TRUE);
hResult = persistStreamInit->Load(settingsStream); if (FAILED_UNEXPECTEDLY(hResult))
if (FAILED(hResult))
return hResult;
}
hResult = dockingWindow->ShowDW(TRUE);
if (FAILED(hResult))
return hResult; return hResult;
fToolbarProxy.Initialize(m_hWnd, fClientBars[BIInternetToolbar].clientBar); fToolbarProxy.Initialize(m_hWnd, clientBar);
// create status bar // create status bar
fStatusBar = CreateWindow(STATUSCLASSNAMEW, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | fStatusBar = CreateWindow(STATUSCLASSNAMEW, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS |
@ -812,6 +802,7 @@ HRESULT CShellBrowser::Initialize(LPITEMIDLIST pidl, long b, long c, long d)
_AtlBaseModule.GetModuleInstance(), 0); _AtlBaseModule.GetModuleInstance(), 0);
fStatusBarVisible = true; fStatusBarVisible = true;
// browse // browse
hResult = BrowseToPIDL(pidl, BTP_UPDATE_NEXT_HISTORY); hResult = BrowseToPIDL(pidl, BTP_UPDATE_NEXT_HISTORY);
if (FAILED(hResult)) if (FAILED(hResult))
@ -1091,14 +1082,8 @@ HRESULT CShellBrowser::GetMenuBand(REFIID riid, void **shellMenu)
CComPtr<IDeskBand> deskBand; CComPtr<IDeskBand> deskBand;
HRESULT hResult; HRESULT hResult;
if (fClientBars[BIInternetToolbar].clientBar.p == NULL) hResult = IUnknown_QueryService(fClientBars[BIInternetToolbar].clientBar, SID_IBandSite, IID_PPV_ARG(IBandSite, &bandSite));
return E_FAIL; if (FAILED_UNEXPECTEDLY(hResult))
hResult = fClientBars[BIInternetToolbar].clientBar->QueryInterface(
IID_PPV_ARG(IServiceProvider, &serviceProvider));
if (FAILED(hResult))
return hResult;
hResult = serviceProvider->QueryService(SID_IBandSite, IID_PPV_ARG(IBandSite, &bandSite));
if (FAILED(hResult))
return hResult; return hResult;
hResult = bandSite->QueryBand(1, &deskBand, NULL, NULL, 0); hResult = bandSite->QueryBand(1, &deskBand, NULL, NULL, 0);
if (FAILED(hResult)) if (FAILED(hResult))
@ -1291,7 +1276,6 @@ LRESULT CALLBACK CShellBrowser::WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam,
CShellBrowser *pThis = reinterpret_cast<CShellBrowser *>(hWnd); CShellBrowser *pThis = reinterpret_cast<CShellBrowser *>(hWnd);
_ATL_MSG msg(pThis->m_hWnd, uMsg, wParam, lParam); _ATL_MSG msg(pThis->m_hWnd, uMsg, wParam, lParam);
LRESULT lResult; LRESULT lResult;
CComPtr<IMenuBand> menuBand;
const _ATL_MSG *previousMessage; const _ATL_MSG *previousMessage;
BOOL handled; BOOL handled;
WNDPROC saveWindowProc; WNDPROC saveWindowProc;
@ -1301,6 +1285,7 @@ LRESULT CALLBACK CShellBrowser::WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam,
previousMessage = pThis->m_pCurrentMsg; previousMessage = pThis->m_pCurrentMsg;
pThis->m_pCurrentMsg = &msg; pThis->m_pCurrentMsg = &msg;
CComPtr<IMenuBand> menuBand;
hResult = pThis->GetMenuBand(IID_PPV_ARG(IMenuBand, &menuBand)); hResult = pThis->GetMenuBand(IID_PPV_ARG(IMenuBand, &menuBand));
if (SUCCEEDED(hResult) && menuBand.p != NULL) if (SUCCEEDED(hResult) && menuBand.p != NULL)
{ {
@ -1311,6 +1296,7 @@ LRESULT CALLBACK CShellBrowser::WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam,
wParam = msg.wParam; wParam = msg.wParam;
lParam = msg.lParam; lParam = msg.lParam;
} }
menuBand.Release();
handled = pThis->ProcessWindowMessage(hWnd, uMsg, wParam, lParam, lResult, 0); handled = pThis->ProcessWindowMessage(hWnd, uMsg, wParam, lParam, lResult, 0);
ATLASSERT(pThis->m_pCurrentMsg == &msg); ATLASSERT(pThis->m_pCurrentMsg == &msg);
@ -1867,7 +1853,7 @@ HRESULT STDMETHODCALLTYPE CShellBrowser::SetMenuSB(HMENU hmenuShared, HOLEMENU h
CComPtr<IShellMenu> shellMenu; CComPtr<IShellMenu> shellMenu;
HRESULT hResult; HRESULT hResult;
if (IsMenu(hmenuShared) == FALSE) if (hmenuShared && IsMenu(hmenuShared) == FALSE)
return E_FAIL; return E_FAIL;
hResult = GetMenuBand(IID_PPV_ARG(IShellMenu, &shellMenu)); hResult = GetMenuBand(IID_PPV_ARG(IShellMenu, &shellMenu));
if (FAILED(hResult)) if (FAILED(hResult))
@ -1882,7 +1868,10 @@ HRESULT STDMETHODCALLTYPE CShellBrowser::SetMenuSB(HMENU hmenuShared, HOLEMENU h
HRESULT STDMETHODCALLTYPE CShellBrowser::RemoveMenusSB(HMENU hmenuShared) HRESULT STDMETHODCALLTYPE CShellBrowser::RemoveMenusSB(HMENU hmenuShared)
{ {
if (hmenuShared == fCurrentMenuBar) if (hmenuShared == fCurrentMenuBar)
fCurrentMenuBar = NULL; {
//DestroyMenu(fCurrentMenuBar);
SetMenuSB(NULL, NULL, NULL);
}
return S_OK; return S_OK;
} }
@ -3072,7 +3061,7 @@ LRESULT CShellBrowser::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &b
} }
template<class T> template<class T>
void ReleaseCComPtrExpectZero(CComPtr<T>& cptr) void ReleaseCComPtrExpectZero(CComPtr<T>& cptr, BOOL forceRelease = FALSE)
{ {
if (cptr.p != NULL) if (cptr.p != NULL)
{ {
@ -3080,6 +3069,13 @@ void ReleaseCComPtrExpectZero(CComPtr<T>& cptr)
if (nrc > 0) if (nrc > 0)
{ {
DbgPrint("WARNING: Unexpected RefCount > 0!\n"); DbgPrint("WARNING: Unexpected RefCount > 0!\n");
if (forceRelease)
{
while (nrc > 0)
{
nrc = cptr->Release();
}
}
} }
cptr.Detach(); cptr.Detach();
} }
@ -3361,7 +3357,7 @@ LRESULT CShellBrowser::RelayCommands(UINT uMsg, WPARAM wParam, LPARAM lParam, BO
static HRESULT ExplorerMessageLoop(IEThreadParamBlock * parameters) static HRESULT ExplorerMessageLoop(IEThreadParamBlock * parameters)
{ {
CComPtr< CComObject<CShellBrowser> > theCabinet; CComPtr<CShellBrowser> theCabinet;
HRESULT hResult; HRESULT hResult;
MSG Msg; MSG Msg;
BOOL Ret; BOOL Ret;
@ -3384,14 +3380,14 @@ static HRESULT ExplorerMessageLoop(IEThreadParamBlock * parameters)
break; break;
} }
if (Msg.message == WM_QUIT)
break;
if (theCabinet->v_MayTranslateAccelerator(&Msg) != S_OK) if (theCabinet->v_MayTranslateAccelerator(&Msg) != S_OK)
{ {
TranslateMessage(&Msg); TranslateMessage(&Msg);
DispatchMessage(&Msg); DispatchMessage(&Msg);
} }
if (Msg.message == WM_QUIT)
break;
} }
//TerminateProcess(GetCurrentProcess(), hResult); //TerminateProcess(GetCurrentProcess(), hResult);
@ -3399,7 +3395,9 @@ static HRESULT ExplorerMessageLoop(IEThreadParamBlock * parameters)
int nrc = theCabinet->Release(); int nrc = theCabinet->Release();
if (nrc > 0) if (nrc > 0)
{ {
DbgPrint("WARNING: There are %d references to the CShellBrowser active or leaked, process will never terminate.\n"); DbgPrint("WARNING: There are %d references to the CShellBrowser active or leaked, process will never terminate. Terminating forcefully.\n", nrc);
//TerminateProcess(GetCurrentProcess(), 1);
} }
theCabinet.Detach(); theCabinet.Detach();

View file

@ -37,12 +37,12 @@ class CToolsBand :
public IPersistStream public IPersistStream
{ {
private: private:
IDockingWindowSite *fDockSite; CComPtr<IDockingWindowSite> fDockSite;
GUID fExecCommandCategory; GUID fExecCommandCategory;
CComPtr<IOleCommandTarget> fExecCommandTarget; CComPtr<IOleCommandTarget> fExecCommandTarget;
public: public:
CToolsBand(); CToolsBand();
~CToolsBand(); virtual ~CToolsBand();
public: public:
// *** IDeskBand methods *** // *** IDeskBand methods ***
virtual HRESULT STDMETHODCALLTYPE GetBandInfo(DWORD dwBandID, DWORD dwViewMode, DESKBANDINFO* pdbi); virtual HRESULT STDMETHODCALLTYPE GetBandInfo(DWORD dwBandID, DWORD dwViewMode, DESKBANDINFO* pdbi);
@ -95,14 +95,12 @@ END_COM_MAP()
}; };
CToolsBand::CToolsBand() CToolsBand::CToolsBand()
: fDockSite(NULL)
{ {
fDockSite = NULL;
} }
CToolsBand::~CToolsBand() CToolsBand::~CToolsBand()
{ {
if (fDockSite)
fDockSite->Release();
} }
HRESULT STDMETHODCALLTYPE CToolsBand::GetBandInfo(DWORD dwBandID, DWORD dwViewMode, DESKBANDINFO* pdbi) HRESULT STDMETHODCALLTYPE CToolsBand::GetBandInfo(DWORD dwBandID, DWORD dwViewMode, DESKBANDINFO* pdbi)
@ -267,8 +265,8 @@ HRESULT STDMETHODCALLTYPE CToolsBand::SetSite(IUnknown* pUnkSite){
HWND toolbar; HWND toolbar;
HRESULT hResult; HRESULT hResult;
if (fDockSite != NULL) if(fDockSite) fDockSite.Release();
fDockSite->Release();
if (pUnkSite == NULL) if (pUnkSite == NULL)
return S_OK; return S_OK;
hResult = pUnkSite->QueryInterface(IID_PPV_ARG(IDockingWindowSite, &fDockSite)); hResult = pUnkSite->QueryInterface(IID_PPV_ARG(IDockingWindowSite, &fDockSite));
@ -364,6 +362,8 @@ HRESULT STDMETHODCALLTYPE CToolsBand::CloseDW(DWORD dwReserved)
m_hWnd = NULL; m_hWnd = NULL;
if (fDockSite) fDockSite.Release();
return S_OK; return S_OK;
} }
@ -440,19 +440,19 @@ LRESULT CToolsBand::OnGetButtonInfo(UINT idControl, NMHDR *pNMHDR, BOOL &bHandle
HRESULT CreateToolsBar(REFIID riid, void **ppv) HRESULT CreateToolsBar(REFIID riid, void **ppv)
{ {
CComObject<CToolsBand> *theMenuBar; CToolsBand *theToolbar;
HRESULT hResult; HRESULT hResult;
if (ppv == NULL) if (ppv == NULL)
return E_POINTER; return E_POINTER;
*ppv = NULL; *ppv = NULL;
ATLTRY (theMenuBar = new CComObject<CToolsBand>); ATLTRY(theToolbar = new CComObject<CToolsBand>);
if (theMenuBar == NULL) if (theToolbar == NULL)
return E_OUTOFMEMORY; return E_OUTOFMEMORY;
hResult = theMenuBar->QueryInterface(riid, reinterpret_cast<void **>(ppv)); hResult = theToolbar->QueryInterface(riid, reinterpret_cast<void **>(ppv));
if (FAILED(hResult)) if (FAILED(hResult))
{ {
delete theMenuBar; delete theToolbar;
return hResult; return hResult;
} }
return S_OK; return S_OK;

View file

@ -1382,7 +1382,6 @@ void CDefView::DoActivate(UINT uState)
INT mic = GetMenuItemCount(m_hMenu); INT mic = GetMenuItemCount(m_hMenu);
for (int i = 0; i < mic; i++) for (int i = 0; i < mic; i++)
{ {
HMENU submenu = GetSubMenu(m_hMenu, 0);
DeleteMenu(m_hMenu, 0, MF_BYPOSITION); DeleteMenu(m_hMenu, 0, MF_BYPOSITION);
} }