ReactOS 0.4.15-dev-7924-g5949c20
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)
 

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 308 of file CDesktopFolder.cpp.

308 :
311{
312}
LPITEMIDLIST pidlRoot
#define NULL
Definition: types.h:112

◆ ~CDesktopFolder()

CDesktopFolder::~CDesktopFolder ( )

Definition at line 314 of file CDesktopFolder.cpp.

315{
316}

Member Function Documentation

◆ _GetSFFromPidl()

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

Definition at line 365 of file CDesktopFolder.cpp.

366{
367 WCHAR szFileName[MAX_PATH];
368
369 if (_ILIsSpecialFolder(pidl))
370 return m_regFolder->QueryInterface(IID_PPV_ARG(IShellFolder2, psf));
371
372 lstrcpynW(szFileName, sPathTarget, MAX_PATH - 1);
373 PathAddBackslashW(szFileName);
374 int cLen = wcslen(szFileName);
375
376 if (!_ILSimpleGetTextW(pidl, szFileName + cLen, MAX_PATH - cLen))
377 return E_FAIL;
378
380 return m_SharedDesktopFSFolder->QueryInterface(IID_PPV_ARG(IShellFolder2, psf));
381 else
382 return m_DesktopFSFolder->QueryInterface(IID_PPV_ARG(IShellFolder2, psf));
383}
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 385 of file CDesktopFolder.cpp.

392{
393 if (pchEaten)
394 *pchEaten = 0;
395
396 CComHeapPtr<ITEMIDLIST> pidlParent;
397 BOOL bPath = FALSE;
398 WCHAR wch = *lpszDisplayName;
399 if (((L'A' <= wch && wch <= L'Z') || (L'a' <= wch && wch <= L'z')) &&
400 (lpszDisplayName[1] == L':'))
401 {
402 // "C:..."
403 bPath = TRUE;
404 pidlParent.Attach(_ILCreateMyComputer());
405 }
406 else if (PathIsUNCW(lpszDisplayName)) // "\\\\..."
407 {
408 bPath = TRUE;
409 pidlParent.Attach(_ILCreateNetwork());
410 }
411
412 if (bPath)
413 {
414 if (!pidlParent)
415 return E_OUTOFMEMORY;
416
417 CComPtr<IShellFolder> pParentFolder;
418 SHBindToObject(NULL, pidlParent, IID_PPV_ARG(IShellFolder, &pParentFolder));
419
420 CComHeapPtr<ITEMIDLIST> pidlChild;
421 HRESULT hr = pParentFolder->ParseDisplayName(hwndOwner, pbc, lpszDisplayName,
422 pchEaten, &pidlChild, pdwAttributes);
423 if (FAILED(hr))
424 return hr;
425
426 *ppidl = ILCombine(pidlParent, pidlChild);
427 return (*ppidl ? S_OK : E_OUTOFMEMORY);
428 }
429
430 if (!UrlIsW(lpszDisplayName, URLIS_URL) || SHSkipJunctionBinding(pbc, NULL))
431 return E_INVALIDARG;
432
433 // Now lpszDisplayName is a URL
434 PARSEDURLW ParsedURL = { sizeof(ParsedURL) };
435 ::ParseURLW(lpszDisplayName, &ParsedURL);
436
437 switch (ParsedURL.nScheme)
438 {
439 case URL_SCHEME_FILE: // "file:..."
440 {
441 // Convert "file://..." to a normal path
443 DWORD cchPath = _countof(szPath);
444 HRESULT hr = PathCreateFromUrlW(lpszDisplayName, szPath, &cchPath, 0);
446 return hr;
447
448 CComPtr<IShellFolder> psfDesktop;
449 hr = SHGetDesktopFolder(&psfDesktop);
451 return hr;
452
453 // Parse by desktop folder
454 return psfDesktop->ParseDisplayName(hwndOwner, pbc, szPath, pchEaten, ppidl,
455 pdwAttributes);
456 }
457 case URL_SCHEME_HTTP: // "http:..."
458 case URL_SCHEME_HTTPS: // "https:..."
459 {
460 if (!BindCtx_ContainsObject(pbc, STR_PARSE_PREFER_FOLDER_BROWSING))
461 return E_INVALIDARG;
462
463 return HttpUrlParseDisplayName(hwndOwner,
464 pbc,
465 lpszDisplayName,
466 pchEaten,
467 ppidl,
468 pdwAttributes);
469 }
470 case URL_SCHEME_SHELL: // "shell:..."
471 {
472 return ShellUrlParseDisplayName(hwndOwner,
473 pbc,
474 lpszDisplayName,
475 pchEaten,
476 ppidl,
477 pdwAttributes);
478 }
481 {
482 WARN("We don't support 'ms-shell-rooted:' and 'ms-shell-idlist:' schemes\n");
483 break;
484 }
485 default:
486 {
487 TRACE("Scheme: %u\n", ParsedURL.nScheme);
488 break;
489 }
490 }
491
492 return E_INVALIDARG;
493}
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 635 of file CDesktopFolder.cpp.

640{
641 if (!pidl)
642 return E_INVALIDARG;
643
644 CComPtr<IShellFolder2> psf;
645 HRESULT hr = _GetSFFromPidl(pidl, &psf);
647 return hr;
648
649 return psf->BindToObject(pidl, pbcReserved, riid, ppvOut);
650}
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 655 of file CDesktopFolder.cpp.

660{
661 FIXME ("(%p)->(pidl=%p,%p,%s,%p) stub\n",
662 this, pidl, pbcReserved, shdebugstr_guid (&riid), ppvOut);
663
664 *ppvOut = NULL;
665 return E_NOTIMPL;
666}
#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 1068 of file CDesktopFolder.cpp.

1069{
1070 if (uMsg != DFM_MERGECONTEXTMENU && uMsg != DFM_INVOKECOMMAND)
1071 return S_OK;
1072
1073 /* no data object means no selection */
1074 if (!pdtobj)
1075 {
1076 if (uMsg == DFM_INVOKECOMMAND && wParam == 0)
1077 {
1078 if (32 >= (UINT_PTR)ShellExecuteW(hwndOwner, L"open", L"rundll32.exe",
1079 L"shell32.dll,Control_RunDLL desk.cpl", NULL, SW_SHOWNORMAL))
1080 {
1081 return E_FAIL;
1082 }
1083 return S_OK;
1084 }
1085 else if (uMsg == DFM_MERGECONTEXTMENU)
1086 {
1087 QCMINFO *pqcminfo = (QCMINFO *)lParam;
1088 HMENU hpopup = CreatePopupMenu();
1090 Shell_MergeMenus(pqcminfo->hmenu, hpopup, pqcminfo->indexMenu, pqcminfo->idCmdFirst++, pqcminfo->idCmdLast, MM_ADDSEPARATOR);
1091 DestroyMenu(hpopup);
1092 }
1093
1094 return S_OK;
1095 }
1096
1098 return S_OK;
1099
1100 return Shell_DefaultContextMenuCallBack(this, pdtobj);
1101}
#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 671 of file CDesktopFolder.cpp.

672{
673 bool bIsDesktopFolder1, bIsDesktopFolder2;
674
675 if (!pidl1 || !pidl2)
676 {
677 ERR("Got null pidl pointer (%Ix %p %p)!\n", lParam, pidl1, pidl2);
678 return E_INVALIDARG;
679 }
680
681 bIsDesktopFolder1 = _ILIsDesktop(pidl1);
682 bIsDesktopFolder2 = _ILIsDesktop(pidl2);
683 if (bIsDesktopFolder1 || bIsDesktopFolder2)
684 return MAKE_COMPARE_HRESULT(bIsDesktopFolder1 - bIsDesktopFolder2);
685
686 if (_ILIsSpecialFolder(pidl1) || _ILIsSpecialFolder(pidl2))
687 return m_regFolder->CompareIDs(lParam, pidl1, pidl2);
688
689 return m_DesktopFSFolder->CompareIDs(lParam, pidl1, pidl2);
690}
BOOL _ILIsDesktop(LPCITEMIDLIST pidl)
Definition: CBandSite.h:24
#define ERR(fmt,...)
Definition: debug.h:110
#define MAKE_COMPARE_HRESULT(x)
Definition: shellutils.h:579

◆ CreateViewObject()

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

Definition at line 695 of file CDesktopFolder.cpp.

699{
701
702 TRACE ("(%p)->(hwnd=%p,%s,%p)\n",
703 this, hwndOwner, shdebugstr_guid (&riid), ppvOut);
704
705 if (!ppvOut)
706 return hr;
707
708 *ppvOut = NULL;
709
710 if (IsEqualIID (riid, IID_IDropTarget))
711 {
712 hr = m_DesktopFSFolder->CreateViewObject(hwndOwner, riid, ppvOut);
713 }
714 else if (IsEqualIID (riid, IID_IContextMenu))
715 {
716 HKEY hKeys[16];
717 UINT cKeys = 0;
718 AddClassKeyToArray(L"Directory\\Background", hKeys, &cKeys);
719
720 DEFCONTEXTMENU dcm;
721 dcm.hwnd = hwndOwner;
722 dcm.pcmcb = this;
723 dcm.pidlFolder = pidlRoot;
724 dcm.psf = this;
725 dcm.cidl = 0;
726 dcm.apidl = NULL;
727 dcm.cKeys = cKeys;
728 dcm.aKeys = hKeys;
730 hr = SHCreateDefaultContextMenu (&dcm, riid, ppvOut);
731 }
732 else if (IsEqualIID (riid, IID_IShellView))
733 {
734 SFV_CREATE sfvparams = {sizeof(SFV_CREATE), this};
735 hr = SHCreateShellFolderView(&sfvparams, (IShellView**)ppvOut);
736 }
737 TRACE ("-- (%p)->(interface=%p)\n", this, ppvOut);
738 return hr;
739}
HRESULT WINAPI SHCreateShellFolderView(const SFV_CREATE *pcsfv, IShellView **ppsv)
Definition: CDefView.cpp:3855
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 610 of file CDesktopFolder.cpp.

611{
612 CComPtr<IEnumIDList> pRegEnumerator;
613 CComPtr<IEnumIDList> pDesktopEnumerator;
614 CComPtr<IEnumIDList> pCommonDesktopEnumerator;
615 HRESULT hr;
616
617 hr = m_regFolder->EnumObjects(hwndOwner, dwFlags, &pRegEnumerator);
618 if (FAILED(hr))
619 ERR("EnumObjects for reg folder failed\n");
620
621 hr = m_DesktopFSFolder->EnumObjects(hwndOwner, dwFlags, &pDesktopEnumerator);
622 if (FAILED(hr))
623 ERR("EnumObjects for desktop fs folder failed\n");
624
625 hr = m_SharedDesktopFSFolder->EnumObjects(hwndOwner, dwFlags, &pCommonDesktopEnumerator);
626 if (FAILED(hr))
627 ERR("EnumObjects for shared desktop fs folder failed\n");
628
629 return ShellObjectCreatorInit<CDesktopFolderEnum>(dwFlags,pRegEnumerator, pDesktopEnumerator, pCommonDesktopEnumerator, IID_PPV_ARG(IEnumIDList, ppEnumIDList));
630}
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1176

◆ EnumSearches()

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

Implements IShellFolder2.

Definition at line 963 of file CDesktopFolder.cpp.

964{
965 FIXME ("(%p)\n", this);
966 return E_NOTIMPL;
967}

◆ FinalConstruct()

HRESULT WINAPI CDesktopFolder::FinalConstruct ( )

Definition at line 318 of file CDesktopFolder.cpp.

319{
320 WCHAR szMyPath[MAX_PATH];
321 HRESULT hr;
322
323 /* Create the root pidl */
325 if (!pidlRoot)
326 return E_OUTOFMEMORY;
327
328 /* Create the inner fs folder */
330 &CLSID_ShellFSFolder,
334 return hr;
335
336 /* Create the inner shared fs folder. Dont fail on failure. */
338 &CLSID_ShellFSFolder,
342 return hr;
343
344 /* Create the inner reg folder */
345 hr = CRegFolder_CreateInstance(&CLSID_ShellDesktop,
346 pidlRoot,
347 L"",
348 L"Desktop",
351 return hr;
352
353 /* Cache the path to the user desktop directory */
355 return E_UNEXPECTED;
356
357 sPathTarget = (LPWSTR)SHAlloc((wcslen(szMyPath) + 1) * sizeof(WCHAR));
358 if (!sPathTarget)
359 return E_OUTOFMEMORY;
360
361 wcscpy(sPathTarget, szMyPath);
362 return S_OK;
363}
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:866
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 744 of file CDesktopFolder.cpp.

748{
749 HRESULT hr = S_OK;
750
751 TRACE("(%p)->(cidl=%d apidl=%p mask=%p (0x%08x))\n",
752 this, cidl, apidl, rgfInOut, rgfInOut ? *rgfInOut : 0);
753
754 if (cidl && !apidl)
755 return E_INVALIDARG;
756
757 if (*rgfInOut == 0)
758 *rgfInOut = ~0;
759
760 if(cidl == 0)
761 *rgfInOut &= dwDesktopAttributes;
762 else
763 {
764 /* TODO: always add SFGAO_CANLINK */
765 for (UINT i = 0; i < cidl; ++i)
766 {
767 pdump(*apidl);
768 if (_ILIsDesktop(*apidl))
769 *rgfInOut &= dwDesktopAttributes;
770 else if (_ILIsMyComputer(apidl[i]))
771 *rgfInOut &= dwMyComputerAttributes;
772 else if (_ILIsNetHood(apidl[i]))
773 *rgfInOut &= dwMyNetPlacesAttributes;
774 else if (_ILIsFolder(apidl[i]) || _ILIsValue(apidl[i]) || _ILIsSpecialFolder(apidl[i]))
775 {
776 CComPtr<IShellFolder2> psf;
777 HRESULT hr = _GetSFFromPidl(apidl[i], &psf);
779 continue;
780
781 psf->GetAttributesOf(1, &apidl[i], rgfInOut);
782 }
783 else
784 ERR("Got an unknown pidl type!!!\n");
785 }
786 }
787 /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */
788 *rgfInOut &= ~SFGAO_VALIDATE;
789
790 TRACE("-- result=0x%08x\n", *rgfInOut);
791
792 return hr;
793}
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 1036 of file CDesktopFolder.cpp.

1037{
1038 TRACE ("(%p)\n", this);
1039
1040 if (!lpClassId)
1041 return E_POINTER;
1042
1043 *lpClassId = CLSID_ShellDesktop;
1044
1045 return S_OK;
1046}
#define E_POINTER
Definition: winerror.h:2365

◆ GetCurFolder()

HRESULT WINAPI CDesktopFolder::GetCurFolder ( PIDLIST_ABSOLUTE pidl)
override

Implements IPersistFolder2.

Definition at line 1058 of file CDesktopFolder.cpp.

1059{
1060 TRACE ("(%p)->(%p)\n", this, pidl);
1061
1062 if (!pidl)
1063 return E_INVALIDARG; /* xp doesn't have this check and crashes on NULL */
1064 *pidl = ILClone (pidlRoot);
1065 return S_OK;
1066}
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 969 of file CDesktopFolder.cpp.

970{
971 TRACE ("(%p)\n", this);
972
973 if (pSort)
974 *pSort = 0;
975 if (pDisplay)
976 *pDisplay = 0;
977
978 return S_OK;
979}

◆ GetDefaultColumnState()

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

Implements IShellFolder2.

Definition at line 981 of file CDesktopFolder.cpp.

982{
983 TRACE ("(%p)\n", this);
984
985 if (!pcsFlags || iColumn >= DESKTOPSHELLVIEWCOLUMNS)
986 return E_INVALIDARG;
987
988 *pcsFlags = DesktopSFHeader[iColumn].pcsFlags;
989
990 return S_OK;
991}
#define DESKTOPSHELLVIEWCOLUMNS
static const shvheader DesktopSFHeader[]

◆ GetDefaultSearchGUID()

HRESULT WINAPI CDesktopFolder::GetDefaultSearchGUID ( GUID pguid)
override

Implements IShellFolder2.

Definition at line 957 of file CDesktopFolder.cpp.

958{
959 FIXME ("(%p)\n", this);
960 return E_NOTIMPL;
961}

◆ GetDetailsEx()

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

Implements IShellFolder2.

Definition at line 993 of file CDesktopFolder.cpp.

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

◆ GetDetailsOf()

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

Implements IShellFolder2.

Definition at line 1003 of file CDesktopFolder.cpp.

1007{
1008 if (!psd || iColumn >= DESKTOPSHELLVIEWCOLUMNS)
1009 return E_INVALIDARG;
1010
1011 if (!pidl)
1012 {
1013 psd->fmt = DesktopSFHeader[iColumn].fmt;
1014 psd->cxChar = DesktopSFHeader[iColumn].cxChar;
1015 return SHSetStrRet(&psd->str, DesktopSFHeader[iColumn].colnameid);
1016 }
1017
1018 CComPtr<IShellFolder2> psf;
1019 HRESULT hr = _GetSFFromPidl(pidl, &psf);
1021 return hr;
1022
1023 hr = psf->GetDetailsOf(pidl, iColumn, psd);
1025 return hr;
1026
1027 return hr;
1028}
STRRET str
Definition: shtypes.idl:108

◆ GetDisplayNameOf()

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

Definition at line 901 of file CDesktopFolder.cpp.

902{
903 TRACE ("(%p)->(pidl=%p,0x%08x,%p)\n", this, pidl, dwFlags, strRet);
904 pdump (pidl);
905
906 if (!strRet)
907 return E_INVALIDARG;
908
909 if (!_ILIsPidlSimple (pidl))
910 {
911 return SHELL32_GetDisplayNameOfChild(this, pidl, dwFlags, strRet);
912 }
913 else if (_ILIsDesktop(pidl))
914 {
916 return SHSetStrRet(strRet, sPathTarget);
917 else
918 return m_regFolder->GetDisplayNameOf(pidl, dwFlags, strRet);
919 }
920
921 /* file system folder or file rooted at the desktop */
922 CComPtr<IShellFolder2> psf;
923 HRESULT hr = _GetSFFromPidl(pidl, &psf);
925 return hr;
926
927 return psf->GetDisplayNameOf(pidl, dwFlags, strRet);
928}
#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 112 of file CDesktopFolder.h.

113 {
114 return E_NOTIMPL;
115 }

◆ GetUIObjectOf()

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

Definition at line 807 of file CDesktopFolder.cpp.

814{
815 LPVOID pObj = NULL;
817
818 TRACE ("(%p)->(%p,%u,apidl=%p,%s,%p,%p)\n",
819 this, hwndOwner, cidl, apidl, shdebugstr_guid (&riid), prgfInOut, ppvOut);
820
821 if (!ppvOut)
822 return hr;
823
824 *ppvOut = NULL;
825
826 if (cidl == 1 && !_ILIsSpecialFolder(apidl[0]))
827 {
828 CComPtr<IShellFolder2> psf;
829 HRESULT hr = _GetSFFromPidl(apidl[0], &psf);
831 return hr;
832
833 return psf->GetUIObjectOf(hwndOwner, cidl, apidl, riid, prgfInOut, ppvOut);
834 }
835
836 if (IsEqualIID (riid, IID_IContextMenu))
837 {
838 if (cidl > 0 && _ILIsSpecialFolder(apidl[0]))
839 {
840 hr = m_regFolder->GetUIObjectOf(hwndOwner, cidl, apidl, riid, prgfInOut, &pObj);
841 }
842 else
843 {
844 /* Do not use the context menu of the CFSFolder here. */
845 /* We need to pass a pointer of the CDesktopFolder so as the data object that the context menu gets is rooted to the desktop */
846 /* Otherwise operations like that involve items from both user and shared desktop will not work */
847 HKEY hKeys[16];
848 UINT cKeys = 0;
849 if (cidl > 0)
850 {
851 AddFSClassKeysToArray(cidl, apidl, hKeys, &cKeys);
852 }
853
854 DEFCONTEXTMENU dcm;
855 dcm.hwnd = hwndOwner;
856 dcm.pcmcb = this;
857 dcm.pidlFolder = pidlRoot;
858 dcm.psf = this;
859 dcm.cidl = cidl;
860 dcm.apidl = apidl;
861 dcm.cKeys = cKeys;
862 dcm.aKeys = hKeys;
864 hr = SHCreateDefaultContextMenu (&dcm, riid, &pObj);
865 }
866 }
867 else if (IsEqualIID (riid, IID_IDataObject) && (cidl >= 1))
868 {
869 hr = IDataObject_Constructor( hwndOwner, pidlRoot, apidl, cidl, TRUE, (IDataObject **)&pObj);
870 }
871 else if ((IsEqualIID (riid, IID_IExtractIconA) || IsEqualIID (riid, IID_IExtractIconW)) && (cidl == 1))
872 {
873 hr = m_regFolder->GetUIObjectOf(hwndOwner, cidl, apidl, riid, prgfInOut, &pObj);
874 }
875 else if (IsEqualIID (riid, IID_IDropTarget) && (cidl == 1))
876 {
877 CComPtr<IShellFolder> psfChild;
878 hr = this->BindToObject(apidl[0], NULL, IID_PPV_ARG(IShellFolder, &psfChild));
880 return hr;
881
882 return psfChild->CreateViewObject(NULL, riid, ppvOut);
883 }
884 else
886
887 if (SUCCEEDED(hr) && !pObj)
889
890 *ppvOut = pObj;
891 TRACE ("(%p)->hr=0x%08x\n", this, hr);
892 return hr;
893}
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 118 of file CDesktopFolder.h.

119 {
120 if (ppwszValidChars)
121 {
122 *ppwszValidChars = NULL;
123 }
124 if (ppwszInvalidChars)
125 {
126 SHStrDupW(INVALID_FILETITLE_CHARACTERSW, ppwszInvalidChars);
127 }
128 return S_OK;
129 }
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 127 of file CDesktopFolder.cpp.

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

Referenced by _ParseDisplayNameByParent().

◆ Initialize()

HRESULT WINAPI CDesktopFolder::Initialize ( PCIDLIST_ABSOLUTE  pidl)
override

Implements IPersistFolder.

Definition at line 1048 of file CDesktopFolder.cpp.

1049{
1050 TRACE ("(%p)->(%p)\n", this, pidl);
1051
1052 if (!pidl)
1053 return S_OK;
1054
1055 return E_INVALIDARG;
1056}

◆ MapColumnToSCID()

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

Implements IShellFolder2.

Definition at line 1030 of file CDesktopFolder.cpp.

1031{
1032 FIXME ("(%p)\n", this);
1033 return E_NOTIMPL;
1034}

◆ ParseDisplayName()

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

Definition at line 502 of file CDesktopFolder.cpp.

509{
510 TRACE ("(%p)->(HWND=%p,%p,%p=%s,%p,pidl=%p,%p)\n",
511 this, hwndOwner, pbc, lpszDisplayName, debugstr_w(lpszDisplayName),
512 pchEaten, ppidl, pdwAttributes);
513
514 if (!ppidl)
515 return E_INVALIDARG;
516
517 *ppidl = NULL;
518
519 if (!lpszDisplayName)
520 return E_INVALIDARG;
521
522 if (!*lpszDisplayName)
523 {
524 *ppidl = _ILCreateMyComputer();
525 return (*ppidl ? S_OK : E_OUTOFMEMORY);
526 }
527
528 if (lpszDisplayName[0] == ':' && lpszDisplayName[1] == ':')
529 {
530 return m_regFolder->ParseDisplayName(hwndOwner, pbc, lpszDisplayName, pchEaten, ppidl,
531 pdwAttributes);
532 }
533
534 HRESULT hr = _ParseDisplayNameByParent(hwndOwner, pbc, lpszDisplayName, pchEaten, ppidl,
535 pdwAttributes);
536 if (SUCCEEDED(hr))
537 {
538 if (BindCtx_ContainsObject(pbc, STR_PARSE_TRANSLATE_ALIASES))
539 {
540 CComHeapPtr<ITEMIDLIST> pidlAlias;
541 if (SUCCEEDED(Shell_TranslateIDListAlias(*ppidl, NULL, &pidlAlias, 0xFFFF)))
542 {
543 ILFree(*ppidl);
544 *ppidl = pidlAlias.Detach();
545 }
546 }
547
548 TRACE ("(%p)->(-- ret=0x%08x)\n", this, hr);
549 return hr;
550 }
551
553 return hr;
554
555 if (BindCtx_ContainsObject(pbc, STR_DONT_PARSE_RELATIVE))
556 return E_INVALIDARG;
557
558 if (SHIsFileSysBindCtx(pbc, NULL) == S_OK)
559 return hr;
560
561 BIND_OPTS BindOps = { sizeof(BindOps) };
563 if (pbc && SUCCEEDED(pbc->GetBindOptions(&BindOps)) && (BindOps.grfMode & STGM_CREATE))
564 {
565 BindOps.grfMode &= ~STGM_CREATE;
566 bCreate = TRUE;
567 pbc->SetBindOptions(&BindOps);
568 }
569
571 {
572 hr = m_DesktopFSFolder->ParseDisplayName(hwndOwner,
573 pbc,
574 lpszDisplayName,
575 pchEaten,
576 ppidl,
577 pdwAttributes);
578 }
579
581 {
582 hr = m_SharedDesktopFSFolder->ParseDisplayName(hwndOwner,
583 pbc,
584 lpszDisplayName,
585 pchEaten,
586 ppidl,
587 pdwAttributes);
588 }
589
591 {
592 BindOps.grfMode |= STGM_CREATE;
593 pbc->SetBindOptions(&BindOps);
594 hr = m_DesktopFSFolder->ParseDisplayName(hwndOwner,
595 pbc,
596 lpszDisplayName,
597 pchEaten,
598 ppidl,
599 pdwAttributes);
600 }
601
602 TRACE ("(%p)->(-- ret=0x%08x)\n", this, hr);
603
604 return hr;
605}
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 942 of file CDesktopFolder.cpp.

948{
949 CComPtr<IShellFolder2> psf;
950 HRESULT hr = _GetSFFromPidl(pidl, &psf);
952 return hr;
953
954 return psf->SetNameOf(hwndOwner, pidl, lpName, dwFlags, pPidlOut);
955}
_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 28 of file CDesktopFolder.cpp.

35{
36 LPWSTR pch;
37 INT cch, csidl;
39 PARSEDURLW ParsedURL = { sizeof(ParsedURL) };
40
41 ::ParseURLW(lpszDisplayName, &ParsedURL);
42
43 DWORD attrs = (pdwAttributes ? *pdwAttributes : 0) | SFGAO_STREAM;
44 if (ParsedURL.pszSuffix[0] == L':' && ParsedURL.pszSuffix[1] == L':') // It begins from "::"
45 {
46 CComPtr<IShellFolder> psfDesktop;
47 hr = SHGetDesktopFolder(&psfDesktop);
48 if (SUCCEEDED(hr))
49 {
50 CComPtr<IBindCtx> pBindCtx;
51 hr = ::CreateBindCtx(0, &pBindCtx);
52 if (SUCCEEDED(hr))
53 {
54 BIND_OPTS BindOps = { sizeof(BindOps) };
55 BindOps.grfMode = STGM_CREATE;
56 pBindCtx->SetBindOptions(&BindOps);
57 hr = psfDesktop->ParseDisplayName(hwndOwner, pBindCtx,
58 (LPWSTR)ParsedURL.pszSuffix,
59 pchEaten, ppidl, &attrs);
60 }
61 }
62 }
63 else
64 {
65 csidl = Shell_ParseSpecialFolder(ParsedURL.pszSuffix, &pch, &cch);
66 if (csidl == -1)
67 {
68 ERR("\n");
69 return hr;
70 }
71
72 CComHeapPtr<ITEMIDLIST> pidlLocation;
73 hr = SHGetFolderLocation(hwndOwner, (csidl | CSIDL_FLAG_CREATE), NULL, 0, &pidlLocation);
75 return hr;
76
77 if (pch && *pch)
78 {
79 CComPtr<IShellFolder> psfFolder;
80 hr = SHBindToObject(NULL, pidlLocation, IID_PPV_ARG(IShellFolder, &psfFolder));
81 if (SUCCEEDED(hr))
82 {
83 CComHeapPtr<ITEMIDLIST> pidlNew;
84 hr = psfFolder->ParseDisplayName(hwndOwner, pbc, pch, pchEaten, &pidlNew, &attrs);
85 if (SUCCEEDED(hr))
86 {
87 hr = SHILCombine(pidlLocation, pidlNew, ppidl);
88 if (pchEaten)
89 *pchEaten += cch;
90 }
91 }
92 }
93 else
94 {
95 if (attrs)
96 hr = SHGetNameAndFlagsW(pidlLocation, 0, NULL, 0, &attrs);
97
98 if (SUCCEEDED(hr))
99 {
100 if (pchEaten)
101 *pchEaten = cch;
102 *ppidl = pidlLocation.Detach();
103 }
104 }
105 }
106
107 // FIXME: SHWindowsPolicy
108 if (SUCCEEDED(hr) && (attrs & SFGAO_STREAM) &&
109 !BindCtx_ContainsObject(pbc, STR_PARSE_SHELL_PROTOCOL_TO_FILE_OBJECTS))
110 {
111 ILFree(*ppidl);
112 *ppidl = NULL;
114 }
115
116 if (pdwAttributes)
117 *pdwAttributes = attrs;
118
119 // FIXME: SHWindowsPolicy
122
123 return hr;
124}
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: