6 // + Adapted from https://blogs.msdn.microsoft.com/oldnewthing/20130503-00/?p=4463/
7 // In short: We want to create an IDLIST from an item that does not exist,
8 // so we have to provide WIN32_FIND_DATAW in a bind context.
9 // If we don't, the FS will be queried, and we do not get a valid IDLIST for a non-existing path.
13 class CFileSysBindData
:
14 public CComCoClass
<CFileSysBindData
>,
15 public CComObjectRootEx
<CComMultiThreadModelNoCS
>,
16 public IFileSystemBindData
19 virtual HRESULT STDMETHODCALLTYPE
SetFindData(const WIN32_FIND_DATAW
*pfd
)
25 virtual HRESULT STDMETHODCALLTYPE
GetFindData(WIN32_FIND_DATAW
*pfd
)
31 DECLARE_NOT_AGGREGATABLE(CFileSysBindData
)
32 DECLARE_PROTECT_FINAL_CONSTRUCT()
33 BEGIN_COM_MAP(CFileSysBindData
)
34 COM_INTERFACE_ENTRY_IID(IID_IFileSystemBindData
, IFileSystemBindData
)
37 WIN32_FIND_DATAW m_Data
;
42 AddFileSysBindCtx(_In_ IBindCtx
*pbc
)
44 CComPtr
<IFileSystemBindData
> spfsbc(new CComObject
<CFileSysBindData
>());
45 WIN32_FIND_DATAW wfd
= { 0 };
46 wfd
.dwFileAttributes
= FILE_ATTRIBUTE_NORMAL
;
47 spfsbc
->SetFindData(&wfd
);
48 HRESULT hr
= pbc
->RegisterObjectParam((LPOLESTR
)STR_FILE_SYS_BIND_DATA
, spfsbc
);
49 ok(hr
== S_OK
, "hr = %lx\n", hr
);
55 CreateBindCtxWithOpts(_In_ BIND_OPTS
*pbo
, _Outptr_ IBindCtx
**ppbc
)
57 CComPtr
<IBindCtx
> spbc
;
58 HRESULT hr
= CreateBindCtx(0, &spbc
);
59 ok(hr
== S_OK
, "hr = %lx\n", hr
);
62 hr
= spbc
->SetBindOptions(pbo
);
63 ok(hr
== S_OK
, "hr = %lx\n", hr
);
65 *ppbc
= SUCCEEDED(hr
) ? spbc
.Detach() : NULL
;
70 CreateFileSysBindCtx(_Outptr_ IBindCtx
**ppbc
)
72 CComPtr
<IBindCtx
> spbc
;
73 BIND_OPTS bo
= { sizeof(bo
), 0, STGM_CREATE
, 0 };
74 HRESULT hr
= CreateBindCtxWithOpts(&bo
, &spbc
);
75 ok(hr
== S_OK
, "hr = %lx\n", hr
);
78 hr
= AddFileSysBindCtx(spbc
);
79 ok(hr
== S_OK
, "hr = %lx\n", hr
);
81 *ppbc
= SUCCEEDED(hr
) ? spbc
.Detach() : NULL
;
86 PathToIDList(LPCWSTR pszPath
, ITEMIDLIST
** ppidl
)
88 CComPtr
<IBindCtx
> spbc
;
89 HRESULT hr
= CreateFileSysBindCtx(&spbc
);
90 ok(hr
== S_OK
, "hr = %lx\n", hr
);
93 hr
= SHParseDisplayName(pszPath
, spbc
, ppidl
, 0, NULL
);
94 ok(hr
== S_OK
, "hr = %lx\n", hr
);
98 // - Adapted from https://blogs.msdn.microsoft.com/oldnewthing/20130503-00/?p=4463/