ReactOS 0.4.16-dev-1142-g8029339
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
 
STDMETHOD() QueryService (REFGUID svc, REFIID riid, void **ppv) 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 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
 
UINT m_iIdQCMFirst
 
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 237 of file CDefaultContextMenu.cpp.

237 :
238 m_psf(NULL),
239 m_pmcb(NULL),
240 m_pfnmcb(NULL),
241 m_cidl(0),
242 m_apidl(NULL),
244 m_aKeys(NULL),
245 m_cKeys(NULL),
248 m_iIdQCMFirst(0),
249 m_iIdSHEFirst(0),
250 m_iIdSHELast(0),
251 m_iIdSCMFirst(0),
252 m_iIdSCMLast(0),
253 m_iIdCBFirst(0),
254 m_iIdCBLast(0),
256 m_iIdDfltLast(0),
257 m_hwnd(NULL)
258{
260}
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 262 of file CDefaultContextMenu.cpp.

263{
264 for (POSITION it = m_DynamicEntries.GetHeadPosition(); it != NULL;)
265 {
266 const DynamicShellEntry& info = m_DynamicEntries.GetNext(it);
267 IUnknown_SetSite(info.pCM.p, NULL);
268 }
269 m_DynamicEntries.RemoveAll();
270 m_StaticEntries.RemoveAll();
271
272 for (UINT i = 0; i < m_cKeys; i++)
275
276 if (m_pidlFolder)
278 _ILFreeaPidl(const_cast<PITEMID_CHILD *>(m_apidl), m_cidl);
279}
#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:2607

Member Function Documentation

◆ _DoCallback()

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

Definition at line 329 of file CDefaultContextMenu.cpp.

330{
331 if (m_pmcb)
332 {
333 return m_pmcb->CallBack(m_psf, m_hwnd, m_pDataObj, uMsg, wParam, (LPARAM)lParam);
334 }
335 else if(m_pfnmcb)
336 {
338 }
339
340 return E_FAIL;
341}
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 1497 of file CDefaultContextMenu.cpp.

1499{
1500 BOOL Unicode = IsUnicode(*lpcmi);
1501 WCHAR lParamBuf[MAX_PATH];
1502 LPARAM lParam = 0;
1503
1504 if (Unicode && lpcmi->lpParametersW)
1505 lParam = (LPARAM)lpcmi->lpParametersW;
1506 else if (lpcmi->lpParameters)
1507 lParam = SHAnsiToUnicode(lpcmi->lpParameters, lParamBuf, _countof(lParamBuf)) ? (LPARAM)lParamBuf : 0;
1508
1509 HRESULT hr;
1510#if 0 // TODO: Try DFM_INVOKECOMMANDEX first.
1511 DFMICS dfmics = { sizeof(DFMICS), lpcmi->fMask, lParam, m_iIdSCMFirst?, m_iIdDfltLast?, (LPCMINVOKECOMMANDINFO)lpcmi, m_site };
1512 hr = _DoCallback(DFM_INVOKECOMMANDEX, CmdId, &dfmics);
1513 if (hr == E_NOTIMPL)
1514#endif
1515 hr = _DoCallback(DFM_INVOKECOMMAND, CmdId, (void*)lParam);
1516 return hr;
1517}
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 537 of file CDefaultContextMenu.cpp.

538{
539 UINT cIds = 0;
540
541 if (m_DynamicEntries.IsEmpty())
542 return cIds;
543
544 POSITION it = m_DynamicEntries.GetHeadPosition();
545 while (it != NULL)
546 {
548
549 HRESULT hr = info.pCM->QueryContextMenu(hMenu, *pIndexMenu, idCmdFirst + cIds, idCmdLast, uFlags);
550 if (SUCCEEDED(hr))
551 {
552 info.iIdCmdFirst = cIds;
553 info.NumIds = HRESULT_CODE(hr);
554 (*pIndexMenu) += info.NumIds;
555
556 cIds += info.NumIds;
557 if (idCmdFirst + cIds >= idCmdLast)
558 break;
559 }
560 TRACE("pEntry hr %x contextmenu %p cmdfirst %x num ids %x\n", hr, info.pCM.p, info.iIdCmdFirst, info.NumIds);
561 }
562 return cIds;
563}
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 566 of file CDefaultContextMenu.cpp.

572{
574 MENUITEMINFOW mii = { sizeof(mii) };
575 UINT idResource;
576 WCHAR wszDispVerb[80]; // The limit on XP. If the friendly string is longer, it falls back to the verb key.
577 UINT fState;
578 UINT cIds = 0, indexFirst = *pIndexMenu, indexDefault;
579 int iDefVerbIndex = -1;
580
582 mii.fType = MFT_STRING;
583
584 POSITION it = m_StaticEntries.GetHeadPosition();
585 bool first = true;
586 while (it != NULL)
587 {
589 BOOL forceFirstPos = FALSE;
590
591 fState = MFS_ENABLED;
592
593 /* set first entry as default */
594 if (first)
595 {
596 fState |= MFS_DEFAULT;
597 first = false;
598 }
599
600 if (info.Verb.CompareNoCase(L"open") == 0)
601 {
602 idResource = IDS_OPEN_VERB;
603 fState |= MFS_DEFAULT; /* override default when open verb is found */
604 forceFirstPos++;
605 }
606 else if (info.Verb.CompareNoCase(L"explore") == 0)
607 {
608 idResource = IDS_EXPLORE_VERB;
609 if (uFlags & CMF_EXPLORE)
610 {
611 fState |= MFS_DEFAULT;
612 forceFirstPos++;
613 }
614 }
615 else if (info.Verb.CompareNoCase(L"runas") == 0)
616 idResource = IDS_RUNAS_VERB;
617 else if (info.Verb.CompareNoCase(L"edit") == 0)
618 idResource = IDS_EDIT_VERB;
619 else if (info.Verb.CompareNoCase(L"find") == 0)
620 idResource = IDS_FIND_VERB;
621 else if (info.Verb.CompareNoCase(L"print") == 0)
622 idResource = IDS_PRINT_VERB;
623 else if (info.Verb.CompareNoCase(L"printto") == 0)
624 continue;
625 else
626 idResource = 0;
627
628 /* By default use verb for menu item name */
629 mii.dwTypeData = (LPWSTR)info.Verb.GetString();
630
631 WCHAR wszKey[sizeof("shell\\") + MAX_VERB];
632 HRESULT hr;
633 hr = StringCbPrintfW(wszKey, sizeof(wszKey), L"shell\\%s", info.Verb.GetString());
635 {
636 continue;
637 }
638
639 UINT cmdFlags = 0;
640 bool hide = false;
641 HKEY hkVerb;
642 if (idResource > 0)
643 {
644 if (!(uFlags & CMF_OPTIMIZEFORINVOKE))
645 {
646 if (LoadStringW(shell32_hInstance, idResource, wszDispVerb, _countof(wszDispVerb)))
647 mii.dwTypeData = wszDispVerb; /* use translated verb */
648 else
649 ERR("Failed to load string\n");
650 }
651
652 if (RegOpenKeyW(info.hkClass, wszKey, &hkVerb) != ERROR_SUCCESS)
653 hkVerb = NULL;
654 }
655 else
656 {
657 if (RegOpenKeyW(info.hkClass, wszKey, &hkVerb) == ERROR_SUCCESS)
658 {
659 if (!(uFlags & CMF_OPTIMIZEFORINVOKE))
660 {
661 DWORD cbVerb = sizeof(wszDispVerb);
662 LONG res = RegLoadMUIStringW(hkVerb, L"MUIVerb", wszDispVerb, cbVerb, NULL, 0, NULL);
663 if (res || !*wszDispVerb)
664 res = RegLoadMUIStringW(hkVerb, NULL, wszDispVerb, cbVerb, NULL, 0, NULL);
665
666 if (res == ERROR_SUCCESS && *wszDispVerb)
667 {
668 /* use description for the menu entry */
669 mii.dwTypeData = wszDispVerb;
670 }
671 }
672 }
673 else
674 {
675 hkVerb = NULL;
676 }
677 }
678
679 if (hkVerb)
680 {
681 if (!(uFlags & CMF_EXTENDEDVERBS))
682 hide = RegValueExists(hkVerb, L"Extended");
683
684 if (!hide)
685 hide = RegValueExists(hkVerb, L"ProgrammaticAccessOnly");
686
687 if (!hide && !(uFlags & CMF_DISABLEDVERBS))
688 hide = RegValueExists(hkVerb, L"LegacyDisable");
689
690 if (RegValueExists(hkVerb, L"NeverDefault"))
691 fState &= ~MFS_DEFAULT;
692
693 if (RegValueExists(hkVerb, L"SeparatorBefore"))
694 cmdFlags |= ECF_SEPARATORBEFORE;
695 if (RegValueExists(hkVerb, L"SeparatorAfter"))
696 cmdFlags |= ECF_SEPARATORAFTER;
697
698 RegCloseKey(hkVerb);
699 }
700
701 if (((uFlags & CMF_NODEFAULT) && ntver >= _WIN32_WINNT_VISTA) ||
702 ((uFlags & CMF_DONOTPICKDEFAULT) && ntver >= _WIN32_WINNT_WIN7))
703 {
704 fState &= ~MFS_DEFAULT;
705 }
706
707 if (!hide)
708 {
709 if (cmdFlags & ECF_SEPARATORBEFORE)
710 {
711 if (InsertMenuItemAt(hMenu, *pIndexMenu, MF_SEPARATOR))
712 (*pIndexMenu)++;
713 }
714
715 UINT pos = *pIndexMenu;
716 int verbIndex = hkVerb ? FindVerbInDefaultVerbList(m_DefVerbs, info.Verb) : -1;
717 if (verbIndex >= 0)
718 {
719 if (verbIndex < iDefVerbIndex || iDefVerbIndex < 0)
720 {
721 iDefVerbIndex = verbIndex;
722 fState |= MFS_DEFAULT;
723 forceFirstPos = TRUE;
724 }
725 else
726 {
727 fState &= ~MFS_DEFAULT; // We have already set a better default
728 pos = indexDefault;
729 }
730 }
731 else if (iDefVerbIndex >= 0)
732 {
733 fState &= ~MFS_DEFAULT; // We have already set the default
734 if (forceFirstPos)
735 pos = indexDefault;
736 forceFirstPos = FALSE;
737 }
738
739 mii.fState = fState;
740 mii.wID = iIdCmdFirst + cIds;
741 if (InsertMenuItemW(hMenu, forceFirstPos ? indexFirst : pos, TRUE, &mii))
742 (*pIndexMenu)++;
743
744 if (cmdFlags & ECF_SEPARATORAFTER)
745 {
746 if (InsertMenuItemAt(hMenu, *pIndexMenu, MF_SEPARATOR))
747 (*pIndexMenu)++;
748 }
749
750 if (fState & MFS_DEFAULT)
751 indexDefault = *pIndexMenu; // This is where we want to insert "high priority" verbs
752 }
753 cIds++; // Always increment the id because it acts as the index into m_StaticEntries
754
755 if (mii.wID >= iIdCmdLast)
756 break;
757 }
758
759 return cIds;
760}
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:68
static BOOL RegValueExists(HKEY hKey, LPCWSTR Name)
Definition: utils.h:43
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:3280
#define MIIM_ID
Definition: winuser.h:733
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:732
#define MFS_DEFAULT
Definition: winuser.h:759
#define MF_SEPARATOR
Definition: winuser.h:137
#define MFS_ENABLED
Definition: winuser.h:761
#define MFT_STRING
Definition: winuser.h:757
#define MIIM_DATA
Definition: winuser.h:737
#define MIIM_TYPE
Definition: winuser.h:736
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 369 of file CDefaultContextMenu.cpp.

370{
371 WCHAR wszName[VERBKEY_CCHMAX];
372 DWORD cchName, dwIndex = 0;
373 HKEY hShellKey;
374
375 LRESULT lres = RegOpenKeyExW(hKey, L"shell", 0, KEY_READ, &hShellKey);
376 if (lres != STATUS_SUCCESS)
377 return;
378
379 if (!*m_DefVerbs)
380 {
381 DWORD cb = sizeof(m_DefVerbs);
383 }
384
385 while(TRUE)
386 {
387 cchName = _countof(wszName);
388 if (RegEnumKeyExW(hShellKey, dwIndex++, wszName, &cchName, NULL, NULL, NULL, NULL) != ERROR_SUCCESS)
389 break;
390
391 AddStaticEntry(hKey, wszName, uFlags);
392 }
393
394 RegCloseKey(hShellKey);
395}
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:130
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:2798
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 343 of file CDefaultContextMenu.cpp.

344{
345 POSITION it = m_StaticEntries.GetHeadPosition();
346 while (it != NULL)
347 {
348 const StaticShellEntry& info = m_StaticEntries.GetNext(it);
349 if (info.Verb.CompareNoCase(szVerb) == 0)
350 {
351 /* entry already exists */
352 return;
353 }
354 }
355
356 TRACE("adding verb %s\n", debugstr_w(szVerb));
357
358 if (!_wcsicmp(szVerb, L"open") && !(uFlags & CMF_NODEFAULT))
359 {
360 /* open verb is always inserted in front */
361 m_StaticEntries.AddHead({ szVerb, hkeyClass });
362 }
363 else
364 {
365 m_StaticEntries.AddTail({ szVerb, hkeyClass });
366 }
367}
#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 1274 of file CDefaultContextMenu.cpp.

1275{
1277 HWND hwndTree;
1278 LPCWSTR FlagsName;
1279 WCHAR wszKey[sizeof("shell\\") + MAX_VERB];
1280 HRESULT hr;
1281 DWORD wFlags;
1282 DWORD cbVerb;
1283
1284 if (!m_site)
1285 return 0;
1286
1287 /* Get a pointer to the shell browser */
1289 if (FAILED(hr))
1290 return 0;
1291
1292 /* See if we are in Explore or Browse mode. If the browser's tree is present, we are in Explore mode.*/
1293 if (SUCCEEDED(psb->GetControlWindow(FCW_TREE, &hwndTree)) && hwndTree)
1294 FlagsName = L"ExplorerFlags";
1295 else
1296 FlagsName = L"BrowserFlags";
1297
1299 if (SUCCEEDED(psb->QueryInterface(IID_PPV_ARG(ICommDlgBrowser, &pcdb))))
1300 {
1301 if (LOBYTE(GetVersion()) < 6 || FlagsName[0] == 'E')
1302 return 0; // Don't browse in-place
1303 }
1304
1305 /* Try to get the flag from the verb */
1306 hr = StringCbPrintfW(wszKey, sizeof(wszKey), L"shell\\%s", pEntry->Verb.GetString());
1308 return 0;
1309
1310 cbVerb = sizeof(wFlags);
1311 if (RegGetValueW(pEntry->hkClass, wszKey, FlagsName, RRF_RT_REG_DWORD, NULL, &wFlags, &cbVerb) == ERROR_SUCCESS)
1312 {
1313 return wFlags;
1314 }
1315
1316 return 0;
1317}
#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 1020 of file CDefaultContextMenu.cpp.

1021{
1022 if (!m_cidl || !m_pDataObj)
1023 return E_FAIL;
1024
1025 FORMATETC formatetc;
1027 STGMEDIUM medium = {0};
1028 medium.tymed = TYMED_HGLOBAL;
1029 medium.hGlobal = GlobalAlloc(GHND, sizeof(DWORD));
1030 DWORD* pdwFlag = (DWORD*)GlobalLock(medium.hGlobal);
1031 if (pdwFlag)
1032 *pdwFlag = bCopy ? DROPEFFECT_COPY : DROPEFFECT_MOVE;
1033 GlobalUnlock(medium.hGlobal);
1034 m_pDataObj->SetData(&formatetc, &medium, TRUE);
1035
1037 if (SUCCEEDED(IUnknown_QueryService(m_site, SID_SFolderView, IID_PPV_ARG(IShellFolderView, &psfv))))
1038 psfv->SetPoints(m_pDataObj);
1039
1042 return hr;
1043
1044 if (psfv)
1045 psfv->SetClipboard(!bCopy);
1046 return S_OK;
1047}
HRESULT WINAPI OleSetClipboard(IDataObject *data)
Definition: clipboard.c:2199
#define InitFormatEtc(fe, cf, med)
Definition: editor.h:33
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:568
#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 1098 of file CDefaultContextMenu.cpp.

1099{
1100 HRESULT hr = E_FAIL;
1101 if (!m_pDataObj)
1102 {
1103 ERR("m_pDataObj is NULL\n");
1104 return hr;
1105 }
1106
1107 CComPtr<IContextMenu> pContextMenu;
1108 if (bCopy)
1109 hr = SHCoCreateInstance(NULL, &CLSID_CopyToMenu, NULL,
1110 IID_PPV_ARG(IContextMenu, &pContextMenu));
1111 else
1112 hr = SHCoCreateInstance(NULL, &CLSID_MoveToMenu, NULL,
1113 IID_PPV_ARG(IContextMenu, &pContextMenu));
1115 return hr;
1116
1118 hr = pContextMenu->QueryInterface(IID_PPV_ARG(IShellExtInit, &pInit));
1120 return hr;
1121
1122 hr = pInit->Initialize(m_pidlFolder, m_pDataObj, NULL);
1124 return hr;
1125
1126 if (bCopy)
1127 lpici->lpVerb = "copyto";
1128 else
1129 lpici->lpVerb = "moveto";
1130
1131 return pContextMenu->InvokeCommand((LPCMINVOKECOMMANDINFO)lpici);
1132}
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 989 of file CDefaultContextMenu.cpp.

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

Referenced by InvokeCommand().

◆ DoCreateNewFolder()

HRESULT CDefaultContextMenu::DoCreateNewFolder ( LPCMINVOKECOMMANDINFOEX  lpici)
private

Definition at line 1136 of file CDefaultContextMenu.cpp.

1138{
1139 WCHAR wszPath[MAX_PATH];
1140 WCHAR wszName[MAX_PATH];
1141 WCHAR wszNewFolder[25];
1142 HRESULT hr;
1143
1144 /* Get folder path */
1147 return hr;
1148
1149 if (!LoadStringW(shell32_hInstance, IDS_NEWFOLDER, wszNewFolder, _countof(wszNewFolder)))
1150 return E_FAIL;
1151
1152 /* Create the name of the new directory */
1153 if (!PathYetAnotherMakeUniqueName(wszName, wszPath, NULL, wszNewFolder))
1154 return E_FAIL;
1155
1156 /* Create the new directory and show the appropriate dialog in case of error */
1157 if (SHCreateDirectory(lpici->hwnd, wszName) != ERROR_SUCCESS)
1158 return E_FAIL;
1159
1160 /* Show and select the new item in the def view */
1161 LPITEMIDLIST pidl;
1162 PITEMID_CHILD pidlNewItem;
1164
1165 /* Notify the view object about the new item */
1167
1168 if (!m_site)
1169 return S_OK;
1170
1171 /* Get a pointer to the shell view */
1172 hr = IUnknown_QueryService(m_site, SID_SFolderView, IID_PPV_ARG(IShellView, &psv));
1174 return S_OK;
1175
1176 /* Attempt to get the pidl of the new item */
1177 hr = SHILCreateFromPathW(wszName, &pidl, NULL);
1179 return hr;
1180
1181 pidlNewItem = ILFindLastID(pidl);
1182
1183 hr = psv->SelectItem(pidlNewItem, SVSI_DESELECTOTHERS | SVSI_EDIT | SVSI_ENSUREVISIBLE |
1184 SVSI_FOCUSED | SVSI_SELECT);
1186 return hr;
1187
1188 SHFree(pidl);
1189
1190 return S_OK;
1191}
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:848
#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:1489
int WINAPI SHCreateDirectory(HWND hWnd, LPCWSTR path)
Definition: shlfileop.cpp:948
#define SHCNE_MKDIR
Definition: shlobj.h:1901
#define SHCNF_FLUSH
Definition: shlobj.h:1936
#define SHCNF_PATHW
Definition: shlobj.h:1933
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 1004 of file CDefaultContextMenu.cpp.

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

Referenced by InvokeCommand().

◆ DoOpenOrExplore()

HRESULT CDefaultContextMenu::DoOpenOrExplore ( LPCMINVOKECOMMANDINFOEX  lpcmi)
private

Definition at line 983 of file CDefaultContextMenu.cpp.

984{
986 return E_FAIL;
987}
#define UNIMPLEMENTED
Definition: ntoskrnl.c:15

Referenced by InvokeCommand().

◆ DoPaste()

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

Definition at line 930 of file CDefaultContextMenu.cpp.

931{
932 HRESULT hr;
933
935 hr = OleGetClipboard(&pda);
937 return hr;
938
939 FORMATETC formatetc2;
940 STGMEDIUM medium2;
942
943 DWORD dwKey= 0;
944
945 if (SUCCEEDED(pda->GetData(&formatetc2, &medium2)))
946 {
947 DWORD * pdwFlag = (DWORD*)GlobalLock(medium2.hGlobal);
948 if (pdwFlag)
949 {
950 if (*pdwFlag == DROPEFFECT_COPY)
951 dwKey = MK_CONTROL;
952 else
953 dwKey = MK_SHIFT;
954 }
955 else
956 {
957 ERR("No drop effect obtained\n");
958 }
959 GlobalUnlock(medium2.hGlobal);
960 }
961
962 if (bLink)
963 {
964 dwKey = MK_CONTROL|MK_SHIFT;
965 }
966
968 if (m_cidl)
969 hr = m_psf->GetUIObjectOf(NULL, 1, &m_apidl[0], IID_NULL_PPV_ARG(IDropTarget, &pdrop));
970 else
971 hr = m_psf->CreateViewObject(NULL, IID_PPV_ARG(IDropTarget, &pdrop));
972
974 return hr;
975
976 SHSimulateDrop(pdrop, pda, dwKey, NULL, NULL);
977
978 TRACE("CP result %x\n", hr);
979 return S_OK;
980}
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 1076 of file CDefaultContextMenu.cpp.

1078{
1080
1081 // We are asked to run the default property sheet
1082 if (hr == S_FALSE)
1083 {
1085 }
1086
1087 return hr;
1088}
HRESULT _DoInvokeCommandCallback(LPCMINVOKECOMMANDINFOEX lpcmi, WPARAM CmdId)
HRESULT SHELL32_ShowPropertiesDialog(IDataObject *pdtobj)
Definition: shlfolder.cpp:605
#define DFM_CMD_PROPERTIES
Definition: shlobj.h:2620
#define S_FALSE
Definition: winerror.h:2357

Referenced by InvokeCommand().

◆ DoRename()

HRESULT CDefaultContextMenu::DoRename ( LPCMINVOKECOMMANDINFOEX  lpcmi)
private

Definition at line 1049 of file CDefaultContextMenu.cpp.

1050{
1052 HRESULT hr;
1053
1054 if (!m_site || !m_cidl)
1055 return E_FAIL;
1056
1057 /* Get a pointer to the shell browser */
1060 return hr;
1061
1063 hr = psb->QueryActiveShellView(&lpSV);
1065 return hr;
1066
1067 SVSIF selFlags = SVSI_DESELECTOTHERS | SVSI_EDIT | SVSI_ENSUREVISIBLE | SVSI_FOCUSED | SVSI_SELECT;
1068 hr = lpSV->SelectItem(m_apidl[0], selFlags);
1070 return hr;
1071
1072 return S_OK;
1073}

Referenced by InvokeCommand().

◆ DoUndo()

HRESULT CDefaultContextMenu::DoUndo ( LPCMINVOKECOMMANDINFOEX  lpcmi)
private

Definition at line 1091 of file CDefaultContextMenu.cpp.

1092{
1093 ERR("TODO: Undo\n");
1094 return E_NOTIMPL;
1095}

Referenced by InvokeCommand().

◆ EnumerateDynamicContextHandlerForKey()

BOOL CDefaultContextMenu::EnumerateDynamicContextHandlerForKey ( HKEY  hRootKey)
private

Definition at line 473 of file CDefaultContextMenu.cpp.

474{
475 WCHAR wszName[MAX_PATH], wszBuf[MAX_PATH], *pwszClsid;
477 HRESULT hr;
478 HKEY hKey;
479
480 if (RegOpenKeyExW(hRootKey, L"shellex\\ContextMenuHandlers", 0, KEY_READ, &hKey) != ERROR_SUCCESS)
481 {
482 TRACE("RegOpenKeyExW failed\n");
483 return FALSE;
484 }
485
486 DWORD dwIndex = 0;
487 while (TRUE)
488 {
489 cchName = _countof(wszName);
490 if (RegEnumKeyExW(hKey, dwIndex++, wszName, &cchName, NULL, NULL, NULL, NULL) != ERROR_SUCCESS)
491 break;
492
493 /* Key name or key value is CLSID */
494 CLSID clsid;
495 hr = CLSIDFromString(wszName, &clsid);
496 if (hr == S_OK)
497 pwszClsid = wszName;
498 else
499 {
500 DWORD cchBuf = _countof(wszBuf);
501 if (RegGetValueW(hKey, wszName, NULL, RRF_RT_REG_SZ, NULL, wszBuf, &cchBuf) == ERROR_SUCCESS)
502 hr = CLSIDFromString(wszBuf, &clsid);
503 pwszClsid = wszBuf;
504 }
505
506 if (FAILED(hr))
507 {
508 ERR("CLSIDFromString failed for clsid %S hr 0x%x\n", pwszClsid, hr);
509 continue;
510 }
511
513 {
515 L"Software\\Microsoft\\Windows\\CurrentVersion\\Shell Extensions\\Approved",
516 pwszClsid,
518 NULL,
519 NULL,
521 {
522 ERR("Shell extension %s not approved!\n", pwszClsid);
523 continue;
524 }
525 }
526
528 if (FAILED(hr))
529 WARN("Failed to get context menu entires from shell extension! clsid: %S\n", pwszClsid);
530 }
531
533 return TRUE;
534}
#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 1631 of file CDefaultContextMenu.cpp.

1637{
1638 /* We don't handle the help text yet */
1639 if (uFlags == GCS_HELPTEXTA ||
1640 uFlags == GCS_HELPTEXTW ||
1641 HIWORD(idCommand) != 0)
1642 {
1643 return E_NOTIMPL;
1644 }
1645
1646 UINT CmdId = LOWORD(idCommand);
1647
1648 if (!m_DynamicEntries.IsEmpty() && CmdId >= m_iIdSHEFirst && CmdId < m_iIdSHELast)
1649 {
1650 idCommand -= m_iIdSHEFirst;
1652 if (!pEntry)
1653 return E_FAIL;
1654
1655 idCommand -= pEntry->iIdCmdFirst;
1656 return pEntry->pCM->GetCommandString(idCommand,
1657 uFlags,
1658 lpReserved,
1659 lpszName,
1660 uMaxNameLen);
1661 }
1662
1663 if (!m_StaticEntries.IsEmpty() && CmdId >= m_iIdSCMFirst && CmdId < m_iIdSCMLast)
1664 {
1665 /* Validation just returns S_OK on a match. The id exists. */
1666 if (uFlags == GCS_VALIDATEA || uFlags == GCS_VALIDATEW)
1667 return S_OK;
1668
1669 CmdId -= m_iIdSCMFirst;
1670
1671 POSITION it = m_StaticEntries.FindIndex(CmdId);
1672
1673 if (it == NULL)
1674 return E_INVALIDARG;
1675
1677
1678 if (uFlags == GCS_VERBW)
1679 return StringCchCopyW((LPWSTR)lpszName, uMaxNameLen, pEntry->Verb);
1680
1681 if (uFlags == GCS_VERBA)
1682 {
1683 if (SHUnicodeToAnsi(pEntry->Verb, lpszName, uMaxNameLen))
1684 return S_OK;
1685 }
1686
1687 return E_INVALIDARG;
1688 }
1689
1690 //FIXME: Should we handle callbacks here?
1691 if (m_iIdDfltFirst != m_iIdDfltLast && CmdId >= m_iIdDfltFirst && CmdId < m_iIdDfltLast)
1692 {
1693 CmdId -= m_iIdDfltFirst;
1694 /* See the definitions of IDM_CUT and co to see how this works */
1695 CmdId += DCM_FCIDM_SHVIEW_OFFSET;
1696 }
1697
1698 /* Loop looking for a matching Id */
1699 for (UINT i = 0; i < _countof(g_StaticInvokeCmdMap); i++)
1700 {
1701 if (g_StaticInvokeCmdMap[i].IntVerb == CmdId)
1702 {
1703 /* Validation just returns S_OK on a match */
1704 if (uFlags == GCS_VALIDATEA || uFlags == GCS_VALIDATEW)
1705 return S_OK;
1706
1707 /* Return a copy of the ANSI verb */
1708 if (uFlags == GCS_VERBA)
1709 return StringCchCopyA(lpszName, uMaxNameLen, g_StaticInvokeCmdMap[i].szStringVerb);
1710
1711 /* Convert the ANSI verb to unicode and return that */
1712 if (uFlags == GCS_VERBW)
1713 {
1714 if (SHAnsiToUnicode(g_StaticInvokeCmdMap[i].szStringVerb, (LPWSTR)lpszName, uMaxNameLen))
1715 return S_OK;
1716 }
1717 }
1718 }
1719
1720 return E_INVALIDARG;
1721}
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 1193 of file CDefaultContextMenu.cpp.

1194{
1195 POSITION it = m_DynamicEntries.GetHeadPosition();
1196 while (it != NULL)
1197 {
1199
1200 if (idCmd >= info.iIdCmdFirst + info.NumIds)
1201 continue;
1202
1203 if (idCmd < info.iIdCmdFirst || idCmd > info.iIdCmdFirst + info.NumIds)
1204 return NULL;
1205
1206 return &info;
1207 }
1208
1209 return NULL;
1210}

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

◆ GetSite()

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

Definition at line 1795 of file CDefaultContextMenu.cpp.

1796{
1797 if (!m_site)
1798 return E_FAIL;
1799
1800 return m_site->QueryInterface(riid, ppvSite);
1801}
REFIID riid
Definition: atlbase.h:39

◆ HandleMenuMsg()

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

Implements IContextMenu2.

Definition at line 1725 of file CDefaultContextMenu.cpp.

1729{
1730 return HandleMenuMsg2(uMsg, wParam, lParam, NULL);
1731}
STDMETHOD() HandleMenuMsg2(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *plResult) override

◆ HandleMenuMsg2()

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

Implements IContextMenu3.

Definition at line 1752 of file CDefaultContextMenu.cpp.

1757{
1758 if (!SHELL_IsContextMenuMsg(uMsg))
1759 return E_FAIL;
1760
1761 UINT CmdId;
1762 if (uMsg == WM_INITMENUPOPUP)
1763 {
1764 CmdId = GetMenuItemID((HMENU)wParam, 0);
1765 if (CmdId == ~0ul)
1766 return E_FAIL;
1767 }
1768 else
1769 {
1770 HRESULT hr = SHGetMenuIdFromMenuMsg(uMsg, lParam, &CmdId);
1771 if (FAILED(hr))
1772 return S_FALSE;
1773 }
1774 CmdId -= m_iIdQCMFirst; // Convert from Win32 id to our base
1775
1776 if (CmdId >= m_iIdSHEFirst && CmdId < m_iIdSHELast)
1777 {
1779 return SHForwardContextMenuMsg(pEntry->pCM, uMsg, wParam, lParam, plResult, TRUE);
1780 }
1781 // TODO: _DoCallback(DFM_WM_*, ...)
1782 return E_FAIL;
1783}
HRESULT SHGetMenuIdFromMenuMsg(UINT uMsg, LPARAM lParam, UINT *CmdId)
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:63
HRESULT WINAPI SHForwardContextMenuMsg(IUnknown *pUnk, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *pResult, BOOL useIContextMenu2)
Definition: rosordinal.c:11
static BOOL SHELL_IsContextMenuMsg(UINT uMsg)
Definition: shellutils.h:638
UINT WINAPI GetMenuItemID(_In_ HMENU, _In_ int)
#define WM_INITMENUPOPUP
Definition: winuser.h:1757

Referenced by HandleMenuMsg().

◆ Initialize()

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

Definition at line 281 of file CDefaultContextMenu.cpp.

282{
283 TRACE("cidl %u\n", pdcm->cidl);
284
285 if (!pdcm->pcmcb && !lpfn)
286 {
287 ERR("CDefaultContextMenu needs a callback!\n");
288 return E_INVALIDARG;
289 }
290
291 m_cidl = pdcm->cidl;
293 if (m_cidl && !m_apidl)
294 return E_OUTOFMEMORY;
295 m_psf = pdcm->psf;
296 m_pmcb = pdcm->pcmcb;
297 m_pfnmcb = lpfn;
298 m_hwnd = pdcm->hwnd;
299
300 m_cKeys = pdcm->cKeys;
301 if (pdcm->cKeys)
302 {
303 m_aKeys = (HKEY*)HeapAlloc(GetProcessHeap(), 0, sizeof(HKEY) * pdcm->cKeys);
304 if (!m_aKeys)
305 return E_OUTOFMEMORY;
306 memcpy(m_aKeys, pdcm->aKeys, sizeof(HKEY) * pdcm->cKeys);
307 }
308
309 m_psf->GetUIObjectOf(pdcm->hwnd, m_cidl, m_apidl, IID_NULL_PPV_ARG(IDataObject, &m_pDataObj));
310
311 if (pdcm->pidlFolder)
312 {
314 }
315 else
316 {
318 if (SUCCEEDED(m_psf->QueryInterface(IID_PPV_ARG(IPersistFolder2, &pf))))
319 {
320 if (FAILED(pf->GetCurFolder(&m_pidlFolder)))
321 ERR("GetCurFolder failed\n");
322 }
323 TRACE("pidlFolder %p\n", m_pidlFolder);
324 }
325
326 return S_OK;
327}
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:2624
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
Definition: pidl.c:237
const PCUITEMID_CHILD * PCUITEMID_CHILD_ARRAY
Definition: shtypes.idl:71
IContextMenuCB * pcmcb
Definition: shlobj.h:2558
IShellFolder * psf
Definition: shlobj.h:2560
PCUITEMID_CHILD_ARRAY apidl
Definition: shlobj.h:2562
const HKEY * aKeys
Definition: shlobj.h:2565
PCIDLIST_ABSOLUTE pidlFolder
Definition: shlobj.h:2559

◆ InvokeCommand()

HRESULT WINAPI CDefaultContextMenu::InvokeCommand ( LPCMINVOKECOMMANDINFO  lpcmi)
override

Implements IContextMenu.

Definition at line 1521 of file CDefaultContextMenu.cpp.

1523{
1524 CMINVOKECOMMANDINFOEX LocalInvokeInfo = {};
1526 UINT CmdId;
1527
1528 /* Take a local copy of the fixed members of the
1529 struct as we might need to modify the verb */
1530 memcpy(&LocalInvokeInfo, lpcmi, min(sizeof(LocalInvokeInfo), lpcmi->cbSize));
1531
1532 /* Check if this is a string verb */
1533 if (!IS_INTRESOURCE(LocalInvokeInfo.lpVerb))
1534 {
1535 /* Get the ID which corresponds to this verb, and update our local copy */
1536 if (MapVerbToCmdId((LPVOID)LocalInvokeInfo.lpVerb, &CmdId, FALSE))
1537 LocalInvokeInfo.lpVerb = MAKEINTRESOURCEA(CmdId);
1538 else
1539 return E_INVALIDARG;
1540 }
1541 CmdId = LOWORD(LocalInvokeInfo.lpVerb);
1542
1543 if (!m_DynamicEntries.IsEmpty() && CmdId >= m_iIdSHEFirst && CmdId < m_iIdSHELast)
1544 {
1545 LocalInvokeInfo.lpVerb -= m_iIdSHEFirst;
1546 Result = InvokeShellExt(&LocalInvokeInfo);
1547 return Result;
1548 }
1549
1550 if (!m_StaticEntries.IsEmpty() && CmdId >= m_iIdSCMFirst && CmdId < m_iIdSCMLast)
1551 {
1552 LocalInvokeInfo.lpVerb -= m_iIdSCMFirst;
1553 Result = InvokeRegVerb(&LocalInvokeInfo);
1554 // TODO: if (FAILED(Result) && !(lpcmi->fMask & CMIC_MASK_FLAG_NO_UI)) SHELL_ErrorBox(m_pSite, Result);
1555 return Result;
1556 }
1557
1558 if (m_iIdCBFirst != m_iIdCBLast && CmdId >= m_iIdCBFirst && CmdId < m_iIdCBLast)
1559 {
1560 Result = _DoInvokeCommandCallback(&LocalInvokeInfo, CmdId - m_iIdCBFirst);
1561 return Result;
1562 }
1563
1564 if (m_iIdDfltFirst != m_iIdDfltLast && CmdId >= m_iIdDfltFirst && CmdId < m_iIdDfltLast)
1565 {
1566 CmdId -= m_iIdDfltFirst;
1567 /* See the definitions of IDM_CUT and co to see how this works */
1568 CmdId += DCM_FCIDM_SHVIEW_OFFSET;
1569 }
1570
1571 if (LocalInvokeInfo.cbSize >= sizeof(CMINVOKECOMMANDINFOEX) && (LocalInvokeInfo.fMask & CMIC_MASK_PTINVOKE))
1572 {
1573 if (m_pDataObj && FAILED_UNEXPECTEDLY(DataObject_SetOffset(m_pDataObj, &LocalInvokeInfo.ptInvoke)))
1574 {
1575 ERR("Unable to add OFFSET to DataObject!\n");
1576 }
1577 }
1578
1579 /* Check if this is a Id */
1580 switch (CmdId)
1581 {
1583 Result = DoPaste(&LocalInvokeInfo, FALSE);
1584 break;
1586 Result = DoPaste(&LocalInvokeInfo, TRUE);
1587 break;
1588 case FCIDM_SHVIEW_OPEN:
1590 Result = DoOpenOrExplore(&LocalInvokeInfo);
1591 break;
1592 case FCIDM_SHVIEW_COPY:
1593 case FCIDM_SHVIEW_CUT:
1594 Result = DoCopyOrCut(&LocalInvokeInfo, CmdId == FCIDM_SHVIEW_COPY);
1595 break;
1597 Result = DoCreateLink(&LocalInvokeInfo);
1598 break;
1600 Result = DoDelete(&LocalInvokeInfo);
1601 break;
1603 Result = DoRename(&LocalInvokeInfo);
1604 break;
1606 Result = DoProperties(&LocalInvokeInfo);
1607 break;
1609 Result = DoCreateNewFolder(&LocalInvokeInfo);
1610 break;
1612 Result = DoCopyToMoveToFolder(&LocalInvokeInfo, TRUE);
1613 break;
1615 Result = DoCopyToMoveToFolder(&LocalInvokeInfo, FALSE);
1616 break;
1617 case FCIDM_SHVIEW_UNDO:
1618 Result = DoUndo(&LocalInvokeInfo);
1619 break;
1620 default:
1622 ERR("Unhandled Verb %xl\n", LOWORD(LocalInvokeInfo.lpVerb));
1623 break;
1624 }
1625
1626 return Result;
1627}
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:854
#define FCIDM_SHVIEW_OPEN
Definition: shresdef.h:881
#define FCIDM_SHVIEW_UNDO
Definition: shresdef.h:857
#define FCIDM_SHVIEW_COPY
Definition: shresdef.h:855
#define FCIDM_SHVIEW_INSERTLINK
Definition: shresdef.h:858
#define FCIDM_SHVIEW_NEWFOLDER
Definition: shresdef.h:877
#define FCIDM_SHVIEW_EXPLORE
Definition: shresdef.h:880
#define FCIDM_SHVIEW_PROPERTIES
Definition: shresdef.h:853
#define FCIDM_SHVIEW_COPYTO
Definition: shresdef.h:859
#define FCIDM_SHVIEW_MOVETO
Definition: shresdef.h:860
#define FCIDM_SHVIEW_DELETE
Definition: shresdef.h:852
#define FCIDM_SHVIEW_RENAME
Definition: shresdef.h:874
#define FCIDM_SHVIEW_CREATELINK
Definition: shresdef.h:875
#define FCIDM_SHVIEW_INSERT
Definition: shresdef.h:856
#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 1345 of file CDefaultContextMenu.cpp.

1346{
1347 const BOOL unicode = IsUnicode(*lpcmi);
1348
1349 LPITEMIDLIST pidlFull = ILCombine(m_pidlFolder, pidl);
1350 if (pidlFull == NULL)
1351 {
1352 return E_FAIL;
1353 }
1354
1355 WCHAR wszPath[MAX_PATH];
1356 BOOL bHasPath = SHGetPathFromIDListW(pidlFull, wszPath);
1357
1358 WCHAR wszDir[MAX_PATH];
1359
1360 SHELLEXECUTEINFOW sei = { sizeof(sei) };
1361 sei.fMask = SEE_MASK_CLASSKEY | SEE_MASK_IDLIST | (CmicFlagsToSeeFlags(lpcmi->fMask) & ~SEE_MASK_INVOKEIDLIST);
1362 sei.hwnd = lpcmi->hwnd;
1363 sei.nShow = lpcmi->nShow;
1364 sei.lpVerb = pEntry->Verb;
1365 sei.lpIDList = pidlFull;
1366 sei.hkeyClass = pEntry->hkClass;
1367 sei.dwHotKey = lpcmi->dwHotKey;
1368 sei.hIcon = lpcmi->hIcon;
1369 sei.lpDirectory = wszDir;
1370
1371 if (unicode && !StrIsNullOrEmpty(lpcmi->lpDirectoryW))
1372 {
1373 sei.lpDirectory = lpcmi->lpDirectoryW;
1374 }
1375 else if (bHasPath)
1376 {
1377 wcscpy(wszDir, wszPath);
1378 PathRemoveFileSpec(wszDir);
1379 }
1380 else
1381 {
1382 if (!SHGetPathFromIDListW(m_pidlFolder, wszDir))
1383 *wszDir = UNICODE_NULL;
1384 }
1385
1386 if (bHasPath)
1387 sei.lpFile = wszPath;
1388
1389 CComHeapPtr<WCHAR> pszParamsW;
1390 if (unicode && !StrIsNullOrEmpty(lpcmi->lpParametersW))
1391 sei.lpParameters = lpcmi->lpParametersW;
1392 else if (!StrIsNullOrEmpty(lpcmi->lpParameters) && __SHCloneStrAtoW(&pszParamsW, lpcmi->lpParameters))
1393 sei.lpParameters = pszParamsW;
1394
1395 if (!sei.lpClass && (lpcmi->fMask & (CMIC_MASK_HASLINKNAME | CMIC_MASK_HASTITLE)) && unicode)
1396 sei.lpClass = lpcmi->lpTitleW; // Forward .lnk path from CShellLink::DoOpen (for consrv STARTF_TITLEISLINKNAME)
1397
1398 ShellExecuteExW(&sei);
1399 ILFree(pidlFull);
1400
1401 return S_OK;
1402}
wcscpy
#define CmicFlagsToSeeFlags(flags)
Definition: precomp.h:190
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:185
#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:2474
#define PathRemoveFileSpec
Definition: shlwapi.h:1070
LPCWSTR lpDirectory
Definition: shellapi.h:341
LPCWSTR lpParameters
Definition: shellapi.h:340

Referenced by InvokeRegVerb().

◆ InvokeRegVerb()

HRESULT CDefaultContextMenu::InvokeRegVerb ( LPCMINVOKECOMMANDINFOEX  lpcmi)
private

Definition at line 1405 of file CDefaultContextMenu.cpp.

1407{
1408 INT iCmd = LOWORD(lpcmi->lpVerb);
1409 HRESULT hr;
1410 UINT i;
1411
1412 POSITION it = m_StaticEntries.FindIndex(iCmd);
1413
1414 if (it == NULL)
1415 return E_INVALIDARG;
1416
1418
1419 CRegKey VerbKey;
1420 WCHAR VerbKeyPath[sizeof("shell\\") + MAX_VERB];
1421 hr = StringCbPrintfW(VerbKeyPath, sizeof(VerbKeyPath), L"shell\\%s", pEntry->Verb.GetString());
1422 if (SUCCEEDED(hr) && m_pDataObj &&
1423 VerbKey.Open(pEntry->hkClass, VerbKeyPath, KEY_READ) == ERROR_SUCCESS)
1424 {
1425 CLSID clsid;
1426
1427 DWORD KeyState = 0;
1428 if (lpcmi->fMask & CMIC_MASK_SHIFT_DOWN)
1429 KeyState |= MK_SHIFT;
1430 if (lpcmi->fMask & CMIC_MASK_CONTROL_DOWN)
1431 KeyState |= MK_CONTROL;
1432
1433 POINTL *pPtl = NULL;
1434 C_ASSERT(sizeof(POINT) == sizeof(POINTL));
1435 if (lpcmi->fMask & CMIC_MASK_PTINVOKE)
1436 pPtl = (POINTL*)&lpcmi->ptInvoke;
1437
1439 hr = SHELL_GetRegCLSID(VerbKey, L"command", L"DelegateExecute", clsid);
1440 if (SUCCEEDED(hr))
1441 hr = CoCreateInstance(clsid, NULL, CLSCTX_ALL, IID_PPV_ARG(IExecuteCommand, &pEC));
1442 if (SUCCEEDED(hr))
1443 {
1446 return InvokeIExecuteCommandWithDataObject(pEC, pEntry->Verb.GetString(), pPB, m_pDataObj,
1447 lpcmi, static_cast<IContextMenu*>(this));
1448 }
1449
1451 hr = SHELL_GetRegCLSID(VerbKey, L"DropTarget", L"CLSID", clsid);
1452 if (SUCCEEDED(hr))
1453 hr = CoCreateInstance(clsid, NULL, CLSCTX_ALL, IID_PPV_ARG(IDropTarget, &pDT));
1454 if (SUCCEEDED(hr))
1455 {
1458 IUnknown_SetSite(pDT, static_cast<IContextMenu*>(this));
1459 IUnknown_InitializeCommand(pDT, pEntry->Verb.GetString(), pPB);
1460 hr = SHSimulateDrop(pDT, m_pDataObj, KeyState, pPtl, NULL);
1461 IUnknown_SetSite(pDT, NULL);
1462 return hr;
1463 }
1464 }
1465
1466 /* Get the browse flags to see if we need to browse */
1468
1469 for (i=0; i < m_cidl; i++)
1470 {
1471 /* Check if we need to browse */
1472 if (wFlags)
1473 {
1474 hr = TryToBrowse(lpcmi, m_apidl[i], wFlags);
1475 if (SUCCEEDED(hr))
1476 {
1477 /* In WinXP if we have browsed, we don't open any more folders.
1478 * In Win7 we browse to the first folder we find and
1479 * open new windows for each of the rest of the folders */
1481 if (ntver >= _WIN32_WINNT_VISTA)
1482 wFlags = 0; // FIXME: = SBSP_NEWBROWSER | (wFlags & ~SBSP_SAMEBROWSER);
1483 else
1484 i = m_cidl;
1485
1486 continue;
1487 }
1488 }
1489
1490 InvokePidl(lpcmi, m_apidl[i], pEntry);
1491 }
1492
1493 return S_OK;
1494}
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:1654
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:1708
HRESULT WINAPI SHCreatePropertyBagOnRegKey(HKEY hKey, LPCWSTR subkey, DWORD grfMode, REFIID riid, void **ppv)
Definition: ordinal.c:5214
#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 1258 of file CDefaultContextMenu.cpp.

1260{
1261 TRACE("verb %p first %x last %x\n", lpcmi->lpVerb, m_iIdSHEFirst, m_iIdSHELast);
1262
1263 UINT idCmd = LOWORD(lpcmi->lpVerb);
1265 if (!pEntry)
1266 return E_FAIL;
1267
1268 /* invoke the dynamic context menu */
1269 lpcmi->lpVerb = MAKEINTRESOURCEA(idCmd - pEntry->iIdCmdFirst);
1270 return pEntry->pCM->InvokeCommand((LPCMINVOKECOMMANDINFO)lpcmi);
1271}

Referenced by InvokeCommand().

◆ IsShellExtensionAlreadyLoaded()

BOOL CDefaultContextMenu::IsShellExtensionAlreadyLoaded ( REFCLSID  clsid)
private

Definition at line 419 of file CDefaultContextMenu.cpp.

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

Referenced by LoadDynamicContextMenuHandler().

◆ LoadDynamicContextMenuHandler()

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

Definition at line 433 of file CDefaultContextMenu.cpp.

434{
435 HRESULT hr;
436 TRACE("LoadDynamicContextMenuHandler entered with This %p hKey %p pclsid %s\n", this, hKey, wine_dbgstr_guid(&clsid));
437
439 return S_OK;
440
443 if (FAILED(hr))
444 {
445 ERR("SHCoCreateInstance(IContextMenu) failed.clsid %s hr 0x%x\n", wine_dbgstr_guid(&clsid), hr);
446 return hr;
447 }
448
449 CComPtr<IShellExtInit> pExtInit;
450 hr = pcm->QueryInterface(IID_PPV_ARG(IShellExtInit, &pExtInit));
451 if (FAILED(hr))
452 {
453 ERR("IContextMenu->QueryInterface(IShellExtInit) failed.clsid %s hr 0x%x\n", wine_dbgstr_guid(&clsid), hr);
454 return hr;
455 }
456
457 hr = pExtInit->Initialize(m_pDataObj ? NULL : m_pidlFolder, m_pDataObj, hKey);
458 if (FAILED(hr))
459 {
460 WARN("IShellExtInit::Initialize failed.clsid %s hr 0x%x\n", wine_dbgstr_guid(&clsid), hr);
461 return hr;
462 }
463
464 if (m_site)
466
467 m_DynamicEntries.AddTail({ 0, 0, clsid, pcm });
468
469 return S_OK;
470}
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 1213 of file CDefaultContextMenu.cpp.

1214{
1215 WCHAR UnicodeStr[MAX_VERB];
1216
1217 /* Loop through all the static verbs looking for a match */
1218 for (UINT i = 0; i < _countof(g_StaticInvokeCmdMap); i++)
1219 {
1220 /* We can match both ANSI and unicode strings */
1221 if (IsUnicode)
1222 {
1223 /* The static verbs are ANSI, get a unicode version before doing the compare */
1224 SHAnsiToUnicode(g_StaticInvokeCmdMap[i].szStringVerb, UnicodeStr, MAX_VERB);
1225 if (!_wcsicmp(UnicodeStr, (LPWSTR)Verb))
1226 {
1227 /* Return the Corresponding Id */
1228 *idCmd = g_StaticInvokeCmdMap[i].IntVerb;
1229 return TRUE;
1230 }
1231 }
1232 else
1233 {
1234 if (!_stricmp(g_StaticInvokeCmdMap[i].szStringVerb, (LPSTR)Verb))
1235 {
1236 *idCmd = g_StaticInvokeCmdMap[i].IntVerb;
1237 return TRUE;
1238 }
1239 }
1240 }
1241
1242 for (POSITION it = m_DynamicEntries.GetHeadPosition(); it != NULL;)
1243 {
1245 if (!entry.NumIds)
1246 continue;
1247 HRESULT hr = ::MapVerbToCmdId(Verb, IsUnicode, entry.pCM, 0, entry.NumIds - 1);
1248 if (SUCCEEDED(hr))
1249 {
1250 *idCmd = m_iIdSHEFirst + entry.iIdCmdFirst + hr;
1251 return TRUE;
1252 }
1253 }
1254 return FALSE;
1255}
#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 838 of file CDefaultContextMenu.cpp.

844{
845 HRESULT hr;
846 UINT idCmdNext = m_iIdQCMFirst = idCmdFirst;
847 UINT cIds = 0;
848
849 TRACE("BuildShellItemContextMenu entered\n");
850
851 /* Load static verbs and shell extensions from registry */
852 for (UINT i = 0; i < m_cKeys && !(uFlags & CMF_NOVERBS); i++)
853 {
856 }
857
858 /* Add static context menu handlers */
859 cIds = AddStaticContextMenusToMenu(hMenu, &IndexMenu, idCmdFirst, idCmdLast, uFlags);
860 m_iIdSCMFirst = 0; // FIXME: This should be = idCmdFirst?
861 m_iIdSCMLast = cIds;
862 idCmdNext = idCmdFirst + cIds;
863
864 /* Add dynamic context menu handlers */
865 cIds += AddShellExtensionsToMenu(hMenu, &IndexMenu, idCmdNext, idCmdLast, uFlags);
867 m_iIdSHELast = cIds;
868 idCmdNext = idCmdFirst + cIds;
869 TRACE("SH_LoadContextMenuHandlers first %x last %x\n", m_iIdSHEFirst, m_iIdSHELast);
870
871 /* Now let the callback add its own items */
872 QCMINFO qcminfo = {hMenu, IndexMenu, idCmdNext, idCmdLast, NULL};
874 {
875 UINT added = qcminfo.idCmdFirst - idCmdNext;
876 cIds += added;
877 IndexMenu += added;
879 m_iIdCBLast = cIds;
880 idCmdNext = idCmdFirst + cIds;
881 }
882
883 //TODO: DFM_MERGECONTEXTMENU_BOTTOM
884
885 UINT idDefaultOffset = 0;
886 BOOL isBackgroundMenu = !m_cidl;
887 if (!(uFlags & CMF_VERBSONLY) && !isBackgroundMenu)
888 {
889 /* Get the attributes of the items */
890 SFGAOF rfg = SFGAO_BROWSABLE | SFGAO_CANCOPY | SFGAO_CANLINK | SFGAO_CANMOVE | SFGAO_CANDELETE | SFGAO_CANRENAME | SFGAO_HASPROPSHEET | SFGAO_FILESYSTEM | SFGAO_FOLDER;
891 hr = m_psf->GetAttributesOf(m_cidl, m_apidl, &rfg);
893 return MAKE_HRESULT(SEVERITY_SUCCESS, 0, cIds);
894
895 /* Add the default part of the menu */
896 HMENU hmenuDefault = LoadMenuW(_AtlBaseModule.GetResourceInstance(), L"MENU_SHV_FILE");
897
898 /* Remove uneeded entries */
899 if (!(rfg & SFGAO_CANMOVE))
900 DeleteMenu(hmenuDefault, IDM_CUT, MF_BYCOMMAND);
901 if (!(rfg & SFGAO_CANCOPY))
902 DeleteMenu(hmenuDefault, IDM_COPY, MF_BYCOMMAND);
903 if (!((rfg & SFGAO_FILESYSTEM) && HasClipboardData()))
904 DeleteMenu(hmenuDefault, IDM_INSERT, MF_BYCOMMAND);
905 if (!(rfg & SFGAO_CANLINK))
906 DeleteMenu(hmenuDefault, IDM_CREATELINK, MF_BYCOMMAND);
907 if (!(rfg & SFGAO_CANDELETE))
908 DeleteMenu(hmenuDefault, IDM_DELETE, MF_BYCOMMAND);
909 if (!(rfg & SFGAO_CANRENAME) || !(uFlags & CMF_CANRENAME))
910 DeleteMenu(hmenuDefault, IDM_RENAME, MF_BYCOMMAND);
911 if (!(rfg & SFGAO_HASPROPSHEET))
912 DeleteMenu(hmenuDefault, IDM_PROPERTIES, MF_BYCOMMAND);
913
914 idDefaultOffset = idCmdNext;
915 UINT idMax = Shell_MergeMenus(hMenu, GetSubMenu(hmenuDefault, 0), IndexMenu, idCmdNext, idCmdLast, 0);
916 m_iIdDfltFirst = cIds;
917 cIds += idMax - idCmdNext;
918 m_iIdDfltLast = cIds;
919
920 DestroyMenu(hmenuDefault);
921 }
922
923 TryPickDefault(hMenu, idCmdFirst, idDefaultOffset, uFlags);
924
925 // TODO: DFM_MERGECONTEXTMENU_TOP
926
927 return MAKE_HRESULT(SEVERITY_SUCCESS, 0, cIds);
928}
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
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:894
#define IDM_INSERT
Definition: shresdef.h:892
#define IDM_RENAME
Definition: shresdef.h:895
#define IDM_COPY
Definition: shresdef.h:891
#define IDM_CUT
Definition: shresdef.h:890
#define IDM_CREATELINK
Definition: shresdef.h:893
UINT idCmdFirst
Definition: shlobj.h:1400
#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()

STDMETHOD() CDefaultContextMenu::QueryService ( REFGUID  svc,
REFIID  riid,
void **  ppv 
)
inlineoverride

Implements IServiceProvider.

Definition at line 223 of file CDefaultContextMenu.cpp.

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

◆ SetSite()

HRESULT WINAPI CDefaultContextMenu::SetSite ( IUnknown pUnkSite)
override

Implements IObjectWithSite.

Definition at line 1787 of file CDefaultContextMenu.cpp.

1788{
1789 m_site = pUnkSite;
1790 return S_OK;
1791}

◆ TryPickDefault()

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

Definition at line 802 of file CDefaultContextMenu.cpp.

803{
804 // Are we allowed to pick a default?
805 if ((uFlags & CMF_NODEFAULT) ||
806 ((uFlags & CMF_DONOTPICKDEFAULT) && RosGetProcessEffectiveVersion() >= _WIN32_WINNT_WIN7))
807 {
808 return;
809 }
810
811 // Do we already have a default?
812 if ((int)GetMenuDefaultItem(hMenu, MF_BYPOSITION, 0) != -1)
813 return;
814
815 // Does the view want to pick one?
816 INT_PTR forceDfm = 0;
817 if (SUCCEEDED(_DoCallback(DFM_GETDEFSTATICID, 0, &forceDfm)) && forceDfm)
818 {
819 for (UINT i = 0; i < _countof(g_StaticInvokeCmdMap); ++i)
820 {
821 UINT menuItemId = g_StaticInvokeCmdMap[i].IntVerb + DfltOffset - DCM_FCIDM_SHVIEW_OFFSET;
822 if (g_StaticInvokeCmdMap[i].DfmCmd == forceDfm &&
823 SetMenuDefaultItem(hMenu, menuItemId, MF_BYCOMMAND))
824 {
825 return;
826 }
827 }
828 }
829
830 // Don't want to pick something like cut or delete as the default but
831 // a static or dynamic verb is a good default.
833 SetMenuDefaultItem(hMenu, idCmdFirst, MF_BYCOMMAND);
834}
#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 1320 of file CDefaultContextMenu.cpp.

1322{
1324 HRESULT hr;
1325
1326 if (!m_site)
1327 return E_FAIL;
1328
1329 /* Get a pointer to the shell browser */
1331 if (FAILED(hr))
1332 return hr;
1333
1334 PIDLIST_ABSOLUTE pidl;
1335 hr = SHILCombine(m_pidlFolder, pidlChild, &pidl);
1337 return hr;
1338
1339 hr = psb->BrowseObject(pidl, wFlags & ~SBSP_RELATIVE);
1340 ILFree(pidl);
1341 return hr;
1342}

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 171 of file CDefaultContextMenu.cpp.

Referenced by _DoCallback(), and Initialize().

◆ m_iIdCBFirst

UINT CDefaultContextMenu::m_iIdCBFirst
private

Definition at line 167 of file CDefaultContextMenu.cpp.

Referenced by InvokeCommand(), and QueryContextMenu().

◆ m_iIdCBLast

UINT CDefaultContextMenu::m_iIdCBLast
private

Definition at line 168 of file CDefaultContextMenu.cpp.

Referenced by InvokeCommand(), and QueryContextMenu().

◆ m_iIdDfltFirst

UINT CDefaultContextMenu::m_iIdDfltFirst
private

Definition at line 169 of file CDefaultContextMenu.cpp.

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

◆ m_iIdDfltLast

UINT CDefaultContextMenu::m_iIdDfltLast
private

◆ m_iIdQCMFirst

UINT CDefaultContextMenu::m_iIdQCMFirst
private

Definition at line 160 of file CDefaultContextMenu.cpp.

Referenced by HandleMenuMsg2(), and QueryContextMenu().

◆ 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: