@@ -62,7 +62,7 @@ SHCreateItemFromParsingName(
6262 _In_ REFIID riid,
6363 _Out_ void **ppv)
6464{
65- LPITEMIDLIST pidl = NULL ;
65+ CComHeapPtr< ITEMIDLIST > pidl;
6666 HRESULT hr;
6767
6868 TRACE (" (%s,%p,%s,%p)\n " , debugstr_w (pszPath), pbc, debugstr_guid (&riid), ppv);
@@ -73,10 +73,8 @@ SHCreateItemFromParsingName(
7373
7474 hr = SHParseDisplayName (pszPath, pbc, &pidl, 0 , NULL );
7575 if (SUCCEEDED (hr))
76- {
7776 hr = SHCreateItemFromIDList (pidl, riid, ppv);
78- ILFree (pidl);
79- }
77+
8078 return hr;
8179}
8280
@@ -94,8 +92,8 @@ SHCreateItemFromRelativeName(
9492{
9593 CComPtr<IShellFolder> desktop;
9694 CComPtr<IShellFolder> folder;
97- LPITEMIDLIST pidlFolder = NULL ;
98- LPITEMIDLIST pidlChild = NULL ;
95+ CComHeapPtr< ITEMIDLIST > pidlFolder;
96+ CComHeapPtr< ITEMIDLIST > pidlChild;
9997 HRESULT hr;
10098
10199 TRACE (" (%p,%s,%p,%s,%p)\n " , parent, debugstr_w (pszName), pbc, debugstr_guid (&riid), ppv);
@@ -113,28 +111,23 @@ SHCreateItemFromRelativeName(
113111
114112 hr = SHGetDesktopFolder (&desktop);
115113 if (FAILED_UNEXPECTEDLY (hr))
116- goto cleanup ;
114+ return hr ;
117115
118116 if (!_ILIsDesktop (pidlFolder))
119117 {
120118 hr = desktop->BindToObject (pidlFolder, NULL , IID_PPV_ARG (IShellFolder, &folder));
121119 if (FAILED_UNEXPECTEDLY (hr))
122- goto cleanup ;
120+ return hr ;
123121 }
124122
125123 {
126124 IShellFolder *psfBind = folder.p ? folder.p : desktop.p ;
127125 hr = psfBind->ParseDisplayName (NULL , pbc, const_cast <LPWSTR >(pszName), NULL , &pidlChild, NULL );
128126 }
129127 if (FAILED_UNEXPECTEDLY (hr))
130- goto cleanup;
131-
132- hr = SHCreateItemFromIDList (pidlChild, riid, ppv);
128+ return hr;
133129
134- cleanup:
135- ILFree (pidlFolder);
136- ILFree (pidlChild);
137- return hr;
130+ return SHCreateItemFromIDList (pidlChild, riid, ppv);
138131}
139132
140133/* **********************************************************************
@@ -155,7 +148,7 @@ SHCreateItemInKnownFolder(
155148 // TODO: Import SHGetKnownFolderIDList from wine
156149#if 0
157150 CComPtr<IShellItem> parent;
158- LPITEMIDLIST pidl = NULL ;
151+ CComHeapPtr<ITEMIDLIST> pidl;
159152 HRESULT hr;
160153
161154 TRACE("(%s,%lx,%s,%s,%p)\n", debugstr_guid(&kfid), dwFlags, debugstr_w(pszFileName),
@@ -170,8 +163,6 @@ SHCreateItemInKnownFolder(
170163 return hr;
171164
172165 hr = SHCreateItemFromIDList(pidl, IID_PPV_ARG(IShellItem, &parent));
173- ILFree(pidl);
174- pidl = NULL;
175166 if (FAILED_UNEXPECTEDLY(hr))
176167 return hr;
177168
@@ -228,23 +219,12 @@ SHCreateShellItemArray(
228219 if (SUCCEEDED (hr))
229220 {
230221 hr = CreateShellItemArrayFromItems (array, cidl, IID_PPV_ARG (IShellItemArray, ppsiItemArray));
231- if (SUCCEEDED (hr))
232- {
233- for (UINT i = 0 ; i < cidl; ++i)
234- {
235- if (array[i])
236- array[i]->Release ();
237- }
238- }
239222 }
240223
241- if ( FAILED_UNEXPECTEDLY (hr) )
224+ for ( UINT i = 0 ; i < cidl; ++i )
242225 {
243- for (UINT i = 0 ; i < cidl; ++i)
244- {
245- if (array[i])
246- array[i]->Release ();
247- }
226+ if (array[i])
227+ array[i]->Release ();
248228 }
249229
250230 return hr;
@@ -289,23 +269,12 @@ SHCreateShellItemArrayFromIDLists(
289269 if (SUCCEEDED (hr))
290270 {
291271 hr = CreateShellItemArrayFromItems (array, cidl, IID_PPV_ARG (IShellItemArray, ppsiItemArray));
292- if (SUCCEEDED (hr))
293- {
294- for (UINT i = 0 ; i < cidl; ++i)
295- {
296- if (array[i])
297- array[i]->Release ();
298- }
299- }
300272 }
301273
302- if ( FAILED_UNEXPECTEDLY (hr) )
274+ for ( UINT i = 0 ; i < cidl; ++i )
303275 {
304- for (UINT i = 0 ; i < cidl; ++i)
305- {
306- if (array[i])
307- array[i]->Release ();
308- }
276+ if (array[i])
277+ array[i]->Release ();
309278 }
310279
311280 return hr;
@@ -349,17 +318,14 @@ SHCreateShellItemArrayFromDataObject(_In_ IDataObject *pdo, _In_ REFIID riid, _O
349318EXTERN_C HRESULT WINAPI
350319SHGetItemFromObject (_In_ IUnknown *punk, _In_ REFIID riid, _Out_ void **ppv)
351320{
352- LPITEMIDLIST pidl = NULL ;
321+ CComHeapPtr< ITEMIDLIST > pidl;
353322 HRESULT hr;
354323
355324 TRACE (" (%p,%s,%p)\n " , punk, debugstr_guid (&riid), ppv);
356325
357326 hr = SHGetIDListFromObject (punk, &pidl);
358327 if (SUCCEEDED (hr))
359- {
360328 hr = SHCreateItemFromIDList (pidl, riid, ppv);
361- ILFree (pidl);
362- }
363329 return hr;
364330}
365331
@@ -396,9 +362,8 @@ SHGetItemFromDataObject(
396362 if (pida && pida->cidl >= 1 &&
397363 ((pida->cidl > 1 && !(dwFlags & DOGIF_ONLY_IF_ONE )) || pida->cidl == 1 ))
398364 {
399- LPITEMIDLIST pidl = ILCombine (
400- (LPCITEMIDLIST )((LPBYTE )pida + pida->aoffset [0 ]),
401- (LPCITEMIDLIST )((LPBYTE )pida + pida->aoffset [1 ]));
365+ LPITEMIDLIST pidl = ILCombine (HIDA_GetPIDLFolder (pida),
366+ HIDA_GetPIDLItem (pida, 0 ));
402367 if (pidl)
403368 {
404369 hr = SHCreateItemFromIDList (pidl, riid, ppv);
@@ -411,6 +376,7 @@ SHGetItemFromDataObject(
411376 }
412377 else
413378 {
379+ TRACE (" Failed to create item, cidl=%u, dwFlags=%#x\n " , pida ? pida->cidl : 0 , dwFlags);
414380 hr = E_FAIL ;
415381 }
416382
0 commit comments