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