ReactOS 0.4.15-dev-7842-g558ab78
shlfolder.cpp
Go to the documentation of this file.
1/*
2 * Shell Folder stuff
3 *
4 * Copyright 1997 Marcus Meissner
5 * Copyright 1998, 1999, 2002 Juergen Schmied
6 * Copyright 2018 Katayama Hirofumi MZ
7 *
8 * IShellFolder2 and related interfaces
9 *
10 * This library is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Lesser General Public
12 * License as published by the Free Software Foundation; either
13 * version 2.1 of the License, or (at your option) any later version.
14 *
15 * This library is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * Lesser General Public License for more details.
19 *
20 * You should have received a copy of the GNU Lesser General Public
21 * License along with this library; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
23 */
24
25#include "precomp.h"
26
28
29/***************************************************************************
30 * GetNextElement (internal function)
31 *
32 * Gets a part of a string till the first backslash.
33 *
34 * PARAMETERS
35 * pszNext [IN] string to get the element from
36 * pszOut [IN] pointer to buffer which receives string
37 * dwOut [IN] length of pszOut
38 *
39 * RETURNS
40 * LPSTR pointer to first, not yet parsed char
41 */
42
43LPCWSTR GetNextElementW (LPCWSTR pszNext, LPWSTR pszOut, DWORD dwOut)
44{
45 LPCWSTR pszTail = pszNext;
46 DWORD dwCopy;
47
48 TRACE ("(%s %p 0x%08x)\n", debugstr_w (pszNext), pszOut, dwOut);
49
50 *pszOut = 0x0000;
51
52 if (!pszNext || !*pszNext)
53 return NULL;
54
55 while (*pszTail && (*pszTail != (WCHAR) '\\'))
56 pszTail++;
57
58 dwCopy = pszTail - pszNext + 1;
59 lstrcpynW (pszOut, pszNext, (dwOut < dwCopy) ? dwOut : dwCopy);
60
61 if (*pszTail)
62 pszTail++;
63 else
64 pszTail = NULL;
65
66 TRACE ("--(%s %s 0x%08x %p)\n", debugstr_w (pszNext), debugstr_w (pszOut), dwOut, pszTail);
67 return pszTail;
68}
69
71 LPITEMIDLIST * pidlInOut, LPOLESTR szNext, DWORD * pEaten, DWORD * pdwAttributes)
72{
74 LPITEMIDLIST pidlIn = pidlInOut ? *pidlInOut : NULL;
75 LPITEMIDLIST pidlOut = NULL;
76 LPITEMIDLIST pidlTemp = NULL;
77 CComPtr<IShellFolder> psfChild;
78
79 TRACE ("(%p, %p, %p, %s)\n", psf, pbc, pidlIn, debugstr_w (szNext));
80
81 /* get the shellfolder for the child pidl and let it analyse further */
82 hr = psf->BindToObject(pidlIn, pbc, IID_PPV_ARG(IShellFolder, &psfChild));
83 if (FAILED(hr))
84 return hr;
85
86 hr = psfChild->ParseDisplayName(hwndOwner, pbc, szNext, pEaten, &pidlOut, pdwAttributes);
87 if (FAILED(hr))
88 return hr;
89
90 pidlTemp = ILCombine (pidlIn, pidlOut);
91 if (!pidlTemp)
92 {
94 if (pidlOut)
95 ILFree(pidlOut);
96 return hr;
97 }
98
99 if (pidlOut)
100 ILFree (pidlOut);
101
102 if (pidlIn)
103 ILFree (pidlIn);
104
105 *pidlInOut = pidlTemp;
106
107 TRACE ("-- pidl=%p ret=0x%08x\n", pidlInOut ? *pidlInOut : NULL, hr);
108 return S_OK;
109}
110
111/***********************************************************************
112 * SHELL32_CoCreateInitSF
113 *
114 * Creates a shell folder and initializes it with a pidl and a root folder
115 * via IPersistFolder3 or IPersistFolder.
116 *
117 * NOTES
118 * pathRoot can be NULL for Folders being a drive.
119 * In this case the absolute path is built from pidlChild (eg. C:)
120 */
121HRESULT SHELL32_CoCreateInitSF (LPCITEMIDLIST pidlRoot, PERSIST_FOLDER_TARGET_INFO* ppfti,
122 LPCITEMIDLIST pidlChild, const GUID* clsid, REFIID riid, LPVOID *ppvOut)
123{
124 HRESULT hr;
125 CComPtr<IShellFolder> pShellFolder;
126
128 if (FAILED(hr))
129 return hr;
130
131 LPITEMIDLIST pidlAbsolute = ILCombine (pidlRoot, pidlChild);
134
135 if (ppfti && SUCCEEDED(pShellFolder->QueryInterface(IID_PPV_ARG(IPersistFolder3, &ppf3))))
136 {
137 ppf3->InitializeEx(NULL, pidlAbsolute, ppfti);
138 }
139 else if (SUCCEEDED(pShellFolder->QueryInterface(IID_PPV_ARG(IPersistFolder, &ppf))))
140 {
141 ppf->Initialize(pidlAbsolute);
142 }
143 ILFree (pidlAbsolute);
144
145 return pShellFolder->QueryInterface(riid, ppvOut);
146}
147
149 int csidl, REFIID riid, LPVOID *ppvOut)
150{
151 /* fill the PERSIST_FOLDER_TARGET_INFO */
152 PERSIST_FOLDER_TARGET_INFO pfti = {0};
153 pfti.dwAttributes = -1;
154 pfti.csidl = csidl;
155
156 return SHELL32_CoCreateInitSF(pidlRoot, &pfti, NULL, clsid, riid, ppvOut);
157}
158
159HRESULT SHELL32_BindToSF (LPCITEMIDLIST pidlRoot, PERSIST_FOLDER_TARGET_INFO* ppfti,
160 LPCITEMIDLIST pidl, const GUID* clsid, REFIID riid, LPVOID *ppvOut)
161{
162 PITEMID_CHILD pidlChild = ILCloneFirst (pidl);
163 if (!pidlChild)
164 return E_FAIL;
165
168 ppfti,
169 pidlChild,
170 clsid,
172 ILFree(pidlChild);
173
175 return hr;
176
177 if (_ILIsPidlSimple (pidl))
178 return psf->QueryInterface(riid, ppvOut);
179 else
180 return psf->BindToObject(ILGetNext (pidl), NULL, riid, ppvOut);
181}
182
183/***********************************************************************
184 * SHELL32_GetDisplayNameOfChild
185 *
186 * Retrieves the display name of a child object of a shellfolder.
187 *
188 * For a pidl eg. [subpidl1][subpidl2][subpidl3]:
189 * - it binds to the child shellfolder [subpidl1]
190 * - asks it for the displayname of [subpidl2][subpidl3]
191 *
192 * Is possible the pidl is a simple pidl. In this case it asks the
193 * subfolder for the displayname of an empty pidl. The subfolder
194 * returns the own displayname eg. "::{guid}". This is used for
195 * virtual folders with the registry key WantsFORPARSING set.
196 */
198 LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet)
199{
200 LPITEMIDLIST pidlFirst = ILCloneFirst(pidl);
201 if (!pidlFirst)
202 return E_OUTOFMEMORY;
203
204 CComPtr<IShellFolder> psfChild;
205 HRESULT hr = psf->BindToObject(pidlFirst, NULL, IID_PPV_ARG(IShellFolder, &psfChild));
206 if (SUCCEEDED (hr))
207 {
208 hr = psfChild->GetDisplayNameOf(ILGetNext (pidl), dwFlags, strRet);
209 }
210 ILFree (pidlFirst);
211
212 return hr;
213}
214
216{
217 PUIDLIST_RELATIVE nextpidl1 = ILGetNext (pidl1);
218 PUIDLIST_RELATIVE nextpidl2 = ILGetNext (pidl2);
219
220 bool isEmpty1 = _ILIsDesktop(nextpidl1);
221 bool isEmpty2 = _ILIsDesktop(nextpidl2);
222 if (isEmpty1 || isEmpty2)
223 return MAKE_COMPARE_HRESULT(isEmpty2 - isEmpty1);
224
225 PITEMID_CHILD firstpidl = ILCloneFirst (pidl1);
226 if (!firstpidl)
227 return E_OUTOFMEMORY;
228
230 HRESULT hr = psf->BindToObject(firstpidl, 0, IID_PPV_ARG(IShellFolder, &psf2));
231 ILFree(firstpidl);
232 if (FAILED(hr))
233 return MAKE_COMPARE_HRESULT(0);
234
235 return psf2->CompareIDs(lParam, nextpidl1, nextpidl2);
236}
237
239{
241 WCHAR wszItem1[MAX_PATH], wszItem2[MAX_PATH];
243 UINT col = LOWORD(lParam); // Column index without SHCIDS_* flags
244
245 hres = isf->GetDetailsOf(pidl1, col, &sd);
246 if (FAILED(hres))
247 return MAKE_COMPARE_HRESULT(1);
248
249 hres = StrRetToBufW(&sd.str, pidl1, wszItem1, MAX_PATH);
250 if (FAILED(hres))
251 return MAKE_COMPARE_HRESULT(1);
252
253 hres = isf->GetDetailsOf(pidl2, col, &sd);
254 if (FAILED(hres))
255 return MAKE_COMPARE_HRESULT(1);
256
257 hres = StrRetToBufW(&sd.str, pidl2, wszItem2, MAX_PATH);
258 if (FAILED(hres))
259 return MAKE_COMPARE_HRESULT(1);
260
261 int ret = wcsicmp(wszItem1, wszItem2);
262 if (ret == 0)
263 return SHELL32_CompareChildren(isf, lParam, pidl1, pidl2);
264
266}
267
269{
270 if (*cKeys >= 16)
271 return ERROR_MORE_DATA;
272
273 HKEY hkey;
275 if (result == ERROR_SUCCESS)
276 {
277 array[*cKeys] = hkey;
278 *cKeys += 1;
279 }
280 return result;
281}
282
284{
285 // This function opens the association array keys in canonical order for filesystem items.
286 // The order is documented: learn.microsoft.com/en-us/windows/win32/shell/fa-associationarray
287
288 ASSERT(cidl >= 1 && apidl);
289 PCUITEMID_CHILD pidl = apidl[0];
290 if (_ILIsValue(pidl))
291 {
293 PWSTR name;
294 FileStructW* pFileData = _ILGetFileStructW(pidl);
295 if (pFileData)
296 {
297 name = pFileData->wszName;
298 }
299 else
300 {
302 name = buf;
303 }
304 LPCWSTR extension = PathFindExtension(name);
305
306 if (extension)
307 {
308 WCHAR wszClass[MAX_PATH], wszSFA[23 + _countof(wszClass)];
309 DWORD dwSize = sizeof(wszClass);
310 if (RegGetValueW(HKEY_CLASSES_ROOT, extension, NULL, RRF_RT_REG_SZ, NULL, wszClass, &dwSize) != ERROR_SUCCESS ||
311 !*wszClass || AddClassKeyToArray(wszClass, array, cKeys) != ERROR_SUCCESS)
312 {
313 // Only add the extension key if the ProgId is not valid
314 AddClassKeyToArray(extension, array, cKeys);
315
316 // "Open With" becomes the default when there are no verbs in the above keys
317 if (cidl == 1)
318 AddClassKeyToArray(L"Unknown", array, cKeys);
319 }
320
321 swprintf(wszSFA, L"SystemFileAssociations\\%s", extension);
322 AddClassKeyToArray(wszSFA, array, cKeys);
323
324 dwSize = sizeof(wszClass);
325 if (RegGetValueW(HKEY_CLASSES_ROOT, extension, L"PerceivedType ", RRF_RT_REG_SZ, NULL, wszClass, &dwSize) == ERROR_SUCCESS)
326 {
327 swprintf(wszSFA, L"SystemFileAssociations\\%s", wszClass);
328 AddClassKeyToArray(wszSFA, array, cKeys);
329 }
330 }
331
332 AddClassKeyToArray(L"*", array, cKeys);
333 AddClassKeyToArray(L"AllFilesystemObjects", array, cKeys);
334 }
335 else if (_ILIsFolder(pidl))
336 {
337 // FIXME: Directory > Folder > AFO is the correct order and it's
338 // the order Windows reports in its undocumented association array
339 // but it is somehow not the order Windows adds the items to its menu!
340 // Until the correct algorithm in CDefaultContextMenu can be determined,
341 // we add the folder keys in "menu order".
342 AddClassKeyToArray(L"Folder", array, cKeys);
343 AddClassKeyToArray(L"AllFilesystemObjects", array, cKeys);
344 AddClassKeyToArray(L"Directory", array, cKeys);
345 }
346 else
347 {
348 ERR("Got non FS pidl\n");
349 }
350}
351
352HRESULT SH_GetApidlFromDataObject(IDataObject *pDataObject, PIDLIST_ABSOLUTE* ppidlfolder, PUITEMID_CHILD **apidlItems, UINT *pcidl)
353{
354 CDataObjectHIDA cida(pDataObject);
355
356 if (FAILED_UNEXPECTEDLY(cida.hr()))
357 return cida.hr();
358
359 /* convert the data into pidl */
360 LPITEMIDLIST pidl;
361 LPITEMIDLIST *apidl = _ILCopyCidaToaPidl(&pidl, cida);
362 if (!apidl)
363 {
364 return E_OUTOFMEMORY;
365 }
366
367 *ppidlfolder = pidl;
368 *apidlItems = apidl;
369 *pcidl = cida->cidl;
370
371 return S_OK;
372}
373
374/***********************************************************************
375 * SHCreateLinks
376 *
377 * Undocumented.
378 */
380 UINT uFlags, LPITEMIDLIST *lppidlLinks)
381{
382 FIXME("%p %s %p %08x %p\n", hWnd, lpszDir, lpDataObject, uFlags, lppidlLinks);
383 return E_NOTIMPL;
384}
385
386/***********************************************************************
387 * SHOpenFolderAndSelectItems
388 *
389 * Unimplemented.
390 */
392WINAPI
394 UINT cidl,
397{
398 ERR("SHOpenFolderAndSelectItems() is hackplemented\n");
400 PCIDLIST_ABSOLUTE pidlItem;
401 if (cidl)
402 {
403 /* Firefox sends a full pidl here dispite the fact it is a PCUITEMID_CHILD_ARRAY -_- */
404 if (!ILIsSingle(apidl[0]))
405 {
406 pidlItem = apidl[0];
407 }
408 else
409 {
410 HRESULT hr = SHILCombine(pidlFolder, apidl[0], &pidlItem);
412 return hr;
413 freeItem.Attach(const_cast<PIDLIST_ABSOLUTE>(pidlItem));
414 }
415 }
416 else
417 {
418 pidlItem = pidlFolder;
419 }
420
421 CComPtr<IShellFolder> psfDesktop;
422
423 HRESULT hr = SHGetDesktopFolder(&psfDesktop);
425 return hr;
426
427 STRRET strret;
428 hr = psfDesktop->GetDisplayNameOf(pidlItem, SHGDN_FORPARSING, &strret);
430 return hr;
431
432 WCHAR wszBuf[MAX_PATH];
433 hr = StrRetToBufW(&strret, pidlItem, wszBuf, _countof(wszBuf));
435 return hr;
436
437 WCHAR wszParams[MAX_PATH];
438 wcscpy(wszParams, L"/select,");
439 wcscat(wszParams, wszBuf);
440
442 memset(&sei, 0, sizeof sei);
443 sei.cbSize = sizeof sei;
445 sei.lpFile = L"explorer.exe";
446 sei.lpParameters = wszParams;
447
448 if (ShellExecuteExW(&sei))
449 return S_OK;
450 else
451 return E_FAIL;
452}
453
454static
457{
458 CComPtr<IDataObject> pDataObject;
459 pDataObject.Attach((IDataObject*)lpParameter);
460
461 CDataObjectHIDA cida(pDataObject);
462
463 if (FAILED_UNEXPECTEDLY(cida.hr()))
464 return cida.hr();
465
466 if (cida->cidl > 1)
467 {
468 ERR("SHMultiFileProperties is not yet implemented\n");
469 return E_FAIL;
470 }
471
473 CComHeapPtr<WCHAR> wszName;
474 if (FAILED_UNEXPECTEDLY(SHGetNameFromIDList(completePidl, SIGDN_PARENTRELATIVEPARSING, &wszName)))
475 return 0;
476
477 BOOL bSuccess = SH_ShowPropertiesDialog(wszName, pDataObject);
478 if (!bSuccess)
479 ERR("SH_ShowPropertiesDialog failed\n");
480
481 return 0;
482}
483
484/*
485 * for internal use
486 */
489{
490 pdtobj->AddRef();
492 {
493 pdtobj->Release();
495 }
496 else
497 {
498 return S_OK;
499 }
500}
BOOL _ILIsDesktop(LPCITEMIDLIST pidl)
Definition: CBandSite.h:24
HRESULT WINAPI SHGetDesktopFolder(IShellFolder **psf)
HWND hWnd
Definition: settings.c:17
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
void shell(int argc, const char *argv[])
Definition: cmds.c:1231
#define EXTERN_C
Definition: basetyps.h:12
#define FIXME(fmt,...)
Definition: debug.h:111
#define ERR(fmt,...)
Definition: debug.h:110
void Attach(T *lp)
Definition: atlcomcli.h:179
void Attach(T *lp)
Definition: atlalloc.h:162
LPARAM lParam
Definition: combotst.c:139
#define ERROR_MORE_DATA
Definition: dderror.h:13
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_NOTIMPL
Definition: ddrawi.h:99
#define E_FAIL
Definition: ddrawi.h:102
#define ERROR_SUCCESS
Definition: deptool.c:10
static LSTATUS(WINAPI *pRegDeleteTreeW)(HKEY
#define NULL
Definition: types.h:112
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3333
LSTATUS WINAPI RegGetValueW(HKEY hKey, LPCWSTR pszSubKey, LPCWSTR pszValue, DWORD dwFlags, LPDWORD pdwType, PVOID pvData, LPDWORD pcbData)
Definition: reg.c:1931
UINT uFlags
Definition: api.c:59
BOOL WINAPI _ILIsPidlSimple(LPCITEMIDLIST pidl)
#define MAX_PATH
Definition: compat.h:34
#define wcsicmp
Definition: compat.h:15
#define lstrcpynW
Definition: compat.h:738
#define FAILED_UNEXPECTEDLY(hr)
Definition: precomp.h:121
#define RRF_RT_REG_SZ
Definition: driver.c:575
HRESULT WINAPI SHCoCreateInstance(LPCWSTR aclsid, const CLSID *clsid, LPUNKNOWN pUnkOuter, REFIID refiid, LPVOID *ppv)
Definition: shellole.c:105
HRESULT WINAPI StrRetToBufW(LPSTRRET src, const ITEMIDLIST *pidl, LPWSTR dest, UINT len)
Definition: string.c:1522
BOOL WINAPI SHCreateThread(LPTHREAD_START_ROUTINE pfnThreadProc, VOID *pData, DWORD dwFlags, LPTHREAD_START_ROUTINE pfnCallback)
Definition: thread.c:356
#define swprintf
Definition: precomp.h:40
static BOOLEAN bSuccess
Definition: drive.cpp:433
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
BOOL SH_ShowPropertiesDialog(LPCWSTR pwszPath, IDataObject *pDataObj)
Definition: fprop.cpp:83
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLuint64EXT * result
Definition: glext.h:11304
REFIID riid
Definition: atlbase.h:39
HRESULT GetDetailsOf([in] PCUITEMID_CHILD pidl, [in] UINT iColumn, [out] SHELLDETAILS *psd)
HRESULT BindToObject([in] PCUIDLIST_RELATIVE pidl, [in] LPBC pbcReserved, [in] REFIID riid, [out, iid_is(riid)] void **ppvOut)
ULONG AddRef()
ULONG Release()
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
#define debugstr_w
Definition: kernel32.h:32
#define ASSERT(a)
Definition: mode.c:44
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:56
HRESULT hres
Definition: protocol.c:465
static const WCHAR sd[]
Definition: suminfo.c:286
static LPOLESTR
Definition: stg_prop.c:27
REFCLSID clsid
Definition: msctf.c:82
unsigned int UINT
Definition: ndis.h:50
#define KEY_READ
Definition: nt_native.h:1023
#define KEY_QUERY_VALUE
Definition: nt_native.h:1016
#define L(x)
Definition: ntvdm.h:50
interface IBindCtx * LPBC
Definition: objfwd.h:18
#define LOWORD(l)
Definition: pedump.c:82
void WINAPI ILFree(LPITEMIDLIST pidl)
Definition: pidl.c:929
LPITEMIDLIST * _ILCopyCidaToaPidl(LPITEMIDLIST *pidl, const CIDA *cida)
Definition: pidl.c:2699
HRESULT WINAPI SHGetNameFromIDList(PCIDLIST_ABSOLUTE pidl, SIGDN sigdnName, PWSTR *ppszName)
Definition: pidl.c:1438
LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: pidl.c:703
LPITEMIDLIST WINAPI ILCloneFirst(LPCITEMIDLIST pidl)
Definition: pidl.c:253
FileStructW * _ILGetFileStructW(LPCITEMIDLIST pidl)
Definition: pidl.c:2376
BOOL _ILIsFolder(LPCITEMIDLIST pidl)
Definition: pidl.c:1991
LPITEMIDLIST WINAPI ILGetNext(LPCITEMIDLIST pidl)
Definition: pidl.c:855
BOOL _ILIsValue(LPCITEMIDLIST pidl)
Definition: pidl.c:2000
DWORD _ILSimpleGetTextW(LPCITEMIDLIST pidl, LPWSTR szOut, UINT uOutSize)
Definition: pidl.c:2122
#define REFIID
Definition: guiddef.h:118
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
_CRTIMP wchar_t *__cdecl wcscat(_Inout_updates_z_(_String_length_(_Dest)+_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
#define memset(x, y, z)
Definition: compat.h:39
#define SEE_MASK_WAITFORINPUTIDLE
Definition: shellapi.h:58
static PCUIDLIST_RELATIVE HIDA_GetPIDLItem(CIDA const *pida, SIZE_T i)
Definition: shellutils.h:585
static PCUIDLIST_ABSOLUTE HIDA_GetPIDLFolder(CIDA const *pida)
Definition: shellutils.h:580
#define MAKE_COMPARE_HRESULT(x)
Definition: shellutils.h:573
static BOOL ILIsSingle(LPCITEMIDLIST pidl)
Definition: shellutils.h:575
BOOL WINAPI DECLSPEC_HOTPATCH ShellExecuteExW(LPSHELLEXECUTEINFOW sei)
Definition: shlexec.cpp:2391
HRESULT hr
Definition: shlfolder.c:183
HRESULT SHELL32_CoCreateInitSF(LPCITEMIDLIST pidlRoot, PERSIST_FOLDER_TARGET_INFO *ppfti, LPCITEMIDLIST pidlChild, const GUID *clsid, REFIID riid, LPVOID *ppvOut)
Definition: shlfolder.cpp:121
HRESULT SHELL32_BindToSF(LPCITEMIDLIST pidlRoot, PERSIST_FOLDER_TARGET_INFO *ppfti, LPCITEMIDLIST pidl, const GUID *clsid, REFIID riid, LPVOID *ppvOut)
Definition: shlfolder.cpp:159
static DWORD WINAPI _ShowPropertiesDialogThread(LPVOID lpParameter)
Definition: shlfolder.cpp:456
HRESULT SHELL32_GetDisplayNameOfChild(IShellFolder2 *psf, LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet)
Definition: shlfolder.cpp:197
HRESULT SHELL32_CompareChildren(IShellFolder2 *psf, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: shlfolder.cpp:215
void AddFSClassKeysToArray(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, HKEY *array, UINT *cKeys)
Definition: shlfolder.cpp:283
HRESULT WINAPI Shell_DefaultContextMenuCallBack(IShellFolder *psf, IDataObject *pdtobj)
Definition: shlfolder.cpp:488
LSTATUS AddClassKeyToArray(const WCHAR *szClass, HKEY *array, UINT *cKeys)
Definition: shlfolder.cpp:268
HRESULT SHELL32_CompareDetails(IShellFolder2 *isf, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: shlfolder.cpp:238
HRESULT SH_GetApidlFromDataObject(IDataObject *pDataObject, PIDLIST_ABSOLUTE *ppidlfolder, PUITEMID_CHILD **apidlItems, UINT *pcidl)
Definition: shlfolder.cpp:352
EXTERN_C HRESULT WINAPI SHOpenFolderAndSelectItems(PCIDLIST_ABSOLUTE pidlFolder, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD dwFlags)
Definition: shlfolder.cpp:393
HRESULT SHELL32_ParseNextElement(IShellFolder2 *psf, HWND hwndOwner, LPBC pbc, LPITEMIDLIST *pidlInOut, LPOLESTR szNext, DWORD *pEaten, DWORD *pdwAttributes)
Definition: shlfolder.cpp:70
HRESULT WINAPI SHCreateLinks(HWND hWnd, LPCSTR lpszDir, IDataObject *lpDataObject, UINT uFlags, LPITEMIDLIST *lppidlLinks)
Definition: shlfolder.cpp:379
LPCWSTR GetNextElementW(LPCWSTR pszNext, LPWSTR pszOut, DWORD dwOut)
Definition: shlfolder.cpp:43
#define PathFindExtension
Definition: shlwapi.h:907
#define CTF_COINIT
Definition: shlwapi.h:1936
#define CTF_INSIST
Definition: shlwapi.h:1933
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41
ITEMID_CHILD UNALIGNED * PUITEMID_CHILD
Definition: shtypes.idl:68
const PCUITEMID_CHILD * PCUITEMID_CHILD_ARRAY
Definition: shtypes.idl:71
const ITEMID_CHILD UNALIGNED * PCUITEMID_CHILD
Definition: shtypes.idl:70
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
Definition: shtypes.idl:42
ITEMIDLIST_RELATIVE UNALIGNED * PUIDLIST_RELATIVE
Definition: shtypes.idl:55
#define _countof(array)
Definition: sndvol32.h:68
#define TRACE(s)
Definition: solgame.cpp:4
WCHAR wszName[1]
Definition: shlfolder.c:1555
LPCWSTR lpParameters
Definition: shellapi.h:333
Definition: name.c:39
uint16_t * PWSTR
Definition: typedefs.h:56
int ret
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1176
LONG_PTR LPARAM
Definition: windef.h:208
#define WINAPI
Definition: msvc.h:6
#define HRESULT_FROM_WIN32(x)
Definition: winerror.h:92
#define HKEY_CLASSES_ROOT
Definition: winreg.h:10
#define IID_PPV_ARG(Itype, ppType)
const char * LPCSTR
Definition: xmlstorage.h:183
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185