ReactOS 0.4.16-dev-1272-g2c12489
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 172 of file CDefaultContextMenu.cpp.

Constructor & Destructor Documentation

◆ CDefaultContextMenu()

CDefaultContextMenu::CDefaultContextMenu ( )

Definition at line 267 of file CDefaultContextMenu.cpp.

267 :
268 m_psf(NULL),
269 m_pmcb(NULL),
270 m_pfnmcb(NULL),
271 m_cidl(0),
272 m_apidl(NULL),
274 m_aKeys(NULL),
275 m_cKeys(NULL),
278 m_iIdQCMFirst(0),
279 m_iIdSHEFirst(0),
280 m_iIdSHELast(0),
281 m_iIdSCMFirst(0),
282 m_iIdSCMLast(0),
283 m_iIdCBFirst(0),
284 m_iIdCBLast(0),
286 m_iIdDfltLast(0),
287 m_hwnd(NULL)
288{
290}
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 292 of file CDefaultContextMenu.cpp.

293{
294 for (POSITION it = m_DynamicEntries.GetHeadPosition(); it != NULL;)
295 {
296 const DynamicShellEntry& info = m_DynamicEntries.GetNext(it);
297 IUnknown_SetSite(info.pCM.p, NULL);
298 }
299 m_DynamicEntries.RemoveAll();
300 m_StaticEntries.RemoveAll();
301
302 for (UINT i = 0; i < m_cKeys; i++)
305
306 if (m_pidlFolder)
308 _ILFreeaPidl(const_cast<PITEMID_CHILD *>(m_apidl), m_cidl);
309}
#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:2608

Member Function Documentation

◆ _DoCallback()

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

Definition at line 359 of file CDefaultContextMenu.cpp.

360{
361 if (m_pmcb)
362 {
363 return m_pmcb->CallBack(m_psf, m_hwnd, m_pDataObj, uMsg, wParam, (LPARAM)lParam);
364 }
365 else if(m_pfnmcb)
366 {
368 }
369
370 return E_FAIL;
371}
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 1499 of file CDefaultContextMenu.cpp.

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

568{
569 UINT cIds = 0;
570
571 if (m_DynamicEntries.IsEmpty())
572 return cIds;
573
574 POSITION it = m_DynamicEntries.GetHeadPosition();
575 while (it != NULL)
576 {
578
579 HRESULT hr = info.pCM->QueryContextMenu(hMenu, *pIndexMenu, idCmdFirst + cIds, idCmdLast, uFlags);
580 if (SUCCEEDED(hr))
581 {
582 info.iIdCmdFirst = cIds;
583 info.NumIds = HRESULT_CODE(hr);
584 (*pIndexMenu) += info.NumIds;
585
586 cIds += info.NumIds;
587 if (idCmdFirst + cIds >= idCmdLast)
588 break;
589 }
590 TRACE("pEntry hr %x contextmenu %p cmdfirst %x num ids %x\n", hr, info.pCM.p, info.iIdCmdFirst, info.NumIds);
591 }
592 return cIds;
593}
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 596 of file CDefaultContextMenu.cpp.

602{
604 MENUITEMINFOW mii = { sizeof(mii) };
605 WCHAR wszDispVerb[80]; // The limit on XP. If the friendly string is longer, it falls back to the verb key.
606 UINT fState, idVerbRes;
607 UINT cIds = 0, indexFirst = *pIndexMenu, indexDefault;
608 int iDefVerbIndex = -1;
609
611 mii.fType = MFT_STRING;
612
613 POSITION it = m_StaticEntries.GetHeadPosition();
614 bool first = true;
615 while (it != NULL)
616 {
618 BOOL forceFirstPos = FALSE;
619 bool hide = false;
620
621 fState = MFS_ENABLED;
622
623 /* set first entry as default */
624 if (first)
625 {
626 fState |= MFS_DEFAULT;
627 first = false;
628 }
629
630 if (info.Verb.CompareNoCase(L"open") == 0)
631 {
632 idVerbRes = IDS_OPEN_VERB; // TODO: This string should include '&'
633 fState |= MFS_DEFAULT; /* override default when open verb is found */
634 forceFirstPos++;
635 }
636 else if (info.Verb.CompareNoCase(L"explore") == 0)
637 {
638 idVerbRes = IDS_EXPLORE_VERB; // TODO: This string should include '&'
639 if (uFlags & CMF_EXPLORE)
640 {
641 fState |= MFS_DEFAULT;
642 forceFirstPos++;
643 }
644 }
645 else if (info.Verb.CompareNoCase(L"printto") == 0)
646 hide = true;
647 else
648 idVerbRes = 0;
649
650 /* By default use verb for menu item name */
651 mii.dwTypeData = (LPWSTR)info.Verb.GetString();
652
653 WCHAR wszKey[sizeof("shell\\") + MAX_VERB];
654 HRESULT hr = StringCbPrintfW(wszKey, sizeof(wszKey), L"shell\\%s", info.Verb.GetString());
656 hide = true;
657
658 UINT cmdFlags = 0;
659 HKEY hkVerb;
660 if (RegOpenKeyExW(info.hkClass, wszKey, 0, KEY_READ, &hkVerb) == ERROR_SUCCESS)
661 {
662 if (!(uFlags & CMF_OPTIMIZEFORINVOKE))
663 {
664 DWORD cbVerb = sizeof(wszDispVerb);
665 LONG res = RegLoadMUIStringW(hkVerb, L"MUIVerb", wszDispVerb, cbVerb, NULL, 0, NULL);
666 if (res || !*wszDispVerb)
667 res = RegLoadMUIStringW(hkVerb, NULL, wszDispVerb, cbVerb, NULL, 0, NULL);
668
669 if ((res == ERROR_SUCCESS && *wszDispVerb) ||
670 (idVerbRes && LoadStringW(shell32_hInstance, idVerbRes, wszDispVerb, _countof(wszDispVerb))) ||
671 SUCCEEDED(GetFriendlyVerb(info.Verb, wszDispVerb, _countof(wszDispVerb))))
672 {
673 mii.dwTypeData = wszDispVerb;
674 }
675 }
676 }
677 else
678 {
679 hkVerb = NULL;
680 }
681
682 if (hkVerb)
683 {
684 if (!hide && !(uFlags & CMF_EXTENDEDVERBS))
685 hide = RegValueExists(hkVerb, L"Extended");
686
687 if (!hide)
688 hide = RegValueExists(hkVerb, L"ProgrammaticAccessOnly");
689
690 if (!hide && !(uFlags & CMF_DISABLEDVERBS))
691 hide = RegValueExists(hkVerb, L"LegacyDisable");
692
693 if (DWORD dwRest = (hide ? 0 : RegGetDword(hkVerb, NULL, L"SuppressionPolicy", 0)))
694 hide = SHRestricted((RESTRICTIONS)dwRest);
695
696 if (RegValueExists(hkVerb, L"NeverDefault"))
697 fState &= ~MFS_DEFAULT;
698
699 if (RegValueExists(hkVerb, L"SeparatorBefore"))
700 cmdFlags |= ECF_SEPARATORBEFORE;
701 if (RegValueExists(hkVerb, L"SeparatorAfter"))
702 cmdFlags |= ECF_SEPARATORAFTER;
703
704 RegCloseKey(hkVerb);
705 }
706
707 if (((uFlags & CMF_NODEFAULT) && ntver >= _WIN32_WINNT_VISTA) ||
708 ((uFlags & CMF_DONOTPICKDEFAULT) && ntver >= _WIN32_WINNT_WIN7))
709 {
710 fState &= ~MFS_DEFAULT;
711 }
712
713 if (!hide)
714 {
715 if (cmdFlags & ECF_SEPARATORBEFORE)
716 {
717 if (InsertMenuItemAt(hMenu, *pIndexMenu, MF_SEPARATOR))
718 (*pIndexMenu)++;
719 }
720
721 UINT pos = *pIndexMenu;
722 int verbIndex = hkVerb ? FindVerbInDefaultVerbList(m_DefVerbs, info.Verb) : -1;
723 if (verbIndex >= 0)
724 {
725 if (verbIndex < iDefVerbIndex || iDefVerbIndex < 0)
726 {
727 iDefVerbIndex = verbIndex;
728 fState |= MFS_DEFAULT;
729 forceFirstPos = TRUE;
730 }
731 else
732 {
733 fState &= ~MFS_DEFAULT; // We have already set a better default
734 pos = indexDefault;
735 }
736 }
737 else if (iDefVerbIndex >= 0)
738 {
739 fState &= ~MFS_DEFAULT; // We have already set the default
740 if (forceFirstPos)
741 pos = indexDefault;
742 forceFirstPos = FALSE;
743 }
744
745 mii.fState = fState;
746 mii.wID = iIdCmdFirst + cIds;
747 if (InsertMenuItemW(hMenu, forceFirstPos ? indexFirst : pos, TRUE, &mii))
748 (*pIndexMenu)++;
749
750 if (cmdFlags & ECF_SEPARATORAFTER)
751 {
752 if (InsertMenuItemAt(hMenu, *pIndexMenu, MF_SEPARATOR))
753 (*pIndexMenu)++;
754 }
755
756 if (fState & MFS_DEFAULT)
757 indexDefault = *pIndexMenu; // This is where we want to insert "high priority" verbs
758 }
759 cIds++; // Always increment the id because it acts as the index into m_StaticEntries
760
761 if (mii.wID >= iIdCmdLast)
762 break;
763 }
764
765 return cIds;
766}
static int FindVerbInDefaultVerbList(LPCWSTR List, LPCWSTR Verb)
static HRESULT GetFriendlyVerb(_In_ PCWSTR pszVerb, _Out_ PWSTR pszBuf, _In_ SIZE_T cchMax)
static BOOL InsertMenuItemAt(HMENU hMenu, UINT Pos, UINT Flags)
#define MAX_VERB
#define shell32_hInstance
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 RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3333
INT WINAPI DECLSPEC_HOTPATCH LoadStringW(HINSTANCE instance, UINT resource_id, LPWSTR buffer, INT buflen)
Definition: string.c:1220
DWORD RegGetDword(HKEY hKey, PCWSTR pszPath, PCWSTR pszName, DWORD nDefVal)
Definition: utils.h:65
static BOOL RegValueExists(HKEY hKey, LPCWSTR Name)
Definition: utils.h:43
#define FAILED_UNEXPECTEDLY
Definition: utils.cpp:30
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint res
Definition: glext.h:9613
const GLint * first
Definition: glext.h:5794
#define KEY_READ
Definition: nt_native.h:1023
#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
RESTRICTIONS
Definition: shlobj.h:1649
DWORD WINAPI SHRestricted(RESTRICTIONS rest)
Definition: shpolicy.c:166
#define IDS_OPEN_VERB
Definition: shresdef.h:212
#define IDS_EXPLORE_VERB
Definition: shresdef.h:213
STRSAFEAPI StringCbPrintfW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszFormat,...)
Definition: strsafe.h:557
LPWSTR dwTypeData
Definition: winuser.h:3345
#define MIIM_ID
Definition: winuser.h:733
#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 399 of file CDefaultContextMenu.cpp.

400{
401 WCHAR wszName[VERBKEY_CCHMAX];
402 DWORD cchName, dwIndex = 0;
403 HKEY hShellKey;
404
405 LRESULT lres = RegOpenKeyExW(hKey, L"shell", 0, KEY_READ, &hShellKey);
406 if (lres != STATUS_SUCCESS)
407 return;
408
409 if (!*m_DefVerbs)
410 {
411 DWORD cb = sizeof(m_DefVerbs);
413 }
414
415 while(TRUE)
416 {
417 cchName = _countof(wszName);
418 if (RegEnumKeyExW(hShellKey, dwIndex++, wszName, &cchName, NULL, NULL, NULL, NULL) != ERROR_SUCCESS)
419 break;
420
421 AddStaticEntry(hKey, wszName, uFlags);
422 }
423
424 RegCloseKey(hShellKey);
425}
void AddStaticEntry(const HKEY hkeyClass, const WCHAR *szVerb, UINT uFlags)
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 STATUS_SUCCESS
Definition: shellext.h:65
_In_ PSID _Out_writes_to_opt_ cchName LPSTR _Inout_ LPDWORD cchName
Definition: winbase.h:2808
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 373 of file CDefaultContextMenu.cpp.

374{
375 POSITION it = m_StaticEntries.GetHeadPosition();
376 while (it != NULL)
377 {
378 const StaticShellEntry& info = m_StaticEntries.GetNext(it);
379 if (info.Verb.CompareNoCase(szVerb) == 0)
380 {
381 /* entry already exists */
382 return;
383 }
384 }
385
386 TRACE("adding verb %s\n", debugstr_w(szVerb));
387
388 if (!_wcsicmp(szVerb, L"open") && !(uFlags & CMF_NODEFAULT))
389 {
390 /* open verb is always inserted in front */
391 m_StaticEntries.AddHead({ szVerb, hkeyClass });
392 }
393 else
394 {
395 m_StaticEntries.AddTail({ szVerb, hkeyClass });
396 }
397}
#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 1285 of file CDefaultContextMenu.cpp.

1286{
1288 HWND hwndTree;
1289 LPCWSTR FlagsName;
1290 WCHAR wszKey[sizeof("shell\\") + MAX_VERB];
1291 HRESULT hr;
1292
1293 if (!m_site)
1294 return 0;
1295
1296 /* Get a pointer to the shell browser */
1298 if (FAILED(hr))
1299 return 0;
1300
1301 /* See if we are in Explore or Browse mode. If the browser's tree is present, we are in Explore mode.*/
1302 if (SUCCEEDED(psb->GetControlWindow(FCW_TREE, &hwndTree)) && hwndTree)
1303 FlagsName = L"ExplorerFlags";
1304 else
1305 FlagsName = L"BrowserFlags";
1306
1308 if (SUCCEEDED(psb->QueryInterface(IID_PPV_ARG(ICommDlgBrowser, &pcdb))))
1309 {
1310 if (LOBYTE(GetVersion()) < 6 || FlagsName[0] == 'E')
1311 return 0; // Don't browse in-place
1312 }
1313
1314 /* Try to get the flag from the verb */
1315 hr = StringCbPrintfW(wszKey, sizeof(wszKey), L"shell\\%s", pEntry->Verb.GetString());
1317 return 0;
1318 return RegGetDword(pEntry->hkClass, wszKey, FlagsName, 0);
1319}
DWORD WINAPI GetVersion(void)
Definition: version.c:1458
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
#define SID_IShellBrowser
#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 1031 of file CDefaultContextMenu.cpp.

1032{
1033 if (!m_cidl || !m_pDataObj)
1034 return E_FAIL;
1035
1036 FORMATETC formatetc;
1038 STGMEDIUM medium = {0};
1039 medium.tymed = TYMED_HGLOBAL;
1040 medium.hGlobal = GlobalAlloc(GHND, sizeof(DWORD));
1041 DWORD* pdwFlag = (DWORD*)GlobalLock(medium.hGlobal);
1042 if (pdwFlag)
1043 *pdwFlag = bCopy ? DROPEFFECT_COPY : DROPEFFECT_MOVE;
1044 GlobalUnlock(medium.hGlobal);
1045 m_pDataObj->SetData(&formatetc, &medium, TRUE);
1046
1048 if (SUCCEEDED(IUnknown_QueryService(m_site, SID_SFolderView, IID_PPV_ARG(IShellFolderView, &psfv))))
1049 psfv->SetPoints(m_pDataObj);
1050
1053 return hr;
1054
1055 if (psfv)
1056 psfv->SetClipboard(!bCopy);
1057 return S_OK;
1058}
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:568
#define GHND
Definition: winbase.h:330
UINT WINAPI RegisterClipboardFormatW(_In_ LPCWSTR)

Referenced by InvokeCommand().

◆ DoCopyToMoveToFolder()

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

Definition at line 1109 of file CDefaultContextMenu.cpp.

1110{
1111 HRESULT hr = E_FAIL;
1112 if (!m_pDataObj)
1113 {
1114 ERR("m_pDataObj is NULL\n");
1115 return hr;
1116 }
1117
1118 CComPtr<IContextMenu> pContextMenu;
1119 if (bCopy)
1120 hr = SHCoCreateInstance(NULL, &CLSID_CopyToMenu, NULL,
1121 IID_PPV_ARG(IContextMenu, &pContextMenu));
1122 else
1123 hr = SHCoCreateInstance(NULL, &CLSID_MoveToMenu, NULL,
1124 IID_PPV_ARG(IContextMenu, &pContextMenu));
1126 return hr;
1127
1129 hr = pContextMenu->QueryInterface(IID_PPV_ARG(IShellExtInit, &pInit));
1131 return hr;
1132
1133 hr = pInit->Initialize(m_pidlFolder, m_pDataObj, NULL);
1135 return hr;
1136
1137 if (bCopy)
1138 lpici->lpVerb = "copyto";
1139 else
1140 lpici->lpVerb = "moveto";
1141
1142 return pContextMenu->InvokeCommand((LPCMINVOKECOMMANDINFO)lpici);
1143}
#define ERR(fmt,...)
Definition: precomp.h:57
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 1000 of file CDefaultContextMenu.cpp.

1001{
1002 if (!m_cidl || !m_pDataObj)
1003 return E_FAIL;
1004
1006 HRESULT hr = m_psf->CreateViewObject(NULL, IID_PPV_ARG(IDropTarget, &pDT));
1008 return hr;
1009
1011
1012 return S_OK;
1013}
BOOL WINAPI SHSimulateDrop(IDropTarget *pDrop, IDataObject *pDataObj, DWORD grfKeyState, PPOINTL lpPt, DWORD *pdwEffect)
Definition: ordinal.c:1828
#define MK_SHIFT
Definition: winuser.h:2388
#define MK_CONTROL
Definition: winuser.h:2389

Referenced by InvokeCommand().

◆ DoCreateNewFolder()

HRESULT CDefaultContextMenu::DoCreateNewFolder ( LPCMINVOKECOMMANDINFOEX  lpici)
private

Definition at line 1147 of file CDefaultContextMenu.cpp.

1149{
1150 WCHAR wszPath[MAX_PATH];
1151 WCHAR wszName[MAX_PATH];
1152 WCHAR wszNewFolder[25];
1153 HRESULT hr;
1154
1155 /* Get folder path */
1158 return hr;
1159
1160 if (!LoadStringW(shell32_hInstance, IDS_NEWFOLDER, wszNewFolder, _countof(wszNewFolder)))
1161 return E_FAIL;
1162
1163 /* Create the name of the new directory */
1164 if (!PathYetAnotherMakeUniqueName(wszName, wszPath, NULL, wszNewFolder))
1165 return E_FAIL;
1166
1167 /* Create the new directory and show the appropriate dialog in case of error */
1168 if (SHCreateDirectory(lpici->hwnd, wszName) != ERROR_SUCCESS)
1169 return E_FAIL;
1170
1171 /* Show and select the new item in the def view */
1172 LPITEMIDLIST pidl;
1173 PITEMID_CHILD pidlNewItem;
1175
1176 /* Notify the view object about the new item */
1178
1179 if (!m_site)
1180 return S_OK;
1181
1182 /* Get a pointer to the shell view */
1183 hr = IUnknown_QueryService(m_site, SID_SFolderView, IID_PPV_ARG(IShellView, &psv));
1185 return S_OK;
1186
1187 /* Attempt to get the pidl of the new item */
1188 hr = SHILCreateFromPathW(wszName, &pidl, NULL);
1190 return hr;
1191
1192 pidlNewItem = ILFindLastID(pidl);
1193
1194 hr = psv->SelectItem(pidlNewItem, SVSI_DESELECTOTHERS | SVSI_EDIT | SVSI_ENSUREVISIBLE |
1195 SVSI_FOCUSED | SVSI_SELECT);
1197 return hr;
1198
1199 SHFree(pidl);
1200
1201 return S_OK;
1202}
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:404
LPITEMIDLIST WINAPI ILFindLastID(LPCITEMIDLIST pidl)
Definition: pidl.c:199
BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath)
Definition: pidl.c:1490
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 1015 of file CDefaultContextMenu.cpp.

1016{
1017 if (!m_cidl || !m_pDataObj)
1018 return E_FAIL;
1019
1023 return hr;
1024
1025 DWORD grfKeyState = (lpcmi->fMask & CMIC_MASK_SHIFT_DOWN) ? MK_SHIFT : 0;
1026 SHSimulateDrop(pDT, m_pDataObj, grfKeyState, NULL, NULL);
1027
1028 return S_OK;
1029}
HRESULT CRecyclerDropTarget_CreateInstance(REFIID riid, LPVOID *ppvOut)

Referenced by InvokeCommand().

◆ DoOpenOrExplore()

HRESULT CDefaultContextMenu::DoOpenOrExplore ( LPCMINVOKECOMMANDINFOEX  lpcmi)
private

Definition at line 994 of file CDefaultContextMenu.cpp.

995{
997 return E_FAIL;
998}
#define UNIMPLEMENTED
Definition: ntoskrnl.c:15

Referenced by InvokeCommand().

◆ DoPaste()

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

Definition at line 941 of file CDefaultContextMenu.cpp.

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

1089{
1091
1092 // We are asked to run the default property sheet
1093 if (hr == S_FALSE)
1094 {
1096 }
1097
1098 return hr;
1099}
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 1060 of file CDefaultContextMenu.cpp.

1061{
1063 HRESULT hr;
1064
1065 if (!m_site || !m_cidl)
1066 return E_FAIL;
1067
1068 /* Get a pointer to the shell browser */
1071 return hr;
1072
1074 hr = psb->QueryActiveShellView(&lpSV);
1076 return hr;
1077
1078 SVSIF selFlags = SVSI_DESELECTOTHERS | SVSI_EDIT | SVSI_ENSUREVISIBLE | SVSI_FOCUSED | SVSI_SELECT;
1079 hr = lpSV->SelectItem(m_apidl[0], selFlags);
1081 return hr;
1082
1083 return S_OK;
1084}

Referenced by InvokeCommand().

◆ DoUndo()

HRESULT CDefaultContextMenu::DoUndo ( LPCMINVOKECOMMANDINFOEX  lpcmi)
private

Definition at line 1102 of file CDefaultContextMenu.cpp.

1103{
1104 ERR("TODO: Undo\n");
1105 return E_NOTIMPL;
1106}

Referenced by InvokeCommand().

◆ EnumerateDynamicContextHandlerForKey()

BOOL CDefaultContextMenu::EnumerateDynamicContextHandlerForKey ( HKEY  hRootKey)
private

Definition at line 503 of file CDefaultContextMenu.cpp.

504{
505 WCHAR wszName[MAX_PATH], wszBuf[MAX_PATH], *pwszClsid;
507 HRESULT hr;
508 HKEY hKey;
509
510 if (RegOpenKeyExW(hRootKey, L"shellex\\ContextMenuHandlers", 0, KEY_READ, &hKey) != ERROR_SUCCESS)
511 {
512 TRACE("RegOpenKeyExW failed\n");
513 return FALSE;
514 }
515
516 DWORD dwIndex = 0;
517 while (TRUE)
518 {
519 cchName = _countof(wszName);
520 if (RegEnumKeyExW(hKey, dwIndex++, wszName, &cchName, NULL, NULL, NULL, NULL) != ERROR_SUCCESS)
521 break;
522
523 /* Key name or key value is CLSID */
524 CLSID clsid;
525 hr = CLSIDFromString(wszName, &clsid);
526 if (hr == S_OK)
527 pwszClsid = wszName;
528 else
529 {
530 DWORD cchBuf = _countof(wszBuf);
531 if (RegGetValueW(hKey, wszName, NULL, RRF_RT_REG_SZ, NULL, wszBuf, &cchBuf) == ERROR_SUCCESS)
532 hr = CLSIDFromString(wszBuf, &clsid);
533 pwszClsid = wszBuf;
534 }
535
536 if (FAILED(hr))
537 {
538 ERR("CLSIDFromString failed for clsid %S hr 0x%x\n", pwszClsid, hr);
539 continue;
540 }
541
543 {
545 L"Software\\Microsoft\\Windows\\CurrentVersion\\Shell Extensions\\Approved",
546 pwszClsid,
548 NULL,
549 NULL,
551 {
552 ERR("Shell extension %s not approved!\n", pwszClsid);
553 continue;
554 }
555 }
556
558 if (FAILED(hr))
559 WARN("Failed to get context menu entires from shell extension! clsid: %S\n", pwszClsid);
560 }
561
563 return TRUE;
564}
#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 1633 of file CDefaultContextMenu.cpp.

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

◆ GetDynamicEntry()

PDynamicShellEntry CDefaultContextMenu::GetDynamicEntry ( UINT  idCmd)
private

Definition at line 1204 of file CDefaultContextMenu.cpp.

1205{
1206 POSITION it = m_DynamicEntries.GetHeadPosition();
1207 while (it != NULL)
1208 {
1210
1211 if (idCmd >= info.iIdCmdFirst + info.NumIds)
1212 continue;
1213
1214 if (idCmd < info.iIdCmdFirst || idCmd > info.iIdCmdFirst + info.NumIds)
1215 return NULL;
1216
1217 return &info;
1218 }
1219
1220 return NULL;
1221}

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

◆ GetSite()

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

Definition at line 1797 of file CDefaultContextMenu.cpp.

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

◆ HandleMenuMsg()

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

Implements IContextMenu2.

Definition at line 1727 of file CDefaultContextMenu.cpp.

1731{
1732 return HandleMenuMsg2(uMsg, wParam, lParam, NULL);
1733}
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 1754 of file CDefaultContextMenu.cpp.

1759{
1760 if (!SHELL_IsContextMenuMsg(uMsg))
1761 return E_FAIL;
1762
1763 UINT CmdId;
1764 if (uMsg == WM_INITMENUPOPUP)
1765 {
1766 CmdId = GetMenuItemID((HMENU)wParam, 0);
1767 if (CmdId == ~0ul)
1768 return E_FAIL;
1769 }
1770 else
1771 {
1772 HRESULT hr = SHGetMenuIdFromMenuMsg(uMsg, lParam, &CmdId);
1773 if (FAILED(hr))
1774 return S_FALSE;
1775 }
1776 CmdId -= m_iIdQCMFirst; // Convert from Win32 id to our base
1777
1778 if (CmdId >= m_iIdSHEFirst && CmdId < m_iIdSHELast)
1779 {
1781 return SHForwardContextMenuMsg(pEntry->pCM, uMsg, wParam, lParam, plResult, TRUE);
1782 }
1783 // TODO: _DoCallback(DFM_WM_*, ...)
1784 return E_FAIL;
1785}
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:679
UINT WINAPI GetMenuItemID(_In_ HMENU, _In_ int)
#define WM_INITMENUPOPUP
Definition: winuser.h:1765

Referenced by HandleMenuMsg().

◆ Initialize()

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

Definition at line 311 of file CDefaultContextMenu.cpp.

312{
313 TRACE("cidl %u\n", pdcm->cidl);
314
315 if (!pdcm->pcmcb && !lpfn)
316 {
317 ERR("CDefaultContextMenu needs a callback!\n");
318 return E_INVALIDARG;
319 }
320
321 m_cidl = pdcm->cidl;
323 if (m_cidl && !m_apidl)
324 return E_OUTOFMEMORY;
325 m_psf = pdcm->psf;
326 m_pmcb = pdcm->pcmcb;
327 m_pfnmcb = lpfn;
328 m_hwnd = pdcm->hwnd;
329
330 m_cKeys = pdcm->cKeys;
331 if (pdcm->cKeys)
332 {
333 m_aKeys = (HKEY*)HeapAlloc(GetProcessHeap(), 0, sizeof(HKEY) * pdcm->cKeys);
334 if (!m_aKeys)
335 return E_OUTOFMEMORY;
336 memcpy(m_aKeys, pdcm->aKeys, sizeof(HKEY) * pdcm->cKeys);
337 }
338
339 m_psf->GetUIObjectOf(pdcm->hwnd, m_cidl, m_apidl, IID_NULL_PPV_ARG(IDataObject, &m_pDataObj));
340
341 if (pdcm->pidlFolder)
342 {
344 }
345 else
346 {
348 if (SUCCEEDED(m_psf->QueryInterface(IID_PPV_ARG(IPersistFolder2, &pf))))
349 {
350 if (FAILED(pf->GetCurFolder(&m_pidlFolder)))
351 ERR("GetCurFolder failed\n");
352 }
353 TRACE("pidlFolder %p\n", m_pidlFolder);
354 }
355
356 return S_OK;
357}
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:2623
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
Definition: pidl.c:238
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 1523 of file CDefaultContextMenu.cpp.

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

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

Referenced by InvokeRegVerb().

◆ InvokeRegVerb()

HRESULT CDefaultContextMenu::InvokeRegVerb ( LPCMINVOKECOMMANDINFOEX  lpcmi)
private

Definition at line 1407 of file CDefaultContextMenu.cpp.

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

Referenced by InvokeCommand().

◆ InvokeShellExt()

HRESULT CDefaultContextMenu::InvokeShellExt ( LPCMINVOKECOMMANDINFOEX  lpcmi)
private

Definition at line 1269 of file CDefaultContextMenu.cpp.

1271{
1272 TRACE("verb %p first %x last %x\n", lpcmi->lpVerb, m_iIdSHEFirst, m_iIdSHELast);
1273
1274 UINT idCmd = LOWORD(lpcmi->lpVerb);
1276 if (!pEntry)
1277 return E_FAIL;
1278
1279 /* invoke the dynamic context menu */
1280 lpcmi->lpVerb = MAKEINTRESOURCEA(idCmd - pEntry->iIdCmdFirst);
1281 return pEntry->pCM->InvokeCommand((LPCMINVOKECOMMANDINFO)lpcmi);
1282}

Referenced by InvokeCommand().

◆ IsShellExtensionAlreadyLoaded()

BOOL CDefaultContextMenu::IsShellExtensionAlreadyLoaded ( REFCLSID  clsid)
private

Definition at line 449 of file CDefaultContextMenu.cpp.

450{
451 POSITION it = m_DynamicEntries.GetHeadPosition();
452 while (it != NULL)
453 {
454 const DynamicShellEntry& info = m_DynamicEntries.GetNext(it);
455 if (info.ClassID == clsid)
456 return TRUE;
457 }
458
459 return FALSE;
460}

Referenced by LoadDynamicContextMenuHandler().

◆ LoadDynamicContextMenuHandler()

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

Definition at line 463 of file CDefaultContextMenu.cpp.

464{
465 HRESULT hr;
466 TRACE("LoadDynamicContextMenuHandler entered with This %p hKey %p pclsid %s\n", this, hKey, wine_dbgstr_guid(&clsid));
467
469 return S_OK;
470
473 if (FAILED(hr))
474 {
475 ERR("SHCoCreateInstance(IContextMenu) failed.clsid %s hr 0x%x\n", wine_dbgstr_guid(&clsid), hr);
476 return hr;
477 }
478
479 CComPtr<IShellExtInit> pExtInit;
480 hr = pcm->QueryInterface(IID_PPV_ARG(IShellExtInit, &pExtInit));
481 if (FAILED(hr))
482 {
483 ERR("IContextMenu->QueryInterface(IShellExtInit) failed.clsid %s hr 0x%x\n", wine_dbgstr_guid(&clsid), hr);
484 return hr;
485 }
486
487 hr = pExtInit->Initialize(m_pDataObj ? NULL : m_pidlFolder, m_pDataObj, hKey);
488 if (FAILED(hr))
489 {
490 WARN("IShellExtInit::Initialize failed.clsid %s hr 0x%x\n", wine_dbgstr_guid(&clsid), hr);
491 return hr;
492 }
493
494 if (m_site)
496
497 m_DynamicEntries.AddTail({ 0, 0, clsid, pcm });
498
499 return S_OK;
500}
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 1224 of file CDefaultContextMenu.cpp.

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

850{
851 HRESULT hr;
852 UINT idCmdNext = m_iIdQCMFirst = idCmdFirst;
853 UINT cIds = 0;
854
855 TRACE("BuildShellItemContextMenu entered\n");
856
857 /* Load static verbs and shell extensions from registry */
858 for (UINT i = 0; i < m_cKeys && !(uFlags & CMF_NOVERBS); i++)
859 {
862 }
863
864 /* Add static context menu handlers */
865 cIds = AddStaticContextMenusToMenu(hMenu, &IndexMenu, idCmdFirst, idCmdLast, uFlags);
866 m_iIdSCMFirst = 0; // FIXME: This should be = idCmdFirst?
867 m_iIdSCMLast = cIds;
868 idCmdNext = idCmdFirst + cIds;
869
870 /* Add dynamic context menu handlers */
871 cIds += AddShellExtensionsToMenu(hMenu, &IndexMenu, idCmdNext, idCmdLast, uFlags);
873 m_iIdSHELast = cIds;
874 idCmdNext = idCmdFirst + cIds;
875 TRACE("SH_LoadContextMenuHandlers first %x last %x\n", m_iIdSHEFirst, m_iIdSHELast);
876
877 /* Now let the callback add its own items */
878 QCMINFO qcminfo = {hMenu, IndexMenu, idCmdNext, idCmdLast, NULL};
880 {
881 UINT added = qcminfo.idCmdFirst - idCmdNext;
882 cIds += added;
883 IndexMenu += added;
885 m_iIdCBLast = cIds;
886 idCmdNext = idCmdFirst + cIds;
887 }
888
889 //TODO: DFM_MERGECONTEXTMENU_BOTTOM
890
891 UINT idDefaultOffset = 0;
892 BOOL isBackgroundMenu = !m_cidl;
893 if (!(uFlags & CMF_VERBSONLY) && !isBackgroundMenu)
894 {
895 /* Get the attributes of the items */
896 SFGAOF rfg = SFGAO_BROWSABLE | SFGAO_CANCOPY | SFGAO_CANLINK | SFGAO_CANMOVE | SFGAO_CANDELETE | SFGAO_CANRENAME | SFGAO_HASPROPSHEET | SFGAO_FILESYSTEM | SFGAO_FOLDER;
897 hr = m_psf->GetAttributesOf(m_cidl, m_apidl, &rfg);
899 return MAKE_HRESULT(SEVERITY_SUCCESS, 0, cIds);
900
901 /* Add the default part of the menu */
902 HMENU hmenuDefault = LoadMenuW(_AtlBaseModule.GetResourceInstance(), L"MENU_SHV_FILE");
903
904 /* Remove uneeded entries */
905 if (!(rfg & SFGAO_CANMOVE))
906 DeleteMenu(hmenuDefault, IDM_CUT, MF_BYCOMMAND);
907 if (!(rfg & SFGAO_CANCOPY))
908 DeleteMenu(hmenuDefault, IDM_COPY, MF_BYCOMMAND);
909 if (!((rfg & SFGAO_FILESYSTEM) && HasClipboardData()))
910 DeleteMenu(hmenuDefault, IDM_INSERT, MF_BYCOMMAND);
911 if (!(rfg & SFGAO_CANLINK))
912 DeleteMenu(hmenuDefault, IDM_CREATELINK, MF_BYCOMMAND);
913 if (!(rfg & SFGAO_CANDELETE))
914 DeleteMenu(hmenuDefault, IDM_DELETE, MF_BYCOMMAND);
915 if (!(rfg & SFGAO_CANRENAME) || !(uFlags & CMF_CANRENAME))
916 DeleteMenu(hmenuDefault, IDM_RENAME, MF_BYCOMMAND);
917 if (!(rfg & SFGAO_HASPROPSHEET))
918 DeleteMenu(hmenuDefault, IDM_PROPERTIES, MF_BYCOMMAND);
919
920 idDefaultOffset = idCmdNext;
921 UINT idMax = Shell_MergeMenus(hMenu, GetSubMenu(hmenuDefault, 0), IndexMenu, idCmdNext, idCmdLast, 0);
922 m_iIdDfltFirst = cIds;
923 cIds += idMax - idCmdNext;
924 m_iIdDfltLast = cIds;
925
926 DestroyMenu(hmenuDefault);
927 }
928
929 TryPickDefault(hMenu, idCmdFirst, idDefaultOffset, uFlags);
930
931 // TODO: DFM_MERGECONTEXTMENU_TOP
932
933 // TODO: Remove duplicate verbs. This will be easier when the static items handling
934 // has been moved to CLSID_ShellFileDefExt so we only have to deal with ShellEx.
935 // This is a Windows XP+ feature. On an unknown file type, Windows 2000 will
936 // display both "Open" (openas from Unknown) and "Open with..." (openas from *).
937
938 return MAKE_HRESULT(SEVERITY_SUCCESS, 0, cIds);
939}
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:898
#define IDM_INSERT
Definition: shresdef.h:896
#define IDM_RENAME
Definition: shresdef.h:899
#define IDM_COPY
Definition: shresdef.h:895
#define IDM_CUT
Definition: shresdef.h:894
#define IDM_CREATELINK
Definition: shresdef.h:897
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 253 of file CDefaultContextMenu.cpp.

254 {
255 return IUnknown_QueryService(m_site, svc, riid, ppv);
256 }
REFIID LPVOID * ppv
Definition: atlbase.h:39

◆ SetSite()

HRESULT WINAPI CDefaultContextMenu::SetSite ( IUnknown pUnkSite)
override

Implements IObjectWithSite.

Definition at line 1789 of file CDefaultContextMenu.cpp.

1790{
1791 m_site = pUnkSite;
1792 return S_OK;
1793}

◆ TryPickDefault()

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

Definition at line 808 of file CDefaultContextMenu.cpp.

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

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

Referenced by InvokeRegVerb().

Member Data Documentation

◆ m_aKeys

HKEY* CDefaultContextMenu::m_aKeys
private

Definition at line 186 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 189 of file CDefaultContextMenu.cpp.

Referenced by EnumerateDynamicContextHandlerForKey().

◆ m_cidl

UINT CDefaultContextMenu::m_cidl
private

◆ m_cKeys

UINT CDefaultContextMenu::m_cKeys
private

Definition at line 187 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 201 of file CDefaultContextMenu.cpp.

Referenced by _DoCallback(), and Initialize().

◆ m_iIdCBFirst

UINT CDefaultContextMenu::m_iIdCBFirst
private

Definition at line 197 of file CDefaultContextMenu.cpp.

Referenced by InvokeCommand(), and QueryContextMenu().

◆ m_iIdCBLast

UINT CDefaultContextMenu::m_iIdCBLast
private

Definition at line 198 of file CDefaultContextMenu.cpp.

Referenced by InvokeCommand(), and QueryContextMenu().

◆ m_iIdDfltFirst

UINT CDefaultContextMenu::m_iIdDfltFirst
private

Definition at line 199 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 190 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 182 of file CDefaultContextMenu.cpp.

Referenced by _DoCallback(), and Initialize().

◆ m_pidlFolder

◆ m_pmcb

CComPtr<IContextMenuCB> CDefaultContextMenu::m_pmcb
private

Definition at line 181 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: