1 /* 2 * provides new shell item service 3 * 4 * Copyright 2019 Katayama Hirofumi MZ. 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 #ifndef _SHV_ITEM_SENDTO_H_ 22 #define _SHV_ITEM_SENDTO_H_ 23 24 extern "C" const GUID CLSID_SendToMenu; 25 26 class CSendToMenu : 27 public CComCoClass<CSendToMenu, &CLSID_SendToMenu>, 28 public CComObjectRootEx<CComMultiThreadModelNoCS>, 29 public IContextMenu3, 30 public IShellExtInit 31 { 32 private: 33 struct SENDTO_ITEM 34 { 35 SENDTO_ITEM *pNext; 36 PITEMID_CHILD pidlChild; 37 LPWSTR pszText; 38 HICON hIcon; 39 40 SENDTO_ITEM(PITEMID_CHILD child, LPWSTR text, HICON icon) 41 : pNext(NULL) 42 , pidlChild(child) 43 , pszText(text) 44 , hIcon(icon) 45 { 46 } 47 48 ~SENDTO_ITEM() 49 { 50 CoTaskMemFree(pidlChild); 51 CoTaskMemFree(pszText); 52 DestroyIcon(hIcon); 53 } 54 55 private: 56 SENDTO_ITEM(); 57 SENDTO_ITEM(const SENDTO_ITEM&); 58 SENDTO_ITEM& operator=(const SENDTO_ITEM&); 59 }; 60 61 HMENU m_hSubMenu; 62 SENDTO_ITEM *m_pItems; 63 UINT m_idCmdFirst; 64 65 CComPtr<IShellFolder> m_pDesktop; 66 CComPtr<IShellFolder> m_pSendTo; 67 CComPtr<IDataObject> m_pDataObject; 68 69 HRESULT LoadAllItems(HWND hwnd); 70 void UnloadAllItems(); 71 72 BOOL FolderHasAnyItems() const; 73 HRESULT CreateSendToFiles(LPCWSTR pszSendTo); 74 75 UINT InsertSendToItems(HMENU hMenu, UINT idFirst, UINT idMenu); 76 77 SENDTO_ITEM *FindItemFromIdOffset(UINT IdOffset); 78 HRESULT DoSendToItem(SENDTO_ITEM *pItem, LPCMINVOKECOMMANDINFO lpici); 79 80 HRESULT DoDrop(IDataObject *pDataObject, IDropTarget *pDropTarget); 81 HRESULT GetSpecialFolder(HWND hwnd, IShellFolder **ppFolder, int csidl, 82 PIDLIST_ABSOLUTE *ppidl = NULL); 83 HRESULT GetUIObjectFromPidl(HWND hwnd, PIDLIST_ABSOLUTE pidl, REFIID riid, LPVOID *ppvOut); 84 85 public: 86 CSendToMenu(); 87 ~CSendToMenu(); 88 89 // IContextMenu 90 STDMETHODIMP QueryContextMenu(HMENU hMenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags); 91 STDMETHODIMP InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi); 92 STDMETHODIMP GetCommandString(UINT_PTR idCommand, UINT uFlags, UINT *lpReserved, LPSTR lpszName, UINT uMaxNameLen); 93 94 // IContextMenu3 95 STDMETHODIMP HandleMenuMsg2(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *plResult); 96 97 // IContextMenu2 98 STDMETHODIMP HandleMenuMsg(UINT uMsg, WPARAM wParam, LPARAM lParam); 99 100 // IShellExtInit 101 STDMETHODIMP Initialize(PCIDLIST_ABSOLUTE pidlFolder, IDataObject *pdtobj, HKEY hkeyProgID); 102 103 DECLARE_REGISTRY_RESOURCEID(IDR_SENDTOMENU) 104 DECLARE_NOT_AGGREGATABLE(CSendToMenu) 105 DECLARE_PROTECT_FINAL_CONSTRUCT() 106 107 BEGIN_COM_MAP(CSendToMenu) 108 COM_INTERFACE_ENTRY_IID(IID_IContextMenu3, IContextMenu3) 109 COM_INTERFACE_ENTRY_IID(IID_IContextMenu2, IContextMenu2) 110 COM_INTERFACE_ENTRY_IID(IID_IContextMenu, IContextMenu) 111 COM_INTERFACE_ENTRY_IID(IID_IShellExtInit, IShellExtInit) 112 END_COM_MAP() 113 }; 114 115 #endif /* _SHV_ITEM_SENDTO_H_ */ 116