HRESULT WINAPI SHCreateItemFromParsingName(PCWSTR pszPath, IBindCtx *pbc, REFIID riid, void **ppv) { LPITEMIDLIST pidl; HRESULT ret; *ppv = NULL; ret = SHParseDisplayName(pszPath, pbc, &pidl, 0, NULL); if(SUCCEEDED(ret)) { ShellItem *This; ret = IShellItem_Constructor(NULL, riid, (void**)&This); if(SUCCEEDED(ret)) { This->pidl = pidl; *ppv = (void*)This; } else { ILFree(pidl); } } return ret; }
HRESULT WINAPI SHCreateItemFromIDList(PCIDLIST_ABSOLUTE pidl, REFIID riid, void **ppv) { ShellItem *psiimpl; HRESULT ret; if(!pidl) return E_INVALIDARG; ret = IShellItem_Constructor(NULL, riid, ppv); if(SUCCEEDED(ret)) { psiimpl = (ShellItem*)*ppv; psiimpl->pidl = ILClone(pidl); } return ret; }
HRESULT WINAPI SHCreateItemFromIDList(PCIDLIST_ABSOLUTE pidl, REFIID riid, void **ppv) { IPersistIDList *persist; HRESULT ret; if(!pidl) return E_INVALIDARG; *ppv = NULL; ret = IShellItem_Constructor(NULL, &IID_IPersistIDList, (void**)&persist); if(FAILED(ret)) return ret; ret = IPersistIDList_SetIDList(persist, pidl); if(FAILED(ret)) { IPersistIDList_Release(persist); return ret; } ret = IPersistIDList_QueryInterface(persist, riid, ppv); IPersistIDList_Release(persist); return ret; }
HRESULT WINAPI SHCreateShellItem(LPCITEMIDLIST pidlParent, IShellFolder *psfParent, LPCITEMIDLIST pidl, IShellItem **ppsi) { ShellItem *This; LPITEMIDLIST new_pidl; HRESULT ret; TRACE("(%p,%p,%p,%p)\n", pidlParent, psfParent, pidl, ppsi); *ppsi = NULL; if (!pidl) { return E_INVALIDARG; } else if (pidlParent || psfParent) { LPITEMIDLIST temp_parent=NULL; if (!pidlParent) { IPersistFolder2* ppf2Parent; if (FAILED(IShellFolder_QueryInterface(psfParent, &IID_IPersistFolder2, (void**)&ppf2Parent))) { FIXME("couldn't get IPersistFolder2 interface of parent\n"); return E_NOINTERFACE; } if (FAILED(IPersistFolder2_GetCurFolder(ppf2Parent, &temp_parent))) { FIXME("couldn't get parent PIDL\n"); IPersistFolder2_Release(ppf2Parent); return E_NOINTERFACE; } pidlParent = temp_parent; IPersistFolder2_Release(ppf2Parent); } new_pidl = ILCombine(pidlParent, pidl); ILFree(temp_parent); if (!new_pidl) return E_OUTOFMEMORY; } else { new_pidl = ILClone(pidl); if (!new_pidl) return E_OUTOFMEMORY; } ret = IShellItem_Constructor(NULL, &IID_IShellItem, (void**)&This); if (This) { *ppsi = (IShellItem*)&This->IShellItem2_iface; This->pidl = new_pidl; } else { ILFree(new_pidl); } return ret; }