- add the IShellExtInit interface to the ShellLink object

- use inline functions rather than macros to resolve the
  implementation pointer from an interface pointer
This commit is contained in:
Mike McCormack 2005-06-13 11:50:09 +00:00 committed by Alexandre Julliard
parent 29056637a5
commit d4eb4f54ed
1 changed files with 76 additions and 15 deletions

View File

@ -117,6 +117,7 @@ static const IShellLinkWVtbl slvtw;
static const IPersistFileVtbl pfvt; static const IPersistFileVtbl pfvt;
static const IPersistStreamVtbl psvt; static const IPersistStreamVtbl psvt;
static const IShellLinkDataListVtbl dlvt; static const IShellLinkDataListVtbl dlvt;
static const IShellExtInitVtbl eivt;
/* IShellLink Implementation */ /* IShellLink Implementation */
@ -127,6 +128,7 @@ typedef struct
const IPersistFileVtbl *lpvtblPersistFile; const IPersistFileVtbl *lpvtblPersistFile;
const IPersistStreamVtbl *lpvtblPersistStream; const IPersistStreamVtbl *lpvtblPersistStream;
const IShellLinkDataListVtbl *lpvtblShellLinkDataList; const IShellLinkDataListVtbl *lpvtblShellLinkDataList;
const IShellExtInitVtbl *lpvtblShellExtInit;
DWORD ref; DWORD ref;
@ -152,24 +154,40 @@ typedef struct
BOOL bDirty; BOOL bDirty;
} IShellLinkImpl; } IShellLinkImpl;
#define _IShellLinkW_Offset ((int)(&(((IShellLinkImpl*)0)->lpvtblw))) static inline IShellLinkImpl *impl_from_IShellLinkW( IShellLinkW *iface )
#define _ICOM_THIS_From_IShellLinkW(class, name) \ {
class* This = (class*)(((char*)name)-_IShellLinkW_Offset) return (IShellLinkImpl *)((char*)iface - FIELD_OFFSET(IShellLinkImpl, lpvtblw));
}
#define _ICOM_THIS_From_IShellLinkW(class, iface) \
class* This = impl_from_IShellLinkW( iface )
#define _IPersistFile_Offset \ static inline IShellLinkImpl *impl_from_IPersistFile( IPersistFile *iface )
((int)(&(((IShellLinkImpl*)0)->lpvtblPersistFile))) {
#define _ICOM_THIS_From_IPersistFile(class, name) \ return (IShellLinkImpl *)((char*)iface - FIELD_OFFSET(IShellLinkImpl, lpvtblPersistFile));
class* This = (class*)(((char*)name)-_IPersistFile_Offset) }
#define _ICOM_THIS_From_IPersistFile(class, iface) \
class* This = impl_from_IPersistFile( iface )
#define _IPersistStream_Offset \ static inline IShellLinkImpl *impl_from_IPersistStream( IPersistStream *iface )
((int)(&(((IShellLinkImpl*)0)->lpvtblPersistStream))) {
#define _ICOM_THIS_From_IPersistStream(class, name) \ return (IShellLinkImpl *)((char*)iface - FIELD_OFFSET(IShellLinkImpl, lpvtblPersistStream));
class* This = (class*)(((char*)name)-_IPersistStream_Offset) }
#define _ICOM_THIS_From_IPersistStream(class, iface) \
class* This = impl_from_IPersistStream( iface )
#define _IShellLinkDataList_Offset \ static inline IShellLinkImpl *impl_from_IShellLinkDataList( IShellLinkDataList *iface )
((int)(&(((IShellLinkImpl*)0)->lpvtblShellLinkDataList))) {
#define _ICOM_THIS_From_IShellLinkDataList(class, name) \ return (IShellLinkImpl *)((char*)iface - FIELD_OFFSET(IShellLinkImpl, lpvtblShellLinkDataList));
class* This = (class*)(((char*)name)-_IShellLinkDataList_Offset) }
#define _ICOM_THIS_From_IShellLinkDataList(class, iface) \
class* This = impl_from_IShellLinkDataList( iface )
static inline IShellLinkImpl *impl_from_IShellExtInit( IShellExtInit *iface )
{
return (IShellLinkImpl *)((char*)iface - FIELD_OFFSET(IShellLinkImpl, lpvtblShellExtInit));
}
#define _ICOM_THIS_From_IShellExtInit(class, iface) \
class* This = impl_from_IShellExtInit( iface )
static HRESULT ShellLink_UpdatePath(LPWSTR sPathRel, LPCWSTR path, LPCWSTR sWorkDir, LPWSTR* psPath); static HRESULT ShellLink_UpdatePath(LPWSTR sPathRel, LPCWSTR path, LPCWSTR sWorkDir, LPWSTR* psPath);
@ -1064,6 +1082,7 @@ HRESULT WINAPI IShellLink_Constructor( IUnknown *pUnkOuter,
sl->lpvtblPersistFile = &pfvt; sl->lpvtblPersistFile = &pfvt;
sl->lpvtblPersistStream = &psvt; sl->lpvtblPersistStream = &psvt;
sl->lpvtblShellLinkDataList = &dlvt; sl->lpvtblShellLinkDataList = &dlvt;
sl->lpvtblShellExtInit = &eivt;
sl->iShowCmd = SW_SHOWNORMAL; sl->iShowCmd = SW_SHOWNORMAL;
sl->bDirty = FALSE; sl->bDirty = FALSE;
@ -1212,6 +1231,10 @@ static HRESULT WINAPI IShellLinkA_fnQueryInterface( IShellLinkA * iface, REFIID
{ {
*ppvObj = &(This->lpvtblShellLinkDataList); *ppvObj = &(This->lpvtblShellLinkDataList);
} }
else if(IsEqualIID(riid, &IID_IShellExtInit))
{
*ppvObj = &(This->lpvtblShellExtInit);
}
if(*ppvObj) if(*ppvObj)
{ {
@ -2209,3 +2232,41 @@ static const IShellLinkDataListVtbl dlvt =
ShellLink_GetFlags, ShellLink_GetFlags,
ShellLink_SetFlags ShellLink_SetFlags
}; };
static HRESULT WINAPI
ShellLink_ExtInit_QueryInterface( IShellExtInit* iface, REFIID riid, void** ppvObject )
{
_ICOM_THIS_From_IShellExtInit(IShellLinkImpl, iface);
return IShellLinkA_QueryInterface((IShellLinkA*)This, riid, ppvObject);
}
static ULONG WINAPI
ShellLink_ExtInit_AddRef( IShellExtInit* iface )
{
_ICOM_THIS_From_IShellExtInit(IShellLinkImpl, iface);
return IShellLinkA_AddRef((IShellLinkA*)This);
}
static ULONG WINAPI
ShellLink_ExtInit_Release( IShellExtInit* iface )
{
_ICOM_THIS_From_IShellExtInit(IShellLinkImpl, iface);
return IShellLinkA_Release((IShellLinkA*)This);
}
static HRESULT WINAPI
ShellLink_ExtInit_Initialize( IShellExtInit* iface, LPCITEMIDLIST pidlFolder,
IDataObject *pdtobj, HKEY hkeyProgID )
{
_ICOM_THIS_From_IShellExtInit(IShellLinkImpl, iface);
FIXME("%p %p %p %p\n", This, pidlFolder, pdtobj, hkeyProgID );
return E_NOTIMPL;
}
static const IShellExtInitVtbl eivt =
{
ShellLink_ExtInit_QueryInterface,
ShellLink_ExtInit_AddRef,
ShellLink_ExtInit_Release,
ShellLink_ExtInit_Initialize
};