ReactOS 0.4.16-dev-1386-g6ed46ba
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 288 of file CDefaultContextMenu.cpp.

Constructor & Destructor Documentation

◆ CDefaultContextMenu()

CDefaultContextMenu::CDefaultContextMenu ( )

Definition at line 383 of file CDefaultContextMenu.cpp.

383 :
384 m_psf(NULL),
385 m_pmcb(NULL),
386 m_pfnmcb(NULL),
387 m_cidl(0),
388 m_apidl(NULL),
390 m_aKeys(NULL),
391 m_cKeys(NULL),
394 m_iIdQCMFirst(0),
395 m_iIdSHEFirst(0),
396 m_iIdSHELast(0),
397 m_iIdSCMFirst(0),
398 m_iIdSCMLast(0),
399 m_iIdCBFirst(0),
400 m_iIdCBLast(0),
402 m_iIdDfltLast(0),
403 m_hwnd(NULL)
404{
406}
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 408 of file CDefaultContextMenu.cpp.

409{
410 for (POSITION it = m_DynamicEntries.GetHeadPosition(); it != NULL;)
411 {
412 const DynamicShellEntry& info = m_DynamicEntries.GetNext(it);
413 IUnknown_SetSite(info.pCM.p, NULL);
414 }
415 m_DynamicEntries.RemoveAll();
416 m_StaticEntries.RemoveAll();
417
418 for (UINT i = 0; i < m_cKeys; i++)
421
422 if (m_pidlFolder)
424 _ILFreeaPidl(const_cast<PITEMID_CHILD *>(m_apidl), m_cidl);
425}
#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 475 of file CDefaultContextMenu.cpp.

476{
477 if (m_pmcb)
478 {
479 return m_pmcb->CallBack(m_psf, m_hwnd, m_pDataObj, uMsg, wParam, (LPARAM)lParam);
480 }
481 else if(m_pfnmcb)
482 {
484 }
485
486 return E_FAIL;
487}
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 1614 of file CDefaultContextMenu.cpp.

1616{
1617 BOOL Unicode = IsUnicode(*lpcmi);
1618 WCHAR lParamBuf[MAX_PATH];
1619 LPARAM lParam = 0;
1620
1621 if (Unicode && lpcmi->lpParametersW)
1622 lParam = (LPARAM)lpcmi->lpParametersW;
1623 else if (lpcmi->lpParameters)
1624 lParam = SHAnsiToUnicode(lpcmi->lpParameters, lParamBuf, _countof(lParamBuf)) ? (LPARAM)lParamBuf : 0;
1625
1626 HRESULT hr;
1627#if 0 // TODO: Try DFM_INVOKECOMMANDEX first.
1628 DFMICS dfmics = { sizeof(DFMICS), lpcmi->fMask, lParam, m_iIdSCMFirst?, m_iIdDfltLast?, (LPCMINVOKECOMMANDINFO)lpcmi, m_site };
1629 hr = _DoCallback(DFM_INVOKECOMMANDEX, CmdId, &dfmics);
1630 if (hr == E_NOTIMPL)
1631#endif
1632 hr = _DoCallback(DFM_INVOKECOMMAND, CmdId, (void*)lParam);
1633 return hr;
1634}
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 683 of file CDefaultContextMenu.cpp.

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

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

516{
517 WCHAR wszName[VERBKEY_CCHMAX];
518 DWORD cchName, dwIndex = 0;
519 HKEY hShellKey;
520
521 LRESULT lres = RegOpenKeyExW(hKey, L"shell", 0, KEY_READ, &hShellKey);
522 if (lres != STATUS_SUCCESS)
523 return;
524
525 if (!*m_DefVerbs)
526 {
527 DWORD cb = sizeof(m_DefVerbs);
529 }
530
531 while(TRUE)
532 {
533 cchName = _countof(wszName);
534 if (RegEnumKeyExW(hShellKey, dwIndex++, wszName, &cchName, NULL, NULL, NULL, NULL) != ERROR_SUCCESS)
535 break;
536
537 AddStaticEntry(hKey, wszName, uFlags);
538 }
539
540 RegCloseKey(hShellKey);
541}
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 489 of file CDefaultContextMenu.cpp.

490{
491 POSITION it = m_StaticEntries.GetHeadPosition();
492 while (it != NULL)
493 {
494 const StaticShellEntry& info = m_StaticEntries.GetNext(it);
495 if (info.Verb.CompareNoCase(szVerb) == 0)
496 {
497 /* entry already exists */
498 return;
499 }
500 }
501
502 TRACE("adding verb %s\n", debugstr_w(szVerb));
503
504 if (!_wcsicmp(szVerb, L"open") && !(uFlags & CMF_NODEFAULT))
505 {
506 /* open verb is always inserted in front */
507 m_StaticEntries.AddHead({ szVerb, hkeyClass });
508 }
509 else
510 {
511 m_StaticEntries.AddTail({ szVerb, hkeyClass });
512 }
513}
#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 1401 of file CDefaultContextMenu.cpp.

1402{
1404 HWND hwndTree;
1405 LPCWSTR FlagsName;
1406 WCHAR wszKey[sizeof("shell\\") + MAX_VERB];
1407 HRESULT hr;
1408
1409 if (!m_site)
1410 return 0;
1411
1412 /* Get a pointer to the shell browser */
1414 if (FAILED(hr))
1415 return 0;
1416
1417 /* See if we are in Explore or Browse mode. If the browser's tree is present, we are in Explore mode.*/
1418 if (SUCCEEDED(psb->GetControlWindow(FCW_TREE, &hwndTree)) && hwndTree)
1419 FlagsName = L"ExplorerFlags";
1420 else
1421 FlagsName = L"BrowserFlags";
1422
1424 if (SUCCEEDED(psb->QueryInterface(IID_PPV_ARG(ICommDlgBrowser, &pcdb))))
1425 {
1426 if (LOBYTE(GetVersion()) < 6 || FlagsName[0] == 'E')
1427 return 0; // Don't browse in-place
1428 }
1429
1430 /* Try to get the flag from the verb */
1431 hr = StringCbPrintfW(wszKey, sizeof(wszKey), L"shell\\%s", pEntry->Verb.GetString());
1433 return 0;
1434 return RegGetDword(pEntry->hkClass, wszKey, FlagsName, 0);
1435}
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 1147 of file CDefaultContextMenu.cpp.

1148{
1149 if (!m_cidl || !m_pDataObj)
1150 return E_FAIL;
1151
1152 FORMATETC formatetc;
1154 STGMEDIUM medium = {0};
1155 medium.tymed = TYMED_HGLOBAL;
1156 medium.hGlobal = GlobalAlloc(GHND, sizeof(DWORD));
1157 DWORD* pdwFlag = (DWORD*)GlobalLock(medium.hGlobal);
1158 if (pdwFlag)
1159 *pdwFlag = bCopy ? DROPEFFECT_COPY : DROPEFFECT_MOVE;
1160 GlobalUnlock(medium.hGlobal);
1161 m_pDataObj->SetData(&formatetc, &medium, TRUE);
1162
1164 if (SUCCEEDED(IUnknown_QueryService(m_site, SID_SFolderView, IID_PPV_ARG(IShellFolderView, &psfv))))
1165 psfv->SetPoints(m_pDataObj);
1166
1169 return hr;
1170
1171 if (psfv)
1172 psfv->SetClipboard(!bCopy);
1173 return S_OK;
1174}
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 1225 of file CDefaultContextMenu.cpp.

1226{
1227 HRESULT hr = E_FAIL;
1228 if (!m_pDataObj)
1229 {
1230 ERR("m_pDataObj is NULL\n");
1231 return hr;
1232 }
1233
1234 CComPtr<IContextMenu> pContextMenu;
1235 if (bCopy)
1236 hr = SHCoCreateInstance(NULL, &CLSID_CopyToMenu, NULL,
1237 IID_PPV_ARG(IContextMenu, &pContextMenu));
1238 else
1239 hr = SHCoCreateInstance(NULL, &CLSID_MoveToMenu, NULL,
1240 IID_PPV_ARG(IContextMenu, &pContextMenu));
1242 return hr;
1243
1245 hr = pContextMenu->QueryInterface(IID_PPV_ARG(IShellExtInit, &pInit));
1247 return hr;
1248
1249 hr = pInit->Initialize(m_pidlFolder, m_pDataObj, NULL);
1251 return hr;
1252
1253 if (bCopy)
1254 lpici->lpVerb = "copyto";
1255 else
1256 lpici->lpVerb = "moveto";
1257
1258 return pContextMenu->InvokeCommand((LPCMINVOKECOMMANDINFO)lpici);
1259}
#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 1116 of file CDefaultContextMenu.cpp.

1117{
1118 if (!m_cidl || !m_pDataObj)
1119 return E_FAIL;
1120
1122 HRESULT hr = m_psf->CreateViewObject(NULL, IID_PPV_ARG(IDropTarget, &pDT));
1124 return hr;
1125
1127
1128 return S_OK;
1129}
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 1263 of file CDefaultContextMenu.cpp.

1265{
1266 WCHAR wszPath[MAX_PATH];
1267 WCHAR wszName[MAX_PATH];
1268 WCHAR wszNewFolder[25];
1269 HRESULT hr;
1270
1271 /* Get folder path */
1274 return hr;
1275
1276 if (!LoadStringW(shell32_hInstance, IDS_NEWFOLDER, wszNewFolder, _countof(wszNewFolder)))
1277 return E_FAIL;
1278
1279 /* Create the name of the new directory */
1280 if (!PathYetAnotherMakeUniqueName(wszName, wszPath, NULL, wszNewFolder))
1281 return E_FAIL;
1282
1283 /* Create the new directory and show the appropriate dialog in case of error */
1284 if (SHCreateDirectory(lpici->hwnd, wszName) != ERROR_SUCCESS)
1285 return E_FAIL;
1286
1287 /* Show and select the new item in the def view */
1288 LPITEMIDLIST pidl;
1289 PITEMID_CHILD pidlNewItem;
1291
1292 /* Notify the view object about the new item */
1294
1295 if (!m_site)
1296 return S_OK;
1297
1298 /* Get a pointer to the shell view */
1299 hr = IUnknown_QueryService(m_site, SID_SFolderView, IID_PPV_ARG(IShellView, &psv));
1301 return S_OK;
1302
1303 /* Attempt to get the pidl of the new item */
1304 hr = SHILCreateFromPathW(wszName, &pidl, NULL);
1306 return hr;
1307
1308 pidlNewItem = ILFindLastID(pidl);
1309
1310 hr = psv->SelectItem(pidlNewItem, SVSI_DESELECTOTHERS | SVSI_EDIT | SVSI_ENSUREVISIBLE |
1311 SVSI_FOCUSED | SVSI_SELECT);
1313 return hr;
1314
1315 SHFree(pidl);
1316
1317 return S_OK;
1318}
EXTERN_C void WINAPI SHChangeNotify(LONG wEventId, UINT uFlags, LPCVOID dwItem1, LPCVOID dwItem2)
void WINAPI SHFree(LPVOID pv)
Definition: shellole.c:337
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:1898
#define SHCNF_FLUSH
Definition: shlobj.h:1934
#define SHCNF_PATHW
Definition: shlobj.h:1931
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 1131 of file CDefaultContextMenu.cpp.

1132{
1133 if (!m_cidl || !m_pDataObj)
1134 return E_FAIL;
1135
1139 return hr;
1140
1141 DWORD grfKeyState = (lpcmi->fMask & CMIC_MASK_SHIFT_DOWN) ? MK_SHIFT : 0;
1142 SHSimulateDrop(pDT, m_pDataObj, grfKeyState, NULL, NULL);
1143
1144 return S_OK;
1145}
HRESULT CRecyclerDropTarget_CreateInstance(REFIID riid, LPVOID *ppvOut)

Referenced by InvokeCommand().

◆ DoOpenOrExplore()

HRESULT CDefaultContextMenu::DoOpenOrExplore ( LPCMINVOKECOMMANDINFOEX  lpcmi)
private

Definition at line 1110 of file CDefaultContextMenu.cpp.

1111{
1113 return E_FAIL;
1114}
#define UNIMPLEMENTED
Definition: ntoskrnl.c:15

Referenced by InvokeCommand().

◆ DoPaste()

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

Definition at line 1057 of file CDefaultContextMenu.cpp.

1058{
1059 HRESULT 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}
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 1203 of file CDefaultContextMenu.cpp.

1205{
1207
1208 // We are asked to run the default property sheet
1209 if (hr == S_FALSE)
1210 {
1212 }
1213
1214 return hr;
1215}
HRESULT _DoInvokeCommandCallback(LPCMINVOKECOMMANDINFOEX lpcmi, WPARAM CmdId)
HRESULT SHELL32_ShowPropertiesDialog(IDataObject *pdtobj)
Definition: shlfolder.cpp:616
#define DFM_CMD_PROPERTIES
Definition: shlobj.h:2618
#define S_FALSE
Definition: winerror.h:2357

Referenced by InvokeCommand().

◆ DoRename()

HRESULT CDefaultContextMenu::DoRename ( LPCMINVOKECOMMANDINFOEX  lpcmi)
private

Definition at line 1176 of file CDefaultContextMenu.cpp.

1177{
1179 HRESULT hr;
1180
1181 if (!m_site || !m_cidl)
1182 return E_FAIL;
1183
1184 /* Get a pointer to the shell browser */
1187 return hr;
1188
1190 hr = psb->QueryActiveShellView(&lpSV);
1192 return hr;
1193
1194 SVSIF selFlags = SVSI_DESELECTOTHERS | SVSI_EDIT | SVSI_ENSUREVISIBLE | SVSI_FOCUSED | SVSI_SELECT;
1195 hr = lpSV->SelectItem(m_apidl[0], selFlags);
1197 return hr;
1198
1199 return S_OK;
1200}

Referenced by InvokeCommand().

◆ DoUndo()

HRESULT CDefaultContextMenu::DoUndo ( LPCMINVOKECOMMANDINFOEX  lpcmi)
private

Definition at line 1218 of file CDefaultContextMenu.cpp.

1219{
1220 ERR("TODO: Undo\n");
1221 return E_NOTIMPL;
1222}

Referenced by InvokeCommand().

◆ EnumerateDynamicContextHandlerForKey()

BOOL CDefaultContextMenu::EnumerateDynamicContextHandlerForKey ( HKEY  hRootKey)
private

Definition at line 619 of file CDefaultContextMenu.cpp.

620{
621 WCHAR wszName[MAX_PATH], wszBuf[MAX_PATH], *pwszClsid;
623 HRESULT hr;
624 HKEY hKey;
625
626 if (RegOpenKeyExW(hRootKey, L"shellex\\ContextMenuHandlers", 0, KEY_READ, &hKey) != ERROR_SUCCESS)
627 {
628 TRACE("RegOpenKeyExW failed\n");
629 return FALSE;
630 }
631
632 DWORD dwIndex = 0;
633 while (TRUE)
634 {
635 cchName = _countof(wszName);
636 if (RegEnumKeyExW(hKey, dwIndex++, wszName, &cchName, NULL, NULL, NULL, NULL) != ERROR_SUCCESS)
637 break;
638
639 /* Key name or key value is CLSID */
640 CLSID clsid;
641 hr = CLSIDFromString(wszName, &clsid);
642 if (hr == S_OK)
643 pwszClsid = wszName;
644 else
645 {
646 DWORD cchBuf = _countof(wszBuf);
647 if (RegGetValueW(hKey, wszName, NULL, RRF_RT_REG_SZ, NULL, wszBuf, &cchBuf) == ERROR_SUCCESS)
648 hr = CLSIDFromString(wszBuf, &clsid);
649 pwszClsid = wszBuf;
650 }
651
652 if (FAILED(hr))
653 {
654 ERR("CLSIDFromString failed for clsid %S hr 0x%x\n", pwszClsid, hr);
655 continue;
656 }
657
659 {
661 L"Software\\Microsoft\\Windows\\CurrentVersion\\Shell Extensions\\Approved",
662 pwszClsid,
664 NULL,
665 NULL,
667 {
668 ERR("Shell extension %s not approved!\n", pwszClsid);
669 continue;
670 }
671 }
672
674 if (FAILED(hr))
675 WARN("Failed to get context menu entires from shell extension! clsid: %S\n", pwszClsid);
676 }
677
679 return TRUE;
680}
#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 1748 of file CDefaultContextMenu.cpp.

1754{
1755 /* We don't handle the help text yet */
1756 if (uFlags == GCS_HELPTEXTA ||
1757 uFlags == GCS_HELPTEXTW ||
1758 HIWORD(idCommand) != 0)
1759 {
1760 return E_NOTIMPL;
1761 }
1762
1763 UINT CmdId = LOWORD(idCommand);
1764
1765 if (!m_DynamicEntries.IsEmpty() && CmdId >= m_iIdSHEFirst && CmdId < m_iIdSHELast)
1766 {
1767 idCommand -= m_iIdSHEFirst;
1769 if (!pEntry)
1770 return E_FAIL;
1771
1772 idCommand -= pEntry->iIdCmdFirst;
1773 return pEntry->pCM->GetCommandString(idCommand,
1774 uFlags,
1775 lpReserved,
1776 lpszName,
1777 uMaxNameLen);
1778 }
1779
1780 if (!m_StaticEntries.IsEmpty() && CmdId >= m_iIdSCMFirst && CmdId < m_iIdSCMLast)
1781 {
1782 /* Validation just returns S_OK on a match. The id exists. */
1783 if (uFlags == GCS_VALIDATEA || uFlags == GCS_VALIDATEW)
1784 return S_OK;
1785
1786 CmdId -= m_iIdSCMFirst;
1787
1788 POSITION it = m_StaticEntries.FindIndex(CmdId);
1789
1790 if (it == NULL)
1791 return E_INVALIDARG;
1792
1794
1795 if (uFlags == GCS_VERBW)
1796 return StringCchCopyW((LPWSTR)lpszName, uMaxNameLen, pEntry->Verb);
1797
1798 if (uFlags == GCS_VERBA)
1799 {
1800 if (SHUnicodeToAnsi(pEntry->Verb, lpszName, uMaxNameLen))
1801 return S_OK;
1802 }
1803
1804 return E_INVALIDARG;
1805 }
1806
1807 //FIXME: Should we handle callbacks here?
1808 if (m_iIdDfltFirst != m_iIdDfltLast && CmdId >= m_iIdDfltFirst && CmdId < m_iIdDfltLast)
1809 {
1810 CmdId -= m_iIdDfltFirst;
1811 /* See the definitions of IDM_CUT and co to see how this works */
1812 CmdId += DCM_FCIDM_SHVIEW_OFFSET;
1813 }
1814
1815 /* Loop looking for a matching Id */
1816 for (UINT i = 0; i < _countof(g_StaticInvokeCmdMap); i++)
1817 {
1818 if (g_StaticInvokeCmdMap[i].IntVerb == CmdId)
1819 {
1820 /* Validation just returns S_OK on a match */
1821 if (uFlags == GCS_VALIDATEA || uFlags == GCS_VALIDATEW)
1822 return S_OK;
1823
1824 /* Return a copy of the ANSI verb */
1825 if (uFlags == GCS_VERBA)
1826 return StringCchCopyA(lpszName, uMaxNameLen, g_StaticInvokeCmdMap[i].szStringVerb);
1827
1828 /* Convert the ANSI verb to unicode and return that */
1829 if (uFlags == GCS_VERBW)
1830 {
1831 if (SHAnsiToUnicode(g_StaticInvokeCmdMap[i].szStringVerb, (LPWSTR)lpszName, uMaxNameLen))
1832 return S_OK;
1833 }
1834 }
1835 }
1836
1837 return E_INVALIDARG;
1838}
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 1320 of file CDefaultContextMenu.cpp.

1321{
1322 POSITION it = m_DynamicEntries.GetHeadPosition();
1323 while (it != NULL)
1324 {
1326
1327 if (idCmd >= info.iIdCmdFirst + info.NumIds)
1328 continue;
1329
1330 if (idCmd < info.iIdCmdFirst || idCmd > info.iIdCmdFirst + info.NumIds)
1331 return NULL;
1332
1333 return &info;
1334 }
1335
1336 return NULL;
1337}

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

◆ GetSite()

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

Definition at line 1912 of file CDefaultContextMenu.cpp.

1913{
1914 if (!m_site)
1915 return E_FAIL;
1916
1917 return m_site->QueryInterface(riid, ppvSite);
1918}
REFIID riid
Definition: atlbase.h:39

◆ HandleMenuMsg()

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

Implements IContextMenu2.

Definition at line 1842 of file CDefaultContextMenu.cpp.

1846{
1847 return HandleMenuMsg2(uMsg, wParam, lParam, NULL);
1848}
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 1869 of file CDefaultContextMenu.cpp.

1874{
1875 if (!SHELL_IsContextMenuMsg(uMsg))
1876 return E_FAIL;
1877
1878 UINT CmdId;
1879 if (uMsg == WM_INITMENUPOPUP)
1880 {
1881 CmdId = GetMenuItemID((HMENU)wParam, 0);
1882 if (CmdId == ~0ul)
1883 return E_FAIL;
1884 }
1885 else
1886 {
1887 HRESULT hr = SHGetMenuIdFromMenuMsg(uMsg, lParam, &CmdId);
1888 if (FAILED(hr))
1889 return S_FALSE;
1890 }
1891 CmdId -= m_iIdQCMFirst; // Convert from Win32 id to our base
1892
1893 if (CmdId >= m_iIdSHEFirst && CmdId < m_iIdSHELast)
1894 {
1896 return SHForwardContextMenuMsg(pEntry->pCM, uMsg, wParam, lParam, plResult, TRUE);
1897 }
1898 // TODO: _DoCallback(DFM_WM_*, ...)
1899 return E_FAIL;
1900}
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 427 of file CDefaultContextMenu.cpp.

428{
429 TRACE("cidl %u\n", pdcm->cidl);
430
431 if (!pdcm->pcmcb && !lpfn)
432 {
433 ERR("CDefaultContextMenu needs a callback!\n");
434 return E_INVALIDARG;
435 }
436
437 m_cidl = pdcm->cidl;
439 if (m_cidl && !m_apidl)
440 return E_OUTOFMEMORY;
441 m_psf = pdcm->psf;
442 m_pmcb = pdcm->pcmcb;
443 m_pfnmcb = lpfn;
444 m_hwnd = pdcm->hwnd;
445
446 m_cKeys = pdcm->cKeys;
447 if (pdcm->cKeys)
448 {
449 m_aKeys = (HKEY*)HeapAlloc(GetProcessHeap(), 0, sizeof(HKEY) * pdcm->cKeys);
450 if (!m_aKeys)
451 return E_OUTOFMEMORY;
452 memcpy(m_aKeys, pdcm->aKeys, sizeof(HKEY) * pdcm->cKeys);
453 }
454
455 m_psf->GetUIObjectOf(pdcm->hwnd, m_cidl, m_apidl, IID_NULL_PPV_ARG(IDataObject, &m_pDataObj));
456
457 if (pdcm->pidlFolder)
458 {
460 }
461 else
462 {
464 if (SUCCEEDED(m_psf->QueryInterface(IID_PPV_ARG(IPersistFolder2, &pf))))
465 {
466 if (FAILED(pf->GetCurFolder(&m_pidlFolder)))
467 ERR("GetCurFolder failed\n");
468 }
469 TRACE("pidlFolder %p\n", m_pidlFolder);
470 }
471
472 return S_OK;
473}
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:2556
IShellFolder * psf
Definition: shlobj.h:2558
PCUITEMID_CHILD_ARRAY apidl
Definition: shlobj.h:2560
const HKEY * aKeys
Definition: shlobj.h:2563
PCIDLIST_ABSOLUTE pidlFolder
Definition: shlobj.h:2557

◆ InvokeCommand()

HRESULT WINAPI CDefaultContextMenu::InvokeCommand ( LPCMINVOKECOMMANDINFO  lpcmi)
override

Implements IContextMenu.

Definition at line 1638 of file CDefaultContextMenu.cpp.

1640{
1641 CMINVOKECOMMANDINFOEX LocalInvokeInfo = {};
1643 UINT CmdId;
1644
1645 /* Take a local copy of the fixed members of the
1646 struct as we might need to modify the verb */
1647 memcpy(&LocalInvokeInfo, lpcmi, min(sizeof(LocalInvokeInfo), lpcmi->cbSize));
1648
1649 /* Check if this is a string verb */
1650 if (!IS_INTRESOURCE(LocalInvokeInfo.lpVerb))
1651 {
1652 /* Get the ID which corresponds to this verb, and update our local copy */
1653 if (MapVerbToCmdId((LPVOID)LocalInvokeInfo.lpVerb, &CmdId, FALSE))
1654 LocalInvokeInfo.lpVerb = MAKEINTRESOURCEA(CmdId);
1655 else
1656 return E_INVALIDARG;
1657 }
1658 CmdId = LOWORD(LocalInvokeInfo.lpVerb);
1659
1660 if (!m_DynamicEntries.IsEmpty() && CmdId >= m_iIdSHEFirst && CmdId < m_iIdSHELast)
1661 {
1662 LocalInvokeInfo.lpVerb -= m_iIdSHEFirst;
1663 Result = InvokeShellExt(&LocalInvokeInfo);
1664 return Result;
1665 }
1666
1667 if (!m_StaticEntries.IsEmpty() && CmdId >= m_iIdSCMFirst && CmdId < m_iIdSCMLast)
1668 {
1669 LocalInvokeInfo.lpVerb -= m_iIdSCMFirst;
1670 Result = InvokeRegVerb(&LocalInvokeInfo);
1671 // TODO: if (FAILED(Result) && !(lpcmi->fMask & CMIC_MASK_FLAG_NO_UI)) SHELL_ErrorBox(m_pSite, Result);
1672 return Result;
1673 }
1674
1675 if (m_iIdCBFirst != m_iIdCBLast && CmdId >= m_iIdCBFirst && CmdId < m_iIdCBLast)
1676 {
1677 Result = _DoInvokeCommandCallback(&LocalInvokeInfo, CmdId - m_iIdCBFirst);
1678 return Result;
1679 }
1680
1681 if (m_iIdDfltFirst != m_iIdDfltLast && CmdId >= m_iIdDfltFirst && CmdId < m_iIdDfltLast)
1682 {
1683 CmdId -= m_iIdDfltFirst;
1684 /* See the definitions of IDM_CUT and co to see how this works */
1685 CmdId += DCM_FCIDM_SHVIEW_OFFSET;
1686 }
1687
1688 if (LocalInvokeInfo.cbSize >= sizeof(CMINVOKECOMMANDINFOEX) && (LocalInvokeInfo.fMask & CMIC_MASK_PTINVOKE))
1689 {
1690 if (m_pDataObj && FAILED_UNEXPECTEDLY(DataObject_SetOffset(m_pDataObj, &LocalInvokeInfo.ptInvoke)))
1691 {
1692 ERR("Unable to add OFFSET to DataObject!\n");
1693 }
1694 }
1695
1696 /* Check if this is a Id */
1697 switch (CmdId)
1698 {
1700 Result = DoPaste(&LocalInvokeInfo, FALSE);
1701 break;
1703 Result = DoPaste(&LocalInvokeInfo, TRUE);
1704 break;
1705 case FCIDM_SHVIEW_OPEN:
1707 Result = DoOpenOrExplore(&LocalInvokeInfo);
1708 break;
1709 case FCIDM_SHVIEW_COPY:
1710 case FCIDM_SHVIEW_CUT:
1711 Result = DoCopyOrCut(&LocalInvokeInfo, CmdId == FCIDM_SHVIEW_COPY);
1712 break;
1714 Result = DoCreateLink(&LocalInvokeInfo);
1715 break;
1717 Result = DoDelete(&LocalInvokeInfo);
1718 break;
1720 Result = DoRename(&LocalInvokeInfo);
1721 break;
1723 Result = DoProperties(&LocalInvokeInfo);
1724 break;
1726 Result = DoCreateNewFolder(&LocalInvokeInfo);
1727 break;
1729 Result = DoCopyToMoveToFolder(&LocalInvokeInfo, TRUE);
1730 break;
1732 Result = DoCopyToMoveToFolder(&LocalInvokeInfo, FALSE);
1733 break;
1734 case FCIDM_SHVIEW_UNDO:
1735 Result = DoUndo(&LocalInvokeInfo);
1736 break;
1737 default:
1739 ERR("Unhandled Verb %xl\n", LOWORD(LocalInvokeInfo.lpVerb));
1740 break;
1741 }
1742
1743 return Result;
1744}
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:863
#define FCIDM_SHVIEW_OPEN
Definition: shresdef.h:888
#define FCIDM_SHVIEW_UNDO
Definition: shresdef.h:866
#define FCIDM_SHVIEW_COPY
Definition: shresdef.h:864
#define FCIDM_SHVIEW_INSERTLINK
Definition: shresdef.h:867
#define FCIDM_SHVIEW_NEWFOLDER
Definition: shresdef.h:885
#define FCIDM_SHVIEW_EXPLORE
Definition: shresdef.h:887
#define FCIDM_SHVIEW_PROPERTIES
Definition: shresdef.h:862
#define FCIDM_SHVIEW_COPYTO
Definition: shresdef.h:868
#define FCIDM_SHVIEW_MOVETO
Definition: shresdef.h:869
#define FCIDM_SHVIEW_DELETE
Definition: shresdef.h:860
#define FCIDM_SHVIEW_RENAME
Definition: shresdef.h:861
#define FCIDM_SHVIEW_CREATELINK
Definition: shresdef.h:859
#define FCIDM_SHVIEW_INSERT
Definition: shresdef.h:865
#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 1463 of file CDefaultContextMenu.cpp.

1464{
1465 const BOOL unicode = IsUnicode(*lpcmi);
1466
1467 LPITEMIDLIST pidlFull = ILCombine(m_pidlFolder, pidl);
1468 if (pidlFull == NULL)
1469 {
1470 return E_FAIL;
1471 }
1472
1473 WCHAR wszPath[MAX_PATH];
1474 BOOL bHasPath = SHGetPathFromIDListW(pidlFull, wszPath);
1475
1476 WCHAR wszDir[MAX_PATH];
1477
1478 SHELLEXECUTEINFOW sei = { sizeof(sei) };
1479 sei.fMask = SEE_MASK_CLASSKEY | SEE_MASK_IDLIST | (CmicFlagsToSeeFlags(lpcmi->fMask) & ~SEE_MASK_INVOKEIDLIST);
1480 sei.hwnd = lpcmi->hwnd;
1481 sei.nShow = lpcmi->nShow;
1482 sei.lpVerb = pEntry->Verb;
1483 sei.lpIDList = pidlFull;
1484 sei.hkeyClass = pEntry->hkClass;
1485 sei.dwHotKey = lpcmi->dwHotKey;
1486 sei.hIcon = lpcmi->hIcon;
1487 sei.lpDirectory = wszDir;
1488
1489 if (unicode && !StrIsNullOrEmpty(lpcmi->lpDirectoryW))
1490 {
1491 sei.lpDirectory = lpcmi->lpDirectoryW;
1492 }
1493 else if (bHasPath)
1494 {
1495 wcscpy(wszDir, wszPath);
1496 PathRemoveFileSpec(wszDir);
1497 }
1498 else
1499 {
1500 if (!SHGetPathFromIDListW(m_pidlFolder, wszDir))
1501 *wszDir = UNICODE_NULL;
1502 }
1503
1504 if (bHasPath)
1505 sei.lpFile = wszPath;
1506
1507 CComHeapPtr<WCHAR> pszParamsW;
1508 if (unicode && !StrIsNullOrEmpty(lpcmi->lpParametersW))
1509 sei.lpParameters = lpcmi->lpParametersW;
1510 else if (!StrIsNullOrEmpty(lpcmi->lpParameters) && __SHCloneStrAtoW(&pszParamsW, lpcmi->lpParameters))
1511 sei.lpParameters = pszParamsW;
1512
1513 if (!sei.lpClass && (lpcmi->fMask & (CMIC_MASK_HASLINKNAME | CMIC_MASK_HASTITLE)) && unicode)
1514 sei.lpClass = lpcmi->lpTitleW; // Forward .lnk path from CShellLink::DoOpen (for consrv STARTF_TITLEISLINKNAME)
1515
1517 ILFree(pidlFull);
1518 return hr;
1519}
wcscpy
#define HResultFromWin32
Definition: loader.cpp:14
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:194
#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:2552
#define PathRemoveFileSpec
Definition: shlwapi.h:1078
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 1522 of file CDefaultContextMenu.cpp.

1524{
1525 INT iCmd = LOWORD(lpcmi->lpVerb);
1526 HRESULT hr;
1527 UINT i;
1528
1529 POSITION it = m_StaticEntries.FindIndex(iCmd);
1530
1531 if (it == NULL)
1532 return E_INVALIDARG;
1533
1535
1536 CRegKey VerbKey;
1537 WCHAR VerbKeyPath[sizeof("shell\\") + MAX_VERB];
1538 hr = StringCbPrintfW(VerbKeyPath, sizeof(VerbKeyPath), L"shell\\%s", pEntry->Verb.GetString());
1539 if (SUCCEEDED(hr) && m_pDataObj &&
1540 VerbKey.Open(pEntry->hkClass, VerbKeyPath, KEY_READ) == ERROR_SUCCESS)
1541 {
1542 CLSID clsid;
1543
1544 DWORD KeyState = 0;
1545 if (lpcmi->fMask & CMIC_MASK_SHIFT_DOWN)
1546 KeyState |= MK_SHIFT;
1547 if (lpcmi->fMask & CMIC_MASK_CONTROL_DOWN)
1548 KeyState |= MK_CONTROL;
1549
1550 POINTL *pPtl = NULL;
1551 C_ASSERT(sizeof(POINT) == sizeof(POINTL));
1552 if (lpcmi->fMask & CMIC_MASK_PTINVOKE)
1553 pPtl = (POINTL*)&lpcmi->ptInvoke;
1554
1556 hr = SHELL_GetRegCLSID(VerbKey, L"command", L"DelegateExecute", clsid);
1557 if (SUCCEEDED(hr))
1558 hr = CoCreateInstance(clsid, NULL, CLSCTX_ALL, IID_PPV_ARG(IExecuteCommand, &pEC));
1559 if (SUCCEEDED(hr))
1560 {
1563 return InvokeIExecuteCommandWithDataObject(pEC, pEntry->Verb.GetString(), pPB, m_pDataObj,
1564 lpcmi, static_cast<IContextMenu*>(this));
1565 }
1566
1568 hr = SHELL_GetRegCLSID(VerbKey, L"DropTarget", L"CLSID", clsid);
1569 if (SUCCEEDED(hr))
1570 hr = CoCreateInstance(clsid, NULL, CLSCTX_ALL, IID_PPV_ARG(IDropTarget, &pDT));
1571 if (SUCCEEDED(hr))
1572 {
1575 IUnknown_SetSite(pDT, static_cast<IContextMenu*>(this));
1576 IUnknown_InitializeCommand(pDT, pEntry->Verb.GetString(), pPB);
1577 hr = SHSimulateDrop(pDT, m_pDataObj, KeyState, pPtl, NULL);
1578 IUnknown_SetSite(pDT, NULL);
1579 return hr;
1580 }
1581 }
1582
1583 /* Get the browse flags to see if we need to browse */
1585
1586 for (i=0; i < m_cidl; i++)
1587 {
1588 /* Check if we need to browse */
1589 if (wFlags)
1590 {
1591 hr = TryToBrowse(lpcmi, m_apidl[i], wFlags);
1592 if (SUCCEEDED(hr))
1593 {
1594 /* In WinXP if we have browsed, we don't open any more folders.
1595 * In Win7 we browse to the first folder we find and
1596 * open new windows for each of the rest of the folders */
1598 if (ntver >= _WIN32_WINNT_VISTA)
1599 wFlags = 0; // FIXME: = SBSP_NEWBROWSER | (wFlags & ~SBSP_SAMEBROWSER);
1600 else
1601 i = m_cidl;
1602
1603 continue;
1604 }
1605 }
1606
1607 InvokePidl(lpcmi, m_apidl[i], pEntry);
1608 }
1609
1610 return S_OK;
1611}
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:5381
#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 1385 of file CDefaultContextMenu.cpp.

1387{
1388 TRACE("verb %p first %x last %x\n", lpcmi->lpVerb, m_iIdSHEFirst, m_iIdSHELast);
1389
1390 UINT idCmd = LOWORD(lpcmi->lpVerb);
1392 if (!pEntry)
1393 return E_FAIL;
1394
1395 /* invoke the dynamic context menu */
1396 lpcmi->lpVerb = MAKEINTRESOURCEA(idCmd - pEntry->iIdCmdFirst);
1397 return pEntry->pCM->InvokeCommand((LPCMINVOKECOMMANDINFO)lpcmi);
1398}

Referenced by InvokeCommand().

◆ IsShellExtensionAlreadyLoaded()

BOOL CDefaultContextMenu::IsShellExtensionAlreadyLoaded ( REFCLSID  clsid)
private

Definition at line 565 of file CDefaultContextMenu.cpp.

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

Referenced by LoadDynamicContextMenuHandler().

◆ LoadDynamicContextMenuHandler()

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

Definition at line 579 of file CDefaultContextMenu.cpp.

580{
581 HRESULT hr;
582 TRACE("LoadDynamicContextMenuHandler entered with This %p hKey %p pclsid %s\n", this, hKey, wine_dbgstr_guid(&clsid));
583
585 return S_OK;
586
589 if (FAILED(hr))
590 {
591 ERR("SHCoCreateInstance(IContextMenu) failed.clsid %s hr 0x%x\n", wine_dbgstr_guid(&clsid), hr);
592 return hr;
593 }
594
595 CComPtr<IShellExtInit> pExtInit;
596 hr = pcm->QueryInterface(IID_PPV_ARG(IShellExtInit, &pExtInit));
597 if (FAILED(hr))
598 {
599 ERR("IContextMenu->QueryInterface(IShellExtInit) failed.clsid %s hr 0x%x\n", wine_dbgstr_guid(&clsid), hr);
600 return hr;
601 }
602
603 hr = pExtInit->Initialize(m_pDataObj ? NULL : m_pidlFolder, m_pDataObj, hKey);
604 if (FAILED(hr))
605 {
606 WARN("IShellExtInit::Initialize failed.clsid %s hr 0x%x\n", wine_dbgstr_guid(&clsid), hr);
607 return hr;
608 }
609
610 if (m_site)
612
613 m_DynamicEntries.AddTail({ 0, 0, clsid, pcm });
614
615 return S_OK;
616}
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 1340 of file CDefaultContextMenu.cpp.

1341{
1342 WCHAR UnicodeStr[MAX_VERB];
1343
1344 /* Loop through all the static verbs looking for a match */
1345 for (UINT i = 0; i < _countof(g_StaticInvokeCmdMap); i++)
1346 {
1347 /* We can match both ANSI and unicode strings */
1348 if (IsUnicode)
1349 {
1350 /* The static verbs are ANSI, get a unicode version before doing the compare */
1351 SHAnsiToUnicode(g_StaticInvokeCmdMap[i].szStringVerb, UnicodeStr, MAX_VERB);
1352 if (!_wcsicmp(UnicodeStr, (LPWSTR)Verb))
1353 {
1354 /* Return the Corresponding Id */
1355 *idCmd = g_StaticInvokeCmdMap[i].IntVerb;
1356 return TRUE;
1357 }
1358 }
1359 else
1360 {
1361 if (!_stricmp(g_StaticInvokeCmdMap[i].szStringVerb, (LPSTR)Verb))
1362 {
1363 *idCmd = g_StaticInvokeCmdMap[i].IntVerb;
1364 return TRUE;
1365 }
1366 }
1367 }
1368
1369 for (POSITION it = m_DynamicEntries.GetHeadPosition(); it != NULL;)
1370 {
1372 if (!entry.NumIds)
1373 continue;
1374 HRESULT hr = ::MapVerbToCmdId(Verb, IsUnicode, entry.pCM, 0, entry.NumIds - 1);
1375 if (SUCCEEDED(hr))
1376 {
1377 *idCmd = m_iIdSHEFirst + entry.iIdCmdFirst + hr;
1378 return TRUE;
1379 }
1380 }
1381 return FALSE;
1382}
#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 960 of file CDefaultContextMenu.cpp.

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

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

◆ SetSite()

HRESULT WINAPI CDefaultContextMenu::SetSite ( IUnknown pUnkSite)
override

Implements IObjectWithSite.

Definition at line 1904 of file CDefaultContextMenu.cpp.

1905{
1906 m_site = pUnkSite;
1907 return S_OK;
1908}

◆ TryPickDefault()

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

Definition at line 924 of file CDefaultContextMenu.cpp.

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

1440{
1442 HRESULT hr;
1443
1444 if (!m_site)
1445 return E_FAIL;
1446
1447 /* Get a pointer to the shell browser */
1449 if (FAILED(hr))
1450 return hr;
1451
1452 PIDLIST_ABSOLUTE pidl;
1453 hr = SHILCombine(m_pidlFolder, pidlChild, &pidl);
1455 return hr;
1456
1457 hr = psb->BrowseObject(pidl, wFlags & ~SBSP_RELATIVE);
1458 ILFree(pidl);
1459 return hr;
1460}

Referenced by InvokeRegVerb().

Member Data Documentation

◆ m_aKeys

HKEY* CDefaultContextMenu::m_aKeys
private

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

Referenced by EnumerateDynamicContextHandlerForKey().

◆ m_cidl

UINT CDefaultContextMenu::m_cidl
private

◆ m_cKeys

UINT CDefaultContextMenu::m_cKeys
private

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

Referenced by _DoCallback(), and Initialize().

◆ m_iIdCBFirst

UINT CDefaultContextMenu::m_iIdCBFirst
private

Definition at line 313 of file CDefaultContextMenu.cpp.

Referenced by InvokeCommand(), and QueryContextMenu().

◆ m_iIdCBLast

UINT CDefaultContextMenu::m_iIdCBLast
private

Definition at line 314 of file CDefaultContextMenu.cpp.

Referenced by InvokeCommand(), and QueryContextMenu().

◆ m_iIdDfltFirst

UINT CDefaultContextMenu::m_iIdDfltFirst
private

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

Referenced by _DoCallback(), and Initialize().

◆ m_pidlFolder

◆ m_pmcb

CComPtr<IContextMenuCB> CDefaultContextMenu::m_pmcb
private

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