Reactos
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
28class 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{
50public:
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
68private:
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
91 /* Pointers to strings inside Logo3/Darwin info blocks, cached for debug info purposes only */
92 LPWSTR sProduct;
93 LPWSTR sComponent;
94
95 LPWSTR m_sLinkPath;
96
97 CComPtr<IUnknown> m_site;
98 CComPtr<IDropTarget> m_DropTarget;
99
100 VOID Reset();
101
102 HRESULT GetAdvertiseInfo(LPWSTR *str, DWORD dwSig);
103 HRESULT SetAdvertiseInfo(LPCWSTR str);
104 HRESULT WriteAdvertiseInfo(LPCWSTR string, DWORD dwSig);
105 HRESULT SetTargetFromPIDLOrPath(LPCITEMIDLIST pidl, LPCWSTR pszFile);
106 HICON CreateShortcutIcon(LPCWSTR wszIconPath, INT IconIndex);
107
108 HRESULT DoOpen(LPCMINVOKECOMMANDINFO lpici);
109 HRESULT DoOpenFileLocation();
110
111public:
112 CShellLink();
113 ~CShellLink();
114 static INT_PTR CALLBACK SH_ShellLinkDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
115
116 BOOL OnInitDialog(HWND hwndDlg, HWND hwndFocus, LPARAM lParam);
117 void OnCommand(HWND hwndDlg, int id, HWND hwndCtl, UINT codeNotify);
118 LRESULT OnNotify(HWND hwndDlg, int idFrom, LPNMHDR pnmhdr);
119 void OnDestroy(HWND hwndDlg);
120
121 // IPersistFile
122 STDMETHOD(GetClassID)(CLSID *pclsid) override;
123 STDMETHOD(IsDirty)() override;
124 STDMETHOD(Load)(LPCOLESTR pszFileName, DWORD dwMode) override;
125 STDMETHOD(Save)(LPCOLESTR pszFileName, BOOL fRemember) override;
126 STDMETHOD(SaveCompleted)(LPCOLESTR pszFileName) override;
127 STDMETHOD(GetCurFile)(LPOLESTR *ppszFileName) override;
128
129 // IPersistStream
130 // STDMETHOD(GetClassID)(CLSID *pclsid) override;
131 // STDMETHOD(IsDirty)() override;
132 STDMETHOD(Load)(IStream *stm) override;
133 STDMETHOD(Save)(IStream *stm, BOOL fClearDirty) override;
134 STDMETHOD(GetSizeMax)(ULARGE_INTEGER *pcbSize) override;
135
136 // IShellLinkA
137 STDMETHOD(GetPath)(LPSTR pszFile, INT cchMaxPath, WIN32_FIND_DATAA *pfd, DWORD fFlags) override;
138 STDMETHOD(GetIDList)(PIDLIST_ABSOLUTE *ppidl) override;
139 STDMETHOD(SetIDList)(PCIDLIST_ABSOLUTE pidl) override;
140 STDMETHOD(GetDescription)(LPSTR pszName, INT cchMaxName) override;
141 STDMETHOD(SetDescription)(LPCSTR pszName) override;
142 STDMETHOD(GetWorkingDirectory)(LPSTR pszDir, INT cchMaxPath) override;
143 STDMETHOD(SetWorkingDirectory)(LPCSTR pszDir) override;
144 STDMETHOD(GetArguments)(LPSTR pszArgs, INT cchMaxPath) override;
145 STDMETHOD(SetArguments)(LPCSTR pszArgs) override;
146 STDMETHOD(GetHotkey)(WORD *pwHotkey) override;
147 STDMETHOD(SetHotkey)(WORD wHotkey) override;
148 STDMETHOD(GetShowCmd)(INT *piShowCmd) override;
149 STDMETHOD(SetShowCmd)(INT iShowCmd) override;
150 STDMETHOD(GetIconLocation)(LPSTR pszIconPath, INT cchIconPath, INT *piIcon) override;
151 STDMETHOD(SetIconLocation)(LPCSTR pszIconPath, INT iIcon) override;
152 STDMETHOD(SetRelativePath)(LPCSTR pszPathRel, DWORD dwReserved) override;
153 STDMETHOD(Resolve)(HWND hwnd, DWORD fFlags) override;
154 STDMETHOD(SetPath)(LPCSTR pszFile) override;
155
156 // IShellLinkW
157 STDMETHOD(GetPath)(LPWSTR pszFile, INT cchMaxPath, WIN32_FIND_DATAW *pfd, DWORD fFlags) override;
158 // STDMETHOD(GetIDList)(PIDLIST_ABSOLUTE *ppidl) override;
159 // STDMETHOD(SetIDList)(PCIDLIST_ABSOLUTE pidl) override;
160 STDMETHOD(GetDescription)(LPWSTR pszName, INT cchMaxName) override;
161 STDMETHOD(SetDescription)(LPCWSTR pszName) override;
162 STDMETHOD(GetWorkingDirectory)(LPWSTR pszDir, INT cchMaxPath) override;
163 STDMETHOD(SetWorkingDirectory)(LPCWSTR pszDir) override;
164 STDMETHOD(GetArguments)(LPWSTR pszArgs, INT cchMaxPath) override;
165 STDMETHOD(SetArguments)(LPCWSTR pszArgs) override;
166 // STDMETHOD(GetHotkey)(WORD *pwHotkey) override;
167 // STDMETHOD(SetHotkey)(WORD wHotkey) override;
168 // STDMETHOD(GetShowCmd)(INT *piShowCmd) override;
169 // STDMETHOD(SetShowCmd)(INT iShowCmd) override;
170 STDMETHOD(GetIconLocation)(LPWSTR pszIconPath, INT cchIconPath, INT *piIcon) override;
171 STDMETHOD(SetIconLocation)(LPCWSTR pszIconPath, INT iIcon) override;
172 STDMETHOD(SetRelativePath)(LPCWSTR pszPathRel, DWORD dwReserved) override;
173 // STDMETHOD(Resolve)(HWND hwnd, DWORD fFlags) override;
174 STDMETHOD(SetPath)(LPCWSTR pszFile) override;
175
176 // IShellLinkDataList
177 STDMETHOD(AddDataBlock)(void *pDataBlock) override;
178 STDMETHOD(CopyDataBlock)(DWORD dwSig, void **ppDataBlock) override;
179 STDMETHOD(RemoveDataBlock)(DWORD dwSig) override;
180 STDMETHOD(GetFlags)(DWORD *pdwFlags) override;
181 STDMETHOD(SetFlags)(DWORD dwFlags) override;
182
183 // IExtractIconA
184 STDMETHOD(Extract)(PCSTR pszFile, UINT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize) override;
185 STDMETHOD(GetIconLocation)(UINT uFlags, PSTR pszIconFile, UINT cchMax, int *piIndex, UINT *pwFlags) override;
186
187 // IExtractIconW
188 STDMETHOD(Extract)(PCWSTR pszFile, UINT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize) override;
189 STDMETHOD(GetIconLocation)(UINT uFlags, PWSTR pszIconFile, UINT cchMax, int *piIndex, UINT *pwFlags) override;
190
191 // IShellExtInit
192 STDMETHOD(Initialize)(PCIDLIST_ABSOLUTE pidlFolder, IDataObject *pdtobj, HKEY hkeyProgID) override;
193
194 // IContextMenu
195 STDMETHOD(QueryContextMenu)(HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags) override;
196 STDMETHOD(InvokeCommand)(LPCMINVOKECOMMANDINFO lpici) override;
197 STDMETHOD(GetCommandString)(UINT_PTR idCmd, UINT uType, UINT *pwReserved, LPSTR pszName, UINT cchMax) override;
198
199 // IShellPropSheetExt
200 STDMETHOD(AddPages)(LPFNADDPROPSHEETPAGE pfnAddPage, LPARAM lParam) override;
201 STDMETHOD(ReplacePage)(UINT uPageID, LPFNADDPROPSHEETPAGE pfnReplacePage, LPARAM lParam) override;
202
203 // IObjectWithSite
204 STDMETHOD(SetSite)(IUnknown *punk) override;
205 STDMETHOD(GetSite)(REFIID iid, void **ppvSite) override;
206
207 // IDropTarget
208 STDMETHOD(DragEnter)(IDataObject *pDataObject, DWORD dwKeyState, POINTL pt, DWORD *pdwEffect) override;
209 STDMETHOD(DragOver)(DWORD dwKeyState, POINTL pt, DWORD *pdwEffect) override;
210 STDMETHOD(DragLeave)() override;
211 STDMETHOD(Drop)(IDataObject *pDataObject, DWORD dwKeyState, POINTL pt, DWORD *pdwEffect) override;
212
213DECLARE_REGISTRY_RESOURCEID(IDR_SHELLLINK)
214DECLARE_NOT_AGGREGATABLE(CShellLink)
215
216DECLARE_PROTECT_FINAL_CONSTRUCT()
217
218BEGIN_COM_MAP(CShellLink)
219 COM_INTERFACE_ENTRY_IID(IID_IShellLinkA, IShellLinkA)
220 COM_INTERFACE_ENTRY_IID(IID_IShellLinkW, IShellLinkW)
221 COM_INTERFACE_ENTRY2_IID(IID_IPersist, IPersist, IPersistFile)
222 COM_INTERFACE_ENTRY_IID(IID_IPersistFile, IPersistFile)
223 COM_INTERFACE_ENTRY_IID(IID_IPersistStream, IPersistStream)
224 COM_INTERFACE_ENTRY_IID(IID_IShellExtInit, IShellExtInit)
225 COM_INTERFACE_ENTRY_IID(IID_IContextMenu, IContextMenu) // Technically it should be IContextMenu3
226 COM_INTERFACE_ENTRY_IID(IID_IDropTarget, IDropTarget)
227// COM_INTERFACE_ENTRY_IID(IID_IQueryInfo, IQueryInfo)
228 COM_INTERFACE_ENTRY_IID(IID_IShellLinkDataList, IShellLinkDataList)
229 COM_INTERFACE_ENTRY_IID(IID_IExtractIconA, IExtractIconA)
230 COM_INTERFACE_ENTRY_IID(IID_IExtractIconW, IExtractIconW)
231// COM_INTERFACE_ENTRY_IID(IID_IExtractImage2, IExtractImage2)
232// COM_INTERFACE_ENTRY_IID(IID_IPersistPropertyBag, IPersistPropertyBag)
233// COM_INTERFACE_ENTRY_IID(IID_IServiceProvider, IServiceProvider)
234// COM_INTERFACE_ENTRY_IID(IID_IFilter, IFilter)
235 COM_INTERFACE_ENTRY_IID(IID_IObjectWithSite, IObjectWithSite)
236// COM_INTERFACE_ENTRY_IID(IID_ICustomizeInfoTip, ICustomizeInfoTip)
237 COM_INTERFACE_ENTRY_IID(IID_IShellPropSheetExt, IShellPropSheetExt)
238END_COM_MAP()
239};
240
241#endif /* _SHELLLINK_H_ */