ReactOS 0.4.15-dev-8021-g7ce96fd
CDesktopFolder Class Reference

#include <CDesktopFolder.h>

Inheritance diagram for CDesktopFolder:
Collaboration diagram for CDesktopFolder:

Public Member Functions

 CDesktopFolder ()
 
 ~CDesktopFolder ()
 
HRESULT WINAPI FinalConstruct ()
 
STDMETHOD() ParseDisplayName (HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, DWORD *pchEaten, PIDLIST_RELATIVE *ppidl, DWORD *pdwAttributes) override
 
STDMETHOD() EnumObjects (HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList) override
 
STDMETHOD() BindToObject (PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) override
 
STDMETHOD() BindToStorage (PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) override
 
STDMETHOD() CompareIDs (LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2) override
 
STDMETHOD() CreateViewObject (HWND hwndOwner, REFIID riid, LPVOID *ppvOut) override
 
STDMETHOD() GetAttributesOf (UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut) override
 
STDMETHOD() GetUIObjectOf (HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT *prgfInOut, LPVOID *ppvOut) override
 
STDMETHOD() GetDisplayNameOf (PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet) override
 
STDMETHOD() SetNameOf (HWND hwndOwner, PCUITEMID_CHILD pidl, LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut) override
 
STDMETHOD() GetDefaultSearchGUID (GUID *pguid) override
 
STDMETHOD() EnumSearches (IEnumExtraSearch **ppenum) override
 
STDMETHOD() GetDefaultColumn (DWORD dwRes, ULONG *pSort, ULONG *pDisplay) override
 
STDMETHOD() GetDefaultColumnState (UINT iColumn, DWORD *pcsFlags) override
 
STDMETHOD() GetDetailsEx (PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pv) override
 
STDMETHOD() GetDetailsOf (PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd) override
 
STDMETHOD() MapColumnToSCID (UINT column, SHCOLUMNID *pscid) override
 
STDMETHOD() GetClassID (CLSID *lpClassId) override
 
STDMETHOD() Initialize (PCIDLIST_ABSOLUTE pidl) override
 
STDMETHOD() GetCurFolder (PIDLIST_ABSOLUTE *pidl) override
 
STDMETHOD() CallBack (IShellFolder *psf, HWND hwndOwner, IDataObject *pdtobj, UINT uMsg, WPARAM wParam, LPARAM lParam) override
 
STDMETHODIMP GetMaxLength (LPCWSTR pszName, int *piMaxNameLen) override
 
STDMETHODIMP GetValidCharacters (LPWSTR *ppwszValidChars, LPWSTR *ppwszInvalidChars) override
 
- Public Member Functions inherited from ATL::CComObjectRootEx< CComMultiThreadModelNoCS >
 ~CComObjectRootEx ()
 
ULONG InternalAddRef ()
 
ULONG InternalRelease ()
 
void Lock ()
 
void Unlock ()
 
HRESULT _AtlInitialConstruct ()
 
- Public Member Functions inherited from ATL::CComObjectRootBase
 CComObjectRootBase ()
 
 ~CComObjectRootBase ()
 
void SetVoid (void *)
 
HRESULT _AtlFinalConstruct ()
 
HRESULT FinalConstruct ()
 
void InternalFinalConstructAddRef ()
 
void InternalFinalConstructRelease ()
 
void FinalRelease ()
 
HRESULT GetDefaultSearchGUID ([out] GUID *lpguid)
 
HRESULT EnumSearches ([out] IEnumExtraSearch **ppenum)
 
HRESULT GetDefaultColumn ([in] DWORD dwReserved, [out] ULONG *pSort, [out] ULONG *pDisplay)
 
HRESULT GetDefaultColumnState ([in] UINT iColumn, [out] SHCOLSTATEF *pcsFlags)
 
HRESULT GetDetailsEx ([in] PCUITEMID_CHILD pidl, [in] const SHCOLUMNID *pscid, [out] VARIANT *pv)
 
HRESULT GetDetailsOf ([in] PCUITEMID_CHILD pidl, [in] UINT iColumn, [out] SHELLDETAILS *psd)
 
HRESULT MapColumnToSCID ([in] UINT iColumn, [in] SHCOLUMNID *pscid)
 
- Public Member Functions inherited from IShellFolder
HRESULT ParseDisplayName ([in] HWND hwndOwner, [in] LPBC pbcReserved, [in, string] LPOLESTR lpszDisplayName, [out] ULONG *pchEaten, [out] PIDLIST_RELATIVE *ppidl, [in, out, unique] ULONG *pdwAttributes)
 
HRESULT EnumObjects ([in] HWND hwndOwner, [in] SHCONTF grfFlags, [out] IEnumIDList **ppenumIDList)
 
HRESULT BindToObject ([in] PCUIDLIST_RELATIVE pidl, [in] LPBC pbcReserved, [in] REFIID riid, [out, iid_is(riid)] void **ppvOut)
 
HRESULT BindToStorage ([in] PCUIDLIST_RELATIVE pidl, [in] LPBC pbcReserved, [in] REFIID riid, [out, iid_is(riid)] void **ppvObj)
 
HRESULT CompareIDs ([in] LPARAM lParam, [in] PCUIDLIST_RELATIVE pidl1, [in] PCUIDLIST_RELATIVE pidl2)
 
HRESULT CreateViewObject ([in] HWND hwndOwner, [in] REFIID riid, [out, iid_is(riid)] void **ppvOut)
 
HRESULT GetAttributesOf ([in] UINT cidl, [in, size_is(cidl)] PCUITEMID_CHILD_ARRAY apidl, [in, out] SFGAOF *rgfInOut)
 
HRESULT GetUIObjectOf ([in] HWND hwndOwner, [in] UINT cidl, [in, size_is(cidl)] PCUITEMID_CHILD_ARRAY apidl, [in] REFIID riid, [in, out, unique] UINT *prgfInOut, [out, iid_is(riid)] void **ppvOut)
 
HRESULT GetDisplayNameOf ([in] PCUITEMID_CHILD pidl, [in] SHGDNF uFlags, [out] STRRET *lpName)
 
HRESULT SetNameOf ([in] HWND hwnd, [in] PCUITEMID_CHILD pidl, [in, string] LPCOLESTR lpszName, [in] SHGDNF uFlags, [out] PITEMID_CHILD *ppidlOut)
 
- Public Member Functions inherited from IUnknown
HRESULT QueryInterface ([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
 
ULONG AddRef ()
 
ULONG Release ()
 
HRESULT GetCurFolder ([out] PIDLIST_ABSOLUTE *ppidl)
 
HRESULT Initialize ([in] PCIDLIST_ABSOLUTE pidl)
 
HRESULT GetClassID ([out] CLSID *pClassID)
 
HRESULT CallBack ([in] IShellFolder *psf, [in] HWND hwndOwner, [in] IDataObject *pdtobj, [in] UINT uMsg, [in] WPARAM wParam, [in] LPARAM lParam)
 

Private Member Functions

HRESULT _GetSFFromPidl (LPCITEMIDLIST pidl, IShellFolder2 **psf)
 
HRESULT _ParseDisplayNameByParent (HWND hwndOwner, LPBC pbc, LPOLESTR pszPath, DWORD *pchEaten, PIDLIST_RELATIVE *ppidl, DWORD *pdwAttributes)
 
STDMETHODIMP ShellUrlParseDisplayName (HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, DWORD *pchEaten, PIDLIST_RELATIVE *ppidl, DWORD *pdwAttributes)
 
STDMETHODIMP HttpUrlParseDisplayName (HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, DWORD *pchEaten, PIDLIST_RELATIVE *ppidl, DWORD *pdwAttributes)
 

Static Private Member Functions

static HRESULT GetColumnDetails (UINT iColumn, SHELLDETAILS &sd)
 

Private Attributes

CComPtr< IShellFolder2m_DesktopFSFolder
 
CComPtr< IShellFolder2m_SharedDesktopFSFolder
 
CComPtr< IShellFolder2m_regFolder
 
LPWSTR sPathTarget
 
LPITEMIDLIST pidlRoot
 

Additional Inherited Members

- Public Types inherited from IShellFolder2
typedef struct IShellFolder2::SHCOLUMNIDLPSHCOLUMNID
 
typedef const SHCOLUMNIDLPCSHCOLUMNID
 
- Public Types inherited from IShellFolder
enum  tagSHGDN {
  SHGDN_NORMAL = 0 , SHGDN_INFOLDER = 1 , SHGDN_FOREDITING = 0x1000 , SHGDN_INCLUDE_NONFILESYS = 0x2000 ,
  SHGDN_FORADDRESSBAR = 0x4000 , SHGDN_FORPARSING = 0x8000
}
 
enum  tagSHCONTF {
  SHCONTF_FOLDERS = 32 , SHCONTF_NONFOLDERS = 64 , SHCONTF_INCLUDEHIDDEN = 128 , SHCONTF_INIT_ON_FIRST_NEXT = 256 ,
  SHCONTF_NETPRINTERSRCH = 512 , SHCONTF_SHAREABLE = 1024 , SHCONTF_STORAGE = 2048 , SHCONTF_NAVIGATION_ENUM = 0x01000 ,
  SHCONTF_FASTITEMS = 0x02000 , SHCONTF_FLATLIST = 0x04000 , SHCONTF_ENABLE_ASYNC = 0x08000 , SHCONTF_INCLUDESUPERHIDDEN = 0x10000
}
 
typedef IShellFolderLPSHELLFOLDER
 
typedef enum IShellFolder::tagSHGDN SHGNO
 
typedef DWORD SHGDNF
 
typedef DWORD SHCONTF
 
typedef ULONG SFGAOF
 
- Public Types inherited from IUnknown
typedef IUnknownLPUNKNOWN
 
- Public Types inherited from IPersistFolder2
typedef IPersistFolder2LPPERSISTFOLDER2
 
- Public Types inherited from IPersistFolder
typedef IPersistFolderLPPERSISTFOLDER
 
- Public Types inherited from IPersist
typedef IPersistLPPERSIST
 
- Static Public Member Functions inherited from ATL::CComObjectRootBase
static void WINAPI ObjectMain (bool)
 
static const struct _ATL_CATMAP_ENTRYGetCategoryMap ()
 
static HRESULT WINAPI InternalQueryInterface (void *pThis, const _ATL_INTMAP_ENTRY *pEntries, REFIID iid, void **ppvObject)
 
- Public Attributes inherited from ATL::CComObjectRootBase
LONG m_dwRef
 

Detailed Description

Definition at line 26 of file CDesktopFolder.h.

Constructor & Destructor Documentation

◆ CDesktopFolder()

CDesktopFolder::CDesktopFolder ( )

Definition at line 298 of file CDesktopFolder.cpp.

298 :
301{
302}
LPITEMIDLIST pidlRoot
#define NULL
Definition: types.h:112

◆ ~CDesktopFolder()

CDesktopFolder::~CDesktopFolder ( )

Definition at line 304 of file CDesktopFolder.cpp.

305{
306}

Member Function Documentation

◆ _GetSFFromPidl()

HRESULT CDesktopFolder::_GetSFFromPidl ( LPCITEMIDLIST  pidl,
IShellFolder2 **  psf 
)
private

Definition at line 355 of file CDesktopFolder.cpp.

356{
357 WCHAR szFileName[MAX_PATH];
358
359 if (_ILIsSpecialFolder(pidl))
360 return m_regFolder->QueryInterface(IID_PPV_ARG(IShellFolder2, psf));
361
362 lstrcpynW(szFileName, sPathTarget, MAX_PATH - 1);
363 PathAddBackslashW(szFileName);
364 int cLen = wcslen(szFileName);
365
366 if (!_ILSimpleGetTextW(pidl, szFileName + cLen, MAX_PATH - cLen))
367 return E_FAIL;
368
370 return m_SharedDesktopFSFolder->QueryInterface(IID_PPV_ARG(IShellFolder2, psf));
371 else
372 return m_DesktopFSFolder->QueryInterface(IID_PPV_ARG(IShellFolder2, psf));
373}
CComPtr< IShellFolder2 > m_SharedDesktopFSFolder
CComPtr< IShellFolder2 > m_DesktopFSFolder
CComPtr< IShellFolder2 > m_regFolder
#define E_FAIL
Definition: ddrawi.h:102
#define MAX_PATH
Definition: compat.h:34
#define lstrcpynW
Definition: compat.h:738
static BOOL _ILIsSpecialFolder(LPCITEMIDLIST pidl)
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define PathAddBackslashW
Definition: pathcch.h:301
DWORD _ILSimpleGetTextW(LPCITEMIDLIST pidl, LPWSTR szOut, UINT uOutSize)
Definition: pidl.c:2151
#define INVALID_FILE_ATTRIBUTES
Definition: vfdcmd.c:23
#define GetFileAttributes
Definition: winbase.h:3815
#define IID_PPV_ARG(Itype, ppType)
__wchar_t WCHAR
Definition: xmlstorage.h:180

Referenced by BindToObject(), GetAttributesOf(), GetDetailsOf(), GetDisplayNameOf(), GetUIObjectOf(), and SetNameOf().

◆ _ParseDisplayNameByParent()

HRESULT CDesktopFolder::_ParseDisplayNameByParent ( HWND  hwndOwner,
LPBC  pbc,
LPOLESTR  pszPath,
DWORD pchEaten,
PIDLIST_RELATIVE ppidl,
DWORD pdwAttributes 
)
private

Definition at line 375 of file CDesktopFolder.cpp.

382{
383 if (pchEaten)
384 *pchEaten = 0;
385
386 CComHeapPtr<ITEMIDLIST> pidlParent;
387 BOOL bPath = FALSE;
388 WCHAR wch = *lpszDisplayName;
389 if (((L'A' <= wch && wch <= L'Z') || (L'a' <= wch && wch <= L'z')) &&
390 (lpszDisplayName[1] == L':'))
391 {
392 // "C:..."
393 bPath = TRUE;
394 pidlParent.Attach(_ILCreateMyComputer());
395 }
396 else if (PathIsUNCW(lpszDisplayName)) // "\\\\..."
397 {
398 bPath = TRUE;
399 pidlParent.Attach(_ILCreateNetwork());
400 }
401
402 if (bPath)
403 {
404 if (!pidlParent)
405 return E_OUTOFMEMORY;
406
407 CComPtr<IShellFolder> pParentFolder;
408 SHBindToObject(NULL, pidlParent, IID_PPV_ARG(IShellFolder, &pParentFolder));
409
410 CComHeapPtr<ITEMIDLIST> pidlChild;
411 HRESULT hr = pParentFolder->ParseDisplayName(hwndOwner, pbc, lpszDisplayName,
412 pchEaten, &pidlChild, pdwAttributes);
413 if (FAILED(hr))
414 return hr;
415
416 *ppidl = ILCombine(pidlParent, pidlChild);
417 return (*ppidl ? S_OK : E_OUTOFMEMORY);
418 }
419
420 if (!UrlIsW(lpszDisplayName, URLIS_URL) || SHSkipJunctionBinding(pbc, NULL))
421 return E_INVALIDARG;
422
423 // Now lpszDisplayName is a URL
424 PARSEDURLW ParsedURL = { sizeof(ParsedURL) };
425 ::ParseURLW(lpszDisplayName, &ParsedURL);
426
427 switch (ParsedURL.nScheme)
428 {
429 case URL_SCHEME_FILE: // "file:..."
430 {
431 // Convert "file://..." to a normal path
433 DWORD cchPath = _countof(szPath);
434 HRESULT hr = PathCreateFromUrlW(lpszDisplayName, szPath, &cchPath, 0);
436 return hr;
437
438 CComPtr<IShellFolder> psfDesktop;
439 hr = SHGetDesktopFolder(&psfDesktop);
441 return hr;
442
443 // Parse by desktop folder
444 return psfDesktop->ParseDisplayName(hwndOwner, pbc, szPath, pchEaten, ppidl,
445 pdwAttributes);
446 }
447 case URL_SCHEME_HTTP: // "http:..."
448 case URL_SCHEME_HTTPS: // "https:..."
449 {
450 if (!BindCtx_ContainsObject(pbc, STR_PARSE_PREFER_FOLDER_BROWSING))
451 return E_INVALIDARG;
452
453 return HttpUrlParseDisplayName(hwndOwner,
454 pbc,
455 lpszDisplayName,
456 pchEaten,
457 ppidl,
458 pdwAttributes);
459 }
460 case URL_SCHEME_SHELL: // "shell:..."
461 {
462 return ShellUrlParseDisplayName(hwndOwner,
463 pbc,
464 lpszDisplayName,
465 pchEaten,
466 ppidl,
467 pdwAttributes);
468 }
471 {
472 WARN("We don't support 'ms-shell-rooted:' and 'ms-shell-idlist:' schemes\n");
473 break;
474 }
475 default:
476 {
477 TRACE("Scheme: %u\n", ParsedURL.nScheme);
478 break;
479 }
480 }
481
482 return E_INVALIDARG;
483}
HRESULT WINAPI SHGetDesktopFolder(IShellFolder **psf)
#define WARN(fmt,...)
Definition: debug.h:112
STDMETHODIMP HttpUrlParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, DWORD *pchEaten, PIDLIST_RELATIVE *ppidl, DWORD *pdwAttributes)
STDMETHODIMP ShellUrlParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, DWORD *pchEaten, PIDLIST_RELATIVE *ppidl, DWORD *pdwAttributes)
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define FAILED_UNEXPECTEDLY(hr)
Definition: precomp.h:121
HRESULT SHBindToObject(_In_opt_ IShellFolder *psf, _In_ LPCITEMIDLIST pidl, _In_ REFIID riid, _Out_ void **ppvObj)
Definition: utils.cpp:205
BOOL BindCtx_ContainsObject(_In_ IBindCtx *pBindCtx, _In_ LPCWSTR pszName)
Definition: utils.cpp:106
BOOL SHSkipJunctionBinding(_In_ IBindCtx *pbc, _In_ CLSID *pclsid)
Definition: utils.cpp:127
HRESULT WINAPI PathCreateFromUrlW(LPCWSTR pszUrl, LPWSTR pszPath, LPDWORD pcchPath, DWORD dwReserved)
Definition: path.c:3355
BOOL WINAPI PathIsUNCW(LPCWSTR lpszPath)
Definition: path.c:2266
HRESULT WINAPI ParseURLW(LPCWSTR x, PARSEDURLW *y)
Definition: url.c:197
BOOL WINAPI UrlIsW(LPCWSTR pszUrl, URLIS Urlis)
Definition: url.c:1933
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
#define S_OK
Definition: intsafe.h:52
#define FAILED(hr)
Definition: intsafe.h:51
LPCWSTR szPath
Definition: env.c:37
#define L(x)
Definition: ntvdm.h:50
LPITEMIDLIST _ILCreateMyComputer(void)
Definition: pidl.c:1657
LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: pidl.c:712
LPITEMIDLIST _ILCreateNetwork(void)
Definition: pidl.c:1713
HRESULT hr
Definition: shlfolder.c:183
@ URL_SCHEME_MSSHELLROOTED
Definition: shlwapi.h:1165
@ URL_SCHEME_HTTPS
Definition: shlwapi.h:1157
@ URL_SCHEME_MSSHELLIDLIST
Definition: shlwapi.h:1166
@ URL_SCHEME_HTTP
Definition: shlwapi.h:1148
@ URL_SCHEME_FILE
Definition: shlwapi.h:1155
@ URL_SCHEME_SHELL
Definition: shlwapi.h:1158
@ URLIS_URL
Definition: shlwapi.h:1191
#define _countof(array)
Definition: sndvol32.h:68
#define TRACE(s)
Definition: solgame.cpp:4
UINT nScheme
Definition: shlwapi.h:1437

Referenced by ParseDisplayName().

◆ BindToObject()

HRESULT WINAPI CDesktopFolder::BindToObject ( PCUIDLIST_RELATIVE  pidl,
LPBC  pbcReserved,
REFIID  riid,
LPVOID ppvOut 
)
override

Definition at line 625 of file CDesktopFolder.cpp.

630{
631 if (!pidl)
632 return E_INVALIDARG;
633
634 CComPtr<IShellFolder2> psf;
635 HRESULT hr = _GetSFFromPidl(pidl, &psf);
637 return hr;
638
639 return psf->BindToObject(pidl, pbcReserved, riid, ppvOut);
640}
HRESULT _GetSFFromPidl(LPCITEMIDLIST pidl, IShellFolder2 **psf)
REFIID riid
Definition: atlbase.h:39

Referenced by GetUIObjectOf().

◆ BindToStorage()

HRESULT WINAPI CDesktopFolder::BindToStorage ( PCUIDLIST_RELATIVE  pidl,
LPBC  pbcReserved,
REFIID  riid,
LPVOID ppvOut 
)
override

Definition at line 645 of file CDesktopFolder.cpp.

650{
651 FIXME ("(%p)->(pidl=%p,%p,%s,%p) stub\n",
652 this, pidl, pbcReserved, shdebugstr_guid (&riid), ppvOut);
653
654 *ppvOut = NULL;
655 return E_NOTIMPL;
656}
#define FIXME(fmt,...)
Definition: debug.h:111
#define E_NOTIMPL
Definition: ddrawi.h:99
const char * shdebugstr_guid(const struct _GUID *id)
Definition: debughlp.cpp:428

◆ CallBack()

HRESULT WINAPI CDesktopFolder::CallBack ( IShellFolder psf,
HWND  hwndOwner,
IDataObject pdtobj,
UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam 
)
override

Implements IContextMenuCB.

Definition at line 1075 of file CDesktopFolder.cpp.

1076{
1077 if (uMsg != DFM_MERGECONTEXTMENU && uMsg != DFM_INVOKECOMMAND)
1078 return S_OK;
1079
1080 /* no data object means no selection */
1081 if (!pdtobj)
1082 {
1083 if (uMsg == DFM_INVOKECOMMAND && wParam == 0)
1084 {
1085 if (32 >= (UINT_PTR)ShellExecuteW(hwndOwner, L"open", L"rundll32.exe",
1086 L"shell32.dll,Control_RunDLL desk.cpl", NULL, SW_SHOWNORMAL))
1087 {
1088 return E_FAIL;
1089 }
1090 return S_OK;
1091 }
1092 else if (uMsg == DFM_MERGECONTEXTMENU)
1093 {
1094 QCMINFO *pqcminfo = (QCMINFO *)lParam;
1095 HMENU hpopup = CreatePopupMenu();
1097 Shell_MergeMenus(pqcminfo->hmenu, hpopup, pqcminfo->indexMenu, pqcminfo->idCmdFirst++, pqcminfo->idCmdLast, MM_ADDSEPARATOR);
1098 DestroyMenu(hpopup);
1099 }
1100
1101 return S_OK;
1102 }
1103
1105 return S_OK;
1106
1107 return Shell_DefaultContextMenuCallBack(this, pdtobj);
1108}
#define IDS_PROPERTIES
Definition: resource.h:102
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
#define DFM_MERGECONTEXTMENU
Definition: precomp.h:44
#define DFM_INVOKECOMMAND
Definition: precomp.h:45
HRESULT WINAPI Shell_DefaultContextMenuCallBack(IShellFolder *psf, IDataObject *pdtobj)
Definition: shlfolder.cpp:497
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:63
unsigned __int3264 UINT_PTR
Definition: mstsclib_h.h:274
void WINAPI _InsertMenuItemW(HMENU hmenu, UINT indexMenu, BOOL fByPosition, UINT wID, UINT fType, LPCWSTR dwTypeData, UINT fState)
HINSTANCE WINAPI ShellExecuteW(HWND hwnd, LPCWSTR lpVerb, LPCWSTR lpFile, LPCWSTR lpParameters, LPCWSTR lpDirectory, INT nShowCmd)
Definition: shlexec.cpp:2402
UINT WINAPI Shell_MergeMenus(HMENU hmDst, HMENU hmSrc, UINT uInsert, UINT uIDAdjust, UINT uIDAdjustMax, ULONG uFlags)
Definition: shlmenu.c:856
#define MM_ADDSEPARATOR
Definition: shlobj.h:2513
#define DFM_CMD_PROPERTIES
Definition: shlobj.h:2597
HMENU hmenu
Definition: shlobj.h:1381
UINT idCmdLast
Definition: shlobj.h:1384
UINT idCmdFirst
Definition: shlobj.h:1383
UINT indexMenu
Definition: shlobj.h:1382
#define SW_SHOWNORMAL
Definition: winuser.h:770
HMENU WINAPI CreatePopupMenu(void)
Definition: menu.c:838
#define MFS_ENABLED
Definition: winuser.h:750
BOOL WINAPI DestroyMenu(_In_ HMENU)
#define MFT_STRING
Definition: winuser.h:746
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582

◆ CompareIDs()

HRESULT WINAPI CDesktopFolder::CompareIDs ( LPARAM  lParam,
PCUIDLIST_RELATIVE  pidl1,
PCUIDLIST_RELATIVE  pidl2 
)
override

Implements IShellFolder.

Definition at line 661 of file CDesktopFolder.cpp.

662{
663 bool bIsDesktopFolder1, bIsDesktopFolder2;
664
665 if (!pidl1 || !pidl2)
666 {
667 ERR("Got null pidl pointer (%Ix %p %p)!\n", lParam, pidl1, pidl2);
668 return E_INVALIDARG;
669 }
670
671 bIsDesktopFolder1 = _ILIsDesktop(pidl1);
672 bIsDesktopFolder2 = _ILIsDesktop(pidl2);
673 if (bIsDesktopFolder1 || bIsDesktopFolder2)
674 return MAKE_COMPARE_HRESULT(bIsDesktopFolder1 - bIsDesktopFolder2);
675
676 if (_ILIsSpecialFolder(pidl1) || _ILIsSpecialFolder(pidl2))
677 return m_regFolder->CompareIDs(lParam, pidl1, pidl2);
678
679 return m_DesktopFSFolder->CompareIDs(lParam, pidl1, pidl2);
680}
BOOL _ILIsDesktop(LPCITEMIDLIST pidl)
Definition: CBandSite.h:24
#define ERR(fmt,...)
Definition: debug.h:110
#define MAKE_COMPARE_HRESULT(x)
Definition: shellutils.h:577

◆ CreateViewObject()

HRESULT WINAPI CDesktopFolder::CreateViewObject ( HWND  hwndOwner,
REFIID  riid,
LPVOID ppvOut 
)
override

Definition at line 685 of file CDesktopFolder.cpp.

689{
691
692 TRACE ("(%p)->(hwnd=%p,%s,%p)\n",
693 this, hwndOwner, shdebugstr_guid (&riid), ppvOut);
694
695 if (!ppvOut)
696 return hr;
697
698 *ppvOut = NULL;
699
700 if (IsEqualIID (riid, IID_IDropTarget))
701 {
702 hr = m_DesktopFSFolder->CreateViewObject(hwndOwner, riid, ppvOut);
703 }
704 else if (IsEqualIID (riid, IID_IContextMenu))
705 {
706 HKEY hKeys[16];
707 UINT cKeys = 0;
708 AddClassKeyToArray(L"Directory\\Background", hKeys, &cKeys);
709
710 DEFCONTEXTMENU dcm;
711 dcm.hwnd = hwndOwner;
712 dcm.pcmcb = this;
713 dcm.pidlFolder = pidlRoot;
714 dcm.psf = this;
715 dcm.cidl = 0;
716 dcm.apidl = NULL;
717 dcm.cKeys = cKeys;
718 dcm.aKeys = hKeys;
720 hr = SHCreateDefaultContextMenu (&dcm, riid, ppvOut);
721 }
722 else if (IsEqualIID (riid, IID_IShellView))
723 {
724 SFV_CREATE sfvparams = {sizeof(SFV_CREATE), this};
725 hr = SHCreateShellFolderView(&sfvparams, (IShellView**)ppvOut);
726 }
727 TRACE ("-- (%p)->(interface=%p)\n", this, ppvOut);
728 return hr;
729}
HRESULT WINAPI SHCreateShellFolderView(const SFV_CREATE *pcsfv, IShellView **ppsv)
Definition: CDefView.cpp:3875
HRESULT WINAPI SHCreateDefaultContextMenu(const DEFCONTEXTMENU *pdcm, REFIID riid, void **ppv)
unsigned int UINT
Definition: ndis.h:50
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
LSTATUS AddClassKeyToArray(const WCHAR *szClass, HKEY *array, UINT *cKeys)
Definition: shlfolder.cpp:277
struct _SFV_CREATE SFV_CREATE
IContextMenuCB * pcmcb
Definition: shlobj.h:2535
IShellFolder * psf
Definition: shlobj.h:2537
IUnknown * punkAssociationInfo
Definition: shlobj.h:2540
PCUITEMID_CHILD_ARRAY apidl
Definition: shlobj.h:2539
const HKEY * aKeys
Definition: shlobj.h:2542
PCIDLIST_ABSOLUTE pidlFolder
Definition: shlobj.h:2536

◆ EnumObjects()

HRESULT WINAPI CDesktopFolder::EnumObjects ( HWND  hwndOwner,
DWORD  dwFlags,
LPENUMIDLIST *  ppEnumIDList 
)
override

Definition at line 600 of file CDesktopFolder.cpp.

601{
602 CComPtr<IEnumIDList> pRegEnumerator;
603 CComPtr<IEnumIDList> pDesktopEnumerator;
604 CComPtr<IEnumIDList> pCommonDesktopEnumerator;
605 HRESULT hr;
606
607 hr = m_regFolder->EnumObjects(hwndOwner, dwFlags, &pRegEnumerator);
608 if (FAILED(hr))
609 ERR("EnumObjects for reg folder failed\n");
610
611 hr = m_DesktopFSFolder->EnumObjects(hwndOwner, dwFlags, &pDesktopEnumerator);
612 if (FAILED(hr))
613 ERR("EnumObjects for desktop fs folder failed\n");
614
615 hr = m_SharedDesktopFSFolder->EnumObjects(hwndOwner, dwFlags, &pCommonDesktopEnumerator);
616 if (FAILED(hr))
617 ERR("EnumObjects for shared desktop fs folder failed\n");
618
619 return ShellObjectCreatorInit<CDesktopFolderEnum>(dwFlags,pRegEnumerator, pDesktopEnumerator, pCommonDesktopEnumerator, IID_PPV_ARG(IEnumIDList, ppEnumIDList));
620}
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1176

◆ EnumSearches()

HRESULT WINAPI CDesktopFolder::EnumSearches ( IEnumExtraSearch **  ppenum)
override

Implements IShellFolder2.

Definition at line 953 of file CDesktopFolder.cpp.

954{
955 FIXME ("(%p)\n", this);
956 return E_NOTIMPL;
957}

◆ FinalConstruct()

HRESULT WINAPI CDesktopFolder::FinalConstruct ( )

Definition at line 308 of file CDesktopFolder.cpp.

309{
310 WCHAR szMyPath[MAX_PATH];
311 HRESULT hr;
312
313 /* Create the root pidl */
315 if (!pidlRoot)
316 return E_OUTOFMEMORY;
317
318 /* Create the inner fs folder */
320 &CLSID_ShellFSFolder,
324 return hr;
325
326 /* Create the inner shared fs folder. Dont fail on failure. */
328 &CLSID_ShellFSFolder,
332 return hr;
333
334 /* Create the inner reg folder */
335 hr = CRegFolder_CreateInstance(&CLSID_ShellDesktop,
336 pidlRoot,
337 L"",
338 L"Desktop",
341 return hr;
342
343 /* Cache the path to the user desktop directory */
345 return E_UNEXPECTED;
346
347 sPathTarget = (LPWSTR)SHAlloc((wcslen(szMyPath) + 1) * sizeof(WCHAR));
348 if (!sPathTarget)
349 return E_OUTOFMEMORY;
350
351 wcscpy(sPathTarget, szMyPath);
352 return S_OK;
353}
static HRESULT SHELL32_CoCreateInitSF(LPCITEMIDLIST pidlRoot, PERSIST_FOLDER_TARGET_INFO *ppfti, LPCITEMIDLIST pidlChild, const GUID *clsid, REFIID riid, LPVOID *ppvOut)
Definition: CFindFolder.cpp:13
HRESULT CRegFolder_CreateInstance(const GUID *pGuid, LPCITEMIDLIST pidlRoot, LPCWSTR lpszPath, LPCWSTR lpszEnumKeyName, REFIID riid, void **ppv)
Definition: CRegFolder.cpp:876
LPVOID WINAPI SHAlloc(SIZE_T len)
Definition: shellole.c:304
BOOL WINAPI SHGetSpecialFolderPathW(HWND hwndOwner, LPWSTR szPath, int nFolder, BOOL bCreate)
Definition: shellpath.c:3092
LPITEMIDLIST _ILCreateDesktop(void)
Definition: pidl.c:1646
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
#define CSIDL_COMMON_DESKTOPDIRECTORY
Definition: shlobj.h:2182
#define CSIDL_DESKTOPDIRECTORY
Definition: shlobj.h:2173
#define E_UNEXPECTED
Definition: winerror.h:2456
WCHAR * LPWSTR
Definition: xmlstorage.h:184

◆ GetAttributesOf()

HRESULT WINAPI CDesktopFolder::GetAttributesOf ( UINT  cidl,
PCUITEMID_CHILD_ARRAY  apidl,
DWORD rgfInOut 
)
override

Definition at line 734 of file CDesktopFolder.cpp.

738{
739 HRESULT hr = S_OK;
740
741 TRACE("(%p)->(cidl=%d apidl=%p mask=%p (0x%08x))\n",
742 this, cidl, apidl, rgfInOut, rgfInOut ? *rgfInOut : 0);
743
744 if (cidl && !apidl)
745 return E_INVALIDARG;
746
747 if (*rgfInOut == 0)
748 *rgfInOut = ~0;
749
750 if(cidl == 0)
751 *rgfInOut &= dwDesktopAttributes;
752 else
753 {
754 /* TODO: always add SFGAO_CANLINK */
755 for (UINT i = 0; i < cidl; ++i)
756 {
757 pdump(*apidl);
758 if (_ILIsDesktop(*apidl))
759 *rgfInOut &= dwDesktopAttributes;
760 else if (_ILIsMyComputer(apidl[i]))
761 *rgfInOut &= dwMyComputerAttributes;
762 else if (_ILIsNetHood(apidl[i]))
763 *rgfInOut &= dwMyNetPlacesAttributes;
764 else if (_ILIsFolder(apidl[i]) || _ILIsValue(apidl[i]) || _ILIsSpecialFolder(apidl[i]))
765 {
766 CComPtr<IShellFolder2> psf;
767 HRESULT hr = _GetSFFromPidl(apidl[i], &psf);
769 continue;
770
771 psf->GetAttributesOf(1, &apidl[i], rgfInOut);
772 }
773 else
774 ERR("Got an unknown pidl type!!!\n");
775 }
776 }
777 /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */
778 *rgfInOut &= ~SFGAO_VALIDATE;
779
780 TRACE("-- result=0x%08x\n", *rgfInOut);
781
782 return hr;
783}
static const DWORD dwMyComputerAttributes
static const DWORD dwDesktopAttributes
static DWORD dwMyNetPlacesAttributes
void pdump(LPCITEMIDLIST pidl)
Definition: debughlp.cpp:311
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
BOOL _ILIsFolder(LPCITEMIDLIST pidl)
Definition: pidl.c:2020
BOOL _ILIsMyComputer(LPCITEMIDLIST pidl)
Definition: pidl.c:1975
BOOL _ILIsNetHood(LPCITEMIDLIST pidl)
Definition: pidl.c:1953
BOOL _ILIsValue(LPCITEMIDLIST pidl)
Definition: pidl.c:2029

◆ GetClassID()

HRESULT WINAPI CDesktopFolder::GetClassID ( CLSID lpClassId)
override

Implements IPersist.

Definition at line 1043 of file CDesktopFolder.cpp.

1044{
1045 TRACE ("(%p)\n", this);
1046
1047 if (!lpClassId)
1048 return E_POINTER;
1049
1050 *lpClassId = CLSID_ShellDesktop;
1051
1052 return S_OK;
1053}
#define E_POINTER
Definition: winerror.h:2365

◆ GetColumnDetails()

HRESULT CDesktopFolder::GetColumnDetails ( UINT  iColumn,
SHELLDETAILS sd 
)
staticprivate

Definition at line 1006 of file CDesktopFolder.cpp.

1007{
1008 /* CDesktopFolder may override the flags and/or name if desired */
1009 return CFSFolder::GetFSColumnDetails(iColumn, sd);
1010}
static HRESULT GetFSColumnDetails(UINT iColumn, SHELLDETAILS &sd)
Definition: CFSFolder.cpp:541
static const WCHAR sd[]
Definition: suminfo.c:286

Referenced by GetDetailsOf().

◆ GetCurFolder()

HRESULT WINAPI CDesktopFolder::GetCurFolder ( PIDLIST_ABSOLUTE pidl)
override

Implements IPersistFolder2.

Definition at line 1065 of file CDesktopFolder.cpp.

1066{
1067 TRACE ("(%p)->(%p)\n", this, pidl);
1068
1069 if (!pidl)
1070 return E_INVALIDARG; /* xp doesn't have this check and crashes on NULL */
1071 *pidl = ILClone (pidlRoot);
1072 return S_OK;
1073}
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
Definition: pidl.c:237

◆ GetDefaultColumn()

HRESULT WINAPI CDesktopFolder::GetDefaultColumn ( DWORD  dwRes,
ULONG pSort,
ULONG pDisplay 
)
override

Implements IShellFolder2.

Definition at line 959 of file CDesktopFolder.cpp.

960{
961 TRACE ("(%p)\n", this);
962
963 if (pSort)
964 *pSort = 0;
965 if (pDisplay)
966 *pDisplay = 0;
967
968 return S_OK;
969}

◆ GetDefaultColumnState()

HRESULT WINAPI CDesktopFolder::GetDefaultColumnState ( UINT  iColumn,
DWORD pcsFlags 
)
override

Implements IShellFolder2.

Definition at line 971 of file CDesktopFolder.cpp.

972{
973 HRESULT hr;
974 TRACE ("(%p)\n", this);
975
976 if (!pcsFlags)
977 return E_INVALIDARG;
978
979 hr = CFSFolder::GetDefaultFSColumnState(iColumn, *pcsFlags);
980 /*
981 // CDesktopFolder may override the flags if desired (future)
982 switch(iColumn)
983 {
984 case SHFSF_COL_FATTS:
985 *pcsFlags &= ~SHCOLSTATE_ONBYDEFAULT;
986 break;
987 }
988 */
989 return hr;
990}
static HRESULT GetDefaultFSColumnState(UINT iColumn, SHCOLSTATEF &csFlags)
Definition: CFSFolder.cpp:551

◆ GetDefaultSearchGUID()

HRESULT WINAPI CDesktopFolder::GetDefaultSearchGUID ( GUID pguid)
override

Implements IShellFolder2.

Definition at line 947 of file CDesktopFolder.cpp.

948{
949 FIXME ("(%p)\n", this);
950 return E_NOTIMPL;
951}

◆ GetDetailsEx()

HRESULT WINAPI CDesktopFolder::GetDetailsEx ( PCUITEMID_CHILD  pidl,
const SHCOLUMNID pscid,
VARIANT pv 
)
override

Implements IShellFolder2.

Definition at line 992 of file CDesktopFolder.cpp.

996{
997 FIXME ("(%p)\n", this);
998
999 return E_NOTIMPL;
1000}

◆ GetDetailsOf()

HRESULT WINAPI CDesktopFolder::GetDetailsOf ( PCUITEMID_CHILD  pidl,
UINT  iColumn,
SHELLDETAILS psd 
)
override

Implements IShellFolder2.

Definition at line 1012 of file CDesktopFolder.cpp.

1016{
1017 if (!psd)
1018 return E_INVALIDARG;
1019
1020 if (!pidl)
1021 {
1022 return GetColumnDetails(iColumn, *psd);
1023 }
1024
1025 CComPtr<IShellFolder2> psf;
1026 HRESULT hr = _GetSFFromPidl(pidl, &psf);
1028 return hr;
1029
1030 hr = psf->GetDetailsOf(pidl, iColumn, psd);
1032 return hr;
1033
1034 return hr;
1035}
static HRESULT GetColumnDetails(UINT iColumn, SHELLDETAILS &sd)

◆ GetDisplayNameOf()

HRESULT WINAPI CDesktopFolder::GetDisplayNameOf ( PCUITEMID_CHILD  pidl,
DWORD  dwFlags,
LPSTRRET  strRet 
)
override

Definition at line 891 of file CDesktopFolder.cpp.

892{
893 TRACE ("(%p)->(pidl=%p,0x%08x,%p)\n", this, pidl, dwFlags, strRet);
894 pdump (pidl);
895
896 if (!strRet)
897 return E_INVALIDARG;
898
899 if (!_ILIsPidlSimple (pidl))
900 {
901 return SHELL32_GetDisplayNameOfChild(this, pidl, dwFlags, strRet);
902 }
903 else if (_ILIsDesktop(pidl))
904 {
906 return SHSetStrRet(strRet, sPathTarget);
907 else
908 return m_regFolder->GetDisplayNameOf(pidl, dwFlags, strRet);
909 }
910
911 /* file system folder or file rooted at the desktop */
912 CComPtr<IShellFolder2> psf;
913 HRESULT hr = _GetSFFromPidl(pidl, &psf);
915 return hr;
916
917 return psf->GetDisplayNameOf(pidl, dwFlags, strRet);
918}
#define GET_SHGDN_RELATION(dwFlags)
Definition: precomp.h:53
#define GET_SHGDN_FOR(dwFlags)
Definition: precomp.h:52
BOOL WINAPI _ILIsPidlSimple(LPCITEMIDLIST pidl)
HRESULT SHELL32_GetDisplayNameOfChild(IShellFolder2 *psf, LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet)
Definition: shlfolder.cpp:206

◆ GetMaxLength()

STDMETHODIMP CDesktopFolder::GetMaxLength ( LPCWSTR  pszName,
int piMaxNameLen 
)
inlineoverride

Definition at line 114 of file CDesktopFolder.h.

115 {
116 return E_NOTIMPL;
117 }

◆ GetUIObjectOf()

HRESULT WINAPI CDesktopFolder::GetUIObjectOf ( HWND  hwndOwner,
UINT  cidl,
PCUITEMID_CHILD_ARRAY  apidl,
REFIID  riid,
UINT prgfInOut,
LPVOID ppvOut 
)
override

Definition at line 797 of file CDesktopFolder.cpp.

804{
805 LPVOID pObj = NULL;
807
808 TRACE ("(%p)->(%p,%u,apidl=%p,%s,%p,%p)\n",
809 this, hwndOwner, cidl, apidl, shdebugstr_guid (&riid), prgfInOut, ppvOut);
810
811 if (!ppvOut)
812 return hr;
813
814 *ppvOut = NULL;
815
816 if (cidl == 1 && !_ILIsSpecialFolder(apidl[0]))
817 {
818 CComPtr<IShellFolder2> psf;
819 HRESULT hr = _GetSFFromPidl(apidl[0], &psf);
821 return hr;
822
823 return psf->GetUIObjectOf(hwndOwner, cidl, apidl, riid, prgfInOut, ppvOut);
824 }
825
826 if (IsEqualIID (riid, IID_IContextMenu))
827 {
828 if (cidl > 0 && _ILIsSpecialFolder(apidl[0]))
829 {
830 hr = m_regFolder->GetUIObjectOf(hwndOwner, cidl, apidl, riid, prgfInOut, &pObj);
831 }
832 else
833 {
834 /* Do not use the context menu of the CFSFolder here. */
835 /* We need to pass a pointer of the CDesktopFolder so as the data object that the context menu gets is rooted to the desktop */
836 /* Otherwise operations like that involve items from both user and shared desktop will not work */
837 HKEY hKeys[16];
838 UINT cKeys = 0;
839 if (cidl > 0)
840 {
841 AddFSClassKeysToArray(cidl, apidl, hKeys, &cKeys);
842 }
843
844 DEFCONTEXTMENU dcm;
845 dcm.hwnd = hwndOwner;
846 dcm.pcmcb = this;
847 dcm.pidlFolder = pidlRoot;
848 dcm.psf = this;
849 dcm.cidl = cidl;
850 dcm.apidl = apidl;
851 dcm.cKeys = cKeys;
852 dcm.aKeys = hKeys;
854 hr = SHCreateDefaultContextMenu (&dcm, riid, &pObj);
855 }
856 }
857 else if (IsEqualIID (riid, IID_IDataObject) && (cidl >= 1))
858 {
859 hr = IDataObject_Constructor( hwndOwner, pidlRoot, apidl, cidl, TRUE, (IDataObject **)&pObj);
860 }
861 else if ((IsEqualIID (riid, IID_IExtractIconA) || IsEqualIID (riid, IID_IExtractIconW)) && (cidl == 1))
862 {
863 hr = m_regFolder->GetUIObjectOf(hwndOwner, cidl, apidl, riid, prgfInOut, &pObj);
864 }
865 else if (IsEqualIID (riid, IID_IDropTarget) && (cidl == 1))
866 {
867 CComPtr<IShellFolder> psfChild;
868 hr = this->BindToObject(apidl[0], NULL, IID_PPV_ARG(IShellFolder, &psfChild));
870 return hr;
871
872 return psfChild->CreateViewObject(NULL, riid, ppvOut);
873 }
874 else
876
877 if (SUCCEEDED(hr) && !pObj)
879
880 *ppvOut = pObj;
881 TRACE ("(%p)->hr=0x%08x\n", this, hr);
882 return hr;
883}
HRESULT IDataObject_Constructor(HWND hwndOwner, PCIDLIST_ABSOLUTE pMyPidl, PCUIDLIST_RELATIVE_ARRAY apidl, UINT cidl, BOOL bExtendedObject, IDataObject **dataObject)
STDMETHOD() BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) override
#define SUCCEEDED(hr)
Definition: intsafe.h:50
const GUID IID_IDataObject
void AddFSClassKeysToArray(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, HKEY *array, UINT *cKeys)
Definition: shlfolder.cpp:292
#define E_NOINTERFACE
Definition: winerror.h:2364

◆ GetValidCharacters()

STDMETHODIMP CDesktopFolder::GetValidCharacters ( LPWSTR ppwszValidChars,
LPWSTR ppwszInvalidChars 
)
inlineoverride

Definition at line 120 of file CDesktopFolder.h.

121 {
122 if (ppwszValidChars)
123 {
124 *ppwszValidChars = NULL;
125 }
126 if (ppwszInvalidChars)
127 {
128 SHStrDupW(INVALID_FILETITLE_CHARACTERSW, ppwszInvalidChars);
129 }
130 return S_OK;
131 }
HRESULT WINAPI SHStrDupW(LPCWSTR src, LPWSTR *dest)
Definition: string.c:2012
#define INVALID_FILETITLE_CHARACTERSW
Definition: undocshell.h:897

◆ HttpUrlParseDisplayName()

STDMETHODIMP CDesktopFolder::HttpUrlParseDisplayName ( HWND  hwndOwner,
LPBC  pbc,
LPOLESTR  lpszDisplayName,
DWORD pchEaten,
PIDLIST_RELATIVE ppidl,
DWORD pdwAttributes 
)
private

Definition at line 128 of file CDesktopFolder.cpp.

135{
136 FIXME("\n");
137 return E_NOTIMPL; // FIXME
138}

Referenced by _ParseDisplayNameByParent().

◆ Initialize()

HRESULT WINAPI CDesktopFolder::Initialize ( PCIDLIST_ABSOLUTE  pidl)
override

Implements IPersistFolder.

Definition at line 1055 of file CDesktopFolder.cpp.

1056{
1057 TRACE ("(%p)->(%p)\n", this, pidl);
1058
1059 if (!pidl)
1060 return S_OK;
1061
1062 return E_INVALIDARG;
1063}

◆ MapColumnToSCID()

HRESULT WINAPI CDesktopFolder::MapColumnToSCID ( UINT  column,
SHCOLUMNID pscid 
)
override

Implements IShellFolder2.

Definition at line 1037 of file CDesktopFolder.cpp.

1038{
1039 FIXME ("(%p)\n", this);
1040 return E_NOTIMPL;
1041}

◆ ParseDisplayName()

HRESULT WINAPI CDesktopFolder::ParseDisplayName ( HWND  hwndOwner,
LPBC  pbc,
LPOLESTR  lpszDisplayName,
DWORD pchEaten,
PIDLIST_RELATIVE ppidl,
DWORD pdwAttributes 
)
override

Definition at line 492 of file CDesktopFolder.cpp.

499{
500 TRACE ("(%p)->(HWND=%p,%p,%p=%s,%p,pidl=%p,%p)\n",
501 this, hwndOwner, pbc, lpszDisplayName, debugstr_w(lpszDisplayName),
502 pchEaten, ppidl, pdwAttributes);
503
504 if (!ppidl)
505 return E_INVALIDARG;
506
507 *ppidl = NULL;
508
509 if (!lpszDisplayName)
510 return E_INVALIDARG;
511
512 if (!*lpszDisplayName)
513 {
514 *ppidl = _ILCreateMyComputer();
515 return (*ppidl ? S_OK : E_OUTOFMEMORY);
516 }
517
518 if (lpszDisplayName[0] == ':' && lpszDisplayName[1] == ':')
519 {
520 return m_regFolder->ParseDisplayName(hwndOwner, pbc, lpszDisplayName, pchEaten, ppidl,
521 pdwAttributes);
522 }
523
524 HRESULT hr = _ParseDisplayNameByParent(hwndOwner, pbc, lpszDisplayName, pchEaten, ppidl,
525 pdwAttributes);
526 if (SUCCEEDED(hr))
527 {
528 if (BindCtx_ContainsObject(pbc, STR_PARSE_TRANSLATE_ALIASES))
529 {
530 CComHeapPtr<ITEMIDLIST> pidlAlias;
531 if (SUCCEEDED(Shell_TranslateIDListAlias(*ppidl, NULL, &pidlAlias, 0xFFFF)))
532 {
533 ILFree(*ppidl);
534 *ppidl = pidlAlias.Detach();
535 }
536 }
537
538 TRACE ("(%p)->(-- ret=0x%08x)\n", this, hr);
539 return hr;
540 }
541
543 return hr;
544
545 if (BindCtx_ContainsObject(pbc, STR_DONT_PARSE_RELATIVE))
546 return E_INVALIDARG;
547
548 if (SHIsFileSysBindCtx(pbc, NULL) == S_OK)
549 return hr;
550
551 BIND_OPTS BindOps = { sizeof(BindOps) };
553 if (pbc && SUCCEEDED(pbc->GetBindOptions(&BindOps)) && (BindOps.grfMode & STGM_CREATE))
554 {
555 BindOps.grfMode &= ~STGM_CREATE;
556 bCreate = TRUE;
557 pbc->SetBindOptions(&BindOps);
558 }
559
561 {
562 hr = m_DesktopFSFolder->ParseDisplayName(hwndOwner,
563 pbc,
564 lpszDisplayName,
565 pchEaten,
566 ppidl,
567 pdwAttributes);
568 }
569
571 {
572 hr = m_SharedDesktopFSFolder->ParseDisplayName(hwndOwner,
573 pbc,
574 lpszDisplayName,
575 pchEaten,
576 ppidl,
577 pdwAttributes);
578 }
579
581 {
582 BindOps.grfMode |= STGM_CREATE;
583 pbc->SetBindOptions(&BindOps);
584 hr = m_DesktopFSFolder->ParseDisplayName(hwndOwner,
585 pbc,
586 lpszDisplayName,
587 pchEaten,
588 ppidl,
589 pdwAttributes);
590 }
591
592 TRACE ("(%p)->(-- ret=0x%08x)\n", this, hr);
593
594 return hr;
595}
HRESULT _ParseDisplayNameByParent(HWND hwndOwner, LPBC pbc, LPOLESTR pszPath, DWORD *pchEaten, PIDLIST_RELATIVE *ppidl, DWORD *pdwAttributes)
HRESULT SHIsFileSysBindCtx(_In_ IBindCtx *pBindCtx, _Out_opt_ WIN32_FIND_DATAW *pFindData)
Definition: utils.cpp:139
BOOL Shell_FailForceReturn(_In_ HRESULT hr)
Definition: utils.cpp:156
HRESULT Shell_TranslateIDListAlias(_In_ LPCITEMIDLIST pidl, _In_ HANDLE hToken, _Out_ LPITEMIDLIST *ppidlAlias, _In_ DWORD dwFlags)
Definition: utils.cpp:97
#define debugstr_w
Definition: kernel32.h:32
#define STGM_CREATE
Definition: objbase.h:926
void WINAPI ILFree(LPITEMIDLIST pidl)
Definition: pidl.c:938
_In_ int _In_ BOOL bCreate
Definition: shlobj.h:1511

◆ SetNameOf()

HRESULT WINAPI CDesktopFolder::SetNameOf ( HWND  hwndOwner,
PCUITEMID_CHILD  pidl,
LPCOLESTR  lpName,
DWORD  dwFlags,
PITEMID_CHILD pPidlOut 
)
override

Implements IShellFolder.

Definition at line 932 of file CDesktopFolder.cpp.

938{
939 CComPtr<IShellFolder2> psf;
940 HRESULT hr = _GetSFFromPidl(pidl, &psf);
942 return hr;
943
944 return psf->SetNameOf(hwndOwner, pidl, lpName, dwFlags, pPidlOut);
945}
_In_ LPCSTR lpName
Definition: winbase.h:2789

◆ ShellUrlParseDisplayName()

STDMETHODIMP CDesktopFolder::ShellUrlParseDisplayName ( HWND  hwndOwner,
LPBC  pbc,
LPOLESTR  lpszDisplayName,
DWORD pchEaten,
PIDLIST_RELATIVE ppidl,
DWORD pdwAttributes 
)
private

Definition at line 29 of file CDesktopFolder.cpp.

36{
37 LPWSTR pch;
38 INT cch, csidl;
40 PARSEDURLW ParsedURL = { sizeof(ParsedURL) };
41
42 ::ParseURLW(lpszDisplayName, &ParsedURL);
43
44 DWORD attrs = (pdwAttributes ? *pdwAttributes : 0) | SFGAO_STREAM;
45 if (ParsedURL.pszSuffix[0] == L':' && ParsedURL.pszSuffix[1] == L':') // It begins from "::"
46 {
47 CComPtr<IShellFolder> psfDesktop;
48 hr = SHGetDesktopFolder(&psfDesktop);
49 if (SUCCEEDED(hr))
50 {
51 CComPtr<IBindCtx> pBindCtx;
52 hr = ::CreateBindCtx(0, &pBindCtx);
53 if (SUCCEEDED(hr))
54 {
55 BIND_OPTS BindOps = { sizeof(BindOps) };
56 BindOps.grfMode = STGM_CREATE;
57 pBindCtx->SetBindOptions(&BindOps);
58 hr = psfDesktop->ParseDisplayName(hwndOwner, pBindCtx,
59 (LPWSTR)ParsedURL.pszSuffix,
60 pchEaten, ppidl, &attrs);
61 }
62 }
63 }
64 else
65 {
66 csidl = Shell_ParseSpecialFolder(ParsedURL.pszSuffix, &pch, &cch);
67 if (csidl == -1)
68 {
69 ERR("\n");
70 return hr;
71 }
72
73 CComHeapPtr<ITEMIDLIST> pidlLocation;
74 hr = SHGetFolderLocation(hwndOwner, (csidl | CSIDL_FLAG_CREATE), NULL, 0, &pidlLocation);
76 return hr;
77
78 if (pch && *pch)
79 {
80 CComPtr<IShellFolder> psfFolder;
81 hr = SHBindToObject(NULL, pidlLocation, IID_PPV_ARG(IShellFolder, &psfFolder));
82 if (SUCCEEDED(hr))
83 {
84 CComHeapPtr<ITEMIDLIST> pidlNew;
85 hr = psfFolder->ParseDisplayName(hwndOwner, pbc, pch, pchEaten, &pidlNew, &attrs);
86 if (SUCCEEDED(hr))
87 {
88 hr = SHILCombine(pidlLocation, pidlNew, ppidl);
89 if (pchEaten)
90 *pchEaten += cch;
91 }
92 }
93 }
94 else
95 {
96 if (attrs)
97 hr = SHGetNameAndFlagsW(pidlLocation, 0, NULL, 0, &attrs);
98
99 if (SUCCEEDED(hr))
100 {
101 if (pchEaten)
102 *pchEaten = cch;
103 *ppidl = pidlLocation.Detach();
104 }
105 }
106 }
107
108 // FIXME: SHWindowsPolicy
109 if (SUCCEEDED(hr) && (attrs & SFGAO_STREAM) &&
110 !BindCtx_ContainsObject(pbc, STR_PARSE_SHELL_PROTOCOL_TO_FILE_OBJECTS))
111 {
112 ILFree(*ppidl);
113 *ppidl = NULL;
115 }
116
117 if (pdwAttributes)
118 *pdwAttributes = attrs;
119
120 // FIXME: SHWindowsPolicy
123
124 return hr;
125}
EXTERN_C INT Shell_ParseSpecialFolder(_In_ LPCWSTR pszStart, _Out_ LPWSTR *ppch, _Out_ INT *pcch)
Definition: shellpath.c:1859
HRESULT SHGetNameAndFlagsW(_In_ LPCITEMIDLIST pidl, _In_ DWORD dwFlags, _Out_opt_ LPWSTR pszText, _In_ UINT cchBuf, _Inout_opt_ DWORD *pdwAttributes)
Definition: utils.cpp:279
HRESULT WINAPI SHGetFolderLocation(HWND hwndOwner, int nFolder, HANDLE hToken, DWORD dwReserved, LPITEMIDLIST *ppidl)
Definition: shellpath.c:3124
#define pch(ap)
Definition: match.c:418
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
static DWORD DWORD void LPSTR DWORD cch
Definition: str.c:202
HRESULT WINAPI CreateBindCtx(DWORD reserved, LPBC *ppbc)
Definition: bindctx.c:556
#define CSIDL_FLAG_CREATE
LPCWSTR pszSuffix
Definition: shlwapi.h:1435
int32_t INT
Definition: typedefs.h:58
#define ERROR_PATH_NOT_FOUND
Definition: winerror.h:106
#define HRESULT_FROM_WIN32(x)
Definition: winerror.h:92

Referenced by _ParseDisplayNameByParent().

Member Data Documentation

◆ m_DesktopFSFolder

CComPtr<IShellFolder2> CDesktopFolder::m_DesktopFSFolder
private

◆ m_regFolder

CComPtr<IShellFolder2> CDesktopFolder::m_regFolder
private

◆ m_SharedDesktopFSFolder

CComPtr<IShellFolder2> CDesktopFolder::m_SharedDesktopFSFolder
private

Definition at line 37 of file CDesktopFolder.h.

Referenced by _GetSFFromPidl(), EnumObjects(), FinalConstruct(), and ParseDisplayName().

◆ pidlRoot

LPITEMIDLIST CDesktopFolder::pidlRoot
private

Definition at line 41 of file CDesktopFolder.h.

Referenced by CreateViewObject(), FinalConstruct(), GetCurFolder(), and GetUIObjectOf().

◆ sPathTarget

LPWSTR CDesktopFolder::sPathTarget
private

Definition at line 40 of file CDesktopFolder.h.

Referenced by _GetSFFromPidl(), FinalConstruct(), and GetDisplayNameOf().


The documentation for this class was generated from the following files: