- Use the new COM definition macros in the header.

- Put the implementation of the object in the contmenu.c.
- Make appropriate name changes in contmenu.c.
This commit is contained in:
Adrian Thurston 1999-02-25 16:36:55 +00:00 committed by Alexandre Julliard
parent b24fc081cf
commit d6fdbfd707
2 changed files with 150 additions and 121 deletions

View File

@ -15,51 +15,70 @@
#include "shell32_main.h"
#include "shresdef.h"
static HRESULT WINAPI IContextMenu_QueryInterface(LPCONTEXTMENU ,REFIID , LPVOID *);
static ULONG WINAPI IContextMenu_AddRef(LPCONTEXTMENU);
static ULONG WINAPI IContextMenu_Release(LPCONTEXTMENU);
static HRESULT WINAPI IContextMenu_QueryContextMenu(LPCONTEXTMENU , HMENU32 ,UINT32 ,UINT32 ,UINT32 ,UINT32);
static HRESULT WINAPI IContextMenu_InvokeCommand(LPCONTEXTMENU, LPCMINVOKECOMMANDINFO32);
static HRESULT WINAPI IContextMenu_GetCommandString(LPCONTEXTMENU , UINT32 ,UINT32 ,LPUINT32 ,LPSTR ,UINT32);
static HRESULT WINAPI IContextMenu_HandleMenuMsg(LPCONTEXTMENU, UINT32, WPARAM32, LPARAM);
/**************************************************************************
* IContextMenu Implementation
*/
typedef struct
{ ICOM_VTABLE(IContextMenu)* lpvtbl;
DWORD ref;
LPSHELLFOLDER pSFParent;
LPITEMIDLIST *aPidls;
BOOL32 bAllValues;
} IContextMenuImpl;
BOOL32 IContextMenu_AllocPidlTable(LPCONTEXTMENU, DWORD);
void IContextMenu_FreePidlTable(LPCONTEXTMENU);
BOOL32 IContextMenu_CanRenameItems(LPCONTEXTMENU);
BOOL32 IContextMenu_FillPidlTable(LPCONTEXTMENU, LPCITEMIDLIST *, UINT32);
static HRESULT WINAPI IContextMenu_fnQueryInterface(IContextMenu *,REFIID , LPVOID *);
static ULONG WINAPI IContextMenu_fnAddRef(IContextMenu *);
static ULONG WINAPI IContextMenu_fnRelease(IContextMenu *);
static HRESULT WINAPI IContextMenu_fnQueryContextMenu(IContextMenu *, HMENU32 ,UINT32 ,UINT32 ,UINT32 ,UINT32);
static HRESULT WINAPI IContextMenu_fnInvokeCommand(IContextMenu *, LPCMINVOKECOMMANDINFO32);
static HRESULT WINAPI IContextMenu_fnGetCommandString(IContextMenu *, UINT32 ,UINT32 ,LPUINT32 ,LPSTR ,UINT32);
static HRESULT WINAPI IContextMenu_fnHandleMenuMsg(IContextMenu *, UINT32, WPARAM32, LPARAM);
static struct IContextMenu_VTable cmvt =
{ IContextMenu_QueryInterface,
IContextMenu_AddRef,
IContextMenu_Release,
IContextMenu_QueryContextMenu,
IContextMenu_InvokeCommand,
IContextMenu_GetCommandString,
IContextMenu_HandleMenuMsg,
/* Private Methods */
BOOL32 IContextMenu_AllocPidlTable(IContextMenuImpl*, DWORD);
void IContextMenu_FreePidlTable(IContextMenuImpl*);
BOOL32 IContextMenu_CanRenameItems(IContextMenuImpl*);
BOOL32 IContextMenu_FillPidlTable(IContextMenuImpl*, LPCITEMIDLIST *, UINT32);
/**************************************************************************
* IContextMenu VTable
*
*/
static struct ICOM_VTABLE(IContextMenu) cmvt = {
IContextMenu_fnQueryInterface,
IContextMenu_fnAddRef,
IContextMenu_fnRelease,
IContextMenu_fnQueryContextMenu,
IContextMenu_fnInvokeCommand,
IContextMenu_fnGetCommandString,
IContextMenu_fnHandleMenuMsg,
(void *) 0xdeadbabe /* just paranoia */
};
/**************************************************************************
* IContextMenu_QueryInterface
* IContextMenu_fnQueryInterface
*/
static HRESULT WINAPI IContextMenu_QueryInterface(LPCONTEXTMENU this,REFIID riid, LPVOID *ppvObj)
{ char xriid[50];
static HRESULT WINAPI IContextMenu_fnQueryInterface(IContextMenu *iface, REFIID riid, LPVOID *ppvObj)
{ ICOM_THIS(IContextMenuImpl, iface);
char xriid[50];
WINE_StringFromCLSID((LPCLSID)riid,xriid);
TRACE(shell,"(%p)->(\n\tIID:\t%s,%p)\n",this,xriid,ppvObj);
TRACE(shell,"(%p)->(\n\tIID:\t%s,%p)\n",This,xriid,ppvObj);
*ppvObj = NULL;
if(IsEqualIID(riid, &IID_IUnknown)) /*IUnknown*/
{ *ppvObj = (LPUNKNOWN)(LPCONTEXTMENU)this;
{ *ppvObj = This;
}
else if(IsEqualIID(riid, &IID_IContextMenu)) /*IContextMenu*/
{ *ppvObj = (LPCONTEXTMENU)this;
{ *ppvObj = This;
}
else if(IsEqualIID(riid, &IID_IShellExtInit)) /*IShellExtInit*/
{ FIXME (shell,"-- LPSHELLEXTINIT pointer requested\n");
}
if(*ppvObj)
{ (*(LPCONTEXTMENU *)ppvObj)->lpvtbl->fnAddRef(this);
{
(*(IContextMenuImpl**)ppvObj)->lpvtbl->fnAddRef(iface);
TRACE(shell,"-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
return S_OK;
}
@ -68,46 +87,48 @@ static HRESULT WINAPI IContextMenu_QueryInterface(LPCONTEXTMENU this,REFIID riid
}
/**************************************************************************
* IContextMenu_AddRef
* IContextMenu_fnAddRef
*/
static ULONG WINAPI IContextMenu_AddRef(LPCONTEXTMENU this)
{ TRACE(shell,"(%p)->(count=%lu)\n",this,(this->ref)+1);
static ULONG WINAPI IContextMenu_fnAddRef(IContextMenu *iface)
{ ICOM_THIS(IContextMenuImpl, iface);
TRACE(shell,"(%p)->(count=%lu)\n",This,(This->ref)+1);
shell32_ObjCount++;
return ++(this->ref);
return ++(This->ref);
}
/**************************************************************************
* IContextMenu_Release
* IContextMenu_fnRelease
*/
static ULONG WINAPI IContextMenu_Release(LPCONTEXTMENU this)
{ TRACE(shell,"(%p)->()\n",this);
static ULONG WINAPI IContextMenu_fnRelease(IContextMenu *iface)
{ ICOM_THIS(IContextMenuImpl, iface);
TRACE(shell,"(%p)->()\n",This);
shell32_ObjCount--;
if (!--(this->ref))
{ TRACE(shell," destroying IContextMenu(%p)\n",this);
if (!--(This->ref))
{ TRACE(shell," destroying IContextMenu(%p)\n",This);
if(this->pSFParent)
this->pSFParent->lpvtbl->fnRelease(this->pSFParent);
if(This->pSFParent)
This->pSFParent->lpvtbl->fnRelease(This->pSFParent);
/*make sure the pidl is freed*/
if(this->aPidls)
{ IContextMenu_FreePidlTable(this);
if(This->aPidls)
{ IContextMenu_FreePidlTable(This);
}
HeapFree(GetProcessHeap(),0,this);
HeapFree(GetProcessHeap(),0,This);
return 0;
}
return this->ref;
return This->ref;
}
/**************************************************************************
* IContextMenu_Constructor()
*/
LPCONTEXTMENU IContextMenu_Constructor(LPSHELLFOLDER pSFParent, LPCITEMIDLIST *aPidls, UINT32 uItemCount)
{ LPCONTEXTMENU cm;
IContextMenu *IContextMenu_Constructor(LPSHELLFOLDER pSFParent, LPCITEMIDLIST *aPidls, UINT32 uItemCount)
{ IContextMenuImpl* cm;
UINT32 u;
cm = (LPCONTEXTMENU)HeapAlloc(GetProcessHeap(),0,sizeof(IContextMenu));
FIXME(shell, "HELLO age\n") ;
cm = (IContextMenuImpl*)HeapAlloc(GetProcessHeap(),0,sizeof(IContextMenuImpl));
cm->lpvtbl=&cmvt;
cm->ref = 1;
@ -129,7 +150,7 @@ LPCONTEXTMENU IContextMenu_Constructor(LPSHELLFOLDER pSFParent, LPCITEMIDLIST *a
}
TRACE(shell,"(%p)->()\n",cm);
shell32_ObjCount++;
return cm;
return (IContextMenu*)cm;
}
/**************************************************************************
* ICM_InsertItem()
@ -153,17 +174,18 @@ void WINAPI _InsertMenuItem (HMENU32 hmenu, UINT32 indexMenu, BOOL32 fByPosition
InsertMenuItem32A( hmenu, indexMenu, fByPosition, &mii);
}
/**************************************************************************
* IContextMenu_QueryContextMenu()
* IContextMenu_fnQueryContextMenu()
*/
static HRESULT WINAPI IContextMenu_QueryContextMenu( LPCONTEXTMENU this, HMENU32 hmenu, UINT32 indexMenu,
static HRESULT WINAPI IContextMenu_fnQueryContextMenu(IContextMenu *iface, HMENU32 hmenu, UINT32 indexMenu,
UINT32 idCmdFirst,UINT32 idCmdLast,UINT32 uFlags)
{ BOOL32 fExplore ;
{ ICOM_THIS(IContextMenuImpl, iface);
BOOL32 fExplore ;
TRACE(shell,"(%p)->(hmenu=%x indexmenu=%x cmdfirst=%x cmdlast=%x flags=%x )\n",this, hmenu, indexMenu, idCmdFirst, idCmdLast, uFlags);
TRACE(shell,"(%p)->(hmenu=%x indexmenu=%x cmdfirst=%x cmdlast=%x flags=%x )\n",This, hmenu, indexMenu, idCmdFirst, idCmdLast, uFlags);
if(!(CMF_DEFAULTONLY & uFlags))
{ if(!this->bAllValues)
{ if(!This->bAllValues)
{ /* folder menu */
fExplore = uFlags & CMF_EXPLORE;
if(fExplore)
@ -177,14 +199,14 @@ static HRESULT WINAPI IContextMenu_QueryContextMenu( LPCONTEXTMENU this, HMENU32
if(uFlags & CMF_CANRENAME)
{ _InsertMenuItem(hmenu, indexMenu++, TRUE, 0, MFT_SEPARATOR, NULL, 0);
_InsertMenuItem(hmenu, indexMenu++, TRUE, idCmdFirst+IDM_RENAME, MFT_STRING, "&Rename", (IContextMenu_CanRenameItems(this) ? MFS_ENABLED : MFS_DISABLED));
_InsertMenuItem(hmenu, indexMenu++, TRUE, idCmdFirst+IDM_RENAME, MFT_STRING, "&Rename", (IContextMenu_CanRenameItems(This) ? MFS_ENABLED : MFS_DISABLED));
}
}
else /* file menu */
{ _InsertMenuItem(hmenu, indexMenu++, TRUE, idCmdFirst+IDM_OPEN, MFT_STRING, "&Open", MFS_ENABLED|MFS_DEFAULT);
if(uFlags & CMF_CANRENAME)
{ _InsertMenuItem(hmenu, indexMenu++, TRUE, 0, MFT_SEPARATOR, NULL, 0);
_InsertMenuItem(hmenu, indexMenu++, TRUE, idCmdFirst+IDM_RENAME, MFT_STRING, "&Rename", (IContextMenu_CanRenameItems(this) ? MFS_ENABLED : MFS_DISABLED));
_InsertMenuItem(hmenu, indexMenu++, TRUE, idCmdFirst+IDM_RENAME, MFT_STRING, "&Rename", (IContextMenu_CanRenameItems(This) ? MFS_ENABLED : MFS_DISABLED));
}
}
return MAKE_HRESULT(SEVERITY_SUCCESS, 0, (IDM_LAST + 1));
@ -193,17 +215,18 @@ static HRESULT WINAPI IContextMenu_QueryContextMenu( LPCONTEXTMENU this, HMENU32
}
/**************************************************************************
* IContextMenu_InvokeCommand()
* IContextMenu_fnInvokeCommand()
*/
static HRESULT WINAPI IContextMenu_InvokeCommand(LPCONTEXTMENU this, LPCMINVOKECOMMANDINFO32 lpcmi)
{ LPITEMIDLIST pidlTemp,pidlFQ;
static HRESULT WINAPI IContextMenu_fnInvokeCommand(IContextMenu *iface, LPCMINVOKECOMMANDINFO32 lpcmi)
{ ICOM_THIS(IContextMenuImpl, iface);
LPITEMIDLIST pidlTemp,pidlFQ;
LPSHELLBROWSER lpSB;
LPSHELLVIEW lpSV;
HWND32 hWndSV;
SHELLEXECUTEINFO32A sei;
int i;
TRACE(shell,"(%p)->(invcom=%p verb=%p wnd=%x)\n",this,lpcmi,lpcmi->lpVerb, lpcmi->hwnd);
TRACE(shell,"(%p)->(invcom=%p verb=%p wnd=%x)\n",This,lpcmi,lpcmi->lpVerb, lpcmi->hwnd);
if(HIWORD(lpcmi->lpVerb))
{ /* get the active IShellView */
@ -238,13 +261,13 @@ static HRESULT WINAPI IContextMenu_InvokeCommand(LPCONTEXTMENU this, LPCMINVOKEC
/* Find the first item in the list that is not a value. These commands
should never be invoked if there isn't at least one folder item in the list.*/
for(i = 0; this->aPidls[i]; i++)
{ if(!_ILIsValue(this->aPidls[i]))
for(i = 0; This->aPidls[i]; i++)
{ if(!_ILIsValue(This->aPidls[i]))
break;
}
pidlTemp = ILCombine(this->pSFParent->mpidl, this->aPidls[i]);
pidlFQ = ILCombine(this->pSFParent->pMyPidl, pidlTemp);
pidlTemp = ILCombine(This->pSFParent->mpidl, This->aPidls[i]);
pidlFQ = ILCombine(This->pSFParent->pMyPidl, pidlTemp);
SHFree(pidlTemp);
ZeroMemory(&sei, sizeof(sei));
@ -274,13 +297,14 @@ static HRESULT WINAPI IContextMenu_InvokeCommand(LPCONTEXTMENU this, LPCMINVOKEC
}
/**************************************************************************
* IContextMenu_GetCommandString()
* IContextMenu_fnGetCommandString()
*/
static HRESULT WINAPI IContextMenu_GetCommandString( LPCONTEXTMENU this, UINT32 idCommand,
static HRESULT WINAPI IContextMenu_fnGetCommandString(IContextMenu *iface, UINT32 idCommand,
UINT32 uFlags,LPUINT32 lpReserved,LPSTR lpszName,UINT32 uMaxNameLen)
{ HRESULT hr = E_INVALIDARG;
{ ICOM_THIS(IContextMenuImpl, iface);
HRESULT hr = E_INVALIDARG;
TRACE(shell,"(%p)->(idcom=%x flags=%x %p name=%p len=%x)\n",this, idCommand, uFlags, lpReserved, lpszName, uMaxNameLen);
TRACE(shell,"(%p)->(idcom=%x flags=%x %p name=%p len=%x)\n",This, idCommand, uFlags, lpReserved, lpszName, uMaxNameLen);
switch(uFlags)
{ case GCS_HELPTEXT:
@ -296,7 +320,7 @@ static HRESULT WINAPI IContextMenu_GetCommandString( LPCONTEXTMENU this, UINT32
}
break;
/* NT 4.0 with IE 3.0x or no IE will always call this with GCS_VERBW. In this
/* NT 4.0 with IE 3.0x or no IE will always call This with GCS_VERBW. In This
case, you need to do the lstrcpyW to the pointer passed.*/
case GCS_VERBW:
switch(idCommand)
@ -311,63 +335,68 @@ static HRESULT WINAPI IContextMenu_GetCommandString( LPCONTEXTMENU this, UINT32
hr = NOERROR;
break;
}
TRACE(shell,"-- (%p)->(name=%s)\n",this, lpszName);
TRACE(shell,"-- (%p)->(name=%s)\n",This, lpszName);
return hr;
}
/**************************************************************************
* IContextMenu_HandleMenuMsg()
* IContextMenu_fnHandleMenuMsg()
* NOTES
* should be only in IContextMenu2 and IContextMenu3
* is nevertheless called from word95
*/
static HRESULT WINAPI IContextMenu_HandleMenuMsg(LPCONTEXTMENU this, UINT32 uMsg,WPARAM32 wParam,LPARAM lParam)
{ TRACE(shell,"(%p)->(msg=%x wp=%x lp=%lx)\n",this, uMsg, wParam, lParam);
static HRESULT WINAPI IContextMenu_fnHandleMenuMsg(IContextMenu *iface, UINT32 uMsg,WPARAM32 wParam,LPARAM lParam)
{ ICOM_THIS(IContextMenuImpl, iface);
TRACE(shell,"(%p)->(msg=%x wp=%x lp=%lx)\n",This, uMsg, wParam, lParam);
return E_NOTIMPL;
}
/**************************************************************************
* IContextMenu_AllocPidlTable()
*/
BOOL32 IContextMenu_AllocPidlTable(LPCONTEXTMENU this, DWORD dwEntries)
{ TRACE(shell,"(%p)->(entrys=%lu)\n",this, dwEntries);
BOOL32 IContextMenu_AllocPidlTable(IContextMenuImpl *This, DWORD dwEntries)
{ TRACE(shell,"(%p)->(entrys=%lu)\n",This, dwEntries);
/*add one for NULL terminator */
dwEntries++;
this->aPidls = (LPITEMIDLIST*)SHAlloc(dwEntries * sizeof(LPITEMIDLIST));
This->aPidls = (LPITEMIDLIST*)SHAlloc(dwEntries * sizeof(LPITEMIDLIST));
if(this->aPidls)
{ ZeroMemory(this->aPidls, dwEntries * sizeof(LPITEMIDLIST)); /*set all of the entries to NULL*/
if(This->aPidls)
{ ZeroMemory(This->aPidls, dwEntries * sizeof(LPITEMIDLIST)); /*set all of the entries to NULL*/
}
return (this->aPidls != NULL);
return (This->aPidls != NULL);
}
/**************************************************************************
* IContextMenu_FreePidlTable()
*/
void IContextMenu_FreePidlTable(LPCONTEXTMENU this)
void IContextMenu_FreePidlTable(IContextMenuImpl *This)
{ int i;
TRACE(shell,"(%p)->()\n",this);
TRACE(shell,"(%p)->()\n",This);
if(this->aPidls)
{ for(i = 0; this->aPidls[i]; i++)
{ SHFree(this->aPidls[i]);
if(This->aPidls)
{ for(i = 0; This->aPidls[i]; i++)
{ SHFree(This->aPidls[i]);
}
SHFree(this->aPidls);
this->aPidls = NULL;
SHFree(This->aPidls);
This->aPidls = NULL;
}
}
/**************************************************************************
* IContextMenu_FillPidlTable()
*/
BOOL32 IContextMenu_FillPidlTable(LPCONTEXTMENU this, LPCITEMIDLIST *aPidls, UINT32 uItemCount)
BOOL32 IContextMenu_FillPidlTable(IContextMenuImpl *This, LPCITEMIDLIST *aPidls, UINT32 uItemCount)
{ UINT32 i;
TRACE(shell,"(%p)->(apidl=%p count=%u)\n",this, aPidls, uItemCount);
if(this->aPidls)
TRACE(shell,"(%p)->(apidl=%p count=%u)\n",This, aPidls, uItemCount);
if(This->aPidls)
{ for(i = 0; i < uItemCount; i++)
{ this->aPidls[i] = ILClone(aPidls[i]);
{ This->aPidls[i] = ILClone(aPidls[i]);
}
return TRUE;
}
@ -377,20 +406,20 @@ BOOL32 IContextMenu_FillPidlTable(LPCONTEXTMENU this, LPCITEMIDLIST *aPidls, UIN
/**************************************************************************
* IContextMenu_CanRenameItems()
*/
BOOL32 IContextMenu_CanRenameItems(LPCONTEXTMENU this)
BOOL32 IContextMenu_CanRenameItems(IContextMenuImpl *This)
{ UINT32 i;
DWORD dwAttributes;
TRACE(shell,"(%p)->()\n",this);
TRACE(shell,"(%p)->()\n",This);
if(this->aPidls)
{ for(i = 0; this->aPidls[i]; i++){} /*get the number of items assigned to this object*/
if(This->aPidls)
{ for(i = 0; This->aPidls[i]; i++){} /*get the number of items assigned to This object*/
if(i > 1) /*you can't rename more than one item at a time*/
{ return FALSE;
}
dwAttributes = SFGAO_CANRENAME;
this->pSFParent->lpvtbl->fnGetAttributesOf(this->pSFParent, i,
(LPCITEMIDLIST*)this->aPidls, &dwAttributes);
This->pSFParent->lpvtbl->fnGetAttributesOf(This->pSFParent, i,
(LPCITEMIDLIST*)This->aPidls, &dwAttributes);
return dwAttributes & SFGAO_CANRENAME;
}

View File

@ -23,7 +23,7 @@ DWORD WINAPI SHELL32_DllGetClassObject(REFCLSID,REFIID,LPVOID*);
/* foreward declaration of the objects*/
typedef struct tagCONTEXTMENU *LPCONTEXTMENU, IContextMenu;
typedef struct IContextMenu IContextMenu, *LPCONTEXTMENU;
typedef struct tagSHELLEXTINIT *LPSHELLEXTINIT,IShellExtInit;
typedef struct tagENUMIDLIST *LPENUMIDLIST, IEnumIDList;
typedef struct tagSHELLFOLDER *LPSHELLFOLDER, IShellFolder;
@ -148,34 +148,34 @@ typedef struct tagCMInvokeCommandInfoEx
POINT32 ptInvoke; /* Point where it's invoked */
} CMINVOKECOMMANDINFOEX32, *LPCMINVOKECOMMANDINFOEX32;
typedef struct IContextMenu_VTable
{ /* *** IUnknown methods *** */
STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE;
STDMETHOD_(ULONG,AddRef) (THIS) PURE;
STDMETHOD_(ULONG,Release) (THIS) PURE;
STDMETHOD(QueryContextMenu)(THIS_ HMENU32 hmenu,UINT32 indexMenu,UINT32 idCmdFirst, UINT32 idCmdLast,UINT32 uFlags) PURE;
STDMETHOD(InvokeCommand)(THIS_ LPCMINVOKECOMMANDINFO32 lpici) PURE;
STDMETHOD(GetCommandString)(THIS_ UINT32 idCmd,UINT32 uType,UINT32 * pwReserved,LPSTR pszName,UINT32 cchMax) PURE;
/* undocumented not only in ContextMenu2 */
STDMETHOD(HandleMenuMsg)(THIS_ UINT32 uMsg,WPARAM32 wParam,LPARAM lParam) PURE;
/* possibly another nasty entry from ContextMenu3 ?*/
void * guard;
} IContextMenu_VTable,*LPCONTEXTMENU_VTABLE;
struct tagCONTEXTMENU
{ LPCONTEXTMENU_VTABLE lpvtbl;
DWORD ref;
LPSHELLFOLDER pSFParent;
LPITEMIDLIST *aPidls;
BOOL32 bAllValues;
};
#undef THIS
#define ICOM_INTERFACE IContextMenu
#define IContextMenu_METHODS \
ICOM_METHOD5(HRESULT,QueryContextMenu, HMENU32,hmenu, UINT32,indexMenu, UINT32,idCmdFirst, UINT32,idCmdLast, UINT32,uFlags) \
ICOM_METHOD1(HRESULT,InvokeCommand, LPCMINVOKECOMMANDINFO32,lpici) \
ICOM_METHOD5(HRESULT,GetCommandString, UINT32,idCmd, UINT32,uType, UINT32*,pwReserved, LPSTR,pszName, UINT32,cchMax) \
ICOM_METHOD3(HRESULT,HandleMenuMsg, UINT32,uMsg,WPARAM32,wParam,LPARAM,lParam) \
void * guard; /*possibly another nasty entry from ContextMenu3 ?*/
#define IContextMenu_IMETHODS \
IUnknown_IMETHODS \
IContextMenu_METHODS
ICOM_DEFINE(IContextMenu, IUnknown)
#undef ICOM_INTERFACE
#ifdef ICOM_CINTERFACE
// *** IUnknown methods *** //
#define IContextMenu_QueryInterface(p,a,b) ICOM_CALL2(QueryInterface,p,a,b)
#define IContextMenu_AddRef(p) ICOM_CALL (AddRef,p)
#define IContextMenu_Release(p) ICOM_CALL (Release,p)
// *** IContextMenu methods *** //
#define IContextMenu_QueryContextMenu(p,a,b,c,d,e) ICOM_CALL5(QueryContextMenu,p,a,b,c,d,e)
#define IContextMenu_InvokeCommand(p,a) ICOM_CALL1(InvokeCommand,p,a)
#define IContextMenu_GetCommandString(p,a,b,c,d,e) ICOM_CALL5(GetCommandString,p,a,b,c,d,e)
#define IContextMenu_HandleMenuMsg(p,a,b,c) ICOM_CALL3(HandleMenuMsg,p,a,b,c)
#endif
/*****************************************************************************
* structures for shell clipboard formats
*/