HRESULT WINAPI SHCreateShellItemArrayFromDataObject(IDataObject *pdo, REFIID riid, void **ppv) { IShellItemArray *psia; FORMATETC fmt; STGMEDIUM medium; HRESULT ret; TRACE("%p, %s, %p\n", pdo, shdebugstr_guid(riid), ppv); if(!pdo) return E_INVALIDARG; *ppv = NULL; fmt.cfFormat = RegisterClipboardFormatW(CFSTR_SHELLIDLISTW); fmt.ptd = NULL; fmt.dwAspect = DVASPECT_CONTENT; fmt.lindex = -1; fmt.tymed = TYMED_HGLOBAL; ret = IDataObject_GetData(pdo, &fmt, &medium); if(SUCCEEDED(ret)) { LPIDA pida = GlobalLock(medium.u.hGlobal); LPCITEMIDLIST parent_pidl; LPCITEMIDLIST *children; UINT i; TRACE("Converting %d objects.\n", pida->cidl); parent_pidl = (LPCITEMIDLIST) ((LPBYTE)pida+pida->aoffset[0]); children = HeapAlloc(GetProcessHeap(), 0, sizeof(LPCITEMIDLIST)*pida->cidl); for(i = 0; i < pida->cidl; i++) children[i] = (LPCITEMIDLIST) ((LPBYTE)pida+pida->aoffset[i+1]); ret = SHCreateShellItemArray(parent_pidl, NULL, pida->cidl, children, &psia); HeapFree(GetProcessHeap(), 0, children); GlobalUnlock(medium.u.hGlobal); GlobalFree(medium.u.hGlobal); } if(SUCCEEDED(ret)) { ret = IShellItemArray_QueryInterface(psia, riid, ppv); IShellItemArray_Release(psia); } return ret; }
HRESULT WINAPI SHCreateShellItemArrayFromShellItem(IShellItem *item, REFIID riid, void **ppv) { IShellItemArray *array; HRESULT ret; TRACE("%p, %s, %p\n", item, shdebugstr_guid(riid), ppv); *ppv = NULL; IShellItem_AddRef(item); ret = create_shellitemarray(&item, 1, &array); if(FAILED(ret)) { IShellItem_Release(item); return ret; } ret = IShellItemArray_QueryInterface(array, riid, ppv); IShellItemArray_Release(array); return ret; }
static HRESULT IShellItemArray_Constructor(IUnknown *pUnkOuter, REFIID riid, void **ppv) { IShellItemArrayImpl *This; HRESULT ret; TRACE("(%p, %s, %p)\n",pUnkOuter, debugstr_guid(riid), ppv); if(pUnkOuter) return CLASS_E_NOAGGREGATION; This = HeapAlloc(GetProcessHeap(), 0, sizeof(IShellItemArrayImpl)); if(!This) return E_OUTOFMEMORY; This->ref = 1; This->IShellItemArray_iface.lpVtbl = &vt_IShellItemArray; This->array = NULL; This->item_count = 0; ret = IShellItemArray_QueryInterface(&This->IShellItemArray_iface, riid, ppv); IShellItemArray_Release(&This->IShellItemArray_iface); return ret; }