ReactOS  0.4.14-dev-552-g2fad488
CSendToMenu.cpp
Go to the documentation of this file.
1 /*
2  * provides SendTo shell item service
3  *
4  * Copyright 2019 Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  */
20 
21 #include "precomp.h"
22 
24 
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 }
38 
40 {
42 
43  if (m_hSubMenu)
44  {
46  m_hSubMenu = NULL;
47  }
48 }
49 
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 }
97 
98 // get an IShellFolder from CSIDL
99 HRESULT
101  int csidl, PIDLIST_ABSOLUTE *ppidl)
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 }
127 
128 // get a UI object from PIDL
130  REFIID riid, LPVOID *ppvOut)
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 }
146 
148 {
150  m_pItems = NULL;
151  while (pItems)
152  {
153  SENDTO_ITEM *pCurItem = pItems;
154  pItems = pItems->pNext;
155  delete pCurItem;
156  }
157 }
158 
160 {
163 
164  PathAppendW(szPath, L"*");
165 
167  HANDLE hFind = FindFirstFileW(szPath, &find);
168  if (hFind == INVALID_HANDLE_VALUE)
169  return FALSE;
170 
171  BOOL bFound = FALSE;
172  do
173  {
174  if (wcscmp(find.cFileName, L".") == 0 ||
175  wcscmp(find.cFileName, L"..") == 0 ||
176  _wcsicmp(find.cFileName, L"desktop.ini") == 0)
177  {
178  continue;
179  }
180 
181  bFound = TRUE;
182  break;
183  } while (FindNextFileW(hFind, &find));
184 
185  FindClose(hFind);
186  return bFound;
187 }
188 
189 static BOOL CreateEmptyFile(LPCWSTR pszFile)
190 {
191  HANDLE hFile;
195  return hFile != INVALID_HANDLE_VALUE;
196 }
197 
198 static HRESULT
200  LPCWSTR pszLinkPath,
201  LPCWSTR pszTargetPath OPTIONAL,
202  LPCITEMIDLIST pidlTarget OPTIONAL,
203  LPCWSTR pszArg OPTIONAL,
205  LPCWSTR pszIconPath OPTIONAL,
206  INT iIconNr OPTIONAL,
207  LPCWSTR pszComment OPTIONAL)
208 {
210  HRESULT hr = CoCreateInstance(CLSID_ShellLink, NULL,
211  CLSCTX_INPROC_SERVER,
212  IID_PPV_ARG(IShellLinkW, &psl));
213  if (FAILED_UNEXPECTEDLY(hr))
214  return hr;
215 
216  if (pszTargetPath)
217  {
218  hr = psl->SetPath(pszTargetPath);
219  if (FAILED_UNEXPECTEDLY(hr))
220  return hr;
221  }
222  else if (pidlTarget)
223  {
224  hr = psl->SetIDList(pidlTarget);
225  if (FAILED_UNEXPECTEDLY(hr))
226  return hr;
227  }
228  else
229  {
230  ERR("invalid argument\n");
231  return E_INVALIDARG;
232  }
233 
234  if (pszArg)
235  hr = psl->SetArguments(pszArg);
236 
237  if (pszDir)
238  hr = psl->SetWorkingDirectory(pszDir);
239 
240  if (pszIconPath)
241  hr = psl->SetIconLocation(pszIconPath, iIconNr);
242 
243  if (pszComment)
244  hr = psl->SetDescription(pszComment);
245 
247  hr = psl->QueryInterface(IID_PPV_ARG(IPersistFile, &ppf));
248  if (FAILED_UNEXPECTEDLY(hr))
249  return hr;
250 
251  hr = ppf->Save(pszLinkPath, TRUE);
252  if (FAILED_UNEXPECTEDLY(hr))
253  return hr;
254 
255  return hr;
256 }
257 
259 {
260  WCHAR szTarget[MAX_PATH];
261  WCHAR szSendToFile[MAX_PATH];
262  WCHAR szShell32[MAX_PATH];
263  HRESULT hr;
264 
265  /* create my documents */
267 
268  StringCbCopyW(szSendToFile, sizeof(szSendToFile), pszSendTo);
269  PathAppendW(szSendToFile, PathFindFileNameW(szTarget));
270  StringCbCatW(szSendToFile, sizeof(szSendToFile), L".lnk");
271 
272  GetSystemDirectoryW(szShell32, ARRAY_SIZE(szShell32));
273  PathAppendW(szShell32, L"shell32.dll");
274  hr = CreateShellLink(szSendToFile, szTarget, NULL, NULL, NULL,
275  szShell32, -IDI_SHELL_MY_DOCUMENTS, NULL);
276  if (FAILED_UNEXPECTEDLY(hr))
277  ;
278 
279  /* create desklink */
280  StringCbCopyW(szSendToFile, sizeof(szSendToFile), pszSendTo);
281  LoadStringW(shell32_hInstance, IDS_DESKLINK, szTarget, _countof(szTarget));
282  StringCbCatW(szTarget, sizeof(szTarget), L".DeskLink");
283  PathAppendW(szSendToFile, szTarget);
284  if (!CreateEmptyFile(szSendToFile))
285  {
286  ERR("CreateEmptyFile\n");
287  }
288 
289  /* create zipped compressed folder */
290  HINSTANCE hZipFldr =
292  if (hZipFldr)
293  {
294 #define IDS_FRIENDLYNAME 10195
295  LoadStringW(hZipFldr, IDS_FRIENDLYNAME, szTarget, _countof(szTarget));
296 #undef IDS_FRIENDLYNAME
297  FreeLibrary(hZipFldr);
298 
299  StringCbCopyW(szSendToFile, sizeof(szSendToFile), pszSendTo);
300  PathAppendW(szSendToFile, szTarget);
301  StringCbCatW(szSendToFile, sizeof(szSendToFile), L".ZFSendToTarget");
302  if (!CreateEmptyFile(szSendToFile))
303  {
304  ERR("CreateEmptyFile\n");
305  }
306  }
307 
308  return S_OK;
309 }
310 
312 {
313  UnloadAllItems();
314 
315  if (!FolderHasAnyItems())
316  {
320  }
321 
323 
324  m_pSendTo.Release();
326  if (FAILED_UNEXPECTEDLY(hr))
327  return hr;
328 
329  CComPtr<IEnumIDList> pEnumIDList;
330  hr = m_pSendTo->EnumObjects(hwnd,
331  SHCONTF_FOLDERS | SHCONTF_NONFOLDERS,
332  &pEnumIDList);
333  if (FAILED_UNEXPECTEDLY(hr))
334  return hr;
335 
336  hr = S_OK;
338  while (pEnumIDList->Next(1, &child, NULL) == S_OK)
339  {
340  CComHeapPtr<ITEMID_CHILD> pidlChild(child);
341 
342  STRRET strret;
343  hr = m_pSendTo->GetDisplayNameOf(pidlChild, SHGDN_NORMAL, &strret);
344  if (FAILED_UNEXPECTEDLY(hr))
345  continue;
346 
347  CComHeapPtr<WCHAR> pszText;
348  hr = StrRetToStrW(&strret, pidlChild, &pszText);
349  if (FAILED_UNEXPECTEDLY(hr))
350  continue;
351 
353  pidlAbsolute.Attach(ILCombine(pidlSendTo, pidlChild));
354 
355  SHFILEINFOW fi = { NULL };
358  SHGetFileInfoW(reinterpret_cast<LPWSTR>(static_cast<PIDLIST_ABSOLUTE>(pidlAbsolute)), 0,
359  &fi, sizeof(fi), uFlags);
360 
361  SENDTO_ITEM *pNewItem =
362  new SENDTO_ITEM(pidlChild.Detach(), pszText.Detach(), fi.hIcon);
363  if (m_pItems)
364  {
365  pNewItem->pNext = m_pItems;
366  }
367  m_pItems = pNewItem;
368  }
369 
370  return hr;
371 }
372 
374 {
375  if (m_pItems == NULL)
376  {
378  if (FAILED_UNEXPECTEDLY(hr))
379  return 0;
380  }
381 
382  m_idCmdFirst = idCmdFirst;
383 
384  UINT idCmd = idCmdFirst;
385  for (SENDTO_ITEM *pCurItem = m_pItems; pCurItem; pCurItem = pCurItem->pNext)
386  {
388  if (InsertMenuW(hMenu, Pos, uFlags, idCmd, pCurItem->pszText))
389  {
390  MENUITEMINFOW mii;
391  mii.cbSize = sizeof(mii);
392  mii.fMask = MIIM_DATA | MIIM_BITMAP;
393  mii.dwItemData = reinterpret_cast<ULONG_PTR>(pCurItem);
394  mii.hbmpItem = HBMMENU_CALLBACK;
395  SetMenuItemInfoW(hMenu, idCmd, FALSE, &mii);
396  ++idCmd;
397 
398  // successful
399  }
400  }
401 
402  if (idCmd == idCmdFirst)
403  {
405  AppendMenuW(hMenu, MF_GRAYED | MF_DISABLED | MF_STRING, idCmd, strNone);
406  }
407 
408  return idCmd - idCmdFirst;
409 }
410 
412 {
413  UINT idCmd = m_idCmdFirst + IdOffset;
414 
415  MENUITEMINFOW mii = { sizeof(mii) };
416  mii.fMask = MIIM_DATA;
417  if (GetMenuItemInfoW(m_hSubMenu, idCmd, FALSE, &mii))
418  return reinterpret_cast<SENDTO_ITEM *>(mii.dwItemData);
419 
420  ERR("GetMenuItemInfoW: %ld\n", GetLastError());
421  return NULL;
422 }
423 
425 {
426  if (!m_pDataObject)
427  {
428  ERR("!m_pDataObject\n");
429  return E_FAIL;
430  }
431 
432  HRESULT hr;
433  CComPtr<IDropTarget> pDropTarget;
434  hr = m_pSendTo->GetUIObjectOf(NULL, 1, &pItem->pidlChild, IID_IDropTarget,
435  NULL, (LPVOID *)&pDropTarget);
436  if (FAILED_UNEXPECTEDLY(hr))
437  return hr;
438 
439  hr = DoDrop(m_pDataObject, pDropTarget);
440  if (FAILED_UNEXPECTEDLY(hr))
441  return hr;
442 
443  return hr;
444 }
445 
448  UINT indexMenu,
449  UINT idCmdFirst,
450  UINT idCmdLast,
451  UINT uFlags)
452 {
453  TRACE("%p %p %u %u %u %u\n", this,
454  hMenu, indexMenu, idCmdFirst, idCmdLast, uFlags);
455 
456  HMENU hSubMenu = CreateMenu();
457  if (!hSubMenu)
458  {
459  ERR("CreateMenu: %ld\n", GetLastError());
460  return E_FAIL;
461  }
462 
463  UINT cItems = InsertSendToItems(hSubMenu, idCmdFirst, 0);
464 
466 
467  MENUITEMINFOW mii = { sizeof(mii) };
469  mii.fType = MFT_STRING;
470  mii.wID = -1;
471  mii.dwTypeData = strSendTo.GetBuffer();
472  mii.cch = wcslen(mii.dwTypeData);
473  mii.fState = MFS_ENABLED;
474  mii.hSubMenu = hSubMenu;
475  if (!InsertMenuItemW(hMenu, indexMenu, TRUE, &mii))
476  {
477  ERR("InsertMenuItemW: %ld\n", GetLastError());
478  return E_FAIL;
479  }
480 
481  HMENU hOldSubMenu = m_hSubMenu;
482  m_hSubMenu = hSubMenu;
483  DestroyMenu(hOldSubMenu);
484 
485  return MAKE_HRESULT(SEVERITY_SUCCESS, 0, cItems);
486 }
487 
490 {
491  HRESULT hr = E_FAIL;
492 
493  WORD idCmd = LOWORD(lpici->lpVerb);
494  TRACE("idCmd: %d\n", idCmd);
495 
496  SENDTO_ITEM *pItem = FindItemFromIdOffset(idCmd);
497  if (pItem)
498  {
499  hr = DoSendToItem(pItem, lpici);
500  }
501 
502  TRACE("CSendToMenu::InvokeCommand %x\n", hr);
503  return hr;
504 }
505 
508  UINT uType,
509  UINT *pwReserved,
510  LPSTR pszName,
511  UINT cchMax)
512 {
513  FIXME("%p %lu %u %p %p %u\n", this,
514  idCmd, uType, pwReserved, pszName, cchMax);
515 
516  return E_NOTIMPL;
517 }
518 
521 {
522  return S_OK;
523 }
524 
527  LRESULT *plResult)
528 {
529  UINT cxSmall = GetSystemMetrics(SM_CXSMICON);
530  UINT cySmall = GetSystemMetrics(SM_CYSMICON);
531 
532  switch (uMsg)
533  {
534  case WM_MEASUREITEM:
535  {
536  MEASUREITEMSTRUCT* lpmis = reinterpret_cast<MEASUREITEMSTRUCT*>(lParam);
537  if (!lpmis || lpmis->CtlType != ODT_MENU)
538  break;
539 
540  UINT cxMenuCheck = GetSystemMetrics(SM_CXMENUCHECK);
541  if (lpmis->itemWidth < cxMenuCheck)
542  lpmis->itemWidth = cxMenuCheck;
543  if (lpmis->itemHeight < cySmall)
544  lpmis->itemHeight = cySmall;
545 
546  if (plResult)
547  *plResult = TRUE;
548  break;
549  }
550  case WM_DRAWITEM:
551  {
552  DRAWITEMSTRUCT* lpdis = reinterpret_cast<DRAWITEMSTRUCT*>(lParam);
553  if (!lpdis || lpdis->CtlType != ODT_MENU)
554  break;
555 
556  SENDTO_ITEM *pItem = reinterpret_cast<SENDTO_ITEM *>(lpdis->itemData);
557  HICON hIcon = NULL;
558  if (pItem)
559  hIcon = pItem->hIcon;
560  if (!hIcon)
561  break;
562 
563  const RECT& rcItem = lpdis->rcItem;
564  INT x = 4;
565  INT y = lpdis->rcItem.top;
566  y += (rcItem.bottom - rcItem.top - cySmall) / 2;
567  DrawIconEx(lpdis->hDC, x, y, hIcon, cxSmall, cySmall,
568  0, NULL, DI_NORMAL);
569 
570  if (plResult)
571  *plResult = TRUE;
572  }
573  }
574 
575  return S_OK;
576 }
577 
580  IDataObject *pdtobj, HKEY hkeyProgID)
581 {
582  m_pDataObject = pdtobj;
583  return S_OK;
584 }
BOOL WINAPI FindNextFileW(IN HANDLE hFindFile, OUT LPWIN32_FIND_DATAW lpFindFileData)
Definition: find.c:382
const DOCKBAR PVOID HWND HWND * hwnd
Definition: tooldock.h:22
HMENU WINAPI CreateMenu(void)
Definition: menu.c:837
static HICON
Definition: imagelist.c:84
#define MFT_STRING
Definition: winuser.h:741
#define MF_DISABLED
Definition: winuser.h:130
#define REFIID
Definition: guiddef.h:118
#define TRUE
Definition: types.h:120
#define CloseHandle
Definition: compat.h:406
WINE_DEFAULT_DEBUG_CHANNEL(shell)
#define MK_SHIFT
Definition: winuser.h:2344
#define SHGFI_TYPENAME
Definition: shellapi.h:165
CComPtr< IDataObject > m_pDataObject
Definition: CSendToMenu.h:67
HRESULT hr
Definition: shlfolder.c:183
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
BOOL WINAPI InsertMenuW(_In_ HMENU, _In_ UINT, _In_ UINT, _In_ UINT_PTR, _In_opt_ LPCWSTR)
#define MK_LBUTTON
Definition: winuser.h:2342
REFIID riid
Definition: precomp.h:44
#define _countof(array)
Definition: fontsub.cpp:30
STDMETHODIMP QueryContextMenu(HMENU hMenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags)
CComPtr< IShellFolder > m_pSendTo
Definition: CSendToMenu.h:66
HINSTANCE WINAPI DECLSPEC_HOTPATCH LoadLibraryExW(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dwFlags)
Definition: loader.c:288
#define IDS_NONE
Definition: resource.h:122
LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: pidl.c:699
#define ODT_MENU
Definition: winuser.h:2512
static HRESULT CreateShellLink(LPCWSTR pszLinkPath, LPCWSTR pszTargetPath OPTIONAL, LPCITEMIDLIST pidlTarget OPTIONAL, LPCWSTR pszArg OPTIONAL, LPCWSTR pszDir OPTIONAL, LPCWSTR pszIconPath OPTIONAL, INT iIconNr OPTIONAL, LPCWSTR pszComment OPTIONAL)
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
Definition: shtypes.idl:42
ush Pos
Definition: deflate.h:92
#define MF_STRING
Definition: winuser.h:138
#define SM_CXMENUCHECK
Definition: winuser.h:1021
LONG top
Definition: windef.h:307
ULONG_PTR itemData
Definition: winuser.h:3068
volatile BOOLEAN bShift
Definition: shell.c:71
#define INVALID_HANDLE_VALUE
Definition: compat.h:399
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
#define SM_CYSMICON
Definition: winuser.h:1003
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
LPWSTR dwTypeData
Definition: winuser.h:3244
UINT_PTR WPARAM
Definition: windef.h:207
UINT uFlags
Definition: api.c:59
char * LPSTR
Definition: xmlstorage.h:182
#define IID_PPV_ARG(Itype, ppType)
#define E_FAIL
Definition: ddrawi.h:102
#define SHGFI_SMALLICON
Definition: shellapi.h:174
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
int32_t INT
Definition: typedefs.h:56
static HWND child
Definition: cursoricon.c:298
WPARAM wParam
Definition: combotst.c:138
#define MIIM_BITMAP
Definition: winuser.h:723
STRSAFEAPI StringCbCatW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:342
#define SEVERITY_SUCCESS
Definition: winerror.h:64
#define FILE_SHARE_READ
Definition: compat.h:125
BOOL WINAPI PathAppendW(LPWSTR lpszPath, LPCWSTR lpszAppend)
Definition: path.c:121
static BOOL CreateEmptyFile(LPCWSTR pszFile)
BOOL WINAPI AppendMenuW(_In_ HMENU, _In_ UINT, _In_ UINT_PTR, _In_opt_ LPCWSTR)
#define CSIDL_MYDOCUMENTS
Definition: shlobj.h:2015
HRESULT DoDrop(IDataObject *pDataObject, IDropTarget *pDropTarget)
Definition: CSendToMenu.cpp:50
SENDTO_ITEM * FindItemFromIdOffset(UINT IdOffset)
#define MIIM_SUBMENU
Definition: winuser.h:718
#define MFS_ENABLED
Definition: winuser.h:745
HINSTANCE shell32_hInstance
Definition: misc.cpp:82
#define MIIM_STATE
Definition: winuser.h:716
HRESULT GetUIObjectFromPidl(HWND hwnd, PIDLIST_ABSOLUTE pidl, REFIID riid, LPVOID *ppvOut)
unsigned int BOOL
Definition: ntddk_ex.h:94
#define MF_BYPOSITION
Definition: winuser.h:203
#define GENERIC_WRITE
Definition: nt_native.h:90
#define SHGFI_PIDL
Definition: shellapi.h:178
#define FIXME(fmt,...)
Definition: debug.h:110
#define STDMETHODIMP
Definition: basetyps.h:43
#define VK_SHIFT
Definition: winuser.h:2177
#define E_INVALIDARG
Definition: ddrawi.h:101
BOOL WINAPI SetMenuItemInfoW(_In_ HMENU, _In_ UINT, _In_ BOOL, _In_ LPCMENUITEMINFOW)
PITEMID_CHILD pidlChild
Definition: CSendToMenu.h:36
smooth NULL
Definition: ftsmooth.c:416
SENDTO_ITEM * m_pItems
Definition: CSendToMenu.h:62
LPWSTR WINAPI PathFindFileNameW(LPCWSTR lpszPath)
Definition: path.c:389
LONG_PTR LPARAM
Definition: windef.h:208
STDMETHODIMP HandleMenuMsg2(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *plResult)
#define MAKE_HRESULT(sev, fac, code)
Definition: dmerror.h:30
#define MIIM_ID
Definition: winuser.h:717
STDMETHODIMP Initialize(PCIDLIST_ABSOLUTE pidlFolder, IDataObject *pdtobj, HKEY hkeyProgID)
static int int const SCRIPT_CONTROL const SCRIPT_STATE SCRIPT_ITEM * pItems
Definition: usp10.c:62
#define HBMMENU_CALLBACK
Definition: winuser.h:2605
BOOL WINAPI GetMenuItemInfoW(_In_ HMENU, _In_ UINT, _In_ BOOL, _Inout_ LPMENUITEMINFOW)
#define TRACE(s)
Definition: solgame.cpp:4
#define FreeLibrary(x)
Definition: compat.h:413
HRESULT WINAPI SHGetDesktopFolder(IShellFolder **psf)
HRESULT DragEnter([in, unique] IDataObject *pDataObj, [in] DWORD grfKeyState, [in] POINTL pt, [in, out] DWORD *pdwEffect)
__wchar_t WCHAR
Definition: xmlstorage.h:180
DWORD_PTR WINAPI SHGetFileInfoW(LPCWSTR path, DWORD dwFileAttributes, SHFILEINFOW *psfi, UINT sizeofpsfi, UINT flags)
Definition: shell32_main.c:410
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
HRESULT WINAPI SHGetSpecialFolderLocation(HWND hwndOwner, INT nFolder, LPITEMIDLIST *ppidl)
Definition: shellpath.c:2695
LONG HRESULT
Definition: typedefs.h:77
#define MF_ENABLED
Definition: winuser.h:128
#define CSIDL_SENDTO
Definition: shlobj.h:2012
#define FAILED_UNEXPECTEDLY(hr)
Definition: shellutils.h:71
_In_ LPCSTR pszDir
Definition: shellapi.h:580
#define MAX_PATH
Definition: compat.h:26
unsigned short WORD
Definition: ntddk_ex.h:93
int WINAPI GetSystemMetrics(_In_ int)
unsigned long DWORD
Definition: ntddk_ex.h:95
BOOL FolderHasAnyItems() const
#define WM_MEASUREITEM
Definition: winuser.h:1628
UINT InsertSendToItems(HMENU hMenu, UINT idFirst, UINT idMenu)
HRESULT CreateSendToFiles(LPCWSTR pszSendTo)
unsigned __int3264 UINT_PTR
Definition: mstsclib_h.h:274
HMENU m_hSubMenu
Definition: CSendToMenu.h:61
UINT cchMax
#define SM_CXSMICON
Definition: winuser.h:1002
HRESULT LoadAllItems(HWND hwnd)
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:126
static const WCHAR L[]
Definition: oid.c:1250
#define IDS_DESKLINK
Definition: shresdef.h:232
#define MIIM_TYPE
Definition: winuser.h:720
SHORT WINAPI GetAsyncKeyState(_In_ int)
#define DI_NORMAL
Definition: wingdi.h:72
UINT m_idCmdFirst
Definition: CSendToMenu.h:63
_In_ HANDLE hFile
Definition: mswsock.h:90
HICON hIcon
Definition: shellapi.h:370
BOOL WINAPI DestroyMenu(_In_ HMENU)
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID iid, LPVOID *ppv)
Definition: compobj.c:3325
#define ERR(fmt,...)
Definition: debug.h:109
#define LOAD_LIBRARY_AS_DATAFILE
Definition: winbase.h:338
_Check_return_ _CRTIMP int __cdecl wcscmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
STDMETHODIMP InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi)
#define S_OK
Definition: intsafe.h:59
#define CREATE_ALWAYS
Definition: disk.h:72
#define IDI_SHELL_MY_DOCUMENTS
Definition: shresdef.h:601
BOOL WINAPI SHGetSpecialFolderPathW(HWND hwndOwner, LPWSTR szPath, int nFolder, BOOL bCreate)
Definition: shellpath.c:2574
HRESULT Drop([in, unique] IDataObject *pDataObj, [in] DWORD grfKeyState, [in] POINTL pt, [in, out] DWORD *pdwEffect)
HRESULT WINAPI SHBindToParent(LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppv, LPCITEMIDLIST *ppidlLast)
Definition: pidl.c:1323
void shell(int argc, const char *argv[])
Definition: cmds.c:1231
HICON hIcon
Definition: msconfig.c:44
LPCWSTR szPath
Definition: env.c:35
#define ARRAY_SIZE(a)
Definition: main.h:24
void Release()
Definition: atlcomcli.h:140
#define E_NOTIMPL
Definition: ddrawi.h:99
STDMETHODIMP GetCommandString(UINT_PTR idCommand, UINT uFlags, UINT *lpReserved, LPSTR lpszName, UINT uMaxNameLen)
UINT WINAPI GetSystemDirectoryW(OUT LPWSTR lpBuffer, IN UINT uSize)
Definition: path.c:2312
void UnloadAllItems()
BOOL WINAPI InsertMenuItemW(_In_ HMENU, _In_ UINT, _In_ BOOL, _In_ LPCMENUITEMINFOW)
#define IDS_SENDTO_MENU
Definition: shresdef.h:233
unsigned int UINT
Definition: ndis.h:50
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
#define MK_CONTROL
Definition: winuser.h:2345
#define VK_CONTROL
Definition: winuser.h:2178
#define CreateFileW
Definition: compat.h:408
#define WM_DRAWITEM
Definition: winuser.h:1627
static TAGID TAGID find
Definition: db.cpp:153
LONG bottom
Definition: windef.h:309
#define IDS_FRIENDLYNAME
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
#define MF_GRAYED
Definition: winuser.h:129
#define MIIM_DATA
Definition: winuser.h:721
LONG_PTR LRESULT
Definition: windef.h:209
#define E_POINTER
Definition: winerror.h:2365
STRSAFEAPI StringCbCopyW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:166
#define SHGFI_ICON
Definition: shellapi.h:162
HRESULT GetSpecialFolder(HWND hwnd, IShellFolder **ppFolder, int csidl, PIDLIST_ABSOLUTE *ppidl=NULL)
CComPtr< IShellFolder > m_pDesktop
Definition: CSendToMenu.h:65
ULONG_PTR dwItemData
Definition: winuser.h:3243
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:60
HRESULT DoSendToItem(SENDTO_ITEM *pItem, LPCMINVOKECOMMANDINFO lpici)
LPARAM lParam
Definition: combotst.c:139
#define LOWORD(l)
Definition: pedump.c:82
size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
_Check_return_ _CRTIMP int __cdecl _wcsicmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
HRESULT WINAPI StrRetToStrW(LPSTRRET lpStrRet, const ITEMIDLIST *pidl, LPWSTR *ppszName)
Definition: string.c:1623
HRESULT DragLeave()
HANDLE WINAPI FindFirstFileW(IN LPCWSTR lpFileName, OUT LPWIN32_FIND_DATAW lpFindFileData)
Definition: find.c:320
BOOL WINAPI FindClose(HANDLE hFindFile)
Definition: find.c:502
PULONG MinorVersion OPTIONAL
Definition: CrossNt.h:68
STDMETHODIMP HandleMenuMsg(UINT uMsg, WPARAM wParam, LPARAM lParam)