Implemented reading of *.lnk-files.
This commit is contained in:
parent
e7fb5ecfd4
commit
671c8846d1
|
@ -11,17 +11,56 @@
|
||||||
|
|
||||||
#include "wine/obj_base.h"
|
#include "wine/obj_base.h"
|
||||||
#include "wine/obj_storage.h"
|
#include "wine/obj_storage.h"
|
||||||
|
#include "wine/obj_shelllink.h"
|
||||||
|
|
||||||
|
#include "heap.h"
|
||||||
|
#include "winnls.h"
|
||||||
#include "pidl.h"
|
#include "pidl.h"
|
||||||
#include "shell32_main.h"
|
#include "shell32_main.h"
|
||||||
#include "shlguid.h"
|
#include "shlguid.h"
|
||||||
|
|
||||||
|
/* link file formats */
|
||||||
|
|
||||||
|
#pragma (1);
|
||||||
|
|
||||||
|
/* lnk elements: simple link has 0x0B */
|
||||||
|
#define WORKDIR 0x10
|
||||||
|
#define ARGUMENT 0x20
|
||||||
|
#define ICON 0x40
|
||||||
|
/* startup type */
|
||||||
|
#define NORMAL 0x01
|
||||||
|
#define MAXIMIZED 0x03
|
||||||
|
#define MINIMIZED 0x07
|
||||||
|
|
||||||
|
typedef struct _LINK_HEADER
|
||||||
|
{ DWORD MagicStr; /* 0x00 'L','\0','\0','\0' */
|
||||||
|
GUID MagicGuid; /* 0x04 is CLSID_ShellLink */
|
||||||
|
DWORD Flag1; /* 0x14 describes elements following */
|
||||||
|
DWORD Flag2; /* 0x18 */
|
||||||
|
FILETIME Time1; /* 0x1c */
|
||||||
|
FILETIME Time2; /* 0x24 */
|
||||||
|
FILETIME Time3; /* 0x2c */
|
||||||
|
DWORD Unknown1; /* 0x34 */
|
||||||
|
DWORD Unknown2; /* 0x38 icon number */
|
||||||
|
DWORD Flag3; /* 0x3c startup type */
|
||||||
|
DWORD Unknown4; /* 0x40 hotkey */
|
||||||
|
DWORD Unknown5; /* 0x44 */
|
||||||
|
DWORD Unknown6; /* 0x48 */
|
||||||
|
USHORT PidlSize; /* 0x4c */
|
||||||
|
ITEMIDLIST Pidl; /* 0x4e */
|
||||||
|
} LINK_HEADER, * PLINK_HEADER;
|
||||||
|
|
||||||
|
#pragma (4);
|
||||||
|
|
||||||
/* IPersistFile Implementation */
|
/* IPersistFile Implementation */
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
/* IUnknown fields */
|
/* IUnknown fields */
|
||||||
ICOM_VTABLE(IPersistFile)* lpvtbl;
|
ICOM_VTABLE(IPersistFile)* lpvtbl;
|
||||||
DWORD ref;
|
DWORD ref;
|
||||||
|
LPSTR sPath;
|
||||||
|
LPITEMIDLIST pPidl;
|
||||||
|
|
||||||
} IPersistFileImpl;
|
} IPersistFileImpl;
|
||||||
|
|
||||||
static struct ICOM_VTABLE(IPersistFile) pfvt;
|
static struct ICOM_VTABLE(IPersistFile) pfvt;
|
||||||
|
@ -30,17 +69,19 @@ static struct ICOM_VTABLE(IPersistFile) pfvt;
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
* IPersistFile_Constructor
|
* IPersistFile_Constructor
|
||||||
*/
|
*/
|
||||||
LPPERSISTFILE IPersistFile_Constructor(void)
|
IPersistFileImpl * IPersistFile_Constructor(void)
|
||||||
{
|
{
|
||||||
IPersistFileImpl* sl;
|
IPersistFileImpl* sl;
|
||||||
|
|
||||||
sl = (IPersistFileImpl*)HeapAlloc(GetProcessHeap(),0,sizeof(IPersistFileImpl));
|
sl = (IPersistFileImpl*)HeapAlloc(GetProcessHeap(),0,sizeof(IPersistFileImpl));
|
||||||
sl->ref = 1;
|
sl->ref = 1;
|
||||||
sl->lpvtbl = &pfvt;
|
sl->lpvtbl = &pfvt;
|
||||||
|
sl->sPath = NULL;
|
||||||
|
sl->pPidl = NULL;
|
||||||
|
|
||||||
TRACE(shell,"(%p)->()\n",sl);
|
TRACE(shell,"(%p)->()\n",sl);
|
||||||
shell32_ObjCount++;
|
shell32_ObjCount++;
|
||||||
return (LPPERSISTFILE)sl;
|
return sl;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
|
@ -50,6 +91,7 @@ static HRESULT WINAPI IPersistFile_fnQueryInterface(
|
||||||
IPersistFile* iface, REFIID riid, LPVOID *ppvObj)
|
IPersistFile* iface, REFIID riid, LPVOID *ppvObj)
|
||||||
{
|
{
|
||||||
ICOM_THIS(IPersistFileImpl,iface);
|
ICOM_THIS(IPersistFileImpl,iface);
|
||||||
|
|
||||||
char xriid[50];
|
char xriid[50];
|
||||||
WINE_StringFromCLSID((LPCLSID)riid,xriid);
|
WINE_StringFromCLSID((LPCLSID)riid,xriid);
|
||||||
TRACE(shell,"(%p)->(\n\tIID:\t%s)\n",This,xriid);
|
TRACE(shell,"(%p)->(\n\tIID:\t%s)\n",This,xriid);
|
||||||
|
@ -77,6 +119,7 @@ static HRESULT WINAPI IPersistFile_fnQueryInterface(
|
||||||
static ULONG WINAPI IPersistFile_fnAddRef(IPersistFile* iface)
|
static ULONG WINAPI IPersistFile_fnAddRef(IPersistFile* iface)
|
||||||
{
|
{
|
||||||
ICOM_THIS(IPersistFileImpl,iface);
|
ICOM_THIS(IPersistFileImpl,iface);
|
||||||
|
|
||||||
TRACE(shell,"(%p)->(count=%lu)\n",This,This->ref);
|
TRACE(shell,"(%p)->(count=%lu)\n",This,This->ref);
|
||||||
|
|
||||||
shell32_ObjCount++;
|
shell32_ObjCount++;
|
||||||
|
@ -88,12 +131,17 @@ static ULONG WINAPI IPersistFile_fnAddRef(IPersistFile* iface)
|
||||||
static ULONG WINAPI IPersistFile_fnRelease(IPersistFile* iface)
|
static ULONG WINAPI IPersistFile_fnRelease(IPersistFile* iface)
|
||||||
{
|
{
|
||||||
ICOM_THIS(IPersistFileImpl,iface);
|
ICOM_THIS(IPersistFileImpl,iface);
|
||||||
|
|
||||||
TRACE(shell,"(%p)->(count=%lu)\n",This,This->ref);
|
TRACE(shell,"(%p)->(count=%lu)\n",This,This->ref);
|
||||||
|
|
||||||
shell32_ObjCount--;
|
shell32_ObjCount--;
|
||||||
|
|
||||||
if (!--(This->ref))
|
if (!--(This->ref))
|
||||||
{ TRACE(shell,"-- destroying IPersistFile(%p)\n",This);
|
{ TRACE(shell,"-- destroying IPersistFile(%p)\n",This);
|
||||||
|
if (This->sPath)
|
||||||
|
HeapFree(GetProcessHeap(),0,This->sPath);
|
||||||
|
if (This->pPidl)
|
||||||
|
SHFree(This->pPidl);
|
||||||
HeapFree(GetProcessHeap(),0,This);
|
HeapFree(GetProcessHeap(),0,This);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -115,9 +163,63 @@ static HRESULT WINAPI IPersistFile_fnIsDirty(const IPersistFile* iface)
|
||||||
static HRESULT WINAPI IPersistFile_fnLoad(IPersistFile* iface, LPCOLESTR32 pszFileName, DWORD dwMode)
|
static HRESULT WINAPI IPersistFile_fnLoad(IPersistFile* iface, LPCOLESTR32 pszFileName, DWORD dwMode)
|
||||||
{
|
{
|
||||||
ICOM_THIS(IPersistFileImpl,iface);
|
ICOM_THIS(IPersistFileImpl,iface);
|
||||||
FIXME(shell,"(%p)->(%s)\n",This,debugstr_w(pszFileName));
|
|
||||||
return E_FAIL;
|
OFSTRUCT ofs;
|
||||||
|
LPSTR sFile = HEAP_strdupWtoA ( GetProcessHeap(), 0, pszFileName);
|
||||||
|
HFILE32 hFile = OpenFile32( sFile, &ofs, OF_READ );
|
||||||
|
HANDLE32 hMapping;
|
||||||
|
PLINK_HEADER pImage;
|
||||||
|
HRESULT hRet = E_FAIL;
|
||||||
|
CHAR sTemp[512];
|
||||||
|
|
||||||
|
TRACE(shell,"(%p)->(%s)\n",This,sFile);
|
||||||
|
|
||||||
|
HeapFree(GetProcessHeap(),0,sFile);
|
||||||
|
|
||||||
|
if ( !(hMapping = CreateFileMapping32A(hFile,NULL,PAGE_READONLY|SEC_COMMIT,0,0,NULL)))
|
||||||
|
{ WARN(shell,"failed to create filemap.\n");
|
||||||
|
goto end_1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !(pImage = (PLINK_HEADER) MapViewOfFile(hMapping,FILE_MAP_READ,0,0,0)))
|
||||||
|
{ WARN(shell,"failed to mmap filemap.\n");
|
||||||
|
goto end_2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!( (pImage->MagicStr == 0x0000004CL) && IsEqualIID(&pImage->MagicGuid, &CLSID_ShellLink)))
|
||||||
|
{ TRACE(shell,"file isn't a lnk\n");
|
||||||
|
goto end_3;
|
||||||
|
}
|
||||||
|
|
||||||
|
{ /* for debugging */
|
||||||
|
SYSTEMTIME time;
|
||||||
|
FileTimeToSystemTime (&pImage->Time1, &time);
|
||||||
|
GetDateFormat32A(LOCALE_USER_DEFAULT,DATE_SHORTDATE,&time, NULL, sTemp, 256);
|
||||||
|
TRACE(shell, "-- time1: %s\n", sTemp);
|
||||||
|
|
||||||
|
FileTimeToSystemTime (&pImage->Time2, &time);
|
||||||
|
GetDateFormat32A(LOCALE_USER_DEFAULT,DATE_SHORTDATE,&time, NULL, sTemp, 256);
|
||||||
|
TRACE(shell, "-- time2: %s\n", sTemp);
|
||||||
|
|
||||||
|
FileTimeToSystemTime (&pImage->Time3, &time);
|
||||||
|
GetDateFormat32A(LOCALE_USER_DEFAULT,DATE_SHORTDATE,&time, NULL, sTemp, 256);
|
||||||
|
TRACE(shell, "-- time3: %s\n", sTemp);
|
||||||
|
pdump (&pImage->Pidl);
|
||||||
|
}
|
||||||
|
|
||||||
|
This->pPidl = ILClone (&pImage->Pidl);
|
||||||
|
|
||||||
|
_ILGetPidlPath(&pImage->Pidl, sTemp, 512);
|
||||||
|
This->sPath = HEAP_strdupA ( GetProcessHeap(), 0, sTemp);
|
||||||
|
|
||||||
|
hRet = NOERROR;
|
||||||
|
end_3: UnmapViewOfFile(pImage);
|
||||||
|
end_2: CloseHandle(hMapping);
|
||||||
|
end_1: _lclose32( hFile);
|
||||||
|
|
||||||
|
return hRet;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI IPersistFile_fnSave(IPersistFile* iface, LPCOLESTR32 pszFileName, BOOL32 fRemember)
|
static HRESULT WINAPI IPersistFile_fnSave(IPersistFile* iface, LPCOLESTR32 pszFileName, BOOL32 fRemember)
|
||||||
{
|
{
|
||||||
ICOM_THIS(IPersistFileImpl,iface);
|
ICOM_THIS(IPersistFileImpl,iface);
|
||||||
|
@ -139,15 +241,15 @@ static HRESULT WINAPI IPersistFile_fnGetCurFile(const IPersistFile* iface, LPOLE
|
||||||
|
|
||||||
static struct ICOM_VTABLE(IPersistFile) pfvt =
|
static struct ICOM_VTABLE(IPersistFile) pfvt =
|
||||||
{
|
{
|
||||||
IPersistFile_fnQueryInterface,
|
IPersistFile_fnQueryInterface,
|
||||||
IPersistFile_fnAddRef,
|
IPersistFile_fnAddRef,
|
||||||
IPersistFile_fnRelease,
|
IPersistFile_fnRelease,
|
||||||
IPersistFile_fnGetClassID,
|
IPersistFile_fnGetClassID,
|
||||||
IPersistFile_fnIsDirty,
|
IPersistFile_fnIsDirty,
|
||||||
IPersistFile_fnLoad,
|
IPersistFile_fnLoad,
|
||||||
IPersistFile_fnSave,
|
IPersistFile_fnSave,
|
||||||
IPersistFile_fnSaveCompleted,
|
IPersistFile_fnSaveCompleted,
|
||||||
IPersistFile_fnGetCurFile
|
IPersistFile_fnGetCurFile
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -289,65 +391,27 @@ static ICOM_VTABLE(IClassFactory) slcfvt =
|
||||||
IShellLink_CF_LockServer
|
IShellLink_CF_LockServer
|
||||||
};
|
};
|
||||||
|
|
||||||
/* 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
|
* IShellLink Implementation
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
ICOM_VTABLE(IShellLink)* lpvtbl;
|
||||||
|
DWORD ref;
|
||||||
|
IPersistFileImpl* lppf;
|
||||||
|
|
||||||
static struct IShellLink_VTable slvt =
|
} IShellLinkImpl;
|
||||||
{ IShellLink_QueryInterface,
|
|
||||||
IShellLink_AddRef,
|
static ICOM_VTABLE(IShellLink) slvt;
|
||||||
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
|
* IShellLink_Constructor
|
||||||
*/
|
*/
|
||||||
LPSHELLLINK IShellLink_Constructor(void)
|
IShellLink * IShellLink_Constructor(void)
|
||||||
{ LPSHELLLINK sl;
|
{ IShellLinkImpl * sl;
|
||||||
|
|
||||||
sl = (LPSHELLLINK)HeapAlloc(GetProcessHeap(),0,sizeof(IShellLink));
|
sl = (IShellLinkImpl *)HeapAlloc(GetProcessHeap(),0,sizeof(IShellLinkImpl));
|
||||||
sl->ref = 1;
|
sl->ref = 1;
|
||||||
sl->lpvtbl = &slvt;
|
sl->lpvtbl = &slvt;
|
||||||
|
|
||||||
|
@ -355,32 +419,34 @@ LPSHELLLINK IShellLink_Constructor(void)
|
||||||
|
|
||||||
TRACE(shell,"(%p)->()\n",sl);
|
TRACE(shell,"(%p)->()\n",sl);
|
||||||
shell32_ObjCount++;
|
shell32_ObjCount++;
|
||||||
return sl;
|
return (IShellLink *)sl;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
* IShellLink::QueryInterface
|
* IShellLink::QueryInterface
|
||||||
*/
|
*/
|
||||||
static HRESULT WINAPI IShellLink_QueryInterface(
|
static HRESULT WINAPI IShellLink_fnQueryInterface( IShellLink * iface, REFIID riid, LPVOID *ppvObj)
|
||||||
LPSHELLLINK this, REFIID riid, LPVOID *ppvObj)
|
{
|
||||||
{ char xriid[50];
|
ICOM_THIS(IShellLinkImpl, iface);
|
||||||
|
|
||||||
|
char xriid[50];
|
||||||
WINE_StringFromCLSID((LPCLSID)riid,xriid);
|
WINE_StringFromCLSID((LPCLSID)riid,xriid);
|
||||||
TRACE(shell,"(%p)->(\n\tIID:\t%s)\n",this,xriid);
|
TRACE(shell,"(%p)->(\n\tIID:\t%s)\n",This,xriid);
|
||||||
|
|
||||||
*ppvObj = NULL;
|
*ppvObj = NULL;
|
||||||
|
|
||||||
if(IsEqualIID(riid, &IID_IUnknown)) /*IUnknown*/
|
if(IsEqualIID(riid, &IID_IUnknown)) /*IUnknown*/
|
||||||
{ *ppvObj = this;
|
{ *ppvObj = This;
|
||||||
}
|
}
|
||||||
else if(IsEqualIID(riid, &IID_IShellLink)) /*IShellLink*/
|
else if(IsEqualIID(riid, &IID_IShellLink)) /*IShellLink*/
|
||||||
{ *ppvObj = (LPSHELLLINK)this;
|
{ *ppvObj = (IShellLink *)This;
|
||||||
}
|
}
|
||||||
else if(IsEqualIID(riid, &IID_IPersistFile)) /*IPersistFile*/
|
else if(IsEqualIID(riid, &IID_IPersistFile)) /*IPersistFile*/
|
||||||
{ *ppvObj = (LPPERSISTFILE)this->lppf;
|
{ *ppvObj = (IPersistFile *)This->lppf;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(*ppvObj)
|
if(*ppvObj)
|
||||||
{ (*(LPSHELLLINK*)ppvObj)->lpvtbl->fnAddRef(this);
|
{ IShellLink_AddRef((IShellLink*)*ppvObj);
|
||||||
TRACE(shell,"-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
|
TRACE(shell,"-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
@ -390,110 +456,204 @@ static HRESULT WINAPI IShellLink_QueryInterface(
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* IShellLink_AddRef
|
* IShellLink_AddRef
|
||||||
*/
|
*/
|
||||||
static ULONG WINAPI IShellLink_AddRef(LPSHELLLINK this)
|
static ULONG WINAPI IShellLink_fnAddRef(IShellLink * iface)
|
||||||
{ TRACE(shell,"(%p)->(count=%lu)\n",this,this->ref);
|
{
|
||||||
|
ICOM_THIS(IShellLinkImpl, iface);
|
||||||
|
|
||||||
|
TRACE(shell,"(%p)->(count=%lu)\n",This,This->ref);
|
||||||
|
|
||||||
shell32_ObjCount++;
|
shell32_ObjCount++;
|
||||||
return ++(this->ref);
|
return ++(This->ref);
|
||||||
}
|
}
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* IShellLink_Release
|
* IShellLink_Release
|
||||||
*/
|
*/
|
||||||
static ULONG WINAPI IShellLink_Release(LPSHELLLINK this)
|
static ULONG WINAPI IShellLink_fnRelease(IShellLink * iface)
|
||||||
{ TRACE(shell,"(%p)->(count=%lu)\n",this,this->ref);
|
{
|
||||||
|
ICOM_THIS(IShellLinkImpl, iface);
|
||||||
|
|
||||||
|
TRACE(shell,"(%p)->(count=%lu)\n",This,This->ref);
|
||||||
|
|
||||||
shell32_ObjCount--;
|
shell32_ObjCount--;
|
||||||
if (!--(this->ref))
|
if (!--(This->ref))
|
||||||
{ TRACE(shell,"-- destroying IShellLink(%p)\n",this);
|
{ TRACE(shell,"-- destroying IShellLink(%p)\n",This);
|
||||||
IPersistFile_Release(this->lppf); /* IPersistFile*/
|
IPersistFile_Release((IPersistFile*) This->lppf); /* IPersistFile*/
|
||||||
HeapFree(GetProcessHeap(),0,this);
|
HeapFree(GetProcessHeap(),0,This);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return this->ref;
|
return This->ref;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI IShellLink_GetPath(LPSHELLLINK this, LPSTR pszFile,INT32 cchMaxPath, WIN32_FIND_DATA32A *pfd, DWORD fFlags)
|
static HRESULT WINAPI IShellLink_fnGetPath(IShellLink * iface, 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);
|
ICOM_THIS(IShellLinkImpl, iface);
|
||||||
|
|
||||||
|
TRACE(shell,"(%p)->(pfile=%p len=%u find_data=%p flags=%lu)\n",This, pszFile, cchMaxPath, pfd, fFlags);
|
||||||
|
|
||||||
|
strncpy(pszFile,This->lppf->sPath, cchMaxPath);
|
||||||
return NOERROR;
|
return NOERROR;
|
||||||
}
|
}
|
||||||
static HRESULT WINAPI IShellLink_GetIDList(LPSHELLLINK this, LPITEMIDLIST * ppidl)
|
static HRESULT WINAPI IShellLink_fnGetIDList(IShellLink * iface, LPITEMIDLIST * ppidl)
|
||||||
{ FIXME(shell,"(%p)->(ppidl=%p)\n",this, ppidl);
|
{
|
||||||
*ppidl = _ILCreateDesktop();
|
ICOM_THIS(IShellLinkImpl, iface);
|
||||||
|
|
||||||
|
TRACE(shell,"(%p)->(ppidl=%p)\n",This, ppidl);
|
||||||
|
|
||||||
|
*ppidl = ILClone(This->lppf->pPidl);
|
||||||
return NOERROR;
|
return NOERROR;
|
||||||
}
|
}
|
||||||
static HRESULT WINAPI IShellLink_SetIDList(LPSHELLLINK this, LPCITEMIDLIST pidl)
|
static HRESULT WINAPI IShellLink_fnSetIDList(IShellLink * iface, LPCITEMIDLIST pidl)
|
||||||
{ FIXME(shell,"(%p)->(pidl=%p)\n",this, pidl);
|
{
|
||||||
|
ICOM_THIS(IShellLinkImpl, iface);
|
||||||
|
|
||||||
|
TRACE (shell,"(%p)->(pidl=%p)\n",This, pidl);
|
||||||
|
|
||||||
|
if (This->lppf->pPidl)
|
||||||
|
SHFree(This->lppf->pPidl);
|
||||||
|
This->lppf->pPidl = ILClone (pidl);
|
||||||
return NOERROR;
|
return NOERROR;
|
||||||
}
|
}
|
||||||
static HRESULT WINAPI IShellLink_GetDescription(LPSHELLLINK this, LPSTR pszName,INT32 cchMaxName)
|
static HRESULT WINAPI IShellLink_fnGetDescription(IShellLink * iface, LPSTR pszName,INT32 cchMaxName)
|
||||||
{ FIXME(shell,"(%p)->(%p len=%u)\n",this, pszName, cchMaxName);
|
{
|
||||||
|
ICOM_THIS(IShellLinkImpl, iface);
|
||||||
|
|
||||||
|
FIXME(shell,"(%p)->(%p len=%u)\n",This, pszName, cchMaxName);
|
||||||
strncpy(pszName,"Description, FIXME",cchMaxName);
|
strncpy(pszName,"Description, FIXME",cchMaxName);
|
||||||
return NOERROR;
|
return NOERROR;
|
||||||
}
|
}
|
||||||
static HRESULT WINAPI IShellLink_SetDescription(LPSHELLLINK this, LPCSTR pszName)
|
static HRESULT WINAPI IShellLink_fnSetDescription(IShellLink * iface, LPCSTR pszName)
|
||||||
{ FIXME(shell,"(%p)->(desc=%s)\n",this, pszName);
|
{
|
||||||
|
ICOM_THIS(IShellLinkImpl, iface);
|
||||||
|
|
||||||
|
FIXME(shell,"(%p)->(desc=%s)\n",This, pszName);
|
||||||
return NOERROR;
|
return NOERROR;
|
||||||
}
|
}
|
||||||
static HRESULT WINAPI IShellLink_GetWorkingDirectory(LPSHELLLINK this, LPSTR pszDir,INT32 cchMaxPath)
|
static HRESULT WINAPI IShellLink_fnGetWorkingDirectory(IShellLink * iface, LPSTR pszDir,INT32 cchMaxPath)
|
||||||
{ FIXME(shell,"(%p)->()\n",this);
|
{
|
||||||
|
ICOM_THIS(IShellLinkImpl, iface);
|
||||||
|
|
||||||
|
FIXME(shell,"(%p)->()\n",This);
|
||||||
strncpy(pszDir,"c:\\", cchMaxPath);
|
strncpy(pszDir,"c:\\", cchMaxPath);
|
||||||
return NOERROR;
|
return NOERROR;
|
||||||
}
|
}
|
||||||
static HRESULT WINAPI IShellLink_SetWorkingDirectory(LPSHELLLINK this, LPCSTR pszDir)
|
static HRESULT WINAPI IShellLink_fnSetWorkingDirectory(IShellLink * iface, LPCSTR pszDir)
|
||||||
{ FIXME(shell,"(%p)->(dir=%s)\n",this, pszDir);
|
{
|
||||||
|
ICOM_THIS(IShellLinkImpl, iface);
|
||||||
|
|
||||||
|
FIXME(shell,"(%p)->(dir=%s)\n",This, pszDir);
|
||||||
return NOERROR;
|
return NOERROR;
|
||||||
}
|
}
|
||||||
static HRESULT WINAPI IShellLink_GetArguments(LPSHELLLINK this, LPSTR pszArgs,INT32 cchMaxPath)
|
static HRESULT WINAPI IShellLink_fnGetArguments(IShellLink * iface, LPSTR pszArgs,INT32 cchMaxPath)
|
||||||
{ FIXME(shell,"(%p)->(%p len=%u)\n",this, pszArgs, cchMaxPath);
|
{
|
||||||
|
ICOM_THIS(IShellLinkImpl, iface);
|
||||||
|
|
||||||
|
FIXME(shell,"(%p)->(%p len=%u)\n",This, pszArgs, cchMaxPath);
|
||||||
strncpy(pszArgs, "", cchMaxPath);
|
strncpy(pszArgs, "", cchMaxPath);
|
||||||
return NOERROR;
|
return NOERROR;
|
||||||
}
|
}
|
||||||
static HRESULT WINAPI IShellLink_SetArguments(LPSHELLLINK this, LPCSTR pszArgs)
|
static HRESULT WINAPI IShellLink_fnSetArguments(IShellLink * iface, LPCSTR pszArgs)
|
||||||
{ FIXME(shell,"(%p)->(args=%s)\n",this, pszArgs);
|
{
|
||||||
|
ICOM_THIS(IShellLinkImpl, iface);
|
||||||
|
|
||||||
|
FIXME(shell,"(%p)->(args=%s)\n",This, pszArgs);
|
||||||
return NOERROR;
|
return NOERROR;
|
||||||
}
|
}
|
||||||
static HRESULT WINAPI IShellLink_GetHotkey(LPSHELLLINK this, WORD *pwHotkey)
|
static HRESULT WINAPI IShellLink_fnGetHotkey(IShellLink * iface, WORD *pwHotkey)
|
||||||
{ FIXME(shell,"(%p)->(%p)\n",this, pwHotkey);
|
{
|
||||||
|
ICOM_THIS(IShellLinkImpl, iface);
|
||||||
|
|
||||||
|
FIXME(shell,"(%p)->(%p)\n",This, pwHotkey);
|
||||||
*pwHotkey=0x0;
|
*pwHotkey=0x0;
|
||||||
return NOERROR;
|
return NOERROR;
|
||||||
}
|
}
|
||||||
static HRESULT WINAPI IShellLink_SetHotkey(LPSHELLLINK this, WORD wHotkey)
|
static HRESULT WINAPI IShellLink_fnSetHotkey(IShellLink * iface, WORD wHotkey)
|
||||||
{ FIXME(shell,"(%p)->(hotkey=%x)\n",this, wHotkey);
|
{
|
||||||
|
ICOM_THIS(IShellLinkImpl, iface);
|
||||||
|
|
||||||
|
FIXME(shell,"(%p)->(hotkey=%x)\n",This, wHotkey);
|
||||||
return NOERROR;
|
return NOERROR;
|
||||||
}
|
}
|
||||||
static HRESULT WINAPI IShellLink_GetShowCmd(LPSHELLLINK this, INT32 *piShowCmd)
|
static HRESULT WINAPI IShellLink_fnGetShowCmd(IShellLink * iface, INT32 *piShowCmd)
|
||||||
{ FIXME(shell,"(%p)->(%p)\n",this, piShowCmd);
|
{
|
||||||
|
ICOM_THIS(IShellLinkImpl, iface);
|
||||||
|
|
||||||
|
FIXME(shell,"(%p)->(%p)\n",This, piShowCmd);
|
||||||
*piShowCmd=0;
|
*piShowCmd=0;
|
||||||
return NOERROR;
|
return NOERROR;
|
||||||
}
|
}
|
||||||
static HRESULT WINAPI IShellLink_SetShowCmd(LPSHELLLINK this, INT32 iShowCmd)
|
static HRESULT WINAPI IShellLink_fnSetShowCmd(IShellLink * iface, INT32 iShowCmd)
|
||||||
{ FIXME(shell,"(%p)->(showcmd=%x)\n",this, iShowCmd);
|
{
|
||||||
|
ICOM_THIS(IShellLinkImpl, iface);
|
||||||
|
|
||||||
|
FIXME(shell,"(%p)->(showcmd=%x)\n",This, iShowCmd);
|
||||||
return NOERROR;
|
return NOERROR;
|
||||||
}
|
}
|
||||||
static HRESULT WINAPI IShellLink_GetIconLocation(LPSHELLLINK this, LPSTR pszIconPath,INT32 cchIconPath,INT32 *piIcon)
|
static HRESULT WINAPI IShellLink_fnGetIconLocation(IShellLink * iface, LPSTR pszIconPath,INT32 cchIconPath,INT32 *piIcon)
|
||||||
{ FIXME(shell,"(%p)->(%p len=%u iicon=%p)\n",this, pszIconPath, cchIconPath, piIcon);
|
{
|
||||||
|
ICOM_THIS(IShellLinkImpl, iface);
|
||||||
|
|
||||||
|
FIXME(shell,"(%p)->(%p len=%u iicon=%p)\n",This, pszIconPath, cchIconPath, piIcon);
|
||||||
strncpy(pszIconPath,"shell32.dll",cchIconPath);
|
strncpy(pszIconPath,"shell32.dll",cchIconPath);
|
||||||
*piIcon=1;
|
*piIcon=1;
|
||||||
return NOERROR;
|
return NOERROR;
|
||||||
}
|
}
|
||||||
static HRESULT WINAPI IShellLink_SetIconLocation(LPSHELLLINK this, LPCSTR pszIconPath,INT32 iIcon)
|
static HRESULT WINAPI IShellLink_fnSetIconLocation(IShellLink * iface, LPCSTR pszIconPath,INT32 iIcon)
|
||||||
{ FIXME(shell,"(%p)->(path=%s iicon=%u)\n",this, pszIconPath, iIcon);
|
{
|
||||||
|
ICOM_THIS(IShellLinkImpl, iface);
|
||||||
|
|
||||||
|
FIXME(shell,"(%p)->(path=%s iicon=%u)\n",This, pszIconPath, iIcon);
|
||||||
return NOERROR;
|
return NOERROR;
|
||||||
}
|
}
|
||||||
static HRESULT WINAPI IShellLink_SetRelativePath(LPSHELLLINK this, LPCSTR pszPathRel, DWORD dwReserved)
|
static HRESULT WINAPI IShellLink_fnSetRelativePath(IShellLink * iface, LPCSTR pszPathRel, DWORD dwReserved)
|
||||||
{ FIXME(shell,"(%p)->(path=%s %lx)\n",this, pszPathRel, dwReserved);
|
{
|
||||||
|
ICOM_THIS(IShellLinkImpl, iface);
|
||||||
|
|
||||||
|
FIXME(shell,"(%p)->(path=%s %lx)\n",This, pszPathRel, dwReserved);
|
||||||
return NOERROR;
|
return NOERROR;
|
||||||
}
|
}
|
||||||
static HRESULT WINAPI IShellLink_Resolve(LPSHELLLINK this, HWND32 hwnd, DWORD fFlags)
|
static HRESULT WINAPI IShellLink_fnResolve(IShellLink * iface, HWND32 hwnd, DWORD fFlags)
|
||||||
{ FIXME(shell,"(%p)->(hwnd=%x flags=%lx)\n",this, hwnd, fFlags);
|
{
|
||||||
|
ICOM_THIS(IShellLinkImpl, iface);
|
||||||
|
|
||||||
|
FIXME(shell,"(%p)->(hwnd=%x flags=%lx)\n",This, hwnd, fFlags);
|
||||||
return NOERROR;
|
return NOERROR;
|
||||||
}
|
}
|
||||||
static HRESULT WINAPI IShellLink_SetPath(LPSHELLLINK this, LPCSTR pszFile)
|
static HRESULT WINAPI IShellLink_fnSetPath(IShellLink * iface, LPCSTR pszFile)
|
||||||
{ FIXME(shell,"(%p)->(path=%s)\n",this, pszFile);
|
{
|
||||||
|
ICOM_THIS(IShellLinkImpl, iface);
|
||||||
|
|
||||||
|
FIXME(shell,"(%p)->(path=%s)\n",This, pszFile);
|
||||||
return NOERROR;
|
return NOERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**************************************************************************
|
||||||
|
* IShellLink Implementation
|
||||||
|
*/
|
||||||
|
|
||||||
|
static ICOM_VTABLE(IShellLink) slvt =
|
||||||
|
{ IShellLink_fnQueryInterface,
|
||||||
|
IShellLink_fnAddRef,
|
||||||
|
IShellLink_fnRelease,
|
||||||
|
IShellLink_fnGetPath,
|
||||||
|
IShellLink_fnGetIDList,
|
||||||
|
IShellLink_fnSetIDList,
|
||||||
|
IShellLink_fnGetDescription,
|
||||||
|
IShellLink_fnSetDescription,
|
||||||
|
IShellLink_fnGetWorkingDirectory,
|
||||||
|
IShellLink_fnSetWorkingDirectory,
|
||||||
|
IShellLink_fnGetArguments,
|
||||||
|
IShellLink_fnSetArguments,
|
||||||
|
IShellLink_fnGetHotkey,
|
||||||
|
IShellLink_fnSetHotkey,
|
||||||
|
IShellLink_fnGetShowCmd,
|
||||||
|
IShellLink_fnSetShowCmd,
|
||||||
|
IShellLink_fnGetIconLocation,
|
||||||
|
IShellLink_fnSetIconLocation,
|
||||||
|
IShellLink_fnSetRelativePath,
|
||||||
|
IShellLink_fnResolve,
|
||||||
|
IShellLink_fnSetPath
|
||||||
|
};
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
* IShellLink's IClassFactory implementation
|
* IShellLink's IClassFactory implementation
|
||||||
*/
|
*/
|
||||||
|
@ -628,64 +788,28 @@ static ICOM_VTABLE(IClassFactory) slwcfvt =
|
||||||
IShellLinkW_CF_LockServer
|
IShellLinkW_CF_LockServer
|
||||||
};
|
};
|
||||||
|
|
||||||
/* 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
|
* IShellLink 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(void)
|
|
||||||
{ LPSHELLLINKW sl;
|
|
||||||
|
|
||||||
sl = (LPSHELLLINKW)HeapAlloc(GetProcessHeap(),0,sizeof(IShellLinkW));
|
typedef struct
|
||||||
|
{
|
||||||
|
ICOM_VTABLE(IShellLinkW)* lpvtbl;
|
||||||
|
DWORD ref;
|
||||||
|
IPersistFileImpl* lppf;
|
||||||
|
|
||||||
|
} IShellLinkWImpl;
|
||||||
|
|
||||||
|
static ICOM_VTABLE(IShellLinkW) slvtw;
|
||||||
|
|
||||||
|
/**************************************************************************
|
||||||
|
* IShellLinkW_fnConstructor
|
||||||
|
*/
|
||||||
|
IShellLinkW * IShellLinkW_Constructor(void)
|
||||||
|
{ IShellLinkWImpl* sl;
|
||||||
|
|
||||||
|
sl = (IShellLinkWImpl*)HeapAlloc(GetProcessHeap(),0,sizeof(IShellLinkWImpl));
|
||||||
sl->ref = 1;
|
sl->ref = 1;
|
||||||
sl->lpvtbl = &slvtw;
|
sl->lpvtbl = &slvtw;
|
||||||
|
|
||||||
|
@ -693,142 +817,253 @@ LPSHELLLINKW IShellLinkW_Constructor(void)
|
||||||
|
|
||||||
TRACE(shell,"(%p)->()\n",sl);
|
TRACE(shell,"(%p)->()\n",sl);
|
||||||
shell32_ObjCount++;
|
shell32_ObjCount++;
|
||||||
return sl;
|
return (IShellLinkW*)sl;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
* IShellLinkW_QueryInterface
|
* IShellLinkW_fnQueryInterface
|
||||||
*/
|
*/
|
||||||
static HRESULT WINAPI IShellLinkW_QueryInterface(
|
static HRESULT WINAPI IShellLinkW_fnQueryInterface(
|
||||||
LPSHELLLINKW this, REFIID riid, LPVOID *ppvObj)
|
IShellLinkW * iface, REFIID riid, LPVOID *ppvObj)
|
||||||
{ char xriid[50];
|
{
|
||||||
WINE_StringFromCLSID((LPCLSID)riid,xriid);
|
ICOM_THIS(IShellLinkWImpl, iface);
|
||||||
TRACE(shell,"(%p)->(\n\tIID:\t%s)\n",this,xriid);
|
|
||||||
|
|
||||||
*ppvObj = NULL;
|
char xriid[50];
|
||||||
|
WINE_StringFromCLSID((LPCLSID)riid,xriid);
|
||||||
|
TRACE(shell,"(%p)->(\n\tIID:\t%s)\n",This,xriid);
|
||||||
|
|
||||||
if(IsEqualIID(riid, &IID_IUnknown)) /*IUnknown*/
|
*ppvObj = NULL;
|
||||||
{ *ppvObj = this;
|
|
||||||
}
|
|
||||||
else if(IsEqualIID(riid, &IID_IShellLinkW)) /*IShellLinkW*/
|
|
||||||
{ *ppvObj = (LPSHELLLINKW)this;
|
|
||||||
}
|
|
||||||
else if(IsEqualIID(riid, &IID_IPersistFile)) /*IPersistFile*/
|
|
||||||
{ *ppvObj = (LPPERSISTFILE)this->lppf;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(*ppvObj)
|
if(IsEqualIID(riid, &IID_IUnknown)) /*IUnknown*/
|
||||||
{ (*(LPSHELLLINKW*)ppvObj)->lpvtbl->fnAddRef(this);
|
{ *ppvObj = This;
|
||||||
TRACE(shell,"-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
|
}
|
||||||
return S_OK;
|
else if(IsEqualIID(riid, &IID_IShellLinkW)) /*IShellLinkW*/
|
||||||
}
|
{ *ppvObj = (IShellLinkW *)This;
|
||||||
TRACE(shell,"-- Interface: E_NOINTERFACE\n");
|
}
|
||||||
return E_NOINTERFACE;
|
else if(IsEqualIID(riid, &IID_IPersistFile)) /*IPersistFile*/
|
||||||
|
{ *ppvObj = (IPersistFile *)This->lppf;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(*ppvObj)
|
||||||
|
{ IShellLink_AddRef((IShellLinkW*)*ppvObj);
|
||||||
|
TRACE(shell,"-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
TRACE(shell,"-- Interface: E_NOINTERFACE\n");
|
||||||
|
|
||||||
|
return E_NOINTERFACE;
|
||||||
}
|
}
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* IShellLinkW_AddRef
|
* IShellLinkW_fnAddRef
|
||||||
*/
|
*/
|
||||||
static ULONG WINAPI IShellLinkW_AddRef(LPSHELLLINKW this)
|
static ULONG WINAPI IShellLinkW_fnAddRef(IShellLinkW * iface)
|
||||||
{ TRACE(shell,"(%p)->(count=%lu)\n",this,this->ref);
|
{
|
||||||
|
ICOM_THIS(IShellLinkWImpl, iface);
|
||||||
|
|
||||||
|
TRACE(shell,"(%p)->(count=%lu)\n",This,This->ref);
|
||||||
|
|
||||||
shell32_ObjCount++;
|
shell32_ObjCount++;
|
||||||
return ++(this->ref);
|
return ++(This->ref);
|
||||||
}
|
}
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* IClassFactory_Release
|
* IShellLinkW_fnRelease
|
||||||
*/
|
*/
|
||||||
static ULONG WINAPI IShellLinkW_Release(LPSHELLLINKW this)
|
|
||||||
{ TRACE(shell,"(%p)->(count=%lu)\n",this,this->ref);
|
static ULONG WINAPI IShellLinkW_fnRelease(IShellLinkW * iface)
|
||||||
|
{
|
||||||
|
ICOM_THIS(IShellLinkWImpl, iface);
|
||||||
|
|
||||||
|
TRACE(shell,"(%p)->(count=%lu)\n",This,This->ref);
|
||||||
|
|
||||||
shell32_ObjCount--;
|
shell32_ObjCount--;
|
||||||
if (!--(this->ref))
|
if (!--(This->ref))
|
||||||
{ TRACE(shell,"-- destroying IShellLinkW(%p)\n",this);
|
{ TRACE(shell,"-- destroying IShellLinkW(%p)\n",This);
|
||||||
IPersistFile_Release(this->lppf); /* IPersistFile*/
|
IPersistFile_Release((IPersistFile*)This->lppf); /* IPersistFile*/
|
||||||
HeapFree(GetProcessHeap(),0,this);
|
HeapFree(GetProcessHeap(),0,This);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return this->ref;
|
return This->ref;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI IShellLinkW_GetPath(LPSHELLLINKW this, LPWSTR pszFile,INT32 cchMaxPath, WIN32_FIND_DATA32A *pfd, DWORD fFlags)
|
static HRESULT WINAPI IShellLinkW_fnGetPath(IShellLinkW * iface, 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);
|
{
|
||||||
|
ICOM_THIS(IShellLinkWImpl, iface);
|
||||||
|
|
||||||
|
FIXME(shell,"(%p)->(pfile=%p len=%u find_data=%p flags=%lu)\n",This, pszFile, cchMaxPath, pfd, fFlags);
|
||||||
lstrcpynAtoW(pszFile,"c:\\foo.bar", cchMaxPath);
|
lstrcpynAtoW(pszFile,"c:\\foo.bar", cchMaxPath);
|
||||||
return NOERROR;
|
return NOERROR;
|
||||||
}
|
}
|
||||||
static HRESULT WINAPI IShellLinkW_GetIDList(LPSHELLLINKW this, LPITEMIDLIST * ppidl)
|
|
||||||
{ FIXME(shell,"(%p)->(ppidl=%p)\n",this, ppidl);
|
static HRESULT WINAPI IShellLinkW_fnGetIDList(IShellLinkW * iface, LPITEMIDLIST * ppidl)
|
||||||
|
{
|
||||||
|
ICOM_THIS(IShellLinkWImpl, iface);
|
||||||
|
|
||||||
|
FIXME(shell,"(%p)->(ppidl=%p)\n",This, ppidl);
|
||||||
*ppidl = _ILCreateDesktop();
|
*ppidl = _ILCreateDesktop();
|
||||||
return NOERROR;
|
return NOERROR;
|
||||||
}
|
}
|
||||||
static HRESULT WINAPI IShellLinkW_SetIDList(LPSHELLLINKW this, LPCITEMIDLIST pidl)
|
|
||||||
{ FIXME(shell,"(%p)->(pidl=%p)\n",this, pidl);
|
static HRESULT WINAPI IShellLinkW_fnSetIDList(IShellLinkW * iface, LPCITEMIDLIST pidl)
|
||||||
|
{
|
||||||
|
ICOM_THIS(IShellLinkWImpl, iface);
|
||||||
|
|
||||||
|
FIXME(shell,"(%p)->(pidl=%p)\n",This, pidl);
|
||||||
return NOERROR;
|
return NOERROR;
|
||||||
}
|
}
|
||||||
static HRESULT WINAPI IShellLinkW_GetDescription(LPSHELLLINKW this, LPWSTR pszName,INT32 cchMaxName)
|
|
||||||
{ FIXME(shell,"(%p)->(%p len=%u)\n",this, pszName, cchMaxName);
|
static HRESULT WINAPI IShellLinkW_fnGetDescription(IShellLinkW * iface, LPWSTR pszName,INT32 cchMaxName)
|
||||||
|
{
|
||||||
|
ICOM_THIS(IShellLinkWImpl, iface);
|
||||||
|
|
||||||
|
FIXME(shell,"(%p)->(%p len=%u)\n",This, pszName, cchMaxName);
|
||||||
lstrcpynAtoW(pszName,"Description, FIXME",cchMaxName);
|
lstrcpynAtoW(pszName,"Description, FIXME",cchMaxName);
|
||||||
return NOERROR;
|
return NOERROR;
|
||||||
}
|
}
|
||||||
static HRESULT WINAPI IShellLinkW_SetDescription(LPSHELLLINKW this, LPCWSTR pszName)
|
|
||||||
{ FIXME(shell,"(%p)->(desc=%s)\n",this, debugstr_w(pszName));
|
static HRESULT WINAPI IShellLinkW_fnSetDescription(IShellLinkW * iface, LPCWSTR pszName)
|
||||||
|
{
|
||||||
|
ICOM_THIS(IShellLinkWImpl, iface);
|
||||||
|
|
||||||
|
FIXME(shell,"(%p)->(desc=%s)\n",This, debugstr_w(pszName));
|
||||||
return NOERROR;
|
return NOERROR;
|
||||||
}
|
}
|
||||||
static HRESULT WINAPI IShellLinkW_GetWorkingDirectory(LPSHELLLINKW this, LPWSTR pszDir,INT32 cchMaxPath)
|
|
||||||
{ FIXME(shell,"(%p)->()\n",this);
|
static HRESULT WINAPI IShellLinkW_fnGetWorkingDirectory(IShellLinkW * iface, LPWSTR pszDir,INT32 cchMaxPath)
|
||||||
|
{
|
||||||
|
ICOM_THIS(IShellLinkWImpl, iface);
|
||||||
|
|
||||||
|
FIXME(shell,"(%p)->()\n",This);
|
||||||
lstrcpynAtoW(pszDir,"c:\\", cchMaxPath);
|
lstrcpynAtoW(pszDir,"c:\\", cchMaxPath);
|
||||||
return NOERROR;
|
return NOERROR;
|
||||||
}
|
}
|
||||||
static HRESULT WINAPI IShellLinkW_SetWorkingDirectory(LPSHELLLINKW this, LPCWSTR pszDir)
|
|
||||||
{ FIXME(shell,"(%p)->(dir=%s)\n",this, debugstr_w(pszDir));
|
static HRESULT WINAPI IShellLinkW_fnSetWorkingDirectory(IShellLinkW * iface, LPCWSTR pszDir)
|
||||||
|
{
|
||||||
|
ICOM_THIS(IShellLinkWImpl, iface);
|
||||||
|
|
||||||
|
FIXME(shell,"(%p)->(dir=%s)\n",This, debugstr_w(pszDir));
|
||||||
return NOERROR;
|
return NOERROR;
|
||||||
}
|
}
|
||||||
static HRESULT WINAPI IShellLinkW_GetArguments(LPSHELLLINKW this, LPWSTR pszArgs,INT32 cchMaxPath)
|
|
||||||
{ FIXME(shell,"(%p)->(%p len=%u)\n",this, pszArgs, cchMaxPath);
|
static HRESULT WINAPI IShellLinkW_fnGetArguments(IShellLinkW * iface, LPWSTR pszArgs,INT32 cchMaxPath)
|
||||||
|
{
|
||||||
|
ICOM_THIS(IShellLinkWImpl, iface);
|
||||||
|
|
||||||
|
FIXME(shell,"(%p)->(%p len=%u)\n",This, pszArgs, cchMaxPath);
|
||||||
lstrcpynAtoW(pszArgs, "", cchMaxPath);
|
lstrcpynAtoW(pszArgs, "", cchMaxPath);
|
||||||
return NOERROR;
|
return NOERROR;
|
||||||
}
|
}
|
||||||
static HRESULT WINAPI IShellLinkW_SetArguments(LPSHELLLINKW this, LPCWSTR pszArgs)
|
|
||||||
{ FIXME(shell,"(%p)->(args=%s)\n",this, debugstr_w(pszArgs));
|
static HRESULT WINAPI IShellLinkW_fnSetArguments(IShellLinkW * iface, LPCWSTR pszArgs)
|
||||||
|
{
|
||||||
|
ICOM_THIS(IShellLinkWImpl, iface);
|
||||||
|
|
||||||
|
FIXME(shell,"(%p)->(args=%s)\n",This, debugstr_w(pszArgs));
|
||||||
return NOERROR;
|
return NOERROR;
|
||||||
}
|
}
|
||||||
static HRESULT WINAPI IShellLinkW_GetHotkey(LPSHELLLINKW this, WORD *pwHotkey)
|
|
||||||
{ FIXME(shell,"(%p)->(%p)\n",this, pwHotkey);
|
static HRESULT WINAPI IShellLinkW_fnGetHotkey(IShellLinkW * iface, WORD *pwHotkey)
|
||||||
|
{
|
||||||
|
ICOM_THIS(IShellLinkWImpl, iface);
|
||||||
|
|
||||||
|
FIXME(shell,"(%p)->(%p)\n",This, pwHotkey);
|
||||||
*pwHotkey=0x0;
|
*pwHotkey=0x0;
|
||||||
return NOERROR;
|
return NOERROR;
|
||||||
}
|
}
|
||||||
static HRESULT WINAPI IShellLinkW_SetHotkey(LPSHELLLINKW this, WORD wHotkey)
|
|
||||||
{ FIXME(shell,"(%p)->(hotkey=%x)\n",this, wHotkey);
|
static HRESULT WINAPI IShellLinkW_fnSetHotkey(IShellLinkW * iface, WORD wHotkey)
|
||||||
|
{
|
||||||
|
ICOM_THIS(IShellLinkWImpl, iface);
|
||||||
|
|
||||||
|
FIXME(shell,"(%p)->(hotkey=%x)\n",This, wHotkey);
|
||||||
return NOERROR;
|
return NOERROR;
|
||||||
}
|
}
|
||||||
static HRESULT WINAPI IShellLinkW_GetShowCmd(LPSHELLLINKW this, INT32 *piShowCmd)
|
|
||||||
{ FIXME(shell,"(%p)->(%p)\n",this, piShowCmd);
|
static HRESULT WINAPI IShellLinkW_fnGetShowCmd(IShellLinkW * iface, INT32 *piShowCmd)
|
||||||
|
{
|
||||||
|
ICOM_THIS(IShellLinkWImpl, iface);
|
||||||
|
|
||||||
|
FIXME(shell,"(%p)->(%p)\n",This, piShowCmd);
|
||||||
*piShowCmd=0;
|
*piShowCmd=0;
|
||||||
return NOERROR;
|
return NOERROR;
|
||||||
}
|
}
|
||||||
static HRESULT WINAPI IShellLinkW_SetShowCmd(LPSHELLLINKW this, INT32 iShowCmd)
|
|
||||||
{ FIXME(shell,"(%p)->(showcmd=%x)\n",this, iShowCmd);
|
static HRESULT WINAPI IShellLinkW_fnSetShowCmd(IShellLinkW * iface, INT32 iShowCmd)
|
||||||
|
{
|
||||||
|
ICOM_THIS(IShellLinkWImpl, iface);
|
||||||
|
|
||||||
|
FIXME(shell,"(%p)->(showcmd=%x)\n",This, iShowCmd);
|
||||||
return NOERROR;
|
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);
|
static HRESULT WINAPI IShellLinkW_fnGetIconLocation(IShellLinkW * iface, LPWSTR pszIconPath,INT32 cchIconPath,INT32 *piIcon)
|
||||||
|
{
|
||||||
|
ICOM_THIS(IShellLinkWImpl, iface);
|
||||||
|
|
||||||
|
FIXME(shell,"(%p)->(%p len=%u iicon=%p)\n",This, pszIconPath, cchIconPath, piIcon);
|
||||||
lstrcpynAtoW(pszIconPath,"shell32.dll",cchIconPath);
|
lstrcpynAtoW(pszIconPath,"shell32.dll",cchIconPath);
|
||||||
*piIcon=1;
|
*piIcon=1;
|
||||||
return NOERROR;
|
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);
|
static HRESULT WINAPI IShellLinkW_fnSetIconLocation(IShellLinkW * iface, LPCWSTR pszIconPath,INT32 iIcon)
|
||||||
return NOERROR;
|
{
|
||||||
}
|
ICOM_THIS(IShellLinkWImpl, iface);
|
||||||
static HRESULT WINAPI IShellLinkW_SetRelativePath(LPSHELLLINKW this, LPCWSTR pszPathRel, DWORD dwReserved)
|
|
||||||
{ FIXME(shell,"(%p)->(path=%s %lx)\n",this, debugstr_w(pszPathRel), dwReserved);
|
FIXME(shell,"(%p)->(path=%s iicon=%u)\n",This, debugstr_w(pszIconPath), iIcon);
|
||||||
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;
|
return NOERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI IShellLinkW_fnSetRelativePath(IShellLinkW * iface, LPCWSTR pszPathRel, DWORD dwReserved)
|
||||||
|
{
|
||||||
|
ICOM_THIS(IShellLinkWImpl, iface);
|
||||||
|
|
||||||
|
FIXME(shell,"(%p)->(path=%s %lx)\n",This, debugstr_w(pszPathRel), dwReserved);
|
||||||
|
return NOERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI IShellLinkW_fnResolve(IShellLinkW * iface, HWND32 hwnd, DWORD fFlags)
|
||||||
|
{
|
||||||
|
ICOM_THIS(IShellLinkWImpl, iface);
|
||||||
|
|
||||||
|
FIXME(shell,"(%p)->(hwnd=%x flags=%lx)\n",This, hwnd, fFlags);
|
||||||
|
return NOERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI IShellLinkW_fnSetPath(IShellLinkW * iface, LPCWSTR pszFile)
|
||||||
|
{
|
||||||
|
ICOM_THIS(IShellLinkWImpl, iface);
|
||||||
|
|
||||||
|
FIXME(shell,"(%p)->(path=%s)\n",This, debugstr_w(pszFile));
|
||||||
|
return NOERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**************************************************************************
|
||||||
|
* IShellLinkW Implementation
|
||||||
|
*/
|
||||||
|
|
||||||
|
static ICOM_VTABLE(IShellLinkW) slvtw =
|
||||||
|
{ IShellLinkW_fnQueryInterface,
|
||||||
|
IShellLinkW_fnAddRef,
|
||||||
|
IShellLinkW_fnRelease,
|
||||||
|
IShellLinkW_fnGetPath,
|
||||||
|
IShellLinkW_fnGetIDList,
|
||||||
|
IShellLinkW_fnSetIDList,
|
||||||
|
IShellLinkW_fnGetDescription,
|
||||||
|
IShellLinkW_fnSetDescription,
|
||||||
|
IShellLinkW_fnGetWorkingDirectory,
|
||||||
|
IShellLinkW_fnSetWorkingDirectory,
|
||||||
|
IShellLinkW_fnGetArguments,
|
||||||
|
IShellLinkW_fnSetArguments,
|
||||||
|
IShellLinkW_fnGetHotkey,
|
||||||
|
IShellLinkW_fnSetHotkey,
|
||||||
|
IShellLinkW_fnGetShowCmd,
|
||||||
|
IShellLinkW_fnSetShowCmd,
|
||||||
|
IShellLinkW_fnGetIconLocation,
|
||||||
|
IShellLinkW_fnSetIconLocation,
|
||||||
|
IShellLinkW_fnSetRelativePath,
|
||||||
|
IShellLinkW_fnResolve,
|
||||||
|
IShellLinkW_fnSetPath
|
||||||
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue