/*
 * Copyright (C) 2004 TransGaming Technologies
 */

import "objidl.idl";

interface IOleInPlaceActiveObject;
interface IEnumOLEVERB;

/*****************************************************************************
 * Interface: IOleAdviseHolder
 */

[
    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
    (
        void
    );

    HRESULT SendOnClose
    (
        void
    );

}

/*****************************************************************************
 * Interface: IOleCache
 */

[
    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
    );

}

/*****************************************************************************
 * Interface: IOleCache2
 */

[
    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 [v1_enum] 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
    );

}

/*****************************************************************************
 * Interface: IOleCacheControl
 */

[
    object,
    uuid(00000129-0000-0000-C000-000000000046)
]
interface IOleCacheControl : IUnknown
{

    typedef [unique] IOleCacheControl *LPOLECACHECONTROL;

    HRESULT OnRun
    (
        LPDATAOBJECT pDataObject
    );

    HRESULT OnStop (void);

}


/*****************************************************************************
 * Interface: IParseDisplayName
 */

[
    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
    );

}

/*****************************************************************************
 * Interface: IOleContainer
 */

[
    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
    );
}


/*****************************************************************************
 * Interface: IOleClientSite
 */

[
    object,
    uuid(00000118-0000-0000-C000-000000000046),
    pointer_default(unique)
]
interface IOleClientSite : IUnknown
{

    typedef [unique] IOleClientSite * LPOLECLIENTSITE;

    HRESULT SaveObject
    (
        void
    );

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

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

    HRESULT ShowObject
    (
        void
    );

    HRESULT OnShowWindow
    (
        [in] BOOL fShow
    );

    HRESULT RequestNewObjectLayout
    (
        void
    );

}

/*****************************************************************************
 * Interface: IOleObject
 */

[
    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           = 0x00000001,
        OLEMISC_ONLYICONIC                  = 0x00000002,
        OLEMISC_INSERTNOTREPLACE            = 0x00000004,
        OLEMISC_STATIC                      = 0x00000008,
        OLEMISC_CANTLINKINSIDE              = 0x00000010,
        OLEMISC_CANLINKBYOLE1               = 0x00000020,
        OLEMISC_ISLINKOBJECT                = 0x00000040,
        OLEMISC_INSIDEOUT                   = 0x00000080,
        OLEMISC_ACTIVATEWHENVISIBLE         = 0x00000100,
        OLEMISC_RENDERINGISDEVICEINDEPENDENT= 0x00000200,
        OLEMISC_INVISIBLEATRUNTIME          = 0x00000400,
        OLEMISC_ALWAYSRUN                   = 0x00000800,
        OLEMISC_ACTSLIKEBUTTON              = 0x00001000,
        OLEMISC_ACTSLIKELABEL               = 0x00002000,
        OLEMISC_NOUIACTIVATE                = 0x00004000,
        OLEMISC_ALIGNABLE                   = 0x00008000,
        OLEMISC_SIMPLEFRAME                 = 0x00010000,
        OLEMISC_SETCLIENTSITEFIRST          = 0x00020000,
        OLEMISC_IMEMODE                     = 0x00040000,
        OLEMISC_IGNOREACTIVATEWHENVISIBLE   = 0x00080000,
        OLEMISC_WANTSTOMENUMERGE            = 0x00100000,
        OLEMISC_SUPPORTSMULTILEVELUNDO      = 0x00200000
    } 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
    (
        void
    );

    HRESULT IsUpToDate
    (
        void
    );

    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
    );
}


/*****************************************************************************
 * Interface: IOLETypes
 */

[
    uuid(B0916C84-7416-101A-BCEA-08002B2B79EF)
]
interface IOLETypes
{
    typedef enum tagOLERENDER
    {
        OLERENDER_NONE   = 0,
        OLERENDER_DRAW   = 1,
        OLERENDER_FORMAT = 2,
        OLERENDER_ASIS   = 3
    } OLERENDER;
    typedef  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;

}

/*****************************************************************************
 * Interface: IOleWindow
 */

[
    object,
    uuid(00000114-0000-0000-C000-000000000046),
    pointer_default(unique)
]
interface IOleWindow : IUnknown
{

    typedef [unique] IOleWindow *LPOLEWINDOW;

    /* WINE FIXME: [input_sync] */
    HRESULT GetWindow
    (
        [out] HWND *phwnd
    );

    HRESULT ContextSensitiveHelp
    (
        [in] BOOL fEnterMode
    );
}

/*****************************************************************************
 * Interface: IOleLink
 */

[
    object,
    uuid(0000011d-0000-0000-C000-000000000046)
]
interface IOleLink : IUnknown
{

    typedef [unique] IOleLink *LPOLELINK;

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


    typedef OLEUPDATE *POLEUPDATE;

    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
    (
        void
    );


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

    HRESULT UnbindSource
    (
        void
    );

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

}

/*****************************************************************************
 * Interface: IOleItemContainer
 */

[
    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 [v1_enum] enum tagOLECONTF
    {
        OLECONTF_EMBEDDINGS     = 1,
        OLECONTF_LINKS          = 2,
        OLECONTF_OTHERS         = 4,
        OLECONTF_ONLYUSER       = 8,
        OLECONTF_ONLYIFRUNNING  = 16
    } OLECONTF;

cpp_quote("#ifdef __WINE__")
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);

}

/*****************************************************************************
 * Interface: IOleInPlaceUIWindow
 */

[
    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;

    /* WINE FIXME: [input_sync] */
    HRESULT GetBorder
    (
        [out] LPRECT lprectBorder
    );

    /* WINE FIXME: [input_sync] */
    HRESULT RequestBorderSpace
    (
        [in, unique] LPCBORDERWIDTHS pborderwidths
    );

    /* WINE FIXME: [input_sync] */
    HRESULT SetBorderSpace
    (
        [in, unique] LPCBORDERWIDTHS pborderwidths
    );

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

}

/*****************************************************************************
 * Interface: IOleInPlaceActiveObject
 */

[
    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();

    /* WINE FIXME: [input_sync] */
    HRESULT OnFrameWindowActivate
    (
        [in] BOOL fActivate
    );

    /* WINE FIXME: [input_sync] */
    HRESULT OnDocWindowActivate
    (
        [in] BOOL fActivate
    );

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

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

    HRESULT EnableModeless
    (
        [in] BOOL fEnable
    );

}


/*****************************************************************************
 * Interface: IOleInPlaceFrame
 */

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

    typedef struct tagOIFI
    {
        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
    );

    /* WINE FIXME: [input_sync] */
    HRESULT SetMenu
    (
        [in] HMENU hmenuShared,
        [in] HOLEMENU holemenu,
        [in] HWND hwndActiveObject
    );

    HRESULT RemoveMenus
    (
        [in] HMENU hmenuShared
    );

    /* WINE FIXME: [input_sync] */
    HRESULT SetStatusText
    (
        [in, unique] LPCOLESTR pszStatusText
    );

    HRESULT EnableModeless
    (
        [in] BOOL fEnable
    );

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

}


/*****************************************************************************
 * Interface: IOleInPlaceObject
 */

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

    HRESULT InPlaceDeactivate
    (
        void 
    );

    HRESULT UIDeactivate
    (
        void 
    );

    /* WINE FIXME: [input_sync] */
    HRESULT SetObjectRects
    (
        [in] LPCRECT lprcPosRect,
        [in] LPCRECT lprcClipRect
    );

    HRESULT ReactivateAndUndo
    (
        void
    );

}

/*****************************************************************************
 * Interface: IOleInPlaceSite
 */

[
    object,
    uuid(00000119-0000-0000-C000-000000000046),
    pointer_default(unique)
]
interface IOleInPlaceSite : IOleWindow
{

    typedef [unique] IOleInPlaceSite *LPOLEINPLACESITE;

    HRESULT CanInPlaceActivate
    (
        void
    );

    HRESULT OnInPlaceActivate
    (
        void
    );


    HRESULT OnUIActivate
    (
        void
    );

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

    HRESULT Scroll
    (
        [in] SIZE scrollExtant
    );

    HRESULT OnUIDeactivate
    (
        [in] BOOL fUndoable
    );

    HRESULT OnInPlaceDeactivate
    (
        void
    );

    HRESULT DiscardUndoState
    (
        void
    );

    HRESULT DeactivateAndUndo
    (
        void
    );

    HRESULT OnPosRectChange
    (
        [in] LPCRECT lprcPosRect
    );

}

/*****************************************************************************
 * Interface: IContinue
 */

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


/*****************************************************************************
 * Interface: IViewObject
 */

[
    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
    );

}

/*****************************************************************************
 * Interface: IViewObject2
 */

[
    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
    );

}

/*****************************************************************************
 * Interface: IDropSource
 */

[
    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
    );
}

/*****************************************************************************
 * Interface: IDropTarget
 */

[
    object,
    uuid(00000122-0000-0000-C000-000000000046),
    pointer_default(unique)
]
interface IDropTarget : IUnknown
{

    typedef [unique] IDropTarget *LPDROPTARGET;

    const DWORD MK_ALT = 0x0020;

    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
    (
        void
    );

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


/*****************************************************************************
 * Interface: IEnumOLEVERB
 */

[
    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 [v1_enum] 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
    );
}


