| /* | |
| * | |
| * 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; | |
| } | |