ReactOS 0.4.16-dev-1020-gf135cab
CShellLink Class Reference

#include <CShellLink.h>

Inheritance diagram for CShellLink:
Collaboration diagram for CShellLink:

Classes

struct  volume_info
 

Public Types

enum  IDCMD { IDCMD_OPEN = 0 , IDCMD_OPENFILELOCATION }
 
- Public Types inherited from IShellLinkA
enum  SLR_FLAGS {
  SLR_NO_UI = 0x0001 , SLR_ANY_MATCH = 0x0002 , SLR_UPDATE = 0x0004 , SLR_NOUPDATE = 0x0008 ,
  SLR_NOSEARCH = 0x0010 , SLR_NOTRACK = 0x0020 , SLR_NOLINKINFO = 0x0040 , SLR_INVOKE_MSI = 0x0080 ,
  SLR_NO_UI_WITH_MSG_PUMP = 0x0101
}
 
enum  SLGP_FLAGS { SLGP_SHORTPATH = 0x0001 , SLGP_UNCPRIORITY = 0x0002 , SLGP_RAWPATH = 0x0004 }
 
- Public Types inherited from IUnknown
typedef IUnknownLPUNKNOWN
 
- Public Types inherited from IPersistStream
typedef IPersistStreamLPPERSISTSTREAM
 
- Public Types inherited from IPersist
typedef IPersistLPPERSIST
 
- Public Types inherited from IPersistFile
typedef IPersistFileLPPERSISTFILE
 
- Public Types inherited from IShellExtInit
typedef IShellExtInitLPSHELLEXTINIT
 
- Public Types inherited from IContextMenu
typedef IContextMenuLPCONTEXTMENU
 
typedef struct IContextMenu::tagCMINVOKECOMMANDINFO CMINVOKECOMMANDINFO
 
typedef struct IContextMenu::tagCMINVOKECOMMANDINFOLPCMINVOKECOMMANDINFO
 
typedef struct IContextMenu::tagCMInvokeCommandInfoEx CMINVOKECOMMANDINFOEX
 
typedef struct IContextMenu::tagCMInvokeCommandInfoExLPCMINVOKECOMMANDINFOEX
 
- Public Types inherited from IDropTarget
typedef IDropTargetLPDROPTARGET
 
- Public Types inherited from IExtractIconA
typedef IExtractIconALPEXTRACTICONA
 
- Public Types inherited from IExtractIconW
typedef IExtractIconWLPEXTRACTICONW
 
- Public Types inherited from IObjectWithSite
typedef IObjectWithSiteLPOBJECTWITHSITE
 
- Public Types inherited from IShellPropSheetExt
enum  tagSHELLPROPSHEETEXTPAGEID { EXPPS_FILETYPES = 0x1 }
 
typedef UINT EXPPS
 

Public Member Functions

 CShellLink ()
 
 ~CShellLink ()
 
BOOL OnInitDialog (HWND hwndDlg, HWND hwndFocus, LPARAM lParam)
 
void OnCommand (HWND hwndDlg, int id, HWND hwndCtl, UINT codeNotify)
 
LRESULT OnNotify (HWND hwndDlg, int idFrom, LPNMHDR pnmhdr)
 
void OnDestroy (HWND hwndDlg)
 
STDMETHOD() GetClassID (CLSID *pclsid) override
 
STDMETHOD() IsDirty () override
 
STDMETHOD() Load (LPCOLESTR pszFileName, DWORD dwMode) override
 
STDMETHOD() Save (LPCOLESTR pszFileName, BOOL fRemember) override
 
STDMETHOD() SaveCompleted (LPCOLESTR pszFileName) override
 
STDMETHOD() GetCurFile (LPOLESTR *ppszFileName) override
 
STDMETHOD() Load (IStream *stm) override
 
STDMETHOD() Save (IStream *stm, BOOL fClearDirty) override
 
STDMETHOD() GetSizeMax (ULARGE_INTEGER *pcbSize) override
 
STDMETHOD() GetPath (LPSTR pszFile, INT cchMaxPath, WIN32_FIND_DATAA *pfd, DWORD fFlags) override
 
STDMETHOD() GetIDList (PIDLIST_ABSOLUTE *ppidl) override
 
STDMETHOD() SetIDList (PCIDLIST_ABSOLUTE pidl) override
 
STDMETHOD() GetDescription (LPSTR pszName, INT cchMaxName) override
 
STDMETHOD() SetDescription (LPCSTR pszName) override
 
STDMETHOD() GetWorkingDirectory (LPSTR pszDir, INT cchMaxPath) override
 
STDMETHOD() SetWorkingDirectory (LPCSTR pszDir) override
 
STDMETHOD() GetArguments (LPSTR pszArgs, INT cchMaxPath) override
 
STDMETHOD() SetArguments (LPCSTR pszArgs) override
 
STDMETHOD() GetHotkey (WORD *pwHotkey) override
 
STDMETHOD() SetHotkey (WORD wHotkey) override
 
STDMETHOD() GetShowCmd (INT *piShowCmd) override
 
STDMETHOD() SetShowCmd (INT iShowCmd) override
 
STDMETHOD() GetIconLocation (LPSTR pszIconPath, INT cchIconPath, INT *piIcon) override
 
STDMETHOD() SetIconLocation (LPCSTR pszIconPath, INT iIcon) override
 
STDMETHOD() SetRelativePath (LPCSTR pszPathRel, DWORD dwReserved) override
 
STDMETHOD() Resolve (HWND hwnd, DWORD fFlags) override
 
STDMETHOD() SetPath (LPCSTR pszFile) override
 
STDMETHOD() GetPath (LPWSTR pszFile, INT cchMaxPath, WIN32_FIND_DATAW *pfd, DWORD fFlags) override
 
STDMETHOD() GetDescription (LPWSTR pszName, INT cchMaxName) override
 
STDMETHOD() SetDescription (LPCWSTR pszName) override
 
STDMETHOD() GetWorkingDirectory (LPWSTR pszDir, INT cchMaxPath) override
 
STDMETHOD() SetWorkingDirectory (LPCWSTR pszDir) override
 
STDMETHOD() GetArguments (LPWSTR pszArgs, INT cchMaxPath) override
 
STDMETHOD() SetArguments (LPCWSTR pszArgs) override
 
STDMETHOD() GetIconLocation (LPWSTR pszIconPath, INT cchIconPath, INT *piIcon) override
 
STDMETHOD() SetIconLocation (LPCWSTR pszIconPath, INT iIcon) override
 
STDMETHOD() SetRelativePath (LPCWSTR pszPathRel, DWORD dwReserved) override
 
STDMETHOD() SetPath (LPCWSTR pszFile) override
 
STDMETHOD() AddDataBlock (void *pDataBlock) override
 
STDMETHOD() CopyDataBlock (DWORD dwSig, void **ppDataBlock) override
 
STDMETHOD() RemoveDataBlock (DWORD dwSig) override
 
STDMETHOD() GetFlags (DWORD *pdwFlags) override
 
STDMETHOD() SetFlags (DWORD dwFlags) override
 
STDMETHOD() Extract (PCSTR pszFile, UINT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize) override
 
STDMETHOD() GetIconLocation (UINT uFlags, PSTR pszIconFile, UINT cchMax, int *piIndex, UINT *pwFlags) override
 
STDMETHOD() Extract (PCWSTR pszFile, UINT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize) override
 
STDMETHOD() GetIconLocation (UINT uFlags, PWSTR pszIconFile, UINT cchMax, int *piIndex, UINT *pwFlags) override
 
STDMETHOD() Initialize (PCIDLIST_ABSOLUTE pidlFolder, IDataObject *pdtobj, HKEY hkeyProgID) override
 
STDMETHOD() QueryContextMenu (HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags) override
 
STDMETHOD() InvokeCommand (LPCMINVOKECOMMANDINFO lpici) override
 
STDMETHOD() GetCommandString (UINT_PTR idCmd, UINT uType, UINT *pwReserved, LPSTR pszName, UINT cchMax) override
 
STDMETHOD() AddPages (LPFNADDPROPSHEETPAGE pfnAddPage, LPARAM lParam) override
 
STDMETHOD() ReplacePage (UINT uPageID, LPFNADDPROPSHEETPAGE pfnReplacePage, LPARAM lParam) override
 
STDMETHOD() SetSite (IUnknown *punk) override
 
STDMETHOD() GetSite (REFIID iid, void **ppvSite) override
 
STDMETHOD() DragEnter (IDataObject *pDataObject, DWORD dwKeyState, POINTL pt, DWORD *pdwEffect) override
 
STDMETHOD() DragOver (DWORD dwKeyState, POINTL pt, DWORD *pdwEffect) override
 
STDMETHOD() DragLeave () override
 
STDMETHOD() Drop (IDataObject *pDataObject, DWORD dwKeyState, POINTL pt, DWORD *pdwEffect) override
 
- Public Member Functions inherited from ATL::CComObjectRootEx< CComMultiThreadModelNoCS >
 ~CComObjectRootEx ()
 
ULONG InternalAddRef ()
 
ULONG InternalRelease ()
 
void Lock ()
 
void Unlock ()
 
HRESULT _AtlInitialConstruct ()
 
- Public Member Functions inherited from ATL::CComObjectRootBase
 CComObjectRootBase ()
 
 ~CComObjectRootBase ()
 
void SetVoid (void *)
 
HRESULT _AtlFinalConstruct ()
 
HRESULT FinalConstruct ()
 
void InternalFinalConstructAddRef ()
 
void InternalFinalConstructRelease ()
 
void FinalRelease ()
 
- Public Member Functions inherited from IShellLinkA
HRESULT GetPath ([out, size_is(cch)] LPSTR pszFile, [in] int cch, [in, out, unique] WIN32_FIND_DATAA *pfd, [in] DWORD fFlags)
 
HRESULT GetIDList ([out] PIDLIST_ABSOLUTE *ppidl)
 
HRESULT SetIDList ([in] PCIDLIST_ABSOLUTE pidl)
 
HRESULT GetDescription ([out, size_is(cch)] LPSTR pszName, [in] int cch)
 
HRESULT SetDescription ([in] LPCSTR pszName)
 
HRESULT GetWorkingDirectory ([out, size_is(cch)] LPSTR pszDir, [in] int cch)
 
HRESULT SetWorkingDirectory ([in] LPCSTR pszDir)
 
HRESULT GetArguments ([out, size_is(cch)] LPSTR pszArgs, [in] int cch)
 
HRESULT SetArguments ([in] LPCSTR pszArgs)
 
HRESULT GetHotkey ([out] WORD *pwHotkey)
 
HRESULT SetHotkey ([in] WORD wHotkey)
 
HRESULT GetShowCmd ([out] int *piShowCmd)
 
HRESULT SetShowCmd ([in] int iShowCmd)
 
HRESULT GetIconLocation ([out, size_is(cch)] LPSTR pszIconPath, [in] int cch, [out] int *piIcon)
 
HRESULT SetIconLocation ([in] LPCSTR pszIconPath, [in] int iIcon)
 
HRESULT SetRelativePath ([in] LPCSTR pszPathRel, [in] DWORD dwReserved)
 
HRESULT Resolve ([in] HWND hwnd, [in] DWORD fFlags)
 
HRESULT SetPath ([in] LPCSTR pszFile)
 
- Public Member Functions inherited from IUnknown
HRESULT QueryInterface ([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
 
ULONG AddRef ()
 
ULONG Release ()
 
- Public Member Functions inherited from IShellLinkW
HRESULT GetPath ([out, size_is(cch)] LPWSTR pszFile, [in] int cch, [in, out] WIN32_FIND_DATAW *pfd, [in] DWORD fFlags)
 
HRESULT GetIDList ([out] PIDLIST_ABSOLUTE *ppidl)
 
HRESULT SetIDList ([in] PCIDLIST_ABSOLUTE pidl)
 
HRESULT GetDescription ([out, size_is(cch)] LPWSTR pszName, [in] int cch)
 
HRESULT SetDescription ([in] LPCWSTR pszName)
 
HRESULT GetWorkingDirectory ([out, size_is(cch)] LPWSTR pszDir, [in] int cch)
 
HRESULT SetWorkingDirectory ([in] LPCWSTR pszDir)
 
HRESULT GetArguments ([out, size_is(cch)] LPWSTR pszArgs, [in] int cch)
 
HRESULT SetArguments ([in] LPCWSTR pszArgs)
 
HRESULT GetHotkey ([out] WORD *pwHotkey)
 
HRESULT SetHotkey ([in] WORD wHotkey)
 
HRESULT GetShowCmd ([out] int *piShowCmd)
 
HRESULT SetShowCmd ([in] int iShowCmd)
 
HRESULT GetIconLocation ([out, size_is(cch)] LPWSTR pszIconPath, [in] int cch, [out] int *piIcon)
 
HRESULT SetIconLocation ([in] LPCWSTR pszIconPath, [in] int iIcon)
 
HRESULT SetRelativePath ([in] LPCWSTR pszPathRel, [in] DWORD dwReserved)
 
HRESULT Resolve ([in] HWND hwnd, [in] DWORD fFlags)
 
HRESULT SetPath ([in] LPCWSTR pszFile)
 
HRESULT IsDirty ()
 
HRESULT Load ([in, unique] IStream *pStm)
 
HRESULT Save ([in, unique] IStream *pStm, [in] BOOL fClearDirty)
 
HRESULT GetSizeMax ([out] ULARGE_INTEGER *pcbSize)
 
HRESULT GetClassID ([out] CLSID *pClassID)
 
HRESULT IsDirty ()
 
HRESULT Load ([in] LPCOLESTR pszFileName, [in] DWORD dwMode)
 
HRESULT Save ([in, unique] LPCOLESTR pszFileName, [in] BOOL fRemember)
 
HRESULT SaveCompleted ([in, unique] LPCOLESTR pszFileName)
 
HRESULT GetCurFile ([out] LPOLESTR *ppszFileName)
 
HRESULT Initialize ([in] PCIDLIST_ABSOLUTE pidlFolder, [in] IDataObject *pdtobj, [in] HKEY hkeyProgID)
 
HRESULT QueryContextMenu ([in] HMENU hmenu, [in] UINT indexMenu, [in] UINT idCmdFirst, [in] UINT idCmdLast, [in] UINT uFlags)
 
HRESULT InvokeCommand ([in] LPCMINVOKECOMMANDINFO lpici)
 
HRESULT GetCommandString ([in] UINT_PTR idCmd, [in] UINT uType, [out] UINT *pwReserved, [out, size_is(cchMax)] LPSTR pszName, [in] UINT cchMax)
 
HRESULT DragEnter ([in, unique] IDataObject *pDataObj, [in] DWORD grfKeyState, [in] POINTL pt, [in, out] DWORD *pdwEffect)
 
HRESULT DragOver ([in] DWORD grfKeyState, [in] POINTL pt, [in, out] DWORD *pdwEffect)
 
HRESULT DragLeave ()
 
HRESULT Drop ([in, unique] IDataObject *pDataObj, [in] DWORD grfKeyState, [in] POINTL pt, [in, out] DWORD *pdwEffect)
 
HRESULT AddDataBlock ([in] void *pDataBlock)
 
HRESULT CopyDataBlock ([in] DWORD dwSig, [out] void **ppDataBlock)
 
HRESULT RemoveDataBlock ([in] DWORD dwSig)
 
HRESULT GetFlags ([out] DWORD *pdwFlags)
 
HRESULT SetFlags ([in] DWORD dwFlags)
 
- Public Member Functions inherited from IExtractIconA
HRESULT GetIconLocation ([in] UINT uFlags, [out, size_is(cchMax)] LPSTR szIconFile, [in] UINT cchMax, [out] INT *piIndex, [out] UINT *pwFlags)
 
HRESULT Extract ([in] LPCSTR pszFile, [in] UINT nIconIndex, [out] HICON *phiconLarge, [out] HICON *phiconSmall, [in] UINT nIconSize)
 
- Public Member Functions inherited from IExtractIconW
HRESULT GetIconLocation ([in] UINT uFlags, [out, size_is(cchMax)] LPWSTR szIconFile, [in] UINT cchMax, [out] INT *piIndex, [out] UINT *pwFlags)
 
HRESULT Extract ([in] LPCWSTR pszFile, [in] UINT nIconIndex, [out] HICON *phiconLarge, [out] HICON *phiconSmall, [in] UINT nIconSize)
 
- Public Member Functions inherited from IObjectWithSite
HRESULT SetSite ([in] IUnknown *pUnkSite)
 
HRESULT GetSite ([in] REFIID riid, [out, iid_is(riid)] PVOID *ppvSite)
 
- Public Member Functions inherited from IShellPropSheetExt
HRESULT AddPages ([in] LPFNSVADDPROPSHEETPAGE pfnAddPage, [in] LPARAM lParam)
 
HRESULT ReplacePage ([in] EXPPS uPageID, [in] LPFNSVADDPROPSHEETPAGE pfnReplaceWith, [in] LPARAM lParam)
 

Static Public Member Functions

static INT_PTR CALLBACK SH_ShellLinkDlgProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
 
- Static Public Member Functions inherited from ATL::CComObjectRootBase
static void WINAPI ObjectMain (bool)
 
static const struct _ATL_CATMAP_ENTRYGetCategoryMap ()
 
static HRESULT WINAPI InternalQueryInterface (void *pThis, const _ATL_INTMAP_ENTRY *pEntries, REFIID iid, void **ppvObject)
 

Private Member Functions

VOID Reset ()
 
HRESULT GetAdvertiseInfo (LPWSTR *str, DWORD dwSig)
 
HRESULT SetAdvertiseInfo (LPCWSTR str)
 
HRESULT WriteAdvertiseInfo (LPCWSTR string, DWORD dwSig)
 
HRESULT SetTargetFromPIDLOrPath (LPCITEMIDLIST pidl, LPCWSTR pszFile)
 
HICON CreateShortcutIcon (LPCWSTR wszIconPath, INT IconIndex)
 
HRESULT DoOpen (LPCMINVOKECOMMANDINFO lpici)
 
HRESULT DoOpenFileLocation ()
 

Private Attributes

SHELL_LINK_HEADER m_Header
 
LPITEMIDLIST m_pPidl
 
LPWSTR m_sPath
 
volume_info volume
 
LPWSTR m_sDescription
 
LPWSTR m_sPathRel
 
LPWSTR m_sWorkDir
 
LPWSTR m_sArgs
 
LPWSTR m_sIcoPath
 
BOOL m_bRunAs
 
BOOL m_bDirty
 
LPDBLIST m_pDBList
 
BOOL m_bInInit
 
HICON m_hIcon
 
UINT m_idCmdFirst
 
LPWSTR sProduct
 
LPWSTR sComponent
 
LPWSTR m_sLinkPath
 
CComPtr< IUnknownm_site
 
CComPtr< IDropTargetm_DropTarget
 

Additional Inherited Members

- Public Attributes inherited from ATL::CComObjectRootBase
LONG m_dwRef
 
- Public Attributes inherited from IDropTarget
const DWORD MK_ALT = 0x20
 
const DWORD DROPEFFECT_NONE = 0
 
const DWORD DROPEFFECT_COPY = 1
 
const DWORD DROPEFFECT_MOVE = 2
 
const DWORD DROPEFFECT_LINK = 4
 
const DWORD DROPEFFECT_SCROLL = 0x80000000
 
const DWORD DD_DEFSCROLLINSET = 11
 
const DWORD DD_DEFSCROLLDELAY = 50
 
const DWORD DD_DEFSCROLLINTERVAL = 50
 
const DWORD DD_DEFDRAGDELAY = 200
 
const DWORD DD_DEFDRAGMINDIST = 2
 
- Static Public Attributes inherited from IContextMenu
static const WCHAR CMDSTR_NEWFOLDERW [] = {'N','e','w','F','o','l','d','e','r',0}
 
static const WCHAR CMDSTR_VIEWLISTW [] = {'V','i','e','w','L','i','s','t',0}
 
static const WCHAR CMDSTR_VIEWDETAILSW [] = {'V','i','e','w','D','e','t','a','i','l','s',0}
 

Detailed Description

Definition at line 28 of file CShellLink.h.

Member Enumeration Documentation

◆ IDCMD

Enumerator
IDCMD_OPEN 
IDCMD_OPENFILELOCATION 

Definition at line 62 of file CShellLink.h.

63 {
64 IDCMD_OPEN = 0,
66 };

Constructor & Destructor Documentation

◆ CShellLink()

CShellLink::CShellLink ( )

Definition at line 266 of file CShellLink.cpp.

267{
268 m_Header.dwSize = sizeof(m_Header);
269 m_Header.clsid = CLSID_ShellLink;
270 m_Header.dwFlags = 0;
271
277
280 m_Header.wHotKey = 0;
281
282 m_pPidl = NULL;
283
284 m_sPath = NULL;
285 ZeroMemory(&volume, sizeof(volume));
286
290 m_sArgs = NULL;
292 m_bRunAs = FALSE;
293 m_bDirty = FALSE;
294 m_pDBList = NULL;
296 m_hIcon = NULL;
297 m_idCmdFirst = 0;
298
300
302}
#define NULL
Definition: types.h:112
#define FALSE
Definition: types.h:117
#define ZeroMemory
Definition: winbase.h:1743
#define SW_SHOWNORMAL
Definition: winuser.h:781

◆ ~CShellLink()

CShellLink::~CShellLink ( )

Definition at line 304 of file CShellLink.cpp.

305{
306 TRACE("-- destroying IShellLink(%p)\n", this);
307
309
311
319}
#define GetProcessHeap()
Definition: compat.h:736
#define HeapFree(x, y, z)
Definition: compat.h:735
VOID WINAPI SHFreeDataBlockList(LPDBLIST lpList)
Definition: clist.c:331
void WINAPI ILFree(LPITEMIDLIST pidl)
Definition: pidl.c:1044
#define TRACE(s)
Definition: solgame.cpp:4

Member Function Documentation

◆ AddDataBlock()

HRESULT STDMETHODCALLTYPE CShellLink::AddDataBlock ( void pDataBlock)
override

Implements IShellLinkDataList.

Definition at line 2438 of file CShellLink.cpp.

2439{
2440 if (SHAddDataBlock(&m_pDBList, (DATABLOCK_HEADER*)pDataBlock))
2441 {
2442 m_bDirty = TRUE;
2443 return S_OK;
2444 }
2445 return S_FALSE;
2446}
#define TRUE
Definition: types.h:120
BOOL WINAPI SHAddDataBlock(LPDBLIST *lppList, const DATABLOCK_HEADER *lpNewItem)
Definition: clist.c:68
#define S_OK
Definition: intsafe.h:52
#define S_FALSE
Definition: winerror.h:2357

Referenced by SetIconLocation(), SetPath(), and WriteAdvertiseInfo().

◆ AddPages()

HRESULT STDMETHODCALLTYPE CShellLink::AddPages ( LPFNADDPROPSHEETPAGE  pfnAddPage,
LPARAM  lParam 
)
override

Definition at line 3106 of file CShellLink.cpp.

3107{
3109 (LPARAM)this, NULL, &PropSheetPageLifetimeCallback<CShellLink>);
3110 HRESULT hr = AddPropSheetPage(hPage, pfnAddPage, lParam);
3112 return hr;
3113 else
3114 AddRef(); // For PropSheetPageLifetimeCallback
3115 enum { CShellLink_PageIndex_Shortcut = 0 };
3116 return 1 + CShellLink_PageIndex_Shortcut; // Make this page the default (one-based)
3117}
LPARAM lParam
Definition: combotst.c:139
#define FAILED_UNEXPECTEDLY(hr)
Definition: debug.h:83
static HRESULT AddPropSheetPage(HPROPSHEETPAGE hPage, LPFNSVADDPROPSHEETPAGE pfnAddPage, LPARAM lParam)
Definition: precomp.h:151
ULONG AddRef()
struct _PSP * HPROPSHEETPAGE
Definition: mstask.idl:90
HRESULT hr
Definition: shlfolder.c:183
#define IDD_SHORTCUT_PROPERTIES
Definition: shresdef.h:427
HPROPSHEETPAGE SH_CreatePropertySheetPageEx(WORD wDialogId, DLGPROC pfnDlgProc, LPARAM lParam, LPCWSTR pwszTitle, LPFNPSPCALLBACK Callback)
Definition: propsheet.cpp:223
LONG_PTR LPARAM
Definition: windef.h:208

◆ CopyDataBlock()

HRESULT STDMETHODCALLTYPE CShellLink::CopyDataBlock ( DWORD  dwSig,
void **  ppDataBlock 
)
override

Implements IShellLinkDataList.

Definition at line 2448 of file CShellLink.cpp.

2449{
2450 DATABLOCK_HEADER* pBlock;
2451 PVOID pDataBlock;
2452
2453 TRACE("%p %08x %p\n", this, dwSig, ppDataBlock);
2454
2455 *ppDataBlock = NULL;
2456
2457 pBlock = SHFindDataBlock(m_pDBList, dwSig);
2458 if (!pBlock)
2459 {
2460 ERR("unknown datablock %08x (not found)\n", dwSig);
2461 return E_FAIL;
2462 }
2463
2464 pDataBlock = LocalAlloc(LMEM_ZEROINIT, pBlock->cbSize);
2465 if (!pDataBlock)
2466 return E_OUTOFMEMORY;
2467
2468 CopyMemory(pDataBlock, pBlock, pBlock->cbSize);
2469
2470 *ppDataBlock = pDataBlock;
2471 return S_OK;
2472}
#define ERR(fmt,...)
Definition: precomp.h:57
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_FAIL
Definition: ddrawi.h:102
DATABLOCK_HEADER *WINAPI SHFindDataBlock(LPDBLIST lpList, DWORD dwSignature)
Definition: clist.c:424
HLOCAL NTAPI LocalAlloc(UINT uFlags, SIZE_T dwBytes)
Definition: heapmem.c:1390
#define LMEM_ZEROINIT
Definition: winbase.h:401
#define CopyMemory
Definition: winbase.h:1741

◆ CreateShortcutIcon()

HICON CShellLink::CreateShortcutIcon ( LPCWSTR  wszIconPath,
INT  IconIndex 
)
private

Definition at line 3221 of file CShellLink.cpp.

3222{
3224 const COLORREF crMask = GetSysColor(COLOR_3DFACE);
3225 WCHAR wszLnkIcon[MAX_PATH];
3226 int lnk_idx;
3227 HDC hDC;
3229 HICON hIcon = NULL, hNewIcon = NULL, hShortcut;
3230
3231 if (HLM_GetIconW(IDI_SHELL_SHORTCUT - 1, wszLnkIcon, _countof(wszLnkIcon), &lnk_idx))
3232 {
3233 ::ExtractIconExW(wszLnkIcon, lnk_idx, &hShortcut, NULL, 1);
3234 }
3235 else
3236 {
3238 IMAGE_ICON, cx, cy, 0);
3239 }
3240
3241 ::ExtractIconExW(wszIconPath, IconIndex, &hIcon, NULL, 1);
3242 if (!hIcon || !hShortcut || !himl)
3243 goto cleanup;
3244
3246 if (hDC)
3247 {
3248 // create 32bpp bitmap
3249 BITMAPINFO bi;
3250 ZeroMemory(&bi, sizeof(bi));
3251 bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
3252 bi.bmiHeader.biWidth = cx;
3253 bi.bmiHeader.biHeight = cy;
3254 bi.bmiHeader.biPlanes = 1;
3255 bi.bmiHeader.biBitCount = 32;
3256 LPVOID pvBits;
3257 HBITMAP hbm = CreateDIBSection(hDC, &bi, DIB_RGB_COLORS, &pvBits, NULL, 0);
3258 if (hbm)
3259 {
3260 // draw the icon image
3261 HGDIOBJ hbmOld = SelectObject(hDC, hbm);
3262 {
3263 HBRUSH hbr = CreateSolidBrush(crMask);
3264 RECT rc = { 0, 0, cx, cy };
3265 FillRect(hDC, &rc, hbr);
3266 DeleteObject(hbr);
3267
3268 DrawIconEx(hDC, 0, 0, hIcon, cx, cy, 0, NULL, DI_NORMAL);
3269 DrawIconEx(hDC, 0, 0, hShortcut, cx, cy, 0, NULL, DI_NORMAL);
3270 }
3271 SelectObject(hDC, hbmOld);
3272
3273 INT iAdded = ImageList_AddMasked(himl, hbm, crMask);
3274 hNewIcon = ImageList_GetIcon(himl, iAdded, ILD_NORMAL | ILD_TRANSPARENT);
3275
3277 }
3278 DeleteDC(hDC);
3279 }
3280
3281cleanup:
3282 if (hIcon)
3284 if (hShortcut)
3285 DestroyIcon(hShortcut);
3286 if (himl)
3288
3289 return hNewIcon;
3290}
static HDC hDC
Definition: 3dtext.c:33
#define shell32_hInstance
HIMAGELIST himl
BOOL WINAPI ImageList_Destroy(HIMAGELIST himl)
Definition: imagelist.c:941
HICON WINAPI ImageList_GetIcon(HIMAGELIST himl, INT i, UINT fStyle)
Definition: imagelist.c:1981
INT WINAPI ImageList_AddMasked(HIMAGELIST himl, HBITMAP hBitmap, COLORREF clrMask)
Definition: imagelist.c:573
HIMAGELIST WINAPI ImageList_Create(INT cx, INT cy, UINT flags, INT cInitial, INT cGrow)
Definition: imagelist.c:814
#define MAX_PATH
Definition: compat.h:34
static void cleanup(void)
Definition: main.c:1335
static const WCHAR IconIndex[]
Definition: install.c:52
pKey DeleteObject()
UINT WINAPI ExtractIconExW(LPCWSTR lpszFile, INT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIcons)
Definition: iconcache.cpp:855
static HBITMAP
Definition: button.c:44
static HDC
Definition: imagelist.c:88
static HICON
Definition: imagelist.c:80
HICON hIcon
Definition: msconfig.c:44
_In_ HBITMAP hbm
Definition: ntgdi.h:2776
#define MAKEINTRESOURCE(i)
Definition: ntverrsrc.c:25
_Out_opt_ int _Out_opt_ int * cy
Definition: commctrl.h:586
#define ILD_NORMAL
Definition: commctrl.h:417
_Out_opt_ int * cx
Definition: commctrl.h:585
#define ILC_COLOR32
Definition: commctrl.h:358
#define ILD_TRANSPARENT
Definition: commctrl.h:418
#define ILC_MASK
Definition: commctrl.h:351
#define IDI_SHELL_SHORTCUT
Definition: shresdef.h:608
#define _countof(array)
Definition: sndvol32.h:70
USHORT biBitCount
Definition: precomp.h:46
BITMAPINFOHEADER bmiHeader
Definition: wingdi.h:1476
int32_t INT
Definition: typedefs.h:58
HBITMAP WINAPI CreateDIBSection(HDC hDC, CONST BITMAPINFO *BitmapInfo, UINT Usage, VOID **Bits, HANDLE hSection, DWORD dwOffset)
Definition: bitmap.c:245
DWORD COLORREF
Definition: windef.h:300
#define DIB_RGB_COLORS
Definition: wingdi.h:367
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1546
#define DI_NORMAL
Definition: wingdi.h:72
HDC WINAPI CreateCompatibleDC(_In_opt_ HDC hdc)
int WINAPI FillRect(HDC, LPCRECT, HBRUSH)
HBRUSH WINAPI CreateSolidBrush(_In_ COLORREF)
BOOL WINAPI DeleteDC(_In_ HDC)
DWORD WINAPI GetSysColor(_In_ int)
#define IMAGE_ICON
Definition: winuser.h:212
HANDLE WINAPI LoadImageW(_In_opt_ HINSTANCE hInst, _In_ LPCWSTR name, _In_ UINT type, _In_ int cx, _In_ int cy, _In_ UINT fuLoad)
Definition: cursoricon.c:2540
#define SM_CYICON
Definition: winuser.h:984
BOOL WINAPI DrawIconEx(_In_ HDC, _In_ int, _In_ int, _In_ HICON, _In_ int, _In_ int, _In_ UINT, _In_opt_ HBRUSH, _In_ UINT)
Definition: cursoricon.c:2365
#define SM_CXICON
Definition: winuser.h:983
int WINAPI GetSystemMetrics(_In_ int)
BOOL WINAPI DestroyIcon(_In_ HICON)
Definition: cursoricon.c:2390
#define COLOR_3DFACE
Definition: winuser.h:940
__wchar_t WCHAR
Definition: xmlstorage.h:180

Referenced by OnCommand().

◆ DoOpen()

HRESULT CShellLink::DoOpen ( LPCMINVOKECOMMANDINFO  lpici)
private

Definition at line 2631 of file CShellLink.cpp.

2632{
2634 const BOOL unicode = IsUnicode(*lpici);
2635
2636 CStringW args;
2637 if (m_sArgs)
2638 args = m_sArgs;
2639
2640 if (unicode)
2641 {
2642 if (!StrIsNullOrEmpty(iciex->lpParametersW))
2643 {
2644 args += L' ';
2645 args += iciex->lpParametersW;
2646 }
2647 }
2648 else
2649 {
2650 CComHeapPtr<WCHAR> pszParams;
2651 if (!StrIsNullOrEmpty(lpici->lpParameters) && __SHCloneStrAtoW(&pszParams, lpici->lpParameters))
2652 {
2653 args += L' ';
2654 args += pszParams;
2655 }
2656 }
2657
2659 SHELLEXECUTEINFOW sei = { sizeof(sei) };
2662 sei.lpDirectory = m_sWorkDir;
2663 if (m_pPidl)
2664 {
2665 sei.lpIDList = m_pPidl;
2667 }
2668 else
2669 {
2670 sei.lpFile = m_sPath;
2672 {
2673 sei.fMask &= ~SEE_MASK_DOENVSUBST; // The link does not want to expand lpFile
2675 sei.lpDirectory = dir;
2676 }
2677 }
2678 sei.lpParameters = args;
2679 sei.lpClass = m_sLinkPath;
2681 if (lpici->nShow != SW_SHOWNORMAL && lpici->nShow != SW_SHOW)
2682 sei.nShow = lpici->nShow; // Allow invoker to override .lnk show mode
2683
2684 // Use the invoker specified working directory if the link did not specify one
2685 if (StrIsNullOrEmpty(sei.lpDirectory) || !PathEnvSubstIsDirectory(sei.lpDirectory))
2686 {
2687 LPCSTR pszDirA = lpici->lpDirectory;
2688 if (unicode && !StrIsNullOrEmpty(iciex->lpDirectoryW))
2689 sei.lpDirectory = iciex->lpDirectoryW;
2690 else if (pszDirA && SHAnsiToUnicode(pszDirA, dir, _countof(dir)))
2691 sei.lpDirectory = dir;
2692 }
2693 return (ShellExecuteExW(&sei) ? S_OK : E_FAIL);
2694}
unsigned int dir
Definition: maze.c:112
DWORD WINAPI ExpandEnvironmentStringsW(IN LPCWSTR lpSrc, IN LPWSTR lpDst, IN DWORD nSize)
Definition: environ.c:519
DWORD WINAPI SHAnsiToUnicode(LPCSTR lpSrcStr, LPWSTR lpDstStr, int iLen)
Definition: string.c:2673
unsigned int BOOL
Definition: ntddk_ex.h:94
struct IContextMenu::tagCMInvokeCommandInfoEx * LPCMINVOKECOMMANDINFOEX
if(dx< 0)
Definition: linetemp.h:194
#define L(x)
Definition: ntvdm.h:50
static __inline LPWSTR __SHCloneStrAtoW(WCHAR **target, const char *source)
Definition: shell32_main.h:184
#define SEE_MASK_DOENVSUBST
Definition: shellapi.h:35
#define SEE_MASK_UNICODE
Definition: shellapi.h:37
#define SEE_MASK_ASYNCOK
Definition: shellapi.h:54
#define SEE_MASK_NOASYNC
Definition: shellapi.h:33
#define SEE_MASK_INVOKEIDLIST
Definition: shellapi.h:28
#define SEE_MASK_FLAG_NO_UI
Definition: shellapi.h:36
#define SEE_MASK_HASLINKNAME
Definition: shellapi.h:49
BOOL WINAPI DECLSPEC_HOTPATCH ShellExecuteExW(LPSHELLEXECUTEINFOW sei)
Definition: shlexec.cpp:2452
@ SLDF_HAS_EXP_SZ
Definition: shlobj.h:1961
LPCWSTR lpDirectory
Definition: shellapi.h:335
LPCWSTR lpParameters
Definition: shellapi.h:334
Definition: match.c:390
#define SW_SHOW
Definition: winuser.h:786
const char * LPCSTR
Definition: xmlstorage.h:183

◆ DoOpenFileLocation()

HRESULT CShellLink::DoOpenFileLocation ( )
private

Definition at line 2581 of file CShellLink.cpp.

2582{
2583 // TODO: SHOpenFolderAndSelectItems
2584 WCHAR szParams[MAX_PATH + 64];
2585 StringCbPrintfW(szParams, sizeof(szParams), L"/select,%s", m_sPath);
2586
2587 INT_PTR ret;
2588 ret = reinterpret_cast<INT_PTR>(ShellExecuteW(NULL, NULL, L"explorer.exe", szParams,
2590 if (ret <= 32)
2591 {
2592 ERR("ret: %08lX\n", ret);
2593 return E_FAIL;
2594 }
2595
2596 return S_OK;
2597}
HINSTANCE WINAPI ShellExecuteW(HWND hwnd, LPCWSTR lpVerb, LPCWSTR lpFile, LPCWSTR lpParameters, LPCWSTR lpDirectory, INT nShowCmd)
Definition: shlexec.cpp:2507
STRSAFEAPI StringCbPrintfW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszFormat,...)
Definition: strsafe.h:557
int32_t INT_PTR
Definition: typedefs.h:64
int ret

Referenced by InvokeCommand().

◆ DragEnter()

HRESULT STDMETHODCALLTYPE CShellLink::DragEnter ( IDataObject pDataObject,
DWORD  dwKeyState,
POINTL  pt,
DWORD pdwEffect 
)
override

Implements IDropTarget.

Definition at line 3144 of file CShellLink.cpp.

3146{
3147 TRACE("(%p)->(DataObject=%p)\n", this, pDataObject);
3148
3149 if (*pdwEffect == DROPEFFECT_NONE)
3150 return S_OK;
3151
3153 if (SUCCEEDED(hr))
3154 hr = m_DropTarget->DragEnter(pDataObject, dwKeyState, pt, pdwEffect);
3155 else
3156 *pdwEffect = DROPEFFECT_NONE;
3157
3158 return S_OK;
3159}
EXTERN_C HRESULT SHELL_GetUIObjectOfAbsoluteItem(_In_opt_ HWND hWnd, _In_ PCIDLIST_ABSOLUTE pidl, _In_ REFIID riid, _Out_ void **ppvObj)
Definition: utils.cpp:380
#define pt(x, y)
Definition: drawing.c:79
const DWORD DROPEFFECT_NONE
Definition: oleidl.idl:929
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define IID_PPV_ARG(Itype, ppType)

◆ DragLeave()

HRESULT STDMETHODCALLTYPE CShellLink::DragLeave ( void  )
override

Implements IDropTarget.

Definition at line 3171 of file CShellLink.cpp.

3172{
3173 TRACE("(%p)\n", this);
3174 HRESULT hr = S_OK;
3175 if (m_DropTarget)
3176 {
3177 hr = m_DropTarget->DragLeave();
3179 }
3180
3181 return hr;
3182}
void Release()
Definition: atlcomcli.h:170

◆ DragOver()

HRESULT STDMETHODCALLTYPE CShellLink::DragOver ( DWORD  dwKeyState,
POINTL  pt,
DWORD pdwEffect 
)
override

Implements IDropTarget.

Definition at line 3161 of file CShellLink.cpp.

3163{
3164 TRACE("(%p)\n", this);
3165 HRESULT hr = S_OK;
3166 if (m_DropTarget)
3167 hr = m_DropTarget->DragOver(dwKeyState, pt, pdwEffect);
3168 return hr;
3169}

◆ Drop()

HRESULT STDMETHODCALLTYPE CShellLink::Drop ( IDataObject pDataObject,
DWORD  dwKeyState,
POINTL  pt,
DWORD pdwEffect 
)
override

Implements IDropTarget.

Definition at line 3184 of file CShellLink.cpp.

3186{
3187 TRACE("(%p)\n", this);
3188 HRESULT hr = S_OK;
3189 if (m_DropTarget)
3190 hr = m_DropTarget->Drop(pDataObject, dwKeyState, pt, pdwEffect);
3191
3192 return hr;
3193}

◆ Extract() [1/2]

HRESULT STDMETHODCALLTYPE CShellLink::Extract ( PCSTR  pszFile,
UINT  nIconIndex,
HICON phiconLarge,
HICON phiconSmall,
UINT  nIconSize 
)
override

Implements IExtractIconA.

Definition at line 1368 of file CShellLink.cpp.

1369{
1370 TRACE("(%p)->(path=%s iicon=%u)\n", this, pszFile, nIconIndex);
1371
1372 LPWSTR str = NULL;
1373 if (pszFile)
1374 {
1375 str = HEAP_strdupAtoW(GetProcessHeap(), 0, pszFile);
1376 if (!str)
1377 return E_OUTOFMEMORY;
1378 }
1379
1380 HRESULT hr = Extract(str, nIconIndex, phiconLarge, phiconSmall, nIconSize);
1381
1382 if (str)
1384
1385 return hr;
1386}
const WCHAR * str
WCHAR * LPWSTR
Definition: xmlstorage.h:184

Referenced by Extract().

◆ Extract() [2/2]

HRESULT STDMETHODCALLTYPE CShellLink::Extract ( PCWSTR  pszFile,
UINT  nIconIndex,
HICON phiconLarge,
HICON phiconSmall,
UINT  nIconSize 
)
override

Definition at line 1803 of file CShellLink.cpp.

1804{
1805 HRESULT hr = NOERROR;
1806 UINT cxyLarge = LOWORD(nIconSize), cxySmall = HIWORD(nIconSize);
1807
1808 if (phiconLarge)
1809 {
1810 *phiconLarge = NULL;
1811 PrivateExtractIconsW(pszFile, nIconIndex, cxyLarge, cxyLarge, phiconLarge, NULL, 1, 0);
1812
1813 if (*phiconLarge == NULL)
1814 hr = S_FALSE;
1815 }
1816
1817 if (phiconSmall)
1818 {
1819 *phiconSmall = NULL;
1820 PrivateExtractIconsW(pszFile, nIconIndex, cxySmall, cxySmall, phiconSmall, NULL, 1, 0);
1821
1822 if (*phiconSmall == NULL)
1823 hr = S_FALSE;
1824 }
1825
1826 if (hr == S_FALSE)
1827 {
1828 if (phiconLarge && *phiconLarge)
1829 {
1830 DestroyIcon(*phiconLarge);
1831 *phiconLarge = NULL;
1832 }
1833 if (phiconSmall && *phiconSmall)
1834 {
1835 DestroyIcon(*phiconSmall);
1836 *phiconSmall = NULL;
1837 }
1838 }
1839
1840 return hr;
1841}
unsigned int UINT
Definition: ndis.h:50
#define LOWORD(l)
Definition: pedump.c:82
#define HIWORD(l)
Definition: typedefs.h:247
#define NOERROR
Definition: winerror.h:2354
UINT WINAPI PrivateExtractIconsW(_In_reads_(MAX_PATH) LPCWSTR szFileName, _In_ int nIconIndex, _In_ int cxIcon, _In_ int cyIcon, _Out_writes_opt_(nIcons) HICON *phicon, _Out_writes_opt_(nIcons) UINT *piconid, _In_ UINT nIcons, _In_ UINT flags)

◆ GetAdvertiseInfo()

HRESULT CShellLink::GetAdvertiseInfo ( LPWSTR str,
DWORD  dwSig 
)
private

Definition at line 621 of file CShellLink.cpp.

622{
623 LPEXP_DARWIN_LINK pInfo;
624
625 *str = NULL;
626
628 if (!pInfo)
629 return E_FAIL;
630
631 /* Make sure that the size of the structure is valid */
632 if (pInfo->dbh.cbSize != sizeof(*pInfo))
633 {
634 ERR("Ooops. This structure is not as expected...\n");
635 return E_FAIL;
636 }
637
638 TRACE("dwSig %08x string = '%s'\n", pInfo->dbh.dwSignature, debugstr_w(pInfo->szwDarwinID));
639
640 *str = pInfo->szwDarwinID;
641 return S_OK;
642}
#define debugstr_w
Definition: kernel32.h:32
struct EXP_DARWIN_LINK * LPEXP_DARWIN_LINK

Referenced by Load(), Resolve(), and SetAdvertiseInfo().

◆ GetArguments() [1/2]

HRESULT STDMETHODCALLTYPE CShellLink::GetArguments ( LPSTR  pszArgs,
INT  cchMaxPath 
)
override

Definition at line 1252 of file CShellLink.cpp.

1253{
1254 TRACE("(%p)->(%p len=%u)\n", this, pszArgs, cchMaxPath);
1255
1256 if (cchMaxPath)
1257 *pszArgs = 0;
1258
1259 if (m_sArgs)
1261 pszArgs, cchMaxPath, NULL, NULL);
1262
1263 return S_OK;
1264}
#define CP_ACP
Definition: compat.h:109
#define WideCharToMultiByte
Definition: compat.h:111

◆ GetArguments() [2/2]

HRESULT STDMETHODCALLTYPE CShellLink::GetArguments ( LPWSTR  pszArgs,
INT  cchMaxPath 
)
override

Definition at line 1674 of file CShellLink.cpp.

1675{
1676 TRACE("(%p)->(%p len=%u)\n", this, pszArgs, cchMaxPath);
1677
1678 if (cchMaxPath)
1679 *pszArgs = 0;
1680
1681 if (m_sArgs)
1682 lstrcpynW(pszArgs, m_sArgs, cchMaxPath);
1683
1684 return S_OK;
1685}
#define lstrcpynW
Definition: compat.h:738

◆ GetClassID()

HRESULT STDMETHODCALLTYPE CShellLink::GetClassID ( CLSID pclsid)
override

Implements IPersist.

Definition at line 321 of file CShellLink.cpp.

322{
323 TRACE("%p %p\n", this, pclsid);
324
325 if (pclsid == NULL)
326 return E_POINTER;
327 *pclsid = CLSID_ShellLink;
328 return S_OK;
329}
#define E_POINTER
Definition: winerror.h:2365

◆ GetCommandString()

HRESULT STDMETHODCALLTYPE CShellLink::GetCommandString ( UINT_PTR  idCmd,
UINT  uType,
UINT pwReserved,
LPSTR  pszName,
UINT  cchMax 
)
override

Implements IContextMenu.

Definition at line 2696 of file CShellLink.cpp.

2697{
2698 FIXME("%p %lu %u %p %p %u\n", this, idCmd, uType, pwReserved, pszName, cchMax);
2699 return E_NOTIMPL;
2700}
UINT cchMax
#define FIXME(fmt,...)
Definition: precomp.h:53
#define E_NOTIMPL
Definition: ddrawi.h:99

◆ GetCurFile()

HRESULT STDMETHODCALLTYPE CShellLink::GetCurFile ( LPOLESTR ppszFileName)
override

Implements IPersistFile.

Definition at line 409 of file CShellLink.cpp.

410{
411 *ppszFileName = NULL;
412
413 if (!m_sLinkPath)
414 {
415 /* IPersistFile::GetCurFile called before IPersistFile::Save */
416 return S_FALSE;
417 }
418
419 *ppszFileName = (LPOLESTR)CoTaskMemAlloc((wcslen(m_sLinkPath) + 1) * sizeof(WCHAR));
420 if (!*ppszFileName)
421 {
422 /* out of memory */
423 return E_OUTOFMEMORY;
424 }
425
426 /* copy last saved filename */
427 wcscpy(*ppszFileName, m_sLinkPath);
428
429 return S_OK;
430}
wcscpy
LPVOID WINAPI CoTaskMemAlloc(SIZE_T size)
Definition: ifs.c:426
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
static LPOLESTR
Definition: stg_prop.c:27

◆ GetDescription() [1/2]

HRESULT STDMETHODCALLTYPE CShellLink::GetDescription ( LPSTR  pszName,
INT  cchMaxName 
)
override

Definition at line 1188 of file CShellLink.cpp.

1189{
1190 TRACE("(%p)->(%p len=%u)\n", this, pszName, cchMaxName);
1191
1192 if (cchMaxName)
1193 *pszName = 0;
1194
1195 if (m_sDescription)
1197 pszName, cchMaxName, NULL, NULL);
1198
1199 return S_OK;
1200}

◆ GetDescription() [2/2]

HRESULT STDMETHODCALLTYPE CShellLink::GetDescription ( LPWSTR  pszName,
INT  cchMaxName 
)
override

Definition at line 1614 of file CShellLink.cpp.

1615{
1616 TRACE("(%p)->(%p len=%u)\n", this, pszName, cchMaxName);
1617
1618 *pszName = 0;
1619 if (m_sDescription)
1620 lstrcpynW(pszName, m_sDescription, cchMaxName);
1621
1622 return S_OK;
1623}

◆ GetFlags()

HRESULT STDMETHODCALLTYPE CShellLink::GetFlags ( DWORD pdwFlags)
override

Implements IShellLinkDataList.

Definition at line 2484 of file CShellLink.cpp.

2485{
2486 TRACE("%p %p\n", this, pdwFlags);
2487 *pdwFlags = m_Header.dwFlags;
2488 return S_OK;
2489}

◆ GetHotkey()

HRESULT STDMETHODCALLTYPE CShellLink::GetHotkey ( WORD pwHotkey)
override

Implements IShellLinkA.

Definition at line 1284 of file CShellLink.cpp.

1285{
1286 TRACE("(%p)->(%p)(0x%08x)\n", this, pwHotkey, m_Header.wHotKey);
1287 *pwHotkey = m_Header.wHotKey;
1288 return S_OK;
1289}

◆ GetIconLocation() [1/4]

HRESULT STDMETHODCALLTYPE CShellLink::GetIconLocation ( LPSTR  pszIconPath,
INT  cchIconPath,
INT piIcon 
)
override

Definition at line 1318 of file CShellLink.cpp.

1319{
1320 HRESULT hr;
1321 LPWSTR pszIconPathW;
1322
1323 TRACE("(%p)->(%p len=%u iicon=%p)\n", this, pszIconPath, cchIconPath, piIcon);
1324
1325 /* Allocate a temporary UNICODE buffer */
1326 pszIconPathW = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, cchIconPath * sizeof(WCHAR));
1327 if (!pszIconPathW)
1328 return E_OUTOFMEMORY;
1329
1330 /* Call the UNICODE function */
1331 hr = GetIconLocation(pszIconPathW, cchIconPath, piIcon);
1332
1333 /* Convert the file path back to ANSI */
1334 WideCharToMultiByte(CP_ACP, 0, pszIconPathW, -1,
1335 pszIconPath, cchIconPath, NULL, NULL);
1336
1337 /* Free the temporary buffer */
1338 HeapFree(GetProcessHeap(), 0, pszIconPathW);
1339
1340 return hr;
1341}
#define HeapAlloc
Definition: compat.h:733

Referenced by GetIconLocation().

◆ GetIconLocation() [2/4]

HRESULT STDMETHODCALLTYPE CShellLink::GetIconLocation ( LPWSTR  pszIconPath,
INT  cchIconPath,
INT piIcon 
)
override

Definition at line 1705 of file CShellLink.cpp.

1706{
1707 TRACE("(%p)->(%p len=%u iicon=%p)\n", this, pszIconPath, cchIconPath, piIcon);
1708
1709 if (cchIconPath)
1710 *pszIconPath = 0;
1711
1712 *piIcon = 0;
1713
1714 /* Update the original icon path location */
1716 {
1718
1719 /* Search for an icon environment block */
1720 LPEXP_SZ_LINK pInfo;
1722 if (pInfo && (pInfo->cbSize == sizeof(*pInfo)))
1723 {
1725
1726 m_Header.dwFlags &= ~SLDF_HAS_ICONLOCATION;
1728
1730 if (!m_sIcoPath)
1731 return E_OUTOFMEMORY;
1732
1734
1735 m_bDirty = TRUE;
1736 }
1737 }
1738
1739 *piIcon = m_Header.nIconIndex;
1740
1741 if (m_sIcoPath)
1742 lstrcpynW(pszIconPath, m_sIcoPath, cchIconPath);
1743
1744 return S_OK;
1745}
static WCHAR * strdupW(const WCHAR *src)
Definition: main.c:92
LPCWSTR szPath
Definition: env.c:37
@ SLDF_HAS_EXP_ICON_SZ
Definition: shlobj.h:1968
@ SLDF_HAS_ICONLOCATION
Definition: shlobj.h:1958
#define EXP_SZ_ICON_SIG
Definition: shlobj.h:2067
struct EXP_SZ_LINK * LPEXP_SZ_LINK
DWORD WINAPI SHExpandEnvironmentStringsW(LPCWSTR, LPWSTR, DWORD)

◆ GetIconLocation() [3/4]

HRESULT STDMETHODCALLTYPE CShellLink::GetIconLocation ( UINT  uFlags,
PSTR  pszIconFile,
UINT  cchMax,
int piIndex,
UINT pwFlags 
)
override

Definition at line 1343 of file CShellLink.cpp.

1344{
1345 HRESULT hr;
1346 LPWSTR pszIconFileW;
1347
1348 TRACE("(%p)->(%u %p len=%u piIndex=%p pwFlags=%p)\n", this, uFlags, pszIconFile, cchMax, piIndex, pwFlags);
1349
1350 /* Allocate a temporary UNICODE buffer */
1351 pszIconFileW = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, cchMax * sizeof(WCHAR));
1352 if (!pszIconFileW)
1353 return E_OUTOFMEMORY;
1354
1355 /* Call the UNICODE function */
1356 hr = GetIconLocation(uFlags, pszIconFileW, cchMax, piIndex, pwFlags);
1357
1358 /* Convert the file path back to ANSI */
1359 WideCharToMultiByte(CP_ACP, 0, pszIconFileW, -1,
1360 pszIconFile, cchMax, NULL, NULL);
1361
1362 /* Free the temporary buffer */
1363 HeapFree(GetProcessHeap(), 0, pszIconFileW);
1364
1365 return hr;
1366}
UINT uFlags
Definition: api.c:59

◆ GetIconLocation() [4/4]

HRESULT STDMETHODCALLTYPE CShellLink::GetIconLocation ( UINT  uFlags,
PWSTR  pszIconFile,
UINT  cchMax,
int piIndex,
UINT pwFlags 
)
override

Definition at line 1761 of file CShellLink.cpp.

1762{
1763 HRESULT hr;
1764
1765 pszIconFile[0] = UNICODE_NULL;
1766
1767 /*
1768 * It is possible for a shell link to point to another shell link,
1769 * and in particular there is the possibility to point to itself.
1770 * Now, suppose we ask such a link to retrieve its associated icon.
1771 * This function would be called, and due to COM would be called again
1772 * recursively. To solve this issue, we forbid calling GetIconLocation()
1773 * with GIL_FORSHORTCUT set in uFlags, as done by Windows (shown by tests).
1774 */
1775 if (uFlags & GIL_FORSHORTCUT)
1776 return E_INVALIDARG;
1777
1778 /*
1779 * Now, we set GIL_FORSHORTCUT so that: i) we allow the icon extractor
1780 * of the target to give us a suited icon, and ii) we protect ourselves
1781 * against recursive call.
1782 */
1783 uFlags |= GIL_FORSHORTCUT;
1784
1785 if (uFlags & GIL_DEFAULTICON)
1786 return S_FALSE;
1787
1788 hr = GetIconLocation(pszIconFile, cchMax, piIndex);
1789 if (FAILED(hr) || pszIconFile[0] == UNICODE_NULL)
1790 {
1791 hr = SHELL_PidlGetIconLocationW(m_pPidl, uFlags, pszIconFile, cchMax, piIndex, pwFlags);
1792 }
1793 else
1794 {
1795 // TODO: If GetIconLocation succeeded, why are we setting GIL_NOTFILENAME? And are we not PERINSTANCE?
1796 *pwFlags = GIL_NOTFILENAME | GIL_PERCLASS;
1797 }
1798
1799 return hr;
1800}
#define E_INVALIDARG
Definition: ddrawi.h:101
#define FAILED(hr)
Definition: intsafe.h:51
#define UNICODE_NULL

◆ GetIDList()

HRESULT STDMETHODCALLTYPE CShellLink::GetIDList ( PIDLIST_ABSOLUTE ppidl)
override

Implements IShellLinkA.

Definition at line 1168 of file CShellLink.cpp.

1169{
1170 TRACE("(%p)->(ppidl=%p)\n", this, ppidl);
1171
1172 if (!m_pPidl)
1173 {
1174 *ppidl = NULL;
1175 return S_FALSE;
1176 }
1177
1178 *ppidl = ILClone(m_pPidl);
1179 return S_OK;
1180}
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
Definition: pidl.c:237

Referenced by OnInitDialog().

◆ GetPath() [1/2]

HRESULT STDMETHODCALLTYPE CShellLink::GetPath ( LPSTR  pszFile,
INT  cchMaxPath,
WIN32_FIND_DATAA pfd,
DWORD  fFlags 
)
override

Definition at line 1119 of file CShellLink.cpp.

1120{
1121 HRESULT hr;
1122 LPWSTR pszFileW;
1123 WIN32_FIND_DATAW wfd;
1124
1125 TRACE("(%p)->(pfile=%p len=%u find_data=%p flags=%u)(%s)\n",
1126 this, pszFile, cchMaxPath, pfd, fFlags, debugstr_w(m_sPath));
1127
1128 /* Allocate a temporary UNICODE buffer */
1129 pszFileW = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, max(cchMaxPath, MAX_PATH) * sizeof(WCHAR));
1130 if (!pszFileW)
1131 return E_OUTOFMEMORY;
1132
1133 /* Call the UNICODE function */
1134 hr = GetPath(pszFileW, cchMaxPath, &wfd, fFlags);
1135
1136 /* Convert the file path back to ANSI */
1137 WideCharToMultiByte(CP_ACP, 0, pszFileW, -1,
1138 pszFile, cchMaxPath, NULL, NULL);
1139
1140 /* Free the temporary buffer */
1141 HeapFree(GetProcessHeap(), 0, pszFileW);
1142
1143 if (pfd)
1144 {
1145 ZeroMemory(pfd, sizeof(*pfd));
1146
1147 /* Copy the file data if a file path was returned */
1148 if (*pszFile)
1149 {
1150 DWORD len;
1151
1152 /* Copy the fixed part */
1153 CopyMemory(pfd, &wfd, FIELD_OFFSET(WIN32_FIND_DATAA, cFileName));
1154
1155 /* Convert the file names to ANSI */
1156 len = lstrlenW(wfd.cFileName);
1157 WideCharToMultiByte(CP_ACP, 0, wfd.cFileName, len + 1,
1158 pfd->cFileName, sizeof(pfd->cFileName), NULL, NULL);
1159 len = lstrlenW(wfd.cAlternateFileName);
1160 WideCharToMultiByte(CP_ACP, 0, wfd.cAlternateFileName, len + 1,
1161 pfd->cAlternateFileName, sizeof(pfd->cAlternateFileName), NULL, NULL);
1162 }
1163 }
1164
1165 return hr;
1166}
#define lstrlenW
Definition: compat.h:750
unsigned long DWORD
Definition: ntddk_ex.h:95
GLenum GLsizei len
Definition: glext.h:6722
static PIXELFORMATDESCRIPTOR pfd
Definition: ssstars.c:67
#define max(a, b)
Definition: svc.c:63
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255

Referenced by GetPath(), OnInitDialog(), and Save().

◆ GetPath() [2/2]

HRESULT STDMETHODCALLTYPE CShellLink::GetPath ( LPWSTR  pszFile,
INT  cchMaxPath,
WIN32_FIND_DATAW pfd,
DWORD  fFlags 
)
override

Definition at line 1533 of file CShellLink.cpp.

1534{
1536
1537 TRACE("(%p)->(pfile=%p len=%u find_data=%p flags=%u)(%s)\n",
1538 this, pszFile, cchMaxPath, pfd, fFlags, debugstr_w(m_sPath));
1539
1540 if (cchMaxPath)
1541 *pszFile = 0;
1542 // FIXME: What if cchMaxPath == 0 , or pszFile == NULL ??
1543
1544 // FIXME: What about Darwin??
1545
1546 /*
1547 * Retrieve the path to the target from the PIDL (if we have one).
1548 * NOTE: Do NOT use the cached path (m_sPath from link info).
1549 */
1551 {
1552 if (fFlags & SLGP_SHORTPATH)
1554 // FIXME: Add support for SLGP_UNCPRIORITY
1555 }
1556 else
1557 {
1558 *buffer = 0;
1559 }
1560
1561 /* If we have a FindData structure, initialize it */
1562 if (pfd)
1563 {
1564 ZeroMemory(pfd, sizeof(*pfd));
1565
1566 /* Copy the file data if the target is a file path */
1567 if (*buffer)
1568 {
1569 pfd->dwFileAttributes = m_Header.dwFileAttributes;
1570 pfd->ftCreationTime = m_Header.ftCreationTime;
1571 pfd->ftLastAccessTime = m_Header.ftLastAccessTime;
1572 pfd->ftLastWriteTime = m_Header.ftLastWriteTime;
1573 pfd->nFileSizeHigh = 0;
1574 pfd->nFileSizeLow = m_Header.nFileSizeLow;
1575
1576 /*
1577 * Build temporarily a short path in pfd->cFileName (of size MAX_PATH),
1578 * then extract and store the short file name in pfd->cAlternateFileName.
1579 */
1580 GetShortPathNameW(buffer, pfd->cFileName, _countof(pfd->cFileName));
1581 lstrcpynW(pfd->cAlternateFileName,
1582 PathFindFileNameW(pfd->cFileName),
1583 _countof(pfd->cAlternateFileName));
1584
1585 /* Now extract and store the long file name in pfd->cFileName */
1586 lstrcpynW(pfd->cFileName,
1588 _countof(pfd->cFileName));
1589 }
1590 }
1591
1592 /* Finally check if we have a raw path the user actually wants to retrieve */
1593 if ((fFlags & SLGP_RAWPATH) && (m_Header.dwFlags & SLDF_HAS_EXP_SZ))
1594 {
1595 /* Search for a target environment block */
1596 LPEXP_SZ_LINK pInfo;
1598 if (pInfo && (pInfo->cbSize == sizeof(*pInfo)))
1599 lstrcpynW(buffer, pInfo->szwTarget, cchMaxPath);
1600 }
1601
1602 /* For diagnostics purposes only... */
1603 // NOTE: SLGP_UNCPRIORITY is unsupported
1604 fFlags &= ~(SLGP_RAWPATH | SLGP_SHORTPATH);
1605 if (fFlags) FIXME("(%p): Unsupported flags %lu\n", this, fFlags);
1606
1607 /* Copy the data back to the user */
1608 if (*buffer)
1609 lstrcpynW(pszFile, buffer, cchMaxPath);
1610
1611 return (*buffer ? S_OK : S_FALSE);
1612}
DWORD WINAPI GetShortPathNameW(IN LPCWSTR lpszLongPath, OUT LPWSTR lpszShortPath, IN DWORD cchBuffer)
Definition: path.c:1833
LPWSTR WINAPI PathFindFileNameW(LPCWSTR lpszPath)
Definition: path.c:394
GLuint buffer
Definition: glext.h:5915
BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath)
Definition: pidl.c:1454
#define EXP_SZ_LINK_SIG
Definition: shlobj.h:2059

◆ GetShowCmd()

HRESULT STDMETHODCALLTYPE CShellLink::GetShowCmd ( INT piShowCmd)
override

Definition at line 1301 of file CShellLink.cpp.

1302{
1303 TRACE("(%p)->(%p) %d\n", this, piShowCmd, m_Header.nShowCommand);
1304 *piShowCmd = m_Header.nShowCommand;
1305 return S_OK;
1306}

◆ GetSite()

HRESULT STDMETHODCALLTYPE CShellLink::GetSite ( REFIID  iid,
void **  ppvSite 
)
override

Definition at line 3134 of file CShellLink.cpp.

3135{
3136 TRACE("%p %s %p\n", this, debugstr_guid(&iid), ppvSite);
3137
3138 if (m_site == NULL)
3139 return E_FAIL;
3140
3141 return m_site->QueryInterface(iid, ppvSite);
3142}
#define debugstr_guid
Definition: kernel32.h:35

◆ GetSizeMax()

HRESULT STDMETHODCALLTYPE CShellLink::GetSizeMax ( ULARGE_INTEGER pcbSize)
override

Implements IPersistStream.

Definition at line 1051 of file CShellLink.cpp.

1052{
1053 TRACE("(%p)\n", this);
1054 return E_NOTIMPL;
1055}

◆ GetWorkingDirectory() [1/2]

HRESULT STDMETHODCALLTYPE CShellLink::GetWorkingDirectory ( LPSTR  pszDir,
INT  cchMaxPath 
)
override

Definition at line 1220 of file CShellLink.cpp.

1221{
1222 TRACE("(%p)->(%p len=%u)\n", this, pszDir, cchMaxPath);
1223
1224 if (cchMaxPath)
1225 *pszDir = 0;
1226
1227 if (m_sWorkDir)
1229 pszDir, cchMaxPath, NULL, NULL);
1230
1231 return S_OK;
1232}
_In_ LPCSTR pszDir
Definition: shellapi.h:585

◆ GetWorkingDirectory() [2/2]

HRESULT STDMETHODCALLTYPE CShellLink::GetWorkingDirectory ( LPWSTR  pszDir,
INT  cchMaxPath 
)
override

Definition at line 1643 of file CShellLink.cpp.

1644{
1645 TRACE("(%p)->(%p len %u)\n", this, pszDir, cchMaxPath);
1646
1647 if (cchMaxPath)
1648 *pszDir = 0;
1649
1650 if (m_sWorkDir)
1651 lstrcpynW(pszDir, m_sWorkDir, cchMaxPath);
1652
1653 return S_OK;
1654}

◆ Initialize()

HRESULT STDMETHODCALLTYPE CShellLink::Initialize ( PCIDLIST_ABSOLUTE  pidlFolder,
IDataObject pdtobj,
HKEY  hkeyProgID 
)
override

Implements IShellExtInit.

Definition at line 2505 of file CShellLink.cpp.

2506{
2507 TRACE("%p %p %p %p\n", this, pidlFolder, pdtobj, hkeyProgID);
2508
2509 if (!pdtobj)
2510 return E_FAIL;
2511
2512 FORMATETC format;
2513 format.cfFormat = CF_HDROP;
2514 format.ptd = NULL;
2515 format.dwAspect = DVASPECT_CONTENT;
2516 format.lindex = -1;
2517 format.tymed = TYMED_HGLOBAL;
2518
2519 STGMEDIUM stgm;
2520 HRESULT hr = pdtobj->GetData(&format, &stgm);
2521 if (FAILED(hr))
2522 return hr;
2523
2524 UINT count = DragQueryFileW((HDROP)stgm.hGlobal, -1, NULL, 0);
2525 if (count == 1)
2526 {
2527 count = DragQueryFileW((HDROP)stgm.hGlobal, 0, NULL, 0);
2528 count++;
2529 LPWSTR path = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, count * sizeof(WCHAR));
2530 if (path)
2531 {
2532 count = DragQueryFileW((HDROP)stgm.hGlobal, 0, path, count);
2533 hr = Load(path, 0);
2535 }
2536 }
2537 ReleaseStgMedium(&stgm);
2538
2539 return S_OK;
2540}
#define CF_HDROP
Definition: constants.h:410
void WINAPI ReleaseStgMedium(STGMEDIUM *pmedium)
Definition: ole2.c:2033
UINT WINAPI DragQueryFileW(HDROP hDrop, UINT lFile, LPWSTR lpszwFile, UINT lLength)
Definition: shellole.c:622
GLuint GLuint GLsizei count
Definition: gl.h:1545
HRESULT GetData([in, unique] FORMATETC *pformatetcIn, [out] STGMEDIUM *pmedium)
Definition: format.c:58

◆ InvokeCommand()

HRESULT STDMETHODCALLTYPE CShellLink::InvokeCommand ( LPCMINVOKECOMMANDINFO  lpici)
override

Implements IContextMenu.

Definition at line 2599 of file CShellLink.cpp.

2600{
2601 TRACE("%p %p\n", this, lpici);
2602
2603 if (lpici->cbSize < sizeof(CMINVOKECOMMANDINFO))
2604 return E_INVALIDARG;
2605
2606 // NOTE: We could use lpici->hwnd (certainly in case lpici->fMask doesn't contain CMIC_MASK_FLAG_NO_UI)
2607 // as the parent window handle... ?
2608 /* FIXME: get using interface set from IObjectWithSite?? */
2609 // NOTE: We might need an extended version of Resolve that provides us with paths...
2610 HRESULT hr = Resolve(lpici->hwnd, (lpici->fMask & CMIC_MASK_FLAG_NO_UI) ? SLR_NO_UI : 0);
2611 if (FAILED(hr))
2612 {
2613 TRACE("failed to resolve component error 0x%08x\n", hr);
2614 return hr;
2615 }
2616
2617 UINT idCmd = LOWORD(lpici->lpVerb);
2618 TRACE("idCmd: %d\n", idCmd);
2619
2620 switch (idCmd)
2621 {
2622 case IDCMD_OPEN:
2623 return DoOpen(lpici);
2625 return DoOpenFileLocation();
2626 default:
2627 return E_NOTIMPL;
2628 }
2629}
struct IContextMenu::tagCMINVOKECOMMANDINFO CMINVOKECOMMANDINFO
int DoOpen(void)
Definition: cmds.c:2168

◆ IsDirty()

HRESULT STDMETHODCALLTYPE CShellLink::IsDirty ( void  )
override

Implements IPersistStream.

Definition at line 334 of file CShellLink.cpp.

335{
336 TRACE("(%p)\n", this);
337 return (m_bDirty ? S_OK : S_FALSE);
338}

◆ Load() [1/2]

HRESULT STDMETHODCALLTYPE CShellLink::Load ( IStream stm)
override

Implements IPersistStream.

Definition at line 647 of file CShellLink.cpp.

648{
649 TRACE("%p %p\n", this, stm);
650
651 if (!stm)
653
654 /* Free all the old stuff */
655 Reset();
656
657 ULONG dwBytesRead = 0;
658 HRESULT hr = stm->Read(&m_Header, sizeof(m_Header), &dwBytesRead);
659 if (FAILED(hr))
660 return hr;
661
662 if (dwBytesRead != sizeof(m_Header))
663 return E_FAIL;
664 if (m_Header.dwSize != sizeof(m_Header))
665 return E_FAIL;
666 if (!IsEqualIID(m_Header.clsid, CLSID_ShellLink))
667 return E_FAIL;
668
669 /* Load the new data in order */
670
671 if (TRACE_ON(shell))
672 {
673 SYSTEMTIME stCreationTime;
674 SYSTEMTIME stLastAccessTime;
675 SYSTEMTIME stLastWriteTime;
676 WCHAR sTemp[MAX_PATH];
677
681
683 NULL, sTemp, _countof(sTemp));
684 TRACE("-- stCreationTime: %s\n", debugstr_w(sTemp));
686 NULL, sTemp, _countof(sTemp));
687 TRACE("-- stLastAccessTime: %s\n", debugstr_w(sTemp));
689 NULL, sTemp, _countof(sTemp));
690 TRACE("-- stLastWriteTime: %s\n", debugstr_w(sTemp));
691 }
692
693 /* load all the new stuff */
695 {
696 hr = ILLoadFromStream(stm, &m_pPidl);
697 if (FAILED(hr))
698 return hr;
699 }
700 pdump(m_pPidl);
701
702 /* Load the location information... */
704 {
706 if (FAILED(hr))
707 return hr;
708 }
709 /* ... but if it is required not to use it, clear it */
711 {
713 m_sPath = NULL;
714 ZeroMemory(&volume, sizeof(volume));
715 }
716
717 BOOL unicode = !!(m_Header.dwFlags & SLDF_UNICODE);
718
720 {
721 hr = Stream_LoadString(stm, unicode, &m_sDescription);
722 if (FAILED(hr))
723 return hr;
724 TRACE("Description -> %s\n", debugstr_w(m_sDescription));
725 }
726
728 {
729 hr = Stream_LoadString(stm, unicode, &m_sPathRel);
730 if (FAILED(hr))
731 return hr;
732 TRACE("Relative Path-> %s\n", debugstr_w(m_sPathRel));
733 }
734
736 {
737 hr = Stream_LoadString(stm, unicode, &m_sWorkDir);
738 if (FAILED(hr))
739 return hr;
741 TRACE("Working Dir -> %s\n", debugstr_w(m_sWorkDir));
742 }
743
745 {
746 hr = Stream_LoadString(stm, unicode, &m_sArgs);
747 if (FAILED(hr))
748 return hr;
749 TRACE("Arguments -> %s\n", debugstr_w(m_sArgs));
750 }
751
753 {
754 hr = Stream_LoadString(stm, unicode, &m_sIcoPath);
755 if (FAILED(hr))
756 return hr;
757 TRACE("Icon file -> %s\n", debugstr_w(m_sIcoPath));
758 }
759
760 /* Now load the optional data block list */
762 if (FAILED(hr)) // FIXME: Should we fail?
763 return hr;
764
766 if (pSpecial && pSpecial->cbSize == sizeof(*pSpecial) && ILGetSize(m_pPidl) > pSpecial->cbOffset)
767 {
769 {
770 LPITEMIDLIST pidl = ILCombine(folder, (LPITEMIDLIST)((char*)m_pPidl + pSpecial->cbOffset));
771 if (pidl)
772 {
774 m_pPidl = pidl;
775 TRACE("Replaced pidl base with CSIDL %u up to %ub.\n", pSpecial->idSpecialFolder, pSpecial->cbOffset);
776 }
777 ILFree(folder);
778 }
779 }
780
781 if (TRACE_ON(shell))
782 {
783#if (NTDDI_VERSION < NTDDI_LONGHORN)
785 {
786 hr = GetAdvertiseInfo(&sProduct, EXP_LOGO3_ID_SIG);
787 if (SUCCEEDED(hr))
788 TRACE("Product -> %s\n", debugstr_w(sProduct));
789 }
790#endif
792 {
794 if (SUCCEEDED(hr))
795 TRACE("Component -> %s\n", debugstr_w(sComponent));
796 }
797 }
798
800 m_bRunAs = TRUE;
801 else
802 m_bRunAs = FALSE;
803
804 TRACE("OK\n");
805
806 pdump(m_pPidl);
807
808 return S_OK;
809}
void shell(int argc, const char *argv[])
Definition: cmds.c:1231
void pdump(LPCITEMIDLIST pidl)
Definition: debughlp.cpp:322
#define TRACE_ON(x)
Definition: compat.h:75
BOOL WINAPI FileTimeToSystemTime(IN CONST FILETIME *lpFileTime, OUT LPSYSTEMTIME lpSystemTime)
Definition: time.c:188
HRESULT WINAPI SHReadDataBlockList(IStream *lpStream, LPDBLIST *lppList)
Definition: clist.c:235
HRESULT Read([out, size_is(cb), length_is(*pcbRead)] void *pv, [in] ULONG cb, [out] ULONG *pcbRead)
INT WINAPI GetDateFormatW(LCID lcid, DWORD dwFlags, const SYSTEMTIME *lpTime, LPCWSTR lpFormat, LPWSTR lpDateStr, INT cchOut)
Definition: lcformat.c:989
#define LOCALE_USER_DEFAULT
LPITEMIDLIST WINAPI SHCloneSpecialIDList(HWND hwndOwner, int nFolder, BOOL fCreate)
Definition: pidl.c:445
LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: pidl.c:816
HRESULT WINAPI ILLoadFromStream(IStream *pStream, LPITEMIDLIST *ppPidl)
Definition: pidl.c:293
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
#define ILGetSize
Definition: shellclasses.h:638
#define EXP_DARWIN_ID_SIG
Definition: shlobj.h:2063
@ SLDF_HAS_RELPATH
Definition: shlobj.h:1955
@ SLDF_HAS_ID_LIST
Definition: shlobj.h:1952
@ SLDF_HAS_DARWINID
Definition: shlobj.h:1966
@ SLDF_HAS_LINK_INFO
Definition: shlobj.h:1953
@ SLDF_HAS_WORKINGDIR
Definition: shlobj.h:1956
@ SLDF_HAS_ARGS
Definition: shlobj.h:1957
@ SLDF_FORCE_NO_LINKINFO
Definition: shlobj.h:1960
@ SLDF_RUNAS_USER
Definition: shlobj.h:1967
@ SLDF_UNICODE
Definition: shlobj.h:1959
@ SLDF_HAS_NAME
Definition: shlobj.h:1954
#define EXP_SPECIAL_FOLDER_SIG
Definition: shlobj.h:2062
struct EXP_SPECIAL_FOLDER * LPEXP_SPECIAL_FOLDER
#define PathRemoveBackslash
Definition: shlwapi.h:1058
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41
DWORD idSpecialFolder
Definition: shlobj.h:2049
Definition: fci.c:116
uint32_t ULONG
Definition: typedefs.h:59
#define STG_E_INVALIDPOINTER
Definition: winerror.h:2571
#define DATE_SHORTDATE
Definition: winnls.h:198

◆ Load() [2/2]

HRESULT STDMETHODCALLTYPE CShellLink::Load ( LPCOLESTR  pszFileName,
DWORD  dwMode 
)
override

Implements IPersistFile.

Definition at line 340 of file CShellLink.cpp.

341{
342 TRACE("(%p, %s, %x)\n", this, debugstr_w(pszFileName), dwMode);
343
344 if (dwMode == 0)
346
349 if (SUCCEEDED(hr))
350 {
353 hr = Load(stm);
355 m_bDirty = FALSE;
356 }
357 TRACE("-- returning hr %08x\n", hr);
358 return hr;
359}
HRESULT WINAPI SHCreateStreamOnFileW(LPCWSTR lpszPath, DWORD dwMode, IStream **lppStream)
Definition: istream.c:484
#define STGM_SHARE_DENY_WRITE
Definition: objbase.h:922
#define STGM_READ
Definition: objbase.h:917
WORD WORD PSZ PSZ pszFileName
Definition: vdmdbg.h:44

Referenced by Initialize(), and Load().

◆ OnCommand()

void CShellLink::OnCommand ( HWND  hwndDlg,
int  id,
HWND  hwndCtl,
UINT  codeNotify 
)

Definition at line 2927 of file CShellLink.cpp.

2928{
2929 switch (id)
2930 {
2931 case IDC_SHORTCUT_FIND:
2933 return;
2934
2936 {
2937 WCHAR wszPath[MAX_PATH] = L"";
2938
2939 if (m_sIcoPath)
2940 wcscpy(wszPath, m_sIcoPath);
2941 else
2942 FindExecutableW(m_sPath, NULL, wszPath);
2943
2945 if (PickIconDlg(hwndDlg, wszPath, _countof(wszPath), &IconIndex))
2946 {
2947 SetIconLocation(wszPath, IconIndex);
2948 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
2949
2950 HICON hIconLarge = CreateShortcutIcon(wszPath, IconIndex);
2951 if (hIconLarge)
2952 {
2953 if (m_hIcon)
2955 m_hIcon = hIconLarge;
2957 }
2958 }
2959 return;
2960 }
2961
2963 {
2965 if (result == 1 || result == 0)
2966 {
2967 if (m_bRunAs != result)
2968 {
2969 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
2970 }
2971
2972 m_bRunAs = result;
2973 }
2974 return;
2975 }
2976 }
2977 if (codeNotify == EN_CHANGE || codeNotify == CBN_SELCHANGE)
2978 {
2979 if (!m_bInInit)
2980 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
2981 }
2982}
BOOL WINAPI PickIconDlg(HWND hWndOwner, LPWSTR lpstrFile, UINT nMaxFile, INT *lpdwIconIndex)
Definition: dialogs.cpp:351
GLuint64EXT * result
Definition: glext.h:11304
#define PropSheet_Changed(d, w)
Definition: prsht.h:344
HINSTANCE WINAPI FindExecutableW(LPCWSTR lpFile, LPCWSTR lpDirectory, LPWSTR lpResult)
Definition: shlexec.cpp:1288
EXTERN_C HRESULT WINAPI SHOpenFolderAndSelectItems(PCIDLIST_ABSOLUTE pidlFolder, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD dwFlags)
Definition: shlfolder.cpp:455
#define IDC_SHORTCUT_FIND
Definition: shresdef.h:502
#define IDC_SHORTCUT_ADVANCED
Definition: shresdef.h:504
#define IDC_SHORTCUT_ICON
Definition: shresdef.h:486
#define IDC_SHORTCUT_CHANGE_ICON
Definition: shresdef.h:503
#define IDD_SHORTCUT_EXTENDED_PROPERTIES
Definition: shresdef.h:433
UINT_PTR WPARAM
Definition: windef.h:207
#define STM_SETICON
Definition: winuser.h:2103
#define CBN_SELCHANGE
Definition: winuser.h:1990
LRESULT WINAPI SendDlgItemMessageW(_In_ HWND, _In_ int, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
HWND WINAPI GetParent(_In_ HWND)
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
INT_PTR WINAPI DialogBoxParamW(_In_opt_ HINSTANCE, _In_ LPCWSTR, _In_opt_ HWND, _In_opt_ DLGPROC, _In_ LPARAM)
#define EN_CHANGE
Definition: winuser.h:2033

◆ OnDestroy()

void CShellLink::OnDestroy ( HWND  hwndDlg)

Definition at line 3052 of file CShellLink.cpp.

3053{
3054 if (m_hIcon)
3055 {
3057 m_hIcon = NULL;
3058 }
3059}

◆ OnInitDialog()

BOOL CShellLink::OnInitDialog ( HWND  hwndDlg,
HWND  hwndFocus,
LPARAM  lParam 
)

Definition at line 2767 of file CShellLink.cpp.

2768{
2769 TRACE("CShellLink::OnInitDialog(hwnd %p hwndFocus %p lParam %p)\n", hwndDlg, hwndFocus, lParam);
2770
2772
2773 TRACE("m_sArgs: %S sComponent: %S m_sDescription: %S m_sIcoPath: %S m_sPath: %S m_sPathRel: %S sProduct: %S m_sWorkDir: %S\n", m_sArgs, sComponent, m_sDescription,
2775
2776 m_bInInit = TRUE;
2778
2779 /* Get file information */
2780 // FIXME! FIXME! Shouldn't we use m_sIcoPath, m_Header.nIconIndex instead???
2781 SHFILEINFOW fi;
2782 if (!SHGetFileInfoW(m_sLinkPath, 0, &fi, sizeof(fi), SHGFI_TYPENAME | SHGFI_ICON))
2783 {
2784 ERR("SHGetFileInfoW failed for %ls (%lu)\n", m_sLinkPath, GetLastError());
2785 fi.szTypeName[0] = L'\0';
2786 fi.hIcon = NULL;
2787 }
2788
2789 if (fi.hIcon)
2790 {
2791 if (m_hIcon)
2793 m_hIcon = fi.hIcon;
2795 }
2796 else
2797 ERR("ExtractIconW failed %ls %u\n", m_sIcoPath, m_Header.nIconIndex);
2798
2799 if (!SHGetFileInfoW(m_sLinkPath, 0, &fi, sizeof(fi), SHGFI_DISPLAYNAME))
2802
2803 /* Target type */
2804 if (m_sPath)
2805 {
2809 }
2810
2811 /* Target location */
2812 if (m_sPath)
2813 {
2818 }
2819
2820 /* Target path */
2821 if (m_sPath)
2822 {
2823 WCHAR newpath[MAX_PATH * 2];
2824 newpath[0] = UNICODE_NULL;
2825 if (wcschr(m_sPath, ' '))
2826 StringCchPrintfExW(newpath, _countof(newpath), NULL, NULL, 0, L"\"%ls\"", m_sPath);
2827 else
2828 StringCchCopyExW(newpath, _countof(newpath), m_sPath, NULL, NULL, 0);
2829
2830 if (m_sArgs && m_sArgs[0])
2831 {
2832 StringCchCatW(newpath, _countof(newpath), L" ");
2833 StringCchCatW(newpath, _countof(newpath), m_sArgs);
2834 }
2835 SetDlgItemTextW(hwndDlg, IDC_SHORTCUT_TARGET_TEXT, newpath);
2836 }
2837
2838 /* Working dir */
2839 if (m_sWorkDir)
2841
2842 /* Description */
2843 if (m_sDescription)
2845
2846 /* Hot key */
2848
2849 /* Run */
2851 const DWORD runshowcmd[] = { SW_SHOWNORMAL, SW_SHOWMINNOACTIVE, SW_SHOWMAXIMIZED };
2852 HWND hRunCombo = GetDlgItem(hwndDlg, IDC_SHORTCUT_RUN_COMBO);
2853 for (UINT i = 0; i < _countof(runstrings); ++i)
2854 {
2856 if (!LoadStringW(shell32_hInstance, runstrings[i], buf, _countof(buf)))
2857 break;
2858
2859 int index = SendMessageW(hRunCombo, CB_ADDSTRING, 0, (LPARAM)buf);
2860 if (index < 0)
2861 continue;
2862 SendMessageW(hRunCombo, CB_SETITEMDATA, index, runshowcmd[i]);
2863 if (!i || m_Header.nShowCommand == runshowcmd[i])
2864 SendMessageW(hRunCombo, CB_SETCURSEL, index, 0);
2865 }
2866
2867 BOOL disablecontrols = FALSE;
2868 if (darwin)
2869 {
2870 disablecontrols = TRUE;
2873 }
2874 else
2875 {
2876 WCHAR path[MAX_PATH * 2];
2877 path[0] = UNICODE_NULL;
2879 if (FAILED(hr))
2880 hr = GetPath(path, _countof(path), NULL, 0);
2881#if DBG
2882 if (GetKeyState(VK_CONTROL) < 0) // Allow inspection of PIDL parsing path
2883 {
2884 hr = S_OK;
2885 path[0] = UNICODE_NULL;
2886 }
2887#endif
2888 if (hr != S_OK)
2889 {
2890 disablecontrols = TRUE;
2891 LPITEMIDLIST pidl;
2892 if (GetIDList(&pidl) == S_OK)
2893 {
2894 path[0] = UNICODE_NULL;
2895 SHGetNameAndFlagsW(pidl, SHGDN_FORADDRESSBAR | SHGDN_FORPARSING, path, _countof(path), NULL);
2898 ILRemoveLastID(pidl);
2899 path[0] = UNICODE_NULL;
2901 SHGetNameAndFlagsW(pidl, SHGDN_NORMAL, path, _countof(path), NULL);
2903 ILFree(pidl);
2904 }
2907 }
2908 else
2909 {
2910 ASSERT(FAILED(hr) || !(path[0] == ':' && path[1] == ':' && path[2] == '{'));
2911 }
2912 }
2913
2914 HWND hWndTarget = GetDlgItem(hwndDlg, IDC_SHORTCUT_TARGET_TEXT);
2915 EnableWindow(hWndTarget, !disablecontrols);
2916 PostMessage(hWndTarget, EM_SETSEL, 0, -1); // Fix caret bug when first opening the tab [CORE-20016]
2917
2918 /* auto-completion */
2919 SHAutoComplete(hWndTarget, SHACF_DEFAULT);
2921
2922 m_bInInit = FALSE;
2923
2924 return TRUE;
2925}
#define wcschr
Definition: compat.h:17
HRESULT SHGetNameAndFlagsW(_In_ LPCITEMIDLIST pidl, _In_ DWORD dwFlags, _Out_opt_ LPWSTR pszText, _In_ UINT cchBuf, _Inout_opt_ DWORD *pdwAttributes)
Definition: utils.cpp:480
BOOL WINAPI PathRemoveFileSpecW(LPWSTR lpszPath)
Definition: path.c:629
unsigned short WORD
Definition: ntddk_ex.h:93
GLuint index
Definition: glext.h:6031
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLenum target
Definition: glext.h:7315
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define ASSERT(a)
Definition: mode.c:44
BOOL WINAPI ILRemoveLastID(LPITEMIDLIST pidl)
Definition: pidl.c:221
#define HKM_SETHOTKEY
Definition: commctrl.h:2236
DWORD_PTR WINAPI SHGetFileInfoW(LPCWSTR path, DWORD dwFileAttributes, SHFILEINFOW *psfi, UINT sizeofpsfi, UINT flags)
Definition: shell32_main.c:430
#define SHGFI_DISPLAYNAME
Definition: shellapi.h:167
#define SHGFI_ICON
Definition: shellapi.h:165
#define SHGFI_TYPENAME
Definition: shellapi.h:168
HRESULT WINAPI SHAutoComplete(HWND hwndEdit, DWORD dwFlags)
Definition: autocomp.cpp:191
#define SHACF_DEFAULT
Definition: shlwapi.h:1956
#define IDS_SHORTCUT_RUN_MAX
Definition: shresdef.h:263
#define IDC_SHORTCUT_RUN_COMBO
Definition: shresdef.h:499
#define IDS_SHORTCUT_RUN_MIN
Definition: shresdef.h:262
#define IDC_SHORTCUT_LOCATION_EDIT
Definition: shresdef.h:491
#define IDC_SHORTCUT_TEXT
Definition: shresdef.h:487
#define IDC_SHORTCUT_TARGET_TEXT
Definition: shresdef.h:493
#define IDC_SHORTCUT_KEY_HOTKEY
Definition: shresdef.h:497
#define IDS_SHORTCUT_RUN_NORMAL
Definition: shresdef.h:261
#define IDC_SHORTCUT_TYPE_EDIT
Definition: shresdef.h:489
#define IDC_SHORTCUT_COMMENT_EDIT
Definition: shresdef.h:501
#define IDC_SHORTCUT_START_IN_EDIT
Definition: shresdef.h:495
STRSAFEAPI StringCchCopyExW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc, STRSAFE_LPWSTR *ppszDestEnd, size_t *pcchRemaining, STRSAFE_DWORD dwFlags)
Definition: strsafe.h:184
STRSAFEAPI StringCchCatW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:325
STRSAFEAPI StringCchPrintfExW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPWSTR *ppszDestEnd, size_t *pcchRemaining, STRSAFE_DWORD dwFlags, STRSAFE_LPCWSTR pszFormat,...)
Definition: strsafe.h:585
STRSAFEAPI StringCchCopyW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:149
WCHAR szTypeName[80]
Definition: shellapi.h:377
WCHAR szDisplayName[MAX_PATH]
Definition: shellapi.h:376
HICON hIcon
Definition: shellapi.h:373
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define SW_SHOWMAXIMIZED
Definition: winuser.h:784
#define CB_SETITEMDATA
Definition: winuser.h:1977
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
#define CB_SETCURSEL
Definition: winuser.h:1972
#define VK_CONTROL
Definition: winuser.h:2214
BOOL WINAPI SetDlgItemTextW(_In_ HWND, _In_ int, _In_ LPCWSTR)
HWND WINAPI GetDlgItem(_In_opt_ HWND, _In_ int)
#define CB_ADDSTRING
Definition: winuser.h:1947
BOOL WINAPI EnableWindow(_In_ HWND, _In_ BOOL)
#define EM_SETSEL
Definition: winuser.h:2029
#define PostMessage
Definition: winuser.h:5852
#define SW_SHOWMINNOACTIVE
Definition: winuser.h:788
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
SHORT WINAPI GetKeyState(_In_ int)

◆ OnNotify()

LRESULT CShellLink::OnNotify ( HWND  hwndDlg,
int  idFrom,
LPNMHDR  pnmhdr 
)

Definition at line 2984 of file CShellLink.cpp.

2985{
2986 WCHAR wszBuf[MAX_PATH];
2987 LPPSHNOTIFY lppsn = (LPPSHNOTIFY)pnmhdr;
2988
2989 if (lppsn->hdr.code == PSN_APPLY)
2990 {
2991 /* set working directory */
2992 GetDlgItemTextW(hwndDlg, IDC_SHORTCUT_START_IN_EDIT, wszBuf, _countof(wszBuf));
2993 SetWorkingDirectory(wszBuf);
2994
2995 /* set link destination */
2996 GetDlgItemTextW(hwndDlg, IDC_SHORTCUT_TARGET_TEXT, wszBuf, _countof(wszBuf));
2997 LPWSTR lpszArgs = NULL;
2998 LPWSTR unquoted = strdupW(wszBuf);
2999 StrTrimW(unquoted, L" ");
3000
3001 if (!PathFileExistsW(unquoted))
3002 {
3003 lpszArgs = PathGetArgsW(unquoted);
3004 PathRemoveArgsW(unquoted);
3005 StrTrimW(lpszArgs, L" ");
3006 }
3007 if (unquoted[0] == '"' && unquoted[wcslen(unquoted) - 1] == '"')
3008 PathUnquoteSpacesW(unquoted);
3009
3010 WCHAR *pwszExt = PathFindExtensionW(unquoted);
3011 if (!_wcsicmp(pwszExt, L".lnk"))
3012 {
3013 // FIXME load localized error msg
3014 MessageBoxW(hwndDlg, L"You cannot create a link to a shortcut", L"Error", MB_ICONERROR);
3016 return TRUE;
3017 }
3018
3019 if (!PathFileExistsW(unquoted))
3020 {
3021 // FIXME load localized error msg
3022 MessageBoxW(hwndDlg, L"The specified file name in the target box is invalid", L"Error", MB_ICONERROR);
3024 return TRUE;
3025 }
3026
3027 SetPath(unquoted);
3028 if (lpszArgs)
3029 SetArguments(lpszArgs);
3030 else
3031 SetArguments(L"\0");
3032
3033 HeapFree(GetProcessHeap(), 0, unquoted);
3034
3036
3038 if (index != CB_ERR)
3039 {
3041 }
3042
3043 TRACE("This %p m_sLinkPath %S\n", this, m_sLinkPath);
3047 return TRUE;
3048 }
3049 return FALSE;
3050}
EXTERN_C void WINAPI SHChangeNotify(LONG wEventId, UINT uFlags, LPCVOID dwItem1, LPCVOID dwItem2)
void WINAPI PathRemoveArgsW(LPWSTR lpszPath)
Definition: path.c:779
LPWSTR WINAPI PathFindExtensionW(LPCWSTR lpszPath)
Definition: path.c:447
BOOL WINAPI PathFileExistsW(LPCWSTR lpszPath)
Definition: path.c:1783
VOID WINAPI PathUnquoteSpacesW(LPWSTR lpszPath)
Definition: path.c:1040
LPWSTR WINAPI PathGetArgsW(LPCWSTR lpszPath)
Definition: path.c:506
BOOL WINAPI StrTrimW(LPWSTR lpszStr, LPCWSTR lpszTrim)
Definition: string.c:1883
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
Definition: typeof.h:31
#define PSNRET_INVALID_NOCHANGEPAGE
Definition: prsht.h:131
#define PSN_APPLY
Definition: prsht.h:117
#define PSNRET_NOERROR
Definition: prsht.h:129
struct _PSHNOTIFY * LPPSHNOTIFY
#define HKM_GETHOTKEY
Definition: commctrl.h:2237
_Check_return_ _CRTIMP int __cdecl _wcsicmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
#define SHCNE_UPDATEITEM
Definition: shlobj.h:1911
#define SHCNF_PATHW
Definition: shlobj.h:1933
NMHDR hdr
Definition: prsht.h:330
UINT code
Definition: winuser.h:3170
#define SetWindowLongPtr
Definition: treelist.c:70
UINT WINAPI GetDlgItemTextW(HWND hDlg, int nIDDlgItem, LPWSTR lpString, int nMaxCount)
Definition: dialog.c:2263
#define CB_ERR
Definition: winuser.h:2446
int WINAPI MessageBoxW(_In_opt_ HWND hWnd, _In_opt_ LPCWSTR lpText, _In_opt_ LPCWSTR lpCaption, _In_ UINT uType)
#define MB_ICONERROR
Definition: winuser.h:798
#define CB_GETITEMDATA
Definition: winuser.h:1961
#define DWLP_MSGRESULT
Definition: winuser.h:881
#define CB_GETCURSEL
Definition: winuser.h:1954

◆ QueryContextMenu()

HRESULT STDMETHODCALLTYPE CShellLink::QueryContextMenu ( HMENU  hmenu,
UINT  indexMenu,
UINT  idCmdFirst,
UINT  idCmdLast,
UINT  uFlags 
)
override

Implements IContextMenu.

Definition at line 2542 of file CShellLink.cpp.

2543{
2544 INT id = 0;
2545
2546 m_idCmdFirst = idCmdFirst;
2547
2548 TRACE("%p %p %u %u %u %u\n", this,
2549 hMenu, indexMenu, idCmdFirst, idCmdLast, uFlags);
2550
2551 if (!hMenu)
2552 return E_INVALIDARG;
2553
2556
2557 MENUITEMINFOW mii;
2558 ZeroMemory(&mii, sizeof(mii));
2559 mii.cbSize = sizeof(mii);
2561 mii.dwTypeData = strOpen.GetBuffer();
2562 mii.cch = wcslen(mii.dwTypeData);
2563 mii.wID = idCmdFirst + id++;
2565 mii.fType = MFT_STRING;
2566 if (!InsertMenuItemW(hMenu, indexMenu++, TRUE, &mii))
2567 return E_FAIL;
2568
2570 mii.dwTypeData = strOpenFileLoc.GetBuffer();
2571 mii.cch = wcslen(mii.dwTypeData);
2572 mii.wID = idCmdFirst + id++;
2573 mii.fState = MFS_ENABLED;
2574 mii.fType = MFT_STRING;
2575 if (!InsertMenuItemW(hMenu, indexMenu++, TRUE, &mii))
2576 return E_FAIL;
2577
2578 return MAKE_HRESULT(SEVERITY_SUCCESS, 0, id);
2579}
#define MAKE_HRESULT(sev, fac, code)
Definition: dmerror.h:30
#define IDS_OPEN_VERB
Definition: shresdef.h:212
#define IDS_OPENFILELOCATION
Definition: shresdef.h:246
LPWSTR dwTypeData
Definition: winuser.h:3280
#define SEVERITY_SUCCESS
Definition: winerror.h:64
#define MIIM_ID
Definition: winuser.h:733
#define MIIM_STATE
Definition: winuser.h:732
#define MFS_DEFAULT
Definition: winuser.h:759
#define MFS_ENABLED
Definition: winuser.h:761
#define MFT_STRING
Definition: winuser.h:757
#define MIIM_TYPE
Definition: winuser.h:736
BOOL WINAPI InsertMenuItemW(_In_ HMENU, _In_ UINT, _In_ BOOL, _In_ LPCMENUITEMINFOW)

◆ RemoveDataBlock()

HRESULT STDMETHODCALLTYPE CShellLink::RemoveDataBlock ( DWORD  dwSig)
override

Implements IShellLinkDataList.

Definition at line 2474 of file CShellLink.cpp.

2475{
2476 if (SHRemoveDataBlock(&m_pDBList, dwSig))
2477 {
2478 m_bDirty = TRUE;
2479 return S_OK;
2480 }
2481 return S_FALSE;
2482}
BOOL WINAPI SHRemoveDataBlock(LPDBLIST *lppList, DWORD dwSignature)
Definition: clist.c:355

Referenced by SetIconLocation(), SetPath(), and WriteAdvertiseInfo().

◆ ReplacePage()

HRESULT STDMETHODCALLTYPE CShellLink::ReplacePage ( UINT  uPageID,
LPFNADDPROPSHEETPAGE  pfnReplacePage,
LPARAM  lParam 
)
override

Definition at line 3119 of file CShellLink.cpp.

3120{
3121 TRACE("(%p) (uPageID %u, pfnReplacePage %p lParam %p\n", this, uPageID, pfnReplacePage, lParam);
3122 return E_NOTIMPL;
3123}

◆ Reset()

VOID CShellLink::Reset ( )
private

Definition at line 236 of file CShellLink.cpp.

Referenced by Load().

◆ Resolve()

HRESULT STDMETHODCALLTYPE CShellLink::Resolve ( HWND  hwnd,
DWORD  fFlags 
)
override

Implements IShellLinkA.

Definition at line 1447 of file CShellLink.cpp.

1448{
1449 HRESULT hr = S_OK;
1450 BOOL bSuccess;
1451
1452 TRACE("(%p)->(hwnd=%p flags=%x)\n", this, hwnd, fFlags);
1453
1454 /* FIXME: use IResolveShellLink interface? */
1455
1456 // FIXME: See InvokeCommand().
1457
1458#if (NTDDI_VERSION < NTDDI_LONGHORN)
1459 // NOTE: For Logo3 (EXP_LOGO3_ID_SIG), check also for SHRestricted(REST_NOLOGO3CHANNELNOTIFY)
1461 {
1462 FIXME("Logo3 links are not supported yet!\n");
1463 return E_FAIL;
1464 }
1465#endif
1466
1467 /* Resolve Darwin (MSI) target */
1469 {
1470 LPWSTR component = NULL;
1471 hr = GetAdvertiseInfo(&component, EXP_DARWIN_ID_SIG);
1472 if (FAILED(hr))
1473 return E_FAIL;
1474
1475 /* Clear the cached path */
1478 if (!m_sPath)
1479 return E_FAIL;
1480 }
1481
1482 if (!m_sPath && m_pPidl)
1483 {
1485
1486 bSuccess = SHGetPathFromIDListW(m_pPidl, buffer);
1487 if (bSuccess && *buffer)
1488 {
1490 if (!m_sPath)
1491 return E_OUTOFMEMORY;
1492
1493 m_bDirty = TRUE;
1494 }
1495 else
1496 {
1497 hr = S_OK; /* don't report an error occurred while just caching information */
1498 }
1499 }
1500
1501 // FIXME: Strange to do that here...
1502 if (!m_sIcoPath && m_sPath)
1503 {
1505 if (!m_sIcoPath)
1506 return E_OUTOFMEMORY;
1507
1508 m_Header.nIconIndex = 0;
1509
1510 m_bDirty = TRUE;
1511 }
1512
1513 return hr;
1514}
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023

Referenced by InvokeCommand(), and OnInitDialog().

◆ Save() [1/2]

HRESULT STDMETHODCALLTYPE CShellLink::Save ( IStream stm,
BOOL  fClearDirty 
)
override

Implements IPersistStream.

Definition at line 910 of file CShellLink.cpp.

911{
912 TRACE("%p %p %x\n", this, stm, fClearDirty);
913
914 m_Header.dwSize = sizeof(m_Header);
915 m_Header.clsid = CLSID_ShellLink;
917
918 /* Store target attributes */
919 WIN32_FIND_DATAW wfd = {};
920 WCHAR FsTarget[MAX_PATH];
921 if (GetPath(FsTarget, _countof(FsTarget), NULL, 0) == S_OK && PathFileExistsW(FsTarget))
922 {
923 HANDLE hFind = FindFirstFileW(FsTarget, &wfd);
924 if (hFind != INVALID_HANDLE_VALUE)
925 FindClose(hFind);
926 }
927 m_Header.dwFileAttributes = wfd.dwFileAttributes;
928 m_Header.ftCreationTime = wfd.ftCreationTime;
929 m_Header.ftLastAccessTime = wfd.ftLastAccessTime;
930 m_Header.ftLastWriteTime = wfd.ftLastWriteTime;
931 m_Header.nFileSizeLow = wfd.nFileSizeLow;
932
933 /*
934 * Reset the flags: keep only the flags related to data blocks as they were
935 * already set in accordance by the different mutator member functions.
936 * The other flags will be determined now by the presence or absence of data.
937 */
938 UINT NT6SimpleFlags = LOBYTE(GetVersion()) > 6 ? (0x00040000 | 0x00400000 | 0x00800000 | 0x02000000) : 0;
940 SLDF_HAS_DARWINID | SLDF_FORCE_NO_LINKINFO | NT6SimpleFlags |
941#if (NTDDI_VERSION < NTDDI_LONGHORN)
943#endif
945 // TODO: When we will support Vista+ functionality, add other flags to this list.
946
947 /* The stored strings are in UNICODE */
949
950 if (m_pPidl)
956 if (m_sPathRel && *m_sPathRel)
958 if (m_sWorkDir && *m_sWorkDir)
960 if (m_sArgs && *m_sArgs)
962 if (m_sIcoPath && *m_sIcoPath)
964 if (m_bRunAs)
966
967 /* Write the shortcut header */
968 ULONG count;
969 HRESULT hr = stm->Write(&m_Header, sizeof(m_Header), &count);
970 if (FAILED(hr))
971 {
972 ERR("Write failed\n");
973 return hr;
974 }
975
976 /* Save the data in order */
977
978 if (m_pPidl)
979 {
980 hr = ILSaveToStream(stm, m_pPidl);
981 if (FAILED(hr))
982 {
983 ERR("Failed to write PIDL\n");
984 return hr;
985 }
986 }
987
989 {
991 if (FAILED(hr))
992 return hr;
993 }
994
996 {
998 if (FAILED(hr))
999 return hr;
1000 }
1001
1003 {
1005 if (FAILED(hr))
1006 return hr;
1007 }
1008
1010 {
1012 if (FAILED(hr))
1013 return hr;
1014 }
1015
1017 {
1019 if (FAILED(hr))
1020 return hr;
1021 }
1022
1024 {
1026 if (FAILED(hr))
1027 return hr;
1028 }
1029
1030 /*
1031 * Now save the data block list.
1032 *
1033 * NOTE that both advertised Product and Component are already saved
1034 * inside Logo3 and Darwin data blocks in the m_pDBList list, and the
1035 * m_Header.dwFlags is suitably initialized.
1036 */
1038 if (FAILED(hr))
1039 return hr;
1040
1041 /* Clear the dirty bit if requested */
1042 if (fClearDirty)
1043 m_bDirty = FALSE;
1044
1045 return hr;
1046}
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
HANDLE WINAPI FindFirstFileW(IN LPCWSTR lpFileName, OUT LPWIN32_FIND_DATAW lpFindFileData)
Definition: find.c:320
BOOL WINAPI FindClose(HANDLE hFindFile)
Definition: find.c:502
HRESULT WINAPI SHWriteDataBlockList(IStream *lpStream, LPDBLIST lpList)
Definition: clist.c:179
HRESULT Write([in, size_is(cb)] const void *pv, [in] ULONG cb, [out] ULONG *pcbWritten)
#define LOBYTE(W)
Definition: jmemdos.c:487
HRESULT WINAPI ILSaveToStream(IStream *pStream, LPCITEMIDLIST pPidl)
Definition: pidl.c:353
DWORD WINAPI GetVersion()
Definition: redirtest.c:5
@ SLDF_RUN_IN_SEPARATE
Definition: shlobj.h:1962
@ SLDF_RUN_WITH_SHIMLAYER
Definition: shlobj.h:1971

◆ Save() [2/2]

HRESULT STDMETHODCALLTYPE CShellLink::Save ( LPCOLESTR  pszFileName,
BOOL  fRemember 
)
override

Implements IPersistFile.

Definition at line 361 of file CShellLink.cpp.

362{
363 BOOL bAlreadyExists;
364 WCHAR szFullPath[MAX_PATH];
365
366 TRACE("(%p)->(%s)\n", this, debugstr_w(pszFileName));
367
368 if (!pszFileName)
369 return E_FAIL;
370
371 bAlreadyExists = PathFileExistsW(pszFileName);
372
375 if (SUCCEEDED(hr))
376 {
377 hr = Save(stm, FALSE);
378
379 if (SUCCEEDED(hr))
380 {
381 GetFullPathNameW(pszFileName, _countof(szFullPath), szFullPath, NULL);
382 if (bAlreadyExists)
384 else
386
387 if (m_sLinkPath)
389
391 m_bDirty = FALSE;
392 }
393 else
394 {
396 WARN("Failed to create shortcut %s\n", debugstr_w(pszFileName));
397 }
398 }
399
400 return hr;
401}
#define WARN(fmt,...)
Definition: precomp.h:61
BOOL WINAPI DeleteFileW(IN LPCWSTR lpFileName)
Definition: delete.c:39
DWORD WINAPI GetFullPathNameW(IN LPCWSTR lpFileName, IN DWORD nBufferLength, OUT LPWSTR lpBuffer, OUT LPWSTR *lpFilePart)
Definition: path.c:1106
#define STGM_CREATE
Definition: objbase.h:926
#define STGM_READWRITE
Definition: objbase.h:919
#define STGM_SHARE_EXCLUSIVE
Definition: objbase.h:923
#define SHCNE_CREATE
Definition: shlobj.h:1899

Referenced by OnNotify(), and Save().

◆ SaveCompleted()

HRESULT STDMETHODCALLTYPE CShellLink::SaveCompleted ( LPCOLESTR  pszFileName)
override

Implements IPersistFile.

Definition at line 403 of file CShellLink.cpp.

404{
405 FIXME("(%p)->(%s)\n", this, debugstr_w(pszFileName));
406 return S_OK;
407}

◆ SetAdvertiseInfo()

HRESULT CShellLink::SetAdvertiseInfo ( LPCWSTR  str)
private

Definition at line 2147 of file CShellLink.cpp.

2148{
2149 HRESULT hr;
2150 LPCWSTR szComponent = NULL, szProduct = NULL, p;
2151 INT len;
2152 GUID guid;
2153 WCHAR szGuid[38+1];
2154
2156
2157 while (str[0])
2158 {
2159 /* each segment must start with two colons */
2160 if (str[0] != ':' || str[1] != ':')
2161 return E_FAIL;
2162
2163 /* the last segment is just two colons */
2164 if (!str[2])
2165 break;
2166 str += 2;
2167
2168 /* there must be a colon straight after a guid */
2169 p = wcschr(str, L':');
2170 if (!p)
2171 return E_FAIL;
2172 len = p - str;
2173 if (len != 38)
2174 return E_FAIL;
2175
2176 /* get the guid, and check if it's validly formatted */
2177 memcpy(szGuid, str, sizeof(WCHAR)*len);
2178 szGuid[len] = 0;
2179
2181 if (hr != S_OK)
2182 return hr;
2183 str = p + 1;
2184
2185 /* match it up to a guid that we care about */
2186 if (IsEqualGUID(guid, SHELL32_AdvtShortcutComponent) && !szComponent)
2187 szComponent = str; /* Darwin */
2188 else if (IsEqualGUID(guid, SHELL32_AdvtShortcutProduct) && !szProduct)
2189 szProduct = str; /* Logo3 */
2190 else
2191 return E_FAIL;
2192
2193 /* skip to the next field */
2194 str = wcschr(str, L':');
2195 if (!str)
2196 return E_FAIL;
2197 }
2198
2199 /* we have to have a component for an advertised shortcut */
2200 if (!szComponent)
2201 return E_FAIL;
2202
2203 szComponent = GetAdvertisedArg(szComponent);
2204 szProduct = GetAdvertisedArg(szProduct);
2205
2206 hr = WriteAdvertiseInfo(szComponent, EXP_DARWIN_ID_SIG);
2207 // if (FAILED(hr))
2208 // return hr;
2209#if (NTDDI_VERSION < NTDDI_LONGHORN)
2210 hr = WriteAdvertiseInfo(szProduct, EXP_LOGO3_ID_SIG);
2211 // if (FAILED(hr))
2212 // return hr;
2213#endif
2214
2215 HeapFree(GetProcessHeap(), 0, (PVOID)szComponent);
2216 HeapFree(GetProcessHeap(), 0, (PVOID)szProduct);
2217
2218 if (TRACE_ON(shell))
2219 {
2221 TRACE("Component = %s\n", debugstr_w(sComponent));
2222#if (NTDDI_VERSION < NTDDI_LONGHORN)
2223 GetAdvertiseInfo(&sProduct, EXP_LOGO3_ID_SIG);
2224 TRACE("Product = %s\n", debugstr_w(sProduct));
2225#endif
2226 }
2227
2228 return S_OK;
2229}
HRESULT WINAPI CLSIDFromString(LPCOLESTR idstr, LPCLSID id)
Definition: compobj.c:2338
const GUID SHELL32_AdvtShortcutProduct
const GUID SHELL32_AdvtShortcutComponent
GLfloat GLfloat p
Definition: glext.h:8902
const GUID * guid
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
static const WCHAR szGuid[]
Definition: rtlstr.c:1892
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185

Referenced by SetPath().

◆ SetArguments() [1/2]

HRESULT STDMETHODCALLTYPE CShellLink::SetArguments ( LPCSTR  pszArgs)
override

Implements IShellLinkA.

Definition at line 1266 of file CShellLink.cpp.

1267{
1268 TRACE("(%p)->(args=%s)\n", this, pszArgs);
1269
1271 m_sArgs = NULL;
1272
1273 if (pszArgs)
1274 {
1275 m_sArgs = HEAP_strdupAtoW(GetProcessHeap(), 0, pszArgs);
1276 if (!m_sArgs)
1277 return E_OUTOFMEMORY;
1278 }
1279 m_bDirty = TRUE;
1280
1281 return S_OK;
1282}

Referenced by OnNotify().

◆ SetArguments() [2/2]

HRESULT STDMETHODCALLTYPE CShellLink::SetArguments ( LPCWSTR  pszArgs)
override

Implements IShellLinkW.

Definition at line 1687 of file CShellLink.cpp.

1688{
1689 TRACE("(%p)->(args=%s)\n", this, debugstr_w(pszArgs));
1690
1692 m_sArgs = NULL;
1693
1694 if (pszArgs)
1695 {
1696 m_sArgs = strdupW(pszArgs);
1697 if (!m_sArgs)
1698 return E_OUTOFMEMORY;
1699 }
1700 m_bDirty = TRUE;
1701
1702 return S_OK;
1703}

◆ SetDescription() [1/2]

HRESULT STDMETHODCALLTYPE CShellLink::SetDescription ( LPCSTR  pszName)
override

Implements IShellLinkA.

Definition at line 1202 of file CShellLink.cpp.

1203{
1204 TRACE("(%p)->(pName=%s)\n", this, pszName);
1205
1208
1209 if (pszName)
1210 {
1212 if (!m_sDescription)
1213 return E_OUTOFMEMORY;
1214 }
1215 m_bDirty = TRUE;
1216
1217 return S_OK;
1218}

◆ SetDescription() [2/2]

HRESULT STDMETHODCALLTYPE CShellLink::SetDescription ( LPCWSTR  pszName)
override

Implements IShellLinkW.

Definition at line 1625 of file CShellLink.cpp.

1626{
1627 TRACE("(%p)->(desc=%s)\n", this, debugstr_w(pszName));
1628
1631
1632 if (pszName)
1633 {
1634 m_sDescription = strdupW(pszName);
1635 if (!m_sDescription)
1636 return E_OUTOFMEMORY;
1637 }
1638 m_bDirty = TRUE;
1639
1640 return S_OK;
1641}

◆ SetFlags()

HRESULT STDMETHODCALLTYPE CShellLink::SetFlags ( DWORD  dwFlags)
override

Implements IShellLinkDataList.

Definition at line 2491 of file CShellLink.cpp.

2492{
2493 if (m_Header.dwFlags == dwFlags)
2494 return S_FALSE;
2496 m_bDirty = TRUE;
2497 return S_OK;
2498}
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1176

◆ SetHotkey()

HRESULT STDMETHODCALLTYPE CShellLink::SetHotkey ( WORD  wHotkey)
override

Implements IShellLinkA.

Definition at line 1291 of file CShellLink.cpp.

1292{
1293 TRACE("(%p)->(hotkey=%x)\n", this, wHotkey);
1294
1295 m_Header.wHotKey = wHotkey;
1296 m_bDirty = TRUE;
1297
1298 return S_OK;
1299}

◆ SetIconLocation() [1/2]

HRESULT STDMETHODCALLTYPE CShellLink::SetIconLocation ( LPCSTR  pszIconPath,
INT  iIcon 
)
override

Definition at line 1388 of file CShellLink.cpp.

1389{
1390 TRACE("(%p)->(path=%s iicon=%u)\n", this, pszIconPath, iIcon);
1391
1392 LPWSTR str = NULL;
1393 if (pszIconPath)
1394 {
1395 str = HEAP_strdupAtoW(GetProcessHeap(), 0, pszIconPath);
1396 if (!str)
1397 return E_OUTOFMEMORY;
1398 }
1399
1400 HRESULT hr = SetIconLocation(str, iIcon);
1401
1402 if (str)
1404
1405 return hr;
1406}

Referenced by OnCommand(), and SetIconLocation().

◆ SetIconLocation() [2/2]

HRESULT STDMETHODCALLTYPE CShellLink::SetIconLocation ( LPCWSTR  pszIconPath,
INT  iIcon 
)
override

Definition at line 1918 of file CShellLink.cpp.

1919{
1920 HRESULT hr = E_FAIL;
1921 WCHAR szIconPath[MAX_PATH];
1922
1923 TRACE("(%p)->(path=%s iicon=%u)\n", this, debugstr_w(pszIconPath), iIcon);
1924
1925 if (pszIconPath)
1926 {
1927 /*
1928 * Check whether the user-given file path contains unexpanded
1929 * environment variables. If so, create a target environment block.
1930 * Note that in this block we will store the user-given path.
1931 * It will contain the unexpanded environment variables, but
1932 * it can also contain already expanded path that the user does
1933 * not want to see them unexpanded (e.g. so that they always
1934 * refer to the same place even if the would-be corresponding
1935 * environment variable could change).
1936 */
1937#ifdef ICON_LINK_WINDOWS_COMPAT
1938 /* Try to fully unexpand the icon path */
1939 // if (PathFullyUnExpandEnvStringsW(pszIconPath, szIconPath, _countof(szIconPath)))
1940 BOOL bSuccess = PathUnExpandEnvStringsW(pszIconPath, szIconPath, _countof(szIconPath));
1941 if (bSuccess && wcscmp(pszIconPath, szIconPath) != 0)
1942#else
1943 /*
1944 * In some situations, described in http://stackoverflow.com/questions/2976489/ishelllinkseticonlocation-translates-my-icon-path-into-program-files-which-i
1945 * the result of PathUnExpandEnvStringsW() could be wrong, and instead
1946 * one would have to store the actual provided icon location path, while
1947 * creating an icon environment block ONLY if that path already contains
1948 * environment variables. This is what the present case is trying to implement.
1949 */
1950 SHExpandEnvironmentStringsW(pszIconPath, szIconPath, _countof(szIconPath));
1951 if (wcscmp(pszIconPath, szIconPath) != 0)
1952#endif
1953 {
1954 /*
1955 * The user-given file path contains unexpanded environment
1956 * variables, so we need an icon environment block.
1957 */
1959 LPEXP_SZ_LINK pInfo;
1960
1961#ifdef ICON_LINK_WINDOWS_COMPAT
1962 /* Make pszIconPath point to the unexpanded path */
1963 LPCWSTR pszOrgIconPath = pszIconPath;
1964 pszIconPath = szIconPath;
1965#endif
1967 if (pInfo)
1968 {
1969 /* Make sure that the size of the structure is valid */
1970 if (pInfo->cbSize != sizeof(*pInfo))
1971 {
1972 ERR("Ooops. This structure is not as expected...\n");
1973
1974 /* Invalid structure, remove it altogether */
1975 m_Header.dwFlags &= ~SLDF_HAS_EXP_ICON_SZ;
1977
1978 /* Reset the pointer and go use the static buffer */
1979 pInfo = NULL;
1980 }
1981 }
1982 if (!pInfo)
1983 {
1984 /* Use the static buffer */
1985 pInfo = &buffer;
1986 buffer.cbSize = sizeof(buffer);
1987 buffer.dwSignature = EXP_SZ_ICON_SIG;
1988 }
1989
1990 lstrcpynW(pInfo->szwTarget, pszIconPath, _countof(pInfo->szwTarget));
1991 WideCharToMultiByte(CP_ACP, 0, pszIconPath, -1,
1992 pInfo->szTarget, _countof(pInfo->szTarget), NULL, NULL);
1993
1994 hr = S_OK;
1995 if (pInfo == &buffer)
1996 hr = AddDataBlock(pInfo);
1997 if (hr == S_OK)
1999
2000#ifdef ICON_LINK_WINDOWS_COMPAT
2001 /* Set pszIconPath back to the original one */
2002 pszIconPath = pszOrgIconPath;
2003#else
2004 /* Now, make pszIconPath point to the expanded path */
2005 pszIconPath = szIconPath;
2006#endif
2007 }
2008 else
2009 {
2010 /*
2011 * The user-given file path does not contain unexpanded environment
2012 * variables, so we need to remove any icon environment block.
2013 */
2014 m_Header.dwFlags &= ~SLDF_HAS_EXP_ICON_SZ;
2016
2017 /* pszIconPath points to the user path */
2018 }
2019 }
2020
2021#ifdef ICON_LINK_WINDOWS_COMPAT
2022 /* Store the original icon path location (may contain unexpanded environment strings) */
2023#endif
2024 if (pszIconPath)
2025 {
2026 m_Header.dwFlags &= ~SLDF_HAS_ICONLOCATION;
2028
2029 m_sIcoPath = strdupW(pszIconPath);
2030 if (!m_sIcoPath)
2031 return E_OUTOFMEMORY;
2032
2034 }
2035
2036 hr = S_OK;
2037
2038 m_Header.nIconIndex = iIcon;
2039 m_bDirty = TRUE;
2040
2041 return hr;
2042}
BOOL WINAPI PathUnExpandEnvStringsW(LPCWSTR path, LPWSTR buffer, UINT buf_len)
Definition: path.c:4181
_Check_return_ _CRTIMP int __cdecl wcscmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)

◆ SetIDList()

HRESULT STDMETHODCALLTYPE CShellLink::SetIDList ( PCIDLIST_ABSOLUTE  pidl)
override

Implements IShellLinkA.

Definition at line 1182 of file CShellLink.cpp.

1183{
1184 TRACE("(%p)->(pidl=%p)\n", this, pidl);
1185 return SetTargetFromPIDLOrPath(pidl, NULL);
1186}

◆ SetPath() [1/2]

HRESULT STDMETHODCALLTYPE CShellLink::SetPath ( LPCSTR  pszFile)
override

Implements IShellLinkA.

Definition at line 1516 of file CShellLink.cpp.

1517{
1518 TRACE("(%p)->(path=%s)\n", this, pszFile);
1519
1520 if (!pszFile)
1521 return E_INVALIDARG;
1522
1523 LPWSTR str = HEAP_strdupAtoW(GetProcessHeap(), 0, pszFile);
1524 if (!str)
1525 return E_OUTOFMEMORY;
1526
1527 HRESULT hr = SetPath(str);
1529
1530 return hr;
1531}

Referenced by OnNotify(), and SetPath().

◆ SetPath() [2/2]

HRESULT STDMETHODCALLTYPE CShellLink::SetPath ( LPCWSTR  pszFile)
override

Implements IShellLinkW.

Definition at line 2311 of file CShellLink.cpp.

2312{
2313 LPWSTR unquoted = NULL;
2314 HRESULT hr = S_OK;
2315
2316 TRACE("(%p)->(path=%s)\n", this, debugstr_w(pszFile));
2317
2318 if (!pszFile)
2319 return E_INVALIDARG;
2320
2321 /*
2322 * Allow upgrading Logo3 shortcuts (m_Header.dwFlags & SLDF_HAS_LOGO3ID),
2323 * but forbid upgrading Darwin ones.
2324 */
2326 return S_FALSE;
2327
2328 /* quotes at the ends of the string are stripped */
2329 SIZE_T len = wcslen(pszFile);
2330 if (pszFile[0] == L'"' && pszFile[len-1] == L'"')
2331 {
2332 unquoted = strdupW(pszFile);
2333 PathUnquoteSpacesW(unquoted);
2334 pszFile = unquoted;
2335 }
2336
2337 /* any other quote marks are invalid */
2338 if (wcschr(pszFile, L'"'))
2339 {
2340 hr = S_FALSE;
2341 goto end;
2342 }
2343
2344 /* Clear the cached path */
2346 m_sPath = NULL;
2347
2348 /* Check for an advertised target (Logo3 or Darwin) */
2349 if (SetAdvertiseInfo(pszFile) != S_OK)
2350 {
2351 /* This is not an advertised target, but a regular path */
2353
2354 /*
2355 * Check whether the user-given file path contains unexpanded
2356 * environment variables. If so, create a target environment block.
2357 * Note that in this block we will store the user-given path.
2358 * It will contain the unexpanded environment variables, but
2359 * it can also contain already expanded path that the user does
2360 * not want to see them unexpanded (e.g. so that they always
2361 * refer to the same place even if the would-be corresponding
2362 * environment variable could change).
2363 */
2364 if (*pszFile)
2366 else
2367 *szPath = L'\0';
2368
2369 if (*pszFile && (wcscmp(pszFile, szPath) != 0))
2370 {
2371 /*
2372 * The user-given file path contains unexpanded environment
2373 * variables, so we need a target environment block.
2374 */
2376 LPEXP_SZ_LINK pInfo;
2377
2379 if (pInfo)
2380 {
2381 /* Make sure that the size of the structure is valid */
2382 if (pInfo->cbSize != sizeof(*pInfo))
2383 {
2384 ERR("Ooops. This structure is not as expected...\n");
2385
2386 /* Invalid structure, remove it altogether */
2387 m_Header.dwFlags &= ~SLDF_HAS_EXP_SZ;
2389
2390 /* Reset the pointer and go use the static buffer */
2391 pInfo = NULL;
2392 }
2393 }
2394 if (!pInfo)
2395 {
2396 /* Use the static buffer */
2397 pInfo = &buffer;
2398 buffer.cbSize = sizeof(buffer);
2399 buffer.dwSignature = EXP_SZ_LINK_SIG;
2400 }
2401
2402 lstrcpynW(pInfo->szwTarget, pszFile, _countof(pInfo->szwTarget));
2403 WideCharToMultiByte(CP_ACP, 0, pszFile, -1,
2404 pInfo->szTarget, _countof(pInfo->szTarget), NULL, NULL);
2405
2406 hr = S_OK;
2407 if (pInfo == &buffer)
2408 hr = AddDataBlock(pInfo);
2409 if (hr == S_OK)
2411
2412 /* Now, make pszFile point to the expanded path */
2413 pszFile = szPath;
2414 }
2415 else
2416 {
2417 /*
2418 * The user-given file path does not contain unexpanded environment
2419 * variables, so we need to remove any target environment block.
2420 */
2421 m_Header.dwFlags &= ~SLDF_HAS_EXP_SZ;
2423
2424 /* pszFile points to the user path */
2425 }
2426
2427 /* Set the target */
2428 hr = SetTargetFromPIDLOrPath(NULL, pszFile);
2429 }
2430
2431 m_bDirty = TRUE;
2432
2433end:
2434 HeapFree(GetProcessHeap(), 0, unquoted);
2435 return hr;
2436}
GLuint GLuint end
Definition: gl.h:1545
ULONG_PTR SIZE_T
Definition: typedefs.h:80

◆ SetRelativePath() [1/2]

HRESULT STDMETHODCALLTYPE CShellLink::SetRelativePath ( LPCSTR  pszPathRel,
DWORD  dwReserved 
)
override

Implements IShellLinkA.

Definition at line 1408 of file CShellLink.cpp.

1409{
1410 TRACE("(%p)->(path=%s %x)\n", this, pszPathRel, dwReserved);
1411
1413 m_sPathRel = NULL;
1414
1415 if (pszPathRel)
1416 {
1417 m_sPathRel = HEAP_strdupAtoW(GetProcessHeap(), 0, pszPathRel);
1418 m_bDirty = TRUE;
1419 }
1420
1422}
_In_ HANDLE _In_ DWORD _In_ DWORD _Inout_opt_ LPOVERLAPPED _In_opt_ LPTRANSMIT_FILE_BUFFERS _In_ DWORD dwReserved
Definition: mswsock.h:95

◆ SetRelativePath() [2/2]

HRESULT STDMETHODCALLTYPE CShellLink::SetRelativePath ( LPCWSTR  pszPathRel,
DWORD  dwReserved 
)
override

Implements IShellLinkW.

Definition at line 2044 of file CShellLink.cpp.

2045{
2046 TRACE("(%p)->(path=%s %x)\n", this, debugstr_w(pszPathRel), dwReserved);
2047
2049 m_sPathRel = NULL;
2050
2051 if (pszPathRel)
2052 {
2053 m_sPathRel = strdupW(pszPathRel);
2054 if (!m_sPathRel)
2055 return E_OUTOFMEMORY;
2056 }
2057 m_bDirty = TRUE;
2058
2060}

◆ SetShowCmd()

HRESULT STDMETHODCALLTYPE CShellLink::SetShowCmd ( INT  iShowCmd)
override

Definition at line 1308 of file CShellLink.cpp.

1309{
1310 TRACE("(%p) %d\n", this, iShowCmd);
1311
1312 m_Header.nShowCommand = iShowCmd;
1313 m_bDirty = TRUE;
1314
1315 return S_OK;
1316}

◆ SetSite()

HRESULT STDMETHODCALLTYPE CShellLink::SetSite ( IUnknown punk)
override

Implements IObjectWithSite.

Definition at line 3125 of file CShellLink.cpp.

3126{
3127 TRACE("%p %p\n", this, punk);
3128
3129 m_site = punk;
3130
3131 return S_OK;
3132}

◆ SetTargetFromPIDLOrPath()

HRESULT CShellLink::SetTargetFromPIDLOrPath ( LPCITEMIDLIST  pidl,
LPCWSTR  pszFile 
)
private

Definition at line 2231 of file CShellLink.cpp.

2232{
2233 HRESULT hr = S_OK;
2234 LPITEMIDLIST pidlNew = NULL;
2236
2237 /*
2238 * Not both 'pidl' and 'pszFile' should be set.
2239 * But either one or both can be NULL.
2240 */
2241 if (pidl && pszFile)
2242 return E_FAIL;
2243
2244 if (pidl)
2245 {
2246 /* Clone the PIDL */
2247 pidlNew = ILClone(pidl);
2248 if (!pidlNew)
2249 return E_FAIL;
2250 }
2251 else if (pszFile)
2252 {
2253 /* Build a PIDL for this path target */
2254 hr = SHILCreateFromPathW(pszFile, &pidlNew, NULL);
2255 if (FAILED(hr))
2256 {
2257 /* This failed, try to resolve the path, then create a simple PIDL */
2258
2261
2263 {
2264 hr = E_INVALIDARG;
2265 szPath[0] = 0;
2266 }
2267 else
2268 {
2269 hr = S_OK;
2271 // NOTE: Don't make it failed here even if pidlNew was NULL.
2272 // We don't fail on purpose even if SHSimpleIDListFromPathW returns NULL.
2273 // This behaviour has been verified with tests.
2274 }
2275 }
2276 }
2277 // else if (!pidl && !pszFile) { pidlNew = NULL; hr = S_OK; }
2278
2279 ILFree(m_pPidl);
2280 m_pPidl = pidlNew;
2281
2282 if (!pszFile)
2283 {
2284 if (SHGetPathFromIDListW(pidlNew, szPath))
2285 pszFile = szPath;
2286 }
2287
2288 // TODO: Fully update link info, tracker, file attribs...
2289
2290 // if (pszFile)
2291 if (!pszFile)
2292 {
2293 *szPath = L'\0';
2294 pszFile = szPath;
2295 }
2296
2297 /* Update the cached path (for link info) */
2299
2300 if (m_sPath)
2302
2303 m_sPath = strdupW(pszFile);
2304 if (!m_sPath)
2305 return E_OUTOFMEMORY;
2306
2307 m_bDirty = TRUE;
2308 return hr;
2309}
#define PRF_TRYPROGRAMEXTENSIONS
Definition: PathResolve.cpp:40
BOOL WINAPI PathResolveW(_Inout_ LPWSTR path, _Inout_opt_ LPCWSTR *dirs, _In_ DWORD flags)
Definition: shellpath.c:1032
BOOL WINAPI PathIsFileSpecW(LPCWSTR lpszPath)
Definition: path.c:2139
HRESULT WINAPI SHILCreateFromPathW(LPCWSTR path, LPITEMIDLIST *ppidl, DWORD *attributes)
Definition: pidl.c:403
LPITEMIDLIST WINAPI SHSimpleIDListFromPathW(LPCWSTR lpszPath)
Definition: pidl.c:1238

Referenced by SetIDList(), and SetPath().

◆ SetWorkingDirectory() [1/2]

HRESULT STDMETHODCALLTYPE CShellLink::SetWorkingDirectory ( LPCSTR  pszDir)
override

Implements IShellLinkA.

Definition at line 1234 of file CShellLink.cpp.

1235{
1236 TRACE("(%p)->(dir=%s)\n", this, pszDir);
1237
1239 m_sWorkDir = NULL;
1240
1241 if (pszDir)
1242 {
1244 if (!m_sWorkDir)
1245 return E_OUTOFMEMORY;
1246 }
1247 m_bDirty = TRUE;
1248
1249 return S_OK;
1250}

Referenced by OnNotify().

◆ SetWorkingDirectory() [2/2]

HRESULT STDMETHODCALLTYPE CShellLink::SetWorkingDirectory ( LPCWSTR  pszDir)
override

Implements IShellLinkW.

Definition at line 1656 of file CShellLink.cpp.

1657{
1658 TRACE("(%p)->(dir=%s)\n", this, debugstr_w(pszDir));
1659
1661 m_sWorkDir = NULL;
1662
1663 if (pszDir)
1664 {
1666 if (!m_sWorkDir)
1667 return E_OUTOFMEMORY;
1668 }
1669 m_bDirty = TRUE;
1670
1671 return S_OK;
1672}

◆ SH_ShellLinkDlgProc()

INT_PTR CALLBACK CShellLink::SH_ShellLinkDlgProc ( HWND  hwndDlg,
UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam 
)
static

Definition at line 3068 of file CShellLink.cpp.

3069{
3070 LPPROPSHEETPAGEW ppsp;
3071 CShellLink *pThis = reinterpret_cast<CShellLink *>(GetWindowLongPtr(hwndDlg, DWLP_USER));
3072
3073 switch (uMsg)
3074 {
3075 case WM_INITDIALOG:
3076 ppsp = (LPPROPSHEETPAGEW)lParam;
3077 if (ppsp == NULL)
3078 break;
3079
3080 pThis = reinterpret_cast<CShellLink *>(ppsp->lParam);
3081 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pThis);
3082 return pThis->OnInitDialog(hwndDlg, (HWND)(wParam), lParam);
3083
3084 case WM_NOTIFY:
3085 return pThis->OnNotify(hwndDlg, (int)wParam, (NMHDR *)lParam);
3086
3087 case WM_COMMAND:
3088 pThis->OnCommand(hwndDlg, LOWORD(wParam), (HWND)lParam, HIWORD(wParam));
3089 break;
3090
3091 case WM_DESTROY:
3092 pThis->OnDestroy(hwndDlg);
3093 break;
3094
3095 default:
3096 break;
3097 }
3098
3099 return FALSE;
3100}
WPARAM wParam
Definition: combotst.c:138
__int3264 LONG_PTR
Definition: mstsclib_h.h:276
struct _PROPSHEETPAGEW * LPPROPSHEETPAGEW
#define WM_NOTIFY
Definition: richedit.h:61
LPARAM lParam
Definition: prsht.h:227
#define GetWindowLongPtr
Definition: treelist.c:73
#define DWLP_USER
Definition: winuser.h:883
#define WM_COMMAND
Definition: winuser.h:1751
#define WM_INITDIALOG
Definition: winuser.h:1750
#define WM_DESTROY
Definition: winuser.h:1620

Referenced by AddPages().

◆ WriteAdvertiseInfo()

HRESULT CShellLink::WriteAdvertiseInfo ( LPCWSTR  string,
DWORD  dwSig 
)
private

Definition at line 2081 of file CShellLink.cpp.

2082{
2084 LPEXP_DARWIN_LINK pInfo;
2085
2086 if ( (dwSig != EXP_DARWIN_ID_SIG)
2088 && (dwSig != EXP_LOGO3_ID_SIG)
2089#endif
2090 )
2091 {
2092 return E_INVALIDARG;
2093 }
2094
2095 if (!string)
2096 return S_FALSE;
2097
2099 if (pInfo)
2100 {
2101 /* Make sure that the size of the structure is valid */
2102 if (pInfo->dbh.cbSize != sizeof(*pInfo))
2103 {
2104 ERR("Ooops. This structure is not as expected...\n");
2105
2106 /* Invalid structure, remove it altogether */
2107 if (dwSig == EXP_DARWIN_ID_SIG)
2108 m_Header.dwFlags &= ~SLDF_HAS_DARWINID;
2109#if (NTDDI_VERSION < NTDDI_LONGHORN)
2110 else if (dwSig == EXP_LOGO3_ID_SIG)
2111 m_Header.dwFlags &= ~SLDF_HAS_LOGO3ID;
2112#endif
2113 RemoveDataBlock(dwSig);
2114
2115 /* Reset the pointer and go use the static buffer */
2116 pInfo = NULL;
2117 }
2118 }
2119 if (!pInfo)
2120 {
2121 /* Use the static buffer */
2122 pInfo = &buffer;
2123 buffer.dbh.cbSize = sizeof(buffer);
2124 buffer.dbh.dwSignature = dwSig;
2125 }
2126
2127 lstrcpynW(pInfo->szwDarwinID, string, _countof(pInfo->szwDarwinID));
2128 WideCharToMultiByte(CP_ACP, 0, string, -1,
2129 pInfo->szDarwinID, _countof(pInfo->szDarwinID), NULL, NULL);
2130
2131 HRESULT hr = S_OK;
2132 if (pInfo == &buffer)
2133 hr = AddDataBlock(pInfo);
2134 if (hr == S_OK)
2135 {
2136 if (dwSig == EXP_DARWIN_ID_SIG)
2138#if (NTDDI_VERSION < NTDDI_LONGHORN)
2139 else if (dwSig == EXP_LOGO3_ID_SIG)
2141#endif
2142 }
2143
2144 return hr;
2145}
#define NTDDI_VERSION
Definition: k32.h:33
#define NTDDI_LONGHORN
Definition: sdkddkver.h:102

Referenced by SetAdvertiseInfo().

Member Data Documentation

◆ m_bDirty

◆ m_bInInit

BOOL CShellLink::m_bInInit
private

Definition at line 88 of file CShellLink.h.

Referenced by CShellLink(), OnCommand(), and OnInitDialog().

◆ m_bRunAs

BOOL CShellLink::m_bRunAs
private

Definition at line 85 of file CShellLink.h.

Referenced by CShellLink(), Load(), OnCommand(), Reset(), and Save().

◆ m_DropTarget

CComPtr<IDropTarget> CShellLink::m_DropTarget
private

Definition at line 99 of file CShellLink.h.

Referenced by DragEnter(), DragLeave(), DragOver(), and Drop().

◆ m_Header

◆ m_hIcon

HICON CShellLink::m_hIcon
private

Definition at line 89 of file CShellLink.h.

Referenced by CShellLink(), OnCommand(), OnDestroy(), and OnInitDialog().

◆ m_idCmdFirst

UINT CShellLink::m_idCmdFirst
private

Definition at line 90 of file CShellLink.h.

Referenced by CShellLink(), and QueryContextMenu().

◆ m_pDBList

◆ m_pPidl

◆ m_sArgs

LPWSTR CShellLink::m_sArgs
private

◆ m_sDescription

LPWSTR CShellLink::m_sDescription
private

◆ m_sIcoPath

LPWSTR CShellLink::m_sIcoPath
private

◆ m_site

CComPtr<IUnknown> CShellLink::m_site
private

Definition at line 98 of file CShellLink.h.

Referenced by GetSite(), and SetSite().

◆ m_sLinkPath

LPWSTR CShellLink::m_sLinkPath
private

Definition at line 96 of file CShellLink.h.

Referenced by CShellLink(), DoOpen(), GetCurFile(), Load(), OnInitDialog(), OnNotify(), Save(), and ~CShellLink().

◆ m_sPath

◆ m_sPathRel

LPWSTR CShellLink::m_sPathRel
private

Definition at line 81 of file CShellLink.h.

Referenced by CShellLink(), Load(), OnInitDialog(), Reset(), Save(), SetRelativePath(), and ~CShellLink().

◆ m_sWorkDir

LPWSTR CShellLink::m_sWorkDir
private

◆ sComponent

LPWSTR CShellLink::sComponent
private

Definition at line 94 of file CShellLink.h.

Referenced by CShellLink(), Load(), OnInitDialog(), Reset(), and SetAdvertiseInfo().

◆ sProduct

LPWSTR CShellLink::sProduct
private

Definition at line 93 of file CShellLink.h.

Referenced by CShellLink(), Load(), OnInitDialog(), Reset(), and SetAdvertiseInfo().

◆ volume

volume_info CShellLink::volume
private

Definition at line 78 of file CShellLink.h.


The documentation for this class was generated from the following files: