/*
 * 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;

cpp_quote("#include <winuser.h>")

/*****************************************************************************
 * 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_ONLYUSER = 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);
}

/*****************************************************************************
 * IDropSourceNotify interface
 */
[
    object,
    uuid(0000012b-0000-0000-c000-000000000046),
    pointer_default(unique),
    local
]
interface IDropSourceNotify : IUnknown
{
    HRESULT DragTargetEnter( [in] HWND hwnd );
    HRESULT DragTargetLeave( void );
}
