ReactOS 0.4.17-dev-684-ga6524ef
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 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 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)
 
HRESULT GetNoAssocError ()
 

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
 
HKEY m_aKeys [16]
 
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 283 of file CDefaultContextMenu.cpp.

Constructor & Destructor Documentation

◆ CDefaultContextMenu()

CDefaultContextMenu::CDefaultContextMenu ( )

Definition at line 381 of file CDefaultContextMenu.cpp.

381 :
382 m_psf(NULL),
383 m_pmcb(NULL),
384 m_pfnmcb(NULL),
385 m_cidl(0),
386 m_apidl(NULL),
388 m_cKeys(0),
391 m_iIdQCMFirst(0),
392 m_iIdSHEFirst(0),
393 m_iIdSHELast(0),
394 m_iIdSCMFirst(0),
395 m_iIdSCMLast(0),
396 m_iIdCBFirst(0),
397 m_iIdCBLast(0),
399 m_iIdDfltLast(0),
400 m_hwnd(NULL)
401{
403}
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 405 of file CDefaultContextMenu.cpp.

406{
407 for (POSITION it = m_DynamicEntries.GetHeadPosition(); it != NULL;)
408 {
409 const DynamicShellEntry& info = m_DynamicEntries.GetNext(it);
410 IUnknown_SetSite(info.pCM.p, NULL);
411 }
412 m_DynamicEntries.RemoveAll();
413 m_StaticEntries.RemoveAll();
414
415 for (UINT i = 0; i < m_cKeys; i++)
417
418 if (m_pidlFolder)
420 _ILFreeaPidl(const_cast<PITEMID_CHILD *>(m_apidl), m_cidl);
421}
#define RegCloseKey(hKey)
Definition: registry.h:49
CAtlList< StaticShellEntry > m_StaticEntries
CAtlList< DynamicShellEntry > m_DynamicEntries
void WINAPI CoTaskMemFree(void *ptr)
Definition: malloc.c:389
HRESULT WINAPI IUnknown_SetSite(IUnknown *obj, IUnknown *site)
Definition: main.c:222
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
unsigned int UINT
Definition: sysinfo.c:13
void _ILFreeaPidl(LPITEMIDLIST *apidl, UINT cidl)
Definition: pidl.c:2616

Member Function Documentation

◆ _DoCallback()

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

Definition at line 473 of file CDefaultContextMenu.cpp.

474{
475 if (m_pmcb)
476 {
477 return m_pmcb->CallBack(m_psf, m_hwnd, m_pDataObj, uMsg, wParam, (LPARAM)lParam);
478 }
479 else if(m_pfnmcb)
480 {
482 }
483
484 return E_FAIL;
485}
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
#define E_FAIL
Definition: ddrawi.h:102
LONG_PTR LPARAM
Definition: minwindef.h:175

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

◆ _DoInvokeCommandCallback()

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

Definition at line 1598 of file CDefaultContextMenu.cpp.

1600{
1601 BOOL Unicode = IsUnicode(*lpcmi);
1602 WCHAR lParamBuf[MAX_PATH];
1603 LPARAM lParam = 0;
1604
1605 if (Unicode && lpcmi->lpParametersW)
1606 lParam = (LPARAM)lpcmi->lpParametersW;
1607 else if (lpcmi->lpParameters)
1608 lParam = SHAnsiToUnicode(lpcmi->lpParameters, lParamBuf, _countof(lParamBuf)) ? (LPARAM)lParamBuf : 0;
1609
1610 HRESULT hr;
1611#if 0 // TODO: Try DFM_INVOKECOMMANDEX first.
1612 DFMICS dfmics = { sizeof(DFMICS), lpcmi->fMask, lParam, m_iIdSCMFirst?, m_iIdDfltLast?, (LPCMINVOKECOMMANDINFO)lpcmi, m_site };
1613 hr = _DoCallback(DFM_INVOKECOMMANDEX, CmdId, &dfmics);
1614 if (hr == E_NOTIMPL)
1615#endif
1616 hr = _DoCallback(DFM_INVOKECOMMAND, CmdId, (void*)lParam);
1617 return hr;
1618}
CComPtr< IUnknown > m_site
HRESULT _DoCallback(UINT uMsg, WPARAM wParam, LPVOID lParam)
#define E_NOTIMPL
Definition: ddrawi.h:99
HRESULT hr
Definition: delayimp.cpp:582
#define DFM_INVOKECOMMANDEX
Definition: precomp.h:46
#define DFM_INVOKECOMMAND
Definition: precomp.h:45
#define MAX_PATH
Definition: compat.h:34
DWORD WINAPI SHAnsiToUnicode(const char *src, WCHAR *dest, int dest_len)
Definition: main.c:1801
unsigned int BOOL
Definition: ntddk_ex.h:94
struct IContextMenu::tagCMINVOKECOMMANDINFO * LPCMINVOKECOMMANDINFO
if(dx< 0)
Definition: linetemp.h:194
short WCHAR
Definition: pedump.c:58
#define _countof(array)
Definition: sndvol32.h:70

Referenced by DoCopyOrCut(), DoCreateLink(), DoDelete(), DoPaste(), DoProperties(), DoRename(), and InvokeCommand().

◆ AddShellExtensionsToMenu()

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

Definition at line 681 of file CDefaultContextMenu.cpp.

682{
683 UINT cIds = 0;
684
685 if (m_DynamicEntries.IsEmpty())
686 return cIds;
687
688 POSITION it = m_DynamicEntries.GetHeadPosition();
689 while (it != NULL)
690 {
692
693 HRESULT hr = info.pCM->QueryContextMenu(hMenu, *pIndexMenu, idCmdFirst + cIds, idCmdLast, uFlags);
694 if (SUCCEEDED(hr))
695 {
696 info.iIdCmdFirst = cIds;
697 info.NumIds = HRESULT_CODE(hr);
698 (*pIndexMenu) += info.NumIds;
699
700 cIds += info.NumIds;
701 if (idCmdFirst + cIds >= idCmdLast)
702 break;
703 }
704 TRACE("pEntry hr %x contextmenu %p cmdfirst %x num ids %x\n", hr, info.pCM.p, info.iIdCmdFirst, info.NumIds);
705 }
706 return cIds;
707}
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:188

Referenced by QueryContextMenu().

◆ AddStaticContextMenusToMenu()

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

Definition at line 710 of file CDefaultContextMenu.cpp.

716{
718 MENUITEMINFOW mii = { sizeof(mii) };
719 WCHAR wszDispVerb[80]; // The limit on XP. If the friendly string is longer, it falls back to the verb key.
720 UINT fState, idVerbRes;
721 UINT cIds = 0, indexFirst = *pIndexMenu, indexDefault;
722 int iDefVerbIndex = -1;
723
725 mii.fType = MFT_STRING;
726
727 POSITION it = m_StaticEntries.GetHeadPosition();
728 bool first = true;
729 while (it != NULL)
730 {
732 BOOL forceFirstPos = FALSE;
733 bool hide = false;
734
735 fState = MFS_ENABLED;
736
737 /* set first entry as default */
738 if (first)
739 {
740 fState |= MFS_DEFAULT;
741 first = false;
742 }
743
744 if (info.Verb.CompareNoCase(L"open") == 0)
745 {
746 idVerbRes = IDS_OPEN_VERB;
747 fState |= MFS_DEFAULT; /* override default when open verb is found */
748 forceFirstPos++;
749 }
750 else if (info.Verb.CompareNoCase(L"explore") == 0)
751 {
752 idVerbRes = IDS_EXPLORE_VERB;
753 if (uFlags & CMF_EXPLORE)
754 {
755 fState |= MFS_DEFAULT;
756 forceFirstPos++;
757 }
758 }
759 else if (info.Verb.CompareNoCase(L"printto") == 0)
760 hide = true;
761 else
762 idVerbRes = 0;
763
764 /* By default use verb for menu item name */
765 mii.dwTypeData = (LPWSTR)info.Verb.GetString();
766
767 WCHAR wszKey[sizeof("shell\\") + MAX_VERB];
768 HRESULT hr = StringCbPrintfW(wszKey, sizeof(wszKey), L"shell\\%s", info.Verb.GetString());
770 hide = true;
771
772 UINT cmdFlags = 0;
773 HKEY hkVerb;
774 if (RegOpenKeyExW(info.hkClass, wszKey, 0, KEY_READ, &hkVerb) == ERROR_SUCCESS)
775 {
776 if (!(uFlags & CMF_OPTIMIZEFORINVOKE))
777 {
778 DWORD cbVerb = sizeof(wszDispVerb);
779 LONG res = RegLoadMUIStringW(hkVerb, L"MUIVerb", wszDispVerb, cbVerb, NULL, 0, NULL);
780 if (res || !*wszDispVerb)
781 res = RegLoadMUIStringW(hkVerb, NULL, wszDispVerb, cbVerb, NULL, 0, NULL);
782
783 if ((res == ERROR_SUCCESS && *wszDispVerb) ||
784 (idVerbRes && LoadStringW(shell32_hInstance, idVerbRes, wszDispVerb, _countof(wszDispVerb))) ||
785 SUCCEEDED(GetFriendlyVerb(info.Verb, wszDispVerb, _countof(wszDispVerb))))
786 {
787 mii.dwTypeData = wszDispVerb;
788 }
789 }
790 }
791 else
792 {
793 hkVerb = NULL;
794 }
795
796 if (hkVerb)
797 {
798 if (!hide && !(uFlags & CMF_EXTENDEDVERBS))
799 hide = RegValueExists(hkVerb, L"Extended");
800
801 if (!hide)
802 hide = RegValueExists(hkVerb, L"ProgrammaticAccessOnly");
803
804 if (!hide && !(uFlags & CMF_DISABLEDVERBS))
805 hide = RegValueExists(hkVerb, L"LegacyDisable");
806
807 if (DWORD dwRest = (hide ? 0 : RegGetDword(hkVerb, NULL, L"SuppressionPolicy", 0)))
808 hide = SHRestricted((RESTRICTIONS)dwRest);
809
810 if (RegValueExists(hkVerb, L"NeverDefault"))
811 fState &= ~MFS_DEFAULT;
812
813 if (RegValueExists(hkVerb, L"SeparatorBefore"))
814 cmdFlags |= ECF_SEPARATORBEFORE;
815 if (RegValueExists(hkVerb, L"SeparatorAfter"))
816 cmdFlags |= ECF_SEPARATORAFTER;
817
818 RegCloseKey(hkVerb);
819 }
820
821 if (((uFlags & CMF_NODEFAULT) && ntver >= _WIN32_WINNT_VISTA) ||
822 ((uFlags & CMF_DONOTPICKDEFAULT) && ntver >= _WIN32_WINNT_WIN7))
823 {
824 fState &= ~MFS_DEFAULT;
825 }
826
827 if (!hide)
828 {
829 if (cmdFlags & ECF_SEPARATORBEFORE)
830 {
831 if (InsertMenuItemAt(hMenu, *pIndexMenu, MF_SEPARATOR))
832 (*pIndexMenu)++;
833 }
834
835 UINT pos = *pIndexMenu;
836 int verbIndex = hkVerb ? FindVerbInDefaultVerbList(m_DefVerbs, info.Verb) : -1;
837 if (verbIndex >= 0)
838 {
839 if (verbIndex < iDefVerbIndex || iDefVerbIndex < 0)
840 {
841 iDefVerbIndex = verbIndex;
842 fState |= MFS_DEFAULT;
843 forceFirstPos = TRUE;
844 }
845 else
846 {
847 fState &= ~MFS_DEFAULT; // We have already set a better default
848 pos = indexDefault;
849 }
850 }
851 else if (iDefVerbIndex >= 0)
852 {
853 fState &= ~MFS_DEFAULT; // We have already set the default
854 if (forceFirstPos)
855 pos = indexDefault;
856 forceFirstPos = FALSE;
857 }
858
859 mii.fState = fState;
860 mii.wID = iIdCmdFirst + cIds;
861 if (InsertMenuItemW(hMenu, forceFirstPos ? indexFirst : pos, TRUE, &mii))
862 (*pIndexMenu)++;
863
864 if (cmdFlags & ECF_SEPARATORAFTER)
865 {
866 if (InsertMenuItemAt(hMenu, *pIndexMenu, MF_SEPARATOR))
867 (*pIndexMenu)++;
868 }
869
870 if (fState & MFS_DEFAULT)
871 indexDefault = *pIndexMenu; // This is where we want to insert "high priority" verbs
872 }
873 cIds++; // Always increment the id because it acts as the index into m_StaticEntries
874
875 if (mii.wID >= iIdCmdLast)
876 break;
877 }
878
879 return cIds;
880}
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:43
#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
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:33
#define L(x)
Definition: resources.c:13
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:1026
long LONG
Definition: pedump.c:60
#define LoadStringW
Definition: utils.h:64
#define _WIN32_WINNT_WIN7
Definition: sdkddkver.h:28
#define _WIN32_WINNT_VISTA
Definition: sdkddkver.h:25
RESTRICTIONS
Definition: shlobj.h:1658
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:3377
uint16_t * LPWSTR
Definition: typedefs.h:56
#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)

Referenced by QueryContextMenu().

◆ AddStaticEntriesForKey()

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

Definition at line 513 of file CDefaultContextMenu.cpp.

514{
515 WCHAR wszName[VERBKEY_CCHMAX];
516 DWORD cchName, dwIndex = 0;
517 HKEY hShellKey;
518
519 LRESULT lres = RegOpenKeyExW(hKey, L"shell", 0, KEY_READ, &hShellKey);
520 if (lres != STATUS_SUCCESS)
521 return;
522
523 if (!*m_DefVerbs)
524 {
525 DWORD cb = sizeof(m_DefVerbs);
527 }
528
529 while(TRUE)
530 {
531 cchName = _countof(wszName);
532 if (RegEnumKeyExW(hShellKey, dwIndex++, wszName, &cchName, NULL, NULL, NULL, NULL) != ERROR_SUCCESS)
533 break;
534
535 AddStaticEntry(hKey, wszName, uFlags);
536 }
537
538 RegCloseKey(hShellKey);
539}
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
static MonoProfilerRuntimeShutdownBeginCallback cb
Definition: metahost.c:118
#define VERBKEY_CCHMAX
Definition: precomp.h:135
FxAutoRegKey hKey
LONG_PTR LRESULT
Definition: minwindef.h:176
#define STATUS_SUCCESS
Definition: shellext.h:65
_In_ PSID _Out_writes_to_opt_ cchName LPSTR _Inout_ LPDWORD cchName
Definition: winbase.h:2497
#define RRF_RT_REG_SZ
Definition: winreg.h:58

Referenced by QueryContextMenu().

◆ AddStaticEntry()

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

Definition at line 487 of file CDefaultContextMenu.cpp.

488{
489 POSITION it = m_StaticEntries.GetHeadPosition();
490 while (it != NULL)
491 {
492 const StaticShellEntry& info = m_StaticEntries.GetNext(it);
493 if (info.Verb.CompareNoCase(szVerb) == 0)
494 {
495 /* entry already exists */
496 return;
497 }
498 }
499
500 TRACE("adding verb %s\n", debugstr_w(szVerb));
501
502 if (!_wcsicmp(szVerb, L"open") && !(uFlags & CMF_NODEFAULT))
503 {
504 /* open verb is always inserted in front */
505 m_StaticEntries.AddHead({ szVerb, hkeyClass });
506 }
507 else
508 {
509 m_StaticEntries.AddTail({ szVerb, hkeyClass });
510 }
511}
_ACRTIMP int __cdecl _wcsicmp(const wchar_t *, const wchar_t *)
Definition: wcs.c:164
#define debugstr_w
Definition: kernel32.h:32

Referenced by AddStaticEntriesForKey().

◆ BrowserFlagsFromVerb()

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

Definition at line 1386 of file CDefaultContextMenu.cpp.

1387{
1389 HWND hwndTree;
1390 LPCWSTR FlagsName;
1391 WCHAR wszKey[sizeof("shell\\") + MAX_VERB];
1392 HRESULT hr;
1393
1394 if (!m_site)
1395 return 0;
1396
1397 /* Get a pointer to the shell browser */
1399 if (FAILED(hr))
1400 return 0;
1401
1402 /* See if we are in Explore or Browse mode. If the browser's tree is present, we are in Explore mode.*/
1403 if (SUCCEEDED(psb->GetControlWindow(FCW_TREE, &hwndTree)) && hwndTree)
1404 FlagsName = L"ExplorerFlags";
1405 else
1406 FlagsName = L"BrowserFlags";
1407
1409 if (SUCCEEDED(psb->QueryInterface(IID_PPV_ARG(ICommDlgBrowser, &pcdb))))
1410 {
1411 if (LOBYTE(GetVersion()) < 6 || FlagsName[0] == 'E')
1412 return 0; // Don't browse in-place
1413 }
1414
1415 /* Try to get the flag from the verb */
1416 hr = StringCbPrintfW(wszKey, sizeof(wszKey), L"shell\\%s", pEntry->Verb.GetString());
1418 return 0;
1419 return RegGetDword(pEntry->hkClass, wszKey, FlagsName, 0);
1420}
DWORD WINAPI GetVersion(void)
Definition: version.c:1458
HRESULT WINAPI IUnknown_QueryService(IUnknown *obj, REFGUID sid, REFIID iid, void **out)
Definition: main.c:181
PLIST_ENTRY pEntry
Definition: fxioqueue.cpp:4484
#define FAILED(hr)
Definition: intsafe.h:51
#define LOBYTE(W)
Definition: jmemdos.c:487
#define SID_IShellBrowser
const uint16_t * LPCWSTR
Definition: typedefs.h:57
#define IID_PPV_ARG(Itype, ppType)

Referenced by InvokeRegVerb().

◆ DoCopyOrCut()

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

Definition at line 1148 of file CDefaultContextMenu.cpp.

1149{
1150 if (!m_cidl || !m_pDataObj)
1151 return E_FAIL;
1152
1154 if (hr == S_OK)
1155 return hr;
1156
1157 FORMATETC formatetc;
1159 STGMEDIUM medium = {0};
1160 medium.tymed = TYMED_HGLOBAL;
1161 medium.hGlobal = GlobalAlloc(GHND, sizeof(DWORD));
1162 DWORD* pdwFlag = (DWORD*)GlobalLock(medium.hGlobal);
1163 if (pdwFlag)
1164 *pdwFlag = bCopy ? DROPEFFECT_COPY : DROPEFFECT_MOVE;
1165 GlobalUnlock(medium.hGlobal);
1166 m_pDataObj->SetData(&formatetc, &medium, TRUE);
1167
1169 if (SUCCEEDED(IUnknown_QueryService(m_site, SID_SFolderView, IID_PPV_ARG(IShellFolderView, &psfv))))
1170 psfv->SetPoints(m_pDataObj);
1171
1174 return hr;
1175
1176 if (psfv)
1177 psfv->SetClipboard(!bCopy);
1178 return S_OK;
1179}
HRESULT _DoInvokeCommandCallback(LPCMINVOKECOMMANDINFOEX lpcmi, WPARAM CmdId)
HRESULT WINAPI OleSetClipboard(IDataObject *data)
Definition: clipboard.c:2192
#define InitFormatEtc(fe, cf, med)
Definition: editor.h:32
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
static ERESOURCE GlobalLock
Definition: sys_arch.c:8
#define CFSTR_PREFERREDDROPEFFECT
Definition: shlobj.h:570
#define DFM_CMD_COPY
Definition: shlobj.h:2628
#define DFM_CMD_MOVE
Definition: shlobj.h:2627
#define GHND
Definition: winbase.h:321
UINT WINAPI RegisterClipboardFormatW(_In_ LPCWSTR)

Referenced by InvokeCommand().

◆ DoCreateLink()

HRESULT CDefaultContextMenu::DoCreateLink ( LPCMINVOKECOMMANDINFOEX  lpcmi)
private

Definition at line 1109 of file CDefaultContextMenu.cpp.

1110{
1112 if (hr == S_OK)
1113 return hr;
1114
1115 if (!m_cidl || !m_pDataObj)
1116 return E_FAIL;
1117
1119 hr = m_psf->CreateViewObject(NULL, IID_PPV_ARG(IDropTarget, &pDT));
1121 return hr;
1122
1124
1125 return S_OK;
1126}
BOOL WINAPI SHSimulateDrop(IDropTarget *pDrop, IDataObject *pDataObj, DWORD grfKeyState, PPOINTL lpPt, DWORD *pdwEffect)
Definition: ordinal.c:1423
#define DFM_CMD_LINK
Definition: shlobj.h:2629
#define MK_SHIFT
Definition: winuser.h:2405
#define MK_CONTROL
Definition: winuser.h:2406

Referenced by InvokeCommand().

◆ DoCreateNewFolder()

HRESULT CDefaultContextMenu::DoCreateNewFolder ( LPCMINVOKECOMMANDINFOEX  lpici)
private

Definition at line 1235 of file CDefaultContextMenu.cpp.

1237{
1238 WCHAR wszPath[MAX_PATH];
1239 WCHAR wszName[MAX_PATH];
1240 WCHAR wszNewFolder[25];
1241 HRESULT hr;
1242
1243 /* Get folder path */
1246 return hr;
1247
1248 if (!LoadStringW(shell32_hInstance, IDS_NEWFOLDER, wszNewFolder, _countof(wszNewFolder)))
1249 return E_FAIL;
1250
1251 /* Create the name of the new directory */
1252 if (!PathYetAnotherMakeUniqueName(wszName, wszPath, NULL, wszNewFolder))
1253 return E_FAIL;
1254
1255 /* Create the new directory and show the appropriate dialog in case of error */
1256 if (SHCreateDirectory(lpici->hwnd, wszName) != ERROR_SUCCESS)
1257 return E_FAIL;
1258
1259 /* Show and select the new item in the def view */
1260 LPITEMIDLIST pidl;
1261 PITEMID_CHILD pidlNewItem;
1263
1264 /* Notify the view object about the new item */
1266
1267 if (!m_site)
1268 return S_OK;
1269
1270 /* Get a pointer to the shell view */
1271 hr = IUnknown_QueryService(m_site, SID_SFolderView, IID_PPV_ARG(IShellView, &psv));
1273 return S_OK;
1274
1275 /* Attempt to get the pidl of the new item */
1276 hr = SHILCreateFromPathW(wszName, &pidl, NULL);
1278 return hr;
1279
1280 pidlNewItem = ILFindLastID(pidl);
1281
1282 hr = psv->SelectItem(pidlNewItem, SVSI_DESELECTOTHERS | SVSI_EDIT | SVSI_ENSUREVISIBLE |
1283 SVSI_FOCUSED | SVSI_SELECT);
1285 return hr;
1286
1287 SHFree(pidl);
1288
1289 return S_OK;
1290}
EXTERN_C void WINAPI SHChangeNotify(LONG wEventId, UINT uFlags, LPCVOID dwItem1, LPCVOID dwItem2)
void WINAPI SHFree(LPVOID pv)
Definition: shellole.c:370
BOOL WINAPI PathYetAnotherMakeUniqueName(LPWSTR buffer, LPCWSTR path, LPCWSTR shortname, LPCWSTR longname)
Definition: shellpath.c:848
#define IDS_NEWFOLDER
CONST void * LPCVOID
Definition: minwindef.h:164
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:1496
int WINAPI SHCreateDirectory(HWND hWnd, LPCWSTR path)
Definition: shlfileop.cpp:948
#define SHCNE_MKDIR
Definition: shlobj.h:1910
#define SHCNF_FLUSH
Definition: shlobj.h:1946
#define SHCNF_PATHW
Definition: shlobj.h:1943
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41

Referenced by InvokeCommand().

◆ DoDelete()

HRESULT CDefaultContextMenu::DoDelete ( LPCMINVOKECOMMANDINFOEX  lpcmi)
private

Definition at line 1128 of file CDefaultContextMenu.cpp.

1129{
1131 if (hr == S_OK)
1132 return hr;
1133
1134 if (!m_cidl || !m_pDataObj)
1135 return E_FAIL;
1136
1140 return hr;
1141
1142 DWORD grfKeyState = (lpcmi->fMask & CMIC_MASK_SHIFT_DOWN) ? MK_SHIFT : 0;
1143 SHSimulateDrop(pDT, m_pDataObj, grfKeyState, NULL, NULL);
1144
1145 return S_OK;
1146}
HRESULT CRecyclerDropTarget_CreateInstance(REFIID riid, LPVOID *ppvOut)
#define DFM_CMD_DELETE
Definition: shlobj.h:2626

Referenced by InvokeCommand().

◆ DoPaste()

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

Definition at line 1055 of file CDefaultContextMenu.cpp.

1056{
1058 if (hr == S_OK)
1059 return hr;
1060
1062 hr = OleGetClipboard(&pda);
1064 return hr;
1065
1066 FORMATETC formatetc2;
1067 STGMEDIUM medium2;
1069
1070 DWORD dwKey= 0;
1071
1072 if (SUCCEEDED(pda->GetData(&formatetc2, &medium2)))
1073 {
1074 DWORD * pdwFlag = (DWORD*)GlobalLock(medium2.hGlobal);
1075 if (pdwFlag)
1076 {
1077 if (*pdwFlag == DROPEFFECT_COPY)
1078 dwKey = MK_CONTROL;
1079 else
1080 dwKey = MK_SHIFT;
1081 }
1082 else
1083 {
1084 ERR("No drop effect obtained\n");
1085 }
1086 GlobalUnlock(medium2.hGlobal);
1087 }
1088
1089 if (bLink)
1090 {
1091 dwKey = MK_CONTROL|MK_SHIFT;
1092 }
1093
1095 if (m_cidl)
1096 hr = m_psf->GetUIObjectOf(NULL, 1, &m_apidl[0], IID_NULL_PPV_ARG(IDropTarget, &pdrop));
1097 else
1098 hr = m_psf->CreateViewObject(NULL, IID_PPV_ARG(IDropTarget, &pdrop));
1099
1101 return hr;
1102
1103 SHSimulateDrop(pdrop, pda, dwKey, NULL, NULL);
1104
1105 TRACE("CP result %x\n", hr);
1106 return S_OK;
1107}
#define ERR(fmt,...)
Definition: precomp.h:57
HRESULT WINAPI OleGetClipboard(IDataObject **obj)
Definition: clipboard.c:2246
#define DFM_CMD_PASTE
Definition: shlobj.h:2632
#define IID_NULL_PPV_ARG(Itype, ppType)

Referenced by InvokeCommand().

◆ DoProperties()

HRESULT CDefaultContextMenu::DoProperties ( LPCMINVOKECOMMANDINFOEX  lpcmi)
private

Definition at line 1212 of file CDefaultContextMenu.cpp.

1214{
1216
1217 // We are asked to run the default property sheet
1218 if (hr == S_FALSE)
1219 {
1221 }
1222
1223 return hr;
1224}
HRESULT SHELL32_ShowPropertiesDialog(IDataObject *pdtobj)
Definition: shlfolder.cpp:648
#define DFM_CMD_PROPERTIES
Definition: shlobj.h:2630
#define S_FALSE
Definition: winerror.h:3451

Referenced by InvokeCommand().

◆ DoRename()

HRESULT CDefaultContextMenu::DoRename ( LPCMINVOKECOMMANDINFOEX  lpcmi)
private

Definition at line 1181 of file CDefaultContextMenu.cpp.

1182{
1184 HRESULT hr;
1185
1187 if (hr == S_OK)
1188 return hr;
1189
1190 if (!m_site || !m_cidl)
1191 return E_FAIL;
1192
1193 /* Get a pointer to the shell browser */
1196 return hr;
1197
1199 hr = psb->QueryActiveShellView(&lpSV);
1201 return hr;
1202
1203 SVSIF selFlags = SVSI_DESELECTOTHERS | SVSI_EDIT | SVSI_ENSUREVISIBLE | SVSI_FOCUSED | SVSI_SELECT;
1204 hr = lpSV->SelectItem(m_apidl[0], selFlags);
1206 return hr;
1207
1208 return S_OK;
1209}
#define DFM_CMD_RENAME
Definition: shlobj.h:2638

Referenced by InvokeCommand().

◆ DoUndo()

HRESULT CDefaultContextMenu::DoUndo ( LPCMINVOKECOMMANDINFOEX  lpcmi)
private

Definition at line 1227 of file CDefaultContextMenu.cpp.

1228{
1229 ERR("TODO: Undo\n");
1230 return E_NOTIMPL;
1231}

Referenced by InvokeCommand().

◆ EnumerateDynamicContextHandlerForKey()

BOOL CDefaultContextMenu::EnumerateDynamicContextHandlerForKey ( HKEY  hRootKey)
private

Definition at line 617 of file CDefaultContextMenu.cpp.

618{
619 WCHAR wszName[MAX_PATH], wszBuf[MAX_PATH], *pwszClsid;
621 HRESULT hr;
622 HKEY hKey;
623
624 if (RegOpenKeyExW(hRootKey, L"shellex\\ContextMenuHandlers", 0, KEY_READ, &hKey) != ERROR_SUCCESS)
625 {
626 TRACE("RegOpenKeyExW failed\n");
627 return FALSE;
628 }
629
630 DWORD dwIndex = 0;
631 while (TRUE)
632 {
633 cchName = _countof(wszName);
634 if (RegEnumKeyExW(hKey, dwIndex++, wszName, &cchName, NULL, NULL, NULL, NULL) != ERROR_SUCCESS)
635 break;
636
637 /* Key name or key value is CLSID */
638 CLSID clsid;
639 hr = CLSIDFromString(wszName, &clsid);
640 if (hr == S_OK)
641 pwszClsid = wszName;
642 else
643 {
644 DWORD cchBuf = _countof(wszBuf);
645 if (RegGetValueW(hKey, wszName, NULL, RRF_RT_REG_SZ, NULL, wszBuf, &cchBuf) == ERROR_SUCCESS)
646 hr = CLSIDFromString(wszBuf, &clsid);
647 pwszClsid = wszBuf;
648 }
649
650 if (FAILED(hr))
651 {
652 ERR("CLSIDFromString failed for clsid %S hr 0x%x\n", pwszClsid, hr);
653 continue;
654 }
655
657 {
659 L"Software\\Microsoft\\Windows\\CurrentVersion\\Shell Extensions\\Approved",
660 pwszClsid,
662 NULL,
663 NULL,
665 {
666 ERR("Shell extension %s not approved!\n", pwszClsid);
667 continue;
668 }
669 }
670
672 if (FAILED(hr))
673 WARN("Failed to get context menu entires from shell extension! clsid: %S\n", pwszClsid);
674 }
675
677 return TRUE;
678}
#define WARN(fmt,...)
Definition: precomp.h:61
HRESULT LoadDynamicContextMenuHandler(HKEY hKey, REFCLSID clsid)
HRESULT WINAPI CLSIDFromString(LPCOLESTR str, LPCLSID clsid)
Definition: combase.c:1470
const CLSID * clsid
Definition: msctf.cpp:50
_In_ UINT cchBuf
Definition: shlwapi.h:378
#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 1722 of file CDefaultContextMenu.cpp.

1728{
1729 /* We don't handle the help text yet */
1730 if (uFlags == GCS_HELPTEXTA ||
1731 uFlags == GCS_HELPTEXTW ||
1732 HIWORD(idCommand) != 0)
1733 {
1734 return E_NOTIMPL;
1735 }
1736
1737 UINT CmdId = LOWORD(idCommand);
1738
1739 if (uFlags == GCS_VERBA || uFlags == GCS_VERBW)
1740 {
1741 UINT uMsg = (uFlags == GCS_VERBA) ? DFM_GETVERBA : DFM_GETVERBW;
1742 WPARAM wParam = MAKEWPARAM(idCommand, uMaxNameLen);
1743 HRESULT hr = _DoCallback(uMsg, wParam, lpszName);
1744 if (hr == S_OK)
1745 return S_OK;
1746 }
1747
1748 if (!m_DynamicEntries.IsEmpty() && CmdId >= m_iIdSHEFirst && CmdId < m_iIdSHELast)
1749 {
1750 idCommand -= m_iIdSHEFirst;
1752 if (!pEntry)
1753 return E_FAIL;
1754
1755 idCommand -= pEntry->iIdCmdFirst;
1756 return pEntry->pCM->GetCommandString(idCommand,
1757 uFlags,
1758 lpReserved,
1759 lpszName,
1760 uMaxNameLen);
1761 }
1762
1763 if (!m_StaticEntries.IsEmpty() && CmdId >= m_iIdSCMFirst && CmdId < m_iIdSCMLast)
1764 {
1765 /* Validation just returns S_OK on a match. The id exists. */
1766 if (uFlags == GCS_VALIDATEA || uFlags == GCS_VALIDATEW)
1767 return S_OK;
1768
1769 CmdId -= m_iIdSCMFirst;
1770
1771 POSITION it = m_StaticEntries.FindIndex(CmdId);
1772
1773 if (it == NULL)
1774 return E_INVALIDARG;
1775
1777
1778 if (uFlags == GCS_VERBW)
1779 return StringCchCopyW((LPWSTR)lpszName, uMaxNameLen, pEntry->Verb);
1780
1781 if (uFlags == GCS_VERBA)
1782 {
1783 if (SHUnicodeToAnsi(pEntry->Verb, lpszName, uMaxNameLen))
1784 return S_OK;
1785 }
1786
1787 return E_INVALIDARG;
1788 }
1789
1790 //FIXME: Should we handle callbacks here?
1791 if (m_iIdDfltFirst != m_iIdDfltLast && CmdId >= m_iIdDfltFirst && CmdId < m_iIdDfltLast)
1792 {
1793 CmdId -= m_iIdDfltFirst;
1794 /* See the definitions of IDM_CUT and co to see how this works */
1795 CmdId += DCM_FCIDM_SHVIEW_OFFSET;
1796 }
1797
1798 /* Loop looking for a matching Id */
1799 for (UINT i = 0; i < _countof(g_StaticInvokeCmdMap); i++)
1800 {
1801 if (g_StaticInvokeCmdMap[i].IntVerb == CmdId)
1802 {
1803 /* Validation just returns S_OK on a match */
1804 if (uFlags == GCS_VALIDATEA || uFlags == GCS_VALIDATEW)
1805 return S_OK;
1806
1807 /* Return a copy of the ANSI verb */
1808 if (uFlags == GCS_VERBA)
1809 return StringCchCopyA(lpszName, uMaxNameLen, g_StaticInvokeCmdMap[i].szStringVerb);
1810
1811 /* Convert the ANSI verb to unicode and return that */
1812 if (uFlags == GCS_VERBW)
1813 {
1814 if (SHAnsiToUnicode(g_StaticInvokeCmdMap[i].szStringVerb, (LPWSTR)lpszName, uMaxNameLen))
1815 return S_OK;
1816 }
1817 }
1818 }
1819
1820 return E_INVALIDARG;
1821}
static const struct _StaticInvokeCommandMap_ g_StaticInvokeCmdMap[]
#define DCM_FCIDM_SHVIEW_OFFSET
PDynamicShellEntry GetDynamicEntry(UINT idCmd)
#define E_INVALIDARG
Definition: ddrawi.h:101
DWORD WINAPI SHUnicodeToAnsi(const WCHAR *src, char *dest, int dest_len)
Definition: main.c:1756
UINT_PTR WPARAM
Definition: minwindef.h:174
#define LOWORD(l)
Definition: pedump.c:82
#define DFM_GETVERBW
Definition: shlobj.h:2620
#define DFM_GETVERBA
Definition: shlobj.h:2621
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:1279
#define MAKEWPARAM(l, h)
Definition: winuser.h:4117

◆ GetDynamicEntry()

PDynamicShellEntry CDefaultContextMenu::GetDynamicEntry ( UINT  idCmd)
private

Definition at line 1292 of file CDefaultContextMenu.cpp.

1293{
1294 POSITION it = m_DynamicEntries.GetHeadPosition();
1295 while (it != NULL)
1296 {
1298
1299 if (idCmd >= info.iIdCmdFirst + info.NumIds)
1300 continue;
1301
1302 if (idCmd < info.iIdCmdFirst || idCmd > info.iIdCmdFirst + info.NumIds)
1303 return NULL;
1304
1305 return &info;
1306 }
1307
1308 return NULL;
1309}

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

◆ GetNoAssocError()

HRESULT CDefaultContextMenu::GetNoAssocError ( )
inlineprivate

Definition at line 341 of file CDefaultContextMenu.cpp.

342 {
344 }
#define HResultFromWin32
Definition: loader.cpp:14
#define ERROR_NO_ASSOCIATION
Definition: winerror.h:1001

Referenced by InvokeCommand().

◆ GetSite()

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

Definition at line 1895 of file CDefaultContextMenu.cpp.

1896{
1897 if (!m_site)
1898 return E_FAIL;
1899
1900 return m_site->QueryInterface(riid, ppvSite);
1901}
REFIID riid
Definition: atlbase.h:39

◆ HandleMenuMsg()

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

Implements IContextMenu2.

Definition at line 1825 of file CDefaultContextMenu.cpp.

1829{
1830 return HandleMenuMsg2(uMsg, wParam, lParam, NULL);
1831}
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 1852 of file CDefaultContextMenu.cpp.

1857{
1858 if (!SHELL_IsContextMenuMsg(uMsg))
1859 return E_FAIL;
1860
1861 UINT CmdId;
1862 if (uMsg == WM_INITMENUPOPUP)
1863 {
1864 CmdId = GetMenuItemID((HMENU)wParam, 0);
1865 if (CmdId == ~0ul)
1866 return E_FAIL;
1867 }
1868 else
1869 {
1870 HRESULT hr = SHGetMenuIdFromMenuMsg(uMsg, lParam, &CmdId);
1871 if (FAILED(hr))
1872 return S_FALSE;
1873 }
1874 CmdId -= m_iIdQCMFirst; // Convert from Win32 id to our base
1875
1876 if (CmdId >= m_iIdSHEFirst && CmdId < m_iIdSHELast)
1877 {
1879 return SHForwardContextMenuMsg(pEntry->pCM, uMsg, wParam, lParam, plResult, TRUE);
1880 }
1881 // TODO: _DoCallback(DFM_WM_*, ...)
1882 return E_FAIL;
1883}
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:60
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:759
UINT WINAPI GetMenuItemID(_In_ HMENU, _In_ int)
#define WM_INITMENUPOPUP
Definition: winuser.h:1774

Referenced by HandleMenuMsg().

◆ Initialize()

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

Definition at line 423 of file CDefaultContextMenu.cpp.

424{
425 TRACE("cidl %u\n", pdcm->cidl);
426
427 HRESULT hr = S_OK;
428 if (!pdcm->pcmcb && !lpfn)
429 {
430 ERR("CDefaultContextMenu needs a callback!\n");
431 return E_INVALIDARG;
432 }
433
434 m_cidl = pdcm->cidl;
436 if (m_cidl && !m_apidl)
437 return E_OUTOFMEMORY;
438 m_psf = pdcm->psf;
439 m_pmcb = pdcm->pcmcb;
440 m_pfnmcb = lpfn;
441 m_hwnd = pdcm->hwnd;
442
443 for (UINT i = 0; i < pdcm->cKeys; ++i)
444 {
445 if (i >= _countof(m_aKeys))
447 else if ((m_aKeys[i] = SHRegDuplicateHKey(pdcm->aKeys[i])) != NULL)
448 m_cKeys++;
449 else
451 }
452
453 m_psf->GetUIObjectOf(pdcm->hwnd, m_cidl, m_apidl, IID_NULL_PPV_ARG(IDataObject, &m_pDataObj));
454
455 if (pdcm->pidlFolder)
456 {
458 }
459 else
460 {
462 if (SUCCEEDED(m_psf->QueryInterface(IID_PPV_ARG(IPersistFolder2, &pf))))
463 {
464 if (FAILED(pf->GetCurFolder(&m_pidlFolder)))
465 ERR("GetCurFolder failed\n");
466 }
467 TRACE("pidlFolder %p\n", m_pidlFolder);
468 }
469
470 return hr;
471}
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
HKEY WINAPI SHRegDuplicateHKey(HKEY hKey)
Definition: main.c:1828
PITEMID_CHILD * _ILCopyaPidl(PCUITEMID_CHILD_ARRAY apidlsrc, UINT cidl)
Definition: pidl.c:2631
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
Definition: pidl.c:238
const PCUITEMID_CHILD * PCUITEMID_CHILD_ARRAY
Definition: shtypes.idl:71
IContextMenuCB * pcmcb
Definition: shlobj.h:2568
IShellFolder * psf
Definition: shlobj.h:2570
PCUITEMID_CHILD_ARRAY apidl
Definition: shlobj.h:2572
const HKEY * aKeys
Definition: shlobj.h:2575
PCIDLIST_ABSOLUTE pidlFolder
Definition: shlobj.h:2569

◆ InvokeCommand()

HRESULT WINAPI CDefaultContextMenu::InvokeCommand ( LPCMINVOKECOMMANDINFO  lpcmi)
override

Implements IContextMenu.

Definition at line 1622 of file CDefaultContextMenu.cpp.

1624{
1625 CMINVOKECOMMANDINFOEX LocalInvokeInfo = {};
1627 UINT CmdId;
1628
1629 /* Take a local copy of the fixed members of the
1630 struct as we might need to modify the verb */
1631 memcpy(&LocalInvokeInfo, lpcmi, min(sizeof(LocalInvokeInfo), lpcmi->cbSize));
1632
1633 /* Check if this is a string verb */
1634 if (!IS_INTRESOURCE(LocalInvokeInfo.lpVerb))
1635 {
1636 /* Get the ID which corresponds to this verb, and update our local copy */
1637 if (MapVerbToCmdId((LPVOID)LocalInvokeInfo.lpVerb, &CmdId, FALSE))
1638 LocalInvokeInfo.lpVerb = MAKEINTRESOURCEA(CmdId);
1639 else
1640 return GetNoAssocError();
1641 }
1642 CmdId = LOWORD(LocalInvokeInfo.lpVerb);
1643
1644 if (!m_DynamicEntries.IsEmpty() && CmdId >= m_iIdSHEFirst && CmdId < m_iIdSHELast)
1645 {
1646 LocalInvokeInfo.lpVerb -= m_iIdSHEFirst;
1647 Result = InvokeShellExt(&LocalInvokeInfo);
1648 return Result;
1649 }
1650
1651 if (!m_StaticEntries.IsEmpty() && CmdId >= m_iIdSCMFirst && CmdId < m_iIdSCMLast)
1652 {
1653 LocalInvokeInfo.lpVerb -= m_iIdSCMFirst;
1654 Result = InvokeRegVerb(&LocalInvokeInfo);
1655 // TODO: if (FAILED(Result) && !(lpcmi->fMask & CMIC_MASK_FLAG_NO_UI)) SHELL_ErrorBox(m_pSite, Result);
1656 return Result;
1657 }
1658
1659 if (m_iIdCBFirst != m_iIdCBLast && CmdId >= m_iIdCBFirst && CmdId < m_iIdCBLast)
1660 {
1661 Result = _DoInvokeCommandCallback(&LocalInvokeInfo, CmdId - m_iIdCBFirst);
1662 return Result;
1663 }
1664
1665 if (m_iIdDfltFirst != m_iIdDfltLast && CmdId >= m_iIdDfltFirst && CmdId < m_iIdDfltLast)
1666 {
1667 CmdId -= m_iIdDfltFirst;
1668 /* See the definitions of IDM_CUT and co to see how this works */
1669 CmdId += DCM_FCIDM_SHVIEW_OFFSET;
1670 }
1671
1672 if (LocalInvokeInfo.cbSize >= sizeof(CMINVOKECOMMANDINFOEX) && (LocalInvokeInfo.fMask & CMIC_MASK_PTINVOKE))
1673 {
1674 if (m_pDataObj && FAILED_UNEXPECTEDLY(DataObject_SetOffset(m_pDataObj, &LocalInvokeInfo.ptInvoke)))
1675 {
1676 ERR("Unable to add OFFSET to DataObject!\n");
1677 }
1678 }
1679
1680 /* Check if this is a Id */
1681 switch (CmdId)
1682 {
1684 Result = DoPaste(&LocalInvokeInfo, FALSE);
1685 break;
1687 Result = DoPaste(&LocalInvokeInfo, TRUE);
1688 break;
1689 case FCIDM_SHVIEW_COPY:
1690 case FCIDM_SHVIEW_CUT:
1691 Result = DoCopyOrCut(&LocalInvokeInfo, CmdId == FCIDM_SHVIEW_COPY);
1692 break;
1694 Result = DoCreateLink(&LocalInvokeInfo);
1695 break;
1697 Result = DoDelete(&LocalInvokeInfo);
1698 break;
1700 Result = DoRename(&LocalInvokeInfo);
1701 break;
1703 Result = DoProperties(&LocalInvokeInfo);
1704 break;
1706 Result = DoCreateNewFolder(&LocalInvokeInfo);
1707 break;
1708 case FCIDM_SHVIEW_UNDO:
1709 Result = DoUndo(&LocalInvokeInfo);
1710 break;
1711 default:
1713 ERR("Unhandled Verb %xl\n", LOWORD(LocalInvokeInfo.lpVerb));
1714 break;
1715 }
1716
1717 return Result;
1718}
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 DoProperties(LPCMINVOKECOMMANDINFOEX lpcmi)
HRESULT DoCreateNewFolder(LPCMINVOKECOMMANDINFOEX lpici)
HRESULT DoPaste(LPCMINVOKECOMMANDINFOEX lpcmi, BOOL bLink)
HRESULT InvokeShellExt(LPCMINVOKECOMMANDINFOEX lpcmi)
#define IS_INTRESOURCE(x)
Definition: loader.c:613
struct IContextMenu::tagCMInvokeCommandInfoEx CMINVOKECOMMANDINFOEX
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define min(a, b)
Definition: monoChain.cc:55
#define FCIDM_SHVIEW_CUT
Definition: shresdef.h:871
#define FCIDM_SHVIEW_UNDO
Definition: shresdef.h:874
#define FCIDM_SHVIEW_COPY
Definition: shresdef.h:872
#define FCIDM_SHVIEW_INSERTLINK
Definition: shresdef.h:875
#define FCIDM_SHVIEW_NEWFOLDER
Definition: shresdef.h:893
#define FCIDM_SHVIEW_PROPERTIES
Definition: shresdef.h:870
#define FCIDM_SHVIEW_DELETE
Definition: shresdef.h:868
#define FCIDM_SHVIEW_RENAME
Definition: shresdef.h:869
#define FCIDM_SHVIEW_CREATELINK
Definition: shresdef.h:867
#define FCIDM_SHVIEW_INSERT
Definition: shresdef.h:873
#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 1448 of file CDefaultContextMenu.cpp.

1449{
1450 const BOOL unicode = IsUnicode(*lpcmi);
1451
1452 LPITEMIDLIST pidlFull = ILCombine(m_pidlFolder, pidl);
1453 if (pidlFull == NULL)
1454 {
1455 return E_FAIL;
1456 }
1457
1458 WCHAR wszPath[MAX_PATH];
1459 BOOL bHasPath = SHGetPathFromIDListW(pidlFull, wszPath);
1460
1461 WCHAR wszDir[MAX_PATH];
1462
1463 SHELLEXECUTEINFOW sei = { sizeof(sei) };
1464 sei.fMask = SEE_MASK_CLASSKEY | SEE_MASK_IDLIST | (CmicFlagsToSeeFlags(lpcmi->fMask) & ~SEE_MASK_INVOKEIDLIST);
1465 sei.hwnd = lpcmi->hwnd;
1466 sei.nShow = lpcmi->nShow;
1467 sei.lpVerb = pEntry->Verb;
1468 sei.lpIDList = pidlFull;
1469 sei.hkeyClass = pEntry->hkClass;
1470 sei.dwHotKey = lpcmi->dwHotKey;
1471 sei.hIcon = lpcmi->hIcon;
1472 sei.lpDirectory = wszDir;
1473
1474 if (unicode && !StrIsNullOrEmpty(lpcmi->lpDirectoryW))
1475 {
1476 sei.lpDirectory = lpcmi->lpDirectoryW;
1477 }
1478 else if (bHasPath)
1479 {
1480 wcscpy(wszDir, wszPath);
1481 PathRemoveFileSpec(wszDir);
1482 }
1483 else
1484 {
1485 if (!SHGetPathFromIDListW(m_pidlFolder, wszDir))
1486 *wszDir = UNICODE_NULL;
1487 }
1488
1489 if (bHasPath)
1490 sei.lpFile = wszPath;
1491
1492 CComHeapPtr<WCHAR> pszParamsW;
1493 if (unicode && !StrIsNullOrEmpty(lpcmi->lpParametersW))
1494 sei.lpParameters = lpcmi->lpParametersW;
1495 else if (!StrIsNullOrEmpty(lpcmi->lpParameters) && __SHCloneStrAtoW(&pszParamsW, lpcmi->lpParameters))
1496 sei.lpParameters = pszParamsW;
1497
1498 if (!sei.lpClass && (lpcmi->fMask & (CMIC_MASK_HASLINKNAME | CMIC_MASK_HASTITLE)) && unicode)
1499 sei.lpClass = lpcmi->lpTitleW; // Forward .lnk path from CShellLink::DoOpen (for consrv STARTF_TITLEISLINKNAME)
1500
1502 ILFree(pidlFull);
1503 return hr;
1504}
void WINAPI ILFree(LPITEMIDLIST pidl)
Definition: pidl.c:1051
LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: pidl.c:817
#define PathRemoveFileSpec
Definition: shlwapi.h:504
wcscpy
static __inline LPWSTR __SHCloneStrAtoW(WCHAR **target, const char *source)
Definition: shell32_main.h:227
#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:2732
LPCWSTR lpDirectory
Definition: shellapi.h:340
LPCWSTR lpParameters
Definition: shellapi.h:339
DWORD WINAPI GetLastError(void)
Definition: except.c:1042

Referenced by InvokeRegVerb().

◆ InvokeRegVerb()

HRESULT CDefaultContextMenu::InvokeRegVerb ( LPCMINVOKECOMMANDINFOEX  lpcmi)
private

Definition at line 1507 of file CDefaultContextMenu.cpp.

1509{
1510 INT iCmd = LOWORD(lpcmi->lpVerb);
1511 HRESULT hr;
1512 UINT i;
1513
1514 POSITION it = m_StaticEntries.FindIndex(iCmd);
1515
1516 if (it == NULL)
1518
1520
1521 CRegKey VerbKey;
1522 WCHAR VerbKeyPath[sizeof("shell\\") + MAX_VERB];
1523 hr = StringCbPrintfW(VerbKeyPath, sizeof(VerbKeyPath), L"shell\\%s", pEntry->Verb.GetString());
1524 if (SUCCEEDED(hr) && m_pDataObj &&
1525 VerbKey.Open(pEntry->hkClass, VerbKeyPath, KEY_READ) == ERROR_SUCCESS)
1526 {
1527 CLSID clsid;
1528
1529 DWORD KeyState = 0;
1530 if (lpcmi->fMask & CMIC_MASK_SHIFT_DOWN)
1531 KeyState |= MK_SHIFT;
1532 if (lpcmi->fMask & CMIC_MASK_CONTROL_DOWN)
1533 KeyState |= MK_CONTROL;
1534
1535 POINTL *pPtl = NULL;
1536 C_ASSERT(sizeof(POINT) == sizeof(POINTL));
1537 if (lpcmi->fMask & CMIC_MASK_PTINVOKE)
1538 pPtl = (POINTL*)&lpcmi->ptInvoke;
1539
1541 hr = SHELL_GetRegCLSID(VerbKey, L"command", L"DelegateExecute", clsid);
1542 if (SUCCEEDED(hr))
1543 hr = CoCreateInstance(clsid, NULL, CLSCTX_ALL, IID_PPV_ARG(IExecuteCommand, &pEC));
1544 if (SUCCEEDED(hr))
1545 {
1548 return InvokeIExecuteCommandWithDataObject(pEC, pEntry->Verb.GetString(), pPB, m_pDataObj,
1549 lpcmi, static_cast<IContextMenu*>(this));
1550 }
1551
1553 hr = SHELL_GetRegCLSID(VerbKey, L"DropTarget", L"CLSID", clsid);
1554 if (SUCCEEDED(hr))
1555 hr = CoCreateInstance(clsid, NULL, CLSCTX_ALL, IID_PPV_ARG(IDropTarget, &pDT));
1556 if (SUCCEEDED(hr))
1557 {
1558 CScopedSetObjectWithSite site(pDT, static_cast<IContextMenu*>(this));
1561 IUnknown_InitializeCommand(pDT, pEntry->Verb.GetString(), pPB);
1562 hr = SHSimulateDrop(pDT, m_pDataObj, KeyState, pPtl, NULL);
1563 return hr;
1564 }
1565 }
1566
1567 /* Get the browse flags to see if we need to browse */
1569
1570 for (i=0; i < m_cidl; i++)
1571 {
1572 /* Check if we need to browse */
1573 if (wFlags)
1574 {
1575 hr = TryToBrowse(lpcmi, m_apidl[i], wFlags);
1576 if (SUCCEEDED(hr))
1577 {
1578 /* In WinXP if we have browsed, we don't open any more folders.
1579 * In Win7 we browse to the first folder we find and
1580 * open new windows for each of the rest of the folders */
1582 if (ntver >= _WIN32_WINNT_VISTA)
1583 wFlags = 0; // FIXME: = SBSP_NEWBROWSER | (wFlags & ~SBSP_SAMEBROWSER);
1584 else
1585 i = m_cidl;
1586
1587 continue;
1588 }
1589 }
1590
1591 InvokePidl(lpcmi, m_apidl[i], pEntry);
1592 }
1593
1594 return S_OK;
1595}
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, IUnknown *outer, DWORD cls_context, REFIID riid, void **obj)
Definition: combase.c:1685
EXTERN_C HRESULT IUnknown_InitializeCommand(_In_ IUnknown *pUnk, _In_ PCWSTR pszCommandName, _In_opt_ IPropertyBag *pPB)
Definition: utils.cpp:1725
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:1775
HRESULT WINAPI SHCreatePropertyBagOnRegKey(HKEY hKey, LPCWSTR subkey, DWORD grfMode, REFIID riid, void **ppv)
Definition: ordinal.c:4641
#define C_ASSERT(e)
Definition: intsafe.h:73
static IActiveScriptSite * site
Definition: script.c:149
#define STGM_READ
Definition: objbase.h:936
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 1370 of file CDefaultContextMenu.cpp.

1372{
1373 TRACE("verb %p first %x last %x\n", lpcmi->lpVerb, m_iIdSHEFirst, m_iIdSHELast);
1374
1375 UINT idCmd = LOWORD(lpcmi->lpVerb);
1377 if (!pEntry)
1378 return E_FAIL;
1379
1380 /* invoke the dynamic context menu */
1381 lpcmi->lpVerb = MAKEINTRESOURCEA(idCmd - pEntry->iIdCmdFirst);
1382 return pEntry->pCM->InvokeCommand((LPCMINVOKECOMMANDINFO)lpcmi);
1383}

Referenced by InvokeCommand().

◆ IsShellExtensionAlreadyLoaded()

BOOL CDefaultContextMenu::IsShellExtensionAlreadyLoaded ( REFCLSID  clsid)
private

Definition at line 563 of file CDefaultContextMenu.cpp.

564{
565 POSITION it = m_DynamicEntries.GetHeadPosition();
566 while (it != NULL)
567 {
568 const DynamicShellEntry& info = m_DynamicEntries.GetNext(it);
569 if (info.ClassID == clsid)
570 return TRUE;
571 }
572
573 return FALSE;
574}

Referenced by LoadDynamicContextMenuHandler().

◆ LoadDynamicContextMenuHandler()

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

Definition at line 577 of file CDefaultContextMenu.cpp.

578{
579 HRESULT hr;
580 TRACE("LoadDynamicContextMenuHandler entered with This %p hKey %p pclsid %s\n", this, hKey, wine_dbgstr_guid(&clsid));
581
583 return S_OK;
584
587 if (FAILED(hr))
588 {
589 ERR("SHCoCreateInstance(IContextMenu) failed.clsid %s hr 0x%x\n", wine_dbgstr_guid(&clsid), hr);
590 return hr;
591 }
592
593 CComPtr<IShellExtInit> pExtInit;
594 hr = pcm->QueryInterface(IID_PPV_ARG(IShellExtInit, &pExtInit));
595 if (FAILED(hr))
596 {
597 ERR("IContextMenu->QueryInterface(IShellExtInit) failed.clsid %s hr 0x%x\n", wine_dbgstr_guid(&clsid), hr);
598 return hr;
599 }
600
601 hr = pExtInit->Initialize(m_pDataObj ? NULL : m_pidlFolder, m_pDataObj, hKey);
602 if (FAILED(hr))
603 {
604 WARN("IShellExtInit::Initialize failed.clsid %s hr 0x%x\n", wine_dbgstr_guid(&clsid), hr);
605 return hr;
606 }
607
608 if (m_site)
610
611 m_DynamicEntries.AddTail({ 0, 0, clsid, pcm });
612
613 return S_OK;
614}
BOOL IsShellExtensionAlreadyLoaded(REFCLSID clsid)
HRESULT WINAPI SHCoCreateInstance(LPCWSTR aclsid, const CLSID *clsid, LPUNKNOWN pUnkOuter, REFIID riid, LPVOID *ppv)
Definition: shellole.c:197
static __inline const char * wine_dbgstr_guid(const GUID *id)
Definition: debug.h:171

Referenced by EnumerateDynamicContextHandlerForKey().

◆ MapVerbToCmdId()

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

Definition at line 1312 of file CDefaultContextMenu.cpp.

1313{
1314 WCHAR UnicodeStr[MAX_VERB];
1315 UINT i;
1316
1317 /* Loop through all the static verbs looking for a match */
1318 for (i = 0; i < _countof(g_StaticInvokeCmdMap); i++)
1319 {
1320 if (IsUnicode)
1321 {
1322 SHAnsiToUnicode(g_StaticInvokeCmdMap[i].szStringVerb, UnicodeStr, MAX_VERB);
1323 if (!_wcsicmp(UnicodeStr, (LPWSTR)Verb))
1324 {
1325 *idCmd = g_StaticInvokeCmdMap[i].IntVerb;
1326 return TRUE;
1327 }
1328 }
1329 else
1330 {
1331 if (!_stricmp(g_StaticInvokeCmdMap[i].szStringVerb, (LPSTR)Verb))
1332 {
1333 *idCmd = g_StaticInvokeCmdMap[i].IntVerb;
1334 return TRUE;
1335 }
1336 }
1337 }
1338
1339 POSITION it;
1340 HRESULT hr = S_OK;
1341 // Check the registry verbs
1342 if (!IsUnicode)
1343 hr = StringCchPrintfW(UnicodeStr, _countof(UnicodeStr), L"%hs", Verb);
1344 for (i = 0, it = m_StaticEntries.GetHeadPosition(); it && SUCCEEDED(hr); ++i)
1345 {
1346 StaticShellEntry& entry = m_StaticEntries.GetNext(it);
1347 if (!_wcsicmp(entry.Verb, UnicodeStr))
1348 {
1349 *idCmd = m_iIdSCMFirst + i;
1350 return TRUE;
1351 }
1352 }
1353
1354 for (it = m_DynamicEntries.GetHeadPosition(); it != NULL;)
1355 {
1357 if (!entry.NumIds)
1358 continue;
1359 HRESULT hr = ::MapVerbToCmdId(Verb, IsUnicode, entry.pCM, 0, entry.NumIds - 1);
1360 if (SUCCEEDED(hr))
1361 {
1362 *idCmd = m_iIdSHEFirst + entry.iIdCmdFirst + hr;
1363 return TRUE;
1364 }
1365 }
1366 return FALSE; // Note: Even if the verb is "open", we must fail if we can't find a handler
1367}
#define _stricmp
Definition: cat.c:22
uint32_t entry
Definition: isohybrid.c:63
STRSAFEAPI StringCchPrintfW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszFormat,...)
Definition: strsafe.h:530
char * LPSTR
Definition: typedefs.h:51

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

964{
965 HRESULT hr;
966 UINT idCmdNext = m_iIdQCMFirst = idCmdFirst;
967 UINT cIds = 0;
968
969 TRACE("BuildShellItemContextMenu entered\n");
970
971 /* Load static verbs and shell extensions from registry */
972 for (UINT i = 0; i < m_cKeys && !(uFlags & CMF_NOVERBS); i++)
973 {
976 }
977
978 /* Add static context menu handlers */
979 cIds = AddStaticContextMenusToMenu(hMenu, &IndexMenu, idCmdFirst, idCmdLast, uFlags);
980 m_iIdSCMFirst = 0; // FIXME: This should be = idCmdFirst?
981 m_iIdSCMLast = cIds;
982 idCmdNext = idCmdFirst + cIds;
983
984 /* Add dynamic context menu handlers */
985 cIds += AddShellExtensionsToMenu(hMenu, &IndexMenu, idCmdNext, idCmdLast, uFlags);
987 m_iIdSHELast = cIds;
988 idCmdNext = idCmdFirst + cIds;
989 TRACE("SH_LoadContextMenuHandlers first %x last %x\n", m_iIdSHEFirst, m_iIdSHELast);
990
991 /* Now let the callback add its own items */
992 QCMINFO qcminfo = {hMenu, IndexMenu, idCmdNext, idCmdLast, NULL};
994 {
995 UINT added = qcminfo.idCmdFirst - idCmdNext;
996 cIds += added;
997 IndexMenu += added;
999 m_iIdCBLast = cIds;
1000 idCmdNext = idCmdFirst + cIds;
1001 }
1002
1003 //TODO: DFM_MERGECONTEXTMENU_BOTTOM
1004
1005 UINT idDefaultOffset = 0;
1006 BOOL isBackgroundMenu = !m_cidl;
1007 if (!(uFlags & CMF_VERBSONLY) && !isBackgroundMenu)
1008 {
1009 /* Get the attributes of the items */
1010 SFGAOF rfg = SFGAO_BROWSABLE | SFGAO_CANCOPY | SFGAO_CANLINK | SFGAO_CANMOVE | SFGAO_CANDELETE | SFGAO_CANRENAME | SFGAO_HASPROPSHEET | SFGAO_FILESYSTEM | SFGAO_FOLDER;
1011 hr = m_psf->GetAttributesOf(m_cidl, m_apidl, &rfg);
1013 return MAKE_HRESULT(SEVERITY_SUCCESS, 0, cIds);
1014
1015 /* Add the default part of the menu */
1016 HMENU hmenuDefault = LoadMenuW(_AtlBaseModule.GetResourceInstance(), MAKEINTRESOURCEW(MENU_SHV_FILE));
1017
1018 /* Remove uneeded entries */
1019 if (!(rfg & SFGAO_CANMOVE))
1020 DeleteMenu(hmenuDefault, IDM_CUT, MF_BYCOMMAND);
1021 if (!(rfg & SFGAO_CANCOPY))
1022 DeleteMenu(hmenuDefault, IDM_COPY, MF_BYCOMMAND);
1023 if (!((rfg & SFGAO_FILESYSTEM) && HasClipboardData()))
1024 DeleteMenu(hmenuDefault, IDM_INSERT, MF_BYCOMMAND);
1025 if (!(rfg & SFGAO_CANLINK))
1026 DeleteMenu(hmenuDefault, IDM_CREATELINK, MF_BYCOMMAND);
1027 if (!(rfg & SFGAO_CANDELETE))
1028 DeleteMenu(hmenuDefault, IDM_DELETE, MF_BYCOMMAND);
1029 if (!(rfg & SFGAO_CANRENAME) || !(uFlags & CMF_CANRENAME))
1030 DeleteMenu(hmenuDefault, IDM_RENAME, MF_BYCOMMAND);
1031 if (!(rfg & SFGAO_HASPROPSHEET))
1032 DeleteMenu(hmenuDefault, IDM_PROPERTIES, MF_BYCOMMAND);
1033
1034 idDefaultOffset = idCmdNext;
1035 UINT idMax = Shell_MergeMenus(hMenu, GetSubMenu(hmenuDefault, 0), IndexMenu, idCmdNext, idCmdLast, 0);
1036 m_iIdDfltFirst = cIds;
1037 cIds += idMax - idCmdNext;
1038 m_iIdDfltLast = cIds;
1039
1040 DestroyMenu(hmenuDefault);
1041 }
1042
1043 TryPickDefault(hMenu, idCmdFirst, idDefaultOffset, uFlags);
1044
1045 // TODO: DFM_MERGECONTEXTMENU_TOP
1046
1047 // TODO: Remove duplicate verbs. This will be easier when the static items handling
1048 // has been moved to CLSID_ShellFileDefExt so we only have to deal with ShellEx.
1049 // This is a Windows XP+ feature. On an unknown file type, Windows 2000 will
1050 // display both "Open" (openas from Unknown) and "Open with..." (openas from *).
1051
1052 return MAKE_HRESULT(SEVERITY_SUCCESS, 0, cIds);
1053}
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:29
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:911
#define IDM_INSERT
Definition: shresdef.h:909
#define IDM_RENAME
Definition: shresdef.h:912
#define IDM_COPY
Definition: shresdef.h:908
#define IDM_CUT
Definition: shresdef.h:907
#define IDM_CREATELINK
Definition: shresdef.h:910
#define MENU_SHV_FILE
Definition: shresdef.h:905
UINT idCmdFirst
Definition: shlobj.h:1408
#define SEVERITY_SUCCESS
Definition: winerror.h:177
#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)
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
HMENU WINAPI LoadMenuW(_In_opt_ HINSTANCE, _In_ LPCWSTR)

◆ QueryService()

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

Implements IServiceProvider.

Definition at line 367 of file CDefaultContextMenu.cpp.

368 {
369 return IUnknown_QueryService(m_site, svc, riid, ppv);
370 }
REFIID LPVOID * ppv
Definition: atlbase.h:39

◆ SetSite()

HRESULT WINAPI CDefaultContextMenu::SetSite ( IUnknown pUnkSite)
override

Implements IObjectWithSite.

Definition at line 1887 of file CDefaultContextMenu.cpp.

1888{
1889 m_site = pUnkSite;
1890 return S_OK;
1891}

◆ TryPickDefault()

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

Definition at line 922 of file CDefaultContextMenu.cpp.

923{
924 // Are we allowed to pick a default?
925 if ((uFlags & CMF_NODEFAULT) ||
926 ((uFlags & CMF_DONOTPICKDEFAULT) && RosGetProcessEffectiveVersion() >= _WIN32_WINNT_WIN7))
927 {
928 return;
929 }
930
931 // Do we already have a default?
932 if ((int)GetMenuDefaultItem(hMenu, MF_BYPOSITION, 0) != -1)
933 return;
934
935 // Does the view want to pick one?
936 INT_PTR forceDfm = 0;
937 if (SUCCEEDED(_DoCallback(DFM_GETDEFSTATICID, 0, &forceDfm)) && forceDfm)
938 {
939 for (UINT i = 0; i < _countof(g_StaticInvokeCmdMap); ++i)
940 {
941 UINT menuItemId = g_StaticInvokeCmdMap[i].IntVerb + DfltOffset - DCM_FCIDM_SHVIEW_OFFSET;
942 if (g_StaticInvokeCmdMap[i].DfmCmd == forceDfm &&
943 SetMenuDefaultItem(hMenu, menuItemId, MF_BYCOMMAND))
944 {
945 return;
946 }
947 }
948 }
949
950 // Don't want to pick something like cut or delete as the default but
951 // a static or dynamic verb is a good default.
953 SetMenuDefaultItem(hMenu, idCmdFirst, MF_BYCOMMAND);
954}
#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 1423 of file CDefaultContextMenu.cpp.

1425{
1427 HRESULT hr;
1428
1429 if (!m_site)
1430 return E_FAIL;
1431
1432 /* Get a pointer to the shell browser */
1434 if (FAILED(hr))
1435 return hr;
1436
1437 PIDLIST_ABSOLUTE pidl;
1438 hr = SHILCombine(m_pidlFolder, pidlChild, &pidl);
1440 return hr;
1441
1442 hr = psb->BrowseObject(pidl, wFlags & ~SBSP_RELATIVE);
1443 ILFree(pidl);
1444 return hr;
1445}

Referenced by InvokeRegVerb().

Member Data Documentation

◆ m_aKeys

HKEY CDefaultContextMenu::m_aKeys[16]
private

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

Referenced by EnumerateDynamicContextHandlerForKey().

◆ m_cidl

UINT CDefaultContextMenu::m_cidl
private

◆ m_cKeys

UINT CDefaultContextMenu::m_cKeys
private

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

Referenced by _DoCallback(), and Initialize().

◆ m_iIdCBFirst

UINT CDefaultContextMenu::m_iIdCBFirst
private

Definition at line 308 of file CDefaultContextMenu.cpp.

Referenced by InvokeCommand(), and QueryContextMenu().

◆ m_iIdCBLast

UINT CDefaultContextMenu::m_iIdCBLast
private

Definition at line 309 of file CDefaultContextMenu.cpp.

Referenced by InvokeCommand(), and QueryContextMenu().

◆ m_iIdDfltFirst

UINT CDefaultContextMenu::m_iIdDfltFirst
private

Definition at line 310 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 301 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 293 of file CDefaultContextMenu.cpp.

Referenced by _DoCallback(), and Initialize().

◆ m_pidlFolder

PIDLIST_ABSOLUTE CDefaultContextMenu::m_pidlFolder
private

◆ m_pmcb

CComPtr<IContextMenuCB> CDefaultContextMenu::m_pmcb
private

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