xref: /reactos/dll/win32/shell32/CShellLink.h (revision cdf90707)
1 /*
2  *
3  *      Copyright 1997  Marcus Meissner
4  *      Copyright 1998  Juergen Schmied
5  *      Copyright 2005  Mike McCormack
6  *      Copyright 2009  Andrew Hill
7  *      Copyright 2017  Hermes Belusca-Maito
8  *
9  * This library is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public
11  * License as published by the Free Software Foundation; either
12  * version 2.1 of the License, or (at your option) any later version.
13  *
14  * This library is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with this library; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
22  *
23  */
24 
25 #ifndef _SHELLLINK_H_
26 #define _SHELLLINK_H_
27 
28 class CShellLink :
29     public CComCoClass<CShellLink, &CLSID_ShellLink>,
30     public CComObjectRootEx<CComMultiThreadModelNoCS>,
31     public IShellLinkA,
32     public IShellLinkW,
33     public IPersistStream,
34     public IPersistFile,
35     public IShellExtInit,
36     public IContextMenu, // Technically it should be IContextMenu3 (inherits from IContextMenu2 and IContextMenu)
37     public IDropTarget,
38 //  public IQueryInfo,
39     public IShellLinkDataList,
40     public IExtractIconA,
41     public IExtractIconW,
42 //  public IExtractImage2, // Inherits from IExtractImage
43 //  public IPersistPropertyBag,
44 //  public IServiceProvider,
45 //  public IFilter,
46     public IObjectWithSite,
47 //  public ICustomizeInfoTip,
48     public IShellPropSheetExt
49 {
50 public:
51     /* Link file formats */
52 
53     #include "pshpack1.h"
54     struct volume_info
55     {
56         DWORD type;
57         DWORD serial;
58         WCHAR label[12];  /* assume 8.3 */
59     };
60     #include "poppack.h"
61 
62     enum IDCMD
63     {
64         IDCMD_OPEN = 0,
65         IDCMD_OPENFILELOCATION
66     };
67 
68 private:
69     /* Cached link header */
70     SHELL_LINK_HEADER m_Header;
71 
72     /* Cached data set according to m_Header.dwFlags (SHELL_LINK_DATA_FLAGS) */
73 
74     LPITEMIDLIST  m_pPidl;
75 
76     /* Link tracker information */
77     LPWSTR        m_sPath;
78     volume_info   volume;
79 
80     LPWSTR        m_sDescription;
81     LPWSTR        m_sPathRel;
82     LPWSTR        m_sWorkDir;
83     LPWSTR        m_sArgs;
84     LPWSTR        m_sIcoPath;
85     BOOL          m_bRunAs;
86     BOOL          m_bDirty;
87     LPDBLIST      m_pDBList; /* Optional data block list (in the extra data section) */
88     BOOL          m_bInInit;    // in initialization or not
89     HICON         m_hIcon;
90     UINT          m_idCmdFirst;
91 
92     /* Pointers to strings inside Logo3/Darwin info blocks, cached for debug info purposes only */
93     LPWSTR sProduct;
94     LPWSTR sComponent;
95 
96     LPWSTR        m_sLinkPath;
97 
98     CComPtr<IUnknown>    m_site;
99     CComPtr<IDropTarget> m_DropTarget;
100 
101     VOID Reset();
102 
103     HRESULT GetAdvertiseInfo(LPWSTR *str, DWORD dwSig);
104     HRESULT SetAdvertiseInfo(LPCWSTR str);
105     HRESULT WriteAdvertiseInfo(LPCWSTR string, DWORD dwSig);
106     HRESULT SetTargetFromPIDLOrPath(LPCITEMIDLIST pidl, LPCWSTR pszFile);
107     HICON CreateShortcutIcon(LPCWSTR wszIconPath, INT IconIndex);
108 
109     HRESULT DoOpen(LPCMINVOKECOMMANDINFO lpici);
110     HRESULT DoOpenFileLocation();
111 
112 public:
113     CShellLink();
114     ~CShellLink();
115     static INT_PTR CALLBACK SH_ShellLinkDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
116 
117     BOOL OnInitDialog(HWND hwndDlg, HWND hwndFocus, LPARAM lParam);
118     void OnCommand(HWND hwndDlg, int id, HWND hwndCtl, UINT codeNotify);
119     LRESULT OnNotify(HWND hwndDlg, int idFrom, LPNMHDR pnmhdr);
120     void OnDestroy(HWND hwndDlg);
121 
122     // IPersistFile
123     virtual HRESULT STDMETHODCALLTYPE GetClassID(CLSID *pclsid);
124     virtual HRESULT STDMETHODCALLTYPE IsDirty();
125     virtual HRESULT STDMETHODCALLTYPE Load(LPCOLESTR pszFileName, DWORD dwMode);
126     virtual HRESULT STDMETHODCALLTYPE Save(LPCOLESTR pszFileName, BOOL fRemember);
127     virtual HRESULT STDMETHODCALLTYPE SaveCompleted(LPCOLESTR pszFileName);
128     virtual HRESULT STDMETHODCALLTYPE GetCurFile(LPOLESTR *ppszFileName);
129 
130     // IPersistStream
131     // virtual HRESULT STDMETHODCALLTYPE GetClassID(CLSID *pclsid);
132     // virtual HRESULT STDMETHODCALLTYPE IsDirty();
133     virtual HRESULT STDMETHODCALLTYPE Load(IStream *stm);
134     virtual HRESULT STDMETHODCALLTYPE Save(IStream *stm, BOOL fClearDirty);
135     virtual HRESULT STDMETHODCALLTYPE GetSizeMax(ULARGE_INTEGER *pcbSize);
136 
137     // IShellLinkA
138     virtual HRESULT STDMETHODCALLTYPE GetPath(LPSTR pszFile, INT cchMaxPath, WIN32_FIND_DATAA *pfd, DWORD fFlags);
139     virtual HRESULT STDMETHODCALLTYPE GetIDList(PIDLIST_ABSOLUTE *ppidl);
140     virtual HRESULT STDMETHODCALLTYPE SetIDList(PCIDLIST_ABSOLUTE pidl);
141     virtual HRESULT STDMETHODCALLTYPE GetDescription(LPSTR pszName, INT cchMaxName);
142     virtual HRESULT STDMETHODCALLTYPE SetDescription(LPCSTR pszName);
143     virtual HRESULT STDMETHODCALLTYPE GetWorkingDirectory(LPSTR pszDir, INT cchMaxPath);
144     virtual HRESULT STDMETHODCALLTYPE SetWorkingDirectory(LPCSTR pszDir);
145     virtual HRESULT STDMETHODCALLTYPE GetArguments(LPSTR pszArgs, INT cchMaxPath);
146     virtual HRESULT STDMETHODCALLTYPE SetArguments(LPCSTR pszArgs);
147     virtual HRESULT STDMETHODCALLTYPE GetHotkey(WORD *pwHotkey);
148     virtual HRESULT STDMETHODCALLTYPE SetHotkey(WORD wHotkey);
149     virtual HRESULT STDMETHODCALLTYPE GetShowCmd(INT *piShowCmd);
150     virtual HRESULT STDMETHODCALLTYPE SetShowCmd(INT iShowCmd);
151     virtual HRESULT STDMETHODCALLTYPE GetIconLocation(LPSTR pszIconPath, INT cchIconPath, INT *piIcon);
152     virtual HRESULT STDMETHODCALLTYPE SetIconLocation(LPCSTR pszIconPath, INT iIcon);
153     virtual HRESULT STDMETHODCALLTYPE SetRelativePath(LPCSTR pszPathRel, DWORD dwReserved);
154     virtual HRESULT STDMETHODCALLTYPE Resolve(HWND hwnd, DWORD fFlags);
155     virtual HRESULT STDMETHODCALLTYPE SetPath(LPCSTR pszFile);
156 
157     // IShellLinkW
158     virtual HRESULT STDMETHODCALLTYPE GetPath(LPWSTR pszFile, INT cchMaxPath, WIN32_FIND_DATAW *pfd, DWORD fFlags);
159     // virtual HRESULT STDMETHODCALLTYPE GetIDList(PIDLIST_ABSOLUTE *ppidl);
160     // virtual HRESULT STDMETHODCALLTYPE SetIDList(PCIDLIST_ABSOLUTE pidl);
161     virtual HRESULT STDMETHODCALLTYPE GetDescription(LPWSTR pszName, INT cchMaxName);
162     virtual HRESULT STDMETHODCALLTYPE SetDescription(LPCWSTR pszName);
163     virtual HRESULT STDMETHODCALLTYPE GetWorkingDirectory(LPWSTR pszDir, INT cchMaxPath);
164     virtual HRESULT STDMETHODCALLTYPE SetWorkingDirectory(LPCWSTR pszDir);
165     virtual HRESULT STDMETHODCALLTYPE GetArguments(LPWSTR pszArgs, INT cchMaxPath);
166     virtual HRESULT STDMETHODCALLTYPE SetArguments(LPCWSTR pszArgs);
167     // virtual HRESULT STDMETHODCALLTYPE GetHotkey(WORD *pwHotkey);
168     // virtual HRESULT STDMETHODCALLTYPE SetHotkey(WORD wHotkey);
169     // virtual HRESULT STDMETHODCALLTYPE GetShowCmd(INT *piShowCmd);
170     // virtual HRESULT STDMETHODCALLTYPE SetShowCmd(INT iShowCmd);
171     virtual HRESULT STDMETHODCALLTYPE GetIconLocation(LPWSTR pszIconPath, INT cchIconPath, INT *piIcon);
172     virtual HRESULT STDMETHODCALLTYPE SetIconLocation(LPCWSTR pszIconPath, INT iIcon);
173     virtual HRESULT STDMETHODCALLTYPE SetRelativePath(LPCWSTR pszPathRel, DWORD dwReserved);
174     // virtual HRESULT STDMETHODCALLTYPE Resolve(HWND hwnd, DWORD fFlags);
175     virtual HRESULT STDMETHODCALLTYPE SetPath(LPCWSTR pszFile);
176 
177     // IShellLinkDataList
178     virtual HRESULT STDMETHODCALLTYPE AddDataBlock(void *pDataBlock);
179     virtual HRESULT STDMETHODCALLTYPE CopyDataBlock(DWORD dwSig, void **ppDataBlock);
180     virtual HRESULT STDMETHODCALLTYPE RemoveDataBlock(DWORD dwSig);
181     virtual HRESULT STDMETHODCALLTYPE GetFlags(DWORD *pdwFlags);
182     virtual HRESULT STDMETHODCALLTYPE SetFlags(DWORD dwFlags);
183 
184     // IExtractIconA
185     virtual HRESULT STDMETHODCALLTYPE Extract(PCSTR pszFile, UINT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize);
186     virtual HRESULT STDMETHODCALLTYPE GetIconLocation(UINT uFlags, PSTR pszIconFile, UINT cchMax, int *piIndex, UINT *pwFlags);
187 
188     // IExtractIconW
189     virtual HRESULT STDMETHODCALLTYPE Extract(PCWSTR pszFile, UINT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize);
190     virtual HRESULT STDMETHODCALLTYPE GetIconLocation(UINT uFlags, PWSTR pszIconFile, UINT cchMax, int *piIndex, UINT *pwFlags);
191 
192     // IShellExtInit
193     virtual HRESULT STDMETHODCALLTYPE Initialize(PCIDLIST_ABSOLUTE pidlFolder, IDataObject *pdtobj, HKEY hkeyProgID);
194 
195     // IContextMenu
196     virtual HRESULT STDMETHODCALLTYPE QueryContextMenu(HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags);
197     virtual HRESULT STDMETHODCALLTYPE InvokeCommand(LPCMINVOKECOMMANDINFO lpici);
198     virtual HRESULT STDMETHODCALLTYPE GetCommandString(UINT_PTR idCmd, UINT uType, UINT *pwReserved, LPSTR pszName, UINT cchMax);
199 
200     // IShellPropSheetExt
201     virtual HRESULT STDMETHODCALLTYPE AddPages(LPFNADDPROPSHEETPAGE pfnAddPage, LPARAM lParam);
202     virtual HRESULT STDMETHODCALLTYPE ReplacePage(UINT uPageID, LPFNADDPROPSHEETPAGE pfnReplacePage, LPARAM lParam);
203 
204     // IObjectWithSite
205     virtual HRESULT STDMETHODCALLTYPE SetSite(IUnknown *punk);
206     virtual HRESULT STDMETHODCALLTYPE GetSite(REFIID iid, void **ppvSite);
207 
208     // IDropTarget
209     virtual HRESULT STDMETHODCALLTYPE DragEnter(IDataObject *pDataObject, DWORD dwKeyState, POINTL pt, DWORD *pdwEffect);
210     virtual HRESULT STDMETHODCALLTYPE DragOver(DWORD dwKeyState, POINTL pt, DWORD *pdwEffect);
211     virtual HRESULT STDMETHODCALLTYPE DragLeave();
212     virtual HRESULT STDMETHODCALLTYPE Drop(IDataObject *pDataObject, DWORD dwKeyState, POINTL pt, DWORD *pdwEffect);
213 
214 DECLARE_REGISTRY_RESOURCEID(IDR_SHELLLINK)
215 DECLARE_NOT_AGGREGATABLE(CShellLink)
216 
217 DECLARE_PROTECT_FINAL_CONSTRUCT()
218 
219 BEGIN_COM_MAP(CShellLink)
220     COM_INTERFACE_ENTRY_IID(IID_IShellLinkA, IShellLinkA)
221     COM_INTERFACE_ENTRY_IID(IID_IShellLinkW, IShellLinkW)
222     COM_INTERFACE_ENTRY2_IID(IID_IPersist, IPersist, IPersistFile)
223     COM_INTERFACE_ENTRY_IID(IID_IPersistFile, IPersistFile)
224     COM_INTERFACE_ENTRY_IID(IID_IPersistStream, IPersistStream)
225     COM_INTERFACE_ENTRY_IID(IID_IShellExtInit, IShellExtInit)
226     COM_INTERFACE_ENTRY_IID(IID_IContextMenu, IContextMenu) // Technically it should be IContextMenu3
227     COM_INTERFACE_ENTRY_IID(IID_IDropTarget, IDropTarget)
228 //  COM_INTERFACE_ENTRY_IID(IID_IQueryInfo, IQueryInfo)
229     COM_INTERFACE_ENTRY_IID(IID_IShellLinkDataList, IShellLinkDataList)
230     COM_INTERFACE_ENTRY_IID(IID_IExtractIconA, IExtractIconA)
231     COM_INTERFACE_ENTRY_IID(IID_IExtractIconW, IExtractIconW)
232 //  COM_INTERFACE_ENTRY_IID(IID_IExtractImage2, IExtractImage2)
233 //  COM_INTERFACE_ENTRY_IID(IID_IPersistPropertyBag, IPersistPropertyBag)
234 //  COM_INTERFACE_ENTRY_IID(IID_IServiceProvider, IServiceProvider)
235 //  COM_INTERFACE_ENTRY_IID(IID_IFilter, IFilter)
236     COM_INTERFACE_ENTRY_IID(IID_IObjectWithSite, IObjectWithSite)
237 //  COM_INTERFACE_ENTRY_IID(IID_ICustomizeInfoTip, ICustomizeInfoTip)
238     COM_INTERFACE_ENTRY_IID(IID_IShellPropSheetExt, IShellPropSheetExt)
239 END_COM_MAP()
240 };
241 
242 #endif /* _SHELLLINK_H_ */
243