ReactOS  0.4.15-dev-449-g64abd9f
CSendToMenu Class Reference

#include <CSendToMenu.h>

Inheritance diagram for CSendToMenu:
Collaboration diagram for CSendToMenu:

Classes

struct  SENDTO_ITEM
 

Public Member Functions

 CSendToMenu ()
 
 ~CSendToMenu ()
 
STDMETHODIMP QueryContextMenu (HMENU hMenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags)
 
STDMETHODIMP InvokeCommand (LPCMINVOKECOMMANDINFO lpcmi)
 
STDMETHODIMP GetCommandString (UINT_PTR idCommand, UINT uFlags, UINT *lpReserved, LPSTR lpszName, UINT uMaxNameLen)
 
STDMETHODIMP HandleMenuMsg2 (UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *plResult)
 
STDMETHODIMP HandleMenuMsg (UINT uMsg, WPARAM wParam, LPARAM lParam)
 
STDMETHODIMP Initialize (PCIDLIST_ABSOLUTE pidlFolder, IDataObject *pdtobj, HKEY hkeyProgID)
 
- 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 ()
 
- Public Member Functions inherited from IUnknown
HRESULT QueryInterface ([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
 
ULONG AddRef ()
 
ULONG Release ()
 

Private Member Functions

HRESULT LoadAllItems (HWND hwnd)
 
void UnloadAllItems ()
 
UINT InsertSendToItems (HMENU hMenu, UINT idFirst, UINT idMenu)
 
SENDTO_ITEMFindItemFromIdOffset (UINT IdOffset)
 
HRESULT DoSendToItem (SENDTO_ITEM *pItem, LPCMINVOKECOMMANDINFO lpici)
 
HRESULT DoDrop (IDataObject *pDataObject, IDropTarget *pDropTarget)
 
HRESULT GetSpecialFolder (HWND hwnd, IShellFolder **ppFolder, int csidl, PIDLIST_ABSOLUTE *ppidl=NULL)
 
HRESULT GetUIObjectFromPidl (HWND hwnd, PIDLIST_ABSOLUTE pidl, REFIID riid, LPVOID *ppvOut)
 

Private Attributes

HMENU m_hSubMenu
 
SENDTO_ITEMm_pItems
 
UINT m_idCmdFirst
 
CComPtr< IShellFolderm_pDesktop
 
CComPtr< IShellFolderm_pSendTo
 
CComPtr< IDataObjectm_pDataObject
 

Additional Inherited Members

- Public Types inherited from IContextMenu3
typedef IContextMenu3LPCONTEXTMENU3
 
- Public Types inherited from IContextMenu2
typedef IContextMenu2LPCONTEXTMENU2
 
- Public Types inherited from IContextMenu
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 IShellExtInit
typedef IShellExtInitLPSHELLEXTINIT
 
- 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
 
- Public Attributes inherited from IContextMenu
CMIC_MASK_NOZONECHECKS typedef IContextMenuLPCONTEXTMENU
 
- Static Public Attributes inherited from IContextMenu
static CMDSTR_VIEWDETAILSW(const WCHAR []) 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 26 of file CSendToMenu.h.

Constructor & Destructor Documentation

◆ CSendToMenu()

CSendToMenu::CSendToMenu ( )

Definition at line 25 of file CSendToMenu.cpp.

26  : m_hSubMenu(NULL)
27  , m_pItems(NULL)
28  , m_idCmdFirst(0)
29 {
31  if (FAILED(hr))
32  {
33  ERR("SHGetDesktopFolder: %08lX\n", hr);
34  }
35 
37 }
HRESULT hr
Definition: shlfolder.c:183
CComPtr< IShellFolder > m_pSendTo
Definition: CSendToMenu.h:66
smooth NULL
Definition: ftsmooth.c:416
SENDTO_ITEM * m_pItems
Definition: CSendToMenu.h:62
HRESULT WINAPI SHGetDesktopFolder(IShellFolder **psf)
LONG HRESULT
Definition: typedefs.h:78
#define CSIDL_SENDTO
Definition: shlobj.h:2021
HMENU m_hSubMenu
Definition: CSendToMenu.h:61
UINT m_idCmdFirst
Definition: CSendToMenu.h:63
#define ERR(fmt,...)
Definition: debug.h:110
HRESULT GetSpecialFolder(HWND hwnd, IShellFolder **ppFolder, int csidl, PIDLIST_ABSOLUTE *ppidl=NULL)
CComPtr< IShellFolder > m_pDesktop
Definition: CSendToMenu.h:65

◆ ~CSendToMenu()

CSendToMenu::~CSendToMenu ( )

Definition at line 39 of file CSendToMenu.cpp.

40 {
42 
43  if (m_hSubMenu)
44  {
46  m_hSubMenu = NULL;
47  }
48 }
smooth NULL
Definition: ftsmooth.c:416
HMENU m_hSubMenu
Definition: CSendToMenu.h:61
BOOL WINAPI DestroyMenu(_In_ HMENU)
void UnloadAllItems()

Member Function Documentation

◆ DoDrop()

HRESULT CSendToMenu::DoDrop ( IDataObject pDataObject,
IDropTarget pDropTarget 
)
private

Definition at line 50 of file CSendToMenu.cpp.

51 {
52  DWORD dwEffect = DROPEFFECT_MOVE | DROPEFFECT_COPY | DROPEFFECT_LINK;
53 
55  BOOL bCtrl = (GetAsyncKeyState(VK_CONTROL) < 0);
56 
57  // THIS CODE IS NOT HUMAN-FRIENDLY. SORRY.
58  // (We have to translate a SendTo action to a Drop action)
59  DWORD dwKeyState = MK_LBUTTON;
60  if (bShift && bCtrl)
61  dwKeyState |= MK_SHIFT | MK_CONTROL;
62  else if (!bShift)
63  dwKeyState |= MK_CONTROL;
64  if (bCtrl)
65  dwKeyState |= MK_SHIFT;
66 
67  POINTL ptl = { 0, 0 };
68  HRESULT hr = pDropTarget->DragEnter(pDataObject, dwKeyState, ptl, &dwEffect);
70  {
71  pDropTarget->DragLeave();
72  return hr;
73  }
74 
75  if (dwEffect == DROPEFFECT_NONE)
76  {
77  ERR("DROPEFFECT_NONE\n");
78  pDropTarget->DragLeave();
79  return E_FAIL;
80  }
81 
82  // THIS CODE IS NOT HUMAN-FRIENDLY. SORRY.
83  // (We have to translate a SendTo action to a Drop action)
84  if (bShift && bCtrl)
85  dwEffect = DROPEFFECT_LINK;
86  else if (!bShift)
87  dwEffect = DROPEFFECT_MOVE;
88  else
89  dwEffect = DROPEFFECT_COPY;
90 
91  hr = pDropTarget->Drop(pDataObject, dwKeyState, ptl, &dwEffect);
93  return hr;
94 
95  return hr;
96 }
#define MK_SHIFT
Definition: winuser.h:2344
HRESULT hr
Definition: shlfolder.c:183
#define MK_LBUTTON
Definition: winuser.h:2342
volatile BOOLEAN bShift
Definition: shell.c:71
#define E_FAIL
Definition: ddrawi.h:102
unsigned int BOOL
Definition: ntddk_ex.h:94
#define VK_SHIFT
Definition: winuser.h:2177
HRESULT DragEnter([in, unique] IDataObject *pDataObj, [in] DWORD grfKeyState, [in] POINTL pt, [in, out] DWORD *pdwEffect)
LONG HRESULT
Definition: typedefs.h:78
#define FAILED_UNEXPECTEDLY(hr)
Definition: shellutils.h:71
unsigned long DWORD
Definition: ntddk_ex.h:95
SHORT WINAPI GetAsyncKeyState(_In_ int)
#define ERR(fmt,...)
Definition: debug.h:110
HRESULT Drop([in, unique] IDataObject *pDataObj, [in] DWORD grfKeyState, [in] POINTL pt, [in, out] DWORD *pdwEffect)
#define MK_CONTROL
Definition: winuser.h:2345
#define VK_CONTROL
Definition: winuser.h:2178
HRESULT DragLeave()

Referenced by DoSendToItem().

◆ DoSendToItem()

HRESULT CSendToMenu::DoSendToItem ( SENDTO_ITEM pItem,
LPCMINVOKECOMMANDINFO  lpici 
)
private

Definition at line 265 of file CSendToMenu.cpp.

266 {
267  if (!m_pDataObject)
268  {
269  ERR("!m_pDataObject\n");
270  return E_FAIL;
271  }
272 
273  HRESULT hr;
274  CComPtr<IDropTarget> pDropTarget;
275  hr = m_pSendTo->GetUIObjectOf(NULL, 1, &pItem->pidlChild, IID_IDropTarget,
276  NULL, (LPVOID *)&pDropTarget);
277  if (FAILED_UNEXPECTEDLY(hr))
278  return hr;
279 
280  hr = DoDrop(m_pDataObject, pDropTarget);
281  if (FAILED_UNEXPECTEDLY(hr))
282  return hr;
283 
284  return hr;
285 }
CComPtr< IDataObject > m_pDataObject
Definition: CSendToMenu.h:67
HRESULT hr
Definition: shlfolder.c:183
CComPtr< IShellFolder > m_pSendTo
Definition: CSendToMenu.h:66
#define E_FAIL
Definition: ddrawi.h:102
HRESULT DoDrop(IDataObject *pDataObject, IDropTarget *pDropTarget)
Definition: CSendToMenu.cpp:50
smooth NULL
Definition: ftsmooth.c:416
LONG HRESULT
Definition: typedefs.h:78
#define FAILED_UNEXPECTEDLY(hr)
Definition: shellutils.h:71
#define ERR(fmt,...)
Definition: debug.h:110

Referenced by InvokeCommand().

◆ FindItemFromIdOffset()

CSendToMenu::SENDTO_ITEM * CSendToMenu::FindItemFromIdOffset ( UINT  IdOffset)
private

Definition at line 252 of file CSendToMenu.cpp.

253 {
254  UINT idCmd = m_idCmdFirst + IdOffset;
255 
256  MENUITEMINFOW mii = { sizeof(mii) };
257  mii.fMask = MIIM_DATA;
258  if (GetMenuItemInfoW(m_hSubMenu, idCmd, FALSE, &mii))
259  return reinterpret_cast<SENDTO_ITEM *>(mii.dwItemData);
260 
261  ERR("GetMenuItemInfoW: %ld\n", GetLastError());
262  return NULL;
263 }
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
smooth NULL
Definition: ftsmooth.c:416
BOOL WINAPI GetMenuItemInfoW(_In_ HMENU, _In_ UINT, _In_ BOOL, _Inout_ LPMENUITEMINFOW)
HMENU m_hSubMenu
Definition: CSendToMenu.h:61
UINT m_idCmdFirst
Definition: CSendToMenu.h:63
#define ERR(fmt,...)
Definition: debug.h:110
unsigned int UINT
Definition: ndis.h:50
#define MIIM_DATA
Definition: winuser.h:721
ULONG_PTR dwItemData
Definition: winuser.h:3243

Referenced by InvokeCommand().

◆ GetCommandString()

STDMETHODIMP CSendToMenu::GetCommandString ( UINT_PTR  idCommand,
UINT  uFlags,
UINT lpReserved,
LPSTR  lpszName,
UINT  uMaxNameLen 
)

Implements IContextMenu.

Definition at line 348 of file CSendToMenu.cpp.

353 {
354  FIXME("%p %lu %u %p %p %u\n", this,
355  idCmd, uType, pwReserved, pszName, cchMax);
356 
357  return E_NOTIMPL;
358 }
#define FIXME(fmt,...)
Definition: debug.h:111
UINT cchMax
#define E_NOTIMPL
Definition: ddrawi.h:99

◆ GetSpecialFolder()

HRESULT CSendToMenu::GetSpecialFolder ( HWND  hwnd,
IShellFolder **  ppFolder,
int  csidl,
PIDLIST_ABSOLUTE ppidl = NULL 
)
private

Definition at line 100 of file CSendToMenu.cpp.

102 {
103  if (!ppFolder)
104  return E_POINTER;
105  *ppFolder = NULL;
106 
107  if (ppidl)
108  *ppidl = NULL;
109 
111  HRESULT hr = SHGetSpecialFolderLocation(hwnd, csidl, &pidl);
112  if (FAILED_UNEXPECTEDLY(hr))
113  return hr;
114 
115  IShellFolder *pFolder = NULL;
116  hr = m_pDesktop->BindToObject(pidl, NULL, IID_PPV_ARG(IShellFolder, &pFolder));
117 
118  if (ppidl)
119  *ppidl = pidl.Detach();
120 
121  if (FAILED_UNEXPECTEDLY(hr))
122  return hr;
123 
124  *ppFolder = pFolder;
125  return hr;
126 }
const DOCKBAR PVOID HWND HWND * hwnd
Definition: tooldock.h:22
HRESULT hr
Definition: shlfolder.c:183
#define IID_PPV_ARG(Itype, ppType)
smooth NULL
Definition: ftsmooth.c:416
HRESULT WINAPI SHGetSpecialFolderLocation(HWND hwndOwner, INT nFolder, LPITEMIDLIST *ppidl)
Definition: shellpath.c:2830
LONG HRESULT
Definition: typedefs.h:78
#define FAILED_UNEXPECTEDLY(hr)
Definition: shellutils.h:71
#define E_POINTER
Definition: winerror.h:2365
CComPtr< IShellFolder > m_pDesktop
Definition: CSendToMenu.h:65

Referenced by CSendToMenu(), and LoadAllItems().

◆ GetUIObjectFromPidl()

HRESULT CSendToMenu::GetUIObjectFromPidl ( HWND  hwnd,
PIDLIST_ABSOLUTE  pidl,
REFIID  riid,
LPVOID ppvOut 
)
private

Definition at line 129 of file CSendToMenu.cpp.

131 {
132  *ppvOut = NULL;
133 
134  PCITEMID_CHILD pidlLast;
135  CComPtr<IShellFolder> pFolder;
136  HRESULT hr = SHBindToParent(pidl, IID_PPV_ARG(IShellFolder, &pFolder), &pidlLast);
137  if (FAILED_UNEXPECTEDLY(hr))
138  return hr;
139 
140  hr = pFolder->GetUIObjectOf(hwnd, 1, &pidlLast, riid, NULL, ppvOut);
141  if (FAILED_UNEXPECTEDLY(hr))
142  return hr;
143 
144  return hr;
145 }
const DOCKBAR PVOID HWND HWND * hwnd
Definition: tooldock.h:22
HRESULT hr
Definition: shlfolder.c:183
REFIID riid
Definition: precomp.h:44
#define IID_PPV_ARG(Itype, ppType)
smooth NULL
Definition: ftsmooth.c:416
LONG HRESULT
Definition: typedefs.h:78
#define FAILED_UNEXPECTEDLY(hr)
Definition: shellutils.h:71
HRESULT WINAPI SHBindToParent(LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppv, LPCITEMIDLIST *ppidlLast)
Definition: pidl.c:1331

◆ HandleMenuMsg()

STDMETHODIMP CSendToMenu::HandleMenuMsg ( UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam 
)

Implements IContextMenu2.

Definition at line 361 of file CSendToMenu.cpp.

362 {
363  return S_OK;
364 }
#define S_OK
Definition: intsafe.h:59

◆ HandleMenuMsg2()

STDMETHODIMP CSendToMenu::HandleMenuMsg2 ( UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam,
LRESULT plResult 
)

Implements IContextMenu3.

Definition at line 367 of file CSendToMenu.cpp.

369 {
370  UINT cxSmall = GetSystemMetrics(SM_CXSMICON);
371  UINT cySmall = GetSystemMetrics(SM_CYSMICON);
372 
373  switch (uMsg)
374  {
375  case WM_MEASUREITEM:
376  {
377  MEASUREITEMSTRUCT* lpmis = reinterpret_cast<MEASUREITEMSTRUCT*>(lParam);
378  if (!lpmis || lpmis->CtlType != ODT_MENU)
379  break;
380 
381  UINT cxMenuCheck = GetSystemMetrics(SM_CXMENUCHECK);
382  if (lpmis->itemWidth < cxMenuCheck)
383  lpmis->itemWidth = cxMenuCheck;
384  if (lpmis->itemHeight < cySmall)
385  lpmis->itemHeight = cySmall;
386 
387  if (plResult)
388  *plResult = TRUE;
389  break;
390  }
391  case WM_DRAWITEM:
392  {
393  DRAWITEMSTRUCT* lpdis = reinterpret_cast<DRAWITEMSTRUCT*>(lParam);
394  if (!lpdis || lpdis->CtlType != ODT_MENU)
395  break;
396 
397  SENDTO_ITEM *pItem = reinterpret_cast<SENDTO_ITEM *>(lpdis->itemData);
398  HICON hIcon = NULL;
399  if (pItem)
400  hIcon = pItem->hIcon;
401  if (!hIcon)
402  break;
403 
404  const RECT& rcItem = lpdis->rcItem;
405  INT x = 4;
406  INT y = lpdis->rcItem.top;
407  y += (rcItem.bottom - rcItem.top - cySmall) / 2;
408  DrawIconEx(lpdis->hDC, x, y, hIcon, cxSmall, cySmall,
409  0, NULL, DI_NORMAL);
410 
411  if (plResult)
412  *plResult = TRUE;
413  }
414  }
415 
416  return S_OK;
417 }
static HICON
Definition: imagelist.c:84
#define TRUE
Definition: types.h:120
#define ODT_MENU
Definition: winuser.h:2512
#define SM_CXMENUCHECK
Definition: winuser.h:1021
LONG top
Definition: windef.h:307
ULONG_PTR itemData
Definition: winuser.h:3068
#define SM_CYSMICON
Definition: winuser.h:1003
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
int32_t INT
Definition: typedefs.h:57
smooth NULL
Definition: ftsmooth.c:416
BOOL WINAPI DrawIconEx(_In_ HDC, _In_ int, _In_ int, _In_ HICON, _In_ int, _In_ int, _In_ UINT, _In_opt_ HBRUSH, _In_ UINT)
Definition: cursoricon.c:1997
int WINAPI GetSystemMetrics(_In_ int)
#define WM_MEASUREITEM
Definition: winuser.h:1628
#define SM_CXSMICON
Definition: winuser.h:1002
#define DI_NORMAL
Definition: wingdi.h:72
#define S_OK
Definition: intsafe.h:59
HICON hIcon
Definition: msconfig.c:44
unsigned int UINT
Definition: ndis.h:50
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
#define WM_DRAWITEM
Definition: winuser.h:1627
LONG bottom
Definition: windef.h:309
LPARAM lParam
Definition: combotst.c:139

◆ Initialize()

STDMETHODIMP CSendToMenu::Initialize ( PCIDLIST_ABSOLUTE  pidlFolder,
IDataObject pdtobj,
HKEY  hkeyProgID 
)

Implements IShellExtInit.

Definition at line 420 of file CSendToMenu.cpp.

422 {
423  m_pDataObject = pdtobj;
424  return S_OK;
425 }
CComPtr< IDataObject > m_pDataObject
Definition: CSendToMenu.h:67
#define S_OK
Definition: intsafe.h:59

◆ InsertSendToItems()

UINT CSendToMenu::InsertSendToItems ( HMENU  hMenu,
UINT  idFirst,
UINT  idMenu 
)
private

Definition at line 214 of file CSendToMenu.cpp.

215 {
216  if (m_pItems == NULL)
217  {
219  if (FAILED_UNEXPECTEDLY(hr))
220  return 0;
221  }
222 
223  m_idCmdFirst = idCmdFirst;
224 
225  UINT idCmd = idCmdFirst;
226  for (SENDTO_ITEM *pCurItem = m_pItems; pCurItem; pCurItem = pCurItem->pNext)
227  {
229  if (InsertMenuW(hMenu, Pos, uFlags, idCmd, pCurItem->pszText))
230  {
231  MENUITEMINFOW mii;
232  mii.cbSize = sizeof(mii);
233  mii.fMask = MIIM_DATA | MIIM_BITMAP;
234  mii.dwItemData = reinterpret_cast<ULONG_PTR>(pCurItem);
235  mii.hbmpItem = HBMMENU_CALLBACK;
236  SetMenuItemInfoW(hMenu, idCmd, FALSE, &mii);
237  ++idCmd;
238 
239  // successful
240  }
241  }
242 
243  if (idCmd == idCmdFirst)
244  {
246  AppendMenuW(hMenu, MF_GRAYED | MF_DISABLED | MF_STRING, idCmd, strNone);
247  }
248 
249  return idCmd - idCmdFirst;
250 }
#define MF_DISABLED
Definition: winuser.h:130
HRESULT hr
Definition: shlfolder.c:183
BOOL WINAPI InsertMenuW(_In_ HMENU, _In_ UINT, _In_ UINT, _In_ UINT_PTR, _In_opt_ LPCWSTR)
#define IDS_NONE
Definition: resource.h:123
ush Pos
Definition: deflate.h:92
#define MF_STRING
Definition: winuser.h:138
UINT uFlags
Definition: api.c:59
#define MIIM_BITMAP
Definition: winuser.h:723
BOOL WINAPI AppendMenuW(_In_ HMENU, _In_ UINT, _In_ UINT_PTR, _In_opt_ LPCWSTR)
#define MF_BYPOSITION
Definition: winuser.h:203
BOOL WINAPI SetMenuItemInfoW(_In_ HMENU, _In_ UINT, _In_ BOOL, _In_ LPCMENUITEMINFOW)
smooth NULL
Definition: ftsmooth.c:416
SENDTO_ITEM * m_pItems
Definition: CSendToMenu.h:62
#define HBMMENU_CALLBACK
Definition: winuser.h:2605
LONG HRESULT
Definition: typedefs.h:78
#define MF_ENABLED
Definition: winuser.h:128
#define FAILED_UNEXPECTEDLY(hr)
Definition: shellutils.h:71
HRESULT LoadAllItems(HWND hwnd)
UINT m_idCmdFirst
Definition: CSendToMenu.h:63
unsigned int UINT
Definition: ndis.h:50
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
#define MF_GRAYED
Definition: winuser.h:129
#define MIIM_DATA
Definition: winuser.h:721
ULONG_PTR dwItemData
Definition: winuser.h:3243

Referenced by QueryContextMenu().

◆ InvokeCommand()

STDMETHODIMP CSendToMenu::InvokeCommand ( LPCMINVOKECOMMANDINFO  lpcmi)

Implements IContextMenu.

Definition at line 330 of file CSendToMenu.cpp.

331 {
332  HRESULT hr = E_FAIL;
333 
334  WORD idCmd = LOWORD(lpici->lpVerb);
335  TRACE("idCmd: %d\n", idCmd);
336 
337  SENDTO_ITEM *pItem = FindItemFromIdOffset(idCmd);
338  if (pItem)
339  {
340  hr = DoSendToItem(pItem, lpici);
341  }
342 
343  TRACE("CSendToMenu::InvokeCommand %x\n", hr);
344  return hr;
345 }
HRESULT hr
Definition: shlfolder.c:183
#define E_FAIL
Definition: ddrawi.h:102
SENDTO_ITEM * FindItemFromIdOffset(UINT IdOffset)
#define TRACE(s)
Definition: solgame.cpp:4
LONG HRESULT
Definition: typedefs.h:78
unsigned short WORD
Definition: ntddk_ex.h:93
HRESULT DoSendToItem(SENDTO_ITEM *pItem, LPCMINVOKECOMMANDINFO lpici)
#define LOWORD(l)
Definition: pedump.c:82

◆ LoadAllItems()

HRESULT CSendToMenu::LoadAllItems ( HWND  hwnd)
private

Definition at line 159 of file CSendToMenu.cpp.

160 {
161  UnloadAllItems();
162 
164 
165  m_pSendTo.Release();
167  if (FAILED_UNEXPECTEDLY(hr))
168  return hr;
169 
170  CComPtr<IEnumIDList> pEnumIDList;
171  hr = m_pSendTo->EnumObjects(hwnd,
172  SHCONTF_FOLDERS | SHCONTF_NONFOLDERS,
173  &pEnumIDList);
174  if (FAILED_UNEXPECTEDLY(hr))
175  return hr;
176 
177  hr = S_OK;
179  while (pEnumIDList->Next(1, &child, NULL) == S_OK)
180  {
181  CComHeapPtr<ITEMID_CHILD> pidlChild(child);
182 
183  STRRET strret;
184  hr = m_pSendTo->GetDisplayNameOf(pidlChild, SHGDN_NORMAL, &strret);
185  if (FAILED_UNEXPECTEDLY(hr))
186  continue;
187 
188  CComHeapPtr<WCHAR> pszText;
189  hr = StrRetToStrW(&strret, pidlChild, &pszText);
190  if (FAILED_UNEXPECTEDLY(hr))
191  continue;
192 
194  pidlAbsolute.Attach(ILCombine(pidlSendTo, pidlChild));
195 
196  SHFILEINFOW fi = { NULL };
199  SHGetFileInfoW(reinterpret_cast<LPWSTR>(static_cast<PIDLIST_ABSOLUTE>(pidlAbsolute)), 0,
200  &fi, sizeof(fi), uFlags);
201 
202  SENDTO_ITEM *pNewItem =
203  new SENDTO_ITEM(pidlChild.Detach(), pszText.Detach(), fi.hIcon);
204  if (m_pItems)
205  {
206  pNewItem->pNext = m_pItems;
207  }
208  m_pItems = pNewItem;
209  }
210 
211  return hr;
212 }
const DOCKBAR PVOID HWND HWND * hwnd
Definition: tooldock.h:22
#define SHGFI_TYPENAME
Definition: shellapi.h:165
HRESULT hr
Definition: shlfolder.c:183
CComPtr< IShellFolder > m_pSendTo
Definition: CSendToMenu.h:66
LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: pidl.c:699
UINT uFlags
Definition: api.c:59
#define SHGFI_SMALLICON
Definition: shellapi.h:174
static HWND child
Definition: cursoricon.c:298
#define SHGFI_PIDL
Definition: shellapi.h:178
smooth NULL
Definition: ftsmooth.c:416
SENDTO_ITEM * m_pItems
Definition: CSendToMenu.h:62
DWORD_PTR WINAPI SHGetFileInfoW(LPCWSTR path, DWORD dwFileAttributes, SHFILEINFOW *psfi, UINT sizeofpsfi, UINT flags)
Definition: shell32_main.c:413
LONG HRESULT
Definition: typedefs.h:78
#define CSIDL_SENDTO
Definition: shlobj.h:2021
#define FAILED_UNEXPECTEDLY(hr)
Definition: shellutils.h:71
HICON hIcon
Definition: shellapi.h:370
#define S_OK
Definition: intsafe.h:59
void Release()
Definition: atlcomcli.h:140
void UnloadAllItems()
unsigned int UINT
Definition: ndis.h:50
#define SHGFI_ICON
Definition: shellapi.h:162
HRESULT GetSpecialFolder(HWND hwnd, IShellFolder **ppFolder, int csidl, PIDLIST_ABSOLUTE *ppidl=NULL)
HRESULT WINAPI StrRetToStrW(LPSTRRET lpStrRet, const ITEMIDLIST *pidl, LPWSTR *ppszName)
Definition: string.c:1623

Referenced by InsertSendToItems().

◆ QueryContextMenu()

STDMETHODIMP CSendToMenu::QueryContextMenu ( HMENU  hMenu,
UINT  indexMenu,
UINT  idCmdFirst,
UINT  idCmdLast,
UINT  uFlags 
)

Implements IContextMenu.

Definition at line 288 of file CSendToMenu.cpp.

293 {
294  TRACE("%p %p %u %u %u %u\n", this,
295  hMenu, indexMenu, idCmdFirst, idCmdLast, uFlags);
296 
297  HMENU hSubMenu = CreateMenu();
298  if (!hSubMenu)
299  {
300  ERR("CreateMenu: %ld\n", GetLastError());
301  return E_FAIL;
302  }
303 
304  UINT cItems = InsertSendToItems(hSubMenu, idCmdFirst, 0);
305 
307 
308  MENUITEMINFOW mii = { sizeof(mii) };
310  mii.fType = MFT_STRING;
311  mii.wID = -1;
312  mii.dwTypeData = strSendTo.GetBuffer();
313  mii.cch = wcslen(mii.dwTypeData);
314  mii.fState = MFS_ENABLED;
315  mii.hSubMenu = hSubMenu;
316  if (!InsertMenuItemW(hMenu, indexMenu, TRUE, &mii))
317  {
318  ERR("InsertMenuItemW: %ld\n", GetLastError());
319  return E_FAIL;
320  }
321 
322  HMENU hOldSubMenu = m_hSubMenu;
323  m_hSubMenu = hSubMenu;
324  DestroyMenu(hOldSubMenu);
325 
326  return MAKE_HRESULT(SEVERITY_SUCCESS, 0, cItems);
327 }
HMENU WINAPI CreateMenu(void)
Definition: menu.c:837
#define MFT_STRING
Definition: winuser.h:741
#define TRUE
Definition: types.h:120
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
LPWSTR dwTypeData
Definition: winuser.h:3244
UINT uFlags
Definition: api.c:59
#define E_FAIL
Definition: ddrawi.h:102
#define SEVERITY_SUCCESS
Definition: winerror.h:64
#define MIIM_SUBMENU
Definition: winuser.h:718
#define MFS_ENABLED
Definition: winuser.h:745
#define MIIM_STATE
Definition: winuser.h:716
#define MAKE_HRESULT(sev, fac, code)
Definition: dmerror.h:30
#define MIIM_ID
Definition: winuser.h:717
#define TRACE(s)
Definition: solgame.cpp:4
UINT InsertSendToItems(HMENU hMenu, UINT idFirst, UINT idMenu)
HMENU m_hSubMenu
Definition: CSendToMenu.h:61
#define MIIM_TYPE
Definition: winuser.h:720
BOOL WINAPI DestroyMenu(_In_ HMENU)
#define ERR(fmt,...)
Definition: debug.h:110
BOOL WINAPI InsertMenuItemW(_In_ HMENU, _In_ UINT, _In_ BOOL, _In_ LPCMENUITEMINFOW)
#define IDS_SENDTO_MENU
Definition: shresdef.h:232
unsigned int UINT
Definition: ndis.h:50
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:60
size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)

◆ UnloadAllItems()

void CSendToMenu::UnloadAllItems ( )
private

Definition at line 147 of file CSendToMenu.cpp.

148 {
149  SENDTO_ITEM *pItems = m_pItems;
150  m_pItems = NULL;
151  while (pItems)
152  {
153  SENDTO_ITEM *pCurItem = pItems;
154  pItems = pItems->pNext;
155  delete pCurItem;
156  }
157 }
smooth NULL
Definition: ftsmooth.c:416
SENDTO_ITEM * m_pItems
Definition: CSendToMenu.h:62
static int int const SCRIPT_CONTROL const SCRIPT_STATE SCRIPT_ITEM * pItems
Definition: usp10.c:62

Referenced by LoadAllItems(), and ~CSendToMenu().

Member Data Documentation

◆ m_hSubMenu

HMENU CSendToMenu::m_hSubMenu
private

Definition at line 61 of file CSendToMenu.h.

Referenced by FindItemFromIdOffset(), QueryContextMenu(), and ~CSendToMenu().

◆ m_idCmdFirst

UINT CSendToMenu::m_idCmdFirst
private

Definition at line 63 of file CSendToMenu.h.

Referenced by FindItemFromIdOffset(), and InsertSendToItems().

◆ m_pDataObject

CComPtr<IDataObject> CSendToMenu::m_pDataObject
private

Definition at line 67 of file CSendToMenu.h.

Referenced by DoSendToItem(), and Initialize().

◆ m_pDesktop

CComPtr<IShellFolder> CSendToMenu::m_pDesktop
private

Definition at line 65 of file CSendToMenu.h.

Referenced by CSendToMenu(), and GetSpecialFolder().

◆ m_pItems

SENDTO_ITEM* CSendToMenu::m_pItems
private

Definition at line 62 of file CSendToMenu.h.

Referenced by InsertSendToItems(), LoadAllItems(), and UnloadAllItems().

◆ m_pSendTo

CComPtr<IShellFolder> CSendToMenu::m_pSendTo
private

Definition at line 66 of file CSendToMenu.h.

Referenced by CSendToMenu(), DoSendToItem(), and LoadAllItems().


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