[SHELL32]
[reactos.git] / reactos / dll / win32 / shell32 / folders / CControlPanelFolder.cpp
index 35db9c2..661b147 100644 (file)
@@ -125,6 +125,31 @@ static PIDLCPanelStruct *_ILGetCPanelPointer(LPCITEMIDLIST pidl)
     return NULL;
 }
 
+HRESULT CCPLExtractIcon_CreateInstance(LPCITEMIDLIST pidlRoot, LPCITEMIDLIST pidl, REFIID riid, LPVOID * ppvOut)
+{
+    PIDLCPanelStruct *pData = _ILGetCPanelPointer(pidl);
+    if (!pData)
+    {
+        LPITEMIDLIST pidlComplete = ILCombine(pidlRoot, pidl);
+        if (!pidlComplete)
+            return E_OUTOFMEMORY;
+
+        *ppvOut = IExtractIconW_Constructor(pidlComplete);
+
+        SHFree(pidlComplete);
+        return *ppvOut ? S_OK : E_FAIL;
+    }
+
+    CComPtr<IDefaultExtractIconInit> initIcon;
+    HRESULT hr = SHCreateDefaultExtractIcon(IID_PPV_ARG(IDefaultExtractIconInit, &initIcon));
+    if (FAILED(hr))
+        return NULL;
+
+    initIcon->SetNormalIcon(pData->szName, (int)pData->iconIdx != -1 ? pData->iconIdx : 0);
+
+    return initIcon->QueryInterface(riid, ppvOut);
+}
+
 BOOL CControlPanelEnum::RegisterCPanelApp(LPCWSTR wpath)
 {
     CPlApplet* applet = Control_LoadApplet(0, wpath, NULL);
@@ -455,7 +480,7 @@ HRESULT WINAPI CControlPanelFolder::GetUIObjectOf(HWND hwndOwner,
         UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT * prgfInOut, LPVOID * ppvOut)
 {
     LPITEMIDLIST pidl;
-    IUnknown *pObj = NULL;
+    LPVOID pObj = NULL;
     HRESULT hr = E_INVALIDARG;
 
     TRACE("(%p)->(%p,%u,apidl=%p,%s,%p,%p)\n",
@@ -482,16 +507,9 @@ HRESULT WINAPI CControlPanelFolder::GetUIObjectOf(HWND hwndOwner,
                 hr = CDefFolderMenu_Create2(pidlRoot, hwndOwner, cidl, apidl, (IShellFolder*)this, NULL, 0, NULL, (IContextMenu**)&pObj);
         } else if (IsEqualIID(riid, IID_IDataObject) && (cidl >= 1)) {
             hr = IDataObject_Constructor(hwndOwner, pidlRoot, apidl, cidl, (IDataObject **)&pObj);
-        } else if (IsEqualIID(riid, IID_IExtractIconA) && (cidl == 1)) {
-            pidl = ILCombine(pidlRoot, apidl[0]);
-            pObj = IExtractIconA_Constructor(pidl);
-            SHFree(pidl);
-            hr = S_OK;
-        } else if (IsEqualIID(riid, IID_IExtractIconW) && (cidl == 1)) {
-            pidl = ILCombine(pidlRoot, apidl[0]);
-            pObj = IExtractIconW_Constructor(pidl);
-            SHFree(pidl);
-            hr = S_OK;
+        } else if ((IsEqualIID(riid, IID_IExtractIconA) || IsEqualIID(riid, IID_IExtractIconW)) && (cidl == 1)) {
+            hr = CCPLExtractIcon_CreateInstance(pidlRoot, apidl[0], riid, &pObj);
+
         } else if ((IsEqualIID(riid, IID_IShellLinkW) || IsEqualIID(riid, IID_IShellLinkA))
                    && (cidl == 1)) {
             pidl = ILCombine(pidlRoot, apidl[0]);
@@ -669,20 +687,6 @@ HRESULT WINAPI CControlPanelFolder::GetCurFolder(LPITEMIDLIST * pidl)
     return S_OK;
 }
 
-HRESULT CPanel_GetIconLocationW(LPCITEMIDLIST pidl, LPWSTR szIconFile, UINT cchMax, int* piIndex)
-{
-    PIDLCPanelStruct* pcpanel = _ILGetCPanelPointer(pidl);
-
-    if (!pcpanel)
-        return E_INVALIDARG;
-
-    wcsncpy(szIconFile, pcpanel->szName, cchMax);
-    *piIndex = (int)pcpanel->iconIdx != -1 ? pcpanel->iconIdx : 0;
-
-    return S_OK;
-}
-
-
 CCPLItemMenu::CCPLItemMenu()
 {
     m_apidl = NULL;