Skip to content

Commit 896a7bc

Browse files
committed
[SDK][SHELl32] Code review and adjustments
1 parent 603275d commit 896a7bc

10 files changed

Lines changed: 109 additions & 117 deletions

File tree

dll/win32/shell32/CShellItemArray.cpp

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,26 +14,35 @@ EXTERN_C HRESULT WINAPI SHCreateShellItem(
1414
* CShellItemArray
1515
*/
1616

17-
CShellItemArray::CShellItemArray() : m_pCIDA(NULL)
17+
CShellItemArray::CShellItemArray() : m_pHIDA(NULL)
1818
{
19-
m_Medium.tymed = TYMED_NULL;
2019
}
2120

2221
CShellItemArray::~CShellItemArray()
2322
{
24-
CDataObjectHIDA::DestroyCIDA(m_pCIDA, m_Medium);
23+
delete m_pHIDA;
2524
}
2625

2726
HRESULT
2827
CShellItemArray::Initialize(_In_ IDataObject *pdo)
2928
{
30-
return CDataObjectHIDA::CreateCIDA(pdo, &m_pCIDA, m_Medium);
29+
m_pHIDA = new CDataObjectHIDA(pdo);
30+
if (!m_pHIDA)
31+
return E_OUTOFMEMORY;
32+
33+
HRESULT hr = m_pHIDA->hr();
34+
if (FAILED(hr))
35+
{
36+
delete m_pHIDA;
37+
m_pHIDA = NULL;
38+
}
39+
return hr;
3140
}
3241

3342
UINT
3443
CShellItemArray::ItemCount() const
3544
{
36-
return m_pCIDA ? m_pCIDA->cidl : 0;
45+
return m_pHIDA ? (*m_pHIDA)->cidl : 0;
3746
}
3847

3948
STDMETHODIMP
@@ -83,12 +92,12 @@ CShellItemArray::GetItemAt(_In_ DWORD nIndex, _Out_ IShellItem **ppItem)
8392
if (!ppItem)
8493
return E_INVALIDARG;
8594
*ppItem = NULL;
86-
if (!m_pCIDA)
95+
if (!m_pHIDA)
8796
return E_UNEXPECTED;
8897
if (nIndex >= ItemCount())
8998
return E_FAIL;
90-
return SHCreateShellItem(HIDA_GetPIDLFolder(m_pCIDA), NULL,
91-
HIDA_GetPIDLItem(m_pCIDA, nIndex), ppItem);
99+
return SHCreateShellItem(HIDA_GetPIDLFolder(*m_pHIDA), NULL,
100+
HIDA_GetPIDLItem(*m_pHIDA, nIndex), ppItem);
92101
}
93102

94103
STDMETHODIMP

dll/win32/shell32/CShellItemArray.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,7 @@ class CShellItemArray :
77
public CComObjectRootEx<CComMultiThreadModelNoCS>,
88
public IShellItemArray
99
{
10-
CIDA *m_pCIDA;
11-
STGMEDIUM m_Medium;
10+
CDataObjectHIDA *m_pHIDA;
1211

1312
public:
1413
CShellItemArray();

dll/win32/shell32/CUserEventTimer.cpp

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(shell);
1313
* IUserEventTimerCallback implementation
1414
*/
1515

16-
HRESULT WINAPI CUserEventTimer::UserEventTimerProc(ULONG uUserEventTimerID, UINT uTimerElapse)
16+
STDMETHODIMP
17+
CUserEventTimer::UserEventTimerProc(ULONG uUserEventTimerID, UINT uTimerElapse)
1718
{
1819
UNIMPLEMENTED;
1920
return S_OK;
@@ -23,27 +24,31 @@ HRESULT WINAPI CUserEventTimer::UserEventTimerProc(ULONG uUserEventTimerID, UINT
2324
* IUserEventTimer implementation
2425
*/
2526

26-
HRESULT WINAPI CUserEventTimer::SetUserEventTimer(HWND hWnd, UINT uCallbackMsg, UINT uTimerElapse,
27-
IUserEventTimerCallback *pUserEventTimerCallback,
28-
ULONG *puUserEventTimerID)
27+
STDMETHODIMP
28+
CUserEventTimer::SetUserEventTimer(HWND hWnd, UINT uCallbackMsg, UINT uTimerElapse,
29+
IUserEventTimerCallback *pUserEventTimerCallback,
30+
ULONG *puUserEventTimerID)
2931
{
3032
UNIMPLEMENTED;
3133
return S_OK;
3234
}
3335

34-
HRESULT WINAPI CUserEventTimer::KillUserEventTimer(HWND hWnd, ULONG uUserEventTimerID)
36+
STDMETHODIMP
37+
CUserEventTimer::KillUserEventTimer(HWND hWnd, ULONG uUserEventTimerID)
3538
{
3639
UNIMPLEMENTED;
3740
return S_OK;
3841
}
3942

40-
HRESULT WINAPI CUserEventTimer::GetUserEventTimerElapsed(HWND hWnd, ULONG uUserEventTimerID, UINT *puTimerElapsed)
43+
STDMETHODIMP
44+
CUserEventTimer::GetUserEventTimerElapsed(HWND hWnd, ULONG uUserEventTimerID, UINT *puTimerElapsed)
4145
{
4246
UNIMPLEMENTED;
4347
return S_OK;
4448
}
4549

46-
HRESULT WINAPI CUserEventTimer::InitTimerTickInterval(UINT uTimerTickIntervalMs)
50+
STDMETHODIMP
51+
CUserEventTimer::InitTimerTickInterval(UINT uTimerTickIntervalMs)
4752
{
4853
UNIMPLEMENTED;
4954
return S_OK;

dll/win32/shell32/CUserEventTimer.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,15 @@ class CUserEventTimer :
1616
public:
1717

1818
/*** IUserEventTimerCallback methods ***/
19-
virtual HRESULT WINAPI UserEventTimerProc(ULONG uUserEventTimerID, UINT uTimerElapse);
19+
virtual STDMETHODIMP UserEventTimerProc(ULONG uUserEventTimerID, UINT uTimerElapse) override;
2020

2121
/*** IUserEventTimer methods ***/
22-
virtual HRESULT WINAPI SetUserEventTimer(HWND hWnd, UINT uCallbackMsg, UINT uTimerElapse,
22+
virtual STDMETHODIMP SetUserEventTimer(HWND hWnd, UINT uCallbackMsg, UINT uTimerElapse,
2323
IUserEventTimerCallback *pUserEventTimerCallback,
24-
ULONG *puUserEventTimerID);
25-
virtual HRESULT WINAPI KillUserEventTimer(HWND hWnd, ULONG uUserEventTimerID);
26-
virtual HRESULT WINAPI GetUserEventTimerElapsed(HWND hWnd, ULONG uUserEventTimerID, UINT *puTimerElapsed);
27-
virtual HRESULT WINAPI InitTimerTickInterval(UINT uTimerTickIntervalMs);
24+
ULONG *puUserEventTimerID) override;
25+
virtual STDMETHODIMP KillUserEventTimer(HWND hWnd, ULONG uUserEventTimerID) override;
26+
virtual STDMETHODIMP GetUserEventTimerElapsed(HWND hWnd, ULONG uUserEventTimerID, UINT *puTimerElapsed) override;
27+
virtual STDMETHODIMP InitTimerTickInterval(UINT uTimerTickIntervalMs) override;
2828

2929

3030
DECLARE_REGISTRY_RESOURCEID(IDR_USEREVENTTIMER)

dll/win32/shell32/shell32.spec

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -398,8 +398,22 @@
398398
871 stub -version=0x600+ -noname DUI_Shell32_EndDeferUninitialization
399399
872 stub -version=0x600+ -noname SHCreateKindFilter
400400
873 stub -version=0x600+ -noname SHIconIndexFromPIDL
401-
874 stub -version=0x600+ -noname SHLaunchSearch
401+
874 stub -version=0x600+ -noname SHLaunchSearch # Vista:874, Win7:886
402+
881 stub -noname -version=0x601+ SHEnumClassesOfCategories
403+
882 stub -noname -version=0x601+ SHWriteClassesOfCategories
404+
884 stub -noname -version=0x601+ SHDoDragDropWithPreferredEffect
405+
885 stdcall -noname -version=0x601+ RunInstallUninstallStubs()
402406
887 stub -noname -version=0x601+ SHExtCoCreateInstanceCheckCategory
407+
888 stub -noname -version=0x601+ SHLimitInputEndSubclass
408+
892 stub -noname -version=0x601+ GetSqmableFileName
409+
893 stub -noname -version=0x601+ SetWindowRelaunchProperties
410+
894 stub -noname -version=0x601+ MakeDestinationItem
411+
895 stdcall -noname -version=0x601+ GetAppPathFromLink(ptr wstr long)
412+
896 stub -noname -version=0x601+ ClearDestinationsForAllApps
413+
897 stub -noname -version=0x601+ SaveTopViewSettings
414+
899 stdcall -stub -noname -version=0x601+ SetExplorerServerMode(long)
415+
900 stub -noname -version=0x601+ GetAppIDRoot
416+
902 stub -noname -version=0x601+ IsSearchEnabled
403417

404418
# Automatically assigned ordinals:
405419
@ stdcall OpenAs_RunDLLA(long long str long) # 2k3:101, Vista:125
@@ -489,19 +503,19 @@
489503
@ stub -version=0x600+ SHCreateDefaultPropertiesOp # Vista:327
490504
@ stdcall SHCreateDirectoryExA(long str ptr) # 2k3:278, Vista:328
491505
@ stdcall SHCreateDirectoryExW(long wstr ptr) # 2k3:279, Vista:329
492-
@ stub -version=0x600+ SHCreateItemFromIDList # Vista:330
493-
@ stub -version=0x600+ SHCreateItemFromParsingName # Vista:331
494-
@ stub -version=0x600+ SHCreateItemFromRelativeName # Vista:332
495-
@ stub -version=0x600+ SHCreateItemInKnownFolder # Vista:333
496-
@ stub -version=0x600+ SHCreateItemWithParent # Vista:334
506+
@ stdcall -version=0x600+ SHCreateItemFromIDList(ptr ptr ptr) # Vista:330
507+
@ stdcall -version=0x600+ SHCreateItemFromParsingName(wstr ptr ptr ptr) # Vista:331
508+
@ stdcall -version=0x600+ SHCreateItemFromRelativeName(ptr wstr ptr ptr ptr) # Vista:332
509+
@ stdcall -version=0x600+ SHCreateItemInKnownFolder(ptr long wstr ptr ptr) # Vista:333
510+
@ stdcall -stub -version=0x600+ SHCreateItemWithParent(ptr ptr ptr ptr ptr) # Vista:334
497511
@ stub SHCreateLocalServerRunDll # 2k3:280, Vista:335
498512
@ stdcall SHCreateProcessAsUserW(ptr) # 2k3:281, Vista:336
499513
@ stdcall SHCreateQueryCancelAutoPlayMoniker(ptr) # 2k3:282, Vista:337
500514
@ stdcall SHCreateShellItem(ptr ptr ptr ptr) # 2k3:283, Vista:338
501-
@ stub -version=0x600+ SHCreateShellItemArray # Vista:339
515+
@ stdcall -version=0x600+ SHCreateShellItemArray(ptr ptr long ptr ptr) # Vista:339
502516
@ stdcall -version=0x600+ SHCreateShellItemArrayFromDataObject(ptr ptr ptr) # Vista:340
503-
@ stub -version=0x600+ SHCreateShellItemArrayFromIDLists # Vista:341
504-
@ stub -version=0x600+ SHCreateShellItemArrayFromShellItem # Vista:342
517+
@ stdcall -version=0x600+ SHCreateShellItemArrayFromIDLists(long ptr ptr) # Vista:341
518+
@ stdcall -version=0x600+ SHCreateShellItemArrayFromShellItem(ptr ptr ptr) # Vista:342
505519
@ stdcall SHEmptyRecycleBinA(long str long) # 2k3:284, Vista:343
506520
@ stdcall SHEmptyRecycleBinW(long wstr long) # 2k3:285, Vista:344
507521
@ stub SHEnableServiceObject # 2k3:286, Vista:345
@@ -544,7 +558,7 @@
544558
@ stub -version=0x600+ SHGetPathFromIDListEx # Vista:382
545559
@ stdcall SHGetPathFromIDListW(ptr ptr) # 2k3:315, Vista:383
546560
@ stub -version=0x600+ SHGetPropertyStoreFromIDList # Vista:384
547-
@ stub -version=0x600+ SHGetPropertyStoreFromParsingName # Vista:385
561+
@ stdcall -version=0x600+ SHGetPropertyStoreFromParsingName(wstr ptr ptr ptr ptr) # Vista:385
548562
@ stdcall SHGetSettings(ptr long) # 2k3:316, Vista:386
549563
@ stdcall SHGetSpecialFolderLocation(long long ptr) # 2k3:317, Vista:387
550564
@ stdcall SHGetSpecialFolderPathA(long ptr long long) # 2k3:318, Vista:388
@@ -567,7 +581,7 @@
567581
@ stdcall SHPathPrepareForWriteW(long ptr wstr long) # 2k3:332, Vista:402
568582
@ stdcall SHQueryRecycleBinA(str ptr) # 2k3:333, Vista:403
569583
@ stdcall SHQueryRecycleBinW(wstr ptr) # 2k3:334, Vista:404
570-
@ stub -version=0x600+ SHQueryUserNotificationState # Vista:405
584+
@ stdcall -version=0x600+ SHQueryUserNotificationState(ptr) # Vista:405
571585
@ stub -version=0x600+ SHRemoveLocalizedName # Vista:406
572586
@ stub -version=0x600+ SHSetDefaultProperties # Vista:407
573587
@ stub -version=0x600+ SHSetKnownFolderPath # Vista:408
@@ -638,3 +652,10 @@
638652
@ stdcall StrStrW(wstr wstr) shlwapi.StrStrW # 2k3:396, Vista:456
639653
@ stdcall WOWShellExecute(ptr str str str str long ptr) # 2k3:397, Vista:457
640654
@ stub -version=0x600+ WaitForExplorerRestartW # Vista:458
655+
656+
; Win7+ - These ordinals are higher than any of the ones in win vista
657+
@ stdcall -stub -version=0x601+ Shell_NotifyIconGetRect(ptr ptr)
658+
@ stdcall -stub -version=0x601+ SHGetKnownFolderItem(ptr ptr ptr ptr ptr)
659+
@ stdcall -stub -version=0x601+ SHAssocEnumHandlersForProtocolByApplication(wstr ptr ptr)
660+
@ stdcall -version=0x601+ GetCurrentProcessExplicitAppUserModelID(wstr)
661+
@ stdcall -version=0x601+ SetCurrentProcessExplicitAppUserModelID(wstr)

dll/win32/shell32/shellitem_vista.cpp

Lines changed: 19 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -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
349318
EXTERN_C HRESULT WINAPI
350319
SHGetItemFromObject(_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

Comments
 (0)