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);
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",
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]);
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;