1c2c66affSColin Finck #include "shelltest.h"
2c2c66affSColin Finck
3*fe11f7a2SKatayama Hirofumi MZ // + Adapted from https://devblogs.microsoft.com/oldnewthing/20130503-00/?p=4463
4c2c66affSColin Finck // In short: We want to create an IDLIST from an item that does not exist,
5c2c66affSColin Finck // so we have to provide WIN32_FIND_DATAW in a bind context.
6c2c66affSColin Finck // If we don't, the FS will be queried, and we do not get a valid IDLIST for a non-existing path.
7c2c66affSColin Finck
8c2c66affSColin Finck CComModule gModule;
9c2c66affSColin Finck
10c2c66affSColin Finck class CFileSysBindData :
11c2c66affSColin Finck public CComCoClass<CFileSysBindData>,
12c2c66affSColin Finck public CComObjectRootEx<CComMultiThreadModelNoCS>,
13c2c66affSColin Finck public IFileSystemBindData
14c2c66affSColin Finck {
15c2c66affSColin Finck public:
SetFindData(const WIN32_FIND_DATAW * pfd)16c2c66affSColin Finck virtual HRESULT STDMETHODCALLTYPE SetFindData(const WIN32_FIND_DATAW *pfd)
17c2c66affSColin Finck {
18c2c66affSColin Finck m_Data = *pfd;
19c2c66affSColin Finck return S_OK;
20c2c66affSColin Finck }
21c2c66affSColin Finck
GetFindData(WIN32_FIND_DATAW * pfd)22c2c66affSColin Finck virtual HRESULT STDMETHODCALLTYPE GetFindData(WIN32_FIND_DATAW *pfd)
23c2c66affSColin Finck {
24c2c66affSColin Finck *pfd = m_Data;
25c2c66affSColin Finck return S_OK;
26c2c66affSColin Finck }
27c2c66affSColin Finck
28c2c66affSColin Finck DECLARE_NOT_AGGREGATABLE(CFileSysBindData)
29c2c66affSColin Finck DECLARE_PROTECT_FINAL_CONSTRUCT()
30c2c66affSColin Finck BEGIN_COM_MAP(CFileSysBindData)
31c2c66affSColin Finck COM_INTERFACE_ENTRY_IID(IID_IFileSystemBindData, IFileSystemBindData)
32c2c66affSColin Finck END_COM_MAP()
33c2c66affSColin Finck private:
34c2c66affSColin Finck WIN32_FIND_DATAW m_Data;
35c2c66affSColin Finck };
36c2c66affSColin Finck
37c2c66affSColin Finck static
38c2c66affSColin Finck HRESULT
AddFileSysBindCtx(_In_ IBindCtx * pbc)39c2c66affSColin Finck AddFileSysBindCtx(_In_ IBindCtx *pbc)
40c2c66affSColin Finck {
41c2c66affSColin Finck CComPtr<IFileSystemBindData> spfsbc(new CComObject<CFileSysBindData>());
42c2c66affSColin Finck WIN32_FIND_DATAW wfd = { 0 };
43c2c66affSColin Finck wfd.dwFileAttributes = FILE_ATTRIBUTE_NORMAL;
44c2c66affSColin Finck spfsbc->SetFindData(&wfd);
45c2c66affSColin Finck HRESULT hr = pbc->RegisterObjectParam((LPOLESTR)STR_FILE_SYS_BIND_DATA, spfsbc);
46c2c66affSColin Finck ok(hr == S_OK, "hr = %lx\n", hr);
47c2c66affSColin Finck return hr;
48c2c66affSColin Finck }
49c2c66affSColin Finck
50c2c66affSColin Finck static
51c2c66affSColin Finck HRESULT
CreateBindCtxWithOpts(_In_ BIND_OPTS * pbo,_Outptr_ IBindCtx ** ppbc)52c2c66affSColin Finck CreateBindCtxWithOpts(_In_ BIND_OPTS *pbo, _Outptr_ IBindCtx **ppbc)
53c2c66affSColin Finck {
54c2c66affSColin Finck CComPtr<IBindCtx> spbc;
55c2c66affSColin Finck HRESULT hr = CreateBindCtx(0, &spbc);
56c2c66affSColin Finck ok(hr == S_OK, "hr = %lx\n", hr);
57c2c66affSColin Finck if (SUCCEEDED(hr))
58c2c66affSColin Finck {
59c2c66affSColin Finck hr = spbc->SetBindOptions(pbo);
60c2c66affSColin Finck ok(hr == S_OK, "hr = %lx\n", hr);
61c2c66affSColin Finck }
62c2c66affSColin Finck *ppbc = SUCCEEDED(hr) ? spbc.Detach() : NULL;
63c2c66affSColin Finck return hr;
64c2c66affSColin Finck }
65c2c66affSColin Finck
66c2c66affSColin Finck static HRESULT
CreateFileSysBindCtx(_Outptr_ IBindCtx ** ppbc)67c2c66affSColin Finck CreateFileSysBindCtx(_Outptr_ IBindCtx **ppbc)
68c2c66affSColin Finck {
69c2c66affSColin Finck CComPtr<IBindCtx> spbc;
70c2c66affSColin Finck BIND_OPTS bo = { sizeof(bo), 0, STGM_CREATE, 0 };
71c2c66affSColin Finck HRESULT hr = CreateBindCtxWithOpts(&bo, &spbc);
72c2c66affSColin Finck ok(hr == S_OK, "hr = %lx\n", hr);
73c2c66affSColin Finck if (SUCCEEDED(hr))
74c2c66affSColin Finck {
75c2c66affSColin Finck hr = AddFileSysBindCtx(spbc);
76c2c66affSColin Finck ok(hr == S_OK, "hr = %lx\n", hr);
77c2c66affSColin Finck }
78c2c66affSColin Finck *ppbc = SUCCEEDED(hr) ? spbc.Detach() : NULL;
79c2c66affSColin Finck return hr;
80c2c66affSColin Finck }
81c2c66affSColin Finck
82c2c66affSColin Finck VOID
PathToIDList(LPCWSTR pszPath,ITEMIDLIST ** ppidl)83c2c66affSColin Finck PathToIDList(LPCWSTR pszPath, ITEMIDLIST** ppidl)
84c2c66affSColin Finck {
85c2c66affSColin Finck CComPtr<IBindCtx> spbc;
86c2c66affSColin Finck HRESULT hr = CreateFileSysBindCtx(&spbc);
87c2c66affSColin Finck ok(hr == S_OK, "hr = %lx\n", hr);
88c2c66affSColin Finck if (SUCCEEDED(hr))
89c2c66affSColin Finck {
90c2c66affSColin Finck hr = SHParseDisplayName(pszPath, spbc, ppidl, 0, NULL);
91c2c66affSColin Finck ok(hr == S_OK, "hr = %lx\n", hr);
92c2c66affSColin Finck }
93c2c66affSColin Finck }
94c2c66affSColin Finck
95*fe11f7a2SKatayama Hirofumi MZ // - Adapted from https://devblogs.microsoft.com/oldnewthing/20130503-00/?p=4463
96