ReactOS 0.4.15-dev-7131-ge4d03f4
CDefaultContextMenu Class Reference
Inheritance diagram for CDefaultContextMenu:
Collaboration diagram for CDefaultContextMenu:

Public Member Functions

 CDefaultContextMenu ()
 
 ~CDefaultContextMenu ()
 
HRESULT WINAPI Initialize (const DEFCONTEXTMENU *pdcm, LPFNDFMCALLBACK lpfn)
 
virtual HRESULT WINAPI QueryContextMenu (HMENU hMenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags)
 
virtual HRESULT WINAPI InvokeCommand (LPCMINVOKECOMMANDINFO lpcmi)
 
virtual HRESULT WINAPI GetCommandString (UINT_PTR idCommand, UINT uFlags, UINT *lpReserved, LPSTR lpszName, UINT uMaxNameLen)
 
virtual HRESULT WINAPI HandleMenuMsg (UINT uMsg, WPARAM wParam, LPARAM lParam)
 
virtual HRESULT WINAPI HandleMenuMsg2 (UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *plResult)
 
virtual HRESULT STDMETHODCALLTYPE SetSite (IUnknown *pUnkSite)
 
virtual HRESULT STDMETHODCALLTYPE GetSite (REFIID riid, void **ppvSite)
 
- 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)
 

Private Member Functions

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

Private Attributes

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

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

Constructor & Destructor Documentation

◆ CDefaultContextMenu()

CDefaultContextMenu::CDefaultContextMenu ( )

Definition at line 153 of file CDefaultContextMenu.cpp.

153 :
154 m_psf(NULL),
155 m_pmcb(NULL),
156 m_pfnmcb(NULL),
157 m_cidl(0),
158 m_apidl(NULL),
160 m_aKeys(NULL),
161 m_cKeys(NULL),
164 m_iIdSHEFirst(0),
165 m_iIdSHELast(0),
166 m_iIdSCMFirst(0),
167 m_iIdSCMLast(0),
168 m_iIdCBFirst(0),
169 m_iIdCBLast(0),
172{
173}
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

◆ ~CDefaultContextMenu()

CDefaultContextMenu::~CDefaultContextMenu ( )

Definition at line 175 of file CDefaultContextMenu.cpp.

176{
177 m_DynamicEntries.RemoveAll();
178 m_StaticEntries.RemoveAll();
179
180 for (UINT i = 0; i < m_cKeys; i++)
183
184 if (m_pidlFolder)
186 _ILFreeaPidl(const_cast<PITEMID_CHILD *>(m_apidl), m_cidl);
187}
#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
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:2661

Member Function Documentation

◆ _DoCallback()

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

Definition at line 236 of file CDefaultContextMenu.cpp.

237{
238 if (m_pmcb)
239 {
240 return m_pmcb->CallBack(m_psf, NULL, m_pDataObj, uMsg, wParam, (LPARAM)lParam);
241 }
242 else if(m_pfnmcb)
243 {
244 return m_pfnmcb(m_psf, NULL, m_pDataObj, uMsg, wParam, (LPARAM)lParam);
245 }
246
247 return E_FAIL;
248}
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 DoProperties(), InvokeCommand(), QueryContextMenu(), and TryPickDefault().

◆ AddShellExtensionsToMenu()

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

Definition at line 438 of file CDefaultContextMenu.cpp.

439{
440 UINT cIds = 0;
441
442 if (m_DynamicEntries.IsEmpty())
443 return cIds;
444
445 POSITION it = m_DynamicEntries.GetHeadPosition();
446 while (it != NULL)
447 {
449
450 HRESULT hr = info.pCM->QueryContextMenu(hMenu, *pIndexMenu, idCmdFirst + cIds, idCmdLast, uFlags);
451 if (SUCCEEDED(hr))
452 {
453 info.iIdCmdFirst = cIds;
454 info.NumIds = HRESULT_CODE(hr);
455 (*pIndexMenu) += info.NumIds;
456
457 cIds += info.NumIds;
458 if (idCmdFirst + cIds >= idCmdLast)
459 break;
460 }
461 TRACE("pEntry hr %x contextmenu %p cmdfirst %x num ids %x\n", hr, info.pCM.p, info.iIdCmdFirst, info.NumIds);
462 }
463 return cIds;
464}
UINT uFlags
Definition: api.c:59
#define SUCCEEDED(hr)
Definition: intsafe.h:50
HRESULT hr
Definition: shlfolder.c:183
#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 467 of file CDefaultContextMenu.cpp.

473{
475 MENUITEMINFOW mii;
476 UINT idResource;
477 WCHAR wszVerb[40];
478 UINT fState;
479 UINT cIds = 0, indexFirst = *pIndexMenu;
480
481 mii.cbSize = sizeof(mii);
483 mii.fType = MFT_STRING;
484 mii.dwTypeData = NULL;
485
486 POSITION it = m_StaticEntries.GetHeadPosition();
487 bool first = true;
488 while (it != NULL)
489 {
491 BOOL forceFirstPos = FALSE;
492
493 fState = MFS_ENABLED;
494 mii.dwTypeData = NULL;
495
496 /* set first entry as default */
497 if (first)
498 {
499 fState |= MFS_DEFAULT;
500 first = false;
501 }
502
503 if (info.Verb.CompareNoCase(L"open") == 0)
504 {
505 idResource = IDS_OPEN_VERB;
506 fState |= MFS_DEFAULT; /* override default when open verb is found */
507 forceFirstPos++;
508 }
509 else if (info.Verb.CompareNoCase(L"explore") == 0)
510 {
511 idResource = IDS_EXPLORE_VERB;
512 if (uFlags & CMF_EXPLORE)
513 {
514 fState |= MFS_DEFAULT;
515 forceFirstPos++;
516 }
517 }
518 else if (info.Verb.CompareNoCase(L"runas") == 0)
519 idResource = IDS_RUNAS_VERB;
520 else if (info.Verb.CompareNoCase(L"edit") == 0)
521 idResource = IDS_EDIT_VERB;
522 else if (info.Verb.CompareNoCase(L"find") == 0)
523 idResource = IDS_FIND_VERB;
524 else if (info.Verb.CompareNoCase(L"print") == 0)
525 idResource = IDS_PRINT_VERB;
526 else if (info.Verb.CompareNoCase(L"printto") == 0)
527 continue;
528 else
529 idResource = 0;
530
531 /* By default use verb for menu item name */
532 mii.dwTypeData = (LPWSTR)info.Verb.GetString();
533
534 WCHAR wszKey[256];
535 HRESULT hr;
536 hr = StringCbPrintfW(wszKey, sizeof(wszKey), L"shell\\%s", info.Verb.GetString());
538 {
539 continue;
540 }
541
542 UINT cmdFlags = 0;
543 BOOL hide = FALSE;
544 HKEY hkVerb;
545 if (idResource > 0)
546 {
547 if (!(uFlags & CMF_OPTIMIZEFORINVOKE))
548 {
549 if (LoadStringW(shell32_hInstance, idResource, wszVerb, _countof(wszVerb)))
550 mii.dwTypeData = wszVerb; /* use translated verb */
551 else
552 ERR("Failed to load string\n");
553 }
554
555 if (RegOpenKeyW(info.hkClass, wszKey, &hkVerb) != ERROR_SUCCESS)
556 hkVerb = NULL;
557 }
558 else
559 {
560 if (RegOpenKeyW(info.hkClass, wszKey, &hkVerb) == ERROR_SUCCESS)
561 {
562 if (!(uFlags & CMF_OPTIMIZEFORINVOKE))
563 {
564 DWORD cbVerb = sizeof(wszVerb);
565
566 LONG res = RegLoadMUIStringW(hkVerb, L"MUIVerb", wszVerb, cbVerb, NULL, 0, NULL);
567 if (res || !*wszVerb)
568 res = RegLoadMUIStringW(hkVerb, NULL, wszVerb, cbVerb, NULL, 0, NULL);
569
570 if (res == ERROR_SUCCESS && *wszVerb)
571 {
572 /* use description for the menu entry */
573 mii.dwTypeData = wszVerb;
574 }
575 }
576 }
577 else
578 {
579 hkVerb = NULL;
580 }
581 }
582
583 if (hkVerb)
584 {
585 // FIXME: GetAsyncKeyState should not be called here, clients
586 // need to be updated to set the CMF_EXTENDEDVERBS flag.
587 if (!(uFlags & CMF_EXTENDEDVERBS) && GetAsyncKeyState(VK_SHIFT) >= 0)
588 hide |= RegValueExists(hkVerb, L"Extended");
589
590 hide |= RegValueExists(hkVerb, L"ProgrammaticAccessOnly");
591
592 if (!(uFlags & CMF_DISABLEDVERBS))
593 hide |= RegValueExists(hkVerb, L"LegacyDisable");
594
595 if (RegValueExists(hkVerb, L"NeverDefault"))
596 fState &= ~MFS_DEFAULT;
597
598 if (RegValueExists(hkVerb, L"SeparatorBefore"))
599 cmdFlags |= ECF_SEPARATORBEFORE;
600 if (RegValueExists(hkVerb, L"SeparatorAfter"))
601 cmdFlags |= ECF_SEPARATORAFTER;
602
603 RegCloseKey(hkVerb);
604 }
605
606 if (((uFlags & CMF_NODEFAULT) && ntver >= _WIN32_WINNT_VISTA) ||
607 ((uFlags & CMF_DONOTPICKDEFAULT) && ntver >= _WIN32_WINNT_WIN7))
608 {
609 fState &= ~MFS_DEFAULT;
610 }
611
612 if (!hide)
613 {
614 if (cmdFlags & ECF_SEPARATORBEFORE)
615 {
616 if (InsertMenuItemAt(hMenu, *pIndexMenu, MF_SEPARATOR))
617 (*pIndexMenu)++;
618 }
619
620 mii.fState = fState;
621 mii.wID = iIdCmdFirst + cIds;
622 if (InsertMenuItemW(hMenu, forceFirstPos ? indexFirst : *pIndexMenu, TRUE, &mii))
623 (*pIndexMenu)++;
624
625 if (cmdFlags & ECF_SEPARATORAFTER)
626 {
627 if (InsertMenuItemAt(hMenu, *pIndexMenu, MF_SEPARATOR))
628 (*pIndexMenu)++;
629 }
630 }
631 cIds++; // Always increment the id because it acts as the index into m_StaticEntries
632
633 if (mii.wID >= iIdCmdLast)
634 break;
635 }
636
637 return cIds;
638}
static bool RegValueExists(HKEY hKey, LPCWSTR Name)
static BOOL InsertMenuItemAt(HMENU hMenu, UINT Pos, UINT Flags)
#define shell32_hInstance
#define ERR(fmt,...)
Definition: debug.h:110
static UINT RosGetProcessEffectiveVersion(VOID)
Definition: compat_undoc.h:39
#define ERROR_SUCCESS
Definition: deptool.c:10
LONG RegLoadMUIStringW(IN HKEY hKey, IN LPCWSTR pszValue OPTIONAL, OUT LPWSTR pszOutBuf, IN DWORD cbOutBuf, OUT LPDWORD pcbData OPTIONAL, IN DWORD Flags, IN LPCWSTR pszDirectory OPTIONAL)
Definition: muireg.c:53
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
LONG WINAPI RegOpenKeyW(HKEY hKey, LPCWSTR lpSubKey, PHKEY phkResult)
Definition: reg.c:3288
#define FAILED_UNEXPECTEDLY(hr)
Definition: precomp.h:122
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint res
Definition: glext.h:9613
const GLint * first
Definition: glext.h:5794
#define L(x)
Definition: ntvdm.h:50
long LONG
Definition: pedump.c:60
#define _WIN32_WINNT_WIN7
Definition: sdkddkver.h:28
#define _WIN32_WINNT_VISTA
Definition: sdkddkver.h:25
#define IDS_OPEN_VERB
Definition: shresdef.h:212
#define IDS_FIND_VERB
Definition: shresdef.h:216
#define IDS_EXPLORE_VERB
Definition: shresdef.h:213
#define IDS_PRINT_VERB
Definition: shresdef.h:217
#define IDS_RUNAS_VERB
Definition: shresdef.h:214
#define IDS_EDIT_VERB
Definition: shresdef.h:215
#define _countof(array)
Definition: sndvol32.h:68
STRSAFEAPI StringCbPrintfW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszFormat,...)
Definition: strsafe.h:557
LPWSTR dwTypeData
Definition: winuser.h:3268
#define MIIM_ID
Definition: winuser.h:722
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
#define MIIM_STATE
Definition: winuser.h:721
#define MFS_DEFAULT
Definition: winuser.h:748
#define MF_SEPARATOR
Definition: winuser.h:137
#define MFS_ENABLED
Definition: winuser.h:750
#define VK_SHIFT
Definition: winuser.h:2201
#define MFT_STRING
Definition: winuser.h:746
SHORT WINAPI GetAsyncKeyState(_In_ int)
#define MIIM_DATA
Definition: winuser.h:726
#define MIIM_TYPE
Definition: winuser.h:725
BOOL WINAPI InsertMenuItemW(_In_ HMENU, _In_ UINT, _In_ BOOL, _In_ LPCMENUITEMINFOW)
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184

Referenced by QueryContextMenu().

◆ AddStaticEntriesForKey()

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

Definition at line 276 of file CDefaultContextMenu.cpp.

277{
278 WCHAR wszName[40];
279 DWORD cchName, dwIndex = 0;
280 HKEY hShellKey;
281
282 LRESULT lres = RegOpenKeyExW(hKey, L"shell", 0, KEY_READ, &hShellKey);
283 if (lres != STATUS_SUCCESS)
284 return;
285
286 while(TRUE)
287 {
288 cchName = _countof(wszName);
289 if (RegEnumKeyExW(hShellKey, dwIndex++, wszName, &cchName, NULL, NULL, NULL, NULL) != ERROR_SUCCESS)
290 break;
291
292 AddStaticEntry(hKey, wszName, uFlags);
293 }
294
295 RegCloseKey(hShellKey);
296}
void AddStaticEntry(const HKEY hkeyClass, const WCHAR *szVerb, UINT uFlags)
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3353
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:2524
FxAutoRegKey hKey
#define KEY_READ
Definition: nt_native.h:1023
#define STATUS_SUCCESS
Definition: shellext.h:65
_In_ PSID _Out_writes_to_opt_ cchName LPSTR _Inout_ LPDWORD cchName
Definition: winbase.h:2767
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 250 of file CDefaultContextMenu.cpp.

251{
252 POSITION it = m_StaticEntries.GetHeadPosition();
253 while (it != NULL)
254 {
255 const StaticShellEntry& info = m_StaticEntries.GetNext(it);
256 if (info.Verb.CompareNoCase(szVerb) == 0)
257 {
258 /* entry already exists */
259 return;
260 }
261 }
262
263 TRACE("adding verb %s\n", debugstr_w(szVerb));
264
265 if (!wcsicmp(szVerb, L"open") && !(uFlags & CMF_NODEFAULT))
266 {
267 /* open verb is always inserted in front */
268 m_StaticEntries.AddHead({ szVerb, hkeyClass });
269 }
270 else
271 {
272 m_StaticEntries.AddTail({ szVerb, hkeyClass });
273 }
274}
#define wcsicmp
Definition: compat.h:15
#define debugstr_w
Definition: kernel32.h:32

Referenced by AddStaticEntriesForKey().

◆ BrowserFlagsFromVerb()

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

Definition at line 1138 of file CDefaultContextMenu.cpp.

1139{
1141 HWND hwndTree;
1142 LPCWSTR FlagsName;
1143 WCHAR wszKey[256];
1144 HRESULT hr;
1145 DWORD wFlags;
1146 DWORD cbVerb;
1147
1148 if (!m_site)
1149 return 0;
1150
1151 /* Get a pointer to the shell browser */
1153 if (FAILED(hr))
1154 return 0;
1155
1156 /* See if we are in Explore or Browse mode. If the browser's tree is present, we are in Explore mode.*/
1157 if (SUCCEEDED(psb->GetControlWindow(FCW_TREE, &hwndTree)) && hwndTree)
1158 FlagsName = L"ExplorerFlags";
1159 else
1160 FlagsName = L"BrowserFlags";
1161
1162 /* Try to get the flag from the verb */
1163 hr = StringCbPrintfW(wszKey, sizeof(wszKey), L"shell\\%s", pEntry->Verb.GetString());
1165 return 0;
1166
1167 cbVerb = sizeof(wFlags);
1168 if (RegGetValueW(pEntry->hkClass, wszKey, FlagsName, RRF_RT_REG_DWORD, NULL, &wFlags, &cbVerb) == ERROR_SUCCESS)
1169 {
1170 return wFlags;
1171 }
1172
1173 return 0;
1174}
CComPtr< IUnknown > m_site
LSTATUS WINAPI RegGetValueW(HKEY hKey, LPCWSTR pszSubKey, LPCWSTR pszValue, DWORD dwFlags, LPDWORD pdwType, PVOID pvData, LPDWORD pcbData)
Definition: reg.c:1962
#define RRF_RT_REG_DWORD
Definition: driver.c:578
HRESULT WINAPI IUnknown_QueryService(IUnknown *, REFGUID, REFIID, LPVOID *)
Definition: ordinal.c:1497
PLIST_ENTRY pEntry
Definition: fxioqueue.cpp:4484
#define FAILED(hr)
Definition: intsafe.h:51
#define SID_IShellBrowser
_In_ DWORD _Out_ _In_ WORD wFlags
Definition: wincon.h:531
#define IID_PPV_ARG(Itype, ppType)
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185

Referenced by InvokeRegVerb().

◆ DoCopyOrCut()

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

Definition at line 899 of file CDefaultContextMenu.cpp.

900{
901 if (!m_cidl || !m_pDataObj)
902 return E_FAIL;
903
904 FORMATETC formatetc;
906 STGMEDIUM medium = {0};
907 medium.tymed = TYMED_HGLOBAL;
908 medium.hGlobal = GlobalAlloc(GHND, sizeof(DWORD));
909 DWORD* pdwFlag = (DWORD*)GlobalLock(medium.hGlobal);
910 if (pdwFlag)
911 *pdwFlag = bCopy ? DROPEFFECT_COPY : DROPEFFECT_MOVE;
912 GlobalUnlock(medium.hGlobal);
913 m_pDataObj->SetData(&formatetc, &medium, TRUE);
914
917 return hr;
918
919 return S_OK;
920}
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:553
#define GHND
Definition: winbase.h:297
UINT WINAPI RegisterClipboardFormatW(_In_ LPCWSTR)

Referenced by InvokeCommand().

◆ DoCopyToMoveToFolder()

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

Definition at line 971 of file CDefaultContextMenu.cpp.

972{
973 HRESULT hr = E_FAIL;
974 if (!m_pDataObj)
975 {
976 ERR("m_pDataObj is NULL\n");
977 return hr;
978 }
979
980 CComPtr<IContextMenu> pContextMenu;
981 if (bCopy)
982 hr = SHCoCreateInstance(NULL, &CLSID_CopyToMenu, NULL,
983 IID_PPV_ARG(IContextMenu, &pContextMenu));
984 else
985 hr = SHCoCreateInstance(NULL, &CLSID_MoveToMenu, NULL,
986 IID_PPV_ARG(IContextMenu, &pContextMenu));
988 return hr;
989
991 hr = pContextMenu->QueryInterface(IID_PPV_ARG(IShellExtInit, &pInit));
993 return hr;
994
995 hr = pInit->Initialize(m_pidlFolder, m_pDataObj, NULL);
997 return hr;
998
999 if (bCopy)
1000 lpici->lpVerb = "copyto";
1001 else
1002 lpici->lpVerb = "moveto";
1003
1004 return pContextMenu->InvokeCommand((LPCMINVOKECOMMANDINFO)lpici);
1005}
HRESULT WINAPI SHCoCreateInstance(LPCWSTR aclsid, const CLSID *clsid, LPUNKNOWN pUnkOuter, REFIID refiid, LPVOID *ppv)
Definition: shellole.c:105
PWDFDEVICE_INIT pInit
struct IContextMenu::tagCMINVOKECOMMANDINFO * LPCMINVOKECOMMANDINFO

Referenced by InvokeCommand().

◆ DoCreateLink()

HRESULT CDefaultContextMenu::DoCreateLink ( LPCMINVOKECOMMANDINFOEX  lpcmi)
private

Definition at line 868 of file CDefaultContextMenu.cpp.

869{
870 if (!m_cidl || !m_pDataObj)
871 return E_FAIL;
872
874 HRESULT hr = m_psf->CreateViewObject(NULL, IID_PPV_ARG(IDropTarget, &pDT));
876 return hr;
877
879
880 return S_OK;
881}
BOOL WINAPI SHSimulateDrop(IDropTarget *pDrop, IDataObject *pDataObj, DWORD grfKeyState, PPOINTL lpPt, DWORD *pdwEffect)
Definition: ordinal.c:1824
#define MK_SHIFT
Definition: winuser.h:2368
#define MK_CONTROL
Definition: winuser.h:2369

Referenced by InvokeCommand().

◆ DoCreateNewFolder()

HRESULT CDefaultContextMenu::DoCreateNewFolder ( LPCMINVOKECOMMANDINFOEX  lpici)
private

Definition at line 1009 of file CDefaultContextMenu.cpp.

1011{
1012 WCHAR wszPath[MAX_PATH];
1013 WCHAR wszName[MAX_PATH];
1014 WCHAR wszNewFolder[25];
1015 HRESULT hr;
1016
1017 /* Get folder path */
1020 return hr;
1021
1022 if (!LoadStringW(shell32_hInstance, IDS_NEWFOLDER, wszNewFolder, _countof(wszNewFolder)))
1023 return E_FAIL;
1024
1025 /* Create the name of the new directory */
1026 if (!PathYetAnotherMakeUniqueName(wszName, wszPath, NULL, wszNewFolder))
1027 return E_FAIL;
1028
1029 /* Create the new directory and show the appropriate dialog in case of error */
1030 if (SHCreateDirectory(lpici->hwnd, wszName) != ERROR_SUCCESS)
1031 return E_FAIL;
1032
1033 /* Show and select the new item in the def view */
1034 LPITEMIDLIST pidl;
1035 PITEMID_CHILD pidlNewItem;
1037
1038 /* Notify the view object about the new item */
1040
1041 if (!m_site)
1042 return S_OK;
1043
1044 /* Get a pointer to the shell view */
1047 return S_OK;
1048
1049 /* Attempt to get the pidl of the new item */
1050 hr = SHILCreateFromPathW(wszName, &pidl, NULL);
1052 return hr;
1053
1054 pidlNewItem = ILFindLastID(pidl);
1055
1056 hr = psv->SelectItem(pidlNewItem, SVSI_DESELECTOTHERS | SVSI_EDIT | SVSI_ENSUREVISIBLE |
1057 SVSI_FOCUSED | SVSI_SELECT);
1059 return hr;
1060
1061 SHFree(pidl);
1062
1063 return S_OK;
1064}
EXTERN_C void WINAPI SHChangeNotify(LONG wEventId, UINT uFlags, LPCVOID dwItem1, LPCVOID dwItem2)
#define MAX_PATH
Definition: compat.h:34
void WINAPI SHFree(LPVOID pv)
Definition: shellole.c:326
BOOL WINAPI PathYetAnotherMakeUniqueName(LPWSTR buffer, LPCWSTR path, LPCWSTR shortname, LPCWSTR longname)
Definition: shellpath.c:705
#define IDS_NEWFOLDER
HRESULT WINAPI SHILCreateFromPathW(LPCWSTR path, LPITEMIDLIST *ppidl, DWORD *attributes)
Definition: pidl.c:392
LPITEMIDLIST WINAPI ILFindLastID(LPCITEMIDLIST pidl)
Definition: pidl.c:189
BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath)
Definition: pidl.c:1344
int WINAPI SHCreateDirectory(HWND hWnd, LPCWSTR path)
Definition: shlfileop.cpp:857
#define SID_IFolderView
#define SHCNE_MKDIR
Definition: shlobj.h:1811
#define SHCNF_FLUSH
Definition: shlobj.h:1846
#define SHCNF_PATHW
Definition: shlobj.h:1843
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 883 of file CDefaultContextMenu.cpp.

884{
885 if (!m_cidl || !m_pDataObj)
886 return E_FAIL;
887
891 return hr;
892
893 DWORD grfKeyState = (lpcmi->fMask & CMIC_MASK_SHIFT_DOWN) ? MK_SHIFT : 0;
894 SHSimulateDrop(pDT, m_pDataObj, grfKeyState, NULL, NULL);
895
896 return S_OK;
897}
HRESULT CRecyclerDropTarget_CreateInstance(REFIID riid, LPVOID *ppvOut)

Referenced by InvokeCommand().

◆ DoOpenOrExplore()

HRESULT CDefaultContextMenu::DoOpenOrExplore ( LPCMINVOKECOMMANDINFOEX  lpcmi)
private

Definition at line 862 of file CDefaultContextMenu.cpp.

863{
865 return E_FAIL;
866}
#define UNIMPLEMENTED
Definition: debug.h:115

Referenced by InvokeCommand().

◆ DoPaste()

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

Definition at line 809 of file CDefaultContextMenu.cpp.

810{
811 HRESULT hr;
812
814 hr = OleGetClipboard(&pda);
816 return hr;
817
818 FORMATETC formatetc2;
819 STGMEDIUM medium2;
821
822 DWORD dwKey= 0;
823
824 if (SUCCEEDED(pda->GetData(&formatetc2, &medium2)))
825 {
826 DWORD * pdwFlag = (DWORD*)GlobalLock(medium2.hGlobal);
827 if (pdwFlag)
828 {
829 if (*pdwFlag == DROPEFFECT_COPY)
830 dwKey = MK_CONTROL;
831 else
832 dwKey = MK_SHIFT;
833 }
834 else
835 {
836 ERR("No drop effect obtained\n");
837 }
838 GlobalUnlock(medium2.hGlobal);
839 }
840
841 if (bLink)
842 {
843 dwKey = MK_CONTROL|MK_SHIFT;
844 }
845
847 if (m_cidl)
848 hr = m_psf->GetUIObjectOf(NULL, 1, &m_apidl[0], IID_NULL_PPV_ARG(IDropTarget, &pdrop));
849 else
850 hr = m_psf->CreateViewObject(NULL, IID_PPV_ARG(IDropTarget, &pdrop));
851
853 return hr;
854
855 SHSimulateDrop(pdrop, pda, dwKey, NULL, NULL);
856
857 TRACE("CP result %x\n", hr);
858 return S_OK;
859}
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 949 of file CDefaultContextMenu.cpp.

951{
953
954 // We are asked to run the default property sheet
955 if (hr == S_FALSE)
956 {
958 }
959
960 return hr;
961}
HRESULT _DoCallback(UINT uMsg, WPARAM wParam, LPVOID lParam)
#define DFM_INVOKECOMMAND
Definition: precomp.h:45
HRESULT WINAPI Shell_DefaultContextMenuCallBack(IShellFolder *psf, IDataObject *pdtobj)
Definition: shlfolder.cpp:463
#define DFM_CMD_PROPERTIES
Definition: shlobj.h:2530
#define S_FALSE
Definition: winerror.h:2357

Referenced by InvokeCommand().

◆ DoRename()

HRESULT CDefaultContextMenu::DoRename ( LPCMINVOKECOMMANDINFOEX  lpcmi)
private

Definition at line 922 of file CDefaultContextMenu.cpp.

923{
925 HRESULT hr;
926
927 if (!m_site || !m_cidl)
928 return E_FAIL;
929
930 /* Get a pointer to the shell browser */
933 return hr;
934
936 hr = psb->QueryActiveShellView(&lpSV);
938 return hr;
939
940 SVSIF selFlags = SVSI_DESELECTOTHERS | SVSI_EDIT | SVSI_ENSUREVISIBLE | SVSI_FOCUSED | SVSI_SELECT;
941 hr = lpSV->SelectItem(m_apidl[0], selFlags);
943 return hr;
944
945 return S_OK;
946}

Referenced by InvokeCommand().

◆ DoUndo()

HRESULT CDefaultContextMenu::DoUndo ( LPCMINVOKECOMMANDINFOEX  lpcmi)
private

Definition at line 964 of file CDefaultContextMenu.cpp.

965{
966 ERR("TODO: Undo\n");
967 return E_NOTIMPL;
968}
#define E_NOTIMPL
Definition: ddrawi.h:99

Referenced by InvokeCommand().

◆ EnumerateDynamicContextHandlerForKey()

BOOL CDefaultContextMenu::EnumerateDynamicContextHandlerForKey ( HKEY  hRootKey)
private

Definition at line 374 of file CDefaultContextMenu.cpp.

375{
376 WCHAR wszName[MAX_PATH], wszBuf[MAX_PATH], *pwszClsid;
378 HRESULT hr;
379 HKEY hKey;
380
381 if (RegOpenKeyExW(hRootKey, L"shellex\\ContextMenuHandlers", 0, KEY_READ, &hKey) != ERROR_SUCCESS)
382 {
383 TRACE("RegOpenKeyExW failed\n");
384 return FALSE;
385 }
386
387 DWORD dwIndex = 0;
388 while (TRUE)
389 {
390 cchName = _countof(wszName);
391 if (RegEnumKeyExW(hKey, dwIndex++, wszName, &cchName, NULL, NULL, NULL, NULL) != ERROR_SUCCESS)
392 break;
393
394 /* Key name or key value is CLSID */
395 CLSID clsid;
396 hr = CLSIDFromString(wszName, &clsid);
397 if (hr == S_OK)
398 pwszClsid = wszName;
399 else
400 {
401 DWORD cchBuf = _countof(wszBuf);
402 if (RegGetValueW(hKey, wszName, NULL, RRF_RT_REG_SZ, NULL, wszBuf, &cchBuf) == ERROR_SUCCESS)
403 hr = CLSIDFromString(wszBuf, &clsid);
404 pwszClsid = wszBuf;
405 }
406
407 if (FAILED(hr))
408 {
409 ERR("CLSIDFromString failed for clsid %S hr 0x%x\n", pwszClsid, hr);
410 continue;
411 }
412
414 {
416 L"Software\\Microsoft\\Windows\\CurrentVersion\\Shell Extensions\\Approved",
417 pwszClsid,
419 NULL,
420 NULL,
422 {
423 ERR("Shell extension %s not approved!\n", pwszClsid);
424 continue;
425 }
426 }
427
429 if (FAILED(hr))
430 WARN("Failed to get context menu entires from shell extension! clsid: %S\n", pwszClsid);
431 }
432
434 return TRUE;
435}
#define WARN(fmt,...)
Definition: debug.h:112
HRESULT LoadDynamicContextMenuHandler(HKEY hKey, REFCLSID clsid)
HRESULT WINAPI CLSIDFromString(LPCOLESTR idstr, LPCLSID id)
Definition: compobj.c:2338
#define RRF_RT_REG_SZ
Definition: driver.c:575
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 
)
virtual

Implements IContextMenu.

Definition at line 1402 of file CDefaultContextMenu.cpp.

1408{
1409 /* We don't handle the help text yet */
1410 if (uFlags == GCS_HELPTEXTA ||
1411 uFlags == GCS_HELPTEXTW ||
1412 HIWORD(idCommand) != 0)
1413 {
1414 return E_NOTIMPL;
1415 }
1416
1417 UINT CmdId = LOWORD(idCommand);
1418
1419 if (!m_DynamicEntries.IsEmpty() && CmdId >= m_iIdSHEFirst && CmdId < m_iIdSHELast)
1420 {
1421 idCommand -= m_iIdSHEFirst;
1423 if (!pEntry)
1424 return E_FAIL;
1425
1426 idCommand -= pEntry->iIdCmdFirst;
1427 return pEntry->pCM->GetCommandString(idCommand,
1428 uFlags,
1429 lpReserved,
1430 lpszName,
1431 uMaxNameLen);
1432 }
1433
1434 if (!m_StaticEntries.IsEmpty() && CmdId >= m_iIdSCMFirst && CmdId < m_iIdSCMLast)
1435 {
1436 /* Validation just returns S_OK on a match. The id exists. */
1437 if (uFlags == GCS_VALIDATEA || uFlags == GCS_VALIDATEW)
1438 return S_OK;
1439
1440 CmdId -= m_iIdSCMFirst;
1441
1442 POSITION it = m_StaticEntries.FindIndex(CmdId);
1443
1444 if (it == NULL)
1445 return E_INVALIDARG;
1446
1448
1449 if (uFlags == GCS_VERBW)
1450 return StringCchCopyW((LPWSTR)lpszName, uMaxNameLen, pEntry->Verb);
1451
1452 if (uFlags == GCS_VERBA)
1453 {
1454 if (SHUnicodeToAnsi(pEntry->Verb, lpszName, uMaxNameLen))
1455 return S_OK;
1456 }
1457
1458 return E_INVALIDARG;
1459 }
1460
1461 //FIXME: Should we handle callbacks here?
1462 if (m_iIdDfltFirst != m_iIdDfltLast && CmdId >= m_iIdDfltFirst && CmdId < m_iIdDfltLast)
1463 {
1464 CmdId -= m_iIdDfltFirst;
1465 /* See the definitions of IDM_CUT and co to see how this works */
1466 CmdId += DCM_FCIDM_SHVIEW_OFFSET;
1467 }
1468
1469 /* Loop looking for a matching Id */
1470 for (UINT i = 0; i < _countof(g_StaticInvokeCmdMap); i++)
1471 {
1472 if (g_StaticInvokeCmdMap[i].IntVerb == CmdId)
1473 {
1474 /* Validation just returns S_OK on a match */
1475 if (uFlags == GCS_VALIDATEA || uFlags == GCS_VALIDATEW)
1476 return S_OK;
1477
1478 /* Return a copy of the ANSI verb */
1479 if (uFlags == GCS_VERBA)
1480 return StringCchCopyA(lpszName, uMaxNameLen, g_StaticInvokeCmdMap[i].szStringVerb);
1481
1482 /* Convert the ANSI verb to unicode and return that */
1483 if (uFlags == GCS_VERBW)
1484 {
1485 if (SHAnsiToUnicode(g_StaticInvokeCmdMap[i].szStringVerb, (LPWSTR)lpszName, uMaxNameLen))
1486 return S_OK;
1487 }
1488 }
1489 }
1490
1491 return E_INVALIDARG;
1492}
static const struct _StaticInvokeCommandMap_ g_StaticInvokeCmdMap[]
#define DCM_FCIDM_SHVIEW_OFFSET
PDynamicShellEntry GetDynamicEntry(UINT idCmd)
#define E_INVALIDARG
Definition: ddrawi.h:101
DWORD WINAPI SHAnsiToUnicode(LPCSTR lpSrcStr, LPWSTR lpDstStr, int iLen)
Definition: string.c:2659
INT WINAPI SHUnicodeToAnsi(LPCWSTR lpSrcStr, LPSTR lpDstStr, INT iLen)
Definition: string.c:2783
#define LOWORD(l)
Definition: pedump.c:82
STRSAFEAPI StringCchCopyW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:149
STRSAFEAPI StringCchCopyA(STRSAFE_LPSTR pszDest, size_t cchDest, STRSAFE_LPCSTR pszSrc)
Definition: strsafe.h:145
#define HIWORD(l)
Definition: typedefs.h:247

◆ GetDynamicEntry()

PDynamicShellEntry CDefaultContextMenu::GetDynamicEntry ( UINT  idCmd)
private

Definition at line 1066 of file CDefaultContextMenu.cpp.

1067{
1068 POSITION it = m_DynamicEntries.GetHeadPosition();
1069 while (it != NULL)
1070 {
1072
1073 if (idCmd >= info.iIdCmdFirst + info.NumIds)
1074 continue;
1075
1076 if (idCmd < info.iIdCmdFirst || idCmd > info.iIdCmdFirst + info.NumIds)
1077 return NULL;
1078
1079 return &info;
1080 }
1081
1082 return NULL;
1083}

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

◆ GetSite()

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

Definition at line 1589 of file CDefaultContextMenu.cpp.

1590{
1591 if (!m_site)
1592 return E_FAIL;
1593
1594 return m_site->QueryInterface(riid, ppvSite);
1595}
REFIID riid
Definition: atlbase.h:39

◆ HandleMenuMsg()

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

Implements IContextMenu2.

Definition at line 1496 of file CDefaultContextMenu.cpp.

1500{
1501 /* FIXME: Should we implement this as well? */
1502 return S_OK;
1503}

◆ HandleMenuMsg2()

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

Implements IContextMenu3.

Definition at line 1543 of file CDefaultContextMenu.cpp.

1548{
1549 if (uMsg == WM_INITMENUPOPUP)
1550 {
1551 POSITION it = m_DynamicEntries.GetHeadPosition();
1552 while (it != NULL)
1553 {
1555 SHForwardContextMenuMsg(info.pCM, uMsg, wParam, lParam, plResult, TRUE);
1556 }
1557 return S_OK;
1558 }
1559
1560 UINT CmdId;
1561 HRESULT hr = SHGetMenuIdFromMenuMsg(uMsg, lParam, &CmdId);
1562 if (FAILED(hr))
1563 return S_FALSE;
1564
1565 if (CmdId < m_iIdSHEFirst || CmdId >= m_iIdSHELast)
1566 return S_FALSE;
1567
1568 CmdId -= m_iIdSHEFirst;
1570 if (pEntry)
1571 {
1572 SHSetMenuIdInMenuMsg(uMsg, lParam, CmdId - pEntry->iIdCmdFirst);
1573 SHForwardContextMenuMsg(pEntry->pCM, uMsg, wParam, lParam, plResult, TRUE);
1574 }
1575
1576 return S_OK;
1577}
HRESULT SHSetMenuIdInMenuMsg(UINT uMsg, LPARAM lParam, UINT CmdId)
HRESULT SHGetMenuIdFromMenuMsg(UINT uMsg, LPARAM lParam, UINT *CmdId)
HRESULT WINAPI SHForwardContextMenuMsg(IUnknown *pUnk, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *pResult, BOOL useIContextMenu2)
Definition: rosordinal.c:11
#define WM_INITMENUPOPUP
Definition: winuser.h:1745

◆ Initialize()

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

Definition at line 189 of file CDefaultContextMenu.cpp.

190{
191 TRACE("cidl %u\n", pdcm->cidl);
192
193 if (!pdcm->pcmcb && !lpfn)
194 {
195 ERR("CDefaultContextMenu needs a callback!\n");
196 return E_INVALIDARG;
197 }
198
199 m_cidl = pdcm->cidl;
201 if (m_cidl && !m_apidl)
202 return E_OUTOFMEMORY;
203 m_psf = pdcm->psf;
204 m_pmcb = pdcm->pcmcb;
205 m_pfnmcb = lpfn;
206
207 m_cKeys = pdcm->cKeys;
208 if (pdcm->cKeys)
209 {
210 m_aKeys = (HKEY*)HeapAlloc(GetProcessHeap(), 0, sizeof(HKEY) * pdcm->cKeys);
211 if (!m_aKeys)
212 return E_OUTOFMEMORY;
213 memcpy(m_aKeys, pdcm->aKeys, sizeof(HKEY) * pdcm->cKeys);
214 }
215
216 m_psf->GetUIObjectOf(pdcm->hwnd, m_cidl, m_apidl, IID_NULL_PPV_ARG(IDataObject, &m_pDataObj));
217
218 if (pdcm->pidlFolder)
219 {
221 }
222 else
223 {
225 if (SUCCEEDED(m_psf->QueryInterface(IID_PPV_ARG(IPersistFolder2, &pf))))
226 {
227 if (FAILED(pf->GetCurFolder(&m_pidlFolder)))
228 ERR("GetCurFolder failed\n");
229 }
230 TRACE("pidlFolder %p\n", m_pidlFolder);
231 }
232
233 return S_OK;
234}
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:2678
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
Definition: pidl.c:228
const PCUITEMID_CHILD * PCUITEMID_CHILD_ARRAY
Definition: shtypes.idl:71
IContextMenuCB * pcmcb
Definition: shlobj.h:2468
IShellFolder * psf
Definition: shlobj.h:2470
PCUITEMID_CHILD_ARRAY apidl
Definition: shlobj.h:2472
const HKEY * aKeys
Definition: shlobj.h:2475
PCIDLIST_ABSOLUTE pidlFolder
Definition: shlobj.h:2469

◆ InvokeCommand()

HRESULT WINAPI CDefaultContextMenu::InvokeCommand ( LPCMINVOKECOMMANDINFO  lpcmi)
virtual

Implements IContextMenu.

Definition at line 1294 of file CDefaultContextMenu.cpp.

1296{
1297 CMINVOKECOMMANDINFOEX LocalInvokeInfo = {};
1299 UINT CmdId;
1300
1301 /* Take a local copy of the fixed members of the
1302 struct as we might need to modify the verb */
1303 memcpy(&LocalInvokeInfo, lpcmi, min(sizeof(LocalInvokeInfo), lpcmi->cbSize));
1304
1305 /* Check if this is a string verb */
1306 if (!IS_INTRESOURCE(LocalInvokeInfo.lpVerb))
1307 {
1308 /* Get the ID which corresponds to this verb, and update our local copy */
1309 if (MapVerbToCmdId((LPVOID)LocalInvokeInfo.lpVerb, &CmdId, FALSE))
1310 LocalInvokeInfo.lpVerb = MAKEINTRESOURCEA(CmdId);
1311 }
1312
1313 CmdId = LOWORD(LocalInvokeInfo.lpVerb);
1314
1315 if (!m_DynamicEntries.IsEmpty() && CmdId >= m_iIdSHEFirst && CmdId < m_iIdSHELast)
1316 {
1317 LocalInvokeInfo.lpVerb -= m_iIdSHEFirst;
1318 Result = InvokeShellExt(&LocalInvokeInfo);
1319 return Result;
1320 }
1321
1322 if (!m_StaticEntries.IsEmpty() && CmdId >= m_iIdSCMFirst && CmdId < m_iIdSCMLast)
1323 {
1324 LocalInvokeInfo.lpVerb -= m_iIdSCMFirst;
1325 Result = InvokeRegVerb(&LocalInvokeInfo);
1326 return Result;
1327 }
1328
1329 if (m_iIdCBFirst != m_iIdCBLast && CmdId >= m_iIdCBFirst && CmdId < m_iIdCBLast)
1330 {
1332 return Result;
1333 }
1334
1335 if (m_iIdDfltFirst != m_iIdDfltLast && CmdId >= m_iIdDfltFirst && CmdId < m_iIdDfltLast)
1336 {
1337 CmdId -= m_iIdDfltFirst;
1338 /* See the definitions of IDM_CUT and co to see how this works */
1339 CmdId += DCM_FCIDM_SHVIEW_OFFSET;
1340 }
1341
1342 if (LocalInvokeInfo.cbSize >= sizeof(CMINVOKECOMMANDINFOEX) && (LocalInvokeInfo.fMask & CMIC_MASK_PTINVOKE))
1343 {
1344 if (m_pDataObj && FAILED_UNEXPECTEDLY(DataObject_SetOffset(m_pDataObj, &LocalInvokeInfo.ptInvoke)))
1345 {
1346 ERR("Unable to add OFFSET to DataObject!\n");
1347 }
1348 }
1349
1350 /* Check if this is a Id */
1351 switch (CmdId)
1352 {
1354 Result = DoPaste(&LocalInvokeInfo, FALSE);
1355 break;
1357 Result = DoPaste(&LocalInvokeInfo, TRUE);
1358 break;
1359 case FCIDM_SHVIEW_OPEN:
1361 Result = DoOpenOrExplore(&LocalInvokeInfo);
1362 break;
1363 case FCIDM_SHVIEW_COPY:
1364 case FCIDM_SHVIEW_CUT:
1365 Result = DoCopyOrCut(&LocalInvokeInfo, CmdId == FCIDM_SHVIEW_COPY);
1366 break;
1368 Result = DoCreateLink(&LocalInvokeInfo);
1369 break;
1371 Result = DoDelete(&LocalInvokeInfo);
1372 break;
1374 Result = DoRename(&LocalInvokeInfo);
1375 break;
1377 Result = DoProperties(&LocalInvokeInfo);
1378 break;
1380 Result = DoCreateNewFolder(&LocalInvokeInfo);
1381 break;
1383 Result = DoCopyToMoveToFolder(&LocalInvokeInfo, TRUE);
1384 break;
1386 Result = DoCopyToMoveToFolder(&LocalInvokeInfo, FALSE);
1387 break;
1388 case FCIDM_SHVIEW_UNDO:
1389 Result = DoUndo(&LocalInvokeInfo);
1390 break;
1391 default:
1393 ERR("Unhandled Verb %xl\n", LOWORD(LocalInvokeInfo.lpVerb));
1394 break;
1395 }
1396
1397 return Result;
1398}
HRESULT InvokeRegVerb(LPCMINVOKECOMMANDINFOEX lpcmi)
HRESULT DoRename(LPCMINVOKECOMMANDINFOEX lpcmi)
BOOL MapVerbToCmdId(PVOID Verb, PUINT idCmd, BOOL IsUnicode)
HRESULT DoCreateLink(LPCMINVOKECOMMANDINFOEX lpcmi)
HRESULT DoUndo(LPCMINVOKECOMMANDINFOEX lpcmi)
HRESULT DoCopyOrCut(LPCMINVOKECOMMANDINFOEX lpcmi, BOOL bCopy)
HRESULT DoDelete(LPCMINVOKECOMMANDINFOEX lpcmi)
HRESULT DoCopyToMoveToFolder(LPCMINVOKECOMMANDINFOEX lpici, BOOL bCopy)
HRESULT DoProperties(LPCMINVOKECOMMANDINFOEX lpcmi)
HRESULT DoCreateNewFolder(LPCMINVOKECOMMANDINFOEX lpici)
HRESULT DoPaste(LPCMINVOKECOMMANDINFOEX lpcmi, BOOL bLink)
HRESULT DoOpenOrExplore(LPCMINVOKECOMMANDINFOEX lpcmi)
HRESULT InvokeShellExt(LPCMINVOKECOMMANDINFOEX lpcmi)
struct IContextMenu::tagCMInvokeCommandInfoEx CMINVOKECOMMANDINFOEX
#define min(a, b)
Definition: monoChain.cc:55
#define FCIDM_SHVIEW_CUT
Definition: shresdef.h:809
#define FCIDM_SHVIEW_OPEN
Definition: shresdef.h:836
#define FCIDM_SHVIEW_UNDO
Definition: shresdef.h:812
#define FCIDM_SHVIEW_COPY
Definition: shresdef.h:810
#define FCIDM_SHVIEW_INSERTLINK
Definition: shresdef.h:813
#define FCIDM_SHVIEW_NEWFOLDER
Definition: shresdef.h:832
#define FCIDM_SHVIEW_EXPLORE
Definition: shresdef.h:835
#define FCIDM_SHVIEW_PROPERTIES
Definition: shresdef.h:808
#define FCIDM_SHVIEW_COPYTO
Definition: shresdef.h:814
#define FCIDM_SHVIEW_MOVETO
Definition: shresdef.h:815
#define FCIDM_SHVIEW_DELETE
Definition: shresdef.h:807
#define FCIDM_SHVIEW_RENAME
Definition: shresdef.h:829
#define FCIDM_SHVIEW_CREATELINK
Definition: shresdef.h:830
#define FCIDM_SHVIEW_INSERT
Definition: shresdef.h:811
#define IS_INTRESOURCE(i)
Definition: winuser.h:580
#define MAKEINTRESOURCEA(i)
Definition: winuser.h:581
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:409

◆ InvokePidl()

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

Definition at line 1202 of file CDefaultContextMenu.cpp.

1203{
1204 LPITEMIDLIST pidlFull = ILCombine(m_pidlFolder, pidl);
1205 if (pidlFull == NULL)
1206 {
1207 return E_FAIL;
1208 }
1209
1210 WCHAR wszPath[MAX_PATH];
1211 BOOL bHasPath = SHGetPathFromIDListW(pidlFull, wszPath);
1212
1213 WCHAR wszDir[MAX_PATH];
1214 if (bHasPath)
1215 {
1216 wcscpy(wszDir, wszPath);
1217 PathRemoveFileSpec(wszDir);
1218 }
1219 else
1220 {
1221 if (!SHGetPathFromIDListW(m_pidlFolder, wszDir))
1222 *wszDir = UNICODE_NULL;
1223 }
1224
1226 ZeroMemory(&sei, sizeof(sei));
1227 sei.cbSize = sizeof(sei);
1228 sei.hwnd = lpcmi->hwnd;
1229 sei.nShow = SW_SHOWNORMAL;
1230 sei.lpVerb = pEntry->Verb;
1231 sei.lpDirectory = wszDir;
1232 sei.lpIDList = pidlFull;
1233 sei.hkeyClass = pEntry->hkClass;
1235 if (bHasPath)
1236 {
1237 sei.lpFile = wszPath;
1238 }
1239
1240 ShellExecuteExW(&sei);
1241
1242 ILFree(pidlFull);
1243
1244 return S_OK;
1245}
#define UNICODE_NULL
void WINAPI ILFree(LPITEMIDLIST pidl)
Definition: pidl.c:929
LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: pidl.c:703
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
#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:2368
#define PathRemoveFileSpec
Definition: shlwapi.h:1035
LPCWSTR lpDirectory
Definition: shellapi.h:331
#define ZeroMemory
Definition: winbase.h:1712
#define SW_SHOWNORMAL
Definition: winuser.h:769

Referenced by InvokeRegVerb().

◆ InvokeRegVerb()

HRESULT CDefaultContextMenu::InvokeRegVerb ( LPCMINVOKECOMMANDINFOEX  lpcmi)
private

Definition at line 1248 of file CDefaultContextMenu.cpp.

1250{
1251 INT iCmd = LOWORD(lpcmi->lpVerb);
1252 HRESULT hr;
1253 UINT i;
1254
1255 POSITION it = m_StaticEntries.FindIndex(iCmd);
1256
1257 if (it == NULL)
1258 return E_INVALIDARG;
1259
1261
1262 /* Get the browse flags to see if we need to browse */
1264
1265 for (i=0; i < m_cidl; i++)
1266 {
1267 /* Check if we need to browse */
1268 if (wFlags)
1269 {
1270 hr = TryToBrowse(lpcmi, m_apidl[i], wFlags);
1271 if (SUCCEEDED(hr))
1272 {
1273 /* In WinXP if we have browsed, we don't open any more folders.
1274 * In Win7 we browse to the first folder we find and
1275 * open new windows for each of the rest of the folders */
1277 if (ntver >= _WIN32_WINNT_VISTA)
1278 wFlags = 0; // FIXME: = SBSP_NEWBROWSER | (wFlags & ~SBSP_SAMEBROWSER);
1279 else
1280 i = m_cidl;
1281
1282 continue;
1283 }
1284 }
1285
1286 InvokePidl(lpcmi, m_apidl[i], pEntry);
1287 }
1288
1289 return S_OK;
1290}
DWORD BrowserFlagsFromVerb(LPCMINVOKECOMMANDINFOEX lpcmi, PStaticShellEntry pEntry)
HRESULT TryToBrowse(LPCMINVOKECOMMANDINFOEX lpcmi, LPCITEMIDLIST pidl, DWORD wFlags)
HRESULT InvokePidl(LPCMINVOKECOMMANDINFOEX lpcmi, LPCITEMIDLIST pidl, PStaticShellEntry pEntry)
int32_t INT
Definition: typedefs.h:58

Referenced by InvokeCommand().

◆ InvokeShellExt()

HRESULT CDefaultContextMenu::InvokeShellExt ( LPCMINVOKECOMMANDINFOEX  lpcmi)
private

Definition at line 1122 of file CDefaultContextMenu.cpp.

1124{
1125 TRACE("verb %p first %x last %x\n", lpcmi->lpVerb, m_iIdSHEFirst, m_iIdSHELast);
1126
1127 UINT idCmd = LOWORD(lpcmi->lpVerb);
1129 if (!pEntry)
1130 return E_FAIL;
1131
1132 /* invoke the dynamic context menu */
1133 lpcmi->lpVerb = MAKEINTRESOURCEA(idCmd - pEntry->iIdCmdFirst);
1134 return pEntry->pCM->InvokeCommand((LPCMINVOKECOMMANDINFO)lpcmi);
1135}

Referenced by InvokeCommand().

◆ IsShellExtensionAlreadyLoaded()

BOOL CDefaultContextMenu::IsShellExtensionAlreadyLoaded ( REFCLSID  clsid)
private

Definition at line 320 of file CDefaultContextMenu.cpp.

321{
322 POSITION it = m_DynamicEntries.GetHeadPosition();
323 while (it != NULL)
324 {
325 const DynamicShellEntry& info = m_DynamicEntries.GetNext(it);
326 if (info.ClassID == clsid)
327 return TRUE;
328 }
329
330 return FALSE;
331}

Referenced by LoadDynamicContextMenuHandler().

◆ LoadDynamicContextMenuHandler()

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

Definition at line 334 of file CDefaultContextMenu.cpp.

335{
336 HRESULT hr;
337 TRACE("LoadDynamicContextMenuHandler entered with This %p hKey %p pclsid %s\n", this, hKey, wine_dbgstr_guid(&clsid));
338
340 return S_OK;
341
344 if (FAILED(hr))
345 {
346 ERR("SHCoCreateInstance(IContextMenu) failed.clsid %s hr 0x%x\n", wine_dbgstr_guid(&clsid), hr);
347 return hr;
348 }
349
350 CComPtr<IShellExtInit> pExtInit;
351 hr = pcm->QueryInterface(IID_PPV_ARG(IShellExtInit, &pExtInit));
352 if (FAILED(hr))
353 {
354 ERR("IContextMenu->QueryInterface(IShellExtInit) failed.clsid %s hr 0x%x\n", wine_dbgstr_guid(&clsid), hr);
355 return hr;
356 }
357
358 hr = pExtInit->Initialize(m_pidlFolder, m_pDataObj, hKey);
359 if (FAILED(hr))
360 {
361 WARN("IShellExtInit::Initialize failed.clsid %s hr 0x%x\n", wine_dbgstr_guid(&clsid), hr);
362 return hr;
363 }
364
365 if (m_site)
367
368 m_DynamicEntries.AddTail({ 0, 0, clsid, pcm });
369
370 return S_OK;
371}
BOOL IsShellExtensionAlreadyLoaded(REFCLSID clsid)
HRESULT WINAPI IUnknown_SetSite(IUnknown *obj, IUnknown *site)
Definition: ordinal.c:1407
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 1089 of file CDefaultContextMenu.cpp.

1090{
1091 WCHAR UnicodeStr[MAX_VERB];
1092
1093 /* Loop through all the static verbs looking for a match */
1094 for (UINT i = 0; i < _countof(g_StaticInvokeCmdMap); i++)
1095 {
1096 /* We can match both ANSI and unicode strings */
1097 if (IsUnicode)
1098 {
1099 /* The static verbs are ANSI, get a unicode version before doing the compare */
1100 SHAnsiToUnicode(g_StaticInvokeCmdMap[i].szStringVerb, UnicodeStr, MAX_VERB);
1101 if (!wcscmp(UnicodeStr, (LPWSTR)Verb))
1102 {
1103 /* Return the Corresponding Id */
1104 *idCmd = g_StaticInvokeCmdMap[i].IntVerb;
1105 return TRUE;
1106 }
1107 }
1108 else
1109 {
1110 if (!strcmp(g_StaticInvokeCmdMap[i].szStringVerb, (LPSTR)Verb))
1111 {
1112 *idCmd = g_StaticInvokeCmdMap[i].IntVerb;
1113 return TRUE;
1114 }
1115 }
1116 }
1117
1118 return FALSE;
1119}
#define MAX_VERB
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469
_Check_return_ _CRTIMP int __cdecl wcscmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
char * LPSTR
Definition: xmlstorage.h:182

Referenced by InvokeCommand().

◆ QueryContextMenu()

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

Implements IContextMenu.

Definition at line 717 of file CDefaultContextMenu.cpp.

723{
724 HRESULT hr;
725 UINT idCmdNext = idCmdFirst;
726 UINT cIds = 0;
727
728 TRACE("BuildShellItemContextMenu entered\n");
729
730 /* Load static verbs and shell extensions from registry */
731 for (UINT i = 0; i < m_cKeys && !(uFlags & CMF_NOVERBS); i++)
732 {
735 }
736
737 /* Add static context menu handlers */
738 cIds = AddStaticContextMenusToMenu(hMenu, &IndexMenu, idCmdFirst, idCmdLast, uFlags);
739 m_iIdSCMFirst = 0; // FIXME: This should be = idCmdFirst?
740 m_iIdSCMLast = cIds;
741 idCmdNext = idCmdFirst + cIds;
742
743 /* Add dynamic context menu handlers */
744 cIds += AddShellExtensionsToMenu(hMenu, &IndexMenu, idCmdNext, idCmdLast, uFlags);
746 m_iIdSHELast = cIds;
747 idCmdNext = idCmdFirst + cIds;
748 TRACE("SH_LoadContextMenuHandlers first %x last %x\n", m_iIdSHEFirst, m_iIdSHELast);
749
750 /* Now let the callback add its own items */
751 QCMINFO qcminfo = {hMenu, IndexMenu, idCmdNext, idCmdLast, NULL};
753 {
754 UINT added = qcminfo.idCmdFirst - idCmdNext;
755 cIds += added;
756 IndexMenu += added;
758 m_iIdCBLast = cIds;
759 idCmdNext = idCmdFirst + cIds;
760 }
761
762 //TODO: DFM_MERGECONTEXTMENU_BOTTOM
763
764 UINT idDefaultOffset = 0;
765 BOOL isBackgroundMenu = !m_cidl;
766 if (!(uFlags & CMF_VERBSONLY) && !isBackgroundMenu)
767 {
768 /* Get the attributes of the items */
769 SFGAOF rfg = SFGAO_BROWSABLE | SFGAO_CANCOPY | SFGAO_CANLINK | SFGAO_CANMOVE | SFGAO_CANDELETE | SFGAO_CANRENAME | SFGAO_HASPROPSHEET | SFGAO_FILESYSTEM | SFGAO_FOLDER;
770 hr = m_psf->GetAttributesOf(m_cidl, m_apidl, &rfg);
772 return MAKE_HRESULT(SEVERITY_SUCCESS, 0, cIds);
773
774 /* Add the default part of the menu */
775 HMENU hmenuDefault = LoadMenu(_AtlBaseModule.GetResourceInstance(), L"MENU_SHV_FILE");
776
777 /* Remove uneeded entries */
778 if (!(rfg & SFGAO_CANMOVE))
779 DeleteMenu(hmenuDefault, IDM_CUT, MF_BYCOMMAND);
780 if (!(rfg & SFGAO_CANCOPY))
781 DeleteMenu(hmenuDefault, IDM_COPY, MF_BYCOMMAND);
782 if (!((rfg & SFGAO_FILESYSTEM) && HasClipboardData()))
783 DeleteMenu(hmenuDefault, IDM_INSERT, MF_BYCOMMAND);
784 if (!(rfg & SFGAO_CANLINK))
785 DeleteMenu(hmenuDefault, IDM_CREATELINK, MF_BYCOMMAND);
786 if (!(rfg & SFGAO_CANDELETE))
787 DeleteMenu(hmenuDefault, IDM_DELETE, MF_BYCOMMAND);
788 if (!(rfg & SFGAO_CANRENAME))
789 DeleteMenu(hmenuDefault, IDM_RENAME, MF_BYCOMMAND);
790 if (!(rfg & SFGAO_HASPROPSHEET))
791 DeleteMenu(hmenuDefault, IDM_PROPERTIES, MF_BYCOMMAND);
792
793 idDefaultOffset = idCmdNext;
794 UINT idMax = Shell_MergeMenus(hMenu, GetSubMenu(hmenuDefault, 0), IndexMenu, idCmdNext, idCmdLast, 0);
795 m_iIdDfltFirst = cIds;
796 cIds += idMax - idCmdNext;
797 m_iIdDfltLast = cIds;
798
799 DestroyMenu(hmenuDefault);
800 }
801
802 TryPickDefault(hMenu, idCmdFirst, idDefaultOffset, uFlags);
803
804 // TODO: DFM_MERGECONTEXTMENU_TOP
805
806 return MAKE_HRESULT(SEVERITY_SUCCESS, 0, cIds);
807}
static BOOL HasClipboardData()
#define IDM_PROPERTIES
Definition: resources.h:9
UINT AddShellExtensionsToMenu(HMENU hMenu, UINT *pIndexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags)
UINT AddStaticContextMenusToMenu(HMENU hMenu, UINT *IndexMenu, UINT iIdCmdFirst, UINT iIdCmdLast, UINT uFlags)
BOOL EnumerateDynamicContextHandlerForKey(HKEY hRootKey)
void TryPickDefault(HMENU hMenu, UINT idCmdFirst, UINT DfltOffset, UINT uFlags)
void AddStaticEntriesForKey(HKEY hKey, UINT uFlags)
#define DFM_MERGECONTEXTMENU
Definition: precomp.h:44
#define MAKE_HRESULT(sev, fac, code)
Definition: dmerror.h:30
static IShellFolder IShellItem **static IBindCtx LPITEMIDLIST SFGAOF
Definition: ebrowser.c:83
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:63
UINT WINAPI Shell_MergeMenus(HMENU hmDst, HMENU hmSrc, UINT uInsert, UINT uIDAdjust, UINT uIDAdjustMax, ULONG uFlags)
Definition: shlmenu.c:856
#define IDM_DELETE
Definition: shresdef.h:849
#define IDM_INSERT
Definition: shresdef.h:847
#define IDM_RENAME
Definition: shresdef.h:850
#define IDM_COPY
Definition: shresdef.h:846
#define IDM_CUT
Definition: shresdef.h:845
#define IDM_CREATELINK
Definition: shresdef.h:848
UINT idCmdFirst
Definition: shlobj.h:1383
#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)
#define LoadMenu
Definition: winuser.h:5816
BOOL WINAPI DestroyMenu(_In_ HMENU)

◆ SetSite()

HRESULT WINAPI CDefaultContextMenu::SetSite ( IUnknown pUnkSite)
virtual

Implements IObjectWithSite.

Definition at line 1581 of file CDefaultContextMenu.cpp.

1582{
1583 m_site = pUnkSite;
1584 return S_OK;
1585}

◆ TryPickDefault()

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

Definition at line 680 of file CDefaultContextMenu.cpp.

681{
682 // Are we allowed to pick a default?
684 if (((uFlags & CMF_NODEFAULT) && ntver >= _WIN32_WINNT_VISTA) ||
685 ((uFlags & CMF_DONOTPICKDEFAULT) && ntver >= _WIN32_WINNT_WIN7))
686 {
687 return;
688 }
689
690 // Do we already have a default?
691 if ((int)GetMenuDefaultItem(hMenu, MF_BYPOSITION, 0) != -1)
692 return;
693
694 // Does the view want to pick one?
695 INT_PTR forceDfm = 0;
696 if (_DoCallback(DFM_GETDEFSTATICID, 0, &forceDfm) == S_OK && forceDfm)
697 {
698 for (UINT i = 0; i < _countof(g_StaticInvokeCmdMap); ++i)
699 {
700 UINT menuItemId = g_StaticInvokeCmdMap[i].IntVerb + DfltOffset - DCM_FCIDM_SHVIEW_OFFSET;
701 if (g_StaticInvokeCmdMap[i].DfmCmd == forceDfm &&
702 SetMenuDefaultItem(hMenu, menuItemId, MF_BYCOMMAND))
703 {
704 return;
705 }
706 }
707 }
708
709 // Don't want to pick something like cut or delete as the default but
710 // a static or dynamic verb is a good default.
712 SetMenuDefaultItem(hMenu, idCmdFirst, MF_BYCOMMAND);
713}
#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 1177 of file CDefaultContextMenu.cpp.

1179{
1181 HRESULT hr;
1182
1183 if (!m_site)
1184 return E_FAIL;
1185
1186 /* Get a pointer to the shell browser */
1188 if (FAILED(hr))
1189 return hr;
1190
1191 PIDLIST_ABSOLUTE pidl;
1192 hr = SHILCombine(m_pidlFolder, pidlChild, &pidl);
1194 return hr;
1195
1196 hr = psb->BrowseObject(pidl, wFlags & ~SBSP_RELATIVE);
1197 ILFree(pidl);
1198 return hr;
1199}

Referenced by InvokeRegVerb().

Member Data Documentation

◆ m_aKeys

HKEY* CDefaultContextMenu::m_aKeys
private

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

Referenced by EnumerateDynamicContextHandlerForKey().

◆ m_cidl

UINT CDefaultContextMenu::m_cidl
private

◆ m_cKeys

UINT CDefaultContextMenu::m_cKeys
private

Definition at line 84 of file CDefaultContextMenu.cpp.

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

◆ m_DynamicEntries

◆ m_iIdCBFirst

UINT CDefaultContextMenu::m_iIdCBFirst
private

Definition at line 93 of file CDefaultContextMenu.cpp.

Referenced by InvokeCommand(), and QueryContextMenu().

◆ m_iIdCBLast

UINT CDefaultContextMenu::m_iIdCBLast
private

Definition at line 94 of file CDefaultContextMenu.cpp.

Referenced by InvokeCommand(), and QueryContextMenu().

◆ m_iIdDfltFirst

UINT CDefaultContextMenu::m_iIdDfltFirst
private

Definition at line 95 of file CDefaultContextMenu.cpp.

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

◆ m_iIdDfltLast

UINT CDefaultContextMenu::m_iIdDfltLast
private

Definition at line 96 of file CDefaultContextMenu.cpp.

Referenced by GetCommandString(), InvokeCommand(), 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 79 of file CDefaultContextMenu.cpp.

Referenced by _DoCallback(), and Initialize().

◆ m_pidlFolder

◆ m_pmcb

CComPtr<IContextMenuCB> CDefaultContextMenu::m_pmcb
private

Definition at line 78 of file CDefaultContextMenu.cpp.

Referenced by _DoCallback(), and Initialize().

◆ m_psf

CComPtr<IShellFolder> CDefaultContextMenu::m_psf
private

◆ m_site

CComPtr<IUnknown> CDefaultContextMenu::m_site
private

◆ m_StaticEntries


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