ReactOS 0.4.16-dev-747-gbc52d5f
CDefaultContextMenu Class Reference
Inheritance diagram for CDefaultContextMenu:
Collaboration diagram for CDefaultContextMenu:

Public Member Functions

 CDefaultContextMenu ()
 
 ~CDefaultContextMenu ()
 
HRESULT WINAPI Initialize (const DEFCONTEXTMENU *pdcm, LPFNDFMCALLBACK lpfn)
 
STDMETHOD() QueryContextMenu (HMENU hMenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags) override
 
STDMETHOD() InvokeCommand (LPCMINVOKECOMMANDINFO lpcmi) override
 
STDMETHOD() GetCommandString (UINT_PTR idCommand, UINT uFlags, UINT *lpReserved, LPSTR lpszName, UINT uMaxNameLen) override
 
STDMETHOD() HandleMenuMsg (UINT uMsg, WPARAM wParam, LPARAM lParam) override
 
STDMETHOD() HandleMenuMsg2 (UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *plResult) override
 
STDMETHOD() SetSite (IUnknown *pUnkSite) override
 
STDMETHOD() GetSite (REFIID riid, void **ppvSite) override
 
virtual HRESULT STDMETHODCALLTYPE QueryService (REFGUID svc, REFIID riid, void **ppv)
 
- 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 HandleMenuMsg2 ([in] UINT uMsg, [in] WPARAM wParam, [in] LPARAM lParam, [out] LRESULT *plResult)
 
HRESULT HandleMenuMsg ([in] UINT uMsg, [in] WPARAM wParam, [in] LPARAM lParam)
 
HRESULT QueryContextMenu ([in] HMENU hmenu, [in] UINT indexMenu, [in] UINT idCmdFirst, [in] UINT idCmdLast, [in] UINT uFlags)
 
HRESULT InvokeCommand ([in] LPCMINVOKECOMMANDINFO lpici)
 
HRESULT GetCommandString ([in] UINT_PTR idCmd, [in] UINT uType, [out] UINT *pwReserved, [out, size_is(cchMax)] LPSTR pszName, [in] UINT cchMax)
 
- Public Member Functions inherited from IUnknown
HRESULT QueryInterface ([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
 
ULONG AddRef ()
 
ULONG Release ()
 
- Public Member Functions inherited from IObjectWithSite
HRESULT SetSite ([in] IUnknown *pUnkSite)
 
HRESULT GetSite ([in] REFIID riid, [out, iid_is(riid)] PVOID *ppvSite)
 
- Public Member Functions inherited from IServiceProvider
HRESULT QueryService ([in] REFGUID guidService, [in] REFIID riid, [out] void **ppvObject)
 
HRESULT RemoteQueryService ([in] REFGUID guidService, [in] REFIID riid, [out, iid_is(riid)] IUnknown **ppvObject)
 

Private Member Functions

HRESULT _DoCallback (UINT uMsg, WPARAM wParam, LPVOID lParam)
 
HRESULT _DoInvokeCommandCallback (LPCMINVOKECOMMANDINFOEX lpcmi, WPARAM CmdId)
 
void AddStaticEntry (const HKEY hkeyClass, const WCHAR *szVerb, UINT uFlags)
 
void AddStaticEntriesForKey (HKEY hKey, UINT uFlags)
 
void TryPickDefault (HMENU hMenu, UINT idCmdFirst, UINT DfltOffset, UINT uFlags)
 
BOOL IsShellExtensionAlreadyLoaded (REFCLSID clsid)
 
HRESULT LoadDynamicContextMenuHandler (HKEY hKey, REFCLSID clsid)
 
BOOL EnumerateDynamicContextHandlerForKey (HKEY hRootKey)
 
UINT AddShellExtensionsToMenu (HMENU hMenu, UINT *pIndexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags)
 
UINT AddStaticContextMenusToMenu (HMENU hMenu, UINT *IndexMenu, UINT iIdCmdFirst, UINT iIdCmdLast, UINT uFlags)
 
HRESULT DoPaste (LPCMINVOKECOMMANDINFOEX lpcmi, BOOL bLink)
 
HRESULT DoOpenOrExplore (LPCMINVOKECOMMANDINFOEX lpcmi)
 
HRESULT DoCreateLink (LPCMINVOKECOMMANDINFOEX lpcmi)
 
HRESULT DoDelete (LPCMINVOKECOMMANDINFOEX lpcmi)
 
HRESULT DoCopyOrCut (LPCMINVOKECOMMANDINFOEX lpcmi, BOOL bCopy)
 
HRESULT DoRename (LPCMINVOKECOMMANDINFOEX lpcmi)
 
HRESULT DoProperties (LPCMINVOKECOMMANDINFOEX lpcmi)
 
HRESULT DoUndo (LPCMINVOKECOMMANDINFOEX lpcmi)
 
HRESULT DoCreateNewFolder (LPCMINVOKECOMMANDINFOEX lpici)
 
HRESULT DoCopyToMoveToFolder (LPCMINVOKECOMMANDINFOEX lpici, BOOL bCopy)
 
HRESULT InvokeShellExt (LPCMINVOKECOMMANDINFOEX lpcmi)
 
HRESULT InvokeRegVerb (LPCMINVOKECOMMANDINFOEX lpcmi)
 
DWORD BrowserFlagsFromVerb (LPCMINVOKECOMMANDINFOEX lpcmi, PStaticShellEntry pEntry)
 
HRESULT TryToBrowse (LPCMINVOKECOMMANDINFOEX lpcmi, LPCITEMIDLIST pidl, DWORD wFlags)
 
HRESULT InvokePidl (LPCMINVOKECOMMANDINFOEX lpcmi, LPCITEMIDLIST pidl, PStaticShellEntry pEntry)
 
PDynamicShellEntry GetDynamicEntry (UINT idCmd)
 
BOOL MapVerbToCmdId (PVOID Verb, PUINT idCmd, BOOL IsUnicode)
 

Private Attributes

CComPtr< IUnknownm_site
 
CComPtr< IShellFolderm_psf
 
CComPtr< IContextMenuCBm_pmcb
 
LPFNDFMCALLBACK m_pfnmcb
 
UINT m_cidl
 
PCUITEMID_CHILD_ARRAY m_apidl
 
CComPtr< IDataObjectm_pDataObj
 
HKEYm_aKeys
 
UINT m_cKeys
 
PIDLIST_ABSOLUTE m_pidlFolder
 
DWORD m_bGroupPolicyActive
 
CAtlList< DynamicShellEntrym_DynamicEntries
 
UINT m_iIdSHEFirst
 
UINT m_iIdSHELast
 
CAtlList< StaticShellEntrym_StaticEntries
 
UINT m_iIdSCMFirst
 
UINT m_iIdSCMLast
 
UINT m_iIdCBFirst
 
UINT m_iIdCBLast
 
UINT m_iIdDfltFirst
 
UINT m_iIdDfltLast
 
HWND m_hwnd
 
WCHAR m_DefVerbs [MAX_PATH]
 

Additional Inherited Members

- Public Types inherited from IContextMenu3
typedef IContextMenu3LPCONTEXTMENU3
 
- Public Types inherited from IContextMenu2
typedef IContextMenu2LPCONTEXTMENU2
 
- Public Types inherited from IContextMenu
typedef IContextMenuLPCONTEXTMENU
 
typedef struct IContextMenu::tagCMINVOKECOMMANDINFO CMINVOKECOMMANDINFO
 
typedef struct IContextMenu::tagCMINVOKECOMMANDINFOLPCMINVOKECOMMANDINFO
 
typedef struct IContextMenu::tagCMInvokeCommandInfoEx CMINVOKECOMMANDINFOEX
 
typedef struct IContextMenu::tagCMInvokeCommandInfoExLPCMINVOKECOMMANDINFOEX
 
- Public Types inherited from IUnknown
typedef IUnknownLPUNKNOWN
 
- Public Types inherited from IObjectWithSite
typedef IObjectWithSiteLPOBJECTWITHSITE
 
- Public Types inherited from IServiceProvider
typedef IServiceProviderLPSERVICEPROVIDER
 
- 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
 
- Static Public Attributes inherited from IContextMenu
static const WCHAR CMDSTR_NEWFOLDERW [] = {'N','e','w','F','o','l','d','e','r',0}
 
static const WCHAR CMDSTR_VIEWLISTW [] = {'V','i','e','w','L','i','s','t',0}
 
static const WCHAR CMDSTR_VIEWDETAILSW [] = {'V','i','e','w','D','e','t','a','i','l','s',0}
 

Detailed Description

Definition at line 142 of file CDefaultContextMenu.cpp.

Constructor & Destructor Documentation

◆ CDefaultContextMenu()

CDefaultContextMenu::CDefaultContextMenu ( )

Definition at line 236 of file CDefaultContextMenu.cpp.

236 :
237 m_psf(NULL),
238 m_pmcb(NULL),
239 m_pfnmcb(NULL),
240 m_cidl(0),
241 m_apidl(NULL),
243 m_aKeys(NULL),
244 m_cKeys(NULL),
247 m_iIdSHEFirst(0),
248 m_iIdSHELast(0),
249 m_iIdSCMFirst(0),
250 m_iIdSCMLast(0),
251 m_iIdCBFirst(0),
252 m_iIdCBLast(0),
254 m_iIdDfltLast(0),
255 m_hwnd(NULL)
256{
258}
CComPtr< IDataObject > m_pDataObj
CComPtr< IShellFolder > m_psf
PCUITEMID_CHILD_ARRAY m_apidl
CComPtr< IContextMenuCB > m_pmcb
PIDLIST_ABSOLUTE m_pidlFolder
#define NULL
Definition: types.h:112
#define UNICODE_NULL

◆ ~CDefaultContextMenu()

CDefaultContextMenu::~CDefaultContextMenu ( )

Definition at line 260 of file CDefaultContextMenu.cpp.

261{
262 for (POSITION it = m_DynamicEntries.GetHeadPosition(); it != NULL;)
263 {
264 const DynamicShellEntry& info = m_DynamicEntries.GetNext(it);
265 IUnknown_SetSite(info.pCM.p, NULL);
266 }
267 m_DynamicEntries.RemoveAll();
268 m_StaticEntries.RemoveAll();
269
270 for (UINT i = 0; i < m_cKeys; i++)
273
274 if (m_pidlFolder)
276 _ILFreeaPidl(const_cast<PITEMID_CHILD *>(m_apidl), m_cidl);
277}
#define RegCloseKey(hKey)
Definition: registry.h:49
CAtlList< StaticShellEntry > m_StaticEntries
CAtlList< DynamicShellEntry > m_DynamicEntries
#define GetProcessHeap()
Definition: compat.h:736
#define HeapFree(x, y, z)
Definition: compat.h:735
HRESULT WINAPI IUnknown_SetSite(IUnknown *obj, IUnknown *site)
Definition: ordinal.c:1411
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
VOID WINAPI CoTaskMemFree(LPVOID ptr)
Definition: ifs.c:442
unsigned int UINT
Definition: ndis.h:50
void _ILFreeaPidl(LPITEMIDLIST *apidl, UINT cidl)
Definition: pidl.c:2603

Member Function Documentation

◆ _DoCallback()

HRESULT CDefaultContextMenu::_DoCallback ( UINT  uMsg,
WPARAM  wParam,
LPVOID  lParam 
)
private

Definition at line 327 of file CDefaultContextMenu.cpp.

328{
329 if (m_pmcb)
330 {
331 return m_pmcb->CallBack(m_psf, m_hwnd, m_pDataObj, uMsg, wParam, (LPARAM)lParam);
332 }
333 else if(m_pfnmcb)
334 {
336 }
337
338 return E_FAIL;
339}
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
#define E_FAIL
Definition: ddrawi.h:102
LONG_PTR LPARAM
Definition: windef.h:208

Referenced by _DoInvokeCommandCallback(), QueryContextMenu(), and TryPickDefault().

◆ _DoInvokeCommandCallback()

HRESULT CDefaultContextMenu::_DoInvokeCommandCallback ( LPCMINVOKECOMMANDINFOEX  lpcmi,
WPARAM  CmdId 
)
private

Definition at line 1489 of file CDefaultContextMenu.cpp.

1491{
1492 BOOL Unicode = IsUnicode(*lpcmi);
1493 WCHAR lParamBuf[MAX_PATH];
1494 LPARAM lParam = 0;
1495
1496 if (Unicode && lpcmi->lpParametersW)
1497 lParam = (LPARAM)lpcmi->lpParametersW;
1498 else if (lpcmi->lpParameters)
1499 lParam = SHAnsiToUnicode(lpcmi->lpParameters, lParamBuf, _countof(lParamBuf)) ? (LPARAM)lParamBuf : 0;
1500
1501 HRESULT hr;
1502#if 0 // TODO: Try DFM_INVOKECOMMANDEX first.
1503 DFMICS dfmics = { sizeof(DFMICS), lpcmi->fMask, lParam, m_iIdSCMFirst?, m_iIdDfltLast?, (LPCMINVOKECOMMANDINFO)lpcmi, m_site };
1504 hr = _DoCallback(DFM_INVOKECOMMANDEX, CmdId, &dfmics);
1505 if (hr == E_NOTIMPL)
1506#endif
1507 hr = _DoCallback(DFM_INVOKECOMMAND, CmdId, (void*)lParam);
1508 return hr;
1509}
CComPtr< IUnknown > m_site
HRESULT _DoCallback(UINT uMsg, WPARAM wParam, LPVOID lParam)
#define E_NOTIMPL
Definition: ddrawi.h:99
#define DFM_INVOKECOMMANDEX
Definition: precomp.h:46
#define DFM_INVOKECOMMAND
Definition: precomp.h:45
#define MAX_PATH
Definition: compat.h:34
DWORD WINAPI SHAnsiToUnicode(LPCSTR lpSrcStr, LPWSTR lpDstStr, int iLen)
Definition: string.c:2673
unsigned int BOOL
Definition: ntddk_ex.h:94
struct IContextMenu::tagCMINVOKECOMMANDINFO * LPCMINVOKECOMMANDINFO
if(dx< 0)
Definition: linetemp.h:194
HRESULT hr
Definition: shlfolder.c:183
#define _countof(array)
Definition: sndvol32.h:70
__wchar_t WCHAR
Definition: xmlstorage.h:180

Referenced by DoProperties(), and InvokeCommand().

◆ AddShellExtensionsToMenu()

UINT CDefaultContextMenu::AddShellExtensionsToMenu ( HMENU  hMenu,
UINT pIndexMenu,
UINT  idCmdFirst,
UINT  idCmdLast,
UINT  uFlags 
)
private

Definition at line 535 of file CDefaultContextMenu.cpp.

536{
537 UINT cIds = 0;
538
539 if (m_DynamicEntries.IsEmpty())
540 return cIds;
541
542 POSITION it = m_DynamicEntries.GetHeadPosition();
543 while (it != NULL)
544 {
546
547 HRESULT hr = info.pCM->QueryContextMenu(hMenu, *pIndexMenu, idCmdFirst + cIds, idCmdLast, uFlags);
548 if (SUCCEEDED(hr))
549 {
550 info.iIdCmdFirst = cIds;
551 info.NumIds = HRESULT_CODE(hr);
552 (*pIndexMenu) += info.NumIds;
553
554 cIds += info.NumIds;
555 if (idCmdFirst + cIds >= idCmdLast)
556 break;
557 }
558 TRACE("pEntry hr %x contextmenu %p cmdfirst %x num ids %x\n", hr, info.pCM.p, info.iIdCmdFirst, info.NumIds);
559 }
560 return cIds;
561}
UINT uFlags
Definition: api.c:59
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define TRACE(s)
Definition: solgame.cpp:4
#define HRESULT_CODE(hr)
Definition: winerror.h:76

Referenced by QueryContextMenu().

◆ AddStaticContextMenusToMenu()

UINT CDefaultContextMenu::AddStaticContextMenusToMenu ( HMENU  hMenu,
UINT IndexMenu,
UINT  iIdCmdFirst,
UINT  iIdCmdLast,
UINT  uFlags 
)
private

Definition at line 564 of file CDefaultContextMenu.cpp.

570{
572 MENUITEMINFOW mii = { sizeof(mii) };
573 UINT idResource;
574 WCHAR wszDispVerb[80]; // The limit on XP. If the friendly string is longer, it falls back to the verb key.
575 UINT fState;
576 UINT cIds = 0, indexFirst = *pIndexMenu, indexDefault;
577 int iDefVerbIndex = -1;
578
580 mii.fType = MFT_STRING;
581
582 POSITION it = m_StaticEntries.GetHeadPosition();
583 bool first = true;
584 while (it != NULL)
585 {
587 BOOL forceFirstPos = FALSE;
588
589 fState = MFS_ENABLED;
590
591 /* set first entry as default */
592 if (first)
593 {
594 fState |= MFS_DEFAULT;
595 first = false;
596 }
597
598 if (info.Verb.CompareNoCase(L"open") == 0)
599 {
600 idResource = IDS_OPEN_VERB;
601 fState |= MFS_DEFAULT; /* override default when open verb is found */
602 forceFirstPos++;
603 }
604 else if (info.Verb.CompareNoCase(L"explore") == 0)
605 {
606 idResource = IDS_EXPLORE_VERB;
607 if (uFlags & CMF_EXPLORE)
608 {
609 fState |= MFS_DEFAULT;
610 forceFirstPos++;
611 }
612 }
613 else if (info.Verb.CompareNoCase(L"runas") == 0)
614 idResource = IDS_RUNAS_VERB;
615 else if (info.Verb.CompareNoCase(L"edit") == 0)
616 idResource = IDS_EDIT_VERB;
617 else if (info.Verb.CompareNoCase(L"find") == 0)
618 idResource = IDS_FIND_VERB;
619 else if (info.Verb.CompareNoCase(L"print") == 0)
620 idResource = IDS_PRINT_VERB;
621 else if (info.Verb.CompareNoCase(L"printto") == 0)
622 continue;
623 else
624 idResource = 0;
625
626 /* By default use verb for menu item name */
627 mii.dwTypeData = (LPWSTR)info.Verb.GetString();
628
629 WCHAR wszKey[sizeof("shell\\") + MAX_VERB];
630 HRESULT hr;
631 hr = StringCbPrintfW(wszKey, sizeof(wszKey), L"shell\\%s", info.Verb.GetString());
633 {
634 continue;
635 }
636
637 UINT cmdFlags = 0;
638 bool hide = false;
639 HKEY hkVerb;
640 if (idResource > 0)
641 {
642 if (!(uFlags & CMF_OPTIMIZEFORINVOKE))
643 {
644 if (LoadStringW(shell32_hInstance, idResource, wszDispVerb, _countof(wszDispVerb)))
645 mii.dwTypeData = wszDispVerb; /* use translated verb */
646 else
647 ERR("Failed to load string\n");
648 }
649
650 if (RegOpenKeyW(info.hkClass, wszKey, &hkVerb) != ERROR_SUCCESS)
651 hkVerb = NULL;
652 }
653 else
654 {
655 if (RegOpenKeyW(info.hkClass, wszKey, &hkVerb) == ERROR_SUCCESS)
656 {
657 if (!(uFlags & CMF_OPTIMIZEFORINVOKE))
658 {
659 DWORD cbVerb = sizeof(wszDispVerb);
660 LONG res = RegLoadMUIStringW(hkVerb, L"MUIVerb", wszDispVerb, cbVerb, NULL, 0, NULL);
661 if (res || !*wszDispVerb)
662 res = RegLoadMUIStringW(hkVerb, NULL, wszDispVerb, cbVerb, NULL, 0, NULL);
663
664 if (res == ERROR_SUCCESS && *wszDispVerb)
665 {
666 /* use description for the menu entry */
667 mii.dwTypeData = wszDispVerb;
668 }
669 }
670 }
671 else
672 {
673 hkVerb = NULL;
674 }
675 }
676
677 if (hkVerb)
678 {
679 if (!(uFlags & CMF_EXTENDEDVERBS))
680 hide = RegValueExists(hkVerb, L"Extended");
681
682 if (!hide)
683 hide = RegValueExists(hkVerb, L"ProgrammaticAccessOnly");
684
685 if (!hide && !(uFlags & CMF_DISABLEDVERBS))
686 hide = RegValueExists(hkVerb, L"LegacyDisable");
687
688 if (RegValueExists(hkVerb, L"NeverDefault"))
689 fState &= ~MFS_DEFAULT;
690
691 if (RegValueExists(hkVerb, L"SeparatorBefore"))
692 cmdFlags |= ECF_SEPARATORBEFORE;
693 if (RegValueExists(hkVerb, L"SeparatorAfter"))
694 cmdFlags |= ECF_SEPARATORAFTER;
695
696 RegCloseKey(hkVerb);
697 }
698
699 if (((uFlags & CMF_NODEFAULT) && ntver >= _WIN32_WINNT_VISTA) ||
700 ((uFlags & CMF_DONOTPICKDEFAULT) && ntver >= _WIN32_WINNT_WIN7))
701 {
702 fState &= ~MFS_DEFAULT;
703 }
704
705 if (!hide)
706 {
707 if (cmdFlags & ECF_SEPARATORBEFORE)
708 {
709 if (InsertMenuItemAt(hMenu, *pIndexMenu, MF_SEPARATOR))
710 (*pIndexMenu)++;
711 }
712
713 UINT pos = *pIndexMenu;
714 int verbIndex = hkVerb ? FindVerbInDefaultVerbList(m_DefVerbs, info.Verb) : -1;
715 if (verbIndex >= 0)
716 {
717 if (verbIndex < iDefVerbIndex || iDefVerbIndex < 0)
718 {
719 iDefVerbIndex = verbIndex;
720 fState |= MFS_DEFAULT;
721 forceFirstPos = TRUE;
722 }
723 else
724 {
725 fState &= ~MFS_DEFAULT; // We have already set a better default
726 pos = indexDefault;
727 }
728 }
729 else if (iDefVerbIndex >= 0)
730 {
731 fState &= ~MFS_DEFAULT; // We have already set the default
732 if (forceFirstPos)
733 pos = indexDefault;
734 forceFirstPos = FALSE;
735 }
736
737 mii.fState = fState;
738 mii.wID = iIdCmdFirst + cIds;
739 if (InsertMenuItemW(hMenu, forceFirstPos ? indexFirst : pos, TRUE, &mii))
740 (*pIndexMenu)++;
741
742 if (cmdFlags & ECF_SEPARATORAFTER)
743 {
744 if (InsertMenuItemAt(hMenu, *pIndexMenu, MF_SEPARATOR))
745 (*pIndexMenu)++;
746 }
747
748 if (fState & MFS_DEFAULT)
749 indexDefault = *pIndexMenu; // This is where we want to insert "high priority" verbs
750 }
751 cIds++; // Always increment the id because it acts as the index into m_StaticEntries
752
753 if (mii.wID >= iIdCmdLast)
754 break;
755 }
756
757 return cIds;
758}
static int FindVerbInDefaultVerbList(LPCWSTR List, LPCWSTR Verb)
static BOOL InsertMenuItemAt(HMENU hMenu, UINT Pos, UINT Flags)
#define MAX_VERB
#define shell32_hInstance
#define ERR(fmt,...)
Definition: precomp.h:57
static UINT RosGetProcessEffectiveVersion(VOID)
Definition: compat_undoc.h:39
#define ERROR_SUCCESS
Definition: deptool.c:10
LONG RegLoadMUIStringW(IN HKEY hKey, IN LPCWSTR pszValue OPTIONAL, OUT LPWSTR pszOutBuf, IN DWORD cbOutBuf, OUT LPDWORD pcbData OPTIONAL, IN DWORD Flags, IN LPCWSTR pszDirectory OPTIONAL)
Definition: muireg.c:53
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
LONG WINAPI RegOpenKeyW(HKEY hKey, LPCWSTR lpSubKey, PHKEY phkResult)
Definition: reg.c:3268
#define FAILED_UNEXPECTEDLY(hr)
Definition: precomp.h:121
static BOOL RegValueExists(HKEY hKey, LPCWSTR Name)
Definition: utils.h:20
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint res
Definition: glext.h:9613
const GLint * first
Definition: glext.h:5794
#define L(x)
Definition: ntvdm.h:50
long LONG
Definition: pedump.c:60
#define _WIN32_WINNT_WIN7
Definition: sdkddkver.h:28
#define _WIN32_WINNT_VISTA
Definition: sdkddkver.h:25
#define IDS_OPEN_VERB
Definition: shresdef.h:212
#define IDS_FIND_VERB
Definition: shresdef.h:216
#define IDS_EXPLORE_VERB
Definition: shresdef.h:213
#define IDS_PRINT_VERB
Definition: shresdef.h:217
#define IDS_RUNAS_VERB
Definition: shresdef.h:214
#define IDS_EDIT_VERB
Definition: shresdef.h:215
STRSAFEAPI StringCbPrintfW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszFormat,...)
Definition: strsafe.h:557
LPWSTR dwTypeData
Definition: winuser.h:3272
#define MIIM_ID
Definition: winuser.h:725
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
#define MIIM_STATE
Definition: winuser.h:724
#define MFS_DEFAULT
Definition: winuser.h:751
#define MF_SEPARATOR
Definition: winuser.h:137
#define MFS_ENABLED
Definition: winuser.h:753
#define MFT_STRING
Definition: winuser.h:749
#define MIIM_DATA
Definition: winuser.h:729
#define MIIM_TYPE
Definition: winuser.h:728
BOOL WINAPI InsertMenuItemW(_In_ HMENU, _In_ UINT, _In_ BOOL, _In_ LPCMENUITEMINFOW)
WCHAR * LPWSTR
Definition: xmlstorage.h:184

Referenced by QueryContextMenu().

◆ AddStaticEntriesForKey()

void CDefaultContextMenu::AddStaticEntriesForKey ( HKEY  hKey,
UINT  uFlags 
)
private

Definition at line 367 of file CDefaultContextMenu.cpp.

368{
369 WCHAR wszName[VERBKEY_CCHMAX];
370 DWORD cchName, dwIndex = 0;
371 HKEY hShellKey;
372
373 LRESULT lres = RegOpenKeyExW(hKey, L"shell", 0, KEY_READ, &hShellKey);
374 if (lres != STATUS_SUCCESS)
375 return;
376
377 if (!*m_DefVerbs)
378 {
379 DWORD cb = sizeof(m_DefVerbs);
381 }
382
383 while(TRUE)
384 {
385 cchName = _countof(wszName);
386 if (RegEnumKeyExW(hShellKey, dwIndex++, wszName, &cchName, NULL, NULL, NULL, NULL) != ERROR_SUCCESS)
387 break;
388
389 AddStaticEntry(hKey, wszName, uFlags);
390 }
391
392 RegCloseKey(hShellKey);
393}
void AddStaticEntry(const HKEY hkeyClass, const WCHAR *szVerb, UINT uFlags)
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3333
LSTATUS WINAPI RegGetValueW(HKEY hKey, LPCWSTR pszSubKey, LPCWSTR pszValue, DWORD dwFlags, LPDWORD pdwType, PVOID pvData, LPDWORD pcbData)
Definition: reg.c:1931
LONG WINAPI RegEnumKeyExW(_In_ HKEY hKey, _In_ DWORD dwIndex, _Out_ LPWSTR lpName, _Inout_ LPDWORD lpcbName, _Reserved_ LPDWORD lpReserved, _Out_opt_ LPWSTR lpClass, _Inout_opt_ LPDWORD lpcbClass, _Out_opt_ PFILETIME lpftLastWriteTime)
Definition: reg.c:2504
#define RRF_RT_REG_SZ
Definition: driver.c:575
#define VERBKEY_CCHMAX
Definition: precomp.h:129
FxAutoRegKey hKey
static HMODULE MODULEINFO DWORD cb
Definition: module.c:33
#define KEY_READ
Definition: nt_native.h:1023
#define STATUS_SUCCESS
Definition: shellext.h:65
_In_ PSID _Out_writes_to_opt_ cchName LPSTR _Inout_ LPDWORD cchName
Definition: winbase.h:2792
LONG_PTR LRESULT
Definition: windef.h:209

Referenced by QueryContextMenu().

◆ AddStaticEntry()

void CDefaultContextMenu::AddStaticEntry ( const HKEY  hkeyClass,
const WCHAR szVerb,
UINT  uFlags 
)
private

Definition at line 341 of file CDefaultContextMenu.cpp.

342{
343 POSITION it = m_StaticEntries.GetHeadPosition();
344 while (it != NULL)
345 {
346 const StaticShellEntry& info = m_StaticEntries.GetNext(it);
347 if (info.Verb.CompareNoCase(szVerb) == 0)
348 {
349 /* entry already exists */
350 return;
351 }
352 }
353
354 TRACE("adding verb %s\n", debugstr_w(szVerb));
355
356 if (!_wcsicmp(szVerb, L"open") && !(uFlags & CMF_NODEFAULT))
357 {
358 /* open verb is always inserted in front */
359 m_StaticEntries.AddHead({ szVerb, hkeyClass });
360 }
361 else
362 {
363 m_StaticEntries.AddTail({ szVerb, hkeyClass });
364 }
365}
#define debugstr_w
Definition: kernel32.h:32
_Check_return_ _CRTIMP int __cdecl _wcsicmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)

Referenced by AddStaticEntriesForKey().

◆ BrowserFlagsFromVerb()

DWORD CDefaultContextMenu::BrowserFlagsFromVerb ( LPCMINVOKECOMMANDINFOEX  lpcmi,
PStaticShellEntry  pEntry 
)
private

Definition at line 1266 of file CDefaultContextMenu.cpp.

1267{
1269 HWND hwndTree;
1270 LPCWSTR FlagsName;
1271 WCHAR wszKey[sizeof("shell\\") + MAX_VERB];
1272 HRESULT hr;
1273 DWORD wFlags;
1274 DWORD cbVerb;
1275
1276 if (!m_site)
1277 return 0;
1278
1279 /* Get a pointer to the shell browser */
1281 if (FAILED(hr))
1282 return 0;
1283
1284 /* See if we are in Explore or Browse mode. If the browser's tree is present, we are in Explore mode.*/
1285 if (SUCCEEDED(psb->GetControlWindow(FCW_TREE, &hwndTree)) && hwndTree)
1286 FlagsName = L"ExplorerFlags";
1287 else
1288 FlagsName = L"BrowserFlags";
1289
1291 if (SUCCEEDED(psb->QueryInterface(IID_PPV_ARG(ICommDlgBrowser, &pcdb))))
1292 {
1293 if (LOBYTE(GetVersion()) < 6 || FlagsName[0] == 'E')
1294 return 0; // Don't browse in-place
1295 }
1296
1297 /* Try to get the flag from the verb */
1298 hr = StringCbPrintfW(wszKey, sizeof(wszKey), L"shell\\%s", pEntry->Verb.GetString());
1300 return 0;
1301
1302 cbVerb = sizeof(wFlags);
1303 if (RegGetValueW(pEntry->hkClass, wszKey, FlagsName, RRF_RT_REG_DWORD, NULL, &wFlags, &cbVerb) == ERROR_SUCCESS)
1304 {
1305 return wFlags;
1306 }
1307
1308 return 0;
1309}
#define RRF_RT_REG_DWORD
Definition: driver.c:578
HRESULT WINAPI IUnknown_QueryService(IUnknown *, REFGUID, REFIID, LPVOID *)
Definition: ordinal.c:1501
PLIST_ENTRY pEntry
Definition: fxioqueue.cpp:4484
#define FAILED(hr)
Definition: intsafe.h:51
#define LOBYTE(W)
Definition: jmemdos.c:487
DWORD WINAPI GetVersion()
Definition: redirtest.c:5
#define SID_IShellBrowser
_In_ DWORD _Out_ _In_ WORD wFlags
Definition: wincon.h:531
#define IID_PPV_ARG(Itype, ppType)
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185

Referenced by InvokeRegVerb().

◆ DoCopyOrCut()

HRESULT CDefaultContextMenu::DoCopyOrCut ( LPCMINVOKECOMMANDINFOEX  lpcmi,
BOOL  bCopy 
)
private

Definition at line 1018 of file CDefaultContextMenu.cpp.

1019{
1020 if (!m_cidl || !m_pDataObj)
1021 return E_FAIL;
1022
1023 FORMATETC formatetc;
1025 STGMEDIUM medium = {0};
1026 medium.tymed = TYMED_HGLOBAL;
1027 medium.hGlobal = GlobalAlloc(GHND, sizeof(DWORD));
1028 DWORD* pdwFlag = (DWORD*)GlobalLock(medium.hGlobal);
1029 if (pdwFlag)
1030 *pdwFlag = bCopy ? DROPEFFECT_COPY : DROPEFFECT_MOVE;
1031 GlobalUnlock(medium.hGlobal);
1032 m_pDataObj->SetData(&formatetc, &medium, TRUE);
1033
1036 return hr;
1037
1038 return S_OK;
1039}
HRESULT WINAPI OleSetClipboard(IDataObject *data)
Definition: clipboard.c:2199
#define InitFormatEtc(fe, cf, med)
Definition: editor.h:32
LPVOID NTAPI GlobalLock(HGLOBAL hMem)
Definition: heapmem.c:755
BOOL NTAPI GlobalUnlock(HGLOBAL hMem)
Definition: heapmem.c:1190
HGLOBAL NTAPI GlobalAlloc(UINT uFlags, SIZE_T dwBytes)
Definition: heapmem.c:368
#define S_OK
Definition: intsafe.h:52
#define CFSTR_PREFERREDDROPEFFECT
Definition: shlobj.h:560
#define GHND
Definition: winbase.h:323
UINT WINAPI RegisterClipboardFormatW(_In_ LPCWSTR)

Referenced by InvokeCommand().

◆ DoCopyToMoveToFolder()

HRESULT CDefaultContextMenu::DoCopyToMoveToFolder ( LPCMINVOKECOMMANDINFOEX  lpici,
BOOL  bCopy 
)
private

Definition at line 1090 of file CDefaultContextMenu.cpp.

1091{
1092 HRESULT hr = E_FAIL;
1093 if (!m_pDataObj)
1094 {
1095 ERR("m_pDataObj is NULL\n");
1096 return hr;
1097 }
1098
1099 CComPtr<IContextMenu> pContextMenu;
1100 if (bCopy)
1101 hr = SHCoCreateInstance(NULL, &CLSID_CopyToMenu, NULL,
1102 IID_PPV_ARG(IContextMenu, &pContextMenu));
1103 else
1104 hr = SHCoCreateInstance(NULL, &CLSID_MoveToMenu, NULL,
1105 IID_PPV_ARG(IContextMenu, &pContextMenu));
1107 return hr;
1108
1110 hr = pContextMenu->QueryInterface(IID_PPV_ARG(IShellExtInit, &pInit));
1112 return hr;
1113
1114 hr = pInit->Initialize(m_pidlFolder, m_pDataObj, NULL);
1116 return hr;
1117
1118 if (bCopy)
1119 lpici->lpVerb = "copyto";
1120 else
1121 lpici->lpVerb = "moveto";
1122
1123 return pContextMenu->InvokeCommand((LPCMINVOKECOMMANDINFO)lpici);
1124}
HRESULT WINAPI SHCoCreateInstance(LPCWSTR aclsid, const CLSID *clsid, LPUNKNOWN pUnkOuter, REFIID refiid, LPVOID *ppv)
Definition: shellole.c:105
PWDFDEVICE_INIT pInit

Referenced by InvokeCommand().

◆ DoCreateLink()

HRESULT CDefaultContextMenu::DoCreateLink ( LPCMINVOKECOMMANDINFOEX  lpcmi)
private

Definition at line 987 of file CDefaultContextMenu.cpp.

988{
989 if (!m_cidl || !m_pDataObj)
990 return E_FAIL;
991
993 HRESULT hr = m_psf->CreateViewObject(NULL, IID_PPV_ARG(IDropTarget, &pDT));
995 return hr;
996
998
999 return S_OK;
1000}
BOOL WINAPI SHSimulateDrop(IDropTarget *pDrop, IDataObject *pDataObj, DWORD grfKeyState, PPOINTL lpPt, DWORD *pdwEffect)
Definition: ordinal.c:1828
#define MK_SHIFT
Definition: winuser.h:2372
#define MK_CONTROL
Definition: winuser.h:2373

Referenced by InvokeCommand().

◆ DoCreateNewFolder()

HRESULT CDefaultContextMenu::DoCreateNewFolder ( LPCMINVOKECOMMANDINFOEX  lpici)
private

Definition at line 1128 of file CDefaultContextMenu.cpp.

1130{
1131 WCHAR wszPath[MAX_PATH];
1132 WCHAR wszName[MAX_PATH];
1133 WCHAR wszNewFolder[25];
1134 HRESULT hr;
1135
1136 /* Get folder path */
1139 return hr;
1140
1141 if (!LoadStringW(shell32_hInstance, IDS_NEWFOLDER, wszNewFolder, _countof(wszNewFolder)))
1142 return E_FAIL;
1143
1144 /* Create the name of the new directory */
1145 if (!PathYetAnotherMakeUniqueName(wszName, wszPath, NULL, wszNewFolder))
1146 return E_FAIL;
1147
1148 /* Create the new directory and show the appropriate dialog in case of error */
1149 if (SHCreateDirectory(lpici->hwnd, wszName) != ERROR_SUCCESS)
1150 return E_FAIL;
1151
1152 /* Show and select the new item in the def view */
1153 LPITEMIDLIST pidl;
1154 PITEMID_CHILD pidlNewItem;
1156
1157 /* Notify the view object about the new item */
1159
1160 if (!m_site)
1161 return S_OK;
1162
1163 /* Get a pointer to the shell view */
1166 return S_OK;
1167
1168 /* Attempt to get the pidl of the new item */
1169 hr = SHILCreateFromPathW(wszName, &pidl, NULL);
1171 return hr;
1172
1173 pidlNewItem = ILFindLastID(pidl);
1174
1175 hr = psv->SelectItem(pidlNewItem, SVSI_DESELECTOTHERS | SVSI_EDIT | SVSI_ENSUREVISIBLE |
1176 SVSI_FOCUSED | SVSI_SELECT);
1178 return hr;
1179
1180 SHFree(pidl);
1181
1182 return S_OK;
1183}
EXTERN_C void WINAPI SHChangeNotify(LONG wEventId, UINT uFlags, LPCVOID dwItem1, LPCVOID dwItem2)
void WINAPI SHFree(LPVOID pv)
Definition: shellole.c:326
BOOL WINAPI PathYetAnotherMakeUniqueName(LPWSTR buffer, LPCWSTR path, LPCWSTR shortname, LPCWSTR longname)
Definition: shellpath.c:699
#define IDS_NEWFOLDER
HRESULT WINAPI SHILCreateFromPathW(LPCWSTR path, LPITEMIDLIST *ppidl, DWORD *attributes)
Definition: pidl.c:403
LPITEMIDLIST WINAPI ILFindLastID(LPCITEMIDLIST pidl)
Definition: pidl.c:198
BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath)
Definition: pidl.c:1454
int WINAPI SHCreateDirectory(HWND hWnd, LPCWSTR path)
Definition: shlfileop.cpp:848
#define SID_IFolderView
#define SHCNE_MKDIR
Definition: shlobj.h:1893
#define SHCNF_FLUSH
Definition: shlobj.h:1928
#define SHCNF_PATHW
Definition: shlobj.h:1925
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41
CONST void * LPCVOID
Definition: windef.h:191

Referenced by InvokeCommand().

◆ DoDelete()

HRESULT CDefaultContextMenu::DoDelete ( LPCMINVOKECOMMANDINFOEX  lpcmi)
private

Definition at line 1002 of file CDefaultContextMenu.cpp.

1003{
1004 if (!m_cidl || !m_pDataObj)
1005 return E_FAIL;
1006
1010 return hr;
1011
1012 DWORD grfKeyState = (lpcmi->fMask & CMIC_MASK_SHIFT_DOWN) ? MK_SHIFT : 0;
1013 SHSimulateDrop(pDT, m_pDataObj, grfKeyState, NULL, NULL);
1014
1015 return S_OK;
1016}
HRESULT CRecyclerDropTarget_CreateInstance(REFIID riid, LPVOID *ppvOut)

Referenced by InvokeCommand().

◆ DoOpenOrExplore()

HRESULT CDefaultContextMenu::DoOpenOrExplore ( LPCMINVOKECOMMANDINFOEX  lpcmi)
private

Definition at line 981 of file CDefaultContextMenu.cpp.

982{
984 return E_FAIL;
985}
#define UNIMPLEMENTED
Definition: ntoskrnl.c:15

Referenced by InvokeCommand().

◆ DoPaste()

HRESULT CDefaultContextMenu::DoPaste ( LPCMINVOKECOMMANDINFOEX  lpcmi,
BOOL  bLink 
)
private

Definition at line 928 of file CDefaultContextMenu.cpp.

929{
930 HRESULT hr;
931
933 hr = OleGetClipboard(&pda);
935 return hr;
936
937 FORMATETC formatetc2;
938 STGMEDIUM medium2;
940
941 DWORD dwKey= 0;
942
943 if (SUCCEEDED(pda->GetData(&formatetc2, &medium2)))
944 {
945 DWORD * pdwFlag = (DWORD*)GlobalLock(medium2.hGlobal);
946 if (pdwFlag)
947 {
948 if (*pdwFlag == DROPEFFECT_COPY)
949 dwKey = MK_CONTROL;
950 else
951 dwKey = MK_SHIFT;
952 }
953 else
954 {
955 ERR("No drop effect obtained\n");
956 }
957 GlobalUnlock(medium2.hGlobal);
958 }
959
960 if (bLink)
961 {
962 dwKey = MK_CONTROL|MK_SHIFT;
963 }
964
966 if (m_cidl)
967 hr = m_psf->GetUIObjectOf(NULL, 1, &m_apidl[0], IID_NULL_PPV_ARG(IDropTarget, &pdrop));
968 else
969 hr = m_psf->CreateViewObject(NULL, IID_PPV_ARG(IDropTarget, &pdrop));
970
972 return hr;
973
974 SHSimulateDrop(pdrop, pda, dwKey, NULL, NULL);
975
976 TRACE("CP result %x\n", hr);
977 return S_OK;
978}
HRESULT WINAPI OleGetClipboard(IDataObject **obj)
Definition: clipboard.c:2249
#define IID_NULL_PPV_ARG(Itype, ppType)

Referenced by InvokeCommand().

◆ DoProperties()

HRESULT CDefaultContextMenu::DoProperties ( LPCMINVOKECOMMANDINFOEX  lpcmi)
private

Definition at line 1068 of file CDefaultContextMenu.cpp.

1070{
1072
1073 // We are asked to run the default property sheet
1074 if (hr == S_FALSE)
1075 {
1077 }
1078
1079 return hr;
1080}
HRESULT _DoInvokeCommandCallback(LPCMINVOKECOMMANDINFOEX lpcmi, WPARAM CmdId)
HRESULT SHELL32_ShowPropertiesDialog(IDataObject *pdtobj)
Definition: shlfolder.cpp:508
#define DFM_CMD_PROPERTIES
Definition: shlobj.h:2612
#define S_FALSE
Definition: winerror.h:2357

Referenced by InvokeCommand().

◆ DoRename()

HRESULT CDefaultContextMenu::DoRename ( LPCMINVOKECOMMANDINFOEX  lpcmi)
private

Definition at line 1041 of file CDefaultContextMenu.cpp.

1042{
1044 HRESULT hr;
1045
1046 if (!m_site || !m_cidl)
1047 return E_FAIL;
1048
1049 /* Get a pointer to the shell browser */
1052 return hr;
1053
1055 hr = psb->QueryActiveShellView(&lpSV);
1057 return hr;
1058
1059 SVSIF selFlags = SVSI_DESELECTOTHERS | SVSI_EDIT | SVSI_ENSUREVISIBLE | SVSI_FOCUSED | SVSI_SELECT;
1060 hr = lpSV->SelectItem(m_apidl[0], selFlags);
1062 return hr;
1063
1064 return S_OK;
1065}

Referenced by InvokeCommand().

◆ DoUndo()

HRESULT CDefaultContextMenu::DoUndo ( LPCMINVOKECOMMANDINFOEX  lpcmi)
private

Definition at line 1083 of file CDefaultContextMenu.cpp.

1084{
1085 ERR("TODO: Undo\n");
1086 return E_NOTIMPL;
1087}

Referenced by InvokeCommand().

◆ EnumerateDynamicContextHandlerForKey()

BOOL CDefaultContextMenu::EnumerateDynamicContextHandlerForKey ( HKEY  hRootKey)
private

Definition at line 471 of file CDefaultContextMenu.cpp.

472{
473 WCHAR wszName[MAX_PATH], wszBuf[MAX_PATH], *pwszClsid;
475 HRESULT hr;
476 HKEY hKey;
477
478 if (RegOpenKeyExW(hRootKey, L"shellex\\ContextMenuHandlers", 0, KEY_READ, &hKey) != ERROR_SUCCESS)
479 {
480 TRACE("RegOpenKeyExW failed\n");
481 return FALSE;
482 }
483
484 DWORD dwIndex = 0;
485 while (TRUE)
486 {
487 cchName = _countof(wszName);
488 if (RegEnumKeyExW(hKey, dwIndex++, wszName, &cchName, NULL, NULL, NULL, NULL) != ERROR_SUCCESS)
489 break;
490
491 /* Key name or key value is CLSID */
492 CLSID clsid;
493 hr = CLSIDFromString(wszName, &clsid);
494 if (hr == S_OK)
495 pwszClsid = wszName;
496 else
497 {
498 DWORD cchBuf = _countof(wszBuf);
499 if (RegGetValueW(hKey, wszName, NULL, RRF_RT_REG_SZ, NULL, wszBuf, &cchBuf) == ERROR_SUCCESS)
500 hr = CLSIDFromString(wszBuf, &clsid);
501 pwszClsid = wszBuf;
502 }
503
504 if (FAILED(hr))
505 {
506 ERR("CLSIDFromString failed for clsid %S hr 0x%x\n", pwszClsid, hr);
507 continue;
508 }
509
511 {
513 L"Software\\Microsoft\\Windows\\CurrentVersion\\Shell Extensions\\Approved",
514 pwszClsid,
516 NULL,
517 NULL,
519 {
520 ERR("Shell extension %s not approved!\n", pwszClsid);
521 continue;
522 }
523 }
524
526 if (FAILED(hr))
527 WARN("Failed to get context menu entires from shell extension! clsid: %S\n", pwszClsid);
528 }
529
531 return TRUE;
532}
#define WARN(fmt,...)
Definition: precomp.h:61
HRESULT LoadDynamicContextMenuHandler(HKEY hKey, REFCLSID clsid)
HRESULT WINAPI CLSIDFromString(LPCOLESTR idstr, LPCLSID id)
Definition: compobj.c:2338
REFCLSID clsid
Definition: msctf.c:82
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12

Referenced by QueryContextMenu().

◆ GetCommandString()

HRESULT WINAPI CDefaultContextMenu::GetCommandString ( UINT_PTR  idCommand,
UINT  uFlags,
UINT lpReserved,
LPSTR  lpszName,
UINT  uMaxNameLen 
)
override

Implements IContextMenu.

Definition at line 1624 of file CDefaultContextMenu.cpp.

1630{
1631 /* We don't handle the help text yet */
1632 if (uFlags == GCS_HELPTEXTA ||
1633 uFlags == GCS_HELPTEXTW ||
1634 HIWORD(idCommand) != 0)
1635 {
1636 return E_NOTIMPL;
1637 }
1638
1639 UINT CmdId = LOWORD(idCommand);
1640
1641 if (!m_DynamicEntries.IsEmpty() && CmdId >= m_iIdSHEFirst && CmdId < m_iIdSHELast)
1642 {
1643 idCommand -= m_iIdSHEFirst;
1645 if (!pEntry)
1646 return E_FAIL;
1647
1648 idCommand -= pEntry->iIdCmdFirst;
1649 return pEntry->pCM->GetCommandString(idCommand,
1650 uFlags,
1651 lpReserved,
1652 lpszName,
1653 uMaxNameLen);
1654 }
1655
1656 if (!m_StaticEntries.IsEmpty() && CmdId >= m_iIdSCMFirst && CmdId < m_iIdSCMLast)
1657 {
1658 /* Validation just returns S_OK on a match. The id exists. */
1659 if (uFlags == GCS_VALIDATEA || uFlags == GCS_VALIDATEW)
1660 return S_OK;
1661
1662 CmdId -= m_iIdSCMFirst;
1663
1664 POSITION it = m_StaticEntries.FindIndex(CmdId);
1665
1666 if (it == NULL)
1667 return E_INVALIDARG;
1668
1670
1671 if (uFlags == GCS_VERBW)
1672 return StringCchCopyW((LPWSTR)lpszName, uMaxNameLen, pEntry->Verb);
1673
1674 if (uFlags == GCS_VERBA)
1675 {
1676 if (SHUnicodeToAnsi(pEntry->Verb, lpszName, uMaxNameLen))
1677 return S_OK;
1678 }
1679
1680 return E_INVALIDARG;
1681 }
1682
1683 //FIXME: Should we handle callbacks here?
1684 if (m_iIdDfltFirst != m_iIdDfltLast && CmdId >= m_iIdDfltFirst && CmdId < m_iIdDfltLast)
1685 {
1686 CmdId -= m_iIdDfltFirst;
1687 /* See the definitions of IDM_CUT and co to see how this works */
1688 CmdId += DCM_FCIDM_SHVIEW_OFFSET;
1689 }
1690
1691 /* Loop looking for a matching Id */
1692 for (UINT i = 0; i < _countof(g_StaticInvokeCmdMap); i++)
1693 {
1694 if (g_StaticInvokeCmdMap[i].IntVerb == CmdId)
1695 {
1696 /* Validation just returns S_OK on a match */
1697 if (uFlags == GCS_VALIDATEA || uFlags == GCS_VALIDATEW)
1698 return S_OK;
1699
1700 /* Return a copy of the ANSI verb */
1701 if (uFlags == GCS_VERBA)
1702 return StringCchCopyA(lpszName, uMaxNameLen, g_StaticInvokeCmdMap[i].szStringVerb);
1703
1704 /* Convert the ANSI verb to unicode and return that */
1705 if (uFlags == GCS_VERBW)
1706 {
1707 if (SHAnsiToUnicode(g_StaticInvokeCmdMap[i].szStringVerb, (LPWSTR)lpszName, uMaxNameLen))
1708 return S_OK;
1709 }
1710 }
1711 }
1712
1713 return E_INVALIDARG;
1714}
static const struct _StaticInvokeCommandMap_ g_StaticInvokeCmdMap[]
#define DCM_FCIDM_SHVIEW_OFFSET
static DWORD const LPVOID const lpReserved
PDynamicShellEntry GetDynamicEntry(UINT idCmd)
#define E_INVALIDARG
Definition: ddrawi.h:101
INT WINAPI SHUnicodeToAnsi(LPCWSTR lpSrcStr, LPSTR lpDstStr, INT iLen)
Definition: string.c:2797
#define LOWORD(l)
Definition: pedump.c:82
STRSAFEAPI StringCchCopyW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:149
STRSAFEAPI StringCchCopyA(STRSAFE_LPSTR pszDest, size_t cchDest, STRSAFE_LPCSTR pszSrc)
Definition: strsafe.h:145
#define HIWORD(l)
Definition: typedefs.h:247

◆ GetDynamicEntry()

PDynamicShellEntry CDefaultContextMenu::GetDynamicEntry ( UINT  idCmd)
private

Definition at line 1185 of file CDefaultContextMenu.cpp.

1186{
1187 POSITION it = m_DynamicEntries.GetHeadPosition();
1188 while (it != NULL)
1189 {
1191
1192 if (idCmd >= info.iIdCmdFirst + info.NumIds)
1193 continue;
1194
1195 if (idCmd < info.iIdCmdFirst || idCmd > info.iIdCmdFirst + info.NumIds)
1196 return NULL;
1197
1198 return &info;
1199 }
1200
1201 return NULL;
1202}

Referenced by GetCommandString(), HandleMenuMsg2(), and InvokeShellExt().

◆ GetSite()

HRESULT WINAPI CDefaultContextMenu::GetSite ( REFIID  riid,
void **  ppvSite 
)
override

Definition at line 1811 of file CDefaultContextMenu.cpp.

1812{
1813 if (!m_site)
1814 return E_FAIL;
1815
1816 return m_site->QueryInterface(riid, ppvSite);
1817}
REFIID riid
Definition: atlbase.h:39

◆ HandleMenuMsg()

HRESULT WINAPI CDefaultContextMenu::HandleMenuMsg ( UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam 
)
override

Implements IContextMenu2.

Definition at line 1718 of file CDefaultContextMenu.cpp.

1722{
1723 /* FIXME: Should we implement this as well? */
1724 return S_OK;
1725}

◆ HandleMenuMsg2()

HRESULT WINAPI CDefaultContextMenu::HandleMenuMsg2 ( UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam,
LRESULT plResult 
)
override

Implements IContextMenu3.

Definition at line 1765 of file CDefaultContextMenu.cpp.

1770{
1771 if (uMsg == WM_INITMENUPOPUP)
1772 {
1773 POSITION it = m_DynamicEntries.GetHeadPosition();
1774 while (it != NULL)
1775 {
1777 SHForwardContextMenuMsg(info.pCM, uMsg, wParam, lParam, plResult, TRUE);
1778 }
1779 return S_OK;
1780 }
1781
1782 UINT CmdId;
1783 HRESULT hr = SHGetMenuIdFromMenuMsg(uMsg, lParam, &CmdId);
1784 if (FAILED(hr))
1785 return S_FALSE;
1786
1787 if (CmdId < m_iIdSHEFirst || CmdId >= m_iIdSHELast)
1788 return S_FALSE;
1789
1790 CmdId -= m_iIdSHEFirst;
1792 if (pEntry)
1793 {
1794 SHSetMenuIdInMenuMsg(uMsg, lParam, CmdId - pEntry->iIdCmdFirst);
1795 SHForwardContextMenuMsg(pEntry->pCM, uMsg, wParam, lParam, plResult, TRUE);
1796 }
1797
1798 return S_OK;
1799}
HRESULT SHSetMenuIdInMenuMsg(UINT uMsg, LPARAM lParam, UINT CmdId)
HRESULT SHGetMenuIdFromMenuMsg(UINT uMsg, LPARAM lParam, UINT *CmdId)
HRESULT WINAPI SHForwardContextMenuMsg(IUnknown *pUnk, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *pResult, BOOL useIContextMenu2)
Definition: rosordinal.c:11
#define WM_INITMENUPOPUP
Definition: winuser.h:1749

◆ Initialize()

HRESULT WINAPI CDefaultContextMenu::Initialize ( const DEFCONTEXTMENU pdcm,
LPFNDFMCALLBACK  lpfn 
)

Definition at line 279 of file CDefaultContextMenu.cpp.

280{
281 TRACE("cidl %u\n", pdcm->cidl);
282
283 if (!pdcm->pcmcb && !lpfn)
284 {
285 ERR("CDefaultContextMenu needs a callback!\n");
286 return E_INVALIDARG;
287 }
288
289 m_cidl = pdcm->cidl;
291 if (m_cidl && !m_apidl)
292 return E_OUTOFMEMORY;
293 m_psf = pdcm->psf;
294 m_pmcb = pdcm->pcmcb;
295 m_pfnmcb = lpfn;
296 m_hwnd = pdcm->hwnd;
297
298 m_cKeys = pdcm->cKeys;
299 if (pdcm->cKeys)
300 {
301 m_aKeys = (HKEY*)HeapAlloc(GetProcessHeap(), 0, sizeof(HKEY) * pdcm->cKeys);
302 if (!m_aKeys)
303 return E_OUTOFMEMORY;
304 memcpy(m_aKeys, pdcm->aKeys, sizeof(HKEY) * pdcm->cKeys);
305 }
306
307 m_psf->GetUIObjectOf(pdcm->hwnd, m_cidl, m_apidl, IID_NULL_PPV_ARG(IDataObject, &m_pDataObj));
308
309 if (pdcm->pidlFolder)
310 {
312 }
313 else
314 {
316 if (SUCCEEDED(m_psf->QueryInterface(IID_PPV_ARG(IPersistFolder2, &pf))))
317 {
318 if (FAILED(pf->GetCurFolder(&m_pidlFolder)))
319 ERR("GetCurFolder failed\n");
320 }
321 TRACE("pidlFolder %p\n", m_pidlFolder);
322 }
323
324 return S_OK;
325}
HANDLE HKEY
Definition: registry.h:26
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define HeapAlloc
Definition: compat.h:733
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
PITEMID_CHILD * _ILCopyaPidl(PCUITEMID_CHILD_ARRAY apidlsrc, UINT cidl)
Definition: pidl.c:2620
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
Definition: pidl.c:237
const PCUITEMID_CHILD * PCUITEMID_CHILD_ARRAY
Definition: shtypes.idl:71
IContextMenuCB * pcmcb
Definition: shlobj.h:2550
IShellFolder * psf
Definition: shlobj.h:2552
PCUITEMID_CHILD_ARRAY apidl
Definition: shlobj.h:2554
const HKEY * aKeys
Definition: shlobj.h:2557
PCIDLIST_ABSOLUTE pidlFolder
Definition: shlobj.h:2551

◆ InvokeCommand()

HRESULT WINAPI CDefaultContextMenu::InvokeCommand ( LPCMINVOKECOMMANDINFO  lpcmi)
override

Implements IContextMenu.

Definition at line 1513 of file CDefaultContextMenu.cpp.

1515{
1516 CMINVOKECOMMANDINFOEX LocalInvokeInfo = {};
1518 UINT CmdId;
1519
1520 /* Take a local copy of the fixed members of the
1521 struct as we might need to modify the verb */
1522 memcpy(&LocalInvokeInfo, lpcmi, min(sizeof(LocalInvokeInfo), lpcmi->cbSize));
1523
1524 /* Check if this is a string verb */
1525 if (!IS_INTRESOURCE(LocalInvokeInfo.lpVerb))
1526 {
1527 /* Get the ID which corresponds to this verb, and update our local copy */
1528 if (MapVerbToCmdId((LPVOID)LocalInvokeInfo.lpVerb, &CmdId, FALSE))
1529 LocalInvokeInfo.lpVerb = MAKEINTRESOURCEA(CmdId);
1530 else
1531 return E_INVALIDARG;
1532 }
1533
1534 CmdId = LOWORD(LocalInvokeInfo.lpVerb);
1535
1536 if (!m_DynamicEntries.IsEmpty() && CmdId >= m_iIdSHEFirst && CmdId < m_iIdSHELast)
1537 {
1538 LocalInvokeInfo.lpVerb -= m_iIdSHEFirst;
1539 Result = InvokeShellExt(&LocalInvokeInfo);
1540 return Result;
1541 }
1542
1543 if (!m_StaticEntries.IsEmpty() && CmdId >= m_iIdSCMFirst && CmdId < m_iIdSCMLast)
1544 {
1545 LocalInvokeInfo.lpVerb -= m_iIdSCMFirst;
1546 Result = InvokeRegVerb(&LocalInvokeInfo);
1547 // TODO: if (FAILED(Result) && !(lpcmi->fMask & CMIC_MASK_FLAG_NO_UI)) SHELL_ErrorBox(m_pSite, Result);
1548 return Result;
1549 }
1550
1551 if (m_iIdCBFirst != m_iIdCBLast && CmdId >= m_iIdCBFirst && CmdId < m_iIdCBLast)
1552 {
1553 Result = _DoInvokeCommandCallback(&LocalInvokeInfo, CmdId - m_iIdCBFirst);
1554 return Result;
1555 }
1556
1557 if (m_iIdDfltFirst != m_iIdDfltLast && CmdId >= m_iIdDfltFirst && CmdId < m_iIdDfltLast)
1558 {
1559 CmdId -= m_iIdDfltFirst;
1560 /* See the definitions of IDM_CUT and co to see how this works */
1561 CmdId += DCM_FCIDM_SHVIEW_OFFSET;
1562 }
1563
1564 if (LocalInvokeInfo.cbSize >= sizeof(CMINVOKECOMMANDINFOEX) && (LocalInvokeInfo.fMask & CMIC_MASK_PTINVOKE))
1565 {
1566 if (m_pDataObj && FAILED_UNEXPECTEDLY(DataObject_SetOffset(m_pDataObj, &LocalInvokeInfo.ptInvoke)))
1567 {
1568 ERR("Unable to add OFFSET to DataObject!\n");
1569 }
1570 }
1571
1572 /* Check if this is a Id */
1573 switch (CmdId)
1574 {
1576 Result = DoPaste(&LocalInvokeInfo, FALSE);
1577 break;
1579 Result = DoPaste(&LocalInvokeInfo, TRUE);
1580 break;
1581 case FCIDM_SHVIEW_OPEN:
1583 Result = DoOpenOrExplore(&LocalInvokeInfo);
1584 break;
1585 case FCIDM_SHVIEW_COPY:
1586 case FCIDM_SHVIEW_CUT:
1587 Result = DoCopyOrCut(&LocalInvokeInfo, CmdId == FCIDM_SHVIEW_COPY);
1588 break;
1590 Result = DoCreateLink(&LocalInvokeInfo);
1591 break;
1593 Result = DoDelete(&LocalInvokeInfo);
1594 break;
1596 Result = DoRename(&LocalInvokeInfo);
1597 break;
1599 Result = DoProperties(&LocalInvokeInfo);
1600 break;
1602 Result = DoCreateNewFolder(&LocalInvokeInfo);
1603 break;
1605 Result = DoCopyToMoveToFolder(&LocalInvokeInfo, TRUE);
1606 break;
1608 Result = DoCopyToMoveToFolder(&LocalInvokeInfo, FALSE);
1609 break;
1610 case FCIDM_SHVIEW_UNDO:
1611 Result = DoUndo(&LocalInvokeInfo);
1612 break;
1613 default:
1615 ERR("Unhandled Verb %xl\n", LOWORD(LocalInvokeInfo.lpVerb));
1616 break;
1617 }
1618
1619 return Result;
1620}
HRESULT InvokeRegVerb(LPCMINVOKECOMMANDINFOEX lpcmi)
HRESULT DoRename(LPCMINVOKECOMMANDINFOEX lpcmi)
BOOL MapVerbToCmdId(PVOID Verb, PUINT idCmd, BOOL IsUnicode)
HRESULT DoCreateLink(LPCMINVOKECOMMANDINFOEX lpcmi)
HRESULT DoUndo(LPCMINVOKECOMMANDINFOEX lpcmi)
HRESULT DoCopyOrCut(LPCMINVOKECOMMANDINFOEX lpcmi, BOOL bCopy)
HRESULT DoDelete(LPCMINVOKECOMMANDINFOEX lpcmi)
HRESULT DoCopyToMoveToFolder(LPCMINVOKECOMMANDINFOEX lpici, BOOL bCopy)
HRESULT DoProperties(LPCMINVOKECOMMANDINFOEX lpcmi)
HRESULT DoCreateNewFolder(LPCMINVOKECOMMANDINFOEX lpici)
HRESULT DoPaste(LPCMINVOKECOMMANDINFOEX lpcmi, BOOL bLink)
HRESULT DoOpenOrExplore(LPCMINVOKECOMMANDINFOEX lpcmi)
HRESULT InvokeShellExt(LPCMINVOKECOMMANDINFOEX lpcmi)
struct IContextMenu::tagCMInvokeCommandInfoEx CMINVOKECOMMANDINFOEX
#define min(a, b)
Definition: monoChain.cc:55
#define FCIDM_SHVIEW_CUT
Definition: shresdef.h:828
#define FCIDM_SHVIEW_OPEN
Definition: shresdef.h:855
#define FCIDM_SHVIEW_UNDO
Definition: shresdef.h:831
#define FCIDM_SHVIEW_COPY
Definition: shresdef.h:829
#define FCIDM_SHVIEW_INSERTLINK
Definition: shresdef.h:832
#define FCIDM_SHVIEW_NEWFOLDER
Definition: shresdef.h:851
#define FCIDM_SHVIEW_EXPLORE
Definition: shresdef.h:854
#define FCIDM_SHVIEW_PROPERTIES
Definition: shresdef.h:827
#define FCIDM_SHVIEW_COPYTO
Definition: shresdef.h:833
#define FCIDM_SHVIEW_MOVETO
Definition: shresdef.h:834
#define FCIDM_SHVIEW_DELETE
Definition: shresdef.h:826
#define FCIDM_SHVIEW_RENAME
Definition: shresdef.h:848
#define FCIDM_SHVIEW_CREATELINK
Definition: shresdef.h:849
#define FCIDM_SHVIEW_INSERT
Definition: shresdef.h:830
#define IS_INTRESOURCE(i)
Definition: winuser.h:580
#define MAKEINTRESOURCEA(i)
Definition: winuser.h:581
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:409

◆ InvokePidl()

HRESULT CDefaultContextMenu::InvokePidl ( LPCMINVOKECOMMANDINFOEX  lpcmi,
LPCITEMIDLIST  pidl,
PStaticShellEntry  pEntry 
)
private

Definition at line 1337 of file CDefaultContextMenu.cpp.

1338{
1339 const BOOL unicode = IsUnicode(*lpcmi);
1340
1341 LPITEMIDLIST pidlFull = ILCombine(m_pidlFolder, pidl);
1342 if (pidlFull == NULL)
1343 {
1344 return E_FAIL;
1345 }
1346
1347 WCHAR wszPath[MAX_PATH];
1348 BOOL bHasPath = SHGetPathFromIDListW(pidlFull, wszPath);
1349
1350 WCHAR wszDir[MAX_PATH];
1351
1352 SHELLEXECUTEINFOW sei = { sizeof(sei) };
1353 sei.fMask = SEE_MASK_CLASSKEY | SEE_MASK_IDLIST | (CmicFlagsToSeeFlags(lpcmi->fMask) & ~SEE_MASK_INVOKEIDLIST);
1354 sei.hwnd = lpcmi->hwnd;
1355 sei.nShow = lpcmi->nShow;
1356 sei.lpVerb = pEntry->Verb;
1357 sei.lpIDList = pidlFull;
1358 sei.hkeyClass = pEntry->hkClass;
1359 sei.dwHotKey = lpcmi->dwHotKey;
1360 sei.hIcon = lpcmi->hIcon;
1361 sei.lpDirectory = wszDir;
1362
1363 if (unicode && !StrIsNullOrEmpty(lpcmi->lpDirectoryW))
1364 {
1365 sei.lpDirectory = lpcmi->lpDirectoryW;
1366 }
1367 else if (bHasPath)
1368 {
1369 wcscpy(wszDir, wszPath);
1370 PathRemoveFileSpec(wszDir);
1371 }
1372 else
1373 {
1374 if (!SHGetPathFromIDListW(m_pidlFolder, wszDir))
1375 *wszDir = UNICODE_NULL;
1376 }
1377
1378 if (bHasPath)
1379 sei.lpFile = wszPath;
1380
1381 CComHeapPtr<WCHAR> pszParamsW;
1382 if (unicode && !StrIsNullOrEmpty(lpcmi->lpParametersW))
1383 sei.lpParameters = lpcmi->lpParametersW;
1384 else if (!StrIsNullOrEmpty(lpcmi->lpParameters) && __SHCloneStrAtoW(&pszParamsW, lpcmi->lpParameters))
1385 sei.lpParameters = pszParamsW;
1386
1387 if (!sei.lpClass && (lpcmi->fMask & (CMIC_MASK_HASLINKNAME | CMIC_MASK_HASTITLE)) && unicode)
1388 sei.lpClass = lpcmi->lpTitleW; // Forward .lnk path from CShellLink::DoOpen (for consrv STARTF_TITLEISLINKNAME)
1389
1390 ShellExecuteExW(&sei);
1391 ILFree(pidlFull);
1392
1393 return S_OK;
1394}
wcscpy
#define CmicFlagsToSeeFlags(flags)
Definition: precomp.h:187
void WINAPI ILFree(LPITEMIDLIST pidl)
Definition: pidl.c:1044
LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: pidl.c:816
static __inline LPWSTR __SHCloneStrAtoW(WCHAR **target, const char *source)
Definition: shell32_main.h:178
#define SEE_MASK_CLASSKEY
Definition: shellapi.h:26
#define SEE_MASK_IDLIST
Definition: shellapi.h:27
BOOL WINAPI DECLSPEC_HOTPATCH ShellExecuteExW(LPSHELLEXECUTEINFOW sei)
Definition: shlexec.cpp:2452
#define PathRemoveFileSpec
Definition: shlwapi.h:1061
LPCWSTR lpDirectory
Definition: shellapi.h:335
LPCWSTR lpParameters
Definition: shellapi.h:334

Referenced by InvokeRegVerb().

◆ InvokeRegVerb()

HRESULT CDefaultContextMenu::InvokeRegVerb ( LPCMINVOKECOMMANDINFOEX  lpcmi)
private

Definition at line 1397 of file CDefaultContextMenu.cpp.

1399{
1400 INT iCmd = LOWORD(lpcmi->lpVerb);
1401 HRESULT hr;
1402 UINT i;
1403
1404 POSITION it = m_StaticEntries.FindIndex(iCmd);
1405
1406 if (it == NULL)
1407 return E_INVALIDARG;
1408
1410
1411 CRegKey VerbKey;
1412 WCHAR VerbKeyPath[sizeof("shell\\") + MAX_VERB];
1413 hr = StringCbPrintfW(VerbKeyPath, sizeof(VerbKeyPath), L"shell\\%s", pEntry->Verb.GetString());
1414 if (SUCCEEDED(hr) && m_pDataObj &&
1415 VerbKey.Open(pEntry->hkClass, VerbKeyPath, KEY_READ) == ERROR_SUCCESS)
1416 {
1417 CLSID clsid;
1418
1419 DWORD KeyState = 0;
1420 if (lpcmi->fMask & CMIC_MASK_SHIFT_DOWN)
1421 KeyState |= MK_SHIFT;
1422 if (lpcmi->fMask & CMIC_MASK_CONTROL_DOWN)
1423 KeyState |= MK_CONTROL;
1424
1425 POINTL *pPtl = NULL;
1426 C_ASSERT(sizeof(POINT) == sizeof(POINTL));
1427 if (lpcmi->fMask & CMIC_MASK_PTINVOKE)
1428 pPtl = (POINTL*)&lpcmi->ptInvoke;
1429
1431 hr = SHELL_GetRegCLSID(VerbKey, L"command", L"DelegateExecute", clsid);
1432 if (SUCCEEDED(hr))
1433 hr = CoCreateInstance(clsid, NULL, CLSCTX_ALL, IID_PPV_ARG(IExecuteCommand, &pEC));
1434 if (SUCCEEDED(hr))
1435 {
1438 return InvokeIExecuteCommandWithDataObject(pEC, pEntry->Verb.GetString(), pPB, m_pDataObj,
1439 lpcmi, static_cast<IContextMenu*>(this));
1440 }
1441
1443 hr = SHELL_GetRegCLSID(VerbKey, L"DropTarget", L"CLSID", clsid);
1444 if (SUCCEEDED(hr))
1445 hr = CoCreateInstance(clsid, NULL, CLSCTX_ALL, IID_PPV_ARG(IDropTarget, &pDT));
1446 if (SUCCEEDED(hr))
1447 {
1450 IUnknown_SetSite(pDT, static_cast<IContextMenu*>(this));
1451 IUnknown_InitializeCommand(pDT, pEntry->Verb.GetString(), pPB);
1452 hr = SHSimulateDrop(pDT, m_pDataObj, KeyState, pPtl, NULL);
1453 IUnknown_SetSite(pDT, NULL);
1454 return hr;
1455 }
1456 }
1457
1458 /* Get the browse flags to see if we need to browse */
1460
1461 for (i=0; i < m_cidl; i++)
1462 {
1463 /* Check if we need to browse */
1464 if (wFlags)
1465 {
1466 hr = TryToBrowse(lpcmi, m_apidl[i], wFlags);
1467 if (SUCCEEDED(hr))
1468 {
1469 /* In WinXP if we have browsed, we don't open any more folders.
1470 * In Win7 we browse to the first folder we find and
1471 * open new windows for each of the rest of the folders */
1473 if (ntver >= _WIN32_WINNT_VISTA)
1474 wFlags = 0; // FIXME: = SBSP_NEWBROWSER | (wFlags & ~SBSP_SAMEBROWSER);
1475 else
1476 i = m_cidl;
1477
1478 continue;
1479 }
1480 }
1481
1482 InvokePidl(lpcmi, m_apidl[i], pEntry);
1483 }
1484
1485 return S_OK;
1486}
static HRESULT SHELL_GetRegCLSID(HKEY hKey, LPCWSTR SubKey, LPCWSTR Value, CLSID &clsid)
LONG Open(HKEY hKeyParent, LPCTSTR lpszKeyName, REGSAM samDesired=KEY_READ|KEY_WRITE) noexcept
Definition: atlbase.h:1173
DWORD BrowserFlagsFromVerb(LPCMINVOKECOMMANDINFOEX lpcmi, PStaticShellEntry pEntry)
HRESULT TryToBrowse(LPCMINVOKECOMMANDINFOEX lpcmi, LPCITEMIDLIST pidl, DWORD wFlags)
HRESULT InvokePidl(LPCMINVOKECOMMANDINFOEX lpcmi, LPCITEMIDLIST pidl, PStaticShellEntry pEntry)
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID iid, LPVOID *ppv)
Definition: compobj.c:3325
EXTERN_C HRESULT IUnknown_InitializeCommand(_In_ IUnknown *pUnk, _In_ PCWSTR pszCommandName, _In_opt_ IPropertyBag *pPB)
Definition: utils.cpp:1651
EXTERN_C HRESULT InvokeIExecuteCommandWithDataObject(_In_ IExecuteCommand *pEC, _In_ PCWSTR pszCommandName, _In_opt_ IPropertyBag *pPB, _In_ IDataObject *pDO, _In_opt_ LPCMINVOKECOMMANDINFOEX pICI, _In_opt_ IUnknown *pSite)
Definition: utils.cpp:1705
HRESULT WINAPI SHCreatePropertyBagOnRegKey(HKEY hKey, LPCWSTR subkey, DWORD grfMode, REFIID riid, void **ppv)
Definition: ordinal.c:5193
#define C_ASSERT(e)
Definition: intsafe.h:73
#define STGM_READ
Definition: objbase.h:917
int32_t INT
Definition: typedefs.h:58

Referenced by InvokeCommand().

◆ InvokeShellExt()

HRESULT CDefaultContextMenu::InvokeShellExt ( LPCMINVOKECOMMANDINFOEX  lpcmi)
private

Definition at line 1250 of file CDefaultContextMenu.cpp.

1252{
1253 TRACE("verb %p first %x last %x\n", lpcmi->lpVerb, m_iIdSHEFirst, m_iIdSHELast);
1254
1255 UINT idCmd = LOWORD(lpcmi->lpVerb);
1257 if (!pEntry)
1258 return E_FAIL;
1259
1260 /* invoke the dynamic context menu */
1261 lpcmi->lpVerb = MAKEINTRESOURCEA(idCmd - pEntry->iIdCmdFirst);
1262 return pEntry->pCM->InvokeCommand((LPCMINVOKECOMMANDINFO)lpcmi);
1263}

Referenced by InvokeCommand().

◆ IsShellExtensionAlreadyLoaded()

BOOL CDefaultContextMenu::IsShellExtensionAlreadyLoaded ( REFCLSID  clsid)
private

Definition at line 417 of file CDefaultContextMenu.cpp.

418{
419 POSITION it = m_DynamicEntries.GetHeadPosition();
420 while (it != NULL)
421 {
422 const DynamicShellEntry& info = m_DynamicEntries.GetNext(it);
423 if (info.ClassID == clsid)
424 return TRUE;
425 }
426
427 return FALSE;
428}

Referenced by LoadDynamicContextMenuHandler().

◆ LoadDynamicContextMenuHandler()

HRESULT CDefaultContextMenu::LoadDynamicContextMenuHandler ( HKEY  hKey,
REFCLSID  clsid 
)
private

Definition at line 431 of file CDefaultContextMenu.cpp.

432{
433 HRESULT hr;
434 TRACE("LoadDynamicContextMenuHandler entered with This %p hKey %p pclsid %s\n", this, hKey, wine_dbgstr_guid(&clsid));
435
437 return S_OK;
438
441 if (FAILED(hr))
442 {
443 ERR("SHCoCreateInstance(IContextMenu) failed.clsid %s hr 0x%x\n", wine_dbgstr_guid(&clsid), hr);
444 return hr;
445 }
446
447 CComPtr<IShellExtInit> pExtInit;
448 hr = pcm->QueryInterface(IID_PPV_ARG(IShellExtInit, &pExtInit));
449 if (FAILED(hr))
450 {
451 ERR("IContextMenu->QueryInterface(IShellExtInit) failed.clsid %s hr 0x%x\n", wine_dbgstr_guid(&clsid), hr);
452 return hr;
453 }
454
455 hr = pExtInit->Initialize(m_pDataObj ? NULL : m_pidlFolder, m_pDataObj, hKey);
456 if (FAILED(hr))
457 {
458 WARN("IShellExtInit::Initialize failed.clsid %s hr 0x%x\n", wine_dbgstr_guid(&clsid), hr);
459 return hr;
460 }
461
462 if (m_site)
464
465 m_DynamicEntries.AddTail({ 0, 0, clsid, pcm });
466
467 return S_OK;
468}
BOOL IsShellExtensionAlreadyLoaded(REFCLSID clsid)
static __inline const char * wine_dbgstr_guid(const GUID *id)
Definition: debug.h:197

Referenced by EnumerateDynamicContextHandlerForKey().

◆ MapVerbToCmdId()

BOOL CDefaultContextMenu::MapVerbToCmdId ( PVOID  Verb,
PUINT  idCmd,
BOOL  IsUnicode 
)
private

Definition at line 1205 of file CDefaultContextMenu.cpp.

1206{
1207 WCHAR UnicodeStr[MAX_VERB];
1208
1209 /* Loop through all the static verbs looking for a match */
1210 for (UINT i = 0; i < _countof(g_StaticInvokeCmdMap); i++)
1211 {
1212 /* We can match both ANSI and unicode strings */
1213 if (IsUnicode)
1214 {
1215 /* The static verbs are ANSI, get a unicode version before doing the compare */
1216 SHAnsiToUnicode(g_StaticInvokeCmdMap[i].szStringVerb, UnicodeStr, MAX_VERB);
1217 if (!_wcsicmp(UnicodeStr, (LPWSTR)Verb))
1218 {
1219 /* Return the Corresponding Id */
1220 *idCmd = g_StaticInvokeCmdMap[i].IntVerb;
1221 return TRUE;
1222 }
1223 }
1224 else
1225 {
1226 if (!_stricmp(g_StaticInvokeCmdMap[i].szStringVerb, (LPSTR)Verb))
1227 {
1228 *idCmd = g_StaticInvokeCmdMap[i].IntVerb;
1229 return TRUE;
1230 }
1231 }
1232 }
1233
1234 for (POSITION it = m_DynamicEntries.GetHeadPosition(); it != NULL;)
1235 {
1237 if (!entry.NumIds)
1238 continue;
1239 HRESULT hr = ::MapVerbToCmdId(Verb, IsUnicode, entry.pCM, 0, entry.NumIds - 1);
1240 if (SUCCEEDED(hr))
1241 {
1242 *idCmd = m_iIdSHEFirst + entry.iIdCmdFirst + hr;
1243 return TRUE;
1244 }
1245 }
1246 return FALSE;
1247}
#define _stricmp
Definition: cat.c:22
uint32_t entry
Definition: isohybrid.c:63
char * LPSTR
Definition: xmlstorage.h:182

Referenced by InvokeCommand(), and MapVerbToCmdId().

◆ QueryContextMenu()

HRESULT WINAPI CDefaultContextMenu::QueryContextMenu ( HMENU  hMenu,
UINT  indexMenu,
UINT  idCmdFirst,
UINT  idCmdLast,
UINT  uFlags 
)
override

Implements IContextMenu.

Definition at line 836 of file CDefaultContextMenu.cpp.

842{
843 HRESULT hr;
844 UINT idCmdNext = idCmdFirst;
845 UINT cIds = 0;
846
847 TRACE("BuildShellItemContextMenu entered\n");
848
849 /* Load static verbs and shell extensions from registry */
850 for (UINT i = 0; i < m_cKeys && !(uFlags & CMF_NOVERBS); i++)
851 {
854 }
855
856 /* Add static context menu handlers */
857 cIds = AddStaticContextMenusToMenu(hMenu, &IndexMenu, idCmdFirst, idCmdLast, uFlags);
858 m_iIdSCMFirst = 0; // FIXME: This should be = idCmdFirst?
859 m_iIdSCMLast = cIds;
860 idCmdNext = idCmdFirst + cIds;
861
862 /* Add dynamic context menu handlers */
863 cIds += AddShellExtensionsToMenu(hMenu, &IndexMenu, idCmdNext, idCmdLast, uFlags);
865 m_iIdSHELast = cIds;
866 idCmdNext = idCmdFirst + cIds;
867 TRACE("SH_LoadContextMenuHandlers first %x last %x\n", m_iIdSHEFirst, m_iIdSHELast);
868
869 /* Now let the callback add its own items */
870 QCMINFO qcminfo = {hMenu, IndexMenu, idCmdNext, idCmdLast, NULL};
872 {
873 UINT added = qcminfo.idCmdFirst - idCmdNext;
874 cIds += added;
875 IndexMenu += added;
877 m_iIdCBLast = cIds;
878 idCmdNext = idCmdFirst + cIds;
879 }
880
881 //TODO: DFM_MERGECONTEXTMENU_BOTTOM
882
883 UINT idDefaultOffset = 0;
884 BOOL isBackgroundMenu = !m_cidl;
885 if (!(uFlags & CMF_VERBSONLY) && !isBackgroundMenu)
886 {
887 /* Get the attributes of the items */
888 SFGAOF rfg = SFGAO_BROWSABLE | SFGAO_CANCOPY | SFGAO_CANLINK | SFGAO_CANMOVE | SFGAO_CANDELETE | SFGAO_CANRENAME | SFGAO_HASPROPSHEET | SFGAO_FILESYSTEM | SFGAO_FOLDER;
889 hr = m_psf->GetAttributesOf(m_cidl, m_apidl, &rfg);
891 return MAKE_HRESULT(SEVERITY_SUCCESS, 0, cIds);
892
893 /* Add the default part of the menu */
894 HMENU hmenuDefault = LoadMenuW(_AtlBaseModule.GetResourceInstance(), L"MENU_SHV_FILE");
895
896 /* Remove uneeded entries */
897 if (!(rfg & SFGAO_CANMOVE))
898 DeleteMenu(hmenuDefault, IDM_CUT, MF_BYCOMMAND);
899 if (!(rfg & SFGAO_CANCOPY))
900 DeleteMenu(hmenuDefault, IDM_COPY, MF_BYCOMMAND);
901 if (!((rfg & SFGAO_FILESYSTEM) && HasClipboardData()))
902 DeleteMenu(hmenuDefault, IDM_INSERT, MF_BYCOMMAND);
903 if (!(rfg & SFGAO_CANLINK))
904 DeleteMenu(hmenuDefault, IDM_CREATELINK, MF_BYCOMMAND);
905 if (!(rfg & SFGAO_CANDELETE))
906 DeleteMenu(hmenuDefault, IDM_DELETE, MF_BYCOMMAND);
907 if (!(rfg & SFGAO_CANRENAME) || !(uFlags & CMF_CANRENAME))
908 DeleteMenu(hmenuDefault, IDM_RENAME, MF_BYCOMMAND);
909 if (!(rfg & SFGAO_HASPROPSHEET))
910 DeleteMenu(hmenuDefault, IDM_PROPERTIES, MF_BYCOMMAND);
911
912 idDefaultOffset = idCmdNext;
913 UINT idMax = Shell_MergeMenus(hMenu, GetSubMenu(hmenuDefault, 0), IndexMenu, idCmdNext, idCmdLast, 0);
914 m_iIdDfltFirst = cIds;
915 cIds += idMax - idCmdNext;
916 m_iIdDfltLast = cIds;
917
918 DestroyMenu(hmenuDefault);
919 }
920
921 TryPickDefault(hMenu, idCmdFirst, idDefaultOffset, uFlags);
922
923 // TODO: DFM_MERGECONTEXTMENU_TOP
924
925 return MAKE_HRESULT(SEVERITY_SUCCESS, 0, cIds);
926}
static BOOL HasClipboardData()
#define IDM_PROPERTIES
Definition: resources.h:9
UINT AddShellExtensionsToMenu(HMENU hMenu, UINT *pIndexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags)
UINT AddStaticContextMenusToMenu(HMENU hMenu, UINT *IndexMenu, UINT iIdCmdFirst, UINT iIdCmdLast, UINT uFlags)
BOOL EnumerateDynamicContextHandlerForKey(HKEY hRootKey)
void TryPickDefault(HMENU hMenu, UINT idCmdFirst, UINT DfltOffset, UINT uFlags)
void AddStaticEntriesForKey(HKEY hKey, UINT uFlags)
#define DFM_MERGECONTEXTMENU
Definition: precomp.h:44
#define MAKE_HRESULT(sev, fac, code)
Definition: dmerror.h:30
static IShellFolder IShellItem **static IBindCtx LPITEMIDLIST SFGAOF
Definition: ebrowser.c:83
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:63
UINT WINAPI Shell_MergeMenus(HMENU hmDst, HMENU hmSrc, UINT uInsert, UINT uIDAdjust, UINT uIDAdjustMax, ULONG uFlags)
Definition: shlmenu.c:856
#define IDM_DELETE
Definition: shresdef.h:868
#define IDM_INSERT
Definition: shresdef.h:866
#define IDM_RENAME
Definition: shresdef.h:869
#define IDM_COPY
Definition: shresdef.h:865
#define IDM_CUT
Definition: shresdef.h:864
#define IDM_CREATELINK
Definition: shresdef.h:867
UINT idCmdFirst
Definition: shlobj.h:1392
#define SEVERITY_SUCCESS
Definition: winerror.h:64
#define MF_BYCOMMAND
Definition: winuser.h:202
BOOL WINAPI DeleteMenu(_In_ HMENU, _In_ UINT, _In_ UINT)
HMENU WINAPI GetSubMenu(_In_ HMENU, _In_ int)
BOOL WINAPI DestroyMenu(_In_ HMENU)
HMENU WINAPI LoadMenuW(_In_opt_ HINSTANCE, _In_ LPCWSTR)

◆ QueryService()

virtual HRESULT STDMETHODCALLTYPE CDefaultContextMenu::QueryService ( REFGUID  svc,
REFIID  riid,
void **  ppv 
)
inlinevirtual

Implements IServiceProvider.

Definition at line 222 of file CDefaultContextMenu.cpp.

223 {
224 return IUnknown_QueryService(m_site, svc, riid, ppv);
225 }
REFIID LPVOID * ppv
Definition: atlbase.h:39

◆ SetSite()

HRESULT WINAPI CDefaultContextMenu::SetSite ( IUnknown pUnkSite)
override

Implements IObjectWithSite.

Definition at line 1803 of file CDefaultContextMenu.cpp.

1804{
1805 m_site = pUnkSite;
1806 return S_OK;
1807}

◆ TryPickDefault()

void CDefaultContextMenu::TryPickDefault ( HMENU  hMenu,
UINT  idCmdFirst,
UINT  DfltOffset,
UINT  uFlags 
)
private

Definition at line 800 of file CDefaultContextMenu.cpp.

801{
802 // Are we allowed to pick a default?
803 if ((uFlags & CMF_NODEFAULT) ||
804 ((uFlags & CMF_DONOTPICKDEFAULT) && RosGetProcessEffectiveVersion() >= _WIN32_WINNT_WIN7))
805 {
806 return;
807 }
808
809 // Do we already have a default?
810 if ((int)GetMenuDefaultItem(hMenu, MF_BYPOSITION, 0) != -1)
811 return;
812
813 // Does the view want to pick one?
814 INT_PTR forceDfm = 0;
815 if (SUCCEEDED(_DoCallback(DFM_GETDEFSTATICID, 0, &forceDfm)) && forceDfm)
816 {
817 for (UINT i = 0; i < _countof(g_StaticInvokeCmdMap); ++i)
818 {
819 UINT menuItemId = g_StaticInvokeCmdMap[i].IntVerb + DfltOffset - DCM_FCIDM_SHVIEW_OFFSET;
820 if (g_StaticInvokeCmdMap[i].DfmCmd == forceDfm &&
821 SetMenuDefaultItem(hMenu, menuItemId, MF_BYCOMMAND))
822 {
823 return;
824 }
825 }
826 }
827
828 // Don't want to pick something like cut or delete as the default but
829 // a static or dynamic verb is a good default.
831 SetMenuDefaultItem(hMenu, idCmdFirst, MF_BYCOMMAND);
832}
#define DFM_GETDEFSTATICID
Definition: precomp.h:47
int32_t INT_PTR
Definition: typedefs.h:64
UINT WINAPI GetMenuDefaultItem(_In_ HMENU hMenu, _In_ UINT fByPos, _In_ UINT gmdiFlags)
BOOL WINAPI SetMenuDefaultItem(_In_ HMENU, _In_ UINT, _In_ UINT)
#define MF_BYPOSITION
Definition: winuser.h:203

Referenced by QueryContextMenu().

◆ TryToBrowse()

HRESULT CDefaultContextMenu::TryToBrowse ( LPCMINVOKECOMMANDINFOEX  lpcmi,
LPCITEMIDLIST  pidl,
DWORD  wFlags 
)
private

Definition at line 1312 of file CDefaultContextMenu.cpp.

1314{
1316 HRESULT hr;
1317
1318 if (!m_site)
1319 return E_FAIL;
1320
1321 /* Get a pointer to the shell browser */
1323 if (FAILED(hr))
1324 return hr;
1325
1326 PIDLIST_ABSOLUTE pidl;
1327 hr = SHILCombine(m_pidlFolder, pidlChild, &pidl);
1329 return hr;
1330
1331 hr = psb->BrowseObject(pidl, wFlags & ~SBSP_RELATIVE);
1332 ILFree(pidl);
1333 return hr;
1334}

Referenced by InvokeRegVerb().

Member Data Documentation

◆ m_aKeys

HKEY* CDefaultContextMenu::m_aKeys
private

Definition at line 156 of file CDefaultContextMenu.cpp.

Referenced by Initialize(), QueryContextMenu(), and ~CDefaultContextMenu().

◆ m_apidl

PCUITEMID_CHILD_ARRAY CDefaultContextMenu::m_apidl
private

◆ m_bGroupPolicyActive

DWORD CDefaultContextMenu::m_bGroupPolicyActive
private

Definition at line 159 of file CDefaultContextMenu.cpp.

Referenced by EnumerateDynamicContextHandlerForKey().

◆ m_cidl

UINT CDefaultContextMenu::m_cidl
private

◆ m_cKeys

UINT CDefaultContextMenu::m_cKeys
private

Definition at line 157 of file CDefaultContextMenu.cpp.

Referenced by Initialize(), QueryContextMenu(), and ~CDefaultContextMenu().

◆ m_DefVerbs

WCHAR CDefaultContextMenu::m_DefVerbs[MAX_PATH]
private

◆ m_DynamicEntries

◆ m_hwnd

HWND CDefaultContextMenu::m_hwnd
private

Definition at line 170 of file CDefaultContextMenu.cpp.

Referenced by _DoCallback(), and Initialize().

◆ m_iIdCBFirst

UINT CDefaultContextMenu::m_iIdCBFirst
private

Definition at line 166 of file CDefaultContextMenu.cpp.

Referenced by InvokeCommand(), and QueryContextMenu().

◆ m_iIdCBLast

UINT CDefaultContextMenu::m_iIdCBLast
private

Definition at line 167 of file CDefaultContextMenu.cpp.

Referenced by InvokeCommand(), and QueryContextMenu().

◆ m_iIdDfltFirst

UINT CDefaultContextMenu::m_iIdDfltFirst
private

Definition at line 168 of file CDefaultContextMenu.cpp.

Referenced by GetCommandString(), InvokeCommand(), and QueryContextMenu().

◆ m_iIdDfltLast

UINT CDefaultContextMenu::m_iIdDfltLast
private

◆ m_iIdSCMFirst

UINT CDefaultContextMenu::m_iIdSCMFirst
private

◆ m_iIdSCMLast

UINT CDefaultContextMenu::m_iIdSCMLast
private

◆ m_iIdSHEFirst

UINT CDefaultContextMenu::m_iIdSHEFirst
private

◆ m_iIdSHELast

UINT CDefaultContextMenu::m_iIdSHELast
private

◆ m_pDataObj

◆ m_pfnmcb

LPFNDFMCALLBACK CDefaultContextMenu::m_pfnmcb
private

Definition at line 152 of file CDefaultContextMenu.cpp.

Referenced by _DoCallback(), and Initialize().

◆ m_pidlFolder

◆ m_pmcb

CComPtr<IContextMenuCB> CDefaultContextMenu::m_pmcb
private

Definition at line 151 of file CDefaultContextMenu.cpp.

Referenced by _DoCallback(), and Initialize().

◆ m_psf

CComPtr<IShellFolder> CDefaultContextMenu::m_psf
private

◆ m_site

◆ m_StaticEntries


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