HRESULT WINAPI SHCreateShellItemArrayFromShellItem(IShellItem *psi, REFIID riid, void **ppv) { IShellItemArrayImpl *This; IShellItem **array; HRESULT ret; TRACE("%p, %s, %p\n", psi, shdebugstr_guid(riid), ppv); array = HeapAlloc(GetProcessHeap(), 0, sizeof(IShellItem*)); if(!array) return E_OUTOFMEMORY; ret = IShellItemArray_Constructor(NULL, riid, (void**)&This); if(SUCCEEDED(ret)) { array[0] = psi; IShellItem_AddRef(psi); This->array = array; This->item_count = 1; *ppv = This; } else { HeapFree(GetProcessHeap(), 0, array); *ppv = NULL; } return ret; }
static HRESULT WINAPI IShellItemArray_fnGetItemAt(IShellItemArray *iface, DWORD dwIndex, IShellItem **ppsi) { IShellItemArrayImpl *This = impl_from_IShellItemArray(iface); TRACE("%p (%x, %p)\n", This, dwIndex, ppsi); /* zero indexed */ if(dwIndex + 1 > This->item_count) return E_FAIL; *ppsi = This->array[dwIndex]; IShellItem_AddRef(*ppsi); return S_OK; }
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; }