3 // + Adapted from https://blogs.msdn.microsoft.com/oldnewthing/20130503-00/?p=4463/
4 // In short: We want to create an IDLIST from an item that does not exist,
5 // so we have to provide WIN32_FIND_DATAW in a bind context.
6 // If we don't, the FS will be queried, and we do not get a valid IDLIST for a non-existing path.
10 class CFileSysBindData
:
11 public CComCoClass
<CFileSysBindData
>,
12 public CComObjectRootEx
<CComMultiThreadModelNoCS
>,
13 public IFileSystemBindData
16 virtual HRESULT STDMETHODCALLTYPE
SetFindData(const WIN32_FIND_DATAW
*pfd
)
22 virtual HRESULT STDMETHODCALLTYPE
GetFindData(WIN32_FIND_DATAW
*pfd
)
28 DECLARE_NOT_AGGREGATABLE(CFileSysBindData
)
29 DECLARE_PROTECT_FINAL_CONSTRUCT()
30 BEGIN_COM_MAP(CFileSysBindData
)
31 COM_INTERFACE_ENTRY_IID(IID_IFileSystemBindData
, IFileSystemBindData
)
34 WIN32_FIND_DATAW m_Data
;
39 AddFileSysBindCtx(_In_ IBindCtx
*pbc
)
41 CComPtr
<IFileSystemBindData
> spfsbc(new CComObject
<CFileSysBindData
>());
42 WIN32_FIND_DATAW wfd
= { 0 };
43 wfd
.dwFileAttributes
= FILE_ATTRIBUTE_NORMAL
;
44 spfsbc
->SetFindData(&wfd
);
45 HRESULT hr
= pbc
->RegisterObjectParam((LPOLESTR
)STR_FILE_SYS_BIND_DATA
, spfsbc
);
46 ok(hr
== S_OK
, "hr = %lx\n", hr
);
52 CreateBindCtxWithOpts(_In_ BIND_OPTS
*pbo
, _Outptr_ IBindCtx
**ppbc
)
54 CComPtr
<IBindCtx
> spbc
;
55 HRESULT hr
= CreateBindCtx(0, &spbc
);
56 ok(hr
== S_OK
, "hr = %lx\n", hr
);
59 hr
= spbc
->SetBindOptions(pbo
);
60 ok(hr
== S_OK
, "hr = %lx\n", hr
);
62 *ppbc
= SUCCEEDED(hr
) ? spbc
.Detach() : NULL
;
67 CreateFileSysBindCtx(_Outptr_ IBindCtx
**ppbc
)
69 CComPtr
<IBindCtx
> spbc
;
70 BIND_OPTS bo
= { sizeof(bo
), 0, STGM_CREATE
, 0 };
71 HRESULT hr
= CreateBindCtxWithOpts(&bo
, &spbc
);
72 ok(hr
== S_OK
, "hr = %lx\n", hr
);
75 hr
= AddFileSysBindCtx(spbc
);
76 ok(hr
== S_OK
, "hr = %lx\n", hr
);
78 *ppbc
= SUCCEEDED(hr
) ? spbc
.Detach() : NULL
;
83 PathToIDList(LPCWSTR pszPath
, ITEMIDLIST
** ppidl
)
85 CComPtr
<IBindCtx
> spbc
;
86 HRESULT hr
= CreateFileSysBindCtx(&spbc
);
87 ok(hr
== S_OK
, "hr = %lx\n", hr
);
90 hr
= SHParseDisplayName(pszPath
, spbc
, ppidl
, 0, NULL
);
91 ok(hr
== S_OK
, "hr = %lx\n", hr
);
95 // - Adapted from https://blogs.msdn.microsoft.com/oldnewthing/20130503-00/?p=4463/