From 7109799530ec63f2a78e1ffa2a42461c143a6722 Mon Sep 17 00:00:00 2001 From: Juergen Schmied Date: Wed, 25 Nov 1998 16:39:47 +0000 Subject: [PATCH] Moved existing IShellLink class. New stubs for IShellLinkW. --- dlls/shell32/folders.c | 196 ------------------- dlls/shell32/shelllink.c | 409 +++++++++++++++++++++++++++++++++++++++ dlls/shell32/shellole.c | 3 + include/shlobj.h | 48 +++++ 4 files changed, 460 insertions(+), 196 deletions(-) create mode 100644 dlls/shell32/shelllink.c diff --git a/dlls/shell32/folders.c b/dlls/shell32/folders.c index a243c73e635..eb9082a3045 100644 --- a/dlls/shell32/folders.c +++ b/dlls/shell32/folders.c @@ -1,11 +1,7 @@ /* - * Shell Folder stuff (...and all the OLE-Objects of SHELL32.DLL) - * * Copyright 1997 Marcus Meissner * Copyright 1998 Juergen Schmied * - * !!! currently work in progress on all classes !!! - * */ #include @@ -39,29 +35,6 @@ static ULONG WINAPI IExtractIcon_Release(LPEXTRACTICON); static HRESULT WINAPI IExtractIcon_GetIconLocation(LPEXTRACTICON, UINT32, LPSTR, UINT32, int *, UINT32 *); static HRESULT WINAPI IExtractIcon_Extract(LPEXTRACTICON, LPCSTR, UINT32, HICON32 *, HICON32 *, UINT32); -/* 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); - /*********************************************************************** * IExtractIcon implementation @@ -158,172 +131,3 @@ static HRESULT WINAPI IExtractIcon_Extract(LPEXTRACTICON this, LPCSTR pszFile, U return S_OK; } -/************************************************************************** -* 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; -} - diff --git a/dlls/shell32/shelllink.c b/dlls/shell32/shelllink.c new file mode 100644 index 00000000000..da75875f9d3 --- /dev/null +++ b/dlls/shell32/shelllink.c @@ -0,0 +1,409 @@ +/* + * + * Copyright 1997 Marcus Meissner + * Copyright 1998 Juergen Schmied + * + */ + +#include +#include +#include +#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; +} + diff --git a/dlls/shell32/shellole.c b/dlls/shell32/shellole.c index d5a10fd4e0e..a645c5a292b 100644 --- a/dlls/shell32/shellole.c +++ b/dlls/shell32/shellole.c @@ -309,6 +309,9 @@ static HRESULT WINAPI IClassFactory_CreateInstance( else if (IsEqualIID(riid, &IID_IShellLink)) { pObj = (IUnknown *)IShellLink_Constructor(); } + else if (IsEqualIID(riid, &IID_IShellLinkW)) + { pObj = (IUnknown *)IShellLinkW_Constructor(); + } else if (IsEqualIID(riid, &IID_IExtractIcon)) { pObj = (IUnknown *)IExtractIcon_Constructor(NULL); } diff --git a/include/shlobj.h b/include/shlobj.h index 7c23bd5e62c..459d3f7807f 100644 --- a/include/shlobj.h +++ b/include/shlobj.h @@ -944,6 +944,53 @@ struct IShellLink { #undef THIS +#define THIS LPSHELLLINKW this + +typedef struct IShellLinkW IShellLinkW,*LPSHELLLINKW; +typedef struct IShellLinkW_VTable +{ + /* *** IUnknown methods *** */ + STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + + STDMETHOD(GetPath)(THIS_ LPWSTR pszFile,INT32 cchMaxPath, WIN32_FIND_DATA32A *pfd, DWORD fFlags) PURE; + + STDMETHOD(GetIDList)(THIS_ LPITEMIDLIST * ppidl) PURE; + STDMETHOD(SetIDList)(THIS_ LPCITEMIDLIST pidl) PURE; + + STDMETHOD(GetDescription)(THIS_ LPWSTR pszName,INT32 cchMaxName) PURE; + STDMETHOD(SetDescription)(THIS_ LPCWSTR pszName) PURE; + + STDMETHOD(GetWorkingDirectory)(THIS_ LPWSTR pszDir,INT32 cchMaxPath) PURE; + STDMETHOD(SetWorkingDirectory)(THIS_ LPCWSTR pszDir) PURE; + + STDMETHOD(GetArguments)(THIS_ LPWSTR pszArgs,INT32 cchMaxPath) PURE; + STDMETHOD(SetArguments)(THIS_ LPCWSTR pszArgs) PURE; + + STDMETHOD(GetHotkey)(THIS_ WORD *pwHotkey) PURE; + STDMETHOD(SetHotkey)(THIS_ WORD wHotkey) PURE; + + STDMETHOD(GetShowCmd)(THIS_ INT32 *piShowCmd) PURE; + STDMETHOD(SetShowCmd)(THIS_ INT32 iShowCmd) PURE; + + STDMETHOD(GetIconLocation)(THIS_ LPWSTR pszIconPath,INT32 cchIconPath,INT32 *piIcon) PURE; + STDMETHOD(SetIconLocation)(THIS_ LPCWSTR pszIconPath,INT32 iIcon) PURE; + + STDMETHOD(SetRelativePath)(THIS_ LPCWSTR pszPathRel, DWORD dwReserved) PURE; + + STDMETHOD(Resolve)(THIS_ HWND32 hwnd, DWORD fFlags) PURE; + + STDMETHOD(SetPath)(THIS_ LPCWSTR pszFile) PURE; +} IShellLinkW_VTable,*LPSHELLLINKW_VTABLE; + +struct IShellLinkW { + LPSHELLLINKW_VTABLE lpvtbl; + DWORD ref; +}; + +#undef THIS + /**************************************************************************** * IExtractIconinterface * @@ -1067,6 +1114,7 @@ extern LPCONTEXTMENU IContextMenu_Constructor(LPSHELLFOLDER, LPCITEMIDLIST *, UI extern LPSHELLFOLDER IShellFolder_Constructor(LPSHELLFOLDER,LPITEMIDLIST); extern LPSHELLVIEW IShellView_Constructor(LPSHELLFOLDER, LPCITEMIDLIST); extern LPSHELLLINK IShellLink_Constructor(void); +extern LPSHELLLINKW IShellLinkW_Constructor(void); extern LPENUMIDLIST IEnumIDList_Constructor(LPCSTR,DWORD); extern LPEXTRACTICON IExtractIcon_Constructor(LPITEMIDLIST); #endif