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 UINT InsertSendToItems(HMENU hMenu, UINT idFirst, UINT idMenu); 73 74 SENDTO_ITEM *FindItemFromIdOffset(UINT IdOffset); 75 HRESULT DoSendToItem(SENDTO_ITEM *pItem, LPCMINVOKECOMMANDINFO lpici); 76 77 HRESULT DoDrop(IDataObject *pDataObject, IDropTarget *pDropTarget); 78 HRESULT GetSpecialFolder(HWND hwnd, IShellFolder **ppFolder, int csidl, 79 PIDLIST_ABSOLUTE *ppidl = NULL); 80 HRESULT GetUIObjectFromPidl(HWND hwnd, PIDLIST_ABSOLUTE pidl, REFIID riid, LPVOID *ppvOut); 81 82 public: 83 CSendToMenu(); 84 ~CSendToMenu(); 85 86 // IContextMenu 87 STDMETHODIMP QueryContextMenu(HMENU hMenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags); 88 STDMETHODIMP InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi); 89 STDMETHODIMP GetCommandString(UINT_PTR idCommand, UINT uFlags, UINT *lpReserved, LPSTR lpszName, UINT uMaxNameLen); 90 91 // IContextMenu3 92 STDMETHODIMP HandleMenuMsg2(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *plResult); 93 94 // IContextMenu2 95 STDMETHODIMP HandleMenuMsg(UINT uMsg, WPARAM wParam, LPARAM lParam); 96 97 // IShellExtInit 98 STDMETHODIMP Initialize(PCIDLIST_ABSOLUTE pidlFolder, IDataObject *pdtobj, HKEY hkeyProgID); 99 100 DECLARE_REGISTRY_RESOURCEID(IDR_SENDTOMENU) 101 DECLARE_NOT_AGGREGATABLE(CSendToMenu) 102 DECLARE_PROTECT_FINAL_CONSTRUCT() 103 104 BEGIN_COM_MAP(CSendToMenu) 105 COM_INTERFACE_ENTRY_IID(IID_IContextMenu3, IContextMenu3) 106 COM_INTERFACE_ENTRY_IID(IID_IContextMenu2, IContextMenu2) 107 COM_INTERFACE_ENTRY_IID(IID_IContextMenu, IContextMenu) 108 COM_INTERFACE_ENTRY_IID(IID_IShellExtInit, IShellExtInit) 109 END_COM_MAP() 110 }; 111 112 #endif /* _SHV_ITEM_SENDTO_H_ */ 113