|  | /* | 
|  | * | 
|  | *	Copyright 1997	Marcus Meissner | 
|  | *	Copyright 1998	Juergen Schmied | 
|  | * | 
|  | */ | 
|  |  | 
|  | #include <ctype.h> | 
|  | #include <stdlib.h> | 
|  | #include <string.h> | 
|  | #include "ole.h" | 
|  | #include "ole2.h" | 
|  | #include "debug.h" | 
|  | #include "compobj.h" | 
|  | #include "interfaces.h" | 
|  | #include "shlobj.h" | 
|  | #include "shell.h" | 
|  | #include "winerror.h" | 
|  | #include "winnls.h" | 
|  | #include "winproc.h" | 
|  | #include "commctrl.h" | 
|  | #include "pidl.h" | 
|  |  | 
|  | #include "shell32_main.h" | 
|  |  | 
|  | /* IShellLink Implementation */ | 
|  | static HRESULT WINAPI IShellLink_QueryInterface(LPSHELLLINK,REFIID,LPVOID*); | 
|  | static ULONG WINAPI IShellLink_AddRef(LPSHELLLINK); | 
|  | static ULONG WINAPI IShellLink_Release(LPSHELLLINK); | 
|  | static HRESULT WINAPI IShellLink_GetPath(LPSHELLLINK, LPSTR,INT32, WIN32_FIND_DATA32A *, DWORD); | 
|  | static HRESULT WINAPI IShellLink_GetIDList(LPSHELLLINK, LPITEMIDLIST *); | 
|  | static HRESULT WINAPI IShellLink_SetIDList(LPSHELLLINK, LPCITEMIDLIST); | 
|  | static HRESULT WINAPI IShellLink_GetDescription(LPSHELLLINK, LPSTR,INT32); | 
|  | static HRESULT WINAPI IShellLink_SetDescription(LPSHELLLINK, LPCSTR); | 
|  | static HRESULT WINAPI IShellLink_GetWorkingDirectory(LPSHELLLINK, LPSTR,INT32); | 
|  | static HRESULT WINAPI IShellLink_SetWorkingDirectory(LPSHELLLINK, LPCSTR); | 
|  | static HRESULT WINAPI IShellLink_GetArguments(LPSHELLLINK, LPSTR,INT32); | 
|  | static HRESULT WINAPI IShellLink_SetArguments(LPSHELLLINK, LPCSTR); | 
|  | static HRESULT WINAPI IShellLink_GetHotkey(LPSHELLLINK, WORD *); | 
|  | static HRESULT WINAPI IShellLink_SetHotkey(LPSHELLLINK, WORD); | 
|  | static HRESULT WINAPI IShellLink_GetShowCmd(LPSHELLLINK, INT32 *); | 
|  | static HRESULT WINAPI IShellLink_SetShowCmd(LPSHELLLINK, INT32); | 
|  | static HRESULT WINAPI IShellLink_GetIconLocation(LPSHELLLINK, LPSTR,INT32,INT32 *); | 
|  | static HRESULT WINAPI IShellLink_SetIconLocation(LPSHELLLINK, LPCSTR,INT32); | 
|  | static HRESULT WINAPI IShellLink_SetRelativePath(LPSHELLLINK, LPCSTR, DWORD); | 
|  | static HRESULT WINAPI IShellLink_Resolve(LPSHELLLINK, HWND32, DWORD); | 
|  | static HRESULT WINAPI IShellLink_SetPath(LPSHELLLINK, LPCSTR); | 
|  |  | 
|  | /************************************************************************** | 
|  | * IShellLink Implementation | 
|  | */ | 
|  |  | 
|  | static struct IShellLink_VTable slvt = | 
|  | {	IShellLink_QueryInterface, | 
|  | IShellLink_AddRef, | 
|  | IShellLink_Release, | 
|  | IShellLink_GetPath, | 
|  | IShellLink_GetIDList, | 
|  | IShellLink_SetIDList, | 
|  | IShellLink_GetDescription, | 
|  | IShellLink_SetDescription, | 
|  | IShellLink_GetWorkingDirectory, | 
|  | IShellLink_SetWorkingDirectory, | 
|  | IShellLink_GetArguments, | 
|  | IShellLink_SetArguments, | 
|  | IShellLink_GetHotkey, | 
|  | IShellLink_SetHotkey, | 
|  | IShellLink_GetShowCmd, | 
|  | IShellLink_SetShowCmd, | 
|  | IShellLink_GetIconLocation, | 
|  | IShellLink_SetIconLocation, | 
|  | IShellLink_SetRelativePath, | 
|  | IShellLink_Resolve, | 
|  | IShellLink_SetPath | 
|  | }; | 
|  |  | 
|  | /************************************************************************** | 
|  | *	  IShellLink_Constructor | 
|  | */ | 
|  | LPSHELLLINK IShellLink_Constructor() | 
|  | {	LPSHELLLINK sl; | 
|  |  | 
|  | sl = (LPSHELLLINK)HeapAlloc(GetProcessHeap(),0,sizeof(IShellLink)); | 
|  | sl->ref = 1; | 
|  | sl->lpvtbl = &slvt; | 
|  | TRACE(shell,"(%p)->()\n",sl); | 
|  | return sl; | 
|  | } | 
|  |  | 
|  | /************************************************************************** | 
|  | *  IShellLink::QueryInterface | 
|  | */ | 
|  | static HRESULT WINAPI IShellLink_QueryInterface( | 
|  | LPSHELLLINK this, REFIID riid, LPVOID *ppvObj) | 
|  | {  char    xriid[50]; | 
|  | WINE_StringFromCLSID((LPCLSID)riid,xriid); | 
|  | TRACE(shell,"(%p)->(\n\tIID:\t%s)\n",this,xriid); | 
|  |  | 
|  | *ppvObj = NULL; | 
|  |  | 
|  | if(IsEqualIID(riid, &IID_IUnknown))          /*IUnknown*/ | 
|  | { *ppvObj = this; | 
|  | } | 
|  | else if(IsEqualIID(riid, &IID_IShellLink))  /*IShellLink*/ | 
|  | {    *ppvObj = (LPSHELLLINK)this; | 
|  | } | 
|  |  | 
|  | if(*ppvObj) | 
|  | { (*(LPSHELLLINK*)ppvObj)->lpvtbl->fnAddRef(this); | 
|  | TRACE(shell,"-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj); | 
|  | return S_OK; | 
|  | } | 
|  | TRACE(shell,"-- Interface: E_NOINTERFACE\n"); | 
|  | return E_NOINTERFACE; | 
|  | } | 
|  | /****************************************************************************** | 
|  | * IShellLink_AddRef | 
|  | */ | 
|  | static ULONG WINAPI IShellLink_AddRef(LPSHELLLINK this) | 
|  | { TRACE(shell,"(%p)->(count=%lu)\n",this,this->ref); | 
|  | return ++(this->ref); | 
|  | } | 
|  | /****************************************************************************** | 
|  | * IClassFactory_Release | 
|  | */ | 
|  | static ULONG WINAPI IShellLink_Release(LPSHELLLINK this) | 
|  | { TRACE(shell,"(%p)->(count=%lu)\n",this,this->ref); | 
|  | if (!--(this->ref)) | 
|  | { TRACE(shell,"-- destroying IShellLink(%p)\n",this); | 
|  | HeapFree(GetProcessHeap(),0,this); | 
|  | return 0; | 
|  | } | 
|  | return this->ref; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI IShellLink_GetPath(LPSHELLLINK this, LPSTR pszFile,INT32 cchMaxPath, WIN32_FIND_DATA32A *pfd, DWORD fFlags) | 
|  | {	FIXME(shell,"(%p)->(pfile=%p len=%u find_data=%p flags=%lu)\n",this, pszFile, cchMaxPath, pfd, fFlags); | 
|  | strncpy(pszFile,"c:\\foo.bar", cchMaxPath); | 
|  | return NOERROR; | 
|  | } | 
|  | static HRESULT WINAPI IShellLink_GetIDList(LPSHELLLINK this, LPITEMIDLIST * ppidl) | 
|  | {	FIXME(shell,"(%p)->(ppidl=%p)\n",this, ppidl); | 
|  | *ppidl = _ILCreateDesktop(); | 
|  | return NOERROR; | 
|  | } | 
|  | static HRESULT WINAPI IShellLink_SetIDList(LPSHELLLINK this, LPCITEMIDLIST pidl) | 
|  | {	FIXME(shell,"(%p)->(pidl=%p)\n",this, pidl); | 
|  | return NOERROR; | 
|  | } | 
|  | static HRESULT WINAPI IShellLink_GetDescription(LPSHELLLINK this, LPSTR pszName,INT32 cchMaxName) | 
|  | {	FIXME(shell,"(%p)->(%p len=%u)\n",this, pszName, cchMaxName); | 
|  | strncpy(pszName,"Description, FIXME",cchMaxName); | 
|  | return NOERROR; | 
|  | } | 
|  | static HRESULT WINAPI IShellLink_SetDescription(LPSHELLLINK this, LPCSTR pszName) | 
|  | {	FIXME(shell,"(%p)->(desc=%s)\n",this, pszName); | 
|  | return NOERROR; | 
|  | } | 
|  | static HRESULT WINAPI IShellLink_GetWorkingDirectory(LPSHELLLINK this, LPSTR pszDir,INT32 cchMaxPath) | 
|  | {	FIXME(shell,"(%p)->()\n",this); | 
|  | strncpy(pszDir,"c:\\", cchMaxPath); | 
|  | return NOERROR; | 
|  | } | 
|  | static HRESULT WINAPI IShellLink_SetWorkingDirectory(LPSHELLLINK this, LPCSTR pszDir) | 
|  | {	FIXME(shell,"(%p)->(dir=%s)\n",this, pszDir); | 
|  | return NOERROR; | 
|  | } | 
|  | static HRESULT WINAPI IShellLink_GetArguments(LPSHELLLINK this, LPSTR pszArgs,INT32 cchMaxPath) | 
|  | {	FIXME(shell,"(%p)->(%p len=%u)\n",this, pszArgs, cchMaxPath); | 
|  | strncpy(pszArgs, "", cchMaxPath); | 
|  | return NOERROR; | 
|  | } | 
|  | static HRESULT WINAPI IShellLink_SetArguments(LPSHELLLINK this, LPCSTR pszArgs) | 
|  | {	FIXME(shell,"(%p)->(args=%s)\n",this, pszArgs); | 
|  | return NOERROR; | 
|  | } | 
|  | static HRESULT WINAPI IShellLink_GetHotkey(LPSHELLLINK this, WORD *pwHotkey) | 
|  | {	FIXME(shell,"(%p)->(%p)\n",this, pwHotkey); | 
|  | *pwHotkey=0x0; | 
|  | return NOERROR; | 
|  | } | 
|  | static HRESULT WINAPI IShellLink_SetHotkey(LPSHELLLINK this, WORD wHotkey) | 
|  | {	FIXME(shell,"(%p)->(hotkey=%x)\n",this, wHotkey); | 
|  | return NOERROR; | 
|  | } | 
|  | static HRESULT WINAPI IShellLink_GetShowCmd(LPSHELLLINK this, INT32 *piShowCmd) | 
|  | {	FIXME(shell,"(%p)->(%p)\n",this, piShowCmd); | 
|  | *piShowCmd=0; | 
|  | return NOERROR; | 
|  | } | 
|  | static HRESULT WINAPI IShellLink_SetShowCmd(LPSHELLLINK this, INT32 iShowCmd) | 
|  | {	FIXME(shell,"(%p)->(showcmd=%x)\n",this, iShowCmd); | 
|  | return NOERROR; | 
|  | } | 
|  | static HRESULT WINAPI IShellLink_GetIconLocation(LPSHELLLINK this, LPSTR pszIconPath,INT32 cchIconPath,INT32 *piIcon) | 
|  | {	FIXME(shell,"(%p)->(%p len=%u iicon=%p)\n",this, pszIconPath, cchIconPath, piIcon); | 
|  | strncpy(pszIconPath,"shell32.dll",cchIconPath); | 
|  | *piIcon=1; | 
|  | return NOERROR; | 
|  | } | 
|  | static HRESULT WINAPI IShellLink_SetIconLocation(LPSHELLLINK this, LPCSTR pszIconPath,INT32 iIcon) | 
|  | {	FIXME(shell,"(%p)->(path=%s iicon=%u)\n",this, pszIconPath, iIcon); | 
|  | return NOERROR; | 
|  | } | 
|  | static HRESULT WINAPI IShellLink_SetRelativePath(LPSHELLLINK this, LPCSTR pszPathRel, DWORD dwReserved) | 
|  | {	FIXME(shell,"(%p)->(path=%s %lx)\n",this, pszPathRel, dwReserved); | 
|  | return NOERROR; | 
|  | } | 
|  | static HRESULT WINAPI IShellLink_Resolve(LPSHELLLINK this, HWND32 hwnd, DWORD fFlags) | 
|  | {	FIXME(shell,"(%p)->(hwnd=%x flags=%lx)\n",this, hwnd, fFlags); | 
|  | return NOERROR; | 
|  | } | 
|  | static HRESULT WINAPI IShellLink_SetPath(LPSHELLLINK this, LPCSTR pszFile) | 
|  | {	FIXME(shell,"(%p)->(path=%s)\n",this, pszFile); | 
|  | return NOERROR; | 
|  | } | 
|  |  | 
|  | /* IShellLinkW Implementation */ | 
|  | static HRESULT WINAPI IShellLinkW_QueryInterface(LPSHELLLINKW,REFIID,LPVOID*); | 
|  | static ULONG WINAPI IShellLinkW_AddRef(LPSHELLLINKW); | 
|  | static ULONG WINAPI IShellLinkW_Release(LPSHELLLINKW); | 
|  | static HRESULT WINAPI IShellLinkW_GetPath(LPSHELLLINKW, LPWSTR,INT32, WIN32_FIND_DATA32A *, DWORD); | 
|  | static HRESULT WINAPI IShellLinkW_GetIDList(LPSHELLLINKW, LPITEMIDLIST *); | 
|  | static HRESULT WINAPI IShellLinkW_SetIDList(LPSHELLLINKW, LPCITEMIDLIST); | 
|  | static HRESULT WINAPI IShellLinkW_GetDescription(LPSHELLLINKW, LPWSTR,INT32); | 
|  | static HRESULT WINAPI IShellLinkW_SetDescription(LPSHELLLINKW, LPCWSTR); | 
|  | static HRESULT WINAPI IShellLinkW_GetWorkingDirectory(LPSHELLLINKW, LPWSTR,INT32); | 
|  | static HRESULT WINAPI IShellLinkW_SetWorkingDirectory(LPSHELLLINKW, LPCWSTR); | 
|  | static HRESULT WINAPI IShellLinkW_GetArguments(LPSHELLLINKW, LPWSTR,INT32); | 
|  | static HRESULT WINAPI IShellLinkW_SetArguments(LPSHELLLINKW, LPCWSTR); | 
|  | static HRESULT WINAPI IShellLinkW_GetHotkey(LPSHELLLINKW, WORD *); | 
|  | static HRESULT WINAPI IShellLinkW_SetHotkey(LPSHELLLINKW, WORD); | 
|  | static HRESULT WINAPI IShellLinkW_GetShowCmd(LPSHELLLINKW, INT32 *); | 
|  | static HRESULT WINAPI IShellLinkW_SetShowCmd(LPSHELLLINKW, INT32); | 
|  | static HRESULT WINAPI IShellLinkW_GetIconLocation(LPSHELLLINKW, LPWSTR,INT32,INT32 *); | 
|  | static HRESULT WINAPI IShellLinkW_SetIconLocation(LPSHELLLINKW, LPCWSTR,INT32); | 
|  | static HRESULT WINAPI IShellLinkW_SetRelativePath(LPSHELLLINKW, LPCWSTR, DWORD); | 
|  | static HRESULT WINAPI IShellLinkW_Resolve(LPSHELLLINKW, HWND32, DWORD); | 
|  | static HRESULT WINAPI IShellLinkW_SetPath(LPSHELLLINKW, LPCWSTR); | 
|  |  | 
|  | /************************************************************************** | 
|  | * IShellLinkW Implementation | 
|  | */ | 
|  |  | 
|  | static struct IShellLinkW_VTable slvtw = | 
|  | {	IShellLinkW_QueryInterface, | 
|  | IShellLinkW_AddRef, | 
|  | IShellLinkW_Release, | 
|  | IShellLinkW_GetPath, | 
|  | IShellLinkW_GetIDList, | 
|  | IShellLinkW_SetIDList, | 
|  | IShellLinkW_GetDescription, | 
|  | IShellLinkW_SetDescription, | 
|  | IShellLinkW_GetWorkingDirectory, | 
|  | IShellLinkW_SetWorkingDirectory, | 
|  | IShellLinkW_GetArguments, | 
|  | IShellLinkW_SetArguments, | 
|  | IShellLinkW_GetHotkey, | 
|  | IShellLinkW_SetHotkey, | 
|  | IShellLinkW_GetShowCmd, | 
|  | IShellLinkW_SetShowCmd, | 
|  | IShellLinkW_GetIconLocation, | 
|  | IShellLinkW_SetIconLocation, | 
|  | IShellLinkW_SetRelativePath, | 
|  | IShellLinkW_Resolve, | 
|  | IShellLinkW_SetPath | 
|  | }; | 
|  |  | 
|  | /************************************************************************** | 
|  | *	  IShellLinkW_Constructor | 
|  | */ | 
|  | LPSHELLLINKW IShellLinkW_Constructor() | 
|  | {	LPSHELLLINKW sl; | 
|  |  | 
|  | sl = (LPSHELLLINKW)HeapAlloc(GetProcessHeap(),0,sizeof(IShellLinkW)); | 
|  | sl->ref = 1; | 
|  | sl->lpvtbl = &slvtw; | 
|  | TRACE(shell,"(%p)->()\n",sl); | 
|  | return sl; | 
|  | } | 
|  |  | 
|  | /************************************************************************** | 
|  | *  IShellLinkW::QueryInterface | 
|  | */ | 
|  | static HRESULT WINAPI IShellLinkW_QueryInterface( | 
|  | LPSHELLLINKW this, REFIID riid, LPVOID *ppvObj) | 
|  | {  char    xriid[50]; | 
|  | WINE_StringFromCLSID((LPCLSID)riid,xriid); | 
|  | TRACE(shell,"(%p)->(\n\tIID:\t%s)\n",this,xriid); | 
|  |  | 
|  | *ppvObj = NULL; | 
|  |  | 
|  | if(IsEqualIID(riid, &IID_IUnknown))          /*IUnknown*/ | 
|  | { *ppvObj = this; | 
|  | } | 
|  | else if(IsEqualIID(riid, &IID_IShellLinkW))  /*IShellLinkW*/ | 
|  | {    *ppvObj = (LPSHELLLINKW)this; | 
|  | } | 
|  |  | 
|  | if(*ppvObj) | 
|  | { (*(LPSHELLLINKW*)ppvObj)->lpvtbl->fnAddRef(this); | 
|  | TRACE(shell,"-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj); | 
|  | return S_OK; | 
|  | } | 
|  | TRACE(shell,"-- Interface: E_NOINTERFACE\n"); | 
|  | return E_NOINTERFACE; | 
|  | } | 
|  | /****************************************************************************** | 
|  | * IShellLinkW_AddRef | 
|  | */ | 
|  | static ULONG WINAPI IShellLinkW_AddRef(LPSHELLLINKW this) | 
|  | { TRACE(shell,"(%p)->(count=%lu)\n",this,this->ref); | 
|  | return ++(this->ref); | 
|  | } | 
|  | /****************************************************************************** | 
|  | * IClassFactory_Release | 
|  | */ | 
|  | static ULONG WINAPI IShellLinkW_Release(LPSHELLLINKW this) | 
|  | { TRACE(shell,"(%p)->(count=%lu)\n",this,this->ref); | 
|  | if (!--(this->ref)) | 
|  | { TRACE(shell,"-- destroying IShellLinkW(%p)\n",this); | 
|  | HeapFree(GetProcessHeap(),0,this); | 
|  | return 0; | 
|  | } | 
|  | return this->ref; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI IShellLinkW_GetPath(LPSHELLLINKW this, LPWSTR pszFile,INT32 cchMaxPath, WIN32_FIND_DATA32A *pfd, DWORD fFlags) | 
|  | {	FIXME(shell,"(%p)->(pfile=%p len=%u find_data=%p flags=%lu)\n",this, pszFile, cchMaxPath, pfd, fFlags); | 
|  | lstrcpynAtoW(pszFile,"c:\\foo.bar", cchMaxPath); | 
|  | return NOERROR; | 
|  | } | 
|  | static HRESULT WINAPI IShellLinkW_GetIDList(LPSHELLLINKW this, LPITEMIDLIST * ppidl) | 
|  | {	FIXME(shell,"(%p)->(ppidl=%p)\n",this, ppidl); | 
|  | *ppidl = _ILCreateDesktop(); | 
|  | return NOERROR; | 
|  | } | 
|  | static HRESULT WINAPI IShellLinkW_SetIDList(LPSHELLLINKW this, LPCITEMIDLIST pidl) | 
|  | {	FIXME(shell,"(%p)->(pidl=%p)\n",this, pidl); | 
|  | return NOERROR; | 
|  | } | 
|  | static HRESULT WINAPI IShellLinkW_GetDescription(LPSHELLLINKW this, LPWSTR pszName,INT32 cchMaxName) | 
|  | {	FIXME(shell,"(%p)->(%p len=%u)\n",this, pszName, cchMaxName); | 
|  | lstrcpynAtoW(pszName,"Description, FIXME",cchMaxName); | 
|  | return NOERROR; | 
|  | } | 
|  | static HRESULT WINAPI IShellLinkW_SetDescription(LPSHELLLINKW this, LPCWSTR pszName) | 
|  | {	FIXME(shell,"(%p)->(desc=%s)\n",this, debugstr_w(pszName)); | 
|  | return NOERROR; | 
|  | } | 
|  | static HRESULT WINAPI IShellLinkW_GetWorkingDirectory(LPSHELLLINKW this, LPWSTR pszDir,INT32 cchMaxPath) | 
|  | {	FIXME(shell,"(%p)->()\n",this); | 
|  | lstrcpynAtoW(pszDir,"c:\\", cchMaxPath); | 
|  | return NOERROR; | 
|  | } | 
|  | static HRESULT WINAPI IShellLinkW_SetWorkingDirectory(LPSHELLLINKW this, LPCWSTR pszDir) | 
|  | {	FIXME(shell,"(%p)->(dir=%s)\n",this, debugstr_w(pszDir)); | 
|  | return NOERROR; | 
|  | } | 
|  | static HRESULT WINAPI IShellLinkW_GetArguments(LPSHELLLINKW this, LPWSTR pszArgs,INT32 cchMaxPath) | 
|  | {	FIXME(shell,"(%p)->(%p len=%u)\n",this, pszArgs, cchMaxPath); | 
|  | lstrcpynAtoW(pszArgs, "", cchMaxPath); | 
|  | return NOERROR; | 
|  | } | 
|  | static HRESULT WINAPI IShellLinkW_SetArguments(LPSHELLLINKW this, LPCWSTR pszArgs) | 
|  | {	FIXME(shell,"(%p)->(args=%s)\n",this, debugstr_w(pszArgs)); | 
|  | return NOERROR; | 
|  | } | 
|  | static HRESULT WINAPI IShellLinkW_GetHotkey(LPSHELLLINKW this, WORD *pwHotkey) | 
|  | {	FIXME(shell,"(%p)->(%p)\n",this, pwHotkey); | 
|  | *pwHotkey=0x0; | 
|  | return NOERROR; | 
|  | } | 
|  | static HRESULT WINAPI IShellLinkW_SetHotkey(LPSHELLLINKW this, WORD wHotkey) | 
|  | {	FIXME(shell,"(%p)->(hotkey=%x)\n",this, wHotkey); | 
|  | return NOERROR; | 
|  | } | 
|  | static HRESULT WINAPI IShellLinkW_GetShowCmd(LPSHELLLINKW this, INT32 *piShowCmd) | 
|  | {	FIXME(shell,"(%p)->(%p)\n",this, piShowCmd); | 
|  | *piShowCmd=0; | 
|  | return NOERROR; | 
|  | } | 
|  | static HRESULT WINAPI IShellLinkW_SetShowCmd(LPSHELLLINKW this, INT32 iShowCmd) | 
|  | {	FIXME(shell,"(%p)->(showcmd=%x)\n",this, iShowCmd); | 
|  | return NOERROR; | 
|  | } | 
|  | static HRESULT WINAPI IShellLinkW_GetIconLocation(LPSHELLLINKW this, LPWSTR pszIconPath,INT32 cchIconPath,INT32 *piIcon) | 
|  | {	FIXME(shell,"(%p)->(%p len=%u iicon=%p)\n",this, pszIconPath, cchIconPath, piIcon); | 
|  | lstrcpynAtoW(pszIconPath,"shell32.dll",cchIconPath); | 
|  | *piIcon=1; | 
|  | return NOERROR; | 
|  | } | 
|  | static HRESULT WINAPI IShellLinkW_SetIconLocation(LPSHELLLINKW this, LPCWSTR pszIconPath,INT32 iIcon) | 
|  | {	FIXME(shell,"(%p)->(path=%s iicon=%u)\n",this, debugstr_w(pszIconPath), iIcon); | 
|  | return NOERROR; | 
|  | } | 
|  | static HRESULT WINAPI IShellLinkW_SetRelativePath(LPSHELLLINKW this, LPCWSTR pszPathRel, DWORD dwReserved) | 
|  | {	FIXME(shell,"(%p)->(path=%s %lx)\n",this, debugstr_w(pszPathRel), dwReserved); | 
|  | return NOERROR; | 
|  | } | 
|  | static HRESULT WINAPI IShellLinkW_Resolve(LPSHELLLINKW this, HWND32 hwnd, DWORD fFlags) | 
|  | {	FIXME(shell,"(%p)->(hwnd=%x flags=%lx)\n",this, hwnd, fFlags); | 
|  | return NOERROR; | 
|  | } | 
|  | static HRESULT WINAPI IShellLinkW_SetPath(LPSHELLLINKW this, LPCWSTR pszFile) | 
|  | {	FIXME(shell,"(%p)->(path=%s)\n",this, debugstr_w(pszFile)); | 
|  | return NOERROR; | 
|  | } | 
|  |  |