From fd029c97799752f796198747290e12c71a536e7f Mon Sep 17 00:00:00 2001 From: David Quintana Date: Mon, 20 Oct 2014 21:09:55 +0000 Subject: [PATCH] [RSHELL] [SHELL32] [BROWSEUI] * Move undocshell.h to a shared location, and move some shared utility functions into it. * Replace all the COM object constructor functions with generic equivalents. * Fixes a big bunch of "problems" found by Coverity Scan, but I don't have the list of CID at the moment. svn path=/branches/shell-experiments/; revision=64854 --- base/shell/rshell/CMenuBand.cpp | 22 +- base/shell/rshell/CMenuDeskBar.cpp | 22 +- base/shell/rshell/CMenuSite.cpp | 22 +- base/shell/rshell/CMergedFolder.cpp | 15 +- base/shell/rshell/precomp.h | 114 +------ dll/win32/browseui/addressband.cpp | 17 +- dll/win32/browseui/addresseditbox.cpp | 17 +- dll/win32/browseui/bandproxy.cpp | 17 +- dll/win32/browseui/basebar.cpp | 17 +- dll/win32/browseui/basebarsite.cpp | 17 +- dll/win32/browseui/brandband.cpp | 17 +- dll/win32/browseui/internettoolbar.cpp | 28 +- dll/win32/browseui/precomp.h | 156 +-------- dll/win32/browseui/shellbrowser.cpp | 6 +- dll/win32/browseui/toolsband.cpp | 26 +- dll/win32/browseui/travellog.cpp | 20 +- dll/win32/shell32/dataobject.cpp | 48 +-- dll/win32/shell32/enumidlist.cpp | 19 +- dll/win32/shell32/extracticon.cpp | 19 +- dll/win32/shell32/folders/admintools.cpp | 27 +- dll/win32/shell32/folders/cpanel.cpp | 32 +- dll/win32/shell32/folders/desktop.cpp | 36 +- dll/win32/shell32/folders/fonts.cpp | 27 +- dll/win32/shell32/folders/fs.cpp | 27 +- dll/win32/shell32/folders/mycomp.cpp | 31 +- dll/win32/shell32/folders/mydocuments.cpp | 27 +- dll/win32/shell32/folders/printers.cpp | 49 +-- dll/win32/shell32/folders/recyclebin.cpp | 59 +--- dll/win32/shell32/openwithmenu.cpp | 9 +- dll/win32/shell32/precomp.h | 1 + dll/win32/shell32/shellole.cpp | 22 +- dll/win32/shell32/shlview.cpp | 27 +- .../shell32 => include/reactos}/undocshell.h | 307 ++++++++++++++++++ 33 files changed, 362 insertions(+), 938 deletions(-) rename {dll/win32/shell32 => include/reactos}/undocshell.h (62%) diff --git a/base/shell/rshell/CMenuBand.cpp b/base/shell/rshell/CMenuBand.cpp index 932f161a4b7..4ea59fdb36a 100644 --- a/base/shell/rshell/CMenuBand.cpp +++ b/base/shell/rshell/CMenuBand.cpp @@ -35,27 +35,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(CMenuBand); extern "C" HRESULT WINAPI CMenuBand_Constructor(REFIID riid, LPVOID *ppv) { - HRESULT hr; -#if USE_SYSTEM_MENUBAND - hr = CoCreateInstance(CLSID_MenuBand, - NULL, - CLSCTX_INPROC_SERVER, - riid, ppv); -#else - *ppv = NULL; - - CMenuBand * site = new CComObject(); - - if (!site) - return E_OUTOFMEMORY; - - hr = site->QueryInterface(riid, ppv); - - if (FAILED_UNEXPECTEDLY(hr)) - delete site; -#endif - - return hr; + return ShellObjectCreator(riid, ppv); } CMenuBand::CMenuBand() : diff --git a/base/shell/rshell/CMenuDeskBar.cpp b/base/shell/rshell/CMenuDeskBar.cpp index 91088f5b5e8..cef88c532ac 100644 --- a/base/shell/rshell/CMenuDeskBar.cpp +++ b/base/shell/rshell/CMenuDeskBar.cpp @@ -30,27 +30,7 @@ const static GUID CGID_MenuDeskBar = { 0x5C9F0A12, 0x959E, 0x11D0, { 0xA3, 0xA4, extern "C" HRESULT WINAPI CMenuDeskBar_Constructor(REFIID riid, LPVOID *ppv) { - HRESULT hr; -#if USE_SYSTEM_MENUDESKBAR - hr = CoCreateInstance(CLSID_MenuDeskBar, - NULL, - CLSCTX_INPROC_SERVER, - riid, ppv); -#else - *ppv = NULL; - - CMenuDeskBar * deskbar = new CComObject(); - - if (!deskbar) - return E_OUTOFMEMORY; - - hr = deskbar->QueryInterface(riid, ppv); - - if (FAILED_UNEXPECTEDLY(hr)) - delete deskbar; - -#endif - return hr; + return ShellObjectCreator(riid, ppv); } CMenuDeskBar::CMenuDeskBar() : diff --git a/base/shell/rshell/CMenuSite.cpp b/base/shell/rshell/CMenuSite.cpp index 384b37aa49c..fe0a52ddee4 100644 --- a/base/shell/rshell/CMenuSite.cpp +++ b/base/shell/rshell/CMenuSite.cpp @@ -28,27 +28,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(menusite); extern "C" HRESULT WINAPI CMenuSite_Constructor(REFIID riid, LPVOID *ppv) { - HRESULT hr; -#if USE_SYSTEM_MENUSITE - hr = CoCreateInstance(CLSID_MenuBandSite, - NULL, - CLSCTX_INPROC_SERVER, - riid, ppv); -#else - *ppv = NULL; - - CMenuSite * site = new CComObject(); - - if (!site) - return E_OUTOFMEMORY; - - hr = site->QueryInterface(riid, ppv); - - if (FAILED_UNEXPECTEDLY(hr)) - delete site; -#endif - - return hr; + return ShellObjectCreator(riid, ppv); } CMenuSite::CMenuSite() : diff --git a/base/shell/rshell/CMergedFolder.cpp b/base/shell/rshell/CMergedFolder.cpp index 32ca1ccee05..f39bac28528 100644 --- a/base/shell/rshell/CMergedFolder.cpp +++ b/base/shell/rshell/CMergedFolder.cpp @@ -356,20 +356,7 @@ HRESULT STDMETHODCALLTYPE CEnumMergedFolder::Clone( extern "C" HRESULT WINAPI CMergedFolder_Constructor(REFIID riid, LPVOID *ppv) { - *ppv = NULL; - - CMergedFolder * fld = new CComObject(); - - if (!fld) - return E_OUTOFMEMORY; - - HRESULT hr; - - hr = fld->QueryInterface(riid, ppv); - if (FAILED_UNEXPECTEDLY(hr)) - delete fld; - - return hr; + return ShellObjectCreator(riid, ppv); } CMergedFolder::CMergedFolder() : diff --git a/base/shell/rshell/precomp.h b/base/shell/rshell/precomp.h index ce2f0a41f34..d5fb9d675a4 100644 --- a/base/shell/rshell/precomp.h +++ b/base/shell/rshell/precomp.h @@ -53,6 +53,8 @@ #include #include +#include + #include #if _MSC_VER @@ -73,115 +75,3 @@ extern "C" HRESULT WINAPI CMenuSite_Wrapper(IBandSite * bs, REFIID riid, LPVOID extern "C" HRESULT WINAPI CMenuBand_Wrapper(IShellMenu * sm, REFIID riid, LPVOID *ppv); extern "C" HRESULT WINAPI CMergedFolder_Constructor(REFIID riid, LPVOID *ppv); extern "C" HRESULT WINAPI CStartMenuSite_Wrapper(ITrayPriv * trayPriv, REFIID riid, LPVOID *ppv); - -static __inline ULONG -Win32DbgPrint(const char *filename, int line, const char *lpFormat, ...) -{ - char szMsg[512]; - char *szMsgStart; - const char *fname; - va_list vl; - ULONG uRet; - - fname = strrchr(filename, '\\'); - if (fname == NULL) - { - fname = strrchr(filename, '/'); - } - - if (fname == NULL) - fname = filename; - else - fname++; - - szMsgStart = szMsg + sprintf(szMsg, "[%10lu] %s:%d: ", GetTickCount(), fname, line); - - va_start(vl, lpFormat); - uRet = (ULONG) vsprintf(szMsgStart, lpFormat, vl); - va_end(vl); - - OutputDebugStringA(szMsg); - - return uRet; -} - -#define DbgPrint(fmt, ...) \ - Win32DbgPrint(__FILE__, __LINE__, fmt, ##__VA_ARGS__) - -#if 1 -#define FAILED_UNEXPECTEDLY(hr) (FAILED(hr) && (DbgPrint("Unexpected failure %08x.\n", hr), TRUE)) -#else -#define FAILED_UNEXPECTEDLY(hr) FAILED(hr) -#endif - - -template -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 **pp) - { - CComDebugObject *newInstance; - HRESULT hResult; - - ATLASSERT(pp != NULL); - if (pp == NULL) - return E_POINTER; - - hResult = E_OUTOFMEMORY; - newInstance = NULL; - ATLTRY(newInstance = new CComDebugObject()) - 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; - } -}; diff --git a/dll/win32/browseui/addressband.cpp b/dll/win32/browseui/addressband.cpp index 8e1f92e3811..2db3f4aef26 100644 --- a/dll/win32/browseui/addressband.cpp +++ b/dll/win32/browseui/addressband.cpp @@ -668,20 +668,5 @@ LRESULT CAddressBand::OnWindowPosChanging(UINT uMsg, WPARAM wParam, LPARAM lPara HRESULT CreateAddressBand(REFIID riid, void **ppv) { - CAddressBand *theMenuBar; - HRESULT hResult; - - if (ppv == NULL) - return E_POINTER; - *ppv = NULL; - ATLTRY (theMenuBar = new CComObject); - if (theMenuBar == NULL) - return E_OUTOFMEMORY; - hResult = theMenuBar->QueryInterface(riid, reinterpret_cast(ppv)); - if (FAILED_UNEXPECTEDLY(hResult)) - { - delete theMenuBar; - return hResult; - } - return S_OK; + return ShellObjectCreator(riid, ppv); } diff --git a/dll/win32/browseui/addresseditbox.cpp b/dll/win32/browseui/addresseditbox.cpp index 78ff858f23e..12b9d520b89 100644 --- a/dll/win32/browseui/addresseditbox.cpp +++ b/dll/win32/browseui/addresseditbox.cpp @@ -283,20 +283,5 @@ HRESULT STDMETHODCALLTYPE CAddressEditBox::GetSizeMax(ULARGE_INTEGER *pcbSize) HRESULT CreateAddressEditBox(REFIID riid, void **ppv) { - CComObject *theMenuBar; - HRESULT hResult; - - if (ppv == NULL) - return E_POINTER; - *ppv = NULL; - ATLTRY (theMenuBar = new CComObject); - if (theMenuBar == NULL) - return E_OUTOFMEMORY; - hResult = theMenuBar->QueryInterface(riid, reinterpret_cast(ppv)); - if (FAILED_UNEXPECTEDLY(hResult)) - { - delete theMenuBar; - return hResult; - } - return S_OK; + return ShellObjectCreator(riid, ppv); } diff --git a/dll/win32/browseui/bandproxy.cpp b/dll/win32/browseui/bandproxy.cpp index 060add9f1df..4da31b25e08 100644 --- a/dll/win32/browseui/bandproxy.cpp +++ b/dll/win32/browseui/bandproxy.cpp @@ -133,20 +133,5 @@ HRESULT STDMETHODCALLTYPE CBandProxy::NavigateToURL(long paramC, long param10) HRESULT CreateBandProxy(REFIID riid, void **ppv) { - CComObject *theBandProxy; - HRESULT hResult; - - if (ppv == NULL) - return E_POINTER; - *ppv = NULL; - ATLTRY (theBandProxy = new CComObject); - if (theBandProxy == NULL) - return E_OUTOFMEMORY; - hResult = theBandProxy->QueryInterface(riid, reinterpret_cast(ppv)); - if (FAILED_UNEXPECTEDLY(hResult)) - { - delete theBandProxy; - return hResult; - } - return S_OK; + return ShellObjectCreator(riid, ppv); } diff --git a/dll/win32/browseui/basebar.cpp b/dll/win32/browseui/basebar.cpp index e745f059b55..a178c4b77ff 100644 --- a/dll/win32/browseui/basebar.cpp +++ b/dll/win32/browseui/basebar.cpp @@ -514,20 +514,5 @@ LRESULT CBaseBar::OnCaptureChanged(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL HRESULT CreateBaseBar(REFIID riid, void **ppv) { - CComObject *theBaseBar; - HRESULT hResult; - - if (ppv == NULL) - return E_POINTER; - *ppv = NULL; - ATLTRY (theBaseBar = new CComObject); - if (theBaseBar == NULL) - return E_OUTOFMEMORY; - hResult = theBaseBar->QueryInterface (riid, reinterpret_cast(ppv)); - if (FAILED_UNEXPECTEDLY(hResult)) - { - delete theBaseBar; - return hResult; - } - return S_OK; + return ShellObjectCreator(riid, ppv); } diff --git a/dll/win32/browseui/basebarsite.cpp b/dll/win32/browseui/basebarsite.cpp index 60fc47f26ab..2912ca16221 100644 --- a/dll/win32/browseui/basebarsite.cpp +++ b/dll/win32/browseui/basebarsite.cpp @@ -477,20 +477,5 @@ LRESULT CBaseBarSite::OnNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bH HRESULT CreateBaseBarSite(REFIID riid, void **ppv) { - CComObject *theBaseBarSite; - HRESULT hResult; - - if (ppv == NULL) - return E_POINTER; - *ppv = NULL; - ATLTRY (theBaseBarSite = new CComObject); - if (theBaseBarSite == NULL) - return E_OUTOFMEMORY; - hResult = theBaseBarSite->QueryInterface(riid, reinterpret_cast(ppv)); - if (FAILED_UNEXPECTEDLY(hResult)) - { - delete theBaseBarSite; - return hResult; - } - return S_OK; + return ShellObjectCreator(riid, ppv); } diff --git a/dll/win32/browseui/brandband.cpp b/dll/win32/browseui/brandband.cpp index 40084936c0e..223d55891d3 100644 --- a/dll/win32/browseui/brandband.cpp +++ b/dll/win32/browseui/brandband.cpp @@ -470,20 +470,5 @@ LRESULT CBrandBand::OnTimer(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHand HRESULT CreateBrandBand(REFIID riid, void **ppv) { - CComObject *theMenuBar; - HRESULT hResult; - - if (ppv == NULL) - return E_POINTER; - *ppv = NULL; - ATLTRY (theMenuBar = new CComObject); - if (theMenuBar == NULL) - return E_OUTOFMEMORY; - hResult = theMenuBar->QueryInterface(riid, reinterpret_cast(ppv)); - if (FAILED_UNEXPECTEDLY(hResult)) - { - delete theMenuBar; - return hResult; - } - return S_OK; + return ShellObjectCreator(riid, ppv); } diff --git a/dll/win32/browseui/internettoolbar.cpp b/dll/win32/browseui/internettoolbar.cpp index 053690e2d91..bcfcb060381 100644 --- a/dll/win32/browseui/internettoolbar.cpp +++ b/dll/win32/browseui/internettoolbar.cpp @@ -437,7 +437,11 @@ static HRESULT GetFavoritesFolder(IShellFolder ** ppsfFavorites, LPITEMIDLIST * CComPtr psfCommonFavorites; CComPtr pasf; - *ppsfFavorites = NULL; + if (ppsfFavorites) + *ppsfFavorites = NULL; + + if (ppidl) + *ppidl = NULL; hr = SHGetSpecialFolderLocation(NULL, CSIDL_FAVORITES, &pidlUserFavorites); if (FAILED(hr)) @@ -499,6 +503,8 @@ static HRESULT GetFavoritesFolder(IShellFolder ** ppsfFavorites, LPITEMIDLIST * hr = pasf->QueryInterface(IID_PPV_ARG(IShellFolder, ppsfFavorites)); pasf.Release(); + // TODO: obtain the folder's PIDL + ILFree(pidlCommonFavorites); ILFree(pidlUserFavorites); @@ -578,7 +584,8 @@ HRESULT STDMETHODCALLTYPE CMenuCallback::GetObject(LPSMDATA psmd, REFIID riid, v return hResult; hResult = newMenu->SetShellFolder(favoritesFolder, favoritesPIDL, orderRegKey, SMSET_BOTTOM | SMINIT_CACHED | SMINV_ID); - ILFree(favoritesPIDL); + if (favoritesPIDL) + ILFree(favoritesPIDL); if (SUCCEEDED(hResult)) fFavoritesMenu.Attach(newMenu.Detach()); } @@ -1989,20 +1996,5 @@ LRESULT CInternetToolbar::OnLUp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &b HRESULT CreateInternetToolbar(REFIID riid, void **ppv) { - CInternetToolbar *theToolbar; - HRESULT hResult; - - if (ppv == NULL) - return E_POINTER; - *ppv = NULL; - ATLTRY (theToolbar = new CComObject); - if (theToolbar == NULL) - return E_OUTOFMEMORY; - hResult = theToolbar->QueryInterface (riid, reinterpret_cast(ppv)); - if (FAILED_UNEXPECTEDLY(hResult)) - { - delete theToolbar; - return hResult; - } - return S_OK; + return ShellObjectCreator(riid, ppv); } diff --git a/dll/win32/browseui/precomp.h b/dll/win32/browseui/precomp.h index 21ce5e310f8..49ce44c6192 100644 --- a/dll/win32/browseui/precomp.h +++ b/dll/win32/browseui/precomp.h @@ -23,6 +23,7 @@ #include #include #include +#include #include #include "resource.h" @@ -40,161 +41,6 @@ #include "regtreeoptions.h" #include -static __inline ULONG -Win32DbgPrint(const char *filename, int line, const char *lpFormat, ...) -{ - char szMsg[512]; - char *szMsgStart; - const char *fname; - va_list vl; - ULONG uRet; - - fname = strrchr(filename, '\\'); - if (fname == NULL) - { - fname = strrchr(filename, '/'); - if (fname != NULL) - fname++; - } - else - fname++; - - if (fname == NULL) - fname = filename; - - szMsgStart = szMsg + sprintf(szMsg, "%s:%d: ", fname, line); - - va_start(vl, lpFormat); - uRet = (ULONG) vsprintf(szMsgStart, lpFormat, vl); - va_end(vl); - - OutputDebugStringA(szMsg); - - return uRet; -} - -#define DbgPrint(fmt, ...) \ - Win32DbgPrint(__FILE__, __LINE__, fmt, ##__VA_ARGS__) - -static void DbgDumpMenuInternal(HMENU hmenu, char* padding, int padlevel) -{ - WCHAR label[128]; - - padding[padlevel] = '.'; - padding[padlevel + 1] = '.'; - padding[padlevel + 2] = 0; - - int count = GetMenuItemCount(hmenu); - for (int i = 0; i < count; i++) - { - MENUITEMINFOW mii = { 0 }; - - mii.cbSize = sizeof(mii); - mii.fMask = MIIM_STRING | MIIM_FTYPE | MIIM_SUBMENU | MIIM_STATE | MIIM_ID; - mii.dwTypeData = label; - mii.cch = _countof(label); - - GetMenuItemInfo(hmenu, i, TRUE, &mii); - - if (mii.fType & MFT_BITMAP) - DbgPrint("%s%2d - %08x: BITMAP %08p (state=%d, has submenu=%s)\n", padding, i, mii.wID, mii.hbmpItem, mii.fState, mii.hSubMenu ? "TRUE" : "FALSE"); - else if (mii.fType & MFT_SEPARATOR) - DbgPrint("%s%2d - %08x ---SEPARATOR---\n", padding, i, mii.wID); - else - DbgPrint("%s%2d - %08x: %S (state=%d, has submenu=%s)\n", padding, i, mii.wID, mii.dwTypeData, mii.fState, mii.hSubMenu ? "TRUE" : "FALSE"); - - if (mii.hSubMenu) - DbgDumpMenuInternal(mii.hSubMenu, padding, padlevel + 2); - - } - - padding[padlevel] = 0; -} - -static __inline void DbgDumpMenu(HMENU hmenu) -{ - char padding[128]; - DbgDumpMenuInternal(hmenu, padding, 0); -} - -#if 1 -#define FAILED_UNEXPECTEDLY(hr) (FAILED(hr) && (DbgPrint("Unexpected failure %08x.\n", hr), TRUE)) -#else -#define FAILED_UNEXPECTEDLY(hr) FAILED(hr) -#endif - - -template -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 **pp) - { - CComDebugObject *newInstance; - HRESULT hResult; - - ATLASSERT(pp != NULL); - if (pp == NULL) - return E_POINTER; - - hResult = E_OUTOFMEMORY; - newInstance = NULL; - ATLTRY(newInstance = new CComDebugObject()) - 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); #endif /* _BROWSEUI_PCH_ */ diff --git a/dll/win32/browseui/shellbrowser.cpp b/dll/win32/browseui/shellbrowser.cpp index c738f2440cb..ea02d0c9ac6 100644 --- a/dll/win32/browseui/shellbrowser.cpp +++ b/dll/win32/browseui/shellbrowser.cpp @@ -3431,15 +3431,11 @@ static HRESULT ExplorerMessageLoop(IEThreadParamBlock * parameters) DispatchMessage(&Msg); } } - - //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. Terminating forcefully.\n", nrc); - - //TerminateProcess(GetCurrentProcess(), 1); + DbgPrint("WARNING: There are %d references to the CShellBrowser active or leaked.\n", nrc); } theCabinet.Detach(); diff --git a/dll/win32/browseui/toolsband.cpp b/dll/win32/browseui/toolsband.cpp index abad2d6236d..0410109db8d 100644 --- a/dll/win32/browseui/toolsband.cpp +++ b/dll/win32/browseui/toolsband.cpp @@ -313,15 +313,11 @@ HRESULT STDMETHODCALLTYPE CToolsBand::SetSite(IUnknown* pUnkSite){ BITMAP bitmapInfo; GetObjectW(imgNormal, sizeof(bitmapInfo), &bitmapInfo); HIMAGELIST himlNormal = ImageList_Create(bitmapInfo.bmHeight, bitmapInfo.bmHeight, ILC_COLOR32, 4, 4); - ImageList_Add(himlNormal, imgNormal, NULL); - DeleteObject(imgNormal); GetObjectW(imgHot, sizeof(bitmapInfo), &bitmapInfo); HIMAGELIST himlHot = ImageList_Create(bitmapInfo.bmHeight, bitmapInfo.bmHeight, ILC_COLOR32, 4, 4); - ImageList_Add(himlHot, imgHot, NULL); - DeleteObject(imgHot); SendMessage(TB_SETIMAGELIST, 0, (LPARAM) himlNormal); SendMessage(TB_SETHOTIMAGELIST, 0, (LPARAM) himlHot); @@ -329,6 +325,11 @@ HRESULT STDMETHODCALLTYPE CToolsBand::SetSite(IUnknown* pUnkSite){ SendMessage(TB_ADDBUTTONSW, numShownButtons, (LPARAM)&tbButtonsAdd); + if (imgNormal) + DeleteObject(imgNormal); + if (imgHot) + DeleteObject(imgHot); + return hResult; } @@ -440,21 +441,6 @@ LRESULT CToolsBand::OnGetButtonInfo(UINT idControl, NMHDR *pNMHDR, BOOL &bHandle HRESULT CreateToolsBar(REFIID riid, void **ppv) { - CToolsBand *theToolbar; - HRESULT hResult; - - if (ppv == NULL) - return E_POINTER; - *ppv = NULL; - ATLTRY(theToolbar = new CComObject); - if (theToolbar == NULL) - return E_OUTOFMEMORY; - hResult = theToolbar->QueryInterface(riid, reinterpret_cast(ppv)); - if (FAILED_UNEXPECTEDLY(hResult)) - { - delete theToolbar; - return hResult; - } - return S_OK; + return ShellObjectCreator(riid, ppv); } diff --git a/dll/win32/browseui/travellog.cpp b/dll/win32/browseui/travellog.cpp index 9fc62760c5e..45bbaf235c1 100644 --- a/dll/win32/browseui/travellog.cpp +++ b/dll/win32/browseui/travellog.cpp @@ -621,23 +621,5 @@ HRESULT STDMETHODCALLTYPE CTravelLog::Revert() HRESULT CreateTravelLog(REFIID riid, void **ppv) { - CComObject *theTravelLog; - HRESULT hResult; - - if (ppv == NULL) - return E_POINTER; - *ppv = NULL; - ATLTRY (theTravelLog = new CComObject); - if (theTravelLog == NULL) - return E_OUTOFMEMORY; - hResult = theTravelLog->QueryInterface(riid, reinterpret_cast(ppv)); - if (FAILED_UNEXPECTEDLY(hResult)) - { - delete theTravelLog; - return hResult; - } - hResult = theTravelLog->Initialize(); - if (FAILED_UNEXPECTEDLY(hResult)) - return hResult; - return S_OK; + return ShellObjectCreatorInit(riid, ppv); } diff --git a/dll/win32/shell32/dataobject.cpp b/dll/win32/shell32/dataobject.cpp index 88f10fb6cee..f0bab7f2455 100644 --- a/dll/win32/shell32/dataobject.cpp +++ b/dll/win32/shell32/dataobject.cpp @@ -127,30 +127,9 @@ HRESULT WINAPI IEnumFORMATETCImpl::Clone(LPENUMFORMATETC* ppenum) return (*ppenum)->Skip(posFmt); } -HRESULT IEnumFORMATETC_Constructor(UINT cfmt, const FORMATETC afmt[], IEnumFORMATETC **enumerator) +HRESULT IEnumFORMATETC_Constructor(UINT cfmt, const FORMATETC afmt[], IEnumFORMATETC **ppFormat) { - CComObject *theEnumerator; - CComPtr result; - HRESULT hResult; - - if (enumerator == NULL) - return E_POINTER; - *enumerator = NULL; - ATLTRY (theEnumerator = new CComObject); - if (theEnumerator == NULL) - return E_OUTOFMEMORY; - hResult = theEnumerator->QueryInterface (IID_PPV_ARG(IEnumFORMATETC, &result)); - if (FAILED (hResult)) - { - delete theEnumerator; - return hResult; - } - hResult = theEnumerator->Initialize (cfmt, afmt); - if (FAILED (hResult)) - return hResult; - *enumerator = result.Detach (); - TRACE("(%p)->(%u,%p)\n", *enumerator, cfmt, afmt); - return S_OK; + return ShellObjectCreatorInit(cfmt, afmt, IID_IEnumFORMATETC, ppFormat); } @@ -416,28 +395,7 @@ HRESULT WINAPI IDataObjectImpl::EndOperation(HRESULT hResult, IBindCtx *pbcReser */ HRESULT IDataObject_Constructor(HWND hwndOwner, LPCITEMIDLIST pMyPidl, LPCITEMIDLIST * apidl, UINT cidl, IDataObject **dataObject) { - CComObject *theDataObject; - CComPtr result; - HRESULT hResult; - - if (dataObject == NULL) - return E_POINTER; - *dataObject = NULL; - ATLTRY (theDataObject = new CComObject); - if (theDataObject == NULL) - return E_OUTOFMEMORY; - hResult = theDataObject->QueryInterface(IID_PPV_ARG(IDataObject, &result)); - if (FAILED (hResult)) - { - delete theDataObject; - return hResult; - } - hResult = theDataObject->Initialize (hwndOwner, pMyPidl, apidl, cidl); - if (FAILED (hResult)) - return hResult; - *dataObject = result.Detach (); - TRACE("(%p)->(apidl=%p cidl=%u)\n", *dataObject, apidl, cidl); - return S_OK; + return ShellObjectCreatorInit(hwndOwner, pMyPidl, apidl, cidl, IID_IDataObject, dataObject); } /************************************************************************* diff --git a/dll/win32/shell32/enumidlist.cpp b/dll/win32/shell32/enumidlist.cpp index ee7394effae..3086928a592 100644 --- a/dll/win32/shell32/enumidlist.cpp +++ b/dll/win32/shell32/enumidlist.cpp @@ -281,22 +281,5 @@ HRESULT WINAPI IEnumIDListImpl::Clone(LPENUMIDLIST *ppenum) */ HRESULT IEnumIDList_Constructor(IEnumIDList **enumerator) { - CComObject *theEnumerator; - CComPtr result; - HRESULT hResult; - - if (enumerator == NULL) - return E_POINTER; - *enumerator = NULL; - ATLTRY (theEnumerator = new CComObject); - if (theEnumerator == NULL) - return E_OUTOFMEMORY; - hResult = theEnumerator->QueryInterface(IID_PPV_ARG(IEnumIDList, &result)); - if (FAILED (hResult)) - { - delete theEnumerator; - return hResult; - } - *enumerator = result.Detach (); - return S_OK; + return ShellObjectCreator(IID_IEnumIDList, enumerator); } diff --git a/dll/win32/shell32/extracticon.cpp b/dll/win32/shell32/extracticon.cpp index 80c65d543d1..26a06006821 100644 --- a/dll/win32/shell32/extracticon.cpp +++ b/dll/win32/shell32/extracticon.cpp @@ -337,22 +337,5 @@ HRESULT STDMETHODCALLTYPE IconExtraction::GetCurFile( HRESULT WINAPI SHCreateDefaultExtractIcon(REFIID riid, void **ppv) { - CComObject *theExtractor; - CComPtr result; - HRESULT hResult; - - if (ppv == NULL) - return E_POINTER; - *ppv = NULL; - ATLTRY (theExtractor = new CComObject); - if (theExtractor == NULL) - return E_OUTOFMEMORY; - hResult = theExtractor->QueryInterface (riid, (void **)&result); - if (FAILED (hResult)) - { - delete theExtractor; - return hResult; - } - *ppv = result.Detach (); - return S_OK; + return ShellObjectCreator(riid, ppv); } diff --git a/dll/win32/shell32/folders/admintools.cpp b/dll/win32/shell32/folders/admintools.cpp index b742d99d7a3..cac2f5811bc 100644 --- a/dll/win32/shell32/folders/admintools.cpp +++ b/dll/win32/shell32/folders/admintools.cpp @@ -136,32 +136,7 @@ HRESULT WINAPI CAdminToolsFolder::ParseDisplayName(HWND hwndOwner, LPBC pbc, LPO */ HRESULT WINAPI CAdminToolsFolder::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList) { - CComObject *theEnumerator; - CComPtr result; - HRESULT hResult; - - TRACE ("(%p)->(HWND=%p flags=0x%08x pplist=%p)\n", this, hwndOwner, dwFlags, ppEnumIDList); - - if (ppEnumIDList == NULL) - return E_POINTER; - *ppEnumIDList = NULL; - ATLTRY (theEnumerator = new CComObject); - if (theEnumerator == NULL) - return E_OUTOFMEMORY; - hResult = theEnumerator->QueryInterface(IID_PPV_ARG(IEnumIDList, &result)); - if (FAILED (hResult)) - { - delete theEnumerator; - return hResult; - } - hResult = theEnumerator->Initialize (szTarget, dwFlags); - if (FAILED (hResult)) - return hResult; - *ppEnumIDList = result.Detach (); - - TRACE ("-- (%p)->(new ID List: %p)\n", this, *ppEnumIDList); - - return S_OK; + return ShellObjectCreatorInit(szTarget, dwFlags, IID_IEnumIDList, ppEnumIDList); } /************************************************************************** diff --git a/dll/win32/shell32/folders/cpanel.cpp b/dll/win32/shell32/folders/cpanel.cpp index 01aaf995084..1033450f0eb 100644 --- a/dll/win32/shell32/folders/cpanel.cpp +++ b/dll/win32/shell32/folders/cpanel.cpp @@ -371,37 +371,9 @@ HRESULT WINAPI CControlPanelFolder::ParseDisplayName( /************************************************************************** * CControlPanelFolder::EnumObjects */ -HRESULT WINAPI CControlPanelFolder::EnumObjects( - HWND hwndOwner, - DWORD dwFlags, - LPENUMIDLIST *ppEnumIDList) +HRESULT WINAPI CControlPanelFolder::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList) { - CComObject *theEnumerator; - CComPtr result; - HRESULT hResult; - - TRACE ("(%p)->(HWND=%p flags=0x%08x pplist=%p)\n", this, hwndOwner, dwFlags, ppEnumIDList); - - if (ppEnumIDList == NULL) - return E_POINTER; - *ppEnumIDList = NULL; - ATLTRY (theEnumerator = new CComObject); - if (theEnumerator == NULL) - return E_OUTOFMEMORY; - hResult = theEnumerator->QueryInterface(IID_PPV_ARG(IEnumIDList, &result)); - if (FAILED (hResult)) - { - delete theEnumerator; - return hResult; - } - hResult = theEnumerator->Initialize (dwFlags); - if (FAILED (hResult)) - return hResult; - *ppEnumIDList = result.Detach (); - - TRACE ("-- (%p)->(new ID List: %p)\n", this, *ppEnumIDList); - - return S_OK; + return ShellObjectCreatorInit(dwFlags, IID_IEnumIDList, ppEnumIDList); } /************************************************************************** diff --git a/dll/win32/shell32/folders/desktop.cpp b/dll/win32/shell32/folders/desktop.cpp index 5ed78a2763b..119df7a01f2 100644 --- a/dll/win32/shell32/folders/desktop.cpp +++ b/dll/win32/shell32/folders/desktop.cpp @@ -421,41 +421,9 @@ HRESULT WINAPI CDesktopFolder::ParseDisplayName( /************************************************************************** * CDesktopFolder::EnumObjects */ -HRESULT WINAPI CDesktopFolder::EnumObjects( - HWND hwndOwner, - DWORD dwFlags, - LPENUMIDLIST *ppEnumIDList) +HRESULT WINAPI CDesktopFolder::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList) { - CComObject *theEnumerator; - CComPtr result; - HRESULT hResult; - - TRACE ("(%p)->(HWND=%p flags=0x%08x pplist=%p)\n", this, hwndOwner, dwFlags, ppEnumIDList); - - if (ppEnumIDList == NULL) - return E_POINTER; - *ppEnumIDList = NULL; - - ATLTRY (theEnumerator = new CComObject); - - if (theEnumerator == NULL) - return E_OUTOFMEMORY; - - hResult = theEnumerator->QueryInterface(IID_PPV_ARG(IEnumIDList, &result)); - if (FAILED (hResult)) - { - delete theEnumerator; - return hResult; - } - - hResult = theEnumerator->Initialize (this, hwndOwner, dwFlags); - if (FAILED (hResult)) - return hResult; - *ppEnumIDList = result.Detach (); - - TRACE ("-- (%p)->(new ID List: %p)\n", this, *ppEnumIDList); - - return S_OK; + return ShellObjectCreatorInit(this, hwndOwner, dwFlags, IID_IEnumIDList, ppEnumIDList); } /************************************************************************** diff --git a/dll/win32/shell32/folders/fonts.cpp b/dll/win32/shell32/folders/fonts.cpp index 236b84a0ba5..218d46e2760 100644 --- a/dll/win32/shell32/folders/fonts.cpp +++ b/dll/win32/shell32/folders/fonts.cpp @@ -219,32 +219,7 @@ HRESULT WINAPI CFontsFolder::ParseDisplayName( */ HRESULT WINAPI CFontsFolder::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList) { - CComObject *theEnumerator; - CComPtr result; - HRESULT hResult; - - TRACE ("(%p)->(HWND=%p flags=0x%08x pplist=%p)\n", this, hwndOwner, dwFlags, ppEnumIDList); - - if (ppEnumIDList == NULL) - return E_POINTER; - *ppEnumIDList = NULL; - ATLTRY (theEnumerator = new CComObject); - if (theEnumerator == NULL) - return E_OUTOFMEMORY; - hResult = theEnumerator->QueryInterface(IID_PPV_ARG(IEnumIDList, &result)); - if (FAILED (hResult)) - { - delete theEnumerator; - return hResult; - } - hResult = theEnumerator->Initialize (dwFlags); - if (FAILED (hResult)) - return hResult; - *ppEnumIDList = result.Detach (); - - TRACE ("-- (%p)->(new ID List: %p)\n", this, *ppEnumIDList); - - return S_OK; + return ShellObjectCreatorInit(dwFlags, IID_IEnumIDList, ppEnumIDList); } /************************************************************************** diff --git a/dll/win32/shell32/folders/fs.cpp b/dll/win32/shell32/folders/fs.cpp index fd75611ae60..e8800214fda 100644 --- a/dll/win32/shell32/folders/fs.cpp +++ b/dll/win32/shell32/folders/fs.cpp @@ -260,32 +260,7 @@ HRESULT WINAPI CFSFolder::EnumObjects( DWORD dwFlags, LPENUMIDLIST *ppEnumIDList) { - CComObject *theEnumerator; - CComPtr result; - HRESULT hResult; - - TRACE("(%p)->(HWND=%p flags=0x%08x pplist=%p)\n", this, hwndOwner, dwFlags, ppEnumIDList); - - if (ppEnumIDList == NULL) - return E_POINTER; - *ppEnumIDList = NULL; - ATLTRY (theEnumerator = new CComObject); - if (theEnumerator == NULL) - return E_OUTOFMEMORY; - hResult = theEnumerator->QueryInterface(IID_PPV_ARG(IEnumIDList, &result)); - if (FAILED(hResult)) - { - delete theEnumerator; - return hResult; - } - hResult = theEnumerator->Initialize (sPathTarget, dwFlags); - if (FAILED (hResult)) - return hResult; - *ppEnumIDList = result.Detach(); - - TRACE("-- (%p)->(new ID List: %p)\n", this, *ppEnumIDList); - - return S_OK; + return ShellObjectCreatorInit(sPathTarget, dwFlags, IID_IEnumIDList, ppEnumIDList); } /************************************************************************** diff --git a/dll/win32/shell32/folders/mycomp.cpp b/dll/win32/shell32/folders/mycomp.cpp index 923997793c1..828abacd5ab 100644 --- a/dll/win32/shell32/folders/mycomp.cpp +++ b/dll/win32/shell32/folders/mycomp.cpp @@ -252,36 +252,7 @@ HRESULT WINAPI CDrivesFolder::ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLEST */ HRESULT WINAPI CDrivesFolder::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList) { - CComObject *theEnumerator; - CComPtr result; - HRESULT hResult; - - TRACE ("(%p)->(HWND=%p flags=0x%08x pplist=%p)\n", this, hwndOwner, dwFlags, ppEnumIDList); - - if (ppEnumIDList == NULL) - return E_POINTER; - - *ppEnumIDList = NULL; - ATLTRY(theEnumerator = new CComObject); - - if (theEnumerator == NULL) - return E_OUTOFMEMORY; - - hResult = theEnumerator->QueryInterface(IID_IEnumIDList, (void **)&result); - if (FAILED(hResult)) - { - delete theEnumerator; - return hResult; - } - - hResult = theEnumerator->Initialize(hwndOwner, dwFlags); - if (FAILED(hResult)) - return hResult; - *ppEnumIDList = result.Detach(); - - TRACE("-- (%p)->(new ID List: %p)\n", this, *ppEnumIDList); - - return S_OK; + return ShellObjectCreatorInit(hwndOwner, dwFlags, IID_IEnumIDList, ppEnumIDList); } /************************************************************************** diff --git a/dll/win32/shell32/folders/mydocuments.cpp b/dll/win32/shell32/folders/mydocuments.cpp index b610f4c6f96..8d6eff997e3 100644 --- a/dll/win32/shell32/folders/mydocuments.cpp +++ b/dll/win32/shell32/folders/mydocuments.cpp @@ -214,32 +214,7 @@ HRESULT WINAPI CMyDocsFolder::ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLEST */ HRESULT WINAPI CMyDocsFolder::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList) { - CComObject *theEnumerator; - CComPtr result; - HRESULT hResult; - - TRACE("(%p)->(HWND=%p flags=0x%08x pplist=%p)\n", this, hwndOwner, dwFlags, ppEnumIDList); - - if (ppEnumIDList == NULL) - return E_POINTER; - *ppEnumIDList = NULL; - ATLTRY (theEnumerator = new CComObject); - if (theEnumerator == NULL) - return E_OUTOFMEMORY; - hResult = theEnumerator->QueryInterface(IID_IEnumIDList, (void **)&result); - if (FAILED (hResult)) - { - delete theEnumerator; - return hResult; - } - hResult = theEnumerator->Initialize(dwFlags); - if (FAILED (hResult)) - return hResult; - *ppEnumIDList = result.Detach(); - - TRACE("-- (%p)->(new ID List: %p)\n", this, *ppEnumIDList); - - return S_OK; + return ShellObjectCreatorInit(dwFlags, IID_IEnumIDList, ppEnumIDList); } /************************************************************************** diff --git a/dll/win32/shell32/folders/printers.cpp b/dll/win32/shell32/folders/printers.cpp index 2e794af09ee..689434b9311 100644 --- a/dll/win32/shell32/folders/printers.cpp +++ b/dll/win32/shell32/folders/printers.cpp @@ -185,27 +185,7 @@ HRESULT WINAPI CPrintersExtractIconW::Extract(LPCSTR pszFile, */ static HRESULT WINAPI IEI_Printers_Constructor(LPCITEMIDLIST pidl, REFIID riid, IUnknown **ppv) { - CComObject *theExtractor; - CComPtr result; - HRESULT hResult; - - if (ppv == NULL) - return E_POINTER; - *ppv = NULL; - ATLTRY (theExtractor = new CComObject); - if (theExtractor == NULL) - return E_OUTOFMEMORY; - hResult = theExtractor->QueryInterface(riid, (void **)&result); - if (FAILED (hResult)) - { - delete theExtractor; - return hResult; - } - hResult = theExtractor->Initialize(pidl); - if (FAILED (hResult)) - return hResult; - *ppv = result.Detach(); - return S_OK; + return ShellObjectCreatorInit(pidl, riid, ppv); } /*********************************************************************** @@ -379,32 +359,7 @@ static PIDLPrinterStruct * _ILGetPrinterStruct(LPCITEMIDLIST pidl) */ HRESULT WINAPI CPrinterFolder::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST * ppEnumIDList) { - CComObject *theEnumerator; - CComPtr result; - HRESULT hResult; - - TRACE ("(%p)->(HWND=%p flags=0x%08x pplist=%p)\n", this, hwndOwner, dwFlags, ppEnumIDList); - - if (ppEnumIDList == NULL) - return E_POINTER; - *ppEnumIDList = NULL; - ATLTRY (theEnumerator = new CComObject); - if (theEnumerator == NULL) - return E_OUTOFMEMORY; - hResult = theEnumerator->QueryInterface(IID_PPV_ARG(IEnumIDList, &result)); - if (FAILED (hResult)) - { - delete theEnumerator; - return hResult; - } - hResult = theEnumerator->Initialize(hwndOwner, dwFlags); - if (FAILED (hResult)) - return hResult; - *ppEnumIDList = result.Detach(); - - TRACE ("-- (%p)->(new ID List: %p)\n", this, *ppEnumIDList); - - return S_OK; + return ShellObjectCreatorInit(hwndOwner, dwFlags, IID_IEnumIDList, ppEnumIDList); } /************************************************************************** diff --git a/dll/win32/shell32/folders/recyclebin.cpp b/dll/win32/shell32/folders/recyclebin.cpp index 19f9bbd0e3a..5266fadb653 100644 --- a/dll/win32/shell32/folders/recyclebin.cpp +++ b/dll/win32/shell32/folders/recyclebin.cpp @@ -403,34 +403,6 @@ HRESULT WINAPI CRecycleBinItemContextMenu::HandleMenuMsg(UINT uMsg, WPARAM wPara return E_NOTIMPL; } -static HRESULT WINAPI CRecycleBinItemContextMenuConstructor(REFIID riid, LPCITEMIDLIST pidl, LPVOID *ppv) -{ - CComObject *theMenu; - CComPtr result; - HRESULT hResult; - - TRACE("%s\n", shdebugstr_guid(&riid)); - - if (ppv == NULL) - return E_POINTER; - *ppv = NULL; - ATLTRY(theMenu = new CComObject); - if (theMenu == NULL) - return E_OUTOFMEMORY; - hResult = theMenu->QueryInterface(riid, (void **)&result); - if (FAILED(hResult)) - { - delete theMenu; - return hResult; - } - hResult = theMenu->Initialize(pidl); - if (FAILED(hResult)) - return hResult; - *ppv = result.Detach(); - TRACE ("--(%p)\n", *ppv); - return S_OK; -} - /************************************************************************** * registers clipboardformat once */ @@ -509,32 +481,7 @@ UnpackDetailsFromPidl(LPCITEMIDLIST pidl) HRESULT WINAPI CRecycleBin::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList) { - CComObject *theEnumerator; - CComPtr result; - HRESULT hResult; - - TRACE ("(%p)->(HWND=%p flags=0x%08x pplist=%p)\n", this, hwndOwner, dwFlags, ppEnumIDList); - - if (ppEnumIDList == NULL) - return E_POINTER; - *ppEnumIDList = NULL; - ATLTRY (theEnumerator = new CComObject); - if (theEnumerator == NULL) - return E_OUTOFMEMORY; - hResult = theEnumerator->QueryInterface(IID_PPV_ARG(IEnumIDList, &result)); - if (FAILED (hResult)) - { - delete theEnumerator; - return hResult; - } - hResult = theEnumerator->Initialize(dwFlags); - if (FAILED (hResult)) - return hResult; - *ppEnumIDList = result.Detach(); - - TRACE ("-- (%p)->(new ID List: %p)\n", this, *ppEnumIDList); - - return S_OK; + return ShellObjectCreatorInit(dwFlags, IID_IEnumIDList, ppEnumIDList); } HRESULT WINAPI CRecycleBin::BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbc, REFIID riid, void **ppv) @@ -617,12 +564,12 @@ HRESULT WINAPI CRecycleBin::GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_C if ((IsEqualIID (riid, IID_IContextMenu) || IsEqualIID(riid, IID_IContextMenu2)) && (cidl >= 1)) { - hr = CRecycleBinItemContextMenuConstructor(riid, apidl[0], (void **)&pObj); + hr = ShellObjectCreatorInit(apidl[0], riid, &pObj); } else if (IsEqualIID (riid, IID_IDropTarget) && (cidl == 1)) { IDropTarget * pDt = NULL; - hr = this->QueryInterface(IID_PPV_ARG(IDropTarget, &pDt)); + hr = QueryInterface(IID_PPV_ARG(IDropTarget, &pDt)); pObj = pDt; } else diff --git a/dll/win32/shell32/openwithmenu.cpp b/dll/win32/shell32/openwithmenu.cpp index a2033f819c6..70495d428c9 100644 --- a/dll/win32/shell32/openwithmenu.cpp +++ b/dll/win32/shell32/openwithmenu.cpp @@ -1376,7 +1376,6 @@ SHOpenWithDialog(HWND hwndParent, const OPENASINFO *poainfo) { MSG msg; HWND hwnd; - COpenWithDialog *pDialog; TRACE("SHOpenWithDialog hwndParent %p poainfo %p\n", hwndParent, poainfo); @@ -1385,11 +1384,9 @@ SHOpenWithDialog(HWND hwndParent, const OPENASINFO *poainfo) if (poainfo->pcszClass == NULL && poainfo->pcszFile == NULL) return E_FAIL; - pDialog = new COpenWithDialog(poainfo); - if (!pDialog) - return E_OUTOFMEMORY; + COpenWithDialog pDialog(poainfo); - hwnd = CreateDialogParam(shell32_hInstance, MAKEINTRESOURCE(IDD_OPEN_WITH), hwndParent, COpenWithDialog::DialogProc, (LPARAM)pDialog); + hwnd = CreateDialogParam(shell32_hInstance, MAKEINTRESOURCE(IDD_OPEN_WITH), hwndParent, COpenWithDialog::DialogProc, (LPARAM)&pDialog); if (hwnd == NULL) { ERR("Failed to create dialog\n"); @@ -1407,7 +1404,5 @@ SHOpenWithDialog(HWND hwndParent, const OPENASINFO *poainfo) } } - delete pDialog; - return S_OK; } diff --git a/dll/win32/shell32/precomp.h b/dll/win32/shell32/precomp.h index 285472d0d5f..60198c9da21 100644 --- a/dll/win32/shell32/precomp.h +++ b/dll/win32/shell32/precomp.h @@ -30,6 +30,7 @@ #include #include #include +#include //#include "base/shell/explorer-new/todo.h" //#include "dlgs.h" diff --git a/dll/win32/shell32/shellole.cpp b/dll/win32/shell32/shellole.cpp index 884ab671022..66909969f6c 100644 --- a/dll/win32/shell32/shellole.cpp +++ b/dll/win32/shell32/shellole.cpp @@ -376,27 +376,7 @@ HRESULT WINAPI IDefClFImpl::LockServer(BOOL fLock) HRESULT IDefClF_fnConstructor(LPFNCREATEINSTANCE lpfnCI, PLONG pcRefDll, const IID *riidInst, IClassFactory **theFactory) { - CComObject *theClassObject; - CComPtr result; - HRESULT hResult; - - if (theFactory == NULL) - return E_POINTER; - *theFactory = NULL; - ATLTRY (theClassObject = new CComObject); - if (theClassObject == NULL) - return E_OUTOFMEMORY; - hResult = theClassObject->QueryInterface (IID_PPV_ARG(IClassFactory, &result)); - if (FAILED (hResult)) - { - delete theClassObject; - return hResult; - } - hResult = theClassObject->Initialize (lpfnCI, pcRefDll, riidInst); - if (FAILED (hResult)) - return hResult; - *theFactory = result.Detach (); - return S_OK; + return ShellObjectCreatorInit(lpfnCI, pcRefDll, riidInst, IID_IClassFactory, theFactory); } /****************************************************************************** diff --git a/dll/win32/shell32/shlview.cpp b/dll/win32/shell32/shlview.cpp index 3633b287d77..333917fe8fe 100644 --- a/dll/win32/shell32/shlview.cpp +++ b/dll/win32/shell32/shlview.cpp @@ -2974,30 +2974,5 @@ HRESULT CDefView::_MergeToolbar() */ HRESULT WINAPI IShellView_Constructor(IShellFolder *pFolder, IShellView **newView) { - CComObject *theView; - CComPtr result; - HRESULT hResult; - - if (newView == NULL) - return E_POINTER; - - *newView = NULL; - ATLTRY (theView = new CComObject); - - if (theView == NULL) - return E_OUTOFMEMORY; - - hResult = theView->QueryInterface(IID_PPV_ARG(IShellView, &result)); - if (FAILED (hResult)) - { - delete theView; - return hResult; - } - - hResult = theView->Initialize (pFolder); - if (FAILED (hResult)) - return hResult; - *newView = result.Detach (); - - return S_OK; + return ShellObjectCreatorInit(pFolder, IID_IShellView, newView); } diff --git a/dll/win32/shell32/undocshell.h b/include/reactos/undocshell.h similarity index 62% rename from dll/win32/shell32/undocshell.h rename to include/reactos/undocshell.h index dad99e0a616..e220433b7fc 100644 --- a/dll/win32/shell32/undocshell.h +++ b/include/reactos/undocshell.h @@ -529,8 +529,315 @@ BOOL WINAPI SHDesktopMessageLoop(HANDLE); #define CSIDL_FOLDER_MASK 0x00ff +/* Utility functions */ +#include + +static inline ULONG +Win32DbgPrint(const char *filename, int line, const char *lpFormat, ...) +{ + char szMsg[512]; + char *szMsgStart; + const char *fname; + va_list vl; + ULONG uRet; + + fname = strrchr(filename, '\\'); + if (fname == NULL) + { + fname = strrchr(filename, '/'); + if (fname != NULL) + fname++; + } + else + fname++; + + if (fname == NULL) + fname = filename; + + szMsgStart = szMsg + sprintf(szMsg, "%s:%d: ", fname, line); + + va_start(vl, lpFormat); + uRet = (ULONG) vsprintf(szMsgStart, lpFormat, vl); + va_end(vl); + + OutputDebugStringA(szMsg); + + return uRet; +} + +#define DbgPrint(fmt, ...) \ + Win32DbgPrint(__FILE__, __LINE__, fmt, ##__VA_ARGS__) + +static inline void DbgDumpMenuInternal(HMENU hmenu, char* padding, int padlevel) +{ + WCHAR label[128]; + + padding[padlevel] = '.'; + padding[padlevel + 1] = '.'; + padding[padlevel + 2] = 0; + + int count = GetMenuItemCount(hmenu); + for (int i = 0; i < count; i++) + { + MENUITEMINFOW mii = { 0 }; + + mii.cbSize = sizeof(mii); + mii.fMask = MIIM_STRING | MIIM_FTYPE | MIIM_SUBMENU | MIIM_STATE | MIIM_ID; + mii.dwTypeData = label; + mii.cch = _countof(label); + + GetMenuItemInfo(hmenu, i, TRUE, &mii); + + if (mii.fType & MFT_BITMAP) + DbgPrint("%s%2d - %08x: BITMAP %08p (state=%d, has submenu=%s)\n", padding, i, mii.wID, mii.hbmpItem, mii.fState, mii.hSubMenu ? "TRUE" : "FALSE"); + else if (mii.fType & MFT_SEPARATOR) + DbgPrint("%s%2d - %08x ---SEPARATOR---\n", padding, i, mii.wID); + else + DbgPrint("%s%2d - %08x: %S (state=%d, has submenu=%s)\n", padding, i, mii.wID, mii.dwTypeData, mii.fState, mii.hSubMenu ? "TRUE" : "FALSE"); + + if (mii.hSubMenu) + DbgDumpMenuInternal(mii.hSubMenu, padding, padlevel + 2); + + } + + padding[padlevel] = 0; +} + +static __inline void DbgDumpMenu(HMENU hmenu) +{ + char padding[128]; + DbgDumpMenuInternal(hmenu, padding, 0); +} + +#if 1 +#define FAILED_UNEXPECTEDLY(hr) (FAILED(hr) && (DbgPrint("Unexpected failure %08x.\n", hr), TRUE)) +#else +#define FAILED_UNEXPECTEDLY(hr) FAILED(hr) +#endif + #ifdef __cplusplus } /* extern "C" */ #endif /* defined(__cplusplus) */ +#ifdef __cplusplus +template +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 **pp) + { + CComDebugObject *newInstance; + HRESULT hResult; + + ATLASSERT(pp != NULL); + if (pp == NULL) + return E_POINTER; + + hResult = E_OUTOFMEMORY; + newInstance = NULL; + ATLTRY(newInstance = new CComDebugObject()) + 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; + } +}; + +template +HRESULT inline ShellObjectCreator(REFIID riid, R ** ppv) +{ + CComPtr obj; + HRESULT hResult; + + if (ppv == NULL) + return E_POINTER; + *ppv = NULL; + ATLTRY(obj = new CComObject); + if (obj.p == NULL) + return E_OUTOFMEMORY; + hResult = obj->QueryInterface(riid, reinterpret_cast(ppv)); + if (FAILED(hResult)) + return hResult; + return S_OK; +} + +template +HRESULT inline ShellObjectCreatorInit(REFIID riid, R ** ppv) +{ + CComPtr obj; + CComPtr result; + HRESULT hResult; + + if (ppv == NULL) + return E_POINTER; + *ppv = NULL; + ATLTRY(obj = new CComObject); + if (obj.p == NULL) + return E_OUTOFMEMORY; + hResult = obj->QueryInterface(riid, reinterpret_cast(&result)); + if (FAILED(hResult)) + return hResult; + + hResult = obj->Initialize(); + if (FAILED(hResult)) + return hResult; + + *ppv = result.Detach(); + + return S_OK; +} + +template +HRESULT inline ShellObjectCreatorInit(T1 initArg1, REFIID riid, R ** ppv) +{ + CComPtr obj; + CComPtr result; + HRESULT hResult; + + if (ppv == NULL) + return E_POINTER; + *ppv = NULL; + ATLTRY(obj = new CComObject); + if (obj.p == NULL) + return E_OUTOFMEMORY; + hResult = obj->QueryInterface(riid, reinterpret_cast(&result)); + if (FAILED(hResult)) + return hResult; + + hResult = obj->Initialize(initArg1); + if (FAILED(hResult)) + return hResult; + + *ppv = result.Detach(); + + return S_OK; +} + +template +HRESULT inline ShellObjectCreatorInit(T1 initArg1, T2 initArg2, REFIID riid, R ** ppv) +{ + CComPtr obj; + CComPtr result; + HRESULT hResult; + + if (ppv == NULL) + return E_POINTER; + *ppv = NULL; + ATLTRY(obj = new CComObject); + if (obj.p == NULL) + return E_OUTOFMEMORY; + hResult = obj->QueryInterface(riid, reinterpret_cast(&result)); + if (FAILED(hResult)) + return hResult; + + hResult = obj->Initialize(initArg1, initArg2); + if (FAILED(hResult)) + return hResult; + + *ppv = result.Detach(); + + return S_OK; +} + +template +HRESULT inline ShellObjectCreatorInit(T1 initArg1, T2 initArg2, T3 initArg3, REFIID riid, R ** ppv) +{ + CComPtr obj; + CComPtr result; + HRESULT hResult; + + if (ppv == NULL) + return E_POINTER; + *ppv = NULL; + ATLTRY(obj = new CComObject); + if (obj.p == NULL) + return E_OUTOFMEMORY; + hResult = obj->QueryInterface(riid, reinterpret_cast(&result)); + if (FAILED(hResult)) + return hResult; + + hResult = obj->Initialize(initArg1, initArg2, initArg3); + if (FAILED(hResult)) + return hResult; + + *ppv = result.Detach(); + + return S_OK; +} + +template +HRESULT inline ShellObjectCreatorInit(T1 initArg1, T2 initArg2, T3 initArg3, T4 initArg4, REFIID riid, R ** ppv) +{ + CComPtr obj; + CComPtr result; + HRESULT hResult; + + if (ppv == NULL) + return E_POINTER; + *ppv = NULL; + ATLTRY(obj = new CComObject); + if (obj.p == NULL) + return E_OUTOFMEMORY; + hResult = obj->QueryInterface(riid, reinterpret_cast(&result)); + if (FAILED(hResult)) + return hResult; + + hResult = obj->Initialize(initArg1, initArg2, initArg3, initArg4); + if (FAILED(hResult)) + return hResult; + + *ppv = result.Detach(); + + return S_OK; +} +#endif /* __cplusplus */ + #endif /* __WINE_UNDOCSHELL_H */