/*
 * Copyright (C) 1999 Paul Quinn
 * Copyright (C) 1999 Francis Beaudet
 * Copyright (C) 2003 Alexandre Julliard
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

#ifndef DO_NO_IMPORTS
import "objidl.idl";
#endif

interface IOleInPlaceActiveObject;

/*****************************************************************************
 * IOleTypes interface
 */
[
    uuid(b0916c84-7416-101a-bcea-08002b2b79ef)
]
interface IOLETypes
{
    typedef enum tagOLERENDER
    {
	OLERENDER_NONE = 0,
	OLERENDER_DRAW = 1,
	OLERENDER_FORMAT = 2,
	OLERENDER_ASIS = 3
    } OLERENDER, *LPOLERENDER;

    typedef struct tagOBJECTDESCRIPTOR
    {
	ULONG cbSize;
	CLSID clsid;
	DWORD dwDrawAspect;
	SIZEL sizel;
	POINTL pointl;
	DWORD dwStatus;
	DWORD dwFullUserTypeName;
	DWORD dwSrcOfCopy;
    } OBJECTDESCRIPTOR,  *POBJECTDESCRIPTOR,   *LPOBJECTDESCRIPTOR,
      LINKSRCDESCRIPTOR, *PLINKSRCDESCRIPTOR,  *LPLINKSRCDESCRIPTOR;
}


/*****************************************************************************
 * IOleWindow interface
 */
[
    object,
    uuid(00000114-0000-0000-c000-000000000046),
    pointer_default(unique)
]
interface IOleWindow : IUnknown
{
    typedef [unique] IOleWindow *LPOLEWINDOW;

    HRESULT GetWindow(
        [out] HWND *phwnd);

    HRESULT ContextSensitiveHelp(
        [in] BOOL fEnterMode);
}


/*****************************************************************************
 * IOleInPlaceObject interface
 */
[
    object,
    uuid(00000113-0000-0000-c000-000000000046),
    pointer_default(unique)
]
interface IOleInPlaceObject : IOleWindow
{
    typedef [unique] IOleInPlaceObject *LPOLEINPLACEOBJECT;

    HRESULT InPlaceDeactivate();

    HRESULT UIDeactivate();

    HRESULT SetObjectRects(
        [in] LPCRECT lprcPosRect,
        [in] LPCRECT lprcClipRect);

    HRESULT ReactivateAndUndo();
}


/*****************************************************************************
 * IOleInPlaceUIWindow interface
 */
[
    object,
    uuid(00000115-0000-0000-c000-000000000046),
    pointer_default(unique)
]

interface IOleInPlaceUIWindow : IOleWindow
{
    typedef [unique] IOleInPlaceUIWindow *LPOLEINPLACEUIWINDOW;

    typedef RECT BORDERWIDTHS;
    typedef LPRECT LPBORDERWIDTHS;
    typedef LPCRECT LPCBORDERWIDTHS;

    HRESULT GetBorder(
        [out] LPRECT lprectBorder);

    HRESULT RequestBorderSpace(
        [in, unique] LPCBORDERWIDTHS pborderwidths);

    HRESULT SetBorderSpace(
        [in, unique] LPCBORDERWIDTHS pborderwidths);

    HRESULT SetActiveObject(
        [in, unique] IOleInPlaceActiveObject *pActiveObject,
        [in, string, unique] LPCOLESTR pszObjName);
}


/* avoid conflict with Wine Unicode macros */
cpp_quote("#ifdef WINE_NO_UNICODE_MACROS")
cpp_quote("#undef TranslateAccelerator")
cpp_quote("#endif")

/*****************************************************************************
 * IOleInPlaceFrame interface
 */
[
    object,
    uuid(00000116-0000-0000-c000-000000000046),
    pointer_default(unique)
]
interface IOleInPlaceFrame : IOleInPlaceUIWindow
{
    typedef [unique] IOleInPlaceFrame *LPOLEINPLACEFRAME;

    typedef struct tagOleInPlaceFrameInfo
    {
        UINT cb;
        BOOL fMDIApp;
        HWND hwndFrame;
        HACCEL haccel;
        UINT cAccelEntries;
    } OLEINPLACEFRAMEINFO, *LPOLEINPLACEFRAMEINFO;

    typedef struct  tagOleMenuGroupWidths
    {
        LONG width[ 6 ];
    } OLEMENUGROUPWIDTHS, *LPOLEMENUGROUPWIDTHS;

    typedef HGLOBAL HOLEMENU;

    HRESULT InsertMenus(
        [in] HMENU hmenuShared,
        [in,out] LPOLEMENUGROUPWIDTHS lpMenuWidths);

    HRESULT SetMenu(
        [in] HMENU hmenuShared,
        [in] HOLEMENU holemenu,
        [in] HWND hwndActiveObject);

    HRESULT RemoveMenus(
        [in] HMENU hmenuShared);

    HRESULT SetStatusText(
        [in, unique] LPCOLESTR pszStatusText);

    HRESULT EnableModeless(
        [in] BOOL fEnable);

    HRESULT TranslateAccelerator(
        [in] LPMSG lpmsg,
        [in] WORD wID);
}


/*****************************************************************************
 * IOleInPlaceActiveObject interface
 */
[
    object,
    uuid(00000117-0000-0000-c000-000000000046)
]
interface IOleInPlaceActiveObject : IOleWindow
{
    typedef [unique] IOleInPlaceActiveObject *LPOLEINPLACEACTIVEOBJECT;

    [local]
    HRESULT TranslateAccelerator(
        [in] LPMSG lpmsg);

    [call_as(TranslateAccelerator)]
    HRESULT RemoteTranslateAccelerator();

    HRESULT OnFrameWindowActivate(
        [in] BOOL fActivate);

    HRESULT OnDocWindowActivate(
        [in] BOOL fActivate);

    [local]
    HRESULT ResizeBorder(
        [in] LPCRECT prcBorder,
        [in, unique] IOleInPlaceUIWindow *pUIWindow,
        [in] BOOL fFrameWindow);

    [call_as(ResizeBorder)]
    HRESULT RemoteResizeBorder(
        [in] LPCRECT prcBorder,
        [in] REFIID riid,
        [in, unique, iid_is(riid)] IOleInPlaceUIWindow *pUIWindow,
        [in] BOOL fFrameWindow);

    HRESULT EnableModeless(
        [in] BOOL fEnable);
}


/*****************************************************************************
 * IOleInPlaceSite interface
 */
[
    object,
    uuid(00000119-0000-0000-c000-000000000046),
    pointer_default(unique)
]
interface IOleInPlaceSite : IOleWindow
{
    typedef [unique] IOleInPlaceSite *LPOLEINPLACESITE;

    HRESULT CanInPlaceActivate();
    HRESULT OnInPlaceActivate();
    HRESULT OnUIActivate();

    HRESULT GetWindowContext(
        [out] IOleInPlaceFrame **ppFrame,
        [out] IOleInPlaceUIWindow **ppDoc,
        [out] LPRECT lprcPosRect,
        [out] LPRECT lprcClipRect,
        [in, out] LPOLEINPLACEFRAMEINFO lpFrameInfo);

    HRESULT Scroll(
        [in] SIZE scrollExtent);

    HRESULT OnUIDeactivate(
        [in] BOOL fUndoable);

    HRESULT OnInPlaceDeactivate();
    HRESULT DiscardUndoState();
    HRESULT DeactivateAndUndo();

    HRESULT OnPosRectChange(
        [in] LPCRECT lprcPosRect);
}


/*****************************************************************************
 * IParseDisplayName interface
 */
[
    object,
    uuid(0000011a-0000-0000-c000-000000000046),
    pointer_default(unique)
]
interface IParseDisplayName : IUnknown
{
    typedef [unique] IParseDisplayName *LPPARSEDISPLAYNAME;

    HRESULT ParseDisplayName(
        [in, unique] IBindCtx *pbc,
        [in] LPOLESTR pszDisplayName,
        [out] ULONG *pchEaten,
        [out] IMoniker **ppmkOut);
}


/*****************************************************************************
 * IOleContainer interface
 */
[
    object,
    uuid(0000011b-0000-0000-c000-000000000046),
    pointer_default(unique)
]
interface IOleContainer : IParseDisplayName
{
    typedef [unique] IOleContainer *LPOLECONTAINER;

    HRESULT EnumObjects(
        [in] DWORD grfFlags,
        [out] IEnumUnknown **ppenum);

    HRESULT LockContainer(
        [in] BOOL fLock);
}


/*****************************************************************************
 * IOleItemContainer interface
 */
[
    object,
    uuid(0000011c-0000-0000-c000-000000000046),
    pointer_default(unique)
]
interface IOleItemContainer : IOleContainer
{
    typedef [unique] IOleItemContainer *LPOLEITEMCONTAINER;

    typedef enum tagBINDSPEED
    {
	BINDSPEED_INDEFINITE = 1,
	BINDSPEED_MODERATE = 2,
	BINDSPEED_IMMEDIATE = 3
    } BINDSPEED;

    typedef enum tagOLECONTF
    {
	OLECONTF_EMBEDDINGS = 1,
	OLECONTF_LINKS = 2,
	OLECONTF_OTHERS = 4,
	OLECONTF_OLNYUSER = 8,
	OLECONTF_ONLYIFRUNNING = 16
    } OLECONTF;

cpp_quote("#ifdef WINE_NO_UNICODE_MACROS")
cpp_quote("#undef GetObject")
cpp_quote("#endif")
    HRESULT GetObject(
        [in] LPOLESTR pszItem,
        [in] DWORD dwSpeedNeeded,
        [in, unique] IBindCtx *pbc,
        [in] REFIID riid,
        [out, iid_is(riid)] void **ppvObject);

    HRESULT GetObjectStorage(
        [in] LPOLESTR pszItem,
        [in, unique] IBindCtx *pbc,
        [in] REFIID riid,
        [out, iid_is(riid)] void **ppvStorage);

    HRESULT IsRunning(
        [in] LPOLESTR pszItem);
}


/*****************************************************************************
 * IOleLink interface
 */
[
    object,
    uuid(0000011d-0000-0000-c000-000000000046)
]
interface IOleLink : IUnknown
{
    typedef [unique] IOleLink *LPOLELINK;

    typedef enum tagOLEUPDATE
    {
	OLEUPDATE_ALWAYS = 1,
	OLEUPDATE_ONCALL = 3
    } OLEUPDATE, *POLEUPDATE, *LPOLEUPDATE;

    typedef enum tagOLELINKBIND
    {
	OLELINKBIND_EVENIFCLASSDIFF = 1
    } OLELINKBIND;

    HRESULT SetUpdateOptions(
        [in] DWORD dwUpdateOpt);

    HRESULT GetUpdateOptions(
        [out] DWORD *pdwUpdateOpt);

    HRESULT SetSourceMoniker(
        [in, unique] IMoniker *pmk,
        [in] REFCLSID rclsid);

    HRESULT GetSourceMoniker(
        [out] IMoniker **ppmk);

    HRESULT SetSourceDisplayName(
        [in]LPCOLESTR pszStatusText);

    HRESULT GetSourceDisplayName(
        [out] LPOLESTR *ppszDisplayName);

    HRESULT BindToSource(
        [in] DWORD bindflags,
        [in, unique] IBindCtx *pbc);

    HRESULT BindIfRunning();

    HRESULT GetBoundSource(
        [out] IUnknown **ppunk);

    HRESULT UnbindSource();

    HRESULT Update(
        [in, unique] IBindCtx *pbc);
}


/*****************************************************************************
 * IOleClientSite interface
 */
[
    object,
    uuid(00000118-0000-0000-c000-000000000046),
    pointer_default(unique)
]
interface IOleClientSite : IUnknown
{
    typedef [unique] IOleClientSite * LPOLECLIENTSITE;

    HRESULT SaveObject();

    HRESULT GetMoniker(
        [in] DWORD dwAssign,
        [in] DWORD dwWhichMoniker,
        [out] IMoniker **ppmk);

    HRESULT GetContainer(
        [out] IOleContainer **ppContainer);

    HRESULT ShowObject();

    HRESULT OnShowWindow(
        [in] BOOL fShow);

    HRESULT RequestNewObjectLayout();
}


/*****************************************************************************
 * IOleCache interface
 */
[
    object,
    uuid(0000011e-0000-0000-c000-000000000046),
    pointer_default(unique)
]
interface IOleCache : IUnknown
{
    typedef [unique] IOleCache *LPOLECACHE;

    HRESULT Cache(
        [in, unique] FORMATETC *pformatetc,
        [in] DWORD advf,
        [out] DWORD *pdwConnection);

    HRESULT Uncache(
        [in] DWORD dwConnection);

    HRESULT EnumCache(
        [out] IEnumSTATDATA **ppenumSTATDATA);

    HRESULT InitCache(
        [in, unique] IDataObject *pDataObject);

    HRESULT SetData(
        [in, unique] FORMATETC *pformatetc,
        [in, unique] STGMEDIUM *pmedium,
        [in] BOOL fRelease);
}


/*****************************************************************************
 * IOleCache2 interface
 */
[
    object,
    uuid(00000128-0000-0000-c000-000000000046),
    pointer_default(unique)
]
interface IOleCache2 : IOleCache
{
    typedef [unique] IOleCache2 *LPOLECACHE2;

    const DWORD UPDFCACHE_NODATACACHE = 0x00000001;
    const DWORD UPDFCACHE_ONSAVECACHE = 0x00000002;
    const DWORD UPDFCACHE_ONSTOPCACHE = 0x00000004;
    const DWORD UPDFCACHE_NORMALCACHE = 0x00000008;
    const DWORD UPDFCACHE_IFBLANK     = 0x00000010;
    const DWORD UPDFCACHE_ONLYIFBLANK = 0x80000000;

    const DWORD UPDFCACHE_IFBLANKORONSAVECACHE = (UPDFCACHE_IFBLANK | UPDFCACHE_ONSAVECACHE);
    const DWORD UPDFCACHE_ALL = ((DWORD)(~(UPDFCACHE_ONLYIFBLANK)));
    const DWORD UPDFCACHE_ALLBUTNODATACACHE = (UPDFCACHE_ALL & ((DWORD)(~UPDFCACHE_NODATACACHE)));

    typedef enum tagDISCARDCACHE
    {
        DISCARDCACHE_SAVEIFDIRTY = 0,
        DISCARDCACHE_NOSAVE =  1
    } DISCARDCACHE;

    [local]
    HRESULT UpdateCache(
        [in] LPDATAOBJECT pDataObject,
        [in] DWORD grfUpdf,
        [in] LPVOID pReserved);

    [call_as(UpdateCache)]
    HRESULT RemoteUpdateCache(
        [in] LPDATAOBJECT pDataObject,
        [in] DWORD grfUpdf,
        [in] LONG_PTR pReserved);

    HRESULT DiscardCache(
        [in] DWORD dwDiscardOptions);
}


/*****************************************************************************
 * IOleCacheControl interface
 */
[
    object,
    uuid(00000129-0000-0000-c000-000000000046)
]
interface IOleCacheControl : IUnknown
{
    typedef [unique] IOleCacheControl *LPOLECACHECONTROL;

    HRESULT OnRun(
        LPDATAOBJECT pDataObject);

    HRESULT OnStop();
}


/*****************************************************************************
 *  IEnumOLEVERB interface
 */
[
    object,
    uuid(00000104-0000-0000-c000-000000000046),
    pointer_default(unique)
]
interface IEnumOLEVERB : IUnknown
{
    typedef [unique] IEnumOLEVERB *LPENUMOLEVERB;

    typedef struct tagOLEVERB
    {
	LONG lVerb;
	LPOLESTR lpszVerbName;
	DWORD fuFlags;
	DWORD grfAttribs;
    } OLEVERB, *LPOLEVERB;

    typedef enum tagOLEVERBATTRIB
    {
	OLEVERBATTRIB_NEVERDIRTIES = 1,
	OLEVERBATTRIB_ONCONTAINERMENU = 2
    } OLEVERBATTRIB;

    [local]
    HRESULT Next(
        [in] ULONG celt,
        [out, size_is(celt), length_is(*pceltFetched)] LPOLEVERB rgelt,
        [out] ULONG *pceltFetched);

    [call_as(Next)]
    HRESULT RemoteNext(
        [in] ULONG celt,
        [out, size_is(celt), length_is(*pceltFetched)] LPOLEVERB rgelt,
        [out] ULONG *pceltFetched);

    HRESULT Skip(
        [in] ULONG celt);

    HRESULT Reset();

    HRESULT Clone(
        [out] IEnumOLEVERB **ppenum);
}


/*****************************************************************************
 * IOleObject interface
 */
[
    object,
    uuid(00000112-0000-0000-c000-000000000046),
    pointer_default(unique)
]
interface IOleObject : IUnknown
{
    typedef [unique] IOleObject *LPOLEOBJECT;

    typedef enum tagOLEGETMONIKER
    {
	OLEGETMONIKER_ONLYIFTHERE = 1,
	OLEGETMONIKER_FORCEASSIGN = 2,
	OLEGETMONIKER_UNASSIGN = 3,
	OLEGETMONIKER_TEMPFORUSER = 4
    } OLEGETMONIKER;

    typedef enum tagOLEWHICHMK
    {
	OLEWHICHMK_CONTAINER = 1,
	OLEWHICHMK_OBJREL = 2,
	OLEWHICHMK_OBJFULL = 3
    } OLEWHICHMK;

    typedef enum tagUSERCLASSTYPE
    {
	USERCLASSTYPE_FULL = 1,
	USERCLASSTYPE_SHORT = 2,
	USERCLASSTYPE_APPNAME = 3
    } USERCLASSTYPE;

    typedef enum tagOLEMISC
    {
	OLEMISC_RECOMPOSEONRESIZE = 0x1,
	OLEMISC_ONLYICONIC = 0x2,
	OLEMISC_INSERTNOTREPLACE = 0x4,
	OLEMISC_STATIC = 0x8,
	OLEMISC_CANTLINKINSIDE = 0x10,
	OLEMISC_CANLINKBYOLE1 = 0x20,
	OLEMISC_ISLINKOBJECT = 0x40,
	OLEMISC_INSIDEOUT = 0x80,
	OLEMISC_ACTIVATEWHENVISIBLE = 0x100,
	OLEMISC_RENDERINGISDEVICEINDEPENDENT = 0x200,
	OLEMISC_INVISIBLEATRUNTIME = 0x400,
	OLEMISC_ALWAYSRUN = 0x800,
	OLEMISC_ACTSLIKEBUTTON = 0x1000,
	OLEMISC_ACTSLIKELABEL = 0x2000,
	OLEMISC_NOUIACTIVATE = 0x4000,
	OLEMISC_ALIGNABLE = 0x8000,
	OLEMISC_SIMPLEFRAME = 0x10000,
	OLEMISC_SETCLIENTSITEFIRST = 0x20000,
	OLEMISC_IMEMODE = 0x40000,
	OLEMISC_IGNOREACTIVATEWHENVISIBLE = 0x80000,
	OLEMISC_WANTSTOMENUMERGE = 0x100000,
	OLEMISC_SUPPORTSMULTILEVELUNDO = 0x200000
    } OLEMISC;

    typedef enum tagOLECLOSE
    {
	OLECLOSE_SAVEIFDIRTY = 0,
	OLECLOSE_NOSAVE = 1,
	OLECLOSE_PROMPTSAVE = 2
    } OLECLOSE;

    HRESULT SetClientSite(
        [in, unique] IOleClientSite *pClientSite);

    HRESULT GetClientSite(
        [out] IOleClientSite **ppClientSite);

    HRESULT SetHostNames(
        [in] LPCOLESTR szContainerApp,
        [in, unique] LPCOLESTR szContainerObj);

    HRESULT Close(
        [in] DWORD dwSaveOption);

    HRESULT SetMoniker(
        [in] DWORD dwWhichMoniker,
        [in, unique] IMoniker *pmk);

    HRESULT GetMoniker(
        [in] DWORD dwAssign,
        [in] DWORD dwWhichMoniker,
        [out] IMoniker **ppmk);

    HRESULT InitFromData(
        [in, unique] IDataObject *pDataObject,
        [in] BOOL fCreation,
        [in] DWORD dwReserved);

    HRESULT GetClipboardData(
        [in] DWORD dwReserved,
        [out] IDataObject **ppDataObject);

    HRESULT DoVerb(
        [in] LONG iVerb,
        [in, unique] LPMSG lpmsg,
        [in, unique] IOleClientSite *pActiveSite,
        [in] LONG lindex,
        [in] HWND hwndParent,
        [in, unique] LPCRECT lprcPosRect);

    HRESULT EnumVerbs(
        [out] IEnumOLEVERB **ppEnumOleVerb);

    HRESULT Update();

    HRESULT IsUpToDate();

    HRESULT GetUserClassID(
        [out] CLSID *pClsid);

    HRESULT GetUserType(
        [in] DWORD dwFormOfType,
        [out] LPOLESTR *pszUserType);

    HRESULT SetExtent(
        [in] DWORD dwDrawAspect,
        [in] SIZEL *psizel);

    HRESULT GetExtent(
        [in] DWORD dwDrawAspect,
        [out] SIZEL *psizel);

    HRESULT Advise(
        [in, unique] IAdviseSink *pAdvSink,
        [out] DWORD *pdwConnection);

    HRESULT Unadvise(
        [in] DWORD dwConnection);

    HRESULT EnumAdvise(
        [out] IEnumSTATDATA **ppenumAdvise);

    HRESULT GetMiscStatus(
        [in] DWORD dwAspect,
        [out] DWORD *pdwStatus);

    HRESULT SetColorScheme(
        [in] LOGPALETTE *pLogpal);
}


/*****************************************************************************
 * IOleAdviseHolder interface
 */
[
    local,
    object,
    uuid(00000111-0000-0000-c000-000000000046)
]
interface IOleAdviseHolder : IUnknown
{
    typedef [unique] IOleAdviseHolder * LPOLEADVISEHOLDER;

    HRESULT Advise(
        [in, unique] IAdviseSink *pAdvise,
        [out] DWORD *pdwConnection);

    HRESULT Unadvise(
        [in] DWORD dwConnection);

    HRESULT EnumAdvise(
        [out] IEnumSTATDATA **ppenumAdvise);

    HRESULT SendOnRename(
        [in, unique] IMoniker *pmk);

    HRESULT SendOnSave();
    HRESULT SendOnClose();
}


/*****************************************************************************
 * IContinue interface
 */
[
    object,
    uuid(0000012a-0000-0000-c000-000000000046)
]
interface IContinue : IUnknown
{
    HRESULT FContinue();
}


/*****************************************************************************
 * IViewObject interface
 */
[
    object,
    uuid(0000010d-0000-0000-c000-000000000046)
]
interface IViewObject : IUnknown
{
    typedef [unique] IViewObject *LPVIEWOBJECT;

    [local]
    HRESULT Draw(
        [in] DWORD dwDrawAspect,
        [in] LONG lindex,
        [in, unique] void * pvAspect,
        [in, unique] DVTARGETDEVICE *ptd,
        [in] HDC hdcTargetDev,
        [in] HDC hdcDraw,
        [in] LPCRECTL lprcBounds,
        [in, unique] LPCRECTL lprcWBounds,
        [in] BOOL (*pfnContinue)(ULONG_PTR dwContinue),
        [in] ULONG_PTR dwContinue);

    [call_as(Draw)]
    HRESULT RemoteDraw(
        [in] DWORD dwDrawAspect,
        [in] LONG lindex,
        [in] ULONG_PTR pvAspect,
        [in, unique] DVTARGETDEVICE *ptd,
        [in] ULONG_PTR hdcTargetDev,
        [in] ULONG_PTR hdcDraw,
        [in] LPCRECTL lprcBounds,
        [in, unique] LPCRECTL lprcWBounds,
        [in] IContinue *pContinue);

    [local]
    HRESULT GetColorSet(
        [in] DWORD dwDrawAspect,
        [in] LONG lindex,
        [in, unique] void *pvAspect,
        [in, unique] DVTARGETDEVICE *ptd,
        [in] HDC hicTargetDev,
        [out] LOGPALETTE **ppColorSet);

    [call_as(GetColorSet)]
    HRESULT RemoteGetColorSet(
        [in] DWORD dwDrawAspect,
        [in] LONG lindex,
        [in] ULONG_PTR pvAspect,
        [in, unique] DVTARGETDEVICE *ptd,
        [in] ULONG_PTR hicTargetDev,
        [out] LOGPALETTE **ppColorSet);

    [local]
    HRESULT Freeze(
        [in] DWORD dwDrawAspect,
        [in] LONG lindex,
        [in, unique] void *pvAspect,
        [out] DWORD *pdwFreeze);

    [call_as(Freeze)]
    HRESULT RemoteFreeze(
        [in] DWORD dwDrawAspect,
        [in] LONG lindex,
        [in] ULONG_PTR pvAspect,
        [out] DWORD *pdwFreeze);

    HRESULT Unfreeze(
        [in] DWORD dwFreeze);

    HRESULT SetAdvise(
        [in] DWORD aspects,
        [in] DWORD advf,
        [in, unique] IAdviseSink *pAdvSink);

    [local]
    HRESULT GetAdvise(
        [out, unique] DWORD *pAspects,
        [out, unique] DWORD *pAdvf,
        [out] IAdviseSink **ppAdvSink);

    [call_as(GetAdvise)]
    HRESULT RemoteGetAdvise(
        [out] DWORD *pAspects,
        [out] DWORD *pAdvf,
        [out] IAdviseSink **ppAdvSink);
}


/*****************************************************************************
 * IViewObject2 interface
 */
[
    object,
    uuid(00000127-0000-0000-c000-000000000046)
]
interface IViewObject2 : IViewObject
{
    typedef [unique] IViewObject2 *LPVIEWOBJECT2;

    HRESULT GetExtent(
        [in]  DWORD dwDrawAspect,
        [in]  LONG lindex,
        [in, unique]  DVTARGETDEVICE* ptd,
        [out] LPSIZEL lpsizel);
}


/*****************************************************************************
 * IDropSource interface
 */
[
    local,
    object,
    uuid(00000121-0000-0000-c000-000000000046)
]
interface IDropSource : IUnknown
{
    typedef [unique] IDropSource *LPDROPSOURCE;

    HRESULT QueryContinueDrag(
        [in] BOOL fEscapePressed,
        [in] DWORD grfKeyState);

    HRESULT GiveFeedback(
        [in] DWORD dwEffect);
}


/*****************************************************************************
 * IDropTarget interface
 */
[
    object,
    uuid(00000122-0000-0000-c000-000000000046),
    pointer_default(unique)
]
interface IDropTarget : IUnknown
{
    typedef [unique] IDropTarget *LPDROPTARGET;

    const DWORD MK_ALT = 0x20;
    const DWORD DROPEFFECT_NONE = 0;
    const DWORD DROPEFFECT_COPY = 1;
    const DWORD DROPEFFECT_MOVE = 2;
    const DWORD DROPEFFECT_LINK = 4;
    const DWORD DROPEFFECT_SCROLL = 0x80000000;
    const DWORD DD_DEFSCROLLINSET = 11;
    const DWORD DD_DEFSCROLLDELAY = 50;
    const DWORD DD_DEFSCROLLINTERVAL = 50;
    const DWORD DD_DEFDRAGDELAY = 200;
    const DWORD DD_DEFDRAGMINDIST = 2;

    HRESULT DragEnter(
        [in, unique] IDataObject *pDataObj,
        [in] DWORD grfKeyState,
        [in] POINTL pt,
        [in, out] DWORD *pdwEffect);

    HRESULT DragOver(
        [in] DWORD grfKeyState,
        [in] POINTL pt,
        [in, out] DWORD *pdwEffect);

    HRESULT DragLeave();

    HRESULT Drop(
        [in, unique] IDataObject *pDataObj,
        [in] DWORD grfKeyState,
        [in] POINTL pt,
        [in, out] DWORD *pdwEffect);
}
