[SHELL32]
authorDavid Quintana <gigaherz@gmail.com>
Wed, 20 Aug 2014 12:25:09 +0000 (12:25 +0000)
committerDavid Quintana <gigaherz@gmail.com>
Wed, 20 Aug 2014 12:25:09 +0000 (12:25 +0000)
* Another batch of interface pointers converted to CComPtr.

svn path=/branches/shell-experiments/; revision=63909

12 files changed:
dll/win32/shell32/brsfolder.cpp
dll/win32/shell32/defcontextmenu.cpp
dll/win32/shell32/folders.cpp
dll/win32/shell32/newmenu.cpp
dll/win32/shell32/newmenu.h
dll/win32/shell32/pidl.cpp
dll/win32/shell32/shelllink.h
dll/win32/shell32/shellord.cpp
dll/win32/shell32/shlexec.cpp
dll/win32/shell32/shlfolder.cpp
dll/win32/shell32/shlmenu.cpp
dll/win32/shell32/shlview.cpp

index a8fde0f..678d3b4 100644 (file)
@@ -177,8 +177,9 @@ static void InitializeTreeView( browse_info *info )
     LPITEMIDLIST pidlParent, pidlChild;
     HIMAGELIST hImageList;
     HRESULT hr;
-    IShellFolder *lpsfParent, *lpsfRoot;
-    IEnumIDList * pEnumChildren = NULL;
+    CComPtr<IShellFolder> lpsfParent;
+    CComPtr<IShellFolder> lpsfRoot;
+    CComPtr<IEnumIDList> 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<IEnumIDList> pEnumIL;
+        CComPtr<IShellFolder> 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<IShellFolder> lpsf2;
     LPTV_ITEMDATA lptvid = (LPTV_ITEMDATA) pnmtv->itemNew.lParam;
     HRESULT r;
 
index 418dcc3..36fba89 100644 (file)
@@ -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<IShellView> 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;
 }
 
index aedae6c..913d657 100644 (file)
@@ -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<IEnumIDList> EnumIDList;
             CoInitialize(NULL);
 
-            IShellFolder2 *psfRecycleBin = NULL;
-            IShellFolder *psfDesktop = NULL;
+            CComPtr<IShellFolder2> psfRecycleBin;
+            CComPtr<IShellFolder> 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))
index 53dc802..5b16681 100644 (file)
@@ -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<IShellView> lpSV = NULL;
+    CComPtr<IShellBrowser> lpSB;
+    CComPtr<IShellView> lpSV;
     HRESULT hr = E_FAIL;
 
     /* Note: CWM_GETISHELLBROWSER returns shell browser without adding reference */
index 88b2982..3f0fde3 100644 (file)
@@ -54,7 +54,7 @@ private:
     LPWSTR m_wszPath;
     SHELLNEW_ITEM *m_pItems;
     SHELLNEW_ITEM *m_pLinkItem;
-    IUnknown *m_pSite;
+    CComPtr<IUnknown> m_pSite;
     HMENU m_hSubMenu;
     HBITMAP m_hbmFolder, m_hbmLink;
 
index 837d694..6b9f0af 100644 (file)
@@ -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<IShellFolder>        psfParent;
-    IShellFolder * lsf = psf;
+    CComPtr<IShellFolder> 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);
 }
 
index 3ccfd3d..96d3b12 100644 (file)
@@ -76,7 +76,7 @@ private:
     BOOL          bDirty;
     INT           iIdOpen;  /* id of the "Open" entry in the context menu */
     CComPtr<IUnknown>        site;
-    IDropTarget   *mDropTarget;
+    CComPtr<IDropTarget>   mDropTarget;
 public:
     CShellLink();
     ~CShellLink();
index 8c7b541..7f39502 100644 (file)
@@ -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<IImageList*>(hNew);
         ret = imageList->QueryInterface(riid, ppv);
 
-        ImageList_Destroy(hNew);
+        // Since we are not duplicating, destroying makes no sense.
+        /* ImageList_Destroy(hNew); */
     }
 
     return ret;
index 555c098..f850ead 100644 (file)
@@ -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<IDataObject> dataobj;
+    CComPtr<IShellFolder> 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<IContextMenu> 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;
index c367c86..99f6874 100644 (file)
@@ -204,7 +204,7 @@ static HRESULT SHELL32_CoCreateInitSF (LPCITEMIDLIST pidlRoot, LPCWSTR pathRoot,
                 LPCITEMIDLIST pidlChild, REFCLSID clsid, LPVOID * ppvOut)
 {
     HRESULT hr;
-    IShellFolder* pShellFolder = NULL;
+    CComPtr<IShellFolder> 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<IShellFolder> psf2;
             if (SUCCEEDED(psf->BindToObject(pidl, 0, IID_PPV_ARG(IShellFolder, &psf2))))
             {
-                IEnumIDList *pEnumIL = NULL;
+                CComPtr<IEnumIDList> pEnumIL;
                 if (SUCCEEDED(psf2->EnumObjects(0, SHCONTF_FOLDERS, &pEnumIL)))
                 {
                     if (pEnumIL->Skip(1) != S_OK)
                         *pdwAttributes &= ~SFGAO_HASSUBFOLDER;
-                    pEnumIL->Release();
                 }
             }
         }
index 9ef5329..3b47ef2 100644 (file)
@@ -114,7 +114,9 @@ static LPFMINFO FM_SetMenuParameter(
  *
  */
 static int FM_InitMenuPopup(HMENU hmenu, LPCITEMIDLIST pAlternatePidl)
-{    IShellFolder    *lpsf, *lpsf2;
+{
+    CComPtr<IShellFolder> lpsf;
+    CComPtr<IShellFolder> 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 )))
-        {
-
-          LPITEMIDLIST pidlTemp = NULL;
-          ULONG ulFetched;
-
-          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 = (LPFMINFO)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(FMINFO));
-
-            lpFmMi->pidl = ILCombine(pidl, pidlTemp);
-            lpFmMi->uEnumFlags = SHCONTF_FOLDERS | SHCONTF_NONFOLDERS;
-
-            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)
+        if (SUCCEEDED(lpsf->BindToObject(pidl, 0, IID_PPV_ARG(IShellFolder, &lpsf2))))
         {
-          TRACE("enter callback\n");
-          lpfnCallback ( pidl, pidlTemp);
-          TRACE("leave callback\n");
+            CComPtr<IEnumIDList> lpe;
+
+            if (SUCCEEDED(lpsf2->EnumObjects(0, uEnumFlags, &lpe)))
+            {
+
+                LPITEMIDLIST pidlTemp = NULL;
+                ULONG ulFetched;
+
+                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 = (LPFMINFO) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(FMINFO));
+
+                            lpFmMi->pidl = ILCombine(pidl, pidlTemp);
+                            lpFmMi->uEnumFlags = SHCONTF_FOLDERS | SHCONTF_NONFOLDERS;
+
+                            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++;
+                }
+            }
         }
-
-        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]
  *
index decb830..695888e 100644 (file)
@@ -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<IDropSource> pds = static_cast<IDropSource *>(this);    /* own DropSource interface */
 
                     if (SUCCEEDED(m_pSFParent->GetAttributesOf(m_cidl, (LPCITEMIDLIST*)m_apidl, &dwAttributes)))
                     {