ReactOS 0.4.15-dev-8021-g7ce96fd
CRegFolder Class Reference
Inheritance diagram for CRegFolder:
Collaboration diagram for CRegFolder:

Public Member Functions

 CRegFolder ()
 
 ~CRegFolder ()
 
HRESULT WINAPI Initialize (const GUID *pGuid, LPCITEMIDLIST pidlRoot, LPCWSTR lpszPath, LPCWSTR lpszEnumKeyName)
 
STDMETHOD() ParseDisplayName (HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, ULONG *pchEaten, PIDLIST_RELATIVE *ppidl, ULONG *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
 
- 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 ()
 

Private Member Functions

HRESULT GetGuidItemAttributes (LPCITEMIDLIST pidl, LPDWORD pdwAttributes)
 
BOOL _IsInNameSpace (_In_ LPCITEMIDLIST pidl)
 

Private Attributes

GUID m_guid
 
CAtlStringW m_rootPath
 
CAtlStringW m_enumKeyName
 
CComHeapPtr< ITEMIDLISTm_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
 
- 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 309 of file CRegFolder.cpp.

Constructor & Destructor Documentation

◆ CRegFolder()

CRegFolder::CRegFolder ( )

Definition at line 358 of file CRegFolder.cpp.

359{
360}

◆ ~CRegFolder()

CRegFolder::~CRegFolder ( )

Definition at line 362 of file CRegFolder.cpp.

363{
364}

Member Function Documentation

◆ _IsInNameSpace()

BOOL CRegFolder::_IsInNameSpace ( _In_ LPCITEMIDLIST  pidl)
private

Definition at line 410 of file CRegFolder.cpp.

411{
413 if (IsEqualGUID(clsid, CLSID_Printers))
414 return TRUE;
415 if (IsEqualGUID(clsid, CLSID_ConnectionFolder))
416 return TRUE;
417 FIXME("Check registry\n");
418 return TRUE;
419}
#define FIXME(fmt,...)
Definition: debug.h:111
#define TRUE
Definition: types.h:120
REFCLSID clsid
Definition: msctf.c:82
IID * _ILGetGUIDPointer(LPCITEMIDLIST pidl)
Definition: pidl.c:2369
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147

Referenced by ParseDisplayName().

◆ BindToObject()

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

Definition at line 487 of file CRegFolder.cpp.

488{
489 CComPtr<IPersistFolder> pFolder;
490 HRESULT hr;
491
492 if (!ppvOut || !pidl || !pidl->mkid.cb)
493 return E_INVALIDARG;
494
495 *ppvOut = NULL;
496
497 GUID *pGUID = _ILGetGUIDPointer(pidl);
498 if (!pGUID)
499 {
500 ERR("CRegFolder::BindToObject called for non guid item!\n");
501 return E_INVALIDARG;
502 }
503
504 hr = SHELL32_BindToSF(m_pidlRoot, NULL, pidl, pGUID, riid, ppvOut);
506 return hr;
507
508 return S_OK;
509}
#define ERR(fmt,...)
Definition: debug.h:110
CComHeapPtr< ITEMIDLIST > m_pidlRoot
Definition: CRegFolder.cpp:317
#define E_INVALIDARG
Definition: ddrawi.h:101
#define NULL
Definition: types.h:112
#define FAILED_UNEXPECTEDLY(hr)
Definition: precomp.h:121
REFIID riid
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
HRESULT SHELL32_BindToSF(LPCITEMIDLIST pidlRoot, PERSIST_FOLDER_TARGET_INFO *ppfti, LPCITEMIDLIST pidl, const GUID *clsid, REFIID riid, LPVOID *ppvOut)
Definition: shlfolder.cpp:168
HRESULT hr
Definition: shlfolder.c:183

◆ BindToStorage()

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

Definition at line 511 of file CRegFolder.cpp.

512{
513 return E_NOTIMPL;
514}
#define E_NOTIMPL
Definition: ddrawi.h:99

◆ CompareIDs()

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

Implements IShellFolder.

Definition at line 516 of file CRegFolder.cpp.

517{
518 if (!pidl1 || !pidl2 || pidl1->mkid.cb == 0 || pidl2->mkid.cb == 0)
519 {
520 ERR("Got an empty pidl!\n");
521 return E_INVALIDARG;
522 }
523
524 GUID const *clsid1 = _ILGetGUIDPointer (pidl1);
525 GUID const *clsid2 = _ILGetGUIDPointer (pidl2);
526
527 if (!clsid1 && !clsid2)
528 {
529 ERR("Got no guid pidl!\n");
530 return E_INVALIDARG;
531 }
532 else if (clsid1 && clsid2)
533 {
534 if (memcmp(clsid1, clsid2, sizeof(GUID)) == 0)
535 return SHELL32_CompareChildren(this, lParam, pidl1, pidl2);
536
537 return SHELL32_CompareDetails(this, lParam, pidl1, pidl2);
538 }
539
540 /* Guid folders come first compared to everything else */
541 /* And Drives come before folders in My Computer */
543 {
544 return MAKE_COMPARE_HRESULT(clsid1 ? 1 : -1);
545 }
546 else
547 {
548 return MAKE_COMPARE_HRESULT(clsid1 ? -1 : 1);
549 }
550}
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
Definition: utclib.c:112
LPARAM lParam
Definition: combotst.c:139
BOOL _ILIsMyComputer(LPCITEMIDLIST pidl)
Definition: pidl.c:1975
#define MAKE_COMPARE_HRESULT(x)
Definition: shellutils.h:577
HRESULT SHELL32_CompareChildren(IShellFolder2 *psf, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: shlfolder.cpp:224
HRESULT SHELL32_CompareDetails(IShellFolder2 *isf, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: shlfolder.cpp:247

◆ CreateViewObject()

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

Definition at line 552 of file CRegFolder.cpp.

553{
554 return E_NOTIMPL;
555}

◆ EnumObjects()

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

Definition at line 482 of file CRegFolder.cpp.

483{
484 return ShellObjectCreatorInit<CRegFolderEnum>(m_enumKeyName, dwFlags, IID_PPV_ARG(IEnumIDList, ppEnumIDList));
485}
CAtlStringW m_enumKeyName
Definition: CRegFolder.cpp:316
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1176
#define IID_PPV_ARG(Itype, ppType)

◆ EnumSearches()

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

Implements IShellFolder2.

Definition at line 798 of file CRegFolder.cpp.

799{
800 return E_NOTIMPL;
801}

◆ GetAttributesOf()

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

Definition at line 557 of file CRegFolder.cpp.

558{
559 if (!rgfInOut || !cidl || !apidl)
560 return E_INVALIDARG;
561
562 if (*rgfInOut == 0)
563 *rgfInOut = ~0;
564
565 while(cidl > 0 && *apidl)
566 {
567 if (_ILIsSpecialFolder(*apidl))
568 GetGuidItemAttributes(*apidl, rgfInOut);
569 else
570 ERR("Got unknown pidl\n");
571 apidl++;
572 cidl--;
573 }
574
575 /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */
576 *rgfInOut &= ~SFGAO_VALIDATE;
577
578 return S_OK;
579}
HRESULT GetGuidItemAttributes(LPCITEMIDLIST pidl, LPDWORD pdwAttributes)
Definition: CRegFolder.cpp:385
static BOOL _ILIsSpecialFolder(LPCITEMIDLIST pidl)

◆ GetDefaultColumn()

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

Implements IShellFolder2.

Definition at line 803 of file CRegFolder.cpp.

804{
805 if (pSort)
806 *pSort = 0;
807 if (pDisplay)
808 *pDisplay = 0;
809
810 return S_OK;
811}

◆ GetDefaultColumnState()

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

Implements IShellFolder2.

Definition at line 813 of file CRegFolder.cpp.

814{
815 if (iColumn >= REGFOLDERCOLUMNCOUNT)
816 return E_INVALIDARG;
818 return S_OK;
819}
@ REGFOLDERCOLUMNCOUNT
Definition: CRegFolder.cpp:306
@ SHCOLSTATE_TYPE_STR
Definition: shtypes.idl:121
@ SHCOLSTATE_ONBYDEFAULT
Definition: shtypes.idl:125

◆ GetDefaultSearchGUID()

HRESULT WINAPI CRegFolder::GetDefaultSearchGUID ( GUID pguid)
override

Implements IShellFolder2.

Definition at line 793 of file CRegFolder.cpp.

794{
795 return E_NOTIMPL;
796}

◆ GetDetailsEx()

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

Implements IShellFolder2.

Definition at line 821 of file CRegFolder.cpp.

822{
823 return E_NOTIMPL;
824}

◆ GetDetailsOf()

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

Implements IShellFolder2.

Definition at line 826 of file CRegFolder.cpp.

827{
828 if (!psd)
829 return E_INVALIDARG;
830
831 if (!pidl)
832 {
833 TRACE("CRegFolder has no column info\n");
834 return E_INVALIDARG;
835 }
836
837 GUID const *clsid = _ILGetGUIDPointer (pidl);
838
839 if (!clsid)
840 {
841 ERR("Pidl is not reg item!\n");
842 return E_INVALIDARG;
843 }
844
845 switch(iColumn)
846 {
847 case COL_NAME:
848 return GetDisplayNameOf(pidl, SHGDN_NORMAL | SHGDN_INFOLDER, &psd->str);
849 case COL_TYPE:
850 return SHSetStrRet(&psd->str, IDS_SYSTEMFOLDER);
851 case COL_INFOTIP:
852 HKEY hKey;
854 return SHSetStrRet(&psd->str, "");
855
856 psd->str.cStr[0] = 0x00;
857 psd->str.uType = STRRET_CSTR;
858 RegLoadMUIStringA(hKey, "InfoTip", psd->str.cStr, MAX_PATH, NULL, 0, NULL);
860 return S_OK;
861 default:
862 /* Return an empty string when we area asked for a column we don't support.
863 Only the regfolder is supposed to do this as it supports less columns compared to other folder
864 and its contents are supposed to be presented alongside items that support more columns. */
865 return SHSetStrRet(&psd->str, "");
866 }
867 return E_FAIL;
868}
@ COL_INFOTIP
Definition: CRegFolder.cpp:305
@ COL_NAME
Definition: CRegFolder.cpp:303
@ COL_TYPE
Definition: CRegFolder.cpp:304
#define RegCloseKey(hKey)
Definition: registry.h:49
STDMETHOD() GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet) override
Definition: CRegFolder.cpp:620
#define E_FAIL
Definition: ddrawi.h:102
LONG WINAPI RegLoadMUIStringA(IN HKEY hKey, IN LPCSTR pszValue OPTIONAL, OUT LPSTR pszOutBuf, IN DWORD cbOutBuf, OUT LPDWORD pcbData OPTIONAL, IN DWORD Flags, IN LPCSTR pszDirectory OPTIONAL)
Definition: reg.c:5268
#define MAX_PATH
Definition: compat.h:34
FxAutoRegKey hKey
BOOL HCR_RegOpenClassIDKey(REFIID riid, HKEY *hkey)
Definition: classes.c:230
#define IDS_SYSTEMFOLDER
Definition: shresdef.h:350
@ STRRET_CSTR
Definition: shtypes.idl:87
#define TRACE(s)
Definition: solgame.cpp:4
STRRET str
Definition: shtypes.idl:108
char cStr[MAX_PATH]
Definition: shtypes.idl:98
UINT uType
Definition: shtypes.idl:93

◆ GetDisplayNameOf()

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

Definition at line 620 of file CRegFolder.cpp.

621{
622 if (!strRet || (!_ILIsSpecialFolder(pidl) && pidl != NULL))
623 return E_INVALIDARG;
624
625 if (!pidl || !pidl->mkid.cb)
626 {
628 {
629 LPWSTR pszPath = (LPWSTR)CoTaskMemAlloc((MAX_PATH + 1) * sizeof(WCHAR));
630 if (!pszPath)
631 return E_OUTOFMEMORY;
632
633 /* parsing name like ::{...} */
634 pszPath[0] = ':';
635 pszPath[1] = ':';
636 SHELL32_GUIDToStringW(m_guid, &pszPath[2]);
637
638 strRet->uType = STRRET_WSTR;
639 strRet->pOleStr = pszPath;
640
641 return S_OK;
642 }
643 else
644 {
645 BOOL bRet;
646 WCHAR wstrName[MAX_PATH+1];
647 bRet = HCR_GetClassNameW(m_guid, wstrName, MAX_PATH);
648 if (!bRet)
649 return E_FAIL;
650
651 return SHSetStrRet(strRet, wstrName);
652
653 }
654 }
655
656 HRESULT hr;
657 GUID const *clsid = _ILGetGUIDPointer (pidl);
658
659 /* First of all check if we need to query the name from the child item */
662 {
663 int bWantsForParsing = FALSE;
664
665 /*
666 * We can only get a filesystem path from a shellfolder if the
667 * value WantsFORPARSING in CLSID\\{...}\\shellfolder exists.
668 *
669 * Exception: The MyComputer folder doesn't have this key,
670 * but any other filesystem backed folder it needs it.
671 */
672 if (IsEqualIID (*clsid, CLSID_MyComputer))
673 {
674 bWantsForParsing = TRUE;
675 }
676 else
677 {
678 HKEY hkeyClass;
679 if (HCR_RegOpenClassIDKey(*clsid, &hkeyClass))
680 {
681 LONG res = SHGetValueW(hkeyClass, L"Shellfolder", L"WantsForParsing", NULL, NULL, NULL);
682 bWantsForParsing = (res == ERROR_SUCCESS);
683 RegCloseKey(hkeyClass);
684 }
685 }
686
687 if (bWantsForParsing)
688 {
689 /*
690 * we need the filesystem path to the destination folder.
691 * Only the folder itself can know it
692 */
693 return SHELL32_GetDisplayNameOfChild (this, pidl, dwFlags, strRet);
694 }
695 }
696
697 /* Allocate the buffer for the result */
698 SIZE_T cchPath = MAX_PATH + 1;
699 LPWSTR pszPath = (LPWSTR)CoTaskMemAlloc(cchPath * sizeof(WCHAR));
700 if (!pszPath)
701 return E_OUTOFMEMORY;
702
703 hr = S_OK;
704
706 {
707 SIZE_T pathlen = 0;
708 PWCHAR pItemName = pszPath; // GET_SHGDN_RELATION(dwFlags) == SHGDN_INFOLDER
710 {
711 hr = StringCchCopyW(pszPath, cchPath, m_rootPath);
712 if (SUCCEEDED(hr))
713 {
714 pathlen = wcslen(pszPath);
715 pItemName = &pszPath[pathlen];
716 if (pathlen)
717 {
718 if (++pathlen < cchPath)
719 *pItemName++ = L'\\';
720 else
722 }
723 }
724 }
725
726 if (SUCCEEDED(hr) && pathlen + 2 + 38 + 1 < cchPath)
727 {
728 /* parsing name like ::{...} */
729 pItemName[0] = L':';
730 pItemName[1] = L':';
731 SHELL32_GUIDToStringW(*clsid, &pItemName[2]);
732 }
733 else
734 {
736 }
737 }
738 else
739 {
740 /* user friendly name */
741 if (!HCR_GetClassNameW(*clsid, pszPath, cchPath))
742 hr = E_FAIL;
743 }
744
745 if (SUCCEEDED(hr))
746 {
747 strRet->uType = STRRET_WSTR;
748 strRet->pOleStr = pszPath;
749 }
750 else
751 {
752 CoTaskMemFree(pszPath);
753 }
754
755 return hr;
756}
CAtlStringW m_rootPath
Definition: CRegFolder.cpp:315
#define ERROR_INSUFFICIENT_BUFFER
Definition: dderror.h:10
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define ERROR_SUCCESS
Definition: deptool.c:10
#define FALSE
Definition: types.h:117
#define GET_SHGDN_RELATION(dwFlags)
Definition: precomp.h:53
#define GET_SHGDN_FOR(dwFlags)
Definition: precomp.h:52
DWORD WINAPI SHGetValueW(HKEY hKey, LPCWSTR lpszSubKey, LPCWSTR lpszValue, LPDWORD pwType, LPVOID pvData, LPDWORD pcbData)
Definition: reg.c:1236
unsigned int BOOL
Definition: ntddk_ex.h:94
GLuint res
Definition: glext.h:9613
VOID WINAPI CoTaskMemFree(LPVOID ptr)
Definition: ifs.c:442
LPVOID WINAPI CoTaskMemAlloc(SIZE_T size)
Definition: ifs.c:426
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define L(x)
Definition: ntvdm.h:50
long LONG
Definition: pedump.c:60
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
BOOL HCR_GetClassNameW(REFIID riid, LPWSTR szDest, DWORD len)
Definition: classes.c:399
HRESULT SHELL32_GetDisplayNameOfChild(IShellFolder2 *psf, LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet)
Definition: shlfolder.cpp:206
static __inline int SHELL32_GUIDToStringW(REFGUID guid, LPWSTR str)
Definition: shfldr.h:99
@ STRRET_WSTR
Definition: shtypes.idl:85
STRSAFEAPI StringCchCopyW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:149
LPWSTR pOleStr
Definition: shtypes.idl:96
ULONG_PTR SIZE_T
Definition: typedefs.h:80
uint16_t * PWCHAR
Definition: typedefs.h:56
#define HRESULT_FROM_WIN32(x)
Definition: winerror.h:92
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184

Referenced by GetDetailsOf().

◆ GetGuidItemAttributes()

HRESULT CRegFolder::GetGuidItemAttributes ( LPCITEMIDLIST  pidl,
LPDWORD  pdwAttributes 
)
private

Definition at line 385 of file CRegFolder.cpp.

386{
387 DWORD dwAttributes = *pdwAttributes;
388
389 /* First try to get them from the registry */
390 if (!HCR_GetFolderAttributes(pidl, pdwAttributes))
391 {
392 /* We couldn't get anything */
393 *pdwAttributes = 0;
394 }
395
396 /* Items have more attributes when on desktop */
398 {
399 *pdwAttributes |= (dwAttributes & (SFGAO_CANLINK|SFGAO_CANDELETE|SFGAO_CANRENAME|SFGAO_HASPROPSHEET));
400 }
401
402 /* In any case, links can be created */
403 if (*pdwAttributes == NULL)
404 {
405 *pdwAttributes |= (dwAttributes & SFGAO_CANLINK);
406 }
407 return S_OK;
408}
BOOL _ILIsDesktop(LPCITEMIDLIST pidl)
Definition: CBandSite.h:24
unsigned long DWORD
Definition: ntddk_ex.h:95
BOOL HCR_GetFolderAttributes(LPCITEMIDLIST pidlFolder, LPDWORD pdwAttributes)
Definition: classes.c:567
DWORD dwAttributes
Definition: vdmdbg.h:34

Referenced by GetAttributesOf(), and ParseDisplayName().

◆ GetUIObjectOf()

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

Definition at line 581 of file CRegFolder.cpp.

583{
584 LPVOID pObj = NULL;
586
587 if (!ppvOut)
588 return hr;
589
590 *ppvOut = NULL;
591
592 if ((IsEqualIID (riid, IID_IExtractIconA) || IsEqualIID (riid, IID_IExtractIconW)) && (cidl == 1))
593 {
594 hr = CGuidItemExtractIcon_CreateInstance(apidl[0], riid, &pObj);
595 }
596 else if (IsEqualIID (riid, IID_IContextMenu) && (cidl >= 1))
597 {
598 if (!_ILGetGUIDPointer (apidl[0]))
599 {
600 ERR("Got non guid item!\n");
601 return E_FAIL;
602 }
603
604 hr = CGuidItemContextMenu_CreateInstance(m_pidlRoot, hwndOwner, cidl, apidl, static_cast<IShellFolder*>(this), (IContextMenu**)&pObj);
605 }
606 else if (IsEqualIID (riid, IID_IDataObject) && (cidl >= 1))
607 {
608 hr = IDataObject_Constructor (hwndOwner, m_pidlRoot, apidl, cidl, TRUE, (IDataObject **)&pObj);
609 }
610 else
611 {
613 }
614
615 *ppvOut = pObj;
616 return hr;
617
618}
HRESULT IDataObject_Constructor(HWND hwndOwner, PCIDLIST_ABSOLUTE pMyPidl, PCUIDLIST_RELATIVE_ARRAY apidl, UINT cidl, BOOL bExtendedObject, IDataObject **dataObject)
HRESULT CGuidItemExtractIcon_CreateInstance(LPCITEMIDLIST pidl, REFIID iid, LPVOID *ppvOut)
Definition: CRegFolder.cpp:137
HRESULT CGuidItemContextMenu_CreateInstance(PCIDLIST_ABSOLUTE pidlFolder, HWND hwnd, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, IShellFolder *psf, IContextMenu **ppcm)
Definition: CRegFolder.cpp:97
const GUID IID_IDataObject
#define E_NOINTERFACE
Definition: winerror.h:2364

◆ Initialize()

HRESULT WINAPI CRegFolder::Initialize ( const GUID pGuid,
LPCITEMIDLIST  pidlRoot,
LPCWSTR  lpszPath,
LPCWSTR  lpszEnumKeyName 
)

Definition at line 366 of file CRegFolder.cpp.

367{
368 memcpy(&m_guid, pGuid, sizeof(m_guid));
369
370 m_rootPath = lpszPath;
371 if (!m_rootPath)
372 return E_OUTOFMEMORY;
373
374 m_enumKeyName = lpszEnumKeyName;
375 if (!m_enumKeyName)
376 return E_OUTOFMEMORY;
377
378 m_pidlRoot.Attach(ILClone(pidlRoot));
379 if (!m_pidlRoot)
380 return E_OUTOFMEMORY;
381
382 return S_OK;
383}
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
Definition: pidl.c:237

◆ MapColumnToSCID()

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

Implements IShellFolder2.

Definition at line 870 of file CRegFolder.cpp.

871{
872 return E_NOTIMPL;
873}

◆ ParseDisplayName()

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

Implements IShellFolder.

Definition at line 421 of file CRegFolder.cpp.

423{
424 if (!ppidl)
425 return E_INVALIDARG;
426
427 *ppidl = NULL;
428
429 if (!lpszDisplayName)
430 return E_INVALIDARG;
431
432 if (lpszDisplayName[0] != L':' || lpszDisplayName[1] != L':')
433 {
434 FIXME("What should we do here?\n");
435 return E_FAIL;
436 }
437
438 LPWSTR pch, pchNextOfComma = NULL;
439 for (pch = &lpszDisplayName[2]; *pch && *pch != L'\\'; ++pch)
440 {
441 if (*pch == L',' && !pchNextOfComma)
442 pchNextOfComma = pch + 1;
443 }
444
445 CLSID clsid;
446 if (!GUIDFromStringW(&lpszDisplayName[2], &clsid))
447 return CO_E_CLASSSTRING;
448
449 if (pchNextOfComma)
450 {
451 FIXME("Delegate folder\n");
452 return E_FAIL;
453 }
454
455 CComHeapPtr<ITEMIDLIST> pidlTemp(_ILCreateGuid(PT_GUID, clsid));
456 if (!pidlTemp)
457 return E_OUTOFMEMORY;
458
459 if (!_IsInNameSpace(pidlTemp) && !(BindCtx_GetMode(pbc, 0) & STGM_CREATE))
460 return E_INVALIDARG;
461
462 *ppidl = pidlTemp.Detach();
463
464 if (!*pch)
465 {
466 if (pdwAttributes && *pdwAttributes)
467 GetGuidItemAttributes(*ppidl, pdwAttributes);
468
469 return S_OK;
470 }
471
472 HRESULT hr = SHELL32_ParseNextElement(this, hwndOwner, pbc, ppidl, pch + 1, pchEaten,
473 pdwAttributes);
474 if (FAILED(hr))
475 {
476 ILFree(*ppidl);
477 *ppidl = NULL;
478 }
479 return hr;
480}
BOOL _IsInNameSpace(_In_ LPCITEMIDLIST pidl)
Definition: CRegFolder.cpp:410
DWORD BindCtx_GetMode(_In_ IBindCtx *pbc, _In_ DWORD dwDefault)
Definition: utils.cpp:114
#define PT_GUID
#define FAILED(hr)
Definition: intsafe.h:51
#define pch(ap)
Definition: match.c:418
#define STGM_CREATE
Definition: objbase.h:926
BOOL WINAPI GUIDFromStringW(_In_ PCWSTR psz, _Out_ LPGUID pguid)
void WINAPI ILFree(LPITEMIDLIST pidl)
Definition: pidl.c:938
LPITEMIDLIST _ILCreateGuid(PIDLTYPE type, REFIID guid)
Definition: pidl.c:1731
HRESULT SHELL32_ParseNextElement(IShellFolder2 *psf, HWND hwndOwner, LPBC pbc, LPITEMIDLIST *pidlInOut, LPOLESTR szNext, DWORD *pEaten, DWORD *pdwAttributes)
Definition: shlfolder.cpp:79
#define CO_E_CLASSSTRING
Definition: winerror.h:2806

◆ SetNameOf()

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

Implements IShellFolder.

Definition at line 758 of file CRegFolder.cpp.

760{
761 GUID const *clsid = _ILGetGUIDPointer (pidl);
762 LPOLESTR pStr;
763 HRESULT hr;
764 WCHAR szName[100];
765
766 if (!clsid)
767 {
768 ERR("Pidl is not reg item!\n");
769 return E_FAIL;
770 }
771
772 hr = StringFromCLSID(*clsid, &pStr);
774 return hr;
775
776 swprintf(szName, L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\CLSID\\%s", pStr);
777
778 DWORD cbData = (wcslen(lpName) + 1) * sizeof(WCHAR);
780
781 CoTaskMemFree(pStr);
782
783 if (res == ERROR_SUCCESS)
784 {
785 *pPidlOut = ILClone(pidl);
786 return S_OK;
787 }
788
789 return E_FAIL;
790}
HRESULT WINAPI StringFromCLSID(REFCLSID id, LPOLESTR *idstr)
Definition: compobj.c:2412
#define RRF_RT_REG_SZ
Definition: driver.c:575
DWORD WINAPI SHSetValueW(HKEY hKey, LPCWSTR lpszSubKey, LPCWSTR lpszValue, DWORD dwType, LPCVOID pvData, DWORD cbData)
Definition: reg.c:1306
#define swprintf
Definition: precomp.h:40
static LPOLESTR
Definition: stg_prop.c:27
static const WCHAR szName[]
Definition: powrprof.c:45
_In_ LPCSTR lpName
Definition: winbase.h:2789
#define HKEY_CURRENT_USER
Definition: winreg.h:11

Member Data Documentation

◆ m_enumKeyName

CAtlStringW CRegFolder::m_enumKeyName
private

Definition at line 316 of file CRegFolder.cpp.

Referenced by EnumObjects(), and Initialize().

◆ m_guid

GUID CRegFolder::m_guid
private

Definition at line 314 of file CRegFolder.cpp.

Referenced by GetDisplayNameOf(), and Initialize().

◆ m_pidlRoot

CComHeapPtr<ITEMIDLIST> CRegFolder::m_pidlRoot
private

◆ m_rootPath

CAtlStringW CRegFolder::m_rootPath
private

Definition at line 315 of file CRegFolder.cpp.

Referenced by GetDisplayNameOf(), and Initialize().


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