diff --git a/dll/win32/shell32/brsfolder.cpp b/dll/win32/shell32/brsfolder.cpp index a8fde0f8018..678d3b432b9 100644 --- a/dll/win32/shell32/brsfolder.cpp +++ b/dll/win32/shell32/brsfolder.cpp @@ -177,8 +177,9 @@ static void InitializeTreeView( browse_info *info ) LPITEMIDLIST pidlParent, pidlChild; HIMAGELIST hImageList; HRESULT hr; - IShellFolder *lpsfParent, *lpsfRoot; - IEnumIDList * pEnumChildren = NULL; + CComPtr lpsfParent; + CComPtr lpsfRoot; + CComPtr pEnumChildren; HTREEITEM item; DWORD flags; LPCITEMIDLIST root = info->lpBrowseInfo->pidlRoot; @@ -232,12 +233,10 @@ static void InitializeTreeView( browse_info *info ) hr = lpsfParent->BindToObject(pidlChild, 0, IID_PPV_ARG(IShellFolder, &lpsfRoot)); } else { lpsfRoot = lpsfParent; - hr = lpsfParent->AddRef(); } if (FAILED(hr)) { WARN("Could not bind to root shell folder! hr = %08x\n", hr); - lpsfParent->Release(); ILFree(pidlChild); ILFree(pidlParent); return; @@ -247,8 +246,6 @@ static void InitializeTreeView( browse_info *info ) hr = lpsfRoot->EnumObjects(info->hWnd, flags, &pEnumChildren ); if (FAILED(hr)) { WARN("Could not get child iterator! hr = %08x\n", hr); - lpsfParent->Release(); - lpsfRoot->Release(); ILFree(pidlChild); ILFree(pidlParent); return; @@ -261,8 +258,6 @@ static void InitializeTreeView( browse_info *info ) ILFree(pidlChild); ILFree(pidlParent); - lpsfRoot->Release(); - lpsfParent->Release(); } static int GetIcon(LPCITEMIDLIST lpi, UINT uFlags) @@ -366,6 +361,7 @@ static HTREEITEM InsertTreeViewItem( browse_info *info, IShellFolder * lpsf, tvi.lParam = (LPARAM)lptvid; lpsf->AddRef(); + pEnumIL->AddRef(); lptvid->lpsfParent = lpsf; lptvid->lpi = ILClone(pidl); lptvid->lpifq = pidlParent ? ILCombine(pidlParent, pidl) : ILClone(pidl); @@ -411,8 +407,8 @@ static void FillTreeView( browse_info *info, IShellFolder * lpsf, while (S_OK == lpe->Next(1,&pidlTemp,&ulFetched)) { ULONG ulAttrs = SFGAO_HASSUBFOLDER | SFGAO_FOLDER; - IEnumIDList* pEnumIL = NULL; - IShellFolder* pSFChild = NULL; + CComPtr pEnumIL; + CComPtr pSFChild; lpsf->GetAttributesOf(1, (LPCITEMIDLIST*)&pidlTemp, &ulAttrs); if (ulAttrs & SFGAO_FOLDER) { @@ -426,11 +422,9 @@ static void FillTreeView( browse_info *info, IShellFolder * lpsf, if ((pEnumIL->Skip(1) != S_OK) || FAILED(pEnumIL->Reset())) { - pEnumIL->Release(); pEnumIL = NULL; } } - pSFChild->Release(); } } @@ -508,7 +502,7 @@ static LRESULT BrsFolder_Treeview_Delete( browse_info *info, NMTREEVIEWW *pnmtv static LRESULT BrsFolder_Treeview_Expand( browse_info *info, NMTREEVIEWW *pnmtv ) { - IShellFolder *lpsf2 = NULL; + CComPtr lpsf2; LPTV_ITEMDATA lptvid = (LPTV_ITEMDATA) pnmtv->itemNew.lParam; HRESULT r; diff --git a/dll/win32/shell32/defcontextmenu.cpp b/dll/win32/shell32/defcontextmenu.cpp index 418dcc342ae..36fba8985d5 100644 --- a/dll/win32/shell32/defcontextmenu.cpp +++ b/dll/win32/shell32/defcontextmenu.cpp @@ -308,7 +308,7 @@ HasClipboardData() STGMEDIUM medium; FORMATETC formatetc; - TRACE("pDataObj=%p\n", pDataObj); + TRACE("pDataObj=%p\n", pDataObj.p); /* Set the FORMATETC structure*/ InitFormatEtc(formatetc, RegisterClipboardFormatW(CFSTR_SHELLIDLIST), TYMED_HGLOBAL); @@ -933,15 +933,13 @@ NotifyShellViewWindow(LPCMINVOKECOMMANDINFO lpcmi, BOOL bRefresh) if (!lpSB) return E_FAIL; - IShellView * lpSV = NULL; + CComPtr lpSV; if (FAILED(lpSB->QueryActiveShellView(&lpSV))) return E_FAIL; HWND hwndSV = NULL; if (SUCCEEDED(lpSV->GetWindow(&hwndSV))) SendMessageW(hwndSV, WM_COMMAND, MAKEWPARAM(LOWORD(lpcmi->lpVerb), 0), 0); - - lpSV->Release(); return S_OK; } diff --git a/dll/win32/shell32/folders.cpp b/dll/win32/shell32/folders.cpp index aedae6c7bc9..913d657a5cb 100644 --- a/dll/win32/shell32/folders.cpp +++ b/dll/win32/shell32/folders.cpp @@ -241,11 +241,11 @@ IExtractIconW* IExtractIconW_Constructor(LPCITEMIDLIST pidl) { static const WCHAR szFull[] = {'F','u','l','l',0}; static const WCHAR szEmpty[] = {'E','m','p','t','y',0}; - IEnumIDList *EnumIDList = NULL; + CComPtr EnumIDList; CoInitialize(NULL); - IShellFolder2 *psfRecycleBin = NULL; - IShellFolder *psfDesktop = NULL; + CComPtr psfRecycleBin; + CComPtr psfDesktop; hr = SHGetDesktopFolder(&psfDesktop); if (SUCCEEDED(hr)) @@ -262,13 +262,6 @@ IExtractIconW* IExtractIconW_Constructor(LPCITEMIDLIST pidl) } else { iconname = szEmpty; } - - if (psfDesktop) - psfDesktop->Release(); - if (psfRecycleBin) - psfRecycleBin->Release(); - if (EnumIDList) - EnumIDList->Release(); } if (HCR_GetIconW(xriid, wTemp, iconname, MAX_PATH, &icon_idx)) diff --git a/dll/win32/shell32/newmenu.cpp b/dll/win32/shell32/newmenu.cpp index 53dc802fa4c..5b1668176e9 100644 --- a/dll/win32/shell32/newmenu.cpp +++ b/dll/win32/shell32/newmenu.cpp @@ -544,12 +544,7 @@ HRESULT STDMETHODCALLTYPE CNewMenu::SetSite(IUnknown *pUnkSite) HRESULT STDMETHODCALLTYPE CNewMenu::GetSite(REFIID riid, void **ppvSite) { - if (ppvSite == NULL) - return E_POINTER; - *ppvSite = m_pSite; - if (m_pSite != NULL) - m_pSite->AddRef(); - return S_OK; + return m_pSite->QueryInterface(riid, ppvSite); } HRESULT @@ -596,8 +591,8 @@ HRESULT WINAPI CNewMenu::InvokeCommand(LPCMINVOKECOMMANDINFO lpici) { - IShellBrowser *lpSB = NULL; - CComPtr lpSV = NULL; + CComPtr lpSB; + CComPtr lpSV; HRESULT hr = E_FAIL; /* Note: CWM_GETISHELLBROWSER returns shell browser without adding reference */ diff --git a/dll/win32/shell32/newmenu.h b/dll/win32/shell32/newmenu.h index 88b29823356..3f0fde32279 100644 --- a/dll/win32/shell32/newmenu.h +++ b/dll/win32/shell32/newmenu.h @@ -54,7 +54,7 @@ private: LPWSTR m_wszPath; SHELLNEW_ITEM *m_pItems; SHELLNEW_ITEM *m_pLinkItem; - IUnknown *m_pSite; + CComPtr m_pSite; HMENU m_hSubMenu; HBITMAP m_hbmFolder, m_hbmLink; diff --git a/dll/win32/shell32/pidl.cpp b/dll/win32/shell32/pidl.cpp index 837d6943b94..6b9f0af126a 100644 --- a/dll/win32/shell32/pidl.cpp +++ b/dll/win32/shell32/pidl.cpp @@ -71,7 +71,7 @@ static BOOL ILGetDisplayNameExA(IShellFolder * psf, LPCITEMIDLIST pidl, LPSTR pa BOOL WINAPI ILGetDisplayNameExW(IShellFolder * psf, LPCITEMIDLIST pidl, LPWSTR path, DWORD type) { CComPtr psfParent; - IShellFolder * lsf = psf; + CComPtr lsf = psf; HRESULT ret = NO_ERROR; LPCITEMIDLIST pidllast; STRRET strret; @@ -133,8 +133,6 @@ BOOL WINAPI ILGetDisplayNameExW(IShellFolder * psf, LPCITEMIDLIST pidl, LPWSTR p TRACE("%p %p %s\n", psf, pidl, debugstr_w(path)); - if (!psf) - lsf->Release(); return SUCCEEDED(ret); } diff --git a/dll/win32/shell32/shelllink.h b/dll/win32/shell32/shelllink.h index 3ccfd3df61a..96d3b12dc71 100644 --- a/dll/win32/shell32/shelllink.h +++ b/dll/win32/shell32/shelllink.h @@ -76,7 +76,7 @@ private: BOOL bDirty; INT iIdOpen; /* id of the "Open" entry in the context menu */ CComPtr site; - IDropTarget *mDropTarget; + CComPtr mDropTarget; public: CShellLink(); ~CShellLink(); diff --git a/dll/win32/shell32/shellord.cpp b/dll/win32/shell32/shellord.cpp index 8c7b541a8b4..7f395029f30 100644 --- a/dll/win32/shell32/shellord.cpp +++ b/dll/win32/shell32/shellord.cpp @@ -2275,10 +2275,11 @@ EXTERN_C HRESULT WINAPI SHGetImageList(int iImageList, REFIID riid, void **ppv) /* Get the interface for the new image list */ if (hNew) { - IImageList *imageList = (IImageList*) hNew; + IImageList *imageList = reinterpret_cast(hNew); ret = imageList->QueryInterface(riid, ppv); - ImageList_Destroy(hNew); + // Since we are not duplicating, destroying makes no sense. + /* ImageList_Destroy(hNew); */ } return ret; diff --git a/dll/win32/shell32/shlexec.cpp b/dll/win32/shell32/shlexec.cpp index 555c0989b90..f850ead46eb 100644 --- a/dll/win32/shell32/shlexec.cpp +++ b/dll/win32/shell32/shlexec.cpp @@ -1274,8 +1274,8 @@ static HKEY ShellExecute_GetClassKey(const SHELLEXECUTEINFOW *sei) static IDataObject *shellex_get_dataobj( LPSHELLEXECUTEINFOW sei ) { LPCITEMIDLIST pidllast = NULL; - IDataObject *dataobj = NULL; - IShellFolder *shf = NULL; + CComPtr dataobj; + CComPtr shf; LPITEMIDLIST pidl = NULL; HRESULT r; @@ -1303,15 +1303,13 @@ static IDataObject *shellex_get_dataobj( LPSHELLEXECUTEINFOW sei ) end: if (pidl != sei->lpIDList) ILFree(pidl); - if (shf) - shf->Release(); - return dataobj; + return dataobj.Detach(); } static HRESULT shellex_run_context_menu_default(IShellExtInit *obj, LPSHELLEXECUTEINFOW sei) { - IContextMenu *cm = NULL; + CComPtr cm = NULL; CMINVOKECOMMANDINFOEX ici; MENUITEMINFOW info; WCHAR string[0x80]; @@ -1374,13 +1372,12 @@ static HRESULT shellex_run_context_menu_default(IShellExtInit *obj, end: if (hmenu) DestroyMenu( hmenu ); - if (cm) - cm->Release(); return r; } static HRESULT shellex_load_object_and_run(HKEY hkey, LPCGUID guid, LPSHELLEXECUTEINFOW sei) { + // Can not use CComPtr here because of CoUninitialize at the end, before the destructors would run. IDataObject *dataobj = NULL; IObjectWithSite *ows = NULL; IShellExtInit *obj = NULL; diff --git a/dll/win32/shell32/shlfolder.cpp b/dll/win32/shell32/shlfolder.cpp index c367c8645dd..99f6874624a 100644 --- a/dll/win32/shell32/shlfolder.cpp +++ b/dll/win32/shell32/shlfolder.cpp @@ -204,7 +204,7 @@ static HRESULT SHELL32_CoCreateInitSF (LPCITEMIDLIST pidlRoot, LPCWSTR pathRoot, LPCITEMIDLIST pidlChild, REFCLSID clsid, LPVOID * ppvOut) { HRESULT hr; - IShellFolder* pShellFolder = NULL; + CComPtr pShellFolder; TRACE ("%p %s %p\n", pidlRoot, debugstr_w(pathRoot), pidlChild); @@ -250,7 +250,7 @@ static HRESULT SHELL32_CoCreateInitSF (LPCITEMIDLIST pidlRoot, LPCWSTR pathRoot, ILFree (pidlAbsolute); } - *ppvOut = pShellFolder; + *ppvOut = pShellFolder.Detach(); TRACE ("-- (%p) ret=0x%08x\n", *ppvOut, hr); @@ -490,12 +490,11 @@ HRESULT SHELL32_GetItemAttributes (IShellFolder * psf, LPCITEMIDLIST pidl, LPDWO CComPtr psf2; if (SUCCEEDED(psf->BindToObject(pidl, 0, IID_PPV_ARG(IShellFolder, &psf2)))) { - IEnumIDList *pEnumIL = NULL; + CComPtr pEnumIL; if (SUCCEEDED(psf2->EnumObjects(0, SHCONTF_FOLDERS, &pEnumIL))) { if (pEnumIL->Skip(1) != S_OK) *pdwAttributes &= ~SFGAO_HASSUBFOLDER; - pEnumIL->Release(); } } } diff --git a/dll/win32/shell32/shlmenu.cpp b/dll/win32/shell32/shlmenu.cpp index 9ef53291217..3b47ef2d4c5 100644 --- a/dll/win32/shell32/shlmenu.cpp +++ b/dll/win32/shell32/shlmenu.cpp @@ -114,7 +114,9 @@ static LPFMINFO FM_SetMenuParameter( * */ static int FM_InitMenuPopup(HMENU hmenu, LPCITEMIDLIST pAlternatePidl) -{ IShellFolder *lpsf, *lpsf2; +{ + CComPtr lpsf; + CComPtr lpsf2; ULONG ulItemAttr = SFGAO_FOLDER; UINT uID, uEnumFlags; LPFNFMCALLBACK lpfnCallback; @@ -129,23 +131,23 @@ static int FM_InitMenuPopup(HMENU hmenu, LPCITEMIDLIST pAlternatePidl) MenuInfo.cbSize = sizeof(MENUINFO); MenuInfo.fMask = MIM_MENUDATA; - if (! GetMenuInfo(hmenu, &MenuInfo)) - return FALSE; + if (!GetMenuInfo(hmenu, &MenuInfo)) + return FALSE; - menudata = (LPFMINFO)MenuInfo.dwMenuData; + menudata = (LPFMINFO) MenuInfo.dwMenuData; if ((menudata == 0) || (MenuInfo.cbSize != sizeof(MENUINFO))) { - ERR("menudata corrupt: %p %u\n", menudata, MenuInfo.cbSize); - return 0; + ERR("menudata corrupt: %p %u\n", menudata, MenuInfo.cbSize); + return 0; } if (menudata->bInitialized) - return 0; + return 0; - pidl = (pAlternatePidl? pAlternatePidl: menudata->pidl); + pidl = (pAlternatePidl ? pAlternatePidl : menudata->pidl); if (!pidl) - return 0; + return 0; uID = menudata->uID; uEnumFlags = menudata->uEnumFlags; @@ -154,73 +156,70 @@ static int FM_InitMenuPopup(HMENU hmenu, LPCITEMIDLIST pAlternatePidl) SetMenuInfo(hmenu, &MenuInfo); - if (SUCCEEDED (SHGetDesktopFolder(&lpsf))) + if (SUCCEEDED(SHGetDesktopFolder(&lpsf))) { - if (SUCCEEDED(lpsf->BindToObject(pidl, 0, IID_PPV_ARG(IShellFolder, &lpsf2)))) - { - IEnumIDList *lpe = NULL; - - if (SUCCEEDED (lpsf2->EnumObjects(0, uEnumFlags, &lpe ))) + if (SUCCEEDED(lpsf->BindToObject(pidl, 0, IID_PPV_ARG(IShellFolder, &lpsf2)))) { + CComPtr lpe; - LPITEMIDLIST pidlTemp = NULL; - ULONG ulFetched; + if (SUCCEEDED(lpsf2->EnumObjects(0, uEnumFlags, &lpe))) + { - while ((!bAbortInit) && (S_OK == lpe->Next(1,&pidlTemp,&ulFetched))) - { - if (SUCCEEDED (lpsf->GetAttributesOf(1, (LPCITEMIDLIST*)&pidlTemp, &ulItemAttr))) - { - ILGetDisplayNameExW(NULL, pidlTemp, sTemp, ILGDN_FORPARSING); - if (! (PidlToSicIndex(lpsf, pidlTemp, FALSE, 0, &iIcon))) - iIcon = FM_BLANK_ICON; - if ( SFGAO_FOLDER & ulItemAttr) - { - LPFMINFO lpFmMi; - MENUINFO MenuInfo; - HMENU hMenuPopup = CreatePopupMenu(); + LPITEMIDLIST pidlTemp = NULL; + ULONG ulFetched; - lpFmMi = (LPFMINFO)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(FMINFO)); + while ((!bAbortInit) && (S_OK == lpe->Next(1, &pidlTemp, &ulFetched))) + { + if (SUCCEEDED(lpsf->GetAttributesOf(1, (LPCITEMIDLIST*) &pidlTemp, &ulItemAttr))) + { + ILGetDisplayNameExW(NULL, pidlTemp, sTemp, ILGDN_FORPARSING); + if (!(PidlToSicIndex(lpsf, pidlTemp, FALSE, 0, &iIcon))) + iIcon = FM_BLANK_ICON; + if (SFGAO_FOLDER & ulItemAttr) + { + LPFMINFO lpFmMi; + MENUINFO MenuInfo; + HMENU hMenuPopup = CreatePopupMenu(); - lpFmMi->pidl = ILCombine(pidl, pidlTemp); - lpFmMi->uEnumFlags = SHCONTF_FOLDERS | SHCONTF_NONFOLDERS; + lpFmMi = (LPFMINFO) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(FMINFO)); - MenuInfo.cbSize = sizeof(MENUINFO); - MenuInfo.fMask = MIM_MENUDATA; - MenuInfo.dwMenuData = (ULONG_PTR) lpFmMi; - SetMenuInfo (hMenuPopup, &MenuInfo); + lpFmMi->pidl = ILCombine(pidl, pidlTemp); + lpFmMi->uEnumFlags = SHCONTF_FOLDERS | SHCONTF_NONFOLDERS; - FileMenu_AppendItemW (hmenu, sTemp, uID, iIcon, hMenuPopup, FM_DEFAULT_HEIGHT); - } - else - { - LPWSTR pExt = PathFindExtensionW(sTemp); - if (pExt) - *pExt = 0; - FileMenu_AppendItemW (hmenu, sTemp, uID, iIcon, 0, FM_DEFAULT_HEIGHT); - } + MenuInfo.cbSize = sizeof(MENUINFO); + MenuInfo.fMask = MIM_MENUDATA; + MenuInfo.dwMenuData = (ULONG_PTR) lpFmMi; + SetMenuInfo(hMenuPopup, &MenuInfo); + + FileMenu_AppendItemW(hmenu, sTemp, uID, iIcon, hMenuPopup, FM_DEFAULT_HEIGHT); + } + else + { + LPWSTR pExt = PathFindExtensionW(sTemp); + if (pExt) + *pExt = 0; + FileMenu_AppendItemW(hmenu, sTemp, uID, iIcon, 0, FM_DEFAULT_HEIGHT); + } + } + + if (lpfnCallback) + { + TRACE("enter callback\n"); + lpfnCallback(pidl, pidlTemp); + TRACE("leave callback\n"); + } + + NumberOfItems++; + } + } } - - if (lpfnCallback) - { - TRACE("enter callback\n"); - lpfnCallback ( pidl, pidlTemp); - TRACE("leave callback\n"); - } - - NumberOfItems++; - } - lpe->Release(); - } - lpsf2->Release(); - } - lpsf->Release(); } - if ( GetMenuItemCount (hmenu) == 0 ) + if (GetMenuItemCount(hmenu) == 0) { - static const WCHAR szEmpty[] = { '(','e','m','p','t','y',')',0 }; - FileMenu_AppendItemW (hmenu, szEmpty, uID, FM_BLANK_ICON, 0, FM_DEFAULT_HEIGHT); - NumberOfItems++; + static const WCHAR szEmpty [] = { '(', 'e', 'm', 'p', 't', 'y', ')', 0 }; + FileMenu_AppendItemW(hmenu, szEmpty, uID, FM_BLANK_ICON, 0, FM_DEFAULT_HEIGHT); + NumberOfItems++; } menudata->bInitialized = TRUE; @@ -228,6 +227,7 @@ static int FM_InitMenuPopup(HMENU hmenu, LPCITEMIDLIST pAlternatePidl) return NumberOfItems; } + /************************************************************************* * FileMenu_Create [SHELL32.114] * diff --git a/dll/win32/shell32/shlview.cpp b/dll/win32/shell32/shlview.cpp index decb830a91d..695888ed19f 100644 --- a/dll/win32/shell32/shlview.cpp +++ b/dll/win32/shell32/shlview.cpp @@ -1761,7 +1761,7 @@ LRESULT CDefView::OnNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandl if (SUCCEEDED(m_pSFParent->GetUIObjectOf(m_hWnd, m_cidl, (LPCITEMIDLIST*)m_apidl, IID_NULL_PPV_ARG(IDataObject, &pda)))) { - IDropSource * pds = (IDropSource *)this; /* own DropSource interface */ + CComPtr pds = static_cast(this); /* own DropSource interface */ if (SUCCEEDED(m_pSFParent->GetAttributesOf(m_cidl, (LPCITEMIDLIST*)m_apidl, &dwAttributes))) {