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
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.
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.
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
29 public CComCoClass
<CShellLink
, &CLSID_ShellLink
>,
30 public CComObjectRootEx
<CComMultiThreadModelNoCS
>,
33 public IPersistStream
,
36 public IContextMenu
, // Technically it should be IContextMenu3 (inherits from IContextMenu2 and IContextMenu)
39 public IShellLinkDataList
,
42 // public IExtractImage2, // Inherits from IExtractImage
43 // public IPersistPropertyBag,
44 // public IServiceProvider,
46 public IObjectWithSite
,
47 // public ICustomizeInfoTip,
48 public IShellPropSheetExt
51 /* Link file formats */
59 WCHAR label
[12]; /* assume 8.3 */
65 /* Cached link header */
66 SHELL_LINK_HEADER m_Header
;
68 /* Cached data set according to m_Header.dwFlags (SHELL_LINK_DATA_FLAGS) */
72 /* Link tracker information */
76 LPWSTR m_sDescription
;
83 LPDBLIST m_pDBList
; /* Optional data block list (in the extra data section) */
85 /* Pointers to strings inside Logo3/Darwin info blocks, cached for debug info purposes only */
90 INT m_iIdOpen
; /* ID of the "Open" entry in the context menu */
92 CComPtr
<IUnknown
> m_site
;
93 CComPtr
<IDropTarget
> m_DropTarget
;
97 HRESULT
GetAdvertiseInfo(LPWSTR
*str
, DWORD dwSig
);
98 HRESULT
SetAdvertiseInfo(LPCWSTR str
);
99 HRESULT
WriteAdvertiseInfo(LPCWSTR string
, DWORD dwSig
);
100 HRESULT
SetTargetFromPIDLOrPath(LPCITEMIDLIST pidl
, LPCWSTR pszFile
);
105 static INT_PTR CALLBACK
SH_ShellLinkDlgProc(HWND hwndDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
108 virtual HRESULT STDMETHODCALLTYPE
GetClassID(CLSID
*pclsid
);
109 virtual HRESULT STDMETHODCALLTYPE
IsDirty();
110 virtual HRESULT STDMETHODCALLTYPE
Load(LPCOLESTR pszFileName
, DWORD dwMode
);
111 virtual HRESULT STDMETHODCALLTYPE
Save(LPCOLESTR pszFileName
, BOOL fRemember
);
112 virtual HRESULT STDMETHODCALLTYPE
SaveCompleted(LPCOLESTR pszFileName
);
113 virtual HRESULT STDMETHODCALLTYPE
GetCurFile(LPOLESTR
*ppszFileName
);
116 // virtual HRESULT STDMETHODCALLTYPE GetClassID(CLSID *pclsid);
117 // virtual HRESULT STDMETHODCALLTYPE IsDirty();
118 virtual HRESULT STDMETHODCALLTYPE
Load(IStream
*stm
);
119 virtual HRESULT STDMETHODCALLTYPE
Save(IStream
*stm
, BOOL fClearDirty
);
120 virtual HRESULT STDMETHODCALLTYPE
GetSizeMax(ULARGE_INTEGER
*pcbSize
);
123 virtual HRESULT STDMETHODCALLTYPE
GetPath(LPSTR pszFile
, INT cchMaxPath
, WIN32_FIND_DATAA
*pfd
, DWORD fFlags
);
124 virtual HRESULT STDMETHODCALLTYPE
GetIDList(LPITEMIDLIST
*ppidl
);
125 virtual HRESULT STDMETHODCALLTYPE
SetIDList(LPCITEMIDLIST pidl
);
126 virtual HRESULT STDMETHODCALLTYPE
GetDescription(LPSTR pszName
, INT cchMaxName
);
127 virtual HRESULT STDMETHODCALLTYPE
SetDescription(LPCSTR pszName
);
128 virtual HRESULT STDMETHODCALLTYPE
GetWorkingDirectory(LPSTR pszDir
, INT cchMaxPath
);
129 virtual HRESULT STDMETHODCALLTYPE
SetWorkingDirectory(LPCSTR pszDir
);
130 virtual HRESULT STDMETHODCALLTYPE
GetArguments(LPSTR pszArgs
, INT cchMaxPath
);
131 virtual HRESULT STDMETHODCALLTYPE
SetArguments(LPCSTR pszArgs
);
132 virtual HRESULT STDMETHODCALLTYPE
GetHotkey(WORD
*pwHotkey
);
133 virtual HRESULT STDMETHODCALLTYPE
SetHotkey(WORD wHotkey
);
134 virtual HRESULT STDMETHODCALLTYPE
GetShowCmd(INT
*piShowCmd
);
135 virtual HRESULT STDMETHODCALLTYPE
SetShowCmd(INT iShowCmd
);
136 virtual HRESULT STDMETHODCALLTYPE
GetIconLocation(LPSTR pszIconPath
, INT cchIconPath
, INT
*piIcon
);
137 virtual HRESULT STDMETHODCALLTYPE
SetIconLocation(LPCSTR pszIconPath
, INT iIcon
);
138 virtual HRESULT STDMETHODCALLTYPE
SetRelativePath(LPCSTR pszPathRel
, DWORD dwReserved
);
139 virtual HRESULT STDMETHODCALLTYPE
Resolve(HWND hwnd
, DWORD fFlags
);
140 virtual HRESULT STDMETHODCALLTYPE
SetPath(LPCSTR pszFile
);
143 virtual HRESULT STDMETHODCALLTYPE
GetPath(LPWSTR pszFile
, INT cchMaxPath
, WIN32_FIND_DATAW
*pfd
, DWORD fFlags
);
144 // virtual HRESULT STDMETHODCALLTYPE GetIDList(LPITEMIDLIST *ppidl);
145 // virtual HRESULT STDMETHODCALLTYPE SetIDList(LPCITEMIDLIST pidl);
146 virtual HRESULT STDMETHODCALLTYPE
GetDescription(LPWSTR pszName
, INT cchMaxName
);
147 virtual HRESULT STDMETHODCALLTYPE
SetDescription(LPCWSTR pszName
);
148 virtual HRESULT STDMETHODCALLTYPE
GetWorkingDirectory(LPWSTR pszDir
, INT cchMaxPath
);
149 virtual HRESULT STDMETHODCALLTYPE
SetWorkingDirectory(LPCWSTR pszDir
);
150 virtual HRESULT STDMETHODCALLTYPE
GetArguments(LPWSTR pszArgs
, INT cchMaxPath
);
151 virtual HRESULT STDMETHODCALLTYPE
SetArguments(LPCWSTR pszArgs
);
152 // virtual HRESULT STDMETHODCALLTYPE GetHotkey(WORD *pwHotkey);
153 // virtual HRESULT STDMETHODCALLTYPE SetHotkey(WORD wHotkey);
154 // virtual HRESULT STDMETHODCALLTYPE GetShowCmd(INT *piShowCmd);
155 // virtual HRESULT STDMETHODCALLTYPE SetShowCmd(INT iShowCmd);
156 virtual HRESULT STDMETHODCALLTYPE
GetIconLocation(LPWSTR pszIconPath
, INT cchIconPath
, INT
*piIcon
);
157 virtual HRESULT STDMETHODCALLTYPE
SetIconLocation(LPCWSTR pszIconPath
, INT iIcon
);
158 virtual HRESULT STDMETHODCALLTYPE
SetRelativePath(LPCWSTR pszPathRel
, DWORD dwReserved
);
159 // virtual HRESULT STDMETHODCALLTYPE Resolve(HWND hwnd, DWORD fFlags);
160 virtual HRESULT STDMETHODCALLTYPE
SetPath(LPCWSTR pszFile
);
162 // IShellLinkDataList
163 virtual HRESULT STDMETHODCALLTYPE
AddDataBlock(void *pDataBlock
);
164 virtual HRESULT STDMETHODCALLTYPE
CopyDataBlock(DWORD dwSig
, void **ppDataBlock
);
165 virtual HRESULT STDMETHODCALLTYPE
RemoveDataBlock(DWORD dwSig
);
166 virtual HRESULT STDMETHODCALLTYPE
GetFlags(DWORD
*pdwFlags
);
167 virtual HRESULT STDMETHODCALLTYPE
SetFlags(DWORD dwFlags
);
170 virtual HRESULT STDMETHODCALLTYPE
Extract(PCSTR pszFile
, UINT nIconIndex
, HICON
*phiconLarge
, HICON
*phiconSmall
, UINT nIconSize
);
171 virtual HRESULT STDMETHODCALLTYPE
GetIconLocation(UINT uFlags
, PSTR pszIconFile
, UINT cchMax
, int *piIndex
, UINT
*pwFlags
);
174 virtual HRESULT STDMETHODCALLTYPE
Extract(PCWSTR pszFile
, UINT nIconIndex
, HICON
*phiconLarge
, HICON
*phiconSmall
, UINT nIconSize
);
175 virtual HRESULT STDMETHODCALLTYPE
GetIconLocation(UINT uFlags
, PWSTR pszIconFile
, UINT cchMax
, int *piIndex
, UINT
*pwFlags
);
178 virtual HRESULT STDMETHODCALLTYPE
Initialize(LPCITEMIDLIST pidlFolder
, IDataObject
*pdtobj
, HKEY hkeyProgID
);
181 virtual HRESULT STDMETHODCALLTYPE
QueryContextMenu(HMENU hmenu
, UINT indexMenu
, UINT idCmdFirst
, UINT idCmdLast
, UINT uFlags
);
182 virtual HRESULT STDMETHODCALLTYPE
InvokeCommand(LPCMINVOKECOMMANDINFO lpici
);
183 virtual HRESULT STDMETHODCALLTYPE
GetCommandString(UINT_PTR idCmd
, UINT uType
, UINT
*pwReserved
, LPSTR pszName
, UINT cchMax
);
185 // IShellPropSheetExt
186 virtual HRESULT STDMETHODCALLTYPE
AddPages(LPFNADDPROPSHEETPAGE pfnAddPage
, LPARAM lParam
);
187 virtual HRESULT STDMETHODCALLTYPE
ReplacePage(UINT uPageID
, LPFNADDPROPSHEETPAGE pfnReplacePage
, LPARAM lParam
);
190 virtual HRESULT STDMETHODCALLTYPE
SetSite(IUnknown
*punk
);
191 virtual HRESULT STDMETHODCALLTYPE
GetSite(REFIID iid
, void **ppvSite
);
194 virtual HRESULT STDMETHODCALLTYPE
DragEnter(IDataObject
*pDataObject
, DWORD dwKeyState
, POINTL pt
, DWORD
*pdwEffect
);
195 virtual HRESULT STDMETHODCALLTYPE
DragOver(DWORD dwKeyState
, POINTL pt
, DWORD
*pdwEffect
);
196 virtual HRESULT STDMETHODCALLTYPE
DragLeave();
197 virtual HRESULT STDMETHODCALLTYPE
Drop(IDataObject
*pDataObject
, DWORD dwKeyState
, POINTL pt
, DWORD
*pdwEffect
);
199 DECLARE_REGISTRY_RESOURCEID(IDR_SHELLLINK
)
200 DECLARE_NOT_AGGREGATABLE(CShellLink
)
202 DECLARE_PROTECT_FINAL_CONSTRUCT()
204 BEGIN_COM_MAP(CShellLink
)
205 COM_INTERFACE_ENTRY_IID(IID_IShellLinkA
, IShellLinkA
)
206 COM_INTERFACE_ENTRY_IID(IID_IShellLinkW
, IShellLinkW
)
207 COM_INTERFACE_ENTRY2_IID(IID_IPersist
, IPersist
, IPersistFile
)
208 COM_INTERFACE_ENTRY_IID(IID_IPersistFile
, IPersistFile
)
209 COM_INTERFACE_ENTRY_IID(IID_IPersistStream
, IPersistStream
)
210 COM_INTERFACE_ENTRY_IID(IID_IShellExtInit
, IShellExtInit
)
211 COM_INTERFACE_ENTRY_IID(IID_IContextMenu
, IContextMenu
) // Technically it should be IContextMenu3
212 COM_INTERFACE_ENTRY_IID(IID_IDropTarget
, IDropTarget
)
213 // COM_INTERFACE_ENTRY_IID(IID_IQueryInfo, IQueryInfo)
214 COM_INTERFACE_ENTRY_IID(IID_IShellLinkDataList
, IShellLinkDataList
)
215 COM_INTERFACE_ENTRY_IID(IID_IExtractIconA
, IExtractIconA
)
216 COM_INTERFACE_ENTRY_IID(IID_IExtractIconW
, IExtractIconW
)
217 // COM_INTERFACE_ENTRY_IID(IID_IExtractImage2, IExtractImage2)
218 // COM_INTERFACE_ENTRY_IID(IID_IPersistPropertyBag, IPersistPropertyBag)
219 // COM_INTERFACE_ENTRY_IID(IID_IServiceProvider, IServiceProvider)
220 // COM_INTERFACE_ENTRY_IID(IID_IFilter, IFilter)
221 COM_INTERFACE_ENTRY_IID(IID_IObjectWithSite
, IObjectWithSite
)
222 // COM_INTERFACE_ENTRY_IID(IID_ICustomizeInfoTip, ICustomizeInfoTip)
223 COM_INTERFACE_ENTRY_IID(IID_IShellPropSheetExt
, IShellPropSheetExt
)
227 #endif /* _SHELLLINK_H_ */