ReactOS  0.4.15-dev-3291-gea4c1a0
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 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 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)
 
virtual HRESULT STDMETHODCALLTYPE GetClassID (CLSID *pclsid)
 
virtual HRESULT STDMETHODCALLTYPE IsDirty ()
 
virtual HRESULT STDMETHODCALLTYPE Load (LPCOLESTR pszFileName, DWORD dwMode)
 
virtual HRESULT STDMETHODCALLTYPE Save (LPCOLESTR pszFileName, BOOL fRemember)
 
virtual HRESULT STDMETHODCALLTYPE SaveCompleted (LPCOLESTR pszFileName)
 
virtual HRESULT STDMETHODCALLTYPE GetCurFile (LPOLESTR *ppszFileName)
 
virtual HRESULT STDMETHODCALLTYPE Load (IStream *stm)
 
virtual HRESULT STDMETHODCALLTYPE Save (IStream *stm, BOOL fClearDirty)
 
virtual HRESULT STDMETHODCALLTYPE GetSizeMax (ULARGE_INTEGER *pcbSize)
 
virtual HRESULT STDMETHODCALLTYPE GetPath (LPSTR pszFile, INT cchMaxPath, WIN32_FIND_DATAA *pfd, DWORD fFlags)
 
virtual HRESULT STDMETHODCALLTYPE GetIDList (PIDLIST_ABSOLUTE *ppidl)
 
virtual HRESULT STDMETHODCALLTYPE SetIDList (PCIDLIST_ABSOLUTE pidl)
 
virtual HRESULT STDMETHODCALLTYPE GetDescription (LPSTR pszName, INT cchMaxName)
 
virtual HRESULT STDMETHODCALLTYPE SetDescription (LPCSTR pszName)
 
virtual HRESULT STDMETHODCALLTYPE GetWorkingDirectory (LPSTR pszDir, INT cchMaxPath)
 
virtual HRESULT STDMETHODCALLTYPE SetWorkingDirectory (LPCSTR pszDir)
 
virtual HRESULT STDMETHODCALLTYPE GetArguments (LPSTR pszArgs, INT cchMaxPath)
 
virtual HRESULT STDMETHODCALLTYPE SetArguments (LPCSTR pszArgs)
 
virtual HRESULT STDMETHODCALLTYPE GetHotkey (WORD *pwHotkey)
 
virtual HRESULT STDMETHODCALLTYPE SetHotkey (WORD wHotkey)
 
virtual HRESULT STDMETHODCALLTYPE GetShowCmd (INT *piShowCmd)
 
virtual HRESULT STDMETHODCALLTYPE SetShowCmd (INT iShowCmd)
 
virtual HRESULT STDMETHODCALLTYPE GetIconLocation (LPSTR pszIconPath, INT cchIconPath, INT *piIcon)
 
virtual HRESULT STDMETHODCALLTYPE SetIconLocation (LPCSTR pszIconPath, INT iIcon)
 
virtual HRESULT STDMETHODCALLTYPE SetRelativePath (LPCSTR pszPathRel, DWORD dwReserved)
 
virtual HRESULT STDMETHODCALLTYPE Resolve (HWND hwnd, DWORD fFlags)
 
virtual HRESULT STDMETHODCALLTYPE SetPath (LPCSTR pszFile)
 
virtual HRESULT STDMETHODCALLTYPE GetPath (LPWSTR pszFile, INT cchMaxPath, WIN32_FIND_DATAW *pfd, DWORD fFlags)
 
virtual HRESULT STDMETHODCALLTYPE GetDescription (LPWSTR pszName, INT cchMaxName)
 
virtual HRESULT STDMETHODCALLTYPE SetDescription (LPCWSTR pszName)
 
virtual HRESULT STDMETHODCALLTYPE GetWorkingDirectory (LPWSTR pszDir, INT cchMaxPath)
 
virtual HRESULT STDMETHODCALLTYPE SetWorkingDirectory (LPCWSTR pszDir)
 
virtual HRESULT STDMETHODCALLTYPE GetArguments (LPWSTR pszArgs, INT cchMaxPath)
 
virtual HRESULT STDMETHODCALLTYPE SetArguments (LPCWSTR pszArgs)
 
virtual HRESULT STDMETHODCALLTYPE GetIconLocation (LPWSTR pszIconPath, INT cchIconPath, INT *piIcon)
 
virtual HRESULT STDMETHODCALLTYPE SetIconLocation (LPCWSTR pszIconPath, INT iIcon)
 
virtual HRESULT STDMETHODCALLTYPE SetRelativePath (LPCWSTR pszPathRel, DWORD dwReserved)
 
virtual HRESULT STDMETHODCALLTYPE SetPath (LPCWSTR pszFile)
 
virtual HRESULT STDMETHODCALLTYPE AddDataBlock (void *pDataBlock)
 
virtual HRESULT STDMETHODCALLTYPE CopyDataBlock (DWORD dwSig, void **ppDataBlock)
 
virtual HRESULT STDMETHODCALLTYPE RemoveDataBlock (DWORD dwSig)
 
virtual HRESULT STDMETHODCALLTYPE GetFlags (DWORD *pdwFlags)
 
virtual HRESULT STDMETHODCALLTYPE SetFlags (DWORD dwFlags)
 
virtual HRESULT STDMETHODCALLTYPE Extract (PCSTR pszFile, UINT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize)
 
virtual HRESULT STDMETHODCALLTYPE GetIconLocation (UINT uFlags, PSTR pszIconFile, UINT cchMax, int *piIndex, UINT *pwFlags)
 
virtual HRESULT STDMETHODCALLTYPE Extract (PCWSTR pszFile, UINT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize)
 
virtual HRESULT STDMETHODCALLTYPE GetIconLocation (UINT uFlags, PWSTR pszIconFile, UINT cchMax, int *piIndex, UINT *pwFlags)
 
virtual HRESULT STDMETHODCALLTYPE Initialize (PCIDLIST_ABSOLUTE pidlFolder, IDataObject *pdtobj, HKEY hkeyProgID)
 
virtual HRESULT STDMETHODCALLTYPE QueryContextMenu (HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags)
 
virtual HRESULT STDMETHODCALLTYPE InvokeCommand (LPCMINVOKECOMMANDINFO lpici)
 
virtual HRESULT STDMETHODCALLTYPE GetCommandString (UINT_PTR idCmd, UINT uType, UINT *pwReserved, LPSTR pszName, UINT cchMax)
 
virtual HRESULT STDMETHODCALLTYPE AddPages (LPFNADDPROPSHEETPAGE pfnAddPage, LPARAM lParam)
 
virtual HRESULT STDMETHODCALLTYPE ReplacePage (UINT uPageID, LPFNADDPROPSHEETPAGE pfnReplacePage, LPARAM lParam)
 
virtual HRESULT STDMETHODCALLTYPE SetSite (IUnknown *punk)
 
virtual HRESULT STDMETHODCALLTYPE GetSite (REFIID iid, void **ppvSite)
 
virtual HRESULT STDMETHODCALLTYPE DragEnter (IDataObject *pDataObject, DWORD dwKeyState, POINTL pt, DWORD *pdwEffect)
 
virtual HRESULT STDMETHODCALLTYPE DragOver (DWORD dwKeyState, POINTL pt, DWORD *pdwEffect)
 
virtual HRESULT STDMETHODCALLTYPE DragLeave ()
 
virtual HRESULT STDMETHODCALLTYPE Drop (IDataObject *pDataObject, DWORD dwKeyState, POINTL pt, DWORD *pdwEffect)
 
- 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 GetDescription ([out, size_is(cch)] LPSTR pszName, [in] int cch)
 
HRESULT GetWorkingDirectory ([out, size_is(cch)] LPSTR pszDir, [in] int cch)
 
HRESULT GetArguments ([out, size_is(cch)] LPSTR pszArgs, [in] int cch)
 
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)
 
- 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 GetDescription ([out, size_is(cch)] LPWSTR pszName, [in] int cch)
 
HRESULT GetWorkingDirectory ([out, size_is(cch)] LPWSTR pszDir, [in] int cch)
 
HRESULT GetArguments ([out, size_is(cch)] LPWSTR pszArgs, [in] int cch)
 
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)
 
- 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)
 
- 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 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 IContextMenu
CMIC_MASK_NOZONECHECKS typedef IContextMenuLPCONTEXTMENU
 
- 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
 
- Public Attributes inherited from IExtractIconA
GIL_DONTCACHE typedef IExtractIconALPEXTRACTICONA
 
- Static Public Attributes inherited from IContextMenu
static CMDSTR_VIEWDETAILSW(const WCHAR []) 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.

Constructor & Destructor Documentation

◆ CShellLink()

CShellLink::CShellLink ( )

Definition at line 250 of file CShellLink.cpp.

251 {
252  m_Header.dwSize = sizeof(m_Header);
253  m_Header.clsid = CLSID_ShellLink;
254  m_Header.dwFlags = 0;
255 
261 
262  m_Header.nIconIndex = 0;
264  m_Header.wHotKey = 0;
265 
266  m_pPidl = NULL;
267 
268  m_sPath = NULL;
269  ZeroMemory(&volume, sizeof(volume));
270 
272  m_sPathRel = NULL;
273  m_sWorkDir = NULL;
274  m_sArgs = NULL;
275  m_sIcoPath = NULL;
276  m_bRunAs = FALSE;
277  m_bDirty = FALSE;
278  m_pDBList = NULL;
279  m_bInInit = FALSE;
280  m_hIcon = NULL;
281  m_idCmdFirst = 0;
282 
283  m_sLinkPath = NULL;
284 
286 }
#define ZeroMemory
Definition: winbase.h:1664
#define FALSE
Definition: types.h:117
#define SW_SHOWNORMAL
Definition: winuser.h:764
#define NULL
Definition: types.h:112

◆ ~CShellLink()

CShellLink::~CShellLink ( )

Definition at line 288 of file CShellLink.cpp.

289 {
290  TRACE("-- destroying IShellLink(%p)\n", this);
291 
292  ILFree(m_pPidl);
293 
295 
303 }
void WINAPI ILFree(LPITEMIDLIST pidl)
Definition: pidl.c:925
#define TRACE(s)
Definition: solgame.cpp:4
#define GetProcessHeap()
Definition: compat.h:595
VOID WINAPI SHFreeDataBlockList(LPDBLIST lpList)
Definition: clist.c:331
#define HeapFree(x, y, z)
Definition: compat.h:594

Member Function Documentation

◆ AddDataBlock()

HRESULT STDMETHODCALLTYPE CShellLink::AddDataBlock ( void pDataBlock)
virtual

Implements IShellLinkDataList.

Definition at line 2396 of file CShellLink.cpp.

2397 {
2398  if (SHAddDataBlock(&m_pDBList, (DATABLOCK_HEADER*)pDataBlock))
2399  {
2400  m_bDirty = TRUE;
2401  return S_OK;
2402  }
2403  return S_FALSE;
2404 }
#define TRUE
Definition: types.h:120
BOOL WINAPI SHAddDataBlock(LPDBLIST *lppList, const DATABLOCK_HEADER *lpNewItem)
Definition: clist.c:68
#define S_FALSE
Definition: winerror.h:2357
#define S_OK
Definition: intsafe.h:52

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

◆ AddPages()

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

Definition at line 2987 of file CShellLink.cpp.

2988 {
2990  if (hPage == NULL)
2991  {
2992  ERR("failed to create property sheet page\n");
2993  return E_FAIL;
2994  }
2995 
2996  if (!pfnAddPage(hPage, lParam))
2997  return E_FAIL;
2998 
2999  return S_OK;
3000 }
#define E_FAIL
Definition: ddrawi.h:102
struct _PSP * HPROPSHEETPAGE
Definition: mstask.idl:90
LONG_PTR LPARAM
Definition: windef.h:208
#define IDD_SHORTCUT_PROPERTIES
Definition: shresdef.h:370
#define ERR(fmt,...)
Definition: debug.h:110
#define S_OK
Definition: intsafe.h:52
#define NULL
Definition: types.h:112
HPROPSHEETPAGE SH_CreatePropertySheetPage(LPCSTR resname, DLGPROC dlgproc, LPARAM lParam, LPWSTR szTitle)
LPARAM lParam
Definition: combotst.c:139

◆ CopyDataBlock()

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

Implements IShellLinkDataList.

Definition at line 2406 of file CShellLink.cpp.

2407 {
2408  DATABLOCK_HEADER* pBlock;
2409  PVOID pDataBlock;
2410 
2411  TRACE("%p %08x %p\n", this, dwSig, ppDataBlock);
2412 
2413  *ppDataBlock = NULL;
2414 
2415  pBlock = SHFindDataBlock(m_pDBList, dwSig);
2416  if (!pBlock)
2417  {
2418  ERR("unknown datablock %08x (not found)\n", dwSig);
2419  return E_FAIL;
2420  }
2421 
2422  pDataBlock = LocalAlloc(LMEM_ZEROINIT, pBlock->cbSize);
2423  if (!pDataBlock)
2424  return E_OUTOFMEMORY;
2425 
2426  CopyMemory(pDataBlock, pBlock, pBlock->cbSize);
2427 
2428  *ppDataBlock = pDataBlock;
2429  return S_OK;
2430 }
#define E_FAIL
Definition: ddrawi.h:102
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define TRACE(s)
Definition: solgame.cpp:4
#define LMEM_ZEROINIT
Definition: winbase.h:372
#define CopyMemory
Definition: winbase.h:1662
DATABLOCK_HEADER *WINAPI SHFindDataBlock(LPDBLIST lpList, DWORD dwSignature)
Definition: clist.c:424
#define ERR(fmt,...)
Definition: debug.h:110
#define S_OK
Definition: intsafe.h:52
#define NULL
Definition: types.h:112
HLOCAL NTAPI LocalAlloc(UINT uFlags, SIZE_T dwBytes)
Definition: heapmem.c:1373

◆ CreateShortcutIcon()

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

Definition at line 3115 of file CShellLink.cpp.

3116 {
3118  const COLORREF crMask = GetSysColor(COLOR_3DFACE);
3119  HDC hDC;
3121  HICON hIcon = NULL, hNewIcon = NULL;
3123  IMAGE_ICON, cx, cy, 0);
3124 
3125  ::ExtractIconExW(wszIconPath, IconIndex, &hIcon, NULL, 1);
3126  if (!hIcon || !hShortcut || !himl)
3127  goto cleanup;
3128 
3130  if (hDC)
3131  {
3132  // create 32bpp bitmap
3133  BITMAPINFO bi;
3134  ZeroMemory(&bi, sizeof(bi));
3135  bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
3136  bi.bmiHeader.biWidth = cx;
3137  bi.bmiHeader.biHeight = cy;
3138  bi.bmiHeader.biPlanes = 1;
3139  bi.bmiHeader.biBitCount = 32;
3140  LPVOID pvBits;
3141  HBITMAP hbm = CreateDIBSection(hDC, &bi, DIB_RGB_COLORS, &pvBits, NULL, 0);
3142  if (hbm)
3143  {
3144  // draw the icon image
3145  HGDIOBJ hbmOld = SelectObject(hDC, hbm);
3146  {
3147  HBRUSH hbr = CreateSolidBrush(crMask);
3148  RECT rc = { 0, 0, cx, cy };
3149  FillRect(hDC, &rc, hbr);
3150  DeleteObject(hbr);
3151 
3152  DrawIconEx(hDC, 0, 0, hIcon, cx, cy, 0, NULL, DI_NORMAL);
3153  DrawIconEx(hDC, 0, 0, hShortcut, cx, cy, 0, NULL, DI_NORMAL);
3154  }
3155  SelectObject(hDC, hbmOld);
3156 
3157  INT iAdded = ImageList_AddMasked(himl, hbm, crMask);
3158  hNewIcon = ImageList_GetIcon(himl, iAdded, ILD_NORMAL | ILD_TRANSPARENT);
3159 
3160  DeleteObject(hbm);
3161  }
3162  DeleteDC(hDC);
3163  }
3164 
3165 cleanup:
3166  if (hIcon)
3167  DestroyIcon(hIcon);
3168  if (hShortcut)
3169  DestroyIcon(hShortcut);
3170  if (himl)
3172 
3173  return hNewIcon;
3174 }
#define MAKEINTRESOURCE
Definition: winuser.h:591
static HICON
Definition: imagelist.c:84
#define IMAGE_ICON
Definition: winuser.h:212
BITMAPINFOHEADER bmiHeader
Definition: wingdi.h:1476
BOOL WINAPI DestroyIcon(_In_ HICON)
Definition: cursoricon.c:2022
struct tagBITMAPINFOHEADER BITMAPINFOHEADER
static HDC
Definition: imagelist.c:92
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1539
#define ZeroMemory
Definition: winbase.h:1664
BOOL WINAPI DeleteObject(_In_ HGDIOBJ)
HDC WINAPI CreateCompatibleDC(_In_opt_ HDC hdc)
HIMAGELIST himl
int32_t INT
Definition: typedefs.h:58
DWORD WINAPI GetSysColor(_In_ int)
BOOL WINAPI ImageList_Destroy(HIMAGELIST himl)
Definition: imagelist.c:928
#define ILC_COLOR32
Definition: commctrl.h:358
#define COLOR_3DFACE
Definition: winuser.h:919
HIMAGELIST WINAPI ImageList_Create(INT cx, INT cy, UINT flags, INT cInitial, INT cGrow)
Definition: imagelist.c:804
HANDLE WINAPI LoadImageW(_In_opt_ HINSTANCE, _In_ LPCWSTR, _In_ UINT, _In_ int, _In_ int, _In_ UINT)
Definition: cursoricon.c:2172
UINT WINAPI ExtractIconExW(LPCWSTR lpszFile, INT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIcons)
Definition: iconcache.cpp:872
#define SM_CXICON
Definition: winuser.h:962
_Out_opt_ int _Out_opt_ int * cy
Definition: commctrl.h:585
#define IDI_SHELL_SHORTCUT
Definition: shresdef.h:551
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:1997
HICON WINAPI ImageList_GetIcon(HIMAGELIST himl, INT i, UINT fStyle)
Definition: imagelist.c:1963
DWORD COLORREF
Definition: windef.h:300
int WINAPI GetSystemMetrics(_In_ int)
static const WCHAR IconIndex[]
Definition: install.c:52
#define SM_CYICON
Definition: winuser.h:963
#define ILC_MASK
Definition: commctrl.h:351
#define DI_NORMAL
Definition: wingdi.h:72
static HDC hDC
Definition: 3dtext.c:33
#define ILD_TRANSPARENT
Definition: commctrl.h:418
#define shell32_hInstance
BOOL WINAPI DeleteDC(_In_ HDC)
HICON hIcon
Definition: msconfig.c:44
HBITMAP WINAPI CreateDIBSection(HDC hDC, CONST BITMAPINFO *BitmapInfo, UINT Usage, VOID **Bits, HANDLE hSection, DWORD dwOffset)
Definition: bitmap.c:199
_In_ HBITMAP hbm
Definition: ntgdi.h:2776
#define NULL
Definition: types.h:112
HBRUSH WINAPI CreateSolidBrush(_In_ COLORREF)
_Out_opt_ int * cx
Definition: commctrl.h:585
char * cleanup(char *str)
Definition: wpickclick.c:99
INT WINAPI ImageList_AddMasked(HIMAGELIST himl, HBITMAP hBitmap, COLORREF clrMask)
Definition: imagelist.c:563
static HBITMAP
Definition: button.c:44
#define ILD_NORMAL
Definition: commctrl.h:417
#define DIB_RGB_COLORS
Definition: wingdi.h:367
int WINAPI FillRect(HDC, LPCRECT, HBRUSH)

Referenced by OnCommand().

◆ DoOpen()

HRESULT CShellLink::DoOpen ( LPCMINVOKECOMMANDINFO  lpici)
private

Definition at line 2593 of file CShellLink.cpp.

2594 {
2595  HRESULT hr;
2596  LPWSTR args = NULL;
2598 
2599  if ( lpici->cbSize == sizeof(CMINVOKECOMMANDINFOEX) &&
2600  (lpici->fMask & CMIC_MASK_UNICODE) )
2601  {
2603  SIZE_T len = 2;
2604 
2605  if (m_sArgs)
2606  len += wcslen(m_sArgs);
2607  if (iciex->lpParametersW)
2608  len += wcslen(iciex->lpParametersW);
2609 
2610  args = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
2611  *args = 0;
2612  if (m_sArgs)
2613  wcscat(args, m_sArgs);
2614  if (iciex->lpParametersW)
2615  {
2616  wcscat(args, L" ");
2617  wcscat(args, iciex->lpParametersW);
2618  }
2619  }
2620  else if (m_sArgs != NULL)
2621  {
2622  args = strdupW(m_sArgs);
2623  }
2624 
2625  SHELLEXECUTEINFOW sei;
2626  ZeroMemory(&sei, sizeof(sei));
2627  sei.cbSize = sizeof(sei);
2629  (lpici->fMask & (SEE_MASK_NOASYNC | SEE_MASK_ASYNCOK | SEE_MASK_FLAG_NO_UI));
2630  sei.lpFile = path;
2631  sei.lpClass = m_sLinkPath;
2632  sei.nShow = m_Header.nShowCommand;
2633  sei.lpDirectory = m_sWorkDir;
2634  sei.lpParameters = args;
2635  sei.lpVerb = L"open";
2636 
2637  // HACK for ShellExecuteExW
2638  if (m_sPath && wcsstr(m_sPath, L".cpl"))
2639  sei.lpVerb = L"cplopen";
2640 
2641  if (ShellExecuteExW(&sei))
2642  hr = S_OK;
2643  else
2644  hr = E_FAIL;
2645 
2646  HeapFree(GetProcessHeap(), 0, args);
2647  HeapFree(GetProcessHeap(), 0, path);
2648 
2649  return hr;
2650 }
#define args
Definition: format.c:66
HRESULT hr
Definition: shlfolder.c:183
GLsizei const GLchar ** path
Definition: glext.h:7234
_CONST_RETURN wchar_t *__cdecl wcsstr(_In_z_ const wchar_t *_Str, _In_z_ const wchar_t *_SubStr)
#define SEE_MASK_ASYNCOK
Definition: shellapi.h:52
#define SEE_MASK_HASLINKNAME
Definition: shellapi.h:48
#define ZeroMemory
Definition: winbase.h:1664
if(dx==0 &&dy==0)
Definition: linetemp.h:174
#define E_FAIL
Definition: ddrawi.h:102
Definition: match.c:390
LPCWSTR lpDirectory
Definition: shellapi.h:332
#define SEE_MASK_NOASYNC
Definition: shellapi.h:33
#define SEE_MASK_FLAG_NO_UI
Definition: shellapi.h:36
BOOL WINAPI DECLSPEC_HOTPATCH ShellExecuteExW(LPSHELLEXECUTEINFOW sei)
Definition: shlexec.cpp:2263
#define GetProcessHeap()
Definition: compat.h:595
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
__wchar_t WCHAR
Definition: xmlstorage.h:180
LONG HRESULT
Definition: typedefs.h:79
static const WCHAR L[]
Definition: oid.c:1250
GLenum GLsizei len
Definition: glext.h:6722
#define SEE_MASK_UNICODE
Definition: shellapi.h:37
ULONG_PTR SIZE_T
Definition: typedefs.h:80
#define S_OK
Definition: intsafe.h:52
struct IContextMenu::tagCMInvokeCommandInfoEx * LPCMINVOKECOMMANDINFOEX
LPCWSTR lpParameters
Definition: shellapi.h:331
_CRTIMP wchar_t *__cdecl wcscat(_Inout_updates_z_(_String_length_(_Dest)+_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
struct IContextMenu::tagCMInvokeCommandInfoEx CMINVOKECOMMANDINFOEX
#define NULL
Definition: types.h:112
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
WCHAR * LPWSTR
Definition: xmlstorage.h:184
#define HeapFree(x, y, z)
Definition: compat.h:594

Referenced by InvokeCommand().

◆ DoOpenFileLocation()

HRESULT CShellLink::DoOpenFileLocation ( )
private

Definition at line 2544 of file CShellLink.cpp.

2545 {
2546  WCHAR szParams[MAX_PATH + 64];
2547  StringCbPrintfW(szParams, sizeof(szParams), L"/select,%s", m_sPath);
2548 
2549  INT_PTR ret;
2550  ret = reinterpret_cast<INT_PTR>(ShellExecuteW(NULL, NULL, L"explorer.exe", szParams,
2552  if (ret <= 32)
2553  {
2554  ERR("ret: %08lX\n", ret);
2555  return E_FAIL;
2556  }
2557 
2558  return S_OK;
2559 }
int32_t INT_PTR
Definition: typedefs.h:64
#define E_FAIL
Definition: ddrawi.h:102
STRSAFEAPI StringCbPrintfW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszFormat,...)
Definition: strsafe.h:557
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define MAX_PATH
Definition: compat.h:34
int ret
static const WCHAR L[]
Definition: oid.c:1250
#define ERR(fmt,...)
Definition: debug.h:110
#define S_OK
Definition: intsafe.h:52
#define NULL
Definition: types.h:112
HINSTANCE WINAPI ShellExecuteW(HWND hwnd, LPCWSTR lpVerb, LPCWSTR lpFile, LPCWSTR lpParameters, LPCWSTR lpDirectory, INT nShowCmd)
Definition: shlexec.cpp:2274

Referenced by InvokeCommand().

◆ DragEnter()

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

Implements IDropTarget.

Definition at line 3027 of file CShellLink.cpp.

3029 {
3030  TRACE("(%p)->(DataObject=%p)\n", this, pDataObject);
3031 
3032  if (*pdwEffect == DROPEFFECT_NONE)
3033  return S_OK;
3034 
3035  LPCITEMIDLIST pidlLast;
3037 
3038  HRESULT hr = SHBindToParent(m_pPidl, IID_PPV_ARG(IShellFolder, &psf), &pidlLast);
3039 
3040  if (SUCCEEDED(hr))
3041  {
3042  hr = psf->GetUIObjectOf(0, 1, &pidlLast, IID_NULL_PPV_ARG(IDropTarget, &m_DropTarget));
3043 
3044  if (SUCCEEDED(hr))
3045  hr = m_DropTarget->DragEnter(pDataObject, dwKeyState, pt, pdwEffect);
3046  else
3047  *pdwEffect = DROPEFFECT_NONE;
3048  }
3049  else
3050  *pdwEffect = DROPEFFECT_NONE;
3051 
3052  return S_OK;
3053 }
HRESULT hr
Definition: shlfolder.c:183
#define pt(x, y)
Definition: drawing.c:79
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
Definition: shtypes.idl:42
#define IID_PPV_ARG(Itype, ppType)
const DWORD DROPEFFECT_NONE
Definition: oleidl.idl:929
if SUCCEEDED(hr)
#define IID_NULL_PPV_ARG(Itype, ppType)
#define TRACE(s)
Definition: solgame.cpp:4
LONG HRESULT
Definition: typedefs.h:79
#define S_OK
Definition: intsafe.h:52
HRESULT WINAPI SHBindToParent(LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppv, LPCITEMIDLIST *ppidlLast)
Definition: pidl.c:1337

◆ DragLeave()

HRESULT STDMETHODCALLTYPE CShellLink::DragLeave ( void  )
virtual

Implements IDropTarget.

Definition at line 3065 of file CShellLink.cpp.

3066 {
3067  TRACE("(%p)\n", this);
3068  HRESULT hr = S_OK;
3069  if (m_DropTarget)
3070  {
3071  hr = m_DropTarget->DragLeave();
3073  }
3074 
3075  return hr;
3076 }
HRESULT hr
Definition: shlfolder.c:183
#define TRACE(s)
Definition: solgame.cpp:4
LONG HRESULT
Definition: typedefs.h:79
#define S_OK
Definition: intsafe.h:52
void Release()
Definition: atlcomcli.h:140

◆ DragOver()

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

Implements IDropTarget.

Definition at line 3055 of file CShellLink.cpp.

3057 {
3058  TRACE("(%p)\n", this);
3059  HRESULT hr = S_OK;
3060  if (m_DropTarget)
3061  hr = m_DropTarget->DragOver(dwKeyState, pt, pdwEffect);
3062  return hr;
3063 }
HRESULT hr
Definition: shlfolder.c:183
#define pt(x, y)
Definition: drawing.c:79
#define TRACE(s)
Definition: solgame.cpp:4
LONG HRESULT
Definition: typedefs.h:79
#define S_OK
Definition: intsafe.h:52

◆ Drop()

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

Implements IDropTarget.

Definition at line 3078 of file CShellLink.cpp.

3080 {
3081  TRACE("(%p)\n", this);
3082  HRESULT hr = S_OK;
3083  if (m_DropTarget)
3084  hr = m_DropTarget->Drop(pDataObject, dwKeyState, pt, pdwEffect);
3085 
3086  return hr;
3087 }
HRESULT hr
Definition: shlfolder.c:183
#define pt(x, y)
Definition: drawing.c:79
#define TRACE(s)
Definition: solgame.cpp:4
LONG HRESULT
Definition: typedefs.h:79
#define S_OK
Definition: intsafe.h:52

◆ Extract() [1/2]

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

Implements IExtractIconA.

Definition at line 1319 of file CShellLink.cpp.

1320 {
1321  TRACE("(%p)->(path=%s iicon=%u)\n", this, pszFile, nIconIndex);
1322 
1323  LPWSTR str = NULL;
1324  if (pszFile)
1325  {
1326  str = HEAP_strdupAtoW(GetProcessHeap(), 0, pszFile);
1327  if (!str)
1328  return E_OUTOFMEMORY;
1329  }
1330 
1331  HRESULT hr = Extract(str, nIconIndex, phiconLarge, phiconSmall, nIconSize);
1332 
1333  if (str)
1334  HeapFree(GetProcessHeap(), 0, str);
1335 
1336  return hr;
1337 }
HRESULT hr
Definition: shlfolder.c:183
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
const WCHAR * str
#define TRACE(s)
Definition: solgame.cpp:4
#define GetProcessHeap()
Definition: compat.h:595
LONG HRESULT
Definition: typedefs.h:79
#define NULL
Definition: types.h:112
WCHAR * LPWSTR
Definition: xmlstorage.h:184
#define HeapFree(x, y, z)
Definition: compat.h:594

◆ Extract() [2/2]

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

Definition at line 1761 of file CShellLink.cpp.

1762 {
1763  HRESULT hr = NOERROR;
1764  UINT cxyLarge = LOWORD(nIconSize), cxySmall = HIWORD(nIconSize);
1765 
1766  if (phiconLarge)
1767  {
1768  *phiconLarge = NULL;
1769  PrivateExtractIconsW(pszFile, nIconIndex, cxyLarge, cxyLarge, phiconLarge, NULL, 1, 0);
1770 
1771  if (*phiconLarge == NULL)
1772  hr = S_FALSE;
1773  }
1774 
1775  if (phiconSmall)
1776  {
1777  *phiconSmall = NULL;
1778  PrivateExtractIconsW(pszFile, nIconIndex, cxySmall, cxySmall, phiconSmall, NULL, 1, 0);
1779 
1780  if (*phiconSmall == NULL)
1781  hr = S_FALSE;
1782  }
1783 
1784  if (hr == S_FALSE)
1785  {
1786  if (phiconLarge && *phiconLarge)
1787  {
1788  DestroyIcon(*phiconLarge);
1789  *phiconLarge = NULL;
1790  }
1791  if (phiconSmall && *phiconSmall)
1792  {
1793  DestroyIcon(*phiconSmall);
1794  *phiconSmall = NULL;
1795  }
1796  }
1797 
1798  return hr;
1799 }
HRESULT hr
Definition: shlfolder.c:183
#define NOERROR
Definition: winerror.h:2354
BOOL WINAPI DestroyIcon(_In_ HICON)
Definition: cursoricon.c:2022
#define S_FALSE
Definition: winerror.h:2357
LONG HRESULT
Definition: typedefs.h:79
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)
unsigned int UINT
Definition: ndis.h:50
#define NULL
Definition: types.h:112
#define HIWORD(l)
Definition: typedefs.h:247
#define LOWORD(l)
Definition: pedump.c:82

◆ GetAdvertiseInfo()

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

Definition at line 605 of file CShellLink.cpp.

606 {
607  LPEXP_DARWIN_LINK pInfo;
608 
609  *str = NULL;
610 
612  if (!pInfo)
613  return E_FAIL;
614 
615  /* Make sure that the size of the structure is valid */
616  if (pInfo->dbh.cbSize != sizeof(*pInfo))
617  {
618  ERR("Ooops. This structure is not as expected...\n");
619  return E_FAIL;
620  }
621 
622  TRACE("dwSig %08x string = '%s'\n", pInfo->dbh.dwSignature, debugstr_w(pInfo->szwDarwinID));
623 
624  *str = pInfo->szwDarwinID;
625  return S_OK;
626 }
#define E_FAIL
Definition: ddrawi.h:102
#define debugstr_w
Definition: kernel32.h:32
const WCHAR * str
struct EXP_DARWIN_LINK * LPEXP_DARWIN_LINK
#define TRACE(s)
Definition: solgame.cpp:4
DATABLOCK_HEADER *WINAPI SHFindDataBlock(LPDBLIST lpList, DWORD dwSignature)
Definition: clist.c:424
#define ERR(fmt,...)
Definition: debug.h:110
#define S_OK
Definition: intsafe.h:52
#define NULL
Definition: types.h:112

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

◆ GetArguments() [1/2]

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

Definition at line 1203 of file CShellLink.cpp.

1204 {
1205  TRACE("(%p)->(%p len=%u)\n", this, pszArgs, cchMaxPath);
1206 
1207  if (cchMaxPath)
1208  *pszArgs = 0;
1209 
1210  if (m_sArgs)
1212  pszArgs, cchMaxPath, NULL, NULL);
1213 
1214  return S_OK;
1215 }
#define WideCharToMultiByte
Definition: compat.h:111
#define CP_ACP
Definition: compat.h:109
#define TRACE(s)
Definition: solgame.cpp:4
#define S_OK
Definition: intsafe.h:52
#define NULL
Definition: types.h:112

◆ GetArguments() [2/2]

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

Definition at line 1625 of file CShellLink.cpp.

1626 {
1627  TRACE("(%p)->(%p len=%u)\n", this, pszArgs, cchMaxPath);
1628 
1629  if (cchMaxPath)
1630  *pszArgs = 0;
1631 
1632  if (m_sArgs)
1633  lstrcpynW(pszArgs, m_sArgs, cchMaxPath);
1634 
1635  return S_OK;
1636 }
#define lstrcpynW
Definition: compat.h:597
#define TRACE(s)
Definition: solgame.cpp:4
#define S_OK
Definition: intsafe.h:52

◆ GetClassID()

HRESULT STDMETHODCALLTYPE CShellLink::GetClassID ( CLSID pclsid)
virtual

Implements IPersist.

Definition at line 305 of file CShellLink.cpp.

306 {
307  TRACE("%p %p\n", this, pclsid);
308 
309  if (pclsid == NULL)
310  return E_POINTER;
311  *pclsid = CLSID_ShellLink;
312  return S_OK;
313 }
#define TRACE(s)
Definition: solgame.cpp:4
#define S_OK
Definition: intsafe.h:52
#define NULL
Definition: types.h:112
#define E_POINTER
Definition: winerror.h:2365

◆ GetCommandString()

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

Implements IContextMenu.

Definition at line 2652 of file CShellLink.cpp.

2653 {
2654  FIXME("%p %lu %u %p %p %u\n", this, idCmd, uType, pwReserved, pszName, cchMax);
2655  return E_NOTIMPL;
2656 }
#define FIXME(fmt,...)
Definition: debug.h:111
UINT cchMax
#define E_NOTIMPL
Definition: ddrawi.h:99

◆ GetCurFile()

HRESULT STDMETHODCALLTYPE CShellLink::GetCurFile ( LPOLESTR ppszFileName)
virtual

Implements IPersistFile.

Definition at line 393 of file CShellLink.cpp.

394 {
395  *ppszFileName = NULL;
396 
397  if (!m_sLinkPath)
398  {
399  /* IPersistFile::GetCurFile called before IPersistFile::Save */
400  return S_FALSE;
401  }
402 
403  *ppszFileName = (LPOLESTR)CoTaskMemAlloc((wcslen(m_sLinkPath) + 1) * sizeof(WCHAR));
404  if (!*ppszFileName)
405  {
406  /* out of memory */
407  return E_OUTOFMEMORY;
408  }
409 
410  /* copy last saved filename */
411  wcscpy(*ppszFileName, m_sLinkPath);
412 
413  return S_OK;
414 }
static LPOLESTR
Definition: stg_prop.c:27
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define S_FALSE
Definition: winerror.h:2357
__wchar_t WCHAR
Definition: xmlstorage.h:180
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
#define S_OK
Definition: intsafe.h:52
#define NULL
Definition: types.h:112
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
LPVOID WINAPI CoTaskMemAlloc(SIZE_T size)
Definition: ifs.c:426

◆ GetDescription() [1/2]

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

Definition at line 1139 of file CShellLink.cpp.

1140 {
1141  TRACE("(%p)->(%p len=%u)\n", this, pszName, cchMaxName);
1142 
1143  if (cchMaxName)
1144  *pszName = 0;
1145 
1146  if (m_sDescription)
1148  pszName, cchMaxName, NULL, NULL);
1149 
1150  return S_OK;
1151 }
#define WideCharToMultiByte
Definition: compat.h:111
#define CP_ACP
Definition: compat.h:109
#define TRACE(s)
Definition: solgame.cpp:4
#define S_OK
Definition: intsafe.h:52
#define NULL
Definition: types.h:112

◆ GetDescription() [2/2]

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

Definition at line 1565 of file CShellLink.cpp.

1566 {
1567  TRACE("(%p)->(%p len=%u)\n", this, pszName, cchMaxName);
1568 
1569  *pszName = 0;
1570  if (m_sDescription)
1571  lstrcpynW(pszName, m_sDescription, cchMaxName);
1572 
1573  return S_OK;
1574 }
#define lstrcpynW
Definition: compat.h:597
#define TRACE(s)
Definition: solgame.cpp:4
#define S_OK
Definition: intsafe.h:52

◆ GetFlags()

HRESULT STDMETHODCALLTYPE CShellLink::GetFlags ( DWORD pdwFlags)
virtual

Implements IShellLinkDataList.

Definition at line 2442 of file CShellLink.cpp.

2443 {
2444  TRACE("%p %p\n", this, pdwFlags);
2445  *pdwFlags = m_Header.dwFlags;
2446  return S_OK;
2447 }
#define TRACE(s)
Definition: solgame.cpp:4
#define S_OK
Definition: intsafe.h:52

◆ GetHotkey()

HRESULT STDMETHODCALLTYPE CShellLink::GetHotkey ( WORD pwHotkey)
virtual

Implements IShellLinkA.

Definition at line 1235 of file CShellLink.cpp.

1236 {
1237  TRACE("(%p)->(%p)(0x%08x)\n", this, pwHotkey, m_Header.wHotKey);
1238  *pwHotkey = m_Header.wHotKey;
1239  return S_OK;
1240 }
#define TRACE(s)
Definition: solgame.cpp:4
#define S_OK
Definition: intsafe.h:52

◆ GetIconLocation() [1/4]

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

Definition at line 1269 of file CShellLink.cpp.

1270 {
1271  HRESULT hr;
1272  LPWSTR pszIconPathW;
1273 
1274  TRACE("(%p)->(%p len=%u iicon=%p)\n", this, pszIconPath, cchIconPath, piIcon);
1275 
1276  /* Allocate a temporary UNICODE buffer */
1277  pszIconPathW = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, cchIconPath * sizeof(WCHAR));
1278  if (!pszIconPathW)
1279  return E_OUTOFMEMORY;
1280 
1281  /* Call the UNICODE function */
1282  hr = GetIconLocation(pszIconPathW, cchIconPath, piIcon);
1283 
1284  /* Convert the file path back to ANSI */
1285  WideCharToMultiByte(CP_ACP, 0, pszIconPathW, -1,
1286  pszIconPath, cchIconPath, NULL, NULL);
1287 
1288  /* Free the temporary buffer */
1289  HeapFree(GetProcessHeap(), 0, pszIconPathW);
1290 
1291  return hr;
1292 }
#define WideCharToMultiByte
Definition: compat.h:111
HRESULT hr
Definition: shlfolder.c:183
#define CP_ACP
Definition: compat.h:109
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define TRACE(s)
Definition: solgame.cpp:4
#define GetProcessHeap()
Definition: compat.h:595
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
__wchar_t WCHAR
Definition: xmlstorage.h:180
LONG HRESULT
Definition: typedefs.h:79
#define NULL
Definition: types.h:112
WCHAR * LPWSTR
Definition: xmlstorage.h:184
#define HeapFree(x, y, z)
Definition: compat.h:594

Referenced by GetIconLocation().

◆ GetIconLocation() [2/4]

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

Definition at line 1656 of file CShellLink.cpp.

1657 {
1658  TRACE("(%p)->(%p len=%u iicon=%p)\n", this, pszIconPath, cchIconPath, piIcon);
1659 
1660  if (cchIconPath)
1661  *pszIconPath = 0;
1662 
1663  *piIcon = 0;
1664 
1665  /* Update the original icon path location */
1667  {
1669 
1670  /* Search for an icon environment block */
1671  LPEXP_SZ_LINK pInfo;
1673  if (pInfo && (pInfo->cbSize == sizeof(*pInfo)))
1674  {
1676 
1679 
1681  if (!m_sIcoPath)
1682  return E_OUTOFMEMORY;
1683 
1685 
1686  m_bDirty = TRUE;
1687  }
1688  }
1689 
1690  *piIcon = m_Header.nIconIndex;
1691 
1692  if (m_sIcoPath)
1693  lstrcpynW(pszIconPath, m_sIcoPath, cchIconPath);
1694 
1695  return S_OK;
1696 }
struct EXP_SZ_LINK * LPEXP_SZ_LINK
#define TRUE
Definition: types.h:120
#define EXP_SZ_ICON_SIG
Definition: shlobj.h:1898
#define lstrcpynW
Definition: compat.h:597
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define TRACE(s)
Definition: solgame.cpp:4
#define GetProcessHeap()
Definition: compat.h:595
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define _countof(array)
Definition: sndvol32.h:68
#define MAX_PATH
Definition: compat.h:34
DATABLOCK_HEADER *WINAPI SHFindDataBlock(LPDBLIST lpList, DWORD dwSignature)
Definition: clist.c:424
DWORD WINAPI SHExpandEnvironmentStringsW(LPCWSTR, LPWSTR, DWORD)
#define S_OK
Definition: intsafe.h:52
LPCWSTR szPath
Definition: env.c:37
#define HeapFree(x, y, z)
Definition: compat.h:594

◆ GetIconLocation() [3/4]

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

Definition at line 1294 of file CShellLink.cpp.

1295 {
1296  HRESULT hr;
1297  LPWSTR pszIconFileW;
1298 
1299  TRACE("(%p)->(%u %p len=%u piIndex=%p pwFlags=%p)\n", this, uFlags, pszIconFile, cchMax, piIndex, pwFlags);
1300 
1301  /* Allocate a temporary UNICODE buffer */
1302  pszIconFileW = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, cchMax * sizeof(WCHAR));
1303  if (!pszIconFileW)
1304  return E_OUTOFMEMORY;
1305 
1306  /* Call the UNICODE function */
1307  hr = GetIconLocation(uFlags, pszIconFileW, cchMax, piIndex, pwFlags);
1308 
1309  /* Convert the file path back to ANSI */
1310  WideCharToMultiByte(CP_ACP, 0, pszIconFileW, -1,
1311  pszIconFile, cchMax, NULL, NULL);
1312 
1313  /* Free the temporary buffer */
1314  HeapFree(GetProcessHeap(), 0, pszIconFileW);
1315 
1316  return hr;
1317 }
#define WideCharToMultiByte
Definition: compat.h:111
HRESULT hr
Definition: shlfolder.c:183
#define CP_ACP
Definition: compat.h:109
UINT uFlags
Definition: api.c:59
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define TRACE(s)
Definition: solgame.cpp:4
#define GetProcessHeap()
Definition: compat.h:595
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
__wchar_t WCHAR
Definition: xmlstorage.h:180
LONG HRESULT
Definition: typedefs.h:79
UINT cchMax
#define NULL
Definition: types.h:112
WCHAR * LPWSTR
Definition: xmlstorage.h:184
#define HeapFree(x, y, z)
Definition: compat.h:594

◆ GetIconLocation() [4/4]

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

Definition at line 1720 of file CShellLink.cpp.

1721 {
1722  HRESULT hr;
1723 
1724  pszIconFile[0] = UNICODE_NULL;
1725 
1726  /*
1727  * It is possible for a shell link to point to another shell link,
1728  * and in particular there is the possibility to point to itself.
1729  * Now, suppose we ask such a link to retrieve its associated icon.
1730  * This function would be called, and due to COM would be called again
1731  * recursively. To solve this issue, we forbid calling GetIconLocation()
1732  * with GIL_FORSHORTCUT set in uFlags, as done by Windows (shown by tests).
1733  */
1734  if (uFlags & GIL_FORSHORTCUT)
1735  return E_INVALIDARG;
1736 
1737  /*
1738  * Now, we set GIL_FORSHORTCUT so that: i) we allow the icon extractor
1739  * of the target to give us a suited icon, and ii) we protect ourselves
1740  * against recursive call.
1741  */
1742  uFlags |= GIL_FORSHORTCUT;
1743 
1744  if (uFlags & GIL_DEFAULTICON)
1745  return S_FALSE;
1746 
1747  hr = GetIconLocation(pszIconFile, cchMax, piIndex);
1748  if (FAILED(hr) || pszIconFile[0] == UNICODE_NULL)
1749  {
1750  hr = SHELL_PidlGetIconLocationW(m_pPidl, uFlags, pszIconFile, cchMax, piIndex, pwFlags);
1751  }
1752  else
1753  {
1754  *pwFlags = GIL_NOTFILENAME | GIL_PERCLASS;
1755  }
1756 
1757  return hr;
1758 }
HRESULT hr
Definition: shlfolder.c:183
UINT uFlags
Definition: api.c:59
#define UNICODE_NULL
#define S_FALSE
Definition: winerror.h:2357
#define E_INVALIDARG
Definition: ddrawi.h:101
LONG HRESULT
Definition: typedefs.h:79
UINT cchMax

◆ GetIDList()

HRESULT STDMETHODCALLTYPE CShellLink::GetIDList ( PIDLIST_ABSOLUTE ppidl)
virtual

Implements IShellLinkA.

Definition at line 1119 of file CShellLink.cpp.

1120 {
1121  TRACE("(%p)->(ppidl=%p)\n", this, ppidl);
1122 
1123  if (!m_pPidl)
1124  {
1125  *ppidl = NULL;
1126  return S_FALSE;
1127  }
1128 
1129  *ppidl = ILClone(m_pPidl);
1130  return S_OK;
1131 }
#define S_FALSE
Definition: winerror.h:2357
#define TRACE(s)
Definition: solgame.cpp:4
#define S_OK
Definition: intsafe.h:52
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
Definition: pidl.c:228
#define NULL
Definition: types.h:112

◆ GetPath() [1/2]

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

Definition at line 1070 of file CShellLink.cpp.

1071 {
1072  HRESULT hr;
1073  LPWSTR pszFileW;
1074  WIN32_FIND_DATAW wfd;
1075 
1076  TRACE("(%p)->(pfile=%p len=%u find_data=%p flags=%u)(%s)\n",
1077  this, pszFile, cchMaxPath, pfd, fFlags, debugstr_w(m_sPath));
1078 
1079  /* Allocate a temporary UNICODE buffer */
1080  pszFileW = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, cchMaxPath * sizeof(WCHAR));
1081  if (!pszFileW)
1082  return E_OUTOFMEMORY;
1083 
1084  /* Call the UNICODE function */
1085  hr = GetPath(pszFileW, cchMaxPath, &wfd, fFlags);
1086 
1087  /* Convert the file path back to ANSI */
1088  WideCharToMultiByte(CP_ACP, 0, pszFileW, -1,
1089  pszFile, cchMaxPath, NULL, NULL);
1090 
1091  /* Free the temporary buffer */
1092  HeapFree(GetProcessHeap(), 0, pszFileW);
1093 
1094  if (pfd)
1095  {
1096  ZeroMemory(pfd, sizeof(*pfd));
1097 
1098  /* Copy the file data if a file path was returned */
1099  if (*pszFile)
1100  {
1101  DWORD len;
1102 
1103  /* Copy the fixed part */
1104  CopyMemory(pfd, &wfd, FIELD_OFFSET(WIN32_FIND_DATAA, cFileName));
1105 
1106  /* Convert the file names to ANSI */
1107  len = lstrlenW(wfd.cFileName);
1108  WideCharToMultiByte(CP_ACP, 0, wfd.cFileName, len + 1,
1109  pfd->cFileName, sizeof(pfd->cFileName), NULL, NULL);
1110  len = lstrlenW(wfd.cAlternateFileName);
1111  WideCharToMultiByte(CP_ACP, 0, wfd.cAlternateFileName, len + 1,
1112  pfd->cAlternateFileName, sizeof(pfd->cAlternateFileName), NULL, NULL);
1113  }
1114  }
1115 
1116  return hr;
1117 }
#define WideCharToMultiByte
Definition: compat.h:111
HRESULT hr
Definition: shlfolder.c:183
#define CP_ACP
Definition: compat.h:109
#define ZeroMemory
Definition: winbase.h:1664
#define lstrlenW
Definition: compat.h:609
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define debugstr_w
Definition: kernel32.h:32
#define TRACE(s)
Definition: solgame.cpp:4
#define GetProcessHeap()
Definition: compat.h:595
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
__wchar_t WCHAR
Definition: xmlstorage.h:180
LONG HRESULT
Definition: typedefs.h:79
#define CopyMemory
Definition: winbase.h:1662
unsigned long DWORD
Definition: ntddk_ex.h:95
static PIXELFORMATDESCRIPTOR pfd
Definition: ssstars.c:67
GLenum GLsizei len
Definition: glext.h:6722
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
#define NULL
Definition: types.h:112
WCHAR * LPWSTR
Definition: xmlstorage.h:184
#define HeapFree(x, y, z)
Definition: compat.h:594

◆ GetPath() [2/2]

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

Definition at line 1484 of file CShellLink.cpp.

1485 {
1487 
1488  TRACE("(%p)->(pfile=%p len=%u find_data=%p flags=%u)(%s)\n",
1489  this, pszFile, cchMaxPath, pfd, fFlags, debugstr_w(m_sPath));
1490 
1491  if (cchMaxPath)
1492  *pszFile = 0;
1493  // FIXME: What if cchMaxPath == 0 , or pszFile == NULL ??
1494 
1495  // FIXME: What about Darwin??
1496 
1497  /*
1498  * Retrieve the path to the target from the PIDL (if we have one).
1499  * NOTE: Do NOT use the cached path (m_sPath from link info).
1500  */
1502  {
1503  if (fFlags & SLGP_SHORTPATH)
1505  // FIXME: Add support for SLGP_UNCPRIORITY
1506  }
1507  else
1508  {
1509  *buffer = 0;
1510  }
1511 
1512  /* If we have a FindData structure, initialize it */
1513  if (pfd)
1514  {
1515  ZeroMemory(pfd, sizeof(*pfd));
1516 
1517  /* Copy the file data if the target is a file path */
1518  if (*buffer)
1519  {
1520  pfd->dwFileAttributes = m_Header.dwFileAttributes;
1521  pfd->ftCreationTime = m_Header.ftCreationTime;
1522  pfd->ftLastAccessTime = m_Header.ftLastAccessTime;
1523  pfd->ftLastWriteTime = m_Header.ftLastWriteTime;
1524  pfd->nFileSizeHigh = 0;
1525  pfd->nFileSizeLow = m_Header.nFileSizeLow;
1526 
1527  /*
1528  * Build temporarily a short path in pfd->cFileName (of size MAX_PATH),
1529  * then extract and store the short file name in pfd->cAlternateFileName.
1530  */
1531  GetShortPathNameW(buffer, pfd->cFileName, _countof(pfd->cFileName));
1532  lstrcpynW(pfd->cAlternateFileName,
1533  PathFindFileNameW(pfd->cFileName),
1534  _countof(pfd->cAlternateFileName));
1535 
1536  /* Now extract and store the long file name in pfd->cFileName */
1537  lstrcpynW(pfd->cFileName,
1539  _countof(pfd->cFileName));
1540  }
1541  }
1542 
1543  /* Finally check if we have a raw path the user actually wants to retrieve */
1544  if ((fFlags & SLGP_RAWPATH) && (m_Header.dwFlags & SLDF_HAS_EXP_SZ))
1545  {
1546  /* Search for a target environment block */
1547  LPEXP_SZ_LINK pInfo;
1549  if (pInfo && (pInfo->cbSize == sizeof(*pInfo)))
1550  lstrcpynW(buffer, pInfo->szwTarget, cchMaxPath);
1551  }
1552 
1553  /* For diagnostics purposes only... */
1554  // NOTE: SLGP_UNCPRIORITY is unsupported
1555  fFlags &= ~(SLGP_RAWPATH | SLGP_SHORTPATH);
1556  if (fFlags) FIXME("(%p): Unsupported flags %lu\n", this, fFlags);
1557 
1558  /* Copy the data back to the user */
1559  if (*buffer)
1560  lstrcpynW(pszFile, buffer, cchMaxPath);
1561 
1562  return (*buffer ? S_OK : S_FALSE);
1563 }
struct EXP_SZ_LINK * LPEXP_SZ_LINK
BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath)
Definition: pidl.c:1294
#define ZeroMemory
Definition: winbase.h:1664
GLuint buffer
Definition: glext.h:5915
#define lstrcpynW
Definition: compat.h:597
#define debugstr_w
Definition: kernel32.h:32
#define FIXME(fmt,...)
Definition: debug.h:111
#define S_FALSE
Definition: winerror.h:2357
LPWSTR WINAPI PathFindFileNameW(LPCWSTR lpszPath)
Definition: path.c:394
#define TRACE(s)
Definition: solgame.cpp:4
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define _countof(array)
Definition: sndvol32.h:68
DWORD WINAPI GetShortPathNameW(IN LPCWSTR lpszLongPath, OUT LPWSTR lpszShortPath, IN DWORD cchBuffer)
Definition: path.c:1832
#define MAX_PATH
Definition: compat.h:34
DATABLOCK_HEADER *WINAPI SHFindDataBlock(LPDBLIST lpList, DWORD dwSignature)
Definition: clist.c:424
static PIXELFORMATDESCRIPTOR pfd
Definition: ssstars.c:67
#define S_OK
Definition: intsafe.h:52
#define EXP_SZ_LINK_SIG
Definition: shlobj.h:1890

◆ GetShowCmd()

HRESULT STDMETHODCALLTYPE CShellLink::GetShowCmd ( INT piShowCmd)
virtual

Definition at line 1252 of file CShellLink.cpp.

1253 {
1254  TRACE("(%p)->(%p) %d\n", this, piShowCmd, m_Header.nShowCommand);
1255  *piShowCmd = m_Header.nShowCommand;
1256  return S_OK;
1257 }
#define TRACE(s)
Definition: solgame.cpp:4
#define S_OK
Definition: intsafe.h:52

◆ GetSite()

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

Definition at line 3017 of file CShellLink.cpp.

3018 {
3019  TRACE("%p %s %p\n", this, debugstr_guid(&iid), ppvSite);
3020 
3021  if (m_site == NULL)
3022  return E_FAIL;
3023 
3024  return m_site->QueryInterface(iid, ppvSite);
3025 }
#define E_FAIL
Definition: ddrawi.h:102
#define debugstr_guid
Definition: kernel32.h:35
#define TRACE(s)
Definition: solgame.cpp:4
#define NULL
Definition: types.h:112

◆ GetSizeMax()

HRESULT STDMETHODCALLTYPE CShellLink::GetSizeMax ( ULARGE_INTEGER pcbSize)
virtual

Implements IPersistStream.

Definition at line 1002 of file CShellLink.cpp.

1003 {
1004  TRACE("(%p)\n", this);
1005  return E_NOTIMPL;
1006 }
#define TRACE(s)
Definition: solgame.cpp:4
#define E_NOTIMPL
Definition: ddrawi.h:99

◆ GetWorkingDirectory() [1/2]

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

Definition at line 1171 of file CShellLink.cpp.

1172 {
1173  TRACE("(%p)->(%p len=%u)\n", this, pszDir, cchMaxPath);
1174 
1175  if (cchMaxPath)
1176  *pszDir = 0;
1177 
1178  if (m_sWorkDir)
1180  pszDir, cchMaxPath, NULL, NULL);
1181 
1182  return S_OK;
1183 }
#define WideCharToMultiByte
Definition: compat.h:111
#define CP_ACP
Definition: compat.h:109
#define TRACE(s)
Definition: solgame.cpp:4
_In_ LPCSTR pszDir
Definition: shellapi.h:582
#define S_OK
Definition: intsafe.h:52
#define NULL
Definition: types.h:112

◆ GetWorkingDirectory() [2/2]

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

Definition at line 1594 of file CShellLink.cpp.

1595 {
1596  TRACE("(%p)->(%p len %u)\n", this, pszDir, cchMaxPath);
1597 
1598  if (cchMaxPath)
1599  *pszDir = 0;
1600 
1601  if (m_sWorkDir)
1602  lstrcpynW(pszDir, m_sWorkDir, cchMaxPath);
1603 
1604  return S_OK;
1605 }
#define lstrcpynW
Definition: compat.h:597
#define TRACE(s)
Definition: solgame.cpp:4
_In_ LPCSTR pszDir
Definition: shellapi.h:582
#define S_OK
Definition: intsafe.h:52

◆ Initialize()

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

Implements IShellExtInit.

Definition at line 2466 of file CShellLink.cpp.

2467 {
2468  TRACE("%p %p %p %p\n", this, pidlFolder, pdtobj, hkeyProgID);
2469 
2470  if (!pdtobj)
2471  return E_FAIL;
2472 
2473  FORMATETC format;
2474  format.cfFormat = CF_HDROP;
2475  format.ptd = NULL;
2476  format.dwAspect = DVASPECT_CONTENT;
2477  format.lindex = -1;
2478  format.tymed = TYMED_HGLOBAL;
2479 
2480  STGMEDIUM stgm;
2481  HRESULT hr = pdtobj->GetData(&format, &stgm);
2482  if (FAILED(hr))
2483  return hr;
2484 
2485  UINT count = DragQueryFileW((HDROP)stgm.hGlobal, -1, NULL, 0);
2486  if (count == 1)
2487  {
2488  count = DragQueryFileW((HDROP)stgm.hGlobal, 0, NULL, 0);
2489  count++;
2490  LPWSTR path = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, count * sizeof(WCHAR));
2491  if (path)
2492  {
2493  count = DragQueryFileW((HDROP)stgm.hGlobal, 0, path, count);
2494  hr = Load(path, 0);
2495  HeapFree(GetProcessHeap(), 0, path);
2496  }
2497  }
2498  ReleaseStgMedium(&stgm);
2499 
2500  return S_OK;
2501 }
HRESULT hr
Definition: shlfolder.c:183
void WINAPI ReleaseStgMedium(STGMEDIUM *pmedium)
Definition: ole2.c:2033
GLuint GLuint GLsizei count
Definition: gl.h:1545
HRESULT GetData([in, unique] FORMATETC *pformatetcIn, [out] STGMEDIUM *pmedium)
#define E_FAIL
Definition: ddrawi.h:102
GLint GLint GLsizei GLsizei GLsizei GLint GLenum format
Definition: gl.h:1546
#define CF_HDROP
Definition: constants.h:410
#define TRACE(s)
Definition: solgame.cpp:4
#define GetProcessHeap()
Definition: compat.h:595
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
__wchar_t WCHAR
Definition: xmlstorage.h:180
LONG HRESULT
Definition: typedefs.h:79
#define S_OK
Definition: intsafe.h:52
unsigned int UINT
Definition: ndis.h:50
#define NULL
Definition: types.h:112
WCHAR * LPWSTR
Definition: xmlstorage.h:184
UINT WINAPI DragQueryFileW(HDROP hDrop, UINT lFile, LPWSTR lpszwFile, UINT lLength)
Definition: shellole.c:627
#define HeapFree(x, y, z)
Definition: compat.h:594

◆ InvokeCommand()

HRESULT STDMETHODCALLTYPE CShellLink::InvokeCommand ( LPCMINVOKECOMMANDINFO  lpici)
virtual

Implements IContextMenu.

Definition at line 2561 of file CShellLink.cpp.

2562 {
2563  TRACE("%p %p\n", this, lpici);
2564 
2565  if (lpici->cbSize < sizeof(CMINVOKECOMMANDINFO))
2566  return E_INVALIDARG;
2567 
2568  // NOTE: We could use lpici->hwnd (certainly in case lpici->fMask doesn't contain CMIC_MASK_FLAG_NO_UI)
2569  // as the parent window handle... ?
2570  /* FIXME: get using interface set from IObjectWithSite?? */
2571  // NOTE: We might need an extended version of Resolve that provides us with paths...
2572  HRESULT hr = Resolve(lpici->hwnd, 0);
2573  if (FAILED(hr))
2574  {
2575  TRACE("failed to resolve component with error 0x%08x", hr);
2576  return hr;
2577  }
2578 
2579  UINT idCmd = LOWORD(lpici->lpVerb);
2580  TRACE("idCmd: %d\n", idCmd);
2581 
2582  switch (idCmd)
2583  {
2584  case IDCMD_OPEN:
2585  return DoOpen(lpici);
2587  return DoOpenFileLocation();
2588  default:
2589  return E_NOTIMPL;
2590  }
2591 }
HRESULT hr
Definition: shlfolder.c:183
struct IContextMenu::tagCMINVOKECOMMANDINFO CMINVOKECOMMANDINFO
#define E_INVALIDARG
Definition: ddrawi.h:101
#define TRACE(s)
Definition: solgame.cpp:4
LONG HRESULT
Definition: typedefs.h:79
#define E_NOTIMPL
Definition: ddrawi.h:99
unsigned int UINT
Definition: ndis.h:50
#define LOWORD(l)
Definition: pedump.c:82

◆ IsDirty()

HRESULT STDMETHODCALLTYPE CShellLink::IsDirty ( void  )
virtual

Implements IPersistStream.

Definition at line 318 of file CShellLink.cpp.

319 {
320  TRACE("(%p)\n", this);
321  return (m_bDirty ? S_OK : S_FALSE);
322 }
#define S_FALSE
Definition: winerror.h:2357
#define TRACE(s)
Definition: solgame.cpp:4
#define S_OK
Definition: intsafe.h:52

◆ Load() [1/2]

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

Implements IPersistFile.

Definition at line 324 of file CShellLink.cpp.

325 {
326  TRACE("(%p, %s, %x)\n", this, debugstr_w(pszFileName), dwMode);
327 
328  if (dwMode == 0)
329  dwMode = STGM_READ | STGM_SHARE_DENY_WRITE;
330 
331  CComPtr<IStream> stm;
332  HRESULT hr = SHCreateStreamOnFileW(pszFileName, dwMode, &stm);
333  if (SUCCEEDED(hr))
334  {
337  hr = Load(stm);
339  m_bDirty = FALSE;
340  }
341  TRACE("-- returning hr %08x\n", hr);
342  return hr;
343 }
HRESULT hr
Definition: shlfolder.c:183
#define FALSE
Definition: types.h:117
if SUCCEEDED(hr)
#define debugstr_w
Definition: kernel32.h:32
WORD WORD PSZ PSZ pszFileName
Definition: vdmdbg.h:41
#define STGM_READ
Definition: objbase.h:916
#define TRACE(s)
Definition: solgame.cpp:4
#define GetProcessHeap()
Definition: compat.h:595
LONG HRESULT
Definition: typedefs.h:79
HRESULT WINAPI SHCreateStreamOnFileW(LPCWSTR lpszPath, DWORD dwMode, IStream **lppStream)
Definition: istream.c:484
#define STGM_SHARE_DENY_WRITE
Definition: objbase.h:921
#define HeapFree(x, y, z)
Definition: compat.h:594

Referenced by Initialize().

◆ Load() [2/2]

HRESULT STDMETHODCALLTYPE CShellLink::Load ( IStream stm)
virtual

Implements IPersistStream.

Definition at line 631 of file CShellLink.cpp.

632 {
633  TRACE("%p %p\n", this, stm);
634 
635  if (!stm)
636  return STG_E_INVALIDPOINTER;
637 
638  /* Free all the old stuff */
639  Reset();
640 
641  ULONG dwBytesRead = 0;
642  HRESULT hr = stm->Read(&m_Header, sizeof(m_Header), &dwBytesRead);
643  if (FAILED(hr))
644  return hr;
645 
646  if (dwBytesRead != sizeof(m_Header))
647  return E_FAIL;
648  if (m_Header.dwSize != sizeof(m_Header))
649  return E_FAIL;
650  if (!IsEqualIID(m_Header.clsid, CLSID_ShellLink))
651  return E_FAIL;
652 
653  /* Load the new data in order */
654 
655  if (TRACE_ON(shell))
656  {
657  SYSTEMTIME stCreationTime;
658  SYSTEMTIME stLastAccessTime;
659  SYSTEMTIME stLastWriteTime;
660  WCHAR sTemp[MAX_PATH];
661 
662  FileTimeToSystemTime(&m_Header.ftCreationTime, &stCreationTime);
663  FileTimeToSystemTime(&m_Header.ftLastAccessTime, &stLastAccessTime);
664  FileTimeToSystemTime(&m_Header.ftLastWriteTime, &stLastWriteTime);
665 
667  NULL, sTemp, _countof(sTemp));
668  TRACE("-- stCreationTime: %s\n", debugstr_w(sTemp));
670  NULL, sTemp, _countof(sTemp));
671  TRACE("-- stLastAccessTime: %s\n", debugstr_w(sTemp));
673  NULL, sTemp, _countof(sTemp));
674  TRACE("-- stLastWriteTime: %s\n", debugstr_w(sTemp));
675  }
676 
677  /* load all the new stuff */
679  {
680  hr = ILLoadFromStream(stm, &m_pPidl);
681  if (FAILED(hr))
682  return hr;
683  }
684  pdump(m_pPidl);
685 
686  /* Load the location information... */
688  {
690  if (FAILED(hr))
691  return hr;
692  }
693  /* ... but if it is required not to use it, clear it */
695  {
697  m_sPath = NULL;
698  ZeroMemory(&volume, sizeof(volume));
699  }
700 
701  BOOL unicode = !!(m_Header.dwFlags & SLDF_UNICODE);
702 
704  {
705  hr = Stream_LoadString(stm, unicode, &m_sDescription);
706  if (FAILED(hr))
707  return hr;
708  TRACE("Description -> %s\n", debugstr_w(m_sDescription));
709  }
710 
712  {
713  hr = Stream_LoadString(stm, unicode, &m_sPathRel);
714  if (FAILED(hr))
715  return hr;
716  TRACE("Relative Path-> %s\n", debugstr_w(m_sPathRel));
717  }
718 
720  {
721  hr = Stream_LoadString(stm, unicode, &m_sWorkDir);
722  if (FAILED(hr))
723  return hr;
725  TRACE("Working Dir -> %s\n", debugstr_w(m_sWorkDir));
726  }
727 
729  {
730  hr = Stream_LoadString(stm, unicode, &m_sArgs);
731  if (FAILED(hr))
732  return hr;
733  TRACE("Arguments -> %s\n", debugstr_w(m_sArgs));
734  }
735 
737  {
738  hr = Stream_LoadString(stm, unicode, &m_sIcoPath);
739  if (FAILED(hr))
740  return hr;
741  TRACE("Icon file -> %s\n", debugstr_w(m_sIcoPath));
742  }
743 
744  /* Now load the optional data block list */
746  if (FAILED(hr)) // FIXME: Should we fail?
747  return hr;
748 
749  if (TRACE_ON(shell))
750  {
751 #if (NTDDI_VERSION < NTDDI_LONGHORN)
753  {
754  hr = GetAdvertiseInfo(&sProduct, EXP_LOGO3_ID_SIG);
755  if (SUCCEEDED(hr))
756  TRACE("Product -> %s\n", debugstr_w(sProduct));
757  }
758 #endif
760  {
762  if (SUCCEEDED(hr))
763  TRACE("Component -> %s\n", debugstr_w(sComponent));
764  }
765  }
766 
768  m_bRunAs = TRUE;
769  else
770  m_bRunAs = FALSE;
771 
772  TRACE("OK\n");
773 
774  pdump(m_pPidl);
775 
776  return S_OK;
777 }
HRESULT hr
Definition: shlfolder.c:183
#define STG_E_INVALIDPOINTER
Definition: winerror.h:2571
#define TRUE
Definition: types.h:120
#define LOCALE_USER_DEFAULT
#define DATE_SHORTDATE
Definition: winnls.h:196
#define ZeroMemory
Definition: winbase.h:1664
HRESULT WINAPI SHReadDataBlockList(IStream *lpStream, LPDBLIST *lppList)
Definition: clist.c:235
#define E_FAIL
Definition: ddrawi.h:102
#define EXP_DARWIN_ID_SIG
Definition: shlobj.h:1894
#define FALSE
Definition: types.h:117
unsigned int BOOL
Definition: ntddk_ex.h:94
if SUCCEEDED(hr)
#define debugstr_w
Definition: kernel32.h:32
#define TRACE(s)
Definition: solgame.cpp:4
BOOL WINAPI FileTimeToSystemTime(IN CONST FILETIME *lpFileTime, OUT LPSYSTEMTIME lpSystemTime)
Definition: time.c:188
#define GetProcessHeap()
Definition: compat.h:595
__wchar_t WCHAR
Definition: xmlstorage.h:180
LONG HRESULT
Definition: typedefs.h:79
#define _countof(array)
Definition: sndvol32.h:68
#define PathRemoveBackslash
Definition: shlwapi.h:1023
#define MAX_PATH
Definition: compat.h:34
HRESULT WINAPI ILLoadFromStream(IStream *pStream, LPITEMIDLIST *ppPidl)
Definition: pidl.c:284
INT WINAPI GetDateFormatW(LCID lcid, DWORD dwFlags, const SYSTEMTIME *lpTime, LPCWSTR lpFormat, LPWSTR lpDateStr, INT cchOut)
Definition: lcformat.c:979
#define S_OK
Definition: intsafe.h:52
void shell(int argc, const char *argv[])
Definition: cmds.c:1231
void pdump(LPCITEMIDLIST pidl)
Definition: debughlp.cpp:248
#define NULL
Definition: types.h:112
unsigned int ULONG
Definition: retypes.h:1
HRESULT Read([out, size_is(cb), length_is(*pcbRead)] void *pv, [in] ULONG cb, [out] ULONG *pcbRead)
#define TRACE_ON(x)
Definition: compat.h:75
#define HeapFree(x, y, z)
Definition: compat.h:594
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95

◆ OnCommand()

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

FIXME open target directory

Definition at line 2812 of file CShellLink.cpp.

2813 {
2814  switch (id)
2815  {
2816  case IDC_SHORTCUT_FIND:
2822  return;
2823 
2825  {
2826  WCHAR wszPath[MAX_PATH] = L"";
2827 
2828  if (m_sIcoPath)
2829  wcscpy(wszPath, m_sIcoPath);
2830  else
2831  FindExecutableW(m_sPath, NULL, wszPath);
2832 
2834  if (PickIconDlg(hwndDlg, wszPath, _countof(wszPath), &IconIndex))
2835  {
2836  SetIconLocation(wszPath, IconIndex);
2837  PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
2838 
2839  HICON hIconLarge = CreateShortcutIcon(wszPath, IconIndex);
2840  if (hIconLarge)
2841  {
2842  if (m_hIcon)
2844  m_hIcon = hIconLarge;
2846  }
2847  }
2848  return;
2849  }
2850 
2851  case IDC_SHORTCUT_ADVANCED:
2852  {
2854  if (result == 1 || result == 0)
2855  {
2856  if (m_bRunAs != result)
2857  {
2858  PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
2859  }
2860 
2861  m_bRunAs = result;
2862  }
2863  return;
2864  }
2865  }
2866  if (codeNotify == EN_CHANGE)
2867  {
2868  if (!m_bInInit)
2869  PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
2870  }
2871 }
#define STM_SETICON
Definition: winuser.h:2075
static HICON
Definition: imagelist.c:84
INT_PTR WINAPI DialogBoxParamW(_In_opt_ HINSTANCE, _In_ LPCWSTR, _In_opt_ HWND, _In_opt_ DLGPROC, _In_ LPARAM)
GLuint64EXT * result
Definition: glext.h:11304
BOOL WINAPI DestroyIcon(_In_ HICON)
Definition: cursoricon.c:2022
#define IDD_SHORTCUT_EXTENDED_PROPERTIES
Definition: shresdef.h:376
#define IDC_SHORTCUT_ICON
Definition: shresdef.h:429
EXTERN_C HRESULT WINAPI SHOpenFolderAndSelectItems(PCIDLIST_ABSOLUTE pidlFolder, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD dwFlags)
Definition: shlfolder.cpp:389
UINT_PTR WPARAM
Definition: windef.h:207
#define IDC_SHORTCUT_CHANGE_ICON
Definition: shresdef.h:446
int32_t INT_PTR
Definition: typedefs.h:64
int32_t INT
Definition: typedefs.h:58
BOOL WINAPI PickIconDlg(HWND hWndOwner, LPWSTR lpstrFile, UINT nMaxFile, INT *lpdwIconIndex)
Definition: dialogs.cpp:364
LONG_PTR LPARAM
Definition: windef.h:208
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define PropSheet_Changed(d, w)
Definition: prsht.h:344
#define _countof(array)
Definition: sndvol32.h:68
#define MAX_PATH
Definition: compat.h:34
LRESULT WINAPI SendDlgItemMessageW(_In_ HWND, _In_ int, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
static const WCHAR IconIndex[]
Definition: install.c:52
HINSTANCE WINAPI FindExecutableW(LPCWSTR lpFile, LPCWSTR lpDirectory, LPWSTR lpResult)
Definition: shlexec.cpp:1266
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
static const WCHAR L[]
Definition: oid.c:1250
#define IDC_SHORTCUT_FIND
Definition: shresdef.h:445
HWND WINAPI GetParent(_In_ HWND)
#define shell32_hInstance
#define IDC_SHORTCUT_ADVANCED
Definition: shresdef.h:447
#define NULL
Definition: types.h:112
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
#define EN_CHANGE
Definition: winuser.h:2005

◆ OnDestroy()

void CShellLink::OnDestroy ( HWND  hwndDlg)

Definition at line 2933 of file CShellLink.cpp.

2934 {
2935  if (m_hIcon)
2936  {
2938  m_hIcon = NULL;
2939  }
2940 }
BOOL WINAPI DestroyIcon(_In_ HICON)
Definition: cursoricon.c:2022
#define NULL
Definition: types.h:112

◆ OnInitDialog()

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

Definition at line 2736 of file CShellLink.cpp.

2737 {
2738  TRACE("CShellLink::OnInitDialog(hwnd %p hwndFocus %p lParam %p)\n", hwndDlg, hwndFocus, lParam);
2739 
2740  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,
2742 
2743  m_bInInit = TRUE;
2744 
2745  /* Get file information */
2746  // FIXME! FIXME! Shouldn't we use m_sIcoPath, m_Header.nIconIndex instead???
2747  SHFILEINFOW fi;
2748  if (!SHGetFileInfoW(m_sLinkPath, 0, &fi, sizeof(fi), SHGFI_TYPENAME | SHGFI_ICON))
2749  {
2750  ERR("SHGetFileInfoW failed for %ls (%lu)\n", m_sLinkPath, GetLastError());
2751  fi.szTypeName[0] = L'\0';
2752  fi.hIcon = NULL;
2753  }
2754 
2755  if (fi.hIcon)
2756  {
2757  if (m_hIcon)
2759  m_hIcon = fi.hIcon;
2761  }
2762  else
2763  ERR("ExtractIconW failed %ls %u\n", m_sIcoPath, m_Header.nIconIndex);
2764 
2765  /* Target type */
2766  if (m_sPath)
2768 
2769  /* Target location */
2770  if (m_sPath)
2771  {
2776  }
2777 
2778  /* Target path */
2779  if (m_sPath)
2780  {
2781  WCHAR newpath[2*MAX_PATH] = L"\0";
2782  if (wcschr(m_sPath, ' '))
2783  StringCchPrintfExW(newpath, _countof(newpath), NULL, NULL, 0, L"\"%ls\"", m_sPath);
2784  else
2785  StringCchCopyExW(newpath, _countof(newpath), m_sPath, NULL, NULL, 0);
2786 
2787  if (m_sArgs && m_sArgs[0])
2788  {
2789  StringCchCatW(newpath, _countof(newpath), L" ");
2790  StringCchCatW(newpath, _countof(newpath), m_sArgs);
2791  }
2792  SetDlgItemTextW(hwndDlg, IDC_SHORTCUT_TARGET_TEXT, newpath);
2793  }
2794 
2795  /* Working dir */
2796  if (m_sWorkDir)
2798 
2799  /* Description */
2800  if (m_sDescription)
2802 
2803  /* auto-completion */
2806 
2807  m_bInInit = FALSE;
2808 
2809  return TRUE;
2810 }
#define STM_SETICON
Definition: winuser.h:2075
BOOL WINAPI PathRemoveFileSpecW(LPWSTR lpszPath)
Definition: path.c:629
#define IDC_SHORTCUT_TYPE_EDIT
Definition: shresdef.h:432
#define IDC_SHORTCUT_TARGET_TEXT
Definition: shresdef.h:436
#define SHGFI_TYPENAME
Definition: shellapi.h:165
BOOL WINAPI DestroyIcon(_In_ HICON)
Definition: cursoricon.c:2022
#define TRUE
Definition: types.h:120
#define IDC_SHORTCUT_ICON
Definition: shresdef.h:429
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1040
UINT_PTR WPARAM
Definition: windef.h:207
WCHAR szTypeName[80]
Definition: shellapi.h:374
STRSAFEAPI StringCchCatW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:325
BOOL WINAPI SetDlgItemTextW(_In_ HWND, _In_ int, _In_ LPCWSTR)
#define IDC_SHORTCUT_LOCATION_EDIT
Definition: shresdef.h:434
STRSAFEAPI StringCchPrintfExW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPWSTR *ppszDestEnd, size_t *pcchRemaining, STRSAFE_DWORD dwFlags, STRSAFE_LPCWSTR pszFormat,...)
Definition: strsafe.h:585
#define FALSE
Definition: types.h:117
STRSAFEAPI StringCchCopyW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:149
#define IDC_SHORTCUT_COMMENT_EDIT
Definition: shresdef.h:444
LPWSTR WINAPI PathFindFileNameW(LPCWSTR lpszPath)
Definition: path.c:394
HRESULT WINAPI SHAutoComplete(HWND hwndEdit, DWORD dwFlags)
Definition: autocomp.cpp:191
#define TRACE(s)
Definition: solgame.cpp:4
_CONST_RETURN wchar_t *__cdecl wcschr(_In_z_ const wchar_t *_Str, wchar_t _Ch)
HWND WINAPI GetDlgItem(_In_opt_ HWND, _In_ int)
__wchar_t WCHAR
Definition: xmlstorage.h:180
DWORD_PTR WINAPI SHGetFileInfoW(LPCWSTR path, DWORD dwFileAttributes, SHFILEINFOW *psfi, UINT sizeofpsfi, UINT flags)
Definition: shell32_main.c:414
#define _countof(array)
Definition: sndvol32.h:68
#define MAX_PATH
Definition: compat.h:34
LRESULT WINAPI SendDlgItemMessageW(_In_ HWND, _In_ int, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
static const WCHAR L[]
Definition: oid.c:1250
HICON hIcon
Definition: shellapi.h:370
STRSAFEAPI StringCchCopyExW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc, STRSAFE_LPWSTR *ppszDestEnd, size_t *pcchRemaining, STRSAFE_DWORD dwFlags)
Definition: strsafe.h:184
#define ERR(fmt,...)
Definition: debug.h:110
#define NULL
Definition: types.h:112
#define IDC_SHORTCUT_START_IN_EDIT
Definition: shresdef.h:438
#define SHACF_DEFAULT
Definition: shlwapi.h:1911
GLenum target
Definition: glext.h:7315
#define SHGFI_ICON
Definition: shellapi.h:162
LPARAM lParam
Definition: combotst.c:139

◆ OnNotify()

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

Definition at line 2873 of file CShellLink.cpp.

2874 {
2875  WCHAR wszBuf[MAX_PATH];
2876  LPPSHNOTIFY lppsn = (LPPSHNOTIFY)pnmhdr;
2877 
2878  if (lppsn->hdr.code == PSN_APPLY)
2879  {
2880  /* set working directory */
2881  GetDlgItemTextW(hwndDlg, IDC_SHORTCUT_START_IN_EDIT, wszBuf, _countof(wszBuf));
2882  SetWorkingDirectory(wszBuf);
2883 
2884  /* set link destination */
2885  GetDlgItemTextW(hwndDlg, IDC_SHORTCUT_TARGET_TEXT, wszBuf, _countof(wszBuf));
2886  LPWSTR lpszArgs = NULL;
2887  LPWSTR unquoted = strdupW(wszBuf);
2888  StrTrimW(unquoted, L" ");
2889 
2890  if (!PathFileExistsW(unquoted))
2891  {
2892  lpszArgs = PathGetArgsW(unquoted);
2893  PathRemoveArgsW(unquoted);
2894  StrTrimW(lpszArgs, L" ");
2895  }
2896  if (unquoted[0] == '"' && unquoted[wcslen(unquoted) - 1] == '"')
2897  PathUnquoteSpacesW(unquoted);
2898 
2899  WCHAR *pwszExt = PathFindExtensionW(unquoted);
2900  if (!wcsicmp(pwszExt, L".lnk"))
2901  {
2902  // FIXME load localized error msg
2903  MessageBoxW(hwndDlg, L"You cannot create a link to a shortcut", L"Error", MB_ICONERROR);
2905  return TRUE;
2906  }
2907 
2908  if (!PathFileExistsW(unquoted))
2909  {
2910  // FIXME load localized error msg
2911  MessageBoxW(hwndDlg, L"The specified file name in the target box is invalid", L"Error", MB_ICONERROR);
2913  return TRUE;
2914  }
2915 
2916  SetPath(unquoted);
2917  if (lpszArgs)
2918  SetArguments(lpszArgs);
2919  else
2920  SetArguments(L"\0");
2921 
2922  HeapFree(GetProcessHeap(), 0, unquoted);
2923 
2924  TRACE("This %p m_sLinkPath %S\n", this, m_sLinkPath);
2925  Save(m_sLinkPath, TRUE);
2928  return TRUE;
2929  }
2930  return FALSE;
2931 }
UINT WINAPI GetDlgItemTextW(HWND hDlg, int nIDDlgItem, LPWSTR lpString, int nMaxCount)
Definition: dialog.c:2263
#define IDC_SHORTCUT_TARGET_TEXT
Definition: shresdef.h:436
void WINAPI PathRemoveArgsW(LPWSTR lpszPath)
Definition: path.c:779
struct _PSHNOTIFY * LPPSHNOTIFY
#define TRUE
Definition: types.h:120
#define PSN_APPLY
Definition: prsht.h:117
#define SetWindowLongPtr
Definition: treelist.c:70
#define DWLP_MSGRESULT
Definition: winuser.h:864
UINT code
Definition: winuser.h:3135
NMHDR hdr
Definition: prsht.h:330
#define FALSE
Definition: types.h:117
#define PSNRET_INVALID_NOCHANGEPAGE
Definition: prsht.h:131
BOOL WINAPI PathFileExistsW(LPCWSTR lpszPath)
Definition: path.c:1776
LPWSTR WINAPI PathFindExtensionW(LPCWSTR lpszPath)
Definition: path.c:447
#define TRACE(s)
Definition: solgame.cpp:4
#define GetProcessHeap()
Definition: compat.h:595
int WINAPI MessageBoxW(_In_opt_ HWND, _In_opt_ LPCWSTR, _In_opt_ LPCWSTR, _In_ UINT)
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define _countof(array)
Definition: sndvol32.h:68
#define MAX_PATH
Definition: compat.h:34
#define PSNRET_NOERROR
Definition: prsht.h:129
#define wcsicmp
Definition: compat.h:15
EXTERN_C void WINAPI SHChangeNotify(LONG wEventId, UINT uFlags, LPCVOID dwItem1, LPCVOID dwItem2)
static const WCHAR L[]
Definition: oid.c:1250
#define MB_ICONERROR
Definition: winuser.h:781
#define SHCNF_PATHW
Definition: shlobj.h:1764
LPWSTR WINAPI PathGetArgsW(LPCWSTR lpszPath)
Definition: path.c:506
VOID WINAPI PathUnquoteSpacesW(LPWSTR lpszPath)
Definition: path.c:1034
#define NULL
Definition: types.h:112
#define IDC_SHORTCUT_START_IN_EDIT
Definition: shresdef.h:438
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
BOOL WINAPI StrTrimW(LPWSTR lpszStr, LPCWSTR lpszTrim)
Definition: string.c:1869
#define SHCNE_UPDATEITEM
Definition: shlobj.h:1742
WCHAR * LPWSTR
Definition: xmlstorage.h:184
#define HeapFree(x, y, z)
Definition: compat.h:594

◆ QueryContextMenu()

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

Implements IContextMenu.

Definition at line 2503 of file CShellLink.cpp.

2504 {
2505  INT id = 0;
2506 
2507  m_idCmdFirst = idCmdFirst;
2508 
2509  TRACE("%p %p %u %u %u %u\n", this,
2510  hMenu, indexMenu, idCmdFirst, idCmdLast, uFlags);
2511 
2512  if (!hMenu)
2513  return E_INVALIDARG;
2514 
2517 
2518  MENUITEMINFOW mii;
2519  ZeroMemory(&mii, sizeof(mii));
2520  mii.cbSize = sizeof(mii);
2521  mii.fMask = MIIM_TYPE | MIIM_ID | MIIM_STATE;
2522  mii.dwTypeData = strOpen.GetBuffer();
2523  mii.cch = wcslen(mii.dwTypeData);
2524  mii.wID = idCmdFirst + id++;
2525  mii.fState = MFS_DEFAULT | MFS_ENABLED;
2526  mii.fType = MFT_STRING;
2527  if (!InsertMenuItemW(hMenu, indexMenu++, TRUE, &mii))
2528  return E_FAIL;
2529 
2530  mii.fMask = MIIM_TYPE | MIIM_ID | MIIM_STATE;
2531  mii.dwTypeData = strOpenFileLoc.GetBuffer();
2532  mii.cch = wcslen(mii.dwTypeData);
2533  mii.wID = idCmdFirst + id++;
2534  mii.fState = MFS_ENABLED;
2535  mii.fType = MFT_STRING;
2536  if (!InsertMenuItemW(hMenu, indexMenu++, TRUE, &mii))
2537  return E_FAIL;
2538 
2539  UNREFERENCED_PARAMETER(indexMenu);
2540 
2541  return MAKE_HRESULT(SEVERITY_SUCCESS, 0, id);
2542 }
#define MFT_STRING
Definition: winuser.h:741
#define TRUE
Definition: types.h:120
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:317
#define IDS_OPENFILELOCATION
Definition: shresdef.h:243
#define ZeroMemory
Definition: winbase.h:1664
LPWSTR dwTypeData
Definition: winuser.h:3245
#define IDS_OPEN_VERB
Definition: shresdef.h:209
UINT uFlags
Definition: api.c:59
#define MFS_DEFAULT
Definition: winuser.h:743
#define E_FAIL
Definition: ddrawi.h:102
int32_t INT
Definition: typedefs.h:58
#define SEVERITY_SUCCESS
Definition: winerror.h:64
#define MFS_ENABLED
Definition: winuser.h:745
#define MIIM_STATE
Definition: winuser.h:716
#define E_INVALIDARG
Definition: ddrawi.h:101
#define MAKE_HRESULT(sev, fac, code)
Definition: dmerror.h:30
#define MIIM_ID
Definition: winuser.h:717
#define TRACE(s)
Definition: solgame.cpp:4
#define MIIM_TYPE
Definition: winuser.h:720
BOOL WINAPI InsertMenuItemW(_In_ HMENU, _In_ UINT, _In_ BOOL, _In_ LPCMENUITEMINFOW)
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582

◆ RemoveDataBlock()

HRESULT STDMETHODCALLTYPE CShellLink::RemoveDataBlock ( DWORD  dwSig)
virtual

Implements IShellLinkDataList.

Definition at line 2432 of file CShellLink.cpp.

2433 {
2434  if (SHRemoveDataBlock(&m_pDBList, dwSig))
2435  {
2436  m_bDirty = TRUE;
2437  return S_OK;
2438  }
2439  return S_FALSE;
2440 }
#define TRUE
Definition: types.h:120
#define S_FALSE
Definition: winerror.h:2357
#define S_OK
Definition: intsafe.h:52
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 
)
virtual

Definition at line 3002 of file CShellLink.cpp.

3003 {
3004  TRACE("(%p) (uPageID %u, pfnReplacePage %p lParam %p\n", this, uPageID, pfnReplacePage, lParam);
3005  return E_NOTIMPL;
3006 }
#define TRACE(s)
Definition: solgame.cpp:4
#define E_NOTIMPL
Definition: ddrawi.h:99
LPARAM lParam
Definition: combotst.c:139

◆ Reset()

VOID CShellLink::Reset ( void  )
private

Definition at line 220 of file CShellLink.cpp.

221 {
222  ILFree(m_pPidl);
223  m_pPidl = NULL;
224 
226  m_sPath = NULL;
227  ZeroMemory(&volume, sizeof(volume));
228 
232  m_sPathRel = NULL;
234  m_sWorkDir = NULL;
236  m_sArgs = NULL;
238  m_sIcoPath = NULL;
239 
240  m_bRunAs = FALSE;
241  m_bDirty = FALSE;
242 
243  if (m_pDBList)
245  m_pDBList = NULL;
246 
248 }
void WINAPI ILFree(LPITEMIDLIST pidl)
Definition: pidl.c:925
#define ZeroMemory
Definition: winbase.h:1664
#define FALSE
Definition: types.h:117
#define GetProcessHeap()
Definition: compat.h:595
#define NULL
Definition: types.h:112
VOID WINAPI SHFreeDataBlockList(LPDBLIST lpList)
Definition: clist.c:331
#define HeapFree(x, y, z)
Definition: compat.h:594

Referenced by Load().

◆ Resolve()

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

Implements IShellLinkA.

Definition at line 1398 of file CShellLink.cpp.

1399 {
1400  HRESULT hr = S_OK;
1401  BOOL bSuccess;
1402 
1403  TRACE("(%p)->(hwnd=%p flags=%x)\n", this, hwnd, fFlags);
1404 
1405  /* FIXME: use IResolveShellLink interface? */
1406 
1407  // FIXME: See InvokeCommand().
1408 
1409 #if (NTDDI_VERSION < NTDDI_LONGHORN)
1410  // NOTE: For Logo3 (EXP_LOGO3_ID_SIG), check also for SHRestricted(REST_NOLOGO3CHANNELNOTIFY)
1412  {
1413  FIXME("Logo3 links are not supported yet!\n");
1414  return E_FAIL;
1415  }
1416 #endif
1417 
1418  /* Resolve Darwin (MSI) target */
1420  {
1421  LPWSTR component = NULL;
1422  hr = GetAdvertiseInfo(&component, EXP_DARWIN_ID_SIG);
1423  if (FAILED(hr))
1424  return E_FAIL;
1425 
1426  /* Clear the cached path */
1429  if (!m_sPath)
1430  return E_FAIL;
1431  }
1432 
1433  if (!m_sPath && m_pPidl)
1434  {
1436 
1438  if (bSuccess && *buffer)
1439  {
1440  m_sPath = strdupW(buffer);
1441  if (!m_sPath)
1442  return E_OUTOFMEMORY;
1443 
1444  m_bDirty = TRUE;
1445  }
1446  else
1447  {
1448  hr = S_OK; /* don't report an error occurred while just caching information */
1449  }
1450  }
1451 
1452  // FIXME: Strange to do that here...
1453  if (!m_sIcoPath && m_sPath)
1454  {
1456  if (!m_sIcoPath)
1457  return E_OUTOFMEMORY;
1458 
1459  m_Header.nIconIndex = 0;
1460 
1461  m_bDirty = TRUE;
1462  }
1463 
1464  return hr;
1465 }
const DOCKBAR PVOID HWND HWND * hwnd
Definition: tooldock.h:22
HRESULT hr
Definition: shlfolder.c:183
#define TRUE
Definition: types.h:120
BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath)
Definition: pidl.c:1294
GLuint buffer
Definition: glext.h:5915
#define E_FAIL
Definition: ddrawi.h:102
static BOOLEAN bSuccess
Definition: drive.cpp:432
#define EXP_DARWIN_ID_SIG
Definition: shlobj.h:1894
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
unsigned int BOOL
Definition: ntddk_ex.h:94
#define FIXME(fmt,...)
Definition: debug.h:111
#define TRACE(s)
Definition: solgame.cpp:4
#define GetProcessHeap()
Definition: compat.h:595
__wchar_t WCHAR
Definition: xmlstorage.h:180
LONG HRESULT
Definition: typedefs.h:79
#define MAX_PATH
Definition: compat.h:34
#define S_OK
Definition: intsafe.h:52
#define NULL
Definition: types.h:112
WCHAR * LPWSTR
Definition: xmlstorage.h:184
#define HeapFree(x, y, z)
Definition: compat.h:594

Referenced by InvokeCommand().

◆ Save() [1/2]

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

Implements IPersistFile.

Definition at line 345 of file CShellLink.cpp.

346 {
347  BOOL bAlreadyExists;
348  WCHAR szFullPath[MAX_PATH];
349 
350  TRACE("(%p)->(%s)\n", this, debugstr_w(pszFileName));
351 
352  if (!pszFileName)
353  return E_FAIL;
354 
355  bAlreadyExists = PathFileExistsW(pszFileName);
356 
357  CComPtr<IStream> stm;
359  if (SUCCEEDED(hr))
360  {
361  hr = Save(stm, FALSE);
362 
363  if (SUCCEEDED(hr))
364  {
365  GetFullPathNameW(pszFileName, _countof(szFullPath), szFullPath, NULL);
366  if (bAlreadyExists)
368  else
370 
371  if (m_sLinkPath)
373 
375  m_bDirty = FALSE;
376  }
377  else
378  {
380  WARN("Failed to create shortcut %s\n", debugstr_w(pszFileName));
381  }
382  }
383 
384  return hr;
385 }
HRESULT hr
Definition: shlfolder.c:183
#define STGM_SHARE_EXCLUSIVE
Definition: objbase.h:922
#define WARN(fmt,...)
Definition: debug.h:112
#define STGM_CREATE
Definition: objbase.h:925
DWORD WINAPI GetFullPathNameW(IN LPCWSTR lpFileName, IN DWORD nBufferLength, OUT LPWSTR lpBuffer, OUT LPWSTR *lpFilePart)
Definition: path.c:1105
#define E_FAIL
Definition: ddrawi.h:102
#define FALSE
Definition: types.h:117
unsigned int BOOL
Definition: ntddk_ex.h:94
if SUCCEEDED(hr)
#define debugstr_w
Definition: kernel32.h:32
WORD WORD PSZ PSZ pszFileName
Definition: vdmdbg.h:41
BOOL WINAPI DeleteFileW(IN LPCWSTR lpFileName)
Definition: delete.c:39
BOOL WINAPI PathFileExistsW(LPCWSTR lpszPath)
Definition: path.c:1776
#define TRACE(s)
Definition: solgame.cpp:4
#define GetProcessHeap()
Definition: compat.h:595
__wchar_t WCHAR
Definition: xmlstorage.h:180
LONG HRESULT
Definition: typedefs.h:79
#define _countof(array)
Definition: sndvol32.h:68
#define MAX_PATH
Definition: compat.h:34
EXTERN_C void WINAPI SHChangeNotify(LONG wEventId, UINT uFlags, LPCVOID dwItem1, LPCVOID dwItem2)
#define STGM_READWRITE
Definition: objbase.h:918
#define SHCNF_PATHW
Definition: shlobj.h:1764
#define NULL
Definition: types.h:112
HRESULT WINAPI SHCreateStreamOnFileW(LPCWSTR lpszPath, DWORD dwMode, IStream **lppStream)
Definition: istream.c:484
#define SHCNE_CREATE
Definition: shlobj.h:1730
#define SHCNE_UPDATEITEM
Definition: shlobj.h:1742
#define HeapFree(x, y, z)
Definition: compat.h:594

Referenced by OnNotify().

◆ Save() [2/2]

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

Implements IPersistStream.

Definition at line 878 of file CShellLink.cpp.

879 {
880  TRACE("%p %p %x\n", this, stm, fClearDirty);
881 
882  m_Header.dwSize = sizeof(m_Header);
883  m_Header.clsid = CLSID_ShellLink;
884 
885  /*
886  * Reset the flags: keep only the flags related to data blocks as they were
887  * already set in accordance by the different mutator member functions.
888  * The other flags will be determined now by the presence or absence of data.
889  */
892 #if (NTDDI_VERSION < NTDDI_LONGHORN)
894 #endif
896  // TODO: When we will support Vista+ functionality, add other flags to this list.
897 
898  /* The stored strings are in UNICODE */
900 
901  if (m_pPidl)
903  if (m_sPath)
907  if (m_sPathRel && *m_sPathRel)
909  if (m_sWorkDir && *m_sWorkDir)
911  if (m_sArgs && *m_sArgs)
913  if (m_sIcoPath && *m_sIcoPath)
915  if (m_bRunAs)
917 
918  /* Write the shortcut header */
919  ULONG count;
920  HRESULT hr = stm->Write(&m_Header, sizeof(m_Header), &count);
921  if (FAILED(hr))
922  {
923  ERR("Write failed\n");
924  return hr;
925  }
926 
927  /* Save the data in order */
928 
929  if (m_pPidl)
930  {
931  hr = ILSaveToStream(stm, m_pPidl);
932  if (FAILED(hr))
933  {
934  ERR("Failed to write PIDL\n");
935  return hr;
936  }
937  }
938 
939  if (m_sPath)
940  {
942  if (FAILED(hr))
943  return hr;
944  }
945 
947  {
949  if (FAILED(hr))
950  return hr;
951  }
952 
954  {
956  if (FAILED(hr))
957  return hr;
958  }
959 
961  {
963  if (FAILED(hr))
964  return hr;
965  }
966 
968  {
969  hr = Stream_WriteString(stm, m_sArgs);
970  if (FAILED(hr))
971  return hr;
972  }
973 
975  {
977  if (FAILED(hr))
978  return hr;
979  }
980 
981  /*
982  * Now save the data block list.
983  *
984  * NOTE that both advertised Product and Component are already saved
985  * inside Logo3 and Darwin data blocks in the m_pDBList list, and the
986  * m_Header.dwFlags is suitably initialized.
987  */
989  if (FAILED(hr))
990  return hr;
991 
992  /* Clear the dirty bit if requested */
993  if (fClearDirty)
994  m_bDirty = FALSE;
995 
996  return hr;
997 }
HRESULT hr
Definition: shlfolder.c:183
GLuint GLuint GLsizei count
Definition: gl.h:1545
HRESULT WINAPI ILSaveToStream(IStream *pStream, LPCITEMIDLIST pPidl)
Definition: pidl.c:342
#define FALSE
Definition: types.h:117
#define TRACE(s)
Definition: solgame.cpp:4
LONG HRESULT
Definition: typedefs.h:79
HRESULT WINAPI SHWriteDataBlockList(IStream *lpStream, LPDBLIST lpList)
Definition: clist.c:179
#define ERR(fmt,...)
Definition: debug.h:110
unsigned int ULONG
Definition: retypes.h:1
HRESULT Write([in, size_is(cb)] const void *pv, [in] ULONG cb, [out] ULONG *pcbWritten)

◆ SaveCompleted()

HRESULT STDMETHODCALLTYPE CShellLink::SaveCompleted ( LPCOLESTR  pszFileName)
virtual

Implements IPersistFile.

Definition at line 387 of file CShellLink.cpp.

388 {
389  FIXME("(%p)->(%s)\n", this, debugstr_w(pszFileName));
390  return S_OK;
391 }
#define debugstr_w
Definition: kernel32.h:32
#define FIXME(fmt,...)
Definition: debug.h:111
WORD WORD PSZ PSZ pszFileName
Definition: vdmdbg.h:41
#define S_OK
Definition: intsafe.h:52

◆ SetAdvertiseInfo()

HRESULT CShellLink::SetAdvertiseInfo ( LPCWSTR  str)
private

Definition at line 2105 of file CShellLink.cpp.

2106 {
2107  HRESULT hr;
2108  LPCWSTR szComponent = NULL, szProduct = NULL, p;
2109  INT len;
2110  GUID guid;
2111  WCHAR szGuid[38+1];
2112 
2113  sProduct = sComponent = NULL;
2114 
2115  while (str[0])
2116  {
2117  /* each segment must start with two colons */
2118  if (str[0] != ':' || str[1] != ':')
2119  return E_FAIL;
2120 
2121  /* the last segment is just two colons */
2122  if (!str[2])
2123  break;
2124  str += 2;
2125 
2126  /* there must be a colon straight after a guid */
2127  p = wcschr(str, L':');
2128  if (!p)
2129  return E_FAIL;
2130  len = p - str;
2131  if (len != 38)
2132  return E_FAIL;
2133 
2134  /* get the guid, and check if it's validly formatted */
2135  memcpy(szGuid, str, sizeof(WCHAR)*len);
2136  szGuid[len] = 0;
2137 
2139  if (hr != S_OK)
2140  return hr;
2141  str = p + 1;
2142 
2143  /* match it up to a guid that we care about */
2144  if (IsEqualGUID(guid, SHELL32_AdvtShortcutComponent) && !szComponent)
2145  szComponent = str; /* Darwin */
2146  else if (IsEqualGUID(guid, SHELL32_AdvtShortcutProduct) && !szProduct)
2147  szProduct = str; /* Logo3 */
2148  else
2149  return E_FAIL;
2150 
2151  /* skip to the next field */
2152  str = wcschr(str, L':');
2153  if (!str)
2154  return E_FAIL;
2155  }
2156 
2157  /* we have to have a component for an advertised shortcut */
2158  if (!szComponent)
2159  return E_FAIL;
2160 
2161  szComponent = GetAdvertisedArg(szComponent);
2162  szProduct = GetAdvertisedArg(szProduct);
2163 
2164  hr = WriteAdvertiseInfo(szComponent, EXP_DARWIN_ID_SIG);
2165  // if (FAILED(hr))
2166  // return hr;
2167 #if (NTDDI_VERSION < NTDDI_LONGHORN)
2168  hr = WriteAdvertiseInfo(szProduct, EXP_LOGO3_ID_SIG);
2169  // if (FAILED(hr))
2170  // return hr;
2171 #endif
2172 
2173  HeapFree(GetProcessHeap(), 0, (PVOID)szComponent);
2174  HeapFree(GetProcessHeap(), 0, (PVOID)szProduct);
2175 
2176  if (TRACE_ON(shell))
2177  {
2179  TRACE("Component = %s\n", debugstr_w(sComponent));
2180 #if (NTDDI_VERSION < NTDDI_LONGHORN)
2181  GetAdvertiseInfo(&sProduct, EXP_LOGO3_ID_SIG);
2182  TRACE("Product = %s\n", debugstr_w(sProduct));
2183 #endif
2184  }
2185 
2186  return S_OK;
2187 }
HRESULT hr
Definition: shlfolder.c:183
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
#define E_FAIL
Definition: ddrawi.h:102
const GUID SHELL32_AdvtShortcutComponent
int32_t INT
Definition: typedefs.h:58
const GUID * guid
#define EXP_DARWIN_ID_SIG
Definition: shlobj.h:1894
#define debugstr_w
Definition: kernel32.h:32
const WCHAR * str
const GUID SHELL32_AdvtShortcutProduct
#define TRACE(s)
Definition: solgame.cpp:4
#define GetProcessHeap()
Definition: compat.h:595
_CONST_RETURN wchar_t *__cdecl wcschr(_In_z_ const wchar_t *_Str, wchar_t _Ch)
__wchar_t WCHAR
Definition: xmlstorage.h:180
LONG HRESULT
Definition: typedefs.h:79
static const WCHAR L[]
Definition: oid.c:1250
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
GLenum GLsizei len
Definition: glext.h:6722
#define S_OK
Definition: intsafe.h:52
static const WCHAR szGuid[]
Definition: rtlstr.c:1892
void shell(int argc, const char *argv[])
Definition: cmds.c:1231
#define NULL
Definition: types.h:112
BOOL WINAPI IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
Definition: compobj.c:4112
HRESULT WINAPI CLSIDFromString(LPCOLESTR idstr, LPCLSID id)
Definition: compobj.c:2338
GLfloat GLfloat p
Definition: glext.h:8902
#define TRACE_ON(x)
Definition: compat.h:75
#define HeapFree(x, y, z)
Definition: compat.h:594

Referenced by SetPath().

◆ SetArguments() [1/2]

HRESULT STDMETHODCALLTYPE CShellLink::SetArguments ( LPCSTR  pszArgs)
virtual

Implements IShellLinkA.

Definition at line 1217 of file CShellLink.cpp.

1218 {
1219  TRACE("(%p)->(args=%s)\n", this, pszArgs);
1220 
1222  m_sArgs = NULL;
1223 
1224  if (pszArgs)
1225  {
1226  m_sArgs = HEAP_strdupAtoW(GetProcessHeap(), 0, pszArgs);
1227  if (!m_sArgs)
1228  return E_OUTOFMEMORY;
1229  }
1230  m_bDirty = TRUE;
1231 
1232  return S_OK;
1233 }
#define TRUE
Definition: types.h:120
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define TRACE(s)
Definition: solgame.cpp:4
#define GetProcessHeap()
Definition: compat.h:595
#define S_OK
Definition: intsafe.h:52
#define NULL
Definition: types.h:112
#define HeapFree(x, y, z)
Definition: compat.h:594

Referenced by OnNotify().

◆ SetArguments() [2/2]

HRESULT STDMETHODCALLTYPE CShellLink::SetArguments ( LPCWSTR  pszArgs)
virtual

Implements IShellLinkW.

Definition at line 1638 of file CShellLink.cpp.

1639 {
1640  TRACE("(%p)->(args=%s)\n", this, debugstr_w(pszArgs));
1641 
1643  m_sArgs = NULL;
1644 
1645  if (pszArgs)
1646  {
1647  m_sArgs = strdupW(pszArgs);
1648  if (!m_sArgs)
1649  return E_OUTOFMEMORY;
1650  }
1651  m_bDirty = TRUE;
1652 
1653  return S_OK;
1654 }
#define TRUE
Definition: types.h:120
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define debugstr_w
Definition: kernel32.h:32
#define TRACE(s)
Definition: solgame.cpp:4
#define GetProcessHeap()
Definition: compat.h:595
#define S_OK
Definition: intsafe.h:52
#define NULL
Definition: types.h:112
#define HeapFree(x, y, z)
Definition: compat.h:594

◆ SetDescription() [1/2]

HRESULT STDMETHODCALLTYPE CShellLink::SetDescription ( LPCSTR  pszName)
virtual

Implements IShellLinkA.

Definition at line 1153 of file CShellLink.cpp.

1154 {
1155  TRACE("(%p)->(pName=%s)\n", this, pszName);
1156 
1158  m_sDescription = NULL;
1159 
1160  if (pszName)
1161  {
1163  if (!m_sDescription)
1164  return E_OUTOFMEMORY;
1165  }
1166  m_bDirty = TRUE;
1167 
1168  return S_OK;
1169 }
#define TRUE
Definition: types.h:120
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define TRACE(s)
Definition: solgame.cpp:4
#define GetProcessHeap()
Definition: compat.h:595
#define S_OK
Definition: intsafe.h:52
#define NULL
Definition: types.h:112
#define HeapFree(x, y, z)
Definition: compat.h:594

◆ SetDescription() [2/2]

HRESULT STDMETHODCALLTYPE CShellLink::SetDescription ( LPCWSTR  pszName)
virtual

Implements IShellLinkW.

Definition at line 1576 of file CShellLink.cpp.

1577 {
1578  TRACE("(%p)->(desc=%s)\n", this, debugstr_w(pszName));
1579 
1581  m_sDescription = NULL;
1582 
1583  if (pszName)
1584  {
1585  m_sDescription = strdupW(pszName);
1586  if (!m_sDescription)
1587  return E_OUTOFMEMORY;
1588  }
1589  m_bDirty = TRUE;
1590 
1591  return S_OK;
1592 }
#define TRUE
Definition: types.h:120
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define debugstr_w
Definition: kernel32.h:32
#define TRACE(s)
Definition: solgame.cpp:4
#define GetProcessHeap()
Definition: compat.h:595
#define S_OK
Definition: intsafe.h:52
#define NULL
Definition: types.h:112
#define HeapFree(x, y, z)
Definition: compat.h:594

◆ SetFlags()

HRESULT STDMETHODCALLTYPE CShellLink::SetFlags ( DWORD  dwFlags)
virtual

Implements IShellLinkDataList.

Definition at line 2449 of file CShellLink.cpp.

2450 {
2451 #if 0 // FIXME!
2453  m_bDirty = TRUE;
2454  return S_OK;
2455 #else
2456  FIXME("\n");
2457  return E_NOTIMPL;
2458 #endif
2459 }
#define TRUE
Definition: types.h:120
#define FIXME(fmt,...)
Definition: debug.h:111
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1175
#define S_OK
Definition: intsafe.h:52
#define E_NOTIMPL
Definition: ddrawi.h:99

◆ SetHotkey()

HRESULT STDMETHODCALLTYPE CShellLink::SetHotkey ( WORD  wHotkey)
virtual

Implements IShellLinkA.

Definition at line 1242 of file CShellLink.cpp.

1243 {
1244  TRACE("(%p)->(hotkey=%x)\n", this, wHotkey);
1245 
1246  m_Header.wHotKey = wHotkey;
1247  m_bDirty = TRUE;
1248 
1249  return S_OK;
1250 }
#define TRUE
Definition: types.h:120
#define TRACE(s)
Definition: solgame.cpp:4
#define S_OK
Definition: intsafe.h:52

◆ SetIconLocation() [1/2]

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

Definition at line 1339 of file CShellLink.cpp.

1340 {
1341  TRACE("(%p)->(path=%s iicon=%u)\n", this, pszIconPath, iIcon);
1342 
1343  LPWSTR str = NULL;
1344  if (pszIconPath)
1345  {
1346  str = HEAP_strdupAtoW(GetProcessHeap(), 0, pszIconPath);
1347  if (!str)
1348  return E_OUTOFMEMORY;
1349  }
1350 
1351  HRESULT hr = SetIconLocation(str, iIcon);
1352 
1353  if (str)
1354  HeapFree(GetProcessHeap(), 0, str);
1355 
1356  return hr;
1357 }
HRESULT hr
Definition: shlfolder.c:183
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
const WCHAR * str
#define TRACE(s)
Definition: solgame.cpp:4
#define GetProcessHeap()
Definition: compat.h:595
LONG HRESULT
Definition: typedefs.h:79
#define NULL
Definition: types.h:112
WCHAR * LPWSTR
Definition: xmlstorage.h:184
#define HeapFree(x, y, z)
Definition: compat.h:594

Referenced by OnCommand().

◆ SetIconLocation() [2/2]

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

Definition at line 1876 of file CShellLink.cpp.

1877 {
1878  HRESULT hr = E_FAIL;
1879  WCHAR szIconPath[MAX_PATH];
1880 
1881  TRACE("(%p)->(path=%s iicon=%u)\n", this, debugstr_w(pszIconPath), iIcon);
1882 
1883  if (pszIconPath)
1884  {
1885  /*
1886  * Check whether the user-given file path contains unexpanded
1887  * environment variables. If so, create a target environment block.
1888  * Note that in this block we will store the user-given path.
1889  * It will contain the unexpanded environment variables, but
1890  * it can also contain already expanded path that the user does
1891  * not want to see them unexpanded (e.g. so that they always
1892  * refer to the same place even if the would-be corresponding
1893  * environment variable could change).
1894  */
1895 #ifdef ICON_LINK_WINDOWS_COMPAT
1896  /* Try to fully unexpand the icon path */
1897  // if (PathFullyUnExpandEnvStringsW(pszIconPath, szIconPath, _countof(szIconPath)))
1898  BOOL bSuccess = PathUnExpandEnvStringsW(pszIconPath, szIconPath, _countof(szIconPath));
1899  if (bSuccess && wcscmp(pszIconPath, szIconPath) != 0)
1900 #else
1901  /*
1902  * In some situations, described in http://stackoverflow.com/questions/2976489/ishelllinkseticonlocation-translates-my-icon-path-into-program-files-which-i
1903  * the result of PathUnExpandEnvStringsW() could be wrong, and instead
1904  * one would have to store the actual provided icon location path, while
1905  * creating an icon environment block ONLY if that path already contains
1906  * environment variables. This is what the present case is trying to implement.
1907  */