/*** Autogenerated by WIDL 6.4 from include/msinkaut.idl - Do not edit ***/

#ifdef _WIN32
#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif
#include <rpc.h>
#include <rpcndr.h>
#endif

#ifndef COM_NO_WINDOWS_H
#include <windows.h>
#include <ole2.h>
#endif

#ifndef __msinkaut_h__
#define __msinkaut_h__

/* Forward declarations */

#ifndef __IInkExtendedProperty_FWD_DEFINED__
#define __IInkExtendedProperty_FWD_DEFINED__
typedef interface IInkExtendedProperty IInkExtendedProperty;
#ifdef __cplusplus
interface IInkExtendedProperty;
#endif /* __cplusplus */
#endif

#ifndef __IInkExtendedProperties_FWD_DEFINED__
#define __IInkExtendedProperties_FWD_DEFINED__
typedef interface IInkExtendedProperties IInkExtendedProperties;
#ifdef __cplusplus
interface IInkExtendedProperties;
#endif /* __cplusplus */
#endif

#ifndef __IInkDrawingAttributes_FWD_DEFINED__
#define __IInkDrawingAttributes_FWD_DEFINED__
typedef interface IInkDrawingAttributes IInkDrawingAttributes;
#ifdef __cplusplus
interface IInkDrawingAttributes;
#endif /* __cplusplus */
#endif

#ifndef __IInkRectangle_FWD_DEFINED__
#define __IInkRectangle_FWD_DEFINED__
typedef interface IInkRectangle IInkRectangle;
#ifdef __cplusplus
interface IInkRectangle;
#endif /* __cplusplus */
#endif

#ifndef __IInkTablet_FWD_DEFINED__
#define __IInkTablet_FWD_DEFINED__
typedef interface IInkTablet IInkTablet;
#ifdef __cplusplus
interface IInkTablet;
#endif /* __cplusplus */
#endif

#ifndef __IInkCursorButton_FWD_DEFINED__
#define __IInkCursorButton_FWD_DEFINED__
typedef interface IInkCursorButton IInkCursorButton;
#ifdef __cplusplus
interface IInkCursorButton;
#endif /* __cplusplus */
#endif

#ifndef __IInkCursorButtons_FWD_DEFINED__
#define __IInkCursorButtons_FWD_DEFINED__
typedef interface IInkCursorButtons IInkCursorButtons;
#ifdef __cplusplus
interface IInkCursorButtons;
#endif /* __cplusplus */
#endif

#ifndef __IInkCursor_FWD_DEFINED__
#define __IInkCursor_FWD_DEFINED__
typedef interface IInkCursor IInkCursor;
#ifdef __cplusplus
interface IInkCursor;
#endif /* __cplusplus */
#endif

#ifndef __IInkTransform_FWD_DEFINED__
#define __IInkTransform_FWD_DEFINED__
typedef interface IInkTransform IInkTransform;
#ifdef __cplusplus
interface IInkTransform;
#endif /* __cplusplus */
#endif

#ifndef __IInkRecognitionAlternates_FWD_DEFINED__
#define __IInkRecognitionAlternates_FWD_DEFINED__
typedef interface IInkRecognitionAlternates IInkRecognitionAlternates;
#ifdef __cplusplus
interface IInkRecognitionAlternates;
#endif /* __cplusplus */
#endif

#ifndef __IInkRecognitionAlternate_FWD_DEFINED__
#define __IInkRecognitionAlternate_FWD_DEFINED__
typedef interface IInkRecognitionAlternate IInkRecognitionAlternate;
#ifdef __cplusplus
interface IInkRecognitionAlternate;
#endif /* __cplusplus */
#endif

#ifndef __IInkRecognitionResult_FWD_DEFINED__
#define __IInkRecognitionResult_FWD_DEFINED__
typedef interface IInkRecognitionResult IInkRecognitionResult;
#ifdef __cplusplus
interface IInkRecognitionResult;
#endif /* __cplusplus */
#endif

#ifndef __IInkStrokeDisp_FWD_DEFINED__
#define __IInkStrokeDisp_FWD_DEFINED__
typedef interface IInkStrokeDisp IInkStrokeDisp;
#ifdef __cplusplus
interface IInkStrokeDisp;
#endif /* __cplusplus */
#endif

#ifndef __IInkCustomStrokes_FWD_DEFINED__
#define __IInkCustomStrokes_FWD_DEFINED__
typedef interface IInkCustomStrokes IInkCustomStrokes;
#ifdef __cplusplus
interface IInkCustomStrokes;
#endif /* __cplusplus */
#endif

#ifndef __IInkDisp_FWD_DEFINED__
#define __IInkDisp_FWD_DEFINED__
typedef interface IInkDisp IInkDisp;
#ifdef __cplusplus
interface IInkDisp;
#endif /* __cplusplus */
#endif

#ifndef __IInkStrokes_FWD_DEFINED__
#define __IInkStrokes_FWD_DEFINED__
typedef interface IInkStrokes IInkStrokes;
#ifdef __cplusplus
interface IInkStrokes;
#endif /* __cplusplus */
#endif

#ifndef __IInkRenderer_FWD_DEFINED__
#define __IInkRenderer_FWD_DEFINED__
typedef interface IInkRenderer IInkRenderer;
#ifdef __cplusplus
interface IInkRenderer;
#endif /* __cplusplus */
#endif

#ifndef __IInkCursors_FWD_DEFINED__
#define __IInkCursors_FWD_DEFINED__
typedef interface IInkCursors IInkCursors;
#ifdef __cplusplus
interface IInkCursors;
#endif /* __cplusplus */
#endif

#ifndef __IInkCollector_FWD_DEFINED__
#define __IInkCollector_FWD_DEFINED__
typedef interface IInkCollector IInkCollector;
#ifdef __cplusplus
interface IInkCollector;
#endif /* __cplusplus */
#endif

#ifndef ___IInkCollectorEvents_FWD_DEFINED__
#define ___IInkCollectorEvents_FWD_DEFINED__
typedef interface _IInkCollectorEvents _IInkCollectorEvents;
#ifdef __cplusplus
interface _IInkCollectorEvents;
#endif /* __cplusplus */
#endif

#ifndef __InkCollector_FWD_DEFINED__
#define __InkCollector_FWD_DEFINED__
#ifdef __cplusplus
typedef class InkCollector InkCollector;
#else
typedef struct InkCollector InkCollector;
#endif /* defined __cplusplus */
#endif /* defined __InkCollector_FWD_DEFINED__ */

/* Headers for imported files */

#include <oaidl.h>
#include <ocidl.h>
#include <tpcshrd.h>

#ifdef __cplusplus
extern "C" {
#endif

typedef enum InkRasterOperation {
    IRO_Black = 1,
    IRO_NotMergePen = 2,
    IRO_MaskNotPen = 3,
    IRO_NotCopyPen = 4,
    IRO_MaskPenNot = 5,
    IRO_Not = 6,
    IRO_XOrPen = 7,
    IRO_NotMaskPen = 8,
    IRO_MaskPen = 9,
    IRO_NotXOrPen = 10,
    IRO_NoOperation = 11,
    IRO_MergeNotPen = 12,
    IRO_CopyPen = 13,
    IRO_MergePenNot = 14,
    IRO_MergePen = 15,
    IRO_White = 16
} InkRasterOperation;
typedef enum InkPenTip {
    IPT_Ball = 0,
    IPT_Rectangle = 1
} InkPenTip;
typedef enum TabletHardwareCapabilities {
    THWC_Integrated = 0x1,
    THWC_CursorMustTouch = 0x2,
    THWC_HardProximity = 0x4,
    THWC_CursorsHavePhysicalIds = 0x8
} TabletHardwareCapabilities;
typedef enum TabletPropertyMetricUnit {
    TPMU_Default = 0,
    TPMU_Inches = 1,
    TPMU_Centimeters = 2,
    TPMU_Degrees = 3,
    TPMU_Radians = 4,
    TPMU_Seconds = 5,
    TPMU_Pounds = 6,
    TPMU_Grams = 7
} TabletPropertyMetricUnit;
typedef enum InkCursorButtonState {
    ICBS_Unavailable = 0,
    ICBS_Up = 1,
    ICBS_Down = 2
} InkCursorButtonState;
typedef enum InkRecognitionConfidence {
    IRC_Strong = 0,
    IRC_Intermediate = 1,
    IRC_Poor = 2
} InkRecognitionConfidence;
typedef enum InkBoundingBoxMode {
    IBBM_Default = 0,
    IBBM_NoCurveFit = 1,
    IBBM_CurveFit = 2,
    IBBM_PointsOnly = 3,
    IBBM_Union = 4
} InkBoundingBoxMode;
typedef enum InkExtractFlags {
    IEF_CopyFromOriginal = 0,
    IEF_RemoveFromOriginal = 1,
    IEF_Default = IEF_RemoveFromOriginal
} InkExtractFlags;
typedef enum InkPersistenceFormat {
    IPF_InkSerializedFormat = 0,
    IPF_Base64InkSerializedFormat = 1,
    IPF_GIF = 2,
    IPF_Base64GIF = 3
} InkPersistenceFormat;
typedef enum InkPersistenceCompressionMode {
    IPCM_Default = 0,
    IPCM_MaximumCompression = 1,
    IPCM_NoCompression = 2
} InkPersistenceCompressionMode;
typedef enum InkClipboardFormats {
    ICF_None = 0x0,
    ICF_InkSerializedFormat = 0x1,
    ICF_SketchInk = 0x2,
    ICF_TextInk = 0x6,
    ICF_EnhancedMetafile = 0x8,
    ICF_Metafile = 0x20,
    ICF_Bitmap = 0x40,
    ICF_PasteMask = 0x7,
    ICF_CopyMask = 0x7f,
    ICF_Default = ICF_CopyMask
} InkClipboardFormats;
typedef enum InkClipboardModes {
    ICB_Copy = 0x0,
    ICB_Cut = 0x1,
    ICB_ExtractOnly = 0x30,
    ICB_DelayedCopy = 0x20,
    ICB_Default = ICB_Copy
} InkClipboardModes;
typedef enum InkCollectionMode {
    ICM_InkOnly = 0,
    ICM_GestureOnly = 1,
    ICM_InkAndGesture = 2
} InkCollectionMode;
typedef enum InkMousePointer {
    IMP_Default = 0,
    IMP_Arrow = 1,
    IMP_Crosshair = 2,
    IMP_Ibeam = 3,
    IMP_SizeNESW = 4,
    IMP_SizeNS = 5,
    IMP_SizeNWSE = 6,
    IMP_SizeWE = 7,
    IMP_UpArrow = 8,
    IMP_Hourglass = 9,
    IMP_NoDrop = 10,
    IMP_ArrowHourglass = 11,
    IMP_ArrowQuestion = 12,
    IMP_SizeAll = 13,
    IMP_Hand = 14,
    IMP_Custom = 99
} InkMousePointer;
typedef enum InkApplicationGesture {
    IAG_AllGestures = 0x0,
    IAG_NoGesture = 0xf000,
    IAG_Scratchout = 0xf001,
    IAG_Triangle = 0xf002,
    IAG_Square = 0xf003,
    IAG_Star = 0xf004,
    IAG_Check = 0xf005,
    IAG_Curlicue = 0xf010,
    IAG_DoubleCurlicue = 0xf011,
    IAG_Circle = 0xf020,
    IAG_DoubleCircle = 0xf021,
    IAG_SemiCircleLeft = 0xf028,
    IAG_SemiCircleRight = 0xf029,
    IAG_ChevronUp = 0xf030,
    IAG_ChevronDown = 0xf031,
    IAG_ChevronLeft = 0xf032,
    IAG_ChevronRight = 0xf033,
    IAG_ArrowUp = 0xf038,
    IAG_ArrowDown = 0xf039,
    IAG_ArrowLeft = 0xf03a,
    IAG_ArrowRight = 0xf03b,
    IAG_Up = 0xf058,
    IAG_Down = 0xf059,
    IAG_Left = 0xf05a,
    IAG_Right = 0xf05b,
    IAG_UpDown = 0xf060,
    IAG_DownUp = 0xf061,
    IAG_LeftRight = 0xf062,
    IAG_RightLeft = 0xf063,
    IAG_UpLeftLong = 0xf064,
    IAG_UpRightLong = 0xf065,
    IAG_DownLeftLong = 0xf066,
    IAG_DownRightLong = 0xf067,
    IAG_UpLeft = 0xf068,
    IAG_UpRight = 0xf069,
    IAG_DownLeft = 0xf06a,
    IAG_DownRight = 0xf06b,
    IAG_LeftUp = 0xf06c,
    IAG_LeftDown = 0xf06d,
    IAG_RightUp = 0xf06e,
    IAG_RightDown = 0xf06f,
    IAG_Exclamation = 0xf0a4,
    IAG_Tap = 0xf0f0,
    IAG_DoubleTap = 0xf0f1
} InkApplicationGesture;
typedef enum InkCollectorEventInterest {
    ICEI_DefaultEvents = -1,
    ICEI_CursorDown = ICEI_DefaultEvents + 1,
    ICEI_Stroke = ICEI_CursorDown + 1,
    ICEI_NewPackets = ICEI_Stroke + 1,
    ICEI_NewInAirPackets = ICEI_NewPackets + 1,
    ICEI_CursorButtonDown = ICEI_NewInAirPackets + 1,
    ICEI_CursorButtonUp = ICEI_CursorButtonDown + 1,
    ICEI_CursorInRange = ICEI_CursorButtonUp + 1,
    ICEI_CursorOutOfRange = ICEI_CursorInRange + 1,
    ICEI_SystemGesture = ICEI_CursorOutOfRange + 1,
    ICEI_TabletAdded = ICEI_SystemGesture + 1,
    ICEI_TabletRemoved = ICEI_TabletAdded + 1,
    ICEI_MouseDown = ICEI_TabletRemoved + 1,
    ICEI_MouseMove = ICEI_MouseDown + 1,
    ICEI_MouseUp = ICEI_MouseMove + 1,
    ICEI_MouseWheel = ICEI_MouseUp + 1,
    ICEI_DblClick = ICEI_MouseWheel + 1,
    ICEI_AllEvents = ICEI_DblClick + 1
} InkCollectorEventInterest;
typedef enum DISPID_InkCollectorEvent {
    DISPID_ICEStroke = 1,
    DISPID_ICECursorDown = DISPID_ICEStroke + 1,
    DISPID_ICENewPackets = DISPID_ICECursorDown + 1,
    DISPID_ICENewInAirPackets = DISPID_ICENewPackets + 1,
    DISPID_ICECursorButtonDown = DISPID_ICENewInAirPackets + 1,
    DISPID_ICECursorButtonUp = DISPID_ICECursorButtonDown + 1,
    DISPID_ICECursorInRange = DISPID_ICECursorButtonUp + 1,
    DISPID_ICECursorOutOfRange = DISPID_ICECursorInRange + 1,
    DISPID_ICESystemGesture = DISPID_ICECursorOutOfRange + 1,
    DISPID_ICEGesture = DISPID_ICESystemGesture + 1,
    DISPID_ICETabletAdded = DISPID_ICEGesture + 1,
    DISPID_ICETabletRemoved = DISPID_ICETabletAdded + 1,
    DISPID_IOEPainting = DISPID_ICETabletRemoved + 1,
    DISPID_IOEPainted = DISPID_IOEPainting + 1,
    DISPID_IOESelectionChanging = DISPID_IOEPainted + 1,
    DISPID_IOESelectionChanged = DISPID_IOESelectionChanging + 1,
    DISPID_IOESelectionMoving = DISPID_IOESelectionChanged + 1,
    DISPID_IOESelectionMoved = DISPID_IOESelectionMoving + 1,
    DISPID_IOESelectionResizing = DISPID_IOESelectionMoved + 1,
    DISPID_IOESelectionResized = DISPID_IOESelectionResizing + 1,
    DISPID_IOEStrokesDeleting = DISPID_IOESelectionResized + 1,
    DISPID_IOEStrokesDeleted = DISPID_IOEStrokesDeleting + 1,
    DISPID_IPEChangeUICues = DISPID_IOEStrokesDeleted + 1,
    DISPID_IPEClick = DISPID_IPEChangeUICues + 1,
    DISPID_IPEDblClick = DISPID_IPEClick + 1,
    DISPID_IPEInvalidated = DISPID_IPEDblClick + 1,
    DISPID_IPEMouseDown = DISPID_IPEInvalidated + 1,
    DISPID_IPEMouseEnter = DISPID_IPEMouseDown + 1,
    DISPID_IPEMouseHover = DISPID_IPEMouseEnter + 1,
    DISPID_IPEMouseLeave = DISPID_IPEMouseHover + 1,
    DISPID_IPEMouseMove = DISPID_IPEMouseLeave + 1,
    DISPID_IPEMouseUp = DISPID_IPEMouseMove + 1,
    DISPID_IPEMouseWheel = DISPID_IPEMouseUp + 1,
    DISPID_IPESizeModeChanged = DISPID_IPEMouseWheel + 1,
    DISPID_IPEStyleChanged = DISPID_IPESizeModeChanged + 1,
    DISPID_IPESystemColorsChanged = DISPID_IPEStyleChanged + 1,
    DISPID_IPEKeyDown = DISPID_IPESystemColorsChanged + 1,
    DISPID_IPEKeyPress = DISPID_IPEKeyDown + 1,
    DISPID_IPEKeyUp = DISPID_IPEKeyPress + 1,
    DISPID_IPEResize = DISPID_IPEKeyUp + 1,
    DISPID_IPESizeChanged = DISPID_IPEResize + 1
} DISPID_InkCollectorEvent;
#ifndef __IInkDisp_FWD_DEFINED__
#define __IInkDisp_FWD_DEFINED__
typedef interface IInkDisp IInkDisp;
#ifdef __cplusplus
interface IInkDisp;
#endif /* __cplusplus */
#endif

#ifndef __IInkStrokes_FWD_DEFINED__
#define __IInkStrokes_FWD_DEFINED__
typedef interface IInkStrokes IInkStrokes;
#ifdef __cplusplus
interface IInkStrokes;
#endif /* __cplusplus */
#endif

#ifndef __IInkRecognitionAlternate_FWD_DEFINED__
#define __IInkRecognitionAlternate_FWD_DEFINED__
typedef interface IInkRecognitionAlternate IInkRecognitionAlternate;
#ifdef __cplusplus
interface IInkRecognitionAlternate;
#endif /* __cplusplus */
#endif

/*****************************************************************************
 * IInkExtendedProperty interface
 */
#ifndef __IInkExtendedProperty_INTERFACE_DEFINED__
#define __IInkExtendedProperty_INTERFACE_DEFINED__

DEFINE_GUID(IID_IInkExtendedProperty, 0xdb489209, 0xb7c3, 0x411d, 0x90,0xf6, 0x15,0x48,0xcf,0xff,0x27,0x1e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("db489209-b7c3-411d-90f6-1548cfff271e")
IInkExtendedProperty : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Guid(
        BSTR *Guid) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Data(
        VARIANT *Data) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Data(
        VARIANT Data) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IInkExtendedProperty, 0xdb489209, 0xb7c3, 0x411d, 0x90,0xf6, 0x15,0x48,0xcf,0xff,0x27,0x1e)
#endif
#else
typedef struct IInkExtendedPropertyVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IInkExtendedProperty *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IInkExtendedProperty *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IInkExtendedProperty *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IInkExtendedProperty *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IInkExtendedProperty *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IInkExtendedProperty *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IInkExtendedProperty *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IInkExtendedProperty methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Guid)(
        IInkExtendedProperty *This,
        BSTR *Guid);

    HRESULT (STDMETHODCALLTYPE *get_Data)(
        IInkExtendedProperty *This,
        VARIANT *Data);

    HRESULT (STDMETHODCALLTYPE *put_Data)(
        IInkExtendedProperty *This,
        VARIANT Data);

    END_INTERFACE
} IInkExtendedPropertyVtbl;

interface IInkExtendedProperty {
    CONST_VTBL IInkExtendedPropertyVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IInkExtendedProperty_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IInkExtendedProperty_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IInkExtendedProperty_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IInkExtendedProperty_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IInkExtendedProperty_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IInkExtendedProperty_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IInkExtendedProperty_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IInkExtendedProperty methods ***/
#define IInkExtendedProperty_get_Guid(This,Guid) (This)->lpVtbl->get_Guid(This,Guid)
#define IInkExtendedProperty_get_Data(This,Data) (This)->lpVtbl->get_Data(This,Data)
#define IInkExtendedProperty_put_Data(This,Data) (This)->lpVtbl->put_Data(This,Data)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IInkExtendedProperty_QueryInterface(IInkExtendedProperty* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IInkExtendedProperty_AddRef(IInkExtendedProperty* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IInkExtendedProperty_Release(IInkExtendedProperty* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IInkExtendedProperty_GetTypeInfoCount(IInkExtendedProperty* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IInkExtendedProperty_GetTypeInfo(IInkExtendedProperty* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IInkExtendedProperty_GetIDsOfNames(IInkExtendedProperty* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IInkExtendedProperty_Invoke(IInkExtendedProperty* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IInkExtendedProperty methods ***/
static FORCEINLINE HRESULT IInkExtendedProperty_get_Guid(IInkExtendedProperty* This,BSTR *Guid) {
    return This->lpVtbl->get_Guid(This,Guid);
}
static FORCEINLINE HRESULT IInkExtendedProperty_get_Data(IInkExtendedProperty* This,VARIANT *Data) {
    return This->lpVtbl->get_Data(This,Data);
}
static FORCEINLINE HRESULT IInkExtendedProperty_put_Data(IInkExtendedProperty* This,VARIANT Data) {
    return This->lpVtbl->put_Data(This,Data);
}
#endif
#endif

#endif


#endif  /* __IInkExtendedProperty_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IInkExtendedProperties interface
 */
#ifndef __IInkExtendedProperties_INTERFACE_DEFINED__
#define __IInkExtendedProperties_INTERFACE_DEFINED__

DEFINE_GUID(IID_IInkExtendedProperties, 0x89f2a8be, 0x95a9, 0x4530, 0x8b,0x8f, 0x88,0xe9,0x71,0xe3,0xe2,0x5f);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("89f2a8be-95a9-4530-8b8f-88e971e3e25f")
IInkExtendedProperties : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Count(
        LONG *Count) = 0;

    virtual HRESULT STDMETHODCALLTYPE get__NewEnum(
        IUnknown **_NewEnum) = 0;

    virtual HRESULT STDMETHODCALLTYPE Item(
        VARIANT Identifier,
        IInkExtendedProperty **Item) = 0;

    virtual HRESULT STDMETHODCALLTYPE Add(
        BSTR Guid,
        VARIANT Data,
        IInkExtendedProperty **InkExtendedProperty) = 0;

    virtual HRESULT STDMETHODCALLTYPE Remove(
        VARIANT Identifier) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clear(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE DoesPropertyExist(
        BSTR Guid,
        VARIANT_BOOL *DoesPropertyExist) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IInkExtendedProperties, 0x89f2a8be, 0x95a9, 0x4530, 0x8b,0x8f, 0x88,0xe9,0x71,0xe3,0xe2,0x5f)
#endif
#else
typedef struct IInkExtendedPropertiesVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IInkExtendedProperties *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IInkExtendedProperties *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IInkExtendedProperties *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IInkExtendedProperties *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IInkExtendedProperties *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IInkExtendedProperties *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IInkExtendedProperties *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IInkExtendedProperties methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Count)(
        IInkExtendedProperties *This,
        LONG *Count);

    HRESULT (STDMETHODCALLTYPE *get__NewEnum)(
        IInkExtendedProperties *This,
        IUnknown **_NewEnum);

    HRESULT (STDMETHODCALLTYPE *Item)(
        IInkExtendedProperties *This,
        VARIANT Identifier,
        IInkExtendedProperty **Item);

    HRESULT (STDMETHODCALLTYPE *Add)(
        IInkExtendedProperties *This,
        BSTR Guid,
        VARIANT Data,
        IInkExtendedProperty **InkExtendedProperty);

    HRESULT (STDMETHODCALLTYPE *Remove)(
        IInkExtendedProperties *This,
        VARIANT Identifier);

    HRESULT (STDMETHODCALLTYPE *Clear)(
        IInkExtendedProperties *This);

    HRESULT (STDMETHODCALLTYPE *DoesPropertyExist)(
        IInkExtendedProperties *This,
        BSTR Guid,
        VARIANT_BOOL *DoesPropertyExist);

    END_INTERFACE
} IInkExtendedPropertiesVtbl;

interface IInkExtendedProperties {
    CONST_VTBL IInkExtendedPropertiesVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IInkExtendedProperties_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IInkExtendedProperties_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IInkExtendedProperties_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IInkExtendedProperties_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IInkExtendedProperties_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IInkExtendedProperties_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IInkExtendedProperties_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IInkExtendedProperties methods ***/
#define IInkExtendedProperties_get_Count(This,Count) (This)->lpVtbl->get_Count(This,Count)
#define IInkExtendedProperties_get__NewEnum(This,_NewEnum) (This)->lpVtbl->get__NewEnum(This,_NewEnum)
#define IInkExtendedProperties_Item(This,Identifier,Item) (This)->lpVtbl->Item(This,Identifier,Item)
#define IInkExtendedProperties_Add(This,Guid,Data,InkExtendedProperty) (This)->lpVtbl->Add(This,Guid,Data,InkExtendedProperty)
#define IInkExtendedProperties_Remove(This,Identifier) (This)->lpVtbl->Remove(This,Identifier)
#define IInkExtendedProperties_Clear(This) (This)->lpVtbl->Clear(This)
#define IInkExtendedProperties_DoesPropertyExist(This,Guid,DoesPropertyExist) (This)->lpVtbl->DoesPropertyExist(This,Guid,DoesPropertyExist)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IInkExtendedProperties_QueryInterface(IInkExtendedProperties* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IInkExtendedProperties_AddRef(IInkExtendedProperties* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IInkExtendedProperties_Release(IInkExtendedProperties* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IInkExtendedProperties_GetTypeInfoCount(IInkExtendedProperties* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IInkExtendedProperties_GetTypeInfo(IInkExtendedProperties* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IInkExtendedProperties_GetIDsOfNames(IInkExtendedProperties* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IInkExtendedProperties_Invoke(IInkExtendedProperties* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IInkExtendedProperties methods ***/
static FORCEINLINE HRESULT IInkExtendedProperties_get_Count(IInkExtendedProperties* This,LONG *Count) {
    return This->lpVtbl->get_Count(This,Count);
}
static FORCEINLINE HRESULT IInkExtendedProperties_get__NewEnum(IInkExtendedProperties* This,IUnknown **_NewEnum) {
    return This->lpVtbl->get__NewEnum(This,_NewEnum);
}
static FORCEINLINE HRESULT IInkExtendedProperties_Item(IInkExtendedProperties* This,VARIANT Identifier,IInkExtendedProperty **Item) {
    return This->lpVtbl->Item(This,Identifier,Item);
}
static FORCEINLINE HRESULT IInkExtendedProperties_Add(IInkExtendedProperties* This,BSTR Guid,VARIANT Data,IInkExtendedProperty **InkExtendedProperty) {
    return This->lpVtbl->Add(This,Guid,Data,InkExtendedProperty);
}
static FORCEINLINE HRESULT IInkExtendedProperties_Remove(IInkExtendedProperties* This,VARIANT Identifier) {
    return This->lpVtbl->Remove(This,Identifier);
}
static FORCEINLINE HRESULT IInkExtendedProperties_Clear(IInkExtendedProperties* This) {
    return This->lpVtbl->Clear(This);
}
static FORCEINLINE HRESULT IInkExtendedProperties_DoesPropertyExist(IInkExtendedProperties* This,BSTR Guid,VARIANT_BOOL *DoesPropertyExist) {
    return This->lpVtbl->DoesPropertyExist(This,Guid,DoesPropertyExist);
}
#endif
#endif

#endif


#endif  /* __IInkExtendedProperties_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IInkDrawingAttributes interface
 */
#ifndef __IInkDrawingAttributes_INTERFACE_DEFINED__
#define __IInkDrawingAttributes_INTERFACE_DEFINED__

DEFINE_GUID(IID_IInkDrawingAttributes, 0xbf519b75, 0x0a15, 0x4623, 0xad,0xc9, 0xc0,0x0d,0x43,0x6a,0x80,0x92);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("bf519b75-0a15-4623-adc9-c00d436a8092")
IInkDrawingAttributes : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Color(
        LONG *CurrentColor) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Color(
        LONG NewColor) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Width(
        float *CurrentWidth) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Width(
        float NewWidth) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Height(
        float *CurrentHeight) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Height(
        float NewHeight) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_FitToCurve(
        VARIANT_BOOL *Flag) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_FitToCurve(
        VARIANT_BOOL Flag) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_IgnorePressure(
        VARIANT_BOOL *Flag) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_IgnorePressure(
        VARIANT_BOOL Flag) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_AntiAliased(
        VARIANT_BOOL *Flag) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_AntiAliased(
        VARIANT_BOOL Flag) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Transparency(
        LONG *CurrentTransparency) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Transparency(
        LONG NewTransparency) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_RasterOperation(
        InkRasterOperation *CurrentRasterOperation) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_RasterOperation(
        InkRasterOperation NewRasterOperation) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_PenTip(
        InkPenTip *CurrentPenTip) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_PenTip(
        InkPenTip NewPenTip) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ExtendedProperties(
        IInkExtendedProperties **Properties) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IInkDrawingAttributes **DrawingAttributes) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IInkDrawingAttributes, 0xbf519b75, 0x0a15, 0x4623, 0xad,0xc9, 0xc0,0x0d,0x43,0x6a,0x80,0x92)
#endif
#else
typedef struct IInkDrawingAttributesVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IInkDrawingAttributes *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IInkDrawingAttributes *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IInkDrawingAttributes *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IInkDrawingAttributes *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IInkDrawingAttributes *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IInkDrawingAttributes *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IInkDrawingAttributes *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IInkDrawingAttributes methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Color)(
        IInkDrawingAttributes *This,
        LONG *CurrentColor);

    HRESULT (STDMETHODCALLTYPE *put_Color)(
        IInkDrawingAttributes *This,
        LONG NewColor);

    HRESULT (STDMETHODCALLTYPE *get_Width)(
        IInkDrawingAttributes *This,
        float *CurrentWidth);

    HRESULT (STDMETHODCALLTYPE *put_Width)(
        IInkDrawingAttributes *This,
        float NewWidth);

    HRESULT (STDMETHODCALLTYPE *get_Height)(
        IInkDrawingAttributes *This,
        float *CurrentHeight);

    HRESULT (STDMETHODCALLTYPE *put_Height)(
        IInkDrawingAttributes *This,
        float NewHeight);

    HRESULT (STDMETHODCALLTYPE *get_FitToCurve)(
        IInkDrawingAttributes *This,
        VARIANT_BOOL *Flag);

    HRESULT (STDMETHODCALLTYPE *put_FitToCurve)(
        IInkDrawingAttributes *This,
        VARIANT_BOOL Flag);

    HRESULT (STDMETHODCALLTYPE *get_IgnorePressure)(
        IInkDrawingAttributes *This,
        VARIANT_BOOL *Flag);

    HRESULT (STDMETHODCALLTYPE *put_IgnorePressure)(
        IInkDrawingAttributes *This,
        VARIANT_BOOL Flag);

    HRESULT (STDMETHODCALLTYPE *get_AntiAliased)(
        IInkDrawingAttributes *This,
        VARIANT_BOOL *Flag);

    HRESULT (STDMETHODCALLTYPE *put_AntiAliased)(
        IInkDrawingAttributes *This,
        VARIANT_BOOL Flag);

    HRESULT (STDMETHODCALLTYPE *get_Transparency)(
        IInkDrawingAttributes *This,
        LONG *CurrentTransparency);

    HRESULT (STDMETHODCALLTYPE *put_Transparency)(
        IInkDrawingAttributes *This,
        LONG NewTransparency);

    HRESULT (STDMETHODCALLTYPE *get_RasterOperation)(
        IInkDrawingAttributes *This,
        InkRasterOperation *CurrentRasterOperation);

    HRESULT (STDMETHODCALLTYPE *put_RasterOperation)(
        IInkDrawingAttributes *This,
        InkRasterOperation NewRasterOperation);

    HRESULT (STDMETHODCALLTYPE *get_PenTip)(
        IInkDrawingAttributes *This,
        InkPenTip *CurrentPenTip);

    HRESULT (STDMETHODCALLTYPE *put_PenTip)(
        IInkDrawingAttributes *This,
        InkPenTip NewPenTip);

    HRESULT (STDMETHODCALLTYPE *get_ExtendedProperties)(
        IInkDrawingAttributes *This,
        IInkExtendedProperties **Properties);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IInkDrawingAttributes *This,
        IInkDrawingAttributes **DrawingAttributes);

    END_INTERFACE
} IInkDrawingAttributesVtbl;

interface IInkDrawingAttributes {
    CONST_VTBL IInkDrawingAttributesVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IInkDrawingAttributes_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IInkDrawingAttributes_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IInkDrawingAttributes_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IInkDrawingAttributes_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IInkDrawingAttributes_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IInkDrawingAttributes_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IInkDrawingAttributes_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IInkDrawingAttributes methods ***/
#define IInkDrawingAttributes_get_Color(This,CurrentColor) (This)->lpVtbl->get_Color(This,CurrentColor)
#define IInkDrawingAttributes_put_Color(This,NewColor) (This)->lpVtbl->put_Color(This,NewColor)
#define IInkDrawingAttributes_get_Width(This,CurrentWidth) (This)->lpVtbl->get_Width(This,CurrentWidth)
#define IInkDrawingAttributes_put_Width(This,NewWidth) (This)->lpVtbl->put_Width(This,NewWidth)
#define IInkDrawingAttributes_get_Height(This,CurrentHeight) (This)->lpVtbl->get_Height(This,CurrentHeight)
#define IInkDrawingAttributes_put_Height(This,NewHeight) (This)->lpVtbl->put_Height(This,NewHeight)
#define IInkDrawingAttributes_get_FitToCurve(This,Flag) (This)->lpVtbl->get_FitToCurve(This,Flag)
#define IInkDrawingAttributes_put_FitToCurve(This,Flag) (This)->lpVtbl->put_FitToCurve(This,Flag)
#define IInkDrawingAttributes_get_IgnorePressure(This,Flag) (This)->lpVtbl->get_IgnorePressure(This,Flag)
#define IInkDrawingAttributes_put_IgnorePressure(This,Flag) (This)->lpVtbl->put_IgnorePressure(This,Flag)
#define IInkDrawingAttributes_get_AntiAliased(This,Flag) (This)->lpVtbl->get_AntiAliased(This,Flag)
#define IInkDrawingAttributes_put_AntiAliased(This,Flag) (This)->lpVtbl->put_AntiAliased(This,Flag)
#define IInkDrawingAttributes_get_Transparency(This,CurrentTransparency) (This)->lpVtbl->get_Transparency(This,CurrentTransparency)
#define IInkDrawingAttributes_put_Transparency(This,NewTransparency) (This)->lpVtbl->put_Transparency(This,NewTransparency)
#define IInkDrawingAttributes_get_RasterOperation(This,CurrentRasterOperation) (This)->lpVtbl->get_RasterOperation(This,CurrentRasterOperation)
#define IInkDrawingAttributes_put_RasterOperation(This,NewRasterOperation) (This)->lpVtbl->put_RasterOperation(This,NewRasterOperation)
#define IInkDrawingAttributes_get_PenTip(This,CurrentPenTip) (This)->lpVtbl->get_PenTip(This,CurrentPenTip)
#define IInkDrawingAttributes_put_PenTip(This,NewPenTip) (This)->lpVtbl->put_PenTip(This,NewPenTip)
#define IInkDrawingAttributes_get_ExtendedProperties(This,Properties) (This)->lpVtbl->get_ExtendedProperties(This,Properties)
#define IInkDrawingAttributes_Clone(This,DrawingAttributes) (This)->lpVtbl->Clone(This,DrawingAttributes)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IInkDrawingAttributes_QueryInterface(IInkDrawingAttributes* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IInkDrawingAttributes_AddRef(IInkDrawingAttributes* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IInkDrawingAttributes_Release(IInkDrawingAttributes* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IInkDrawingAttributes_GetTypeInfoCount(IInkDrawingAttributes* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IInkDrawingAttributes_GetTypeInfo(IInkDrawingAttributes* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IInkDrawingAttributes_GetIDsOfNames(IInkDrawingAttributes* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IInkDrawingAttributes_Invoke(IInkDrawingAttributes* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IInkDrawingAttributes methods ***/
static FORCEINLINE HRESULT IInkDrawingAttributes_get_Color(IInkDrawingAttributes* This,LONG *CurrentColor) {
    return This->lpVtbl->get_Color(This,CurrentColor);
}
static FORCEINLINE HRESULT IInkDrawingAttributes_put_Color(IInkDrawingAttributes* This,LONG NewColor) {
    return This->lpVtbl->put_Color(This,NewColor);
}
static FORCEINLINE HRESULT IInkDrawingAttributes_get_Width(IInkDrawingAttributes* This,float *CurrentWidth) {
    return This->lpVtbl->get_Width(This,CurrentWidth);
}
static FORCEINLINE HRESULT IInkDrawingAttributes_put_Width(IInkDrawingAttributes* This,float NewWidth) {
    return This->lpVtbl->put_Width(This,NewWidth);
}
static FORCEINLINE HRESULT IInkDrawingAttributes_get_Height(IInkDrawingAttributes* This,float *CurrentHeight) {
    return This->lpVtbl->get_Height(This,CurrentHeight);
}
static FORCEINLINE HRESULT IInkDrawingAttributes_put_Height(IInkDrawingAttributes* This,float NewHeight) {
    return This->lpVtbl->put_Height(This,NewHeight);
}
static FORCEINLINE HRESULT IInkDrawingAttributes_get_FitToCurve(IInkDrawingAttributes* This,VARIANT_BOOL *Flag) {
    return This->lpVtbl->get_FitToCurve(This,Flag);
}
static FORCEINLINE HRESULT IInkDrawingAttributes_put_FitToCurve(IInkDrawingAttributes* This,VARIANT_BOOL Flag) {
    return This->lpVtbl->put_FitToCurve(This,Flag);
}
static FORCEINLINE HRESULT IInkDrawingAttributes_get_IgnorePressure(IInkDrawingAttributes* This,VARIANT_BOOL *Flag) {
    return This->lpVtbl->get_IgnorePressure(This,Flag);
}
static FORCEINLINE HRESULT IInkDrawingAttributes_put_IgnorePressure(IInkDrawingAttributes* This,VARIANT_BOOL Flag) {
    return This->lpVtbl->put_IgnorePressure(This,Flag);
}
static FORCEINLINE HRESULT IInkDrawingAttributes_get_AntiAliased(IInkDrawingAttributes* This,VARIANT_BOOL *Flag) {
    return This->lpVtbl->get_AntiAliased(This,Flag);
}
static FORCEINLINE HRESULT IInkDrawingAttributes_put_AntiAliased(IInkDrawingAttributes* This,VARIANT_BOOL Flag) {
    return This->lpVtbl->put_AntiAliased(This,Flag);
}
static FORCEINLINE HRESULT IInkDrawingAttributes_get_Transparency(IInkDrawingAttributes* This,LONG *CurrentTransparency) {
    return This->lpVtbl->get_Transparency(This,CurrentTransparency);
}
static FORCEINLINE HRESULT IInkDrawingAttributes_put_Transparency(IInkDrawingAttributes* This,LONG NewTransparency) {
    return This->lpVtbl->put_Transparency(This,NewTransparency);
}
static FORCEINLINE HRESULT IInkDrawingAttributes_get_RasterOperation(IInkDrawingAttributes* This,InkRasterOperation *CurrentRasterOperation) {
    return This->lpVtbl->get_RasterOperation(This,CurrentRasterOperation);
}
static FORCEINLINE HRESULT IInkDrawingAttributes_put_RasterOperation(IInkDrawingAttributes* This,InkRasterOperation NewRasterOperation) {
    return This->lpVtbl->put_RasterOperation(This,NewRasterOperation);
}
static FORCEINLINE HRESULT IInkDrawingAttributes_get_PenTip(IInkDrawingAttributes* This,InkPenTip *CurrentPenTip) {
    return This->lpVtbl->get_PenTip(This,CurrentPenTip);
}
static FORCEINLINE HRESULT IInkDrawingAttributes_put_PenTip(IInkDrawingAttributes* This,InkPenTip NewPenTip) {
    return This->lpVtbl->put_PenTip(This,NewPenTip);
}
static FORCEINLINE HRESULT IInkDrawingAttributes_get_ExtendedProperties(IInkDrawingAttributes* This,IInkExtendedProperties **Properties) {
    return This->lpVtbl->get_ExtendedProperties(This,Properties);
}
static FORCEINLINE HRESULT IInkDrawingAttributes_Clone(IInkDrawingAttributes* This,IInkDrawingAttributes **DrawingAttributes) {
    return This->lpVtbl->Clone(This,DrawingAttributes);
}
#endif
#endif

#endif


#endif  /* __IInkDrawingAttributes_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IInkRectangle interface
 */
#ifndef __IInkRectangle_INTERFACE_DEFINED__
#define __IInkRectangle_INTERFACE_DEFINED__

DEFINE_GUID(IID_IInkRectangle, 0x9794ff82, 0x6071, 0x4717, 0x8a,0x8b, 0x6a,0xc7,0xc6,0x4a,0x68,0x6e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("9794ff82-6071-4717-8a8b-6ac7c64a686e")
IInkRectangle : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Top(
        LONG *Units) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Top(
        LONG Units) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Left(
        LONG *Units) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Left(
        LONG Units) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Bottom(
        LONG *Units) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Bottom(
        LONG Units) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Right(
        LONG *Units) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Right(
        LONG Units) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Data(
        RECT *Rect) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Data(
        RECT Rect) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRectangle(
        LONG *Top,
        LONG *Left,
        LONG *Bottom,
        LONG *Right) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetRectangle(
        LONG Top,
        LONG Left,
        LONG Bottom,
        LONG Right) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IInkRectangle, 0x9794ff82, 0x6071, 0x4717, 0x8a,0x8b, 0x6a,0xc7,0xc6,0x4a,0x68,0x6e)
#endif
#else
typedef struct IInkRectangleVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IInkRectangle *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IInkRectangle *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IInkRectangle *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IInkRectangle *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IInkRectangle *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IInkRectangle *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IInkRectangle *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IInkRectangle methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Top)(
        IInkRectangle *This,
        LONG *Units);

    HRESULT (STDMETHODCALLTYPE *put_Top)(
        IInkRectangle *This,
        LONG Units);

    HRESULT (STDMETHODCALLTYPE *get_Left)(
        IInkRectangle *This,
        LONG *Units);

    HRESULT (STDMETHODCALLTYPE *put_Left)(
        IInkRectangle *This,
        LONG Units);

    HRESULT (STDMETHODCALLTYPE *get_Bottom)(
        IInkRectangle *This,
        LONG *Units);

    HRESULT (STDMETHODCALLTYPE *put_Bottom)(
        IInkRectangle *This,
        LONG Units);

    HRESULT (STDMETHODCALLTYPE *get_Right)(
        IInkRectangle *This,
        LONG *Units);

    HRESULT (STDMETHODCALLTYPE *put_Right)(
        IInkRectangle *This,
        LONG Units);

    HRESULT (STDMETHODCALLTYPE *get_Data)(
        IInkRectangle *This,
        RECT *Rect);

    HRESULT (STDMETHODCALLTYPE *put_Data)(
        IInkRectangle *This,
        RECT Rect);

    HRESULT (STDMETHODCALLTYPE *GetRectangle)(
        IInkRectangle *This,
        LONG *Top,
        LONG *Left,
        LONG *Bottom,
        LONG *Right);

    HRESULT (STDMETHODCALLTYPE *SetRectangle)(
        IInkRectangle *This,
        LONG Top,
        LONG Left,
        LONG Bottom,
        LONG Right);

    END_INTERFACE
} IInkRectangleVtbl;

interface IInkRectangle {
    CONST_VTBL IInkRectangleVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IInkRectangle_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IInkRectangle_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IInkRectangle_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IInkRectangle_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IInkRectangle_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IInkRectangle_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IInkRectangle_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IInkRectangle methods ***/
#define IInkRectangle_get_Top(This,Units) (This)->lpVtbl->get_Top(This,Units)
#define IInkRectangle_put_Top(This,Units) (This)->lpVtbl->put_Top(This,Units)
#define IInkRectangle_get_Left(This,Units) (This)->lpVtbl->get_Left(This,Units)
#define IInkRectangle_put_Left(This,Units) (This)->lpVtbl->put_Left(This,Units)
#define IInkRectangle_get_Bottom(This,Units) (This)->lpVtbl->get_Bottom(This,Units)
#define IInkRectangle_put_Bottom(This,Units) (This)->lpVtbl->put_Bottom(This,Units)
#define IInkRectangle_get_Right(This,Units) (This)->lpVtbl->get_Right(This,Units)
#define IInkRectangle_put_Right(This,Units) (This)->lpVtbl->put_Right(This,Units)
#define IInkRectangle_get_Data(This,Rect) (This)->lpVtbl->get_Data(This,Rect)
#define IInkRectangle_put_Data(This,Rect) (This)->lpVtbl->put_Data(This,Rect)
#define IInkRectangle_GetRectangle(This,Top,Left,Bottom,Right) (This)->lpVtbl->GetRectangle(This,Top,Left,Bottom,Right)
#define IInkRectangle_SetRectangle(This,Top,Left,Bottom,Right) (This)->lpVtbl->SetRectangle(This,Top,Left,Bottom,Right)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IInkRectangle_QueryInterface(IInkRectangle* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IInkRectangle_AddRef(IInkRectangle* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IInkRectangle_Release(IInkRectangle* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IInkRectangle_GetTypeInfoCount(IInkRectangle* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IInkRectangle_GetTypeInfo(IInkRectangle* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IInkRectangle_GetIDsOfNames(IInkRectangle* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IInkRectangle_Invoke(IInkRectangle* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IInkRectangle methods ***/
static FORCEINLINE HRESULT IInkRectangle_get_Top(IInkRectangle* This,LONG *Units) {
    return This->lpVtbl->get_Top(This,Units);
}
static FORCEINLINE HRESULT IInkRectangle_put_Top(IInkRectangle* This,LONG Units) {
    return This->lpVtbl->put_Top(This,Units);
}
static FORCEINLINE HRESULT IInkRectangle_get_Left(IInkRectangle* This,LONG *Units) {
    return This->lpVtbl->get_Left(This,Units);
}
static FORCEINLINE HRESULT IInkRectangle_put_Left(IInkRectangle* This,LONG Units) {
    return This->lpVtbl->put_Left(This,Units);
}
static FORCEINLINE HRESULT IInkRectangle_get_Bottom(IInkRectangle* This,LONG *Units) {
    return This->lpVtbl->get_Bottom(This,Units);
}
static FORCEINLINE HRESULT IInkRectangle_put_Bottom(IInkRectangle* This,LONG Units) {
    return This->lpVtbl->put_Bottom(This,Units);
}
static FORCEINLINE HRESULT IInkRectangle_get_Right(IInkRectangle* This,LONG *Units) {
    return This->lpVtbl->get_Right(This,Units);
}
static FORCEINLINE HRESULT IInkRectangle_put_Right(IInkRectangle* This,LONG Units) {
    return This->lpVtbl->put_Right(This,Units);
}
static FORCEINLINE HRESULT IInkRectangle_get_Data(IInkRectangle* This,RECT *Rect) {
    return This->lpVtbl->get_Data(This,Rect);
}
static FORCEINLINE HRESULT IInkRectangle_put_Data(IInkRectangle* This,RECT Rect) {
    return This->lpVtbl->put_Data(This,Rect);
}
static FORCEINLINE HRESULT IInkRectangle_GetRectangle(IInkRectangle* This,LONG *Top,LONG *Left,LONG *Bottom,LONG *Right) {
    return This->lpVtbl->GetRectangle(This,Top,Left,Bottom,Right);
}
static FORCEINLINE HRESULT IInkRectangle_SetRectangle(IInkRectangle* This,LONG Top,LONG Left,LONG Bottom,LONG Right) {
    return This->lpVtbl->SetRectangle(This,Top,Left,Bottom,Right);
}
#endif
#endif

#endif


#endif  /* __IInkRectangle_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IInkTablet interface
 */
#ifndef __IInkTablet_INTERFACE_DEFINED__
#define __IInkTablet_INTERFACE_DEFINED__

DEFINE_GUID(IID_IInkTablet, 0x2de25eaa, 0x6ef8, 0x42d5, 0xae,0xe9, 0x18,0x5b,0xc8,0x1b,0x91,0x2d);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2de25eaa-6ef8-42d5-aee9-185bc81b912d")
IInkTablet : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Name(
        BSTR *Name) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_PlugAndPlayId(
        BSTR *Id) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_MaximumInputRectangle(
        IInkRectangle **Rectangle) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HardwareCapabilities(
        TabletHardwareCapabilities *Capabilities) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsPacketPropertySupported(
        BSTR packetPropertyName,
        VARIANT_BOOL *Supported) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPropertyMetrics(
        BSTR propertyName,
        LONG *Minimum,
        LONG *Maximum,
        TabletPropertyMetricUnit *Units,
        float *Resolution) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IInkTablet, 0x2de25eaa, 0x6ef8, 0x42d5, 0xae,0xe9, 0x18,0x5b,0xc8,0x1b,0x91,0x2d)
#endif
#else
typedef struct IInkTabletVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IInkTablet *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IInkTablet *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IInkTablet *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IInkTablet *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IInkTablet *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IInkTablet *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IInkTablet *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IInkTablet methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Name)(
        IInkTablet *This,
        BSTR *Name);

    HRESULT (STDMETHODCALLTYPE *get_PlugAndPlayId)(
        IInkTablet *This,
        BSTR *Id);

    HRESULT (STDMETHODCALLTYPE *get_MaximumInputRectangle)(
        IInkTablet *This,
        IInkRectangle **Rectangle);

    HRESULT (STDMETHODCALLTYPE *get_HardwareCapabilities)(
        IInkTablet *This,
        TabletHardwareCapabilities *Capabilities);

    HRESULT (STDMETHODCALLTYPE *IsPacketPropertySupported)(
        IInkTablet *This,
        BSTR packetPropertyName,
        VARIANT_BOOL *Supported);

    HRESULT (STDMETHODCALLTYPE *GetPropertyMetrics)(
        IInkTablet *This,
        BSTR propertyName,
        LONG *Minimum,
        LONG *Maximum,
        TabletPropertyMetricUnit *Units,
        float *Resolution);

    END_INTERFACE
} IInkTabletVtbl;

interface IInkTablet {
    CONST_VTBL IInkTabletVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IInkTablet_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IInkTablet_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IInkTablet_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IInkTablet_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IInkTablet_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IInkTablet_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IInkTablet_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IInkTablet methods ***/
#define IInkTablet_get_Name(This,Name) (This)->lpVtbl->get_Name(This,Name)
#define IInkTablet_get_PlugAndPlayId(This,Id) (This)->lpVtbl->get_PlugAndPlayId(This,Id)
#define IInkTablet_get_MaximumInputRectangle(This,Rectangle) (This)->lpVtbl->get_MaximumInputRectangle(This,Rectangle)
#define IInkTablet_get_HardwareCapabilities(This,Capabilities) (This)->lpVtbl->get_HardwareCapabilities(This,Capabilities)
#define IInkTablet_IsPacketPropertySupported(This,packetPropertyName,Supported) (This)->lpVtbl->IsPacketPropertySupported(This,packetPropertyName,Supported)
#define IInkTablet_GetPropertyMetrics(This,propertyName,Minimum,Maximum,Units,Resolution) (This)->lpVtbl->GetPropertyMetrics(This,propertyName,Minimum,Maximum,Units,Resolution)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IInkTablet_QueryInterface(IInkTablet* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IInkTablet_AddRef(IInkTablet* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IInkTablet_Release(IInkTablet* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IInkTablet_GetTypeInfoCount(IInkTablet* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IInkTablet_GetTypeInfo(IInkTablet* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IInkTablet_GetIDsOfNames(IInkTablet* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IInkTablet_Invoke(IInkTablet* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IInkTablet methods ***/
static FORCEINLINE HRESULT IInkTablet_get_Name(IInkTablet* This,BSTR *Name) {
    return This->lpVtbl->get_Name(This,Name);
}
static FORCEINLINE HRESULT IInkTablet_get_PlugAndPlayId(IInkTablet* This,BSTR *Id) {
    return This->lpVtbl->get_PlugAndPlayId(This,Id);
}
static FORCEINLINE HRESULT IInkTablet_get_MaximumInputRectangle(IInkTablet* This,IInkRectangle **Rectangle) {
    return This->lpVtbl->get_MaximumInputRectangle(This,Rectangle);
}
static FORCEINLINE HRESULT IInkTablet_get_HardwareCapabilities(IInkTablet* This,TabletHardwareCapabilities *Capabilities) {
    return This->lpVtbl->get_HardwareCapabilities(This,Capabilities);
}
static FORCEINLINE HRESULT IInkTablet_IsPacketPropertySupported(IInkTablet* This,BSTR packetPropertyName,VARIANT_BOOL *Supported) {
    return This->lpVtbl->IsPacketPropertySupported(This,packetPropertyName,Supported);
}
static FORCEINLINE HRESULT IInkTablet_GetPropertyMetrics(IInkTablet* This,BSTR propertyName,LONG *Minimum,LONG *Maximum,TabletPropertyMetricUnit *Units,float *Resolution) {
    return This->lpVtbl->GetPropertyMetrics(This,propertyName,Minimum,Maximum,Units,Resolution);
}
#endif
#endif

#endif


#endif  /* __IInkTablet_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IInkCursorButton interface
 */
#ifndef __IInkCursorButton_INTERFACE_DEFINED__
#define __IInkCursorButton_INTERFACE_DEFINED__

DEFINE_GUID(IID_IInkCursorButton, 0x85ef9417, 0x1d59, 0x49b2, 0xa1,0x3c, 0x70,0x2c,0x85,0x43,0x08,0x94);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("85ef9417-1d59-49b2-a13c-702c85430894")
IInkCursorButton : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Name(
        BSTR *Name) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Id(
        BSTR *Id) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_State(
        InkCursorButtonState *CurrentState) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IInkCursorButton, 0x85ef9417, 0x1d59, 0x49b2, 0xa1,0x3c, 0x70,0x2c,0x85,0x43,0x08,0x94)
#endif
#else
typedef struct IInkCursorButtonVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IInkCursorButton *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IInkCursorButton *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IInkCursorButton *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IInkCursorButton *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IInkCursorButton *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IInkCursorButton *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IInkCursorButton *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IInkCursorButton methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Name)(
        IInkCursorButton *This,
        BSTR *Name);

    HRESULT (STDMETHODCALLTYPE *get_Id)(
        IInkCursorButton *This,
        BSTR *Id);

    HRESULT (STDMETHODCALLTYPE *get_State)(
        IInkCursorButton *This,
        InkCursorButtonState *CurrentState);

    END_INTERFACE
} IInkCursorButtonVtbl;

interface IInkCursorButton {
    CONST_VTBL IInkCursorButtonVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IInkCursorButton_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IInkCursorButton_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IInkCursorButton_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IInkCursorButton_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IInkCursorButton_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IInkCursorButton_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IInkCursorButton_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IInkCursorButton methods ***/
#define IInkCursorButton_get_Name(This,Name) (This)->lpVtbl->get_Name(This,Name)
#define IInkCursorButton_get_Id(This,Id) (This)->lpVtbl->get_Id(This,Id)
#define IInkCursorButton_get_State(This,CurrentState) (This)->lpVtbl->get_State(This,CurrentState)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IInkCursorButton_QueryInterface(IInkCursorButton* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IInkCursorButton_AddRef(IInkCursorButton* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IInkCursorButton_Release(IInkCursorButton* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IInkCursorButton_GetTypeInfoCount(IInkCursorButton* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IInkCursorButton_GetTypeInfo(IInkCursorButton* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IInkCursorButton_GetIDsOfNames(IInkCursorButton* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IInkCursorButton_Invoke(IInkCursorButton* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IInkCursorButton methods ***/
static FORCEINLINE HRESULT IInkCursorButton_get_Name(IInkCursorButton* This,BSTR *Name) {
    return This->lpVtbl->get_Name(This,Name);
}
static FORCEINLINE HRESULT IInkCursorButton_get_Id(IInkCursorButton* This,BSTR *Id) {
    return This->lpVtbl->get_Id(This,Id);
}
static FORCEINLINE HRESULT IInkCursorButton_get_State(IInkCursorButton* This,InkCursorButtonState *CurrentState) {
    return This->lpVtbl->get_State(This,CurrentState);
}
#endif
#endif

#endif


#endif  /* __IInkCursorButton_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IInkCursorButtons interface
 */
#ifndef __IInkCursorButtons_INTERFACE_DEFINED__
#define __IInkCursorButtons_INTERFACE_DEFINED__

DEFINE_GUID(IID_IInkCursorButtons, 0x3671cc40, 0xb624, 0x4671, 0x9f,0xa0, 0xdb,0x11,0x9d,0x95,0x2d,0x54);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3671cc40-b624-4671-9fa0-db119d952d54")
IInkCursorButtons : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Count(
        LONG *Count) = 0;

    virtual HRESULT STDMETHODCALLTYPE get__NewEnum(
        IUnknown **_NewEnum) = 0;

    virtual HRESULT STDMETHODCALLTYPE Item(
        VARIANT Identifier,
        IInkCursorButton **Button) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IInkCursorButtons, 0x3671cc40, 0xb624, 0x4671, 0x9f,0xa0, 0xdb,0x11,0x9d,0x95,0x2d,0x54)
#endif
#else
typedef struct IInkCursorButtonsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IInkCursorButtons *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IInkCursorButtons *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IInkCursorButtons *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IInkCursorButtons *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IInkCursorButtons *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IInkCursorButtons *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IInkCursorButtons *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IInkCursorButtons methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Count)(
        IInkCursorButtons *This,
        LONG *Count);

    HRESULT (STDMETHODCALLTYPE *get__NewEnum)(
        IInkCursorButtons *This,
        IUnknown **_NewEnum);

    HRESULT (STDMETHODCALLTYPE *Item)(
        IInkCursorButtons *This,
        VARIANT Identifier,
        IInkCursorButton **Button);

    END_INTERFACE
} IInkCursorButtonsVtbl;

interface IInkCursorButtons {
    CONST_VTBL IInkCursorButtonsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IInkCursorButtons_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IInkCursorButtons_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IInkCursorButtons_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IInkCursorButtons_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IInkCursorButtons_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IInkCursorButtons_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IInkCursorButtons_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IInkCursorButtons methods ***/
#define IInkCursorButtons_get_Count(This,Count) (This)->lpVtbl->get_Count(This,Count)
#define IInkCursorButtons_get__NewEnum(This,_NewEnum) (This)->lpVtbl->get__NewEnum(This,_NewEnum)
#define IInkCursorButtons_Item(This,Identifier,Button) (This)->lpVtbl->Item(This,Identifier,Button)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IInkCursorButtons_QueryInterface(IInkCursorButtons* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IInkCursorButtons_AddRef(IInkCursorButtons* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IInkCursorButtons_Release(IInkCursorButtons* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IInkCursorButtons_GetTypeInfoCount(IInkCursorButtons* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IInkCursorButtons_GetTypeInfo(IInkCursorButtons* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IInkCursorButtons_GetIDsOfNames(IInkCursorButtons* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IInkCursorButtons_Invoke(IInkCursorButtons* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IInkCursorButtons methods ***/
static FORCEINLINE HRESULT IInkCursorButtons_get_Count(IInkCursorButtons* This,LONG *Count) {
    return This->lpVtbl->get_Count(This,Count);
}
static FORCEINLINE HRESULT IInkCursorButtons_get__NewEnum(IInkCursorButtons* This,IUnknown **_NewEnum) {
    return This->lpVtbl->get__NewEnum(This,_NewEnum);
}
static FORCEINLINE HRESULT IInkCursorButtons_Item(IInkCursorButtons* This,VARIANT Identifier,IInkCursorButton **Button) {
    return This->lpVtbl->Item(This,Identifier,Button);
}
#endif
#endif

#endif


#endif  /* __IInkCursorButtons_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IInkCursor interface
 */
#ifndef __IInkCursor_INTERFACE_DEFINED__
#define __IInkCursor_INTERFACE_DEFINED__

DEFINE_GUID(IID_IInkCursor, 0xad30c630, 0x40c5, 0x4350, 0x84,0x05, 0x9c,0x71,0x01,0x2f,0xc5,0x58);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("ad30c630-40c5-4350-8405-9c71012fc558")
IInkCursor : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Name(
        BSTR *Name) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Id(
        LONG *Id) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Inverted(
        VARIANT_BOOL *Status) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_DrawingAttributes(
        IInkDrawingAttributes **Attributes) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_DrawingAttributes(
        IInkDrawingAttributes *Attributes) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Tablet(
        IInkTablet **Tablet) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Buttons(
        IInkCursorButtons **Buttons) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IInkCursor, 0xad30c630, 0x40c5, 0x4350, 0x84,0x05, 0x9c,0x71,0x01,0x2f,0xc5,0x58)
#endif
#else
typedef struct IInkCursorVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IInkCursor *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IInkCursor *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IInkCursor *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IInkCursor *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IInkCursor *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IInkCursor *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IInkCursor *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IInkCursor methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Name)(
        IInkCursor *This,
        BSTR *Name);

    HRESULT (STDMETHODCALLTYPE *get_Id)(
        IInkCursor *This,
        LONG *Id);

    HRESULT (STDMETHODCALLTYPE *get_Inverted)(
        IInkCursor *This,
        VARIANT_BOOL *Status);

    HRESULT (STDMETHODCALLTYPE *get_DrawingAttributes)(
        IInkCursor *This,
        IInkDrawingAttributes **Attributes);

    HRESULT (STDMETHODCALLTYPE *putref_DrawingAttributes)(
        IInkCursor *This,
        IInkDrawingAttributes *Attributes);

    HRESULT (STDMETHODCALLTYPE *get_Tablet)(
        IInkCursor *This,
        IInkTablet **Tablet);

    HRESULT (STDMETHODCALLTYPE *get_Buttons)(
        IInkCursor *This,
        IInkCursorButtons **Buttons);

    END_INTERFACE
} IInkCursorVtbl;

interface IInkCursor {
    CONST_VTBL IInkCursorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IInkCursor_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IInkCursor_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IInkCursor_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IInkCursor_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IInkCursor_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IInkCursor_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IInkCursor_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IInkCursor methods ***/
#define IInkCursor_get_Name(This,Name) (This)->lpVtbl->get_Name(This,Name)
#define IInkCursor_get_Id(This,Id) (This)->lpVtbl->get_Id(This,Id)
#define IInkCursor_get_Inverted(This,Status) (This)->lpVtbl->get_Inverted(This,Status)
#define IInkCursor_get_DrawingAttributes(This,Attributes) (This)->lpVtbl->get_DrawingAttributes(This,Attributes)
#define IInkCursor_putref_DrawingAttributes(This,Attributes) (This)->lpVtbl->putref_DrawingAttributes(This,Attributes)
#define IInkCursor_get_Tablet(This,Tablet) (This)->lpVtbl->get_Tablet(This,Tablet)
#define IInkCursor_get_Buttons(This,Buttons) (This)->lpVtbl->get_Buttons(This,Buttons)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IInkCursor_QueryInterface(IInkCursor* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IInkCursor_AddRef(IInkCursor* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IInkCursor_Release(IInkCursor* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IInkCursor_GetTypeInfoCount(IInkCursor* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IInkCursor_GetTypeInfo(IInkCursor* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IInkCursor_GetIDsOfNames(IInkCursor* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IInkCursor_Invoke(IInkCursor* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IInkCursor methods ***/
static FORCEINLINE HRESULT IInkCursor_get_Name(IInkCursor* This,BSTR *Name) {
    return This->lpVtbl->get_Name(This,Name);
}
static FORCEINLINE HRESULT IInkCursor_get_Id(IInkCursor* This,LONG *Id) {
    return This->lpVtbl->get_Id(This,Id);
}
static FORCEINLINE HRESULT IInkCursor_get_Inverted(IInkCursor* This,VARIANT_BOOL *Status) {
    return This->lpVtbl->get_Inverted(This,Status);
}
static FORCEINLINE HRESULT IInkCursor_get_DrawingAttributes(IInkCursor* This,IInkDrawingAttributes **Attributes) {
    return This->lpVtbl->get_DrawingAttributes(This,Attributes);
}
static FORCEINLINE HRESULT IInkCursor_putref_DrawingAttributes(IInkCursor* This,IInkDrawingAttributes *Attributes) {
    return This->lpVtbl->putref_DrawingAttributes(This,Attributes);
}
static FORCEINLINE HRESULT IInkCursor_get_Tablet(IInkCursor* This,IInkTablet **Tablet) {
    return This->lpVtbl->get_Tablet(This,Tablet);
}
static FORCEINLINE HRESULT IInkCursor_get_Buttons(IInkCursor* This,IInkCursorButtons **Buttons) {
    return This->lpVtbl->get_Buttons(This,Buttons);
}
#endif
#endif

#endif


#endif  /* __IInkCursor_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IInkTransform interface
 */
#ifndef __IInkTransform_INTERFACE_DEFINED__
#define __IInkTransform_INTERFACE_DEFINED__

DEFINE_GUID(IID_IInkTransform, 0x615f1d43, 0x8703, 0x4565, 0x88,0xe2, 0x82,0x01,0xd2,0xec,0xd7,0xb7);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("615f1d43-8703-4565-88e2-8201d2ecd7b7")
IInkTransform : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE Reset(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Translate(
        float HorizontalComponent,
        float VerticalComponent) = 0;

    virtual HRESULT STDMETHODCALLTYPE Rotate(
        float Degrees,
        float x = 0,
        float y = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE Reflect(
        VARIANT_BOOL Horizontally,
        VARIANT_BOOL Vertically) = 0;

    virtual HRESULT STDMETHODCALLTYPE Shear(
        float HorizontalComponent,
        float VerticalComponent) = 0;

    virtual HRESULT STDMETHODCALLTYPE ScaleTransform(
        float HorizontalMultiplier,
        float VerticalMultiplier) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTransform(
        float *eM11,
        float *eM12,
        float *eM21,
        float *eM22,
        float *eDx,
        float *eDy) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetTransform(
        float eM11,
        float eM12,
        float eM21,
        float eM22,
        float eDx,
        float eDy) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_eM11(
        float *Value) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_eM11(
        float Value) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_eM12(
        float *Value) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_eM12(
        float Value) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_eM21(
        float *Value) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_eM21(
        float Value) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_eM22(
        float *Value) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_eM22(
        float Value) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_eDx(
        float *Value) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_eDx(
        float Value) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_eDy(
        float *Value) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_eDy(
        float Value) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Data(
        XFORM *XForm) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Data(
        XFORM XForm) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IInkTransform, 0x615f1d43, 0x8703, 0x4565, 0x88,0xe2, 0x82,0x01,0xd2,0xec,0xd7,0xb7)
#endif
#else
typedef struct IInkTransformVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IInkTransform *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IInkTransform *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IInkTransform *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IInkTransform *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IInkTransform *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IInkTransform *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IInkTransform *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IInkTransform methods ***/
    HRESULT (STDMETHODCALLTYPE *Reset)(
        IInkTransform *This);

    HRESULT (STDMETHODCALLTYPE *Translate)(
        IInkTransform *This,
        float HorizontalComponent,
        float VerticalComponent);

    HRESULT (STDMETHODCALLTYPE *Rotate)(
        IInkTransform *This,
        float Degrees,
        float x,
        float y);

    HRESULT (STDMETHODCALLTYPE *Reflect)(
        IInkTransform *This,
        VARIANT_BOOL Horizontally,
        VARIANT_BOOL Vertically);

    HRESULT (STDMETHODCALLTYPE *Shear)(
        IInkTransform *This,
        float HorizontalComponent,
        float VerticalComponent);

    HRESULT (STDMETHODCALLTYPE *ScaleTransform)(
        IInkTransform *This,
        float HorizontalMultiplier,
        float VerticalMultiplier);

    HRESULT (STDMETHODCALLTYPE *GetTransform)(
        IInkTransform *This,
        float *eM11,
        float *eM12,
        float *eM21,
        float *eM22,
        float *eDx,
        float *eDy);

    HRESULT (STDMETHODCALLTYPE *SetTransform)(
        IInkTransform *This,
        float eM11,
        float eM12,
        float eM21,
        float eM22,
        float eDx,
        float eDy);

    HRESULT (STDMETHODCALLTYPE *get_eM11)(
        IInkTransform *This,
        float *Value);

    HRESULT (STDMETHODCALLTYPE *put_eM11)(
        IInkTransform *This,
        float Value);

    HRESULT (STDMETHODCALLTYPE *get_eM12)(
        IInkTransform *This,
        float *Value);

    HRESULT (STDMETHODCALLTYPE *put_eM12)(
        IInkTransform *This,
        float Value);

    HRESULT (STDMETHODCALLTYPE *get_eM21)(
        IInkTransform *This,
        float *Value);

    HRESULT (STDMETHODCALLTYPE *put_eM21)(
        IInkTransform *This,
        float Value);

    HRESULT (STDMETHODCALLTYPE *get_eM22)(
        IInkTransform *This,
        float *Value);

    HRESULT (STDMETHODCALLTYPE *put_eM22)(
        IInkTransform *This,
        float Value);

    HRESULT (STDMETHODCALLTYPE *get_eDx)(
        IInkTransform *This,
        float *Value);

    HRESULT (STDMETHODCALLTYPE *put_eDx)(
        IInkTransform *This,
        float Value);

    HRESULT (STDMETHODCALLTYPE *get_eDy)(
        IInkTransform *This,
        float *Value);

    HRESULT (STDMETHODCALLTYPE *put_eDy)(
        IInkTransform *This,
        float Value);

    HRESULT (STDMETHODCALLTYPE *get_Data)(
        IInkTransform *This,
        XFORM *XForm);

    HRESULT (STDMETHODCALLTYPE *put_Data)(
        IInkTransform *This,
        XFORM XForm);

    END_INTERFACE
} IInkTransformVtbl;

interface IInkTransform {
    CONST_VTBL IInkTransformVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IInkTransform_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IInkTransform_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IInkTransform_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IInkTransform_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IInkTransform_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IInkTransform_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IInkTransform_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IInkTransform methods ***/
#define IInkTransform_Reset(This) (This)->lpVtbl->Reset(This)
#define IInkTransform_Translate(This,HorizontalComponent,VerticalComponent) (This)->lpVtbl->Translate(This,HorizontalComponent,VerticalComponent)
#define IInkTransform_Rotate(This,Degrees,x,y) (This)->lpVtbl->Rotate(This,Degrees,x,y)
#define IInkTransform_Reflect(This,Horizontally,Vertically) (This)->lpVtbl->Reflect(This,Horizontally,Vertically)
#define IInkTransform_Shear(This,HorizontalComponent,VerticalComponent) (This)->lpVtbl->Shear(This,HorizontalComponent,VerticalComponent)
#define IInkTransform_ScaleTransform(This,HorizontalMultiplier,VerticalMultiplier) (This)->lpVtbl->ScaleTransform(This,HorizontalMultiplier,VerticalMultiplier)
#define IInkTransform_GetTransform(This,eM11,eM12,eM21,eM22,eDx,eDy) (This)->lpVtbl->GetTransform(This,eM11,eM12,eM21,eM22,eDx,eDy)
#define IInkTransform_SetTransform(This,eM11,eM12,eM21,eM22,eDx,eDy) (This)->lpVtbl->SetTransform(This,eM11,eM12,eM21,eM22,eDx,eDy)
#define IInkTransform_get_eM11(This,Value) (This)->lpVtbl->get_eM11(This,Value)
#define IInkTransform_put_eM11(This,Value) (This)->lpVtbl->put_eM11(This,Value)
#define IInkTransform_get_eM12(This,Value) (This)->lpVtbl->get_eM12(This,Value)
#define IInkTransform_put_eM12(This,Value) (This)->lpVtbl->put_eM12(This,Value)
#define IInkTransform_get_eM21(This,Value) (This)->lpVtbl->get_eM21(This,Value)
#define IInkTransform_put_eM21(This,Value) (This)->lpVtbl->put_eM21(This,Value)
#define IInkTransform_get_eM22(This,Value) (This)->lpVtbl->get_eM22(This,Value)
#define IInkTransform_put_eM22(This,Value) (This)->lpVtbl->put_eM22(This,Value)
#define IInkTransform_get_eDx(This,Value) (This)->lpVtbl->get_eDx(This,Value)
#define IInkTransform_put_eDx(This,Value) (This)->lpVtbl->put_eDx(This,Value)
#define IInkTransform_get_eDy(This,Value) (This)->lpVtbl->get_eDy(This,Value)
#define IInkTransform_put_eDy(This,Value) (This)->lpVtbl->put_eDy(This,Value)
#define IInkTransform_get_Data(This,XForm) (This)->lpVtbl->get_Data(This,XForm)
#define IInkTransform_put_Data(This,XForm) (This)->lpVtbl->put_Data(This,XForm)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IInkTransform_QueryInterface(IInkTransform* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IInkTransform_AddRef(IInkTransform* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IInkTransform_Release(IInkTransform* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IInkTransform_GetTypeInfoCount(IInkTransform* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IInkTransform_GetTypeInfo(IInkTransform* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IInkTransform_GetIDsOfNames(IInkTransform* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IInkTransform_Invoke(IInkTransform* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IInkTransform methods ***/
static FORCEINLINE HRESULT IInkTransform_Reset(IInkTransform* This) {
    return This->lpVtbl->Reset(This);
}
static FORCEINLINE HRESULT IInkTransform_Translate(IInkTransform* This,float HorizontalComponent,float VerticalComponent) {
    return This->lpVtbl->Translate(This,HorizontalComponent,VerticalComponent);
}
static FORCEINLINE HRESULT IInkTransform_Rotate(IInkTransform* This,float Degrees,float x,float y) {
    return This->lpVtbl->Rotate(This,Degrees,x,y);
}
static FORCEINLINE HRESULT IInkTransform_Reflect(IInkTransform* This,VARIANT_BOOL Horizontally,VARIANT_BOOL Vertically) {
    return This->lpVtbl->Reflect(This,Horizontally,Vertically);
}
static FORCEINLINE HRESULT IInkTransform_Shear(IInkTransform* This,float HorizontalComponent,float VerticalComponent) {
    return This->lpVtbl->Shear(This,HorizontalComponent,VerticalComponent);
}
static FORCEINLINE HRESULT IInkTransform_ScaleTransform(IInkTransform* This,float HorizontalMultiplier,float VerticalMultiplier) {
    return This->lpVtbl->ScaleTransform(This,HorizontalMultiplier,VerticalMultiplier);
}
static FORCEINLINE HRESULT IInkTransform_GetTransform(IInkTransform* This,float *eM11,float *eM12,float *eM21,float *eM22,float *eDx,float *eDy) {
    return This->lpVtbl->GetTransform(This,eM11,eM12,eM21,eM22,eDx,eDy);
}
static FORCEINLINE HRESULT IInkTransform_SetTransform(IInkTransform* This,float eM11,float eM12,float eM21,float eM22,float eDx,float eDy) {
    return This->lpVtbl->SetTransform(This,eM11,eM12,eM21,eM22,eDx,eDy);
}
static FORCEINLINE HRESULT IInkTransform_get_eM11(IInkTransform* This,float *Value) {
    return This->lpVtbl->get_eM11(This,Value);
}
static FORCEINLINE HRESULT IInkTransform_put_eM11(IInkTransform* This,float Value) {
    return This->lpVtbl->put_eM11(This,Value);
}
static FORCEINLINE HRESULT IInkTransform_get_eM12(IInkTransform* This,float *Value) {
    return This->lpVtbl->get_eM12(This,Value);
}
static FORCEINLINE HRESULT IInkTransform_put_eM12(IInkTransform* This,float Value) {
    return This->lpVtbl->put_eM12(This,Value);
}
static FORCEINLINE HRESULT IInkTransform_get_eM21(IInkTransform* This,float *Value) {
    return This->lpVtbl->get_eM21(This,Value);
}
static FORCEINLINE HRESULT IInkTransform_put_eM21(IInkTransform* This,float Value) {
    return This->lpVtbl->put_eM21(This,Value);
}
static FORCEINLINE HRESULT IInkTransform_get_eM22(IInkTransform* This,float *Value) {
    return This->lpVtbl->get_eM22(This,Value);
}
static FORCEINLINE HRESULT IInkTransform_put_eM22(IInkTransform* This,float Value) {
    return This->lpVtbl->put_eM22(This,Value);
}
static FORCEINLINE HRESULT IInkTransform_get_eDx(IInkTransform* This,float *Value) {
    return This->lpVtbl->get_eDx(This,Value);
}
static FORCEINLINE HRESULT IInkTransform_put_eDx(IInkTransform* This,float Value) {
    return This->lpVtbl->put_eDx(This,Value);
}
static FORCEINLINE HRESULT IInkTransform_get_eDy(IInkTransform* This,float *Value) {
    return This->lpVtbl->get_eDy(This,Value);
}
static FORCEINLINE HRESULT IInkTransform_put_eDy(IInkTransform* This,float Value) {
    return This->lpVtbl->put_eDy(This,Value);
}
static FORCEINLINE HRESULT IInkTransform_get_Data(IInkTransform* This,XFORM *XForm) {
    return This->lpVtbl->get_Data(This,XForm);
}
static FORCEINLINE HRESULT IInkTransform_put_Data(IInkTransform* This,XFORM XForm) {
    return This->lpVtbl->put_Data(This,XForm);
}
#endif
#endif

#endif


#endif  /* __IInkTransform_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IInkRecognitionAlternates interface
 */
#ifndef __IInkRecognitionAlternates_INTERFACE_DEFINED__
#define __IInkRecognitionAlternates_INTERFACE_DEFINED__

DEFINE_GUID(IID_IInkRecognitionAlternates, 0x286a167f, 0x9f19, 0x4c61, 0x9d,0x53, 0x4f,0x07,0xbe,0x62,0x2b,0x84);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("286a167f-9f19-4c61-9d53-4f07be622b84")
IInkRecognitionAlternates : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Count(
        LONG *Count) = 0;

    virtual HRESULT STDMETHODCALLTYPE get__NewEnum(
        IUnknown **_NewEnum) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Strokes(
        IInkStrokes **Strokes) = 0;

    virtual HRESULT STDMETHODCALLTYPE Item(
        LONG Index,
        IInkRecognitionAlternate **InkRecoAlternate) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IInkRecognitionAlternates, 0x286a167f, 0x9f19, 0x4c61, 0x9d,0x53, 0x4f,0x07,0xbe,0x62,0x2b,0x84)
#endif
#else
typedef struct IInkRecognitionAlternatesVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IInkRecognitionAlternates *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IInkRecognitionAlternates *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IInkRecognitionAlternates *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IInkRecognitionAlternates *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IInkRecognitionAlternates *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IInkRecognitionAlternates *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IInkRecognitionAlternates *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IInkRecognitionAlternates methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Count)(
        IInkRecognitionAlternates *This,
        LONG *Count);

    HRESULT (STDMETHODCALLTYPE *get__NewEnum)(
        IInkRecognitionAlternates *This,
        IUnknown **_NewEnum);

    HRESULT (STDMETHODCALLTYPE *get_Strokes)(
        IInkRecognitionAlternates *This,
        IInkStrokes **Strokes);

    HRESULT (STDMETHODCALLTYPE *Item)(
        IInkRecognitionAlternates *This,
        LONG Index,
        IInkRecognitionAlternate **InkRecoAlternate);

    END_INTERFACE
} IInkRecognitionAlternatesVtbl;

interface IInkRecognitionAlternates {
    CONST_VTBL IInkRecognitionAlternatesVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IInkRecognitionAlternates_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IInkRecognitionAlternates_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IInkRecognitionAlternates_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IInkRecognitionAlternates_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IInkRecognitionAlternates_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IInkRecognitionAlternates_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IInkRecognitionAlternates_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IInkRecognitionAlternates methods ***/
#define IInkRecognitionAlternates_get_Count(This,Count) (This)->lpVtbl->get_Count(This,Count)
#define IInkRecognitionAlternates_get__NewEnum(This,_NewEnum) (This)->lpVtbl->get__NewEnum(This,_NewEnum)
#define IInkRecognitionAlternates_get_Strokes(This,Strokes) (This)->lpVtbl->get_Strokes(This,Strokes)
#define IInkRecognitionAlternates_Item(This,Index,InkRecoAlternate) (This)->lpVtbl->Item(This,Index,InkRecoAlternate)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IInkRecognitionAlternates_QueryInterface(IInkRecognitionAlternates* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IInkRecognitionAlternates_AddRef(IInkRecognitionAlternates* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IInkRecognitionAlternates_Release(IInkRecognitionAlternates* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IInkRecognitionAlternates_GetTypeInfoCount(IInkRecognitionAlternates* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IInkRecognitionAlternates_GetTypeInfo(IInkRecognitionAlternates* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IInkRecognitionAlternates_GetIDsOfNames(IInkRecognitionAlternates* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IInkRecognitionAlternates_Invoke(IInkRecognitionAlternates* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IInkRecognitionAlternates methods ***/
static FORCEINLINE HRESULT IInkRecognitionAlternates_get_Count(IInkRecognitionAlternates* This,LONG *Count) {
    return This->lpVtbl->get_Count(This,Count);
}
static FORCEINLINE HRESULT IInkRecognitionAlternates_get__NewEnum(IInkRecognitionAlternates* This,IUnknown **_NewEnum) {
    return This->lpVtbl->get__NewEnum(This,_NewEnum);
}
static FORCEINLINE HRESULT IInkRecognitionAlternates_get_Strokes(IInkRecognitionAlternates* This,IInkStrokes **Strokes) {
    return This->lpVtbl->get_Strokes(This,Strokes);
}
static FORCEINLINE HRESULT IInkRecognitionAlternates_Item(IInkRecognitionAlternates* This,LONG Index,IInkRecognitionAlternate **InkRecoAlternate) {
    return This->lpVtbl->Item(This,Index,InkRecoAlternate);
}
#endif
#endif

#endif


#endif  /* __IInkRecognitionAlternates_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IInkRecognitionAlternate interface
 */
#ifndef __IInkRecognitionAlternate_INTERFACE_DEFINED__
#define __IInkRecognitionAlternate_INTERFACE_DEFINED__

DEFINE_GUID(IID_IInkRecognitionAlternate, 0xb7e660ad, 0x77e4, 0x429b, 0xad,0xda, 0x87,0x37,0x80,0xd1,0xfc,0x4a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("b7e660ad-77e4-429b-adda-873780d1fc4a")
IInkRecognitionAlternate : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_String(
        BSTR *RecoString) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Confidence(
        InkRecognitionConfidence *Confidence) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Baseline(
        VARIANT *Baseline) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Midline(
        VARIANT *Midline) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Ascender(
        VARIANT *Ascender) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Descender(
        VARIANT *Descender) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_LineNumber(
        LONG *LineNumber) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Strokes(
        IInkStrokes **Strokes) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_LineAlternates(
        IInkRecognitionAlternates **LineAlternates) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ConfidenceAlternates(
        IInkRecognitionAlternates **ConfidenceAlternates) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStrokesFromStrokeRanges(
        IInkStrokes *Strokes,
        IInkStrokes **GetStrokesFromStrokeRanges) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStrokesFromTextRange(
        LONG *selectionStart,
        LONG *selectionLength,
        IInkStrokes **GetStrokesFromTextRange) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTextRangeFromStrokes(
        IInkStrokes *Strokes,
        LONG *selectionStart,
        LONG *selectionLength) = 0;

    virtual HRESULT STDMETHODCALLTYPE AlternatesWithConstantPropertyValues(
        BSTR PropertyType,
        IInkRecognitionAlternates **AlternatesWithConstantPropertyValues) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPropertyValue(
        BSTR PropertyType,
        VARIANT *PropertyValue) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IInkRecognitionAlternate, 0xb7e660ad, 0x77e4, 0x429b, 0xad,0xda, 0x87,0x37,0x80,0xd1,0xfc,0x4a)
#endif
#else
typedef struct IInkRecognitionAlternateVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IInkRecognitionAlternate *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IInkRecognitionAlternate *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IInkRecognitionAlternate *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IInkRecognitionAlternate *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IInkRecognitionAlternate *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IInkRecognitionAlternate *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IInkRecognitionAlternate *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IInkRecognitionAlternate methods ***/
    HRESULT (STDMETHODCALLTYPE *get_String)(
        IInkRecognitionAlternate *This,
        BSTR *RecoString);

    HRESULT (STDMETHODCALLTYPE *get_Confidence)(
        IInkRecognitionAlternate *This,
        InkRecognitionConfidence *Confidence);

    HRESULT (STDMETHODCALLTYPE *get_Baseline)(
        IInkRecognitionAlternate *This,
        VARIANT *Baseline);

    HRESULT (STDMETHODCALLTYPE *get_Midline)(
        IInkRecognitionAlternate *This,
        VARIANT *Midline);

    HRESULT (STDMETHODCALLTYPE *get_Ascender)(
        IInkRecognitionAlternate *This,
        VARIANT *Ascender);

    HRESULT (STDMETHODCALLTYPE *get_Descender)(
        IInkRecognitionAlternate *This,
        VARIANT *Descender);

    HRESULT (STDMETHODCALLTYPE *get_LineNumber)(
        IInkRecognitionAlternate *This,
        LONG *LineNumber);

    HRESULT (STDMETHODCALLTYPE *get_Strokes)(
        IInkRecognitionAlternate *This,
        IInkStrokes **Strokes);

    HRESULT (STDMETHODCALLTYPE *get_LineAlternates)(
        IInkRecognitionAlternate *This,
        IInkRecognitionAlternates **LineAlternates);

    HRESULT (STDMETHODCALLTYPE *get_ConfidenceAlternates)(
        IInkRecognitionAlternate *This,
        IInkRecognitionAlternates **ConfidenceAlternates);

    HRESULT (STDMETHODCALLTYPE *GetStrokesFromStrokeRanges)(
        IInkRecognitionAlternate *This,
        IInkStrokes *Strokes,
        IInkStrokes **GetStrokesFromStrokeRanges);

    HRESULT (STDMETHODCALLTYPE *GetStrokesFromTextRange)(
        IInkRecognitionAlternate *This,
        LONG *selectionStart,
        LONG *selectionLength,
        IInkStrokes **GetStrokesFromTextRange);

    HRESULT (STDMETHODCALLTYPE *GetTextRangeFromStrokes)(
        IInkRecognitionAlternate *This,
        IInkStrokes *Strokes,
        LONG *selectionStart,
        LONG *selectionLength);

    HRESULT (STDMETHODCALLTYPE *AlternatesWithConstantPropertyValues)(
        IInkRecognitionAlternate *This,
        BSTR PropertyType,
        IInkRecognitionAlternates **AlternatesWithConstantPropertyValues);

    HRESULT (STDMETHODCALLTYPE *GetPropertyValue)(
        IInkRecognitionAlternate *This,
        BSTR PropertyType,
        VARIANT *PropertyValue);

    END_INTERFACE
} IInkRecognitionAlternateVtbl;

interface IInkRecognitionAlternate {
    CONST_VTBL IInkRecognitionAlternateVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IInkRecognitionAlternate_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IInkRecognitionAlternate_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IInkRecognitionAlternate_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IInkRecognitionAlternate_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IInkRecognitionAlternate_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IInkRecognitionAlternate_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IInkRecognitionAlternate_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IInkRecognitionAlternate methods ***/
#define IInkRecognitionAlternate_get_String(This,RecoString) (This)->lpVtbl->get_String(This,RecoString)
#define IInkRecognitionAlternate_get_Confidence(This,Confidence) (This)->lpVtbl->get_Confidence(This,Confidence)
#define IInkRecognitionAlternate_get_Baseline(This,Baseline) (This)->lpVtbl->get_Baseline(This,Baseline)
#define IInkRecognitionAlternate_get_Midline(This,Midline) (This)->lpVtbl->get_Midline(This,Midline)
#define IInkRecognitionAlternate_get_Ascender(This,Ascender) (This)->lpVtbl->get_Ascender(This,Ascender)
#define IInkRecognitionAlternate_get_Descender(This,Descender) (This)->lpVtbl->get_Descender(This,Descender)
#define IInkRecognitionAlternate_get_LineNumber(This,LineNumber) (This)->lpVtbl->get_LineNumber(This,LineNumber)
#define IInkRecognitionAlternate_get_Strokes(This,Strokes) (This)->lpVtbl->get_Strokes(This,Strokes)
#define IInkRecognitionAlternate_get_LineAlternates(This,LineAlternates) (This)->lpVtbl->get_LineAlternates(This,LineAlternates)
#define IInkRecognitionAlternate_get_ConfidenceAlternates(This,ConfidenceAlternates) (This)->lpVtbl->get_ConfidenceAlternates(This,ConfidenceAlternates)
#define IInkRecognitionAlternate_GetStrokesFromStrokeRanges(This,Strokes,GetStrokesFromStrokeRanges) (This)->lpVtbl->GetStrokesFromStrokeRanges(This,Strokes,GetStrokesFromStrokeRanges)
#define IInkRecognitionAlternate_GetStrokesFromTextRange(This,selectionStart,selectionLength,GetStrokesFromTextRange) (This)->lpVtbl->GetStrokesFromTextRange(This,selectionStart,selectionLength,GetStrokesFromTextRange)
#define IInkRecognitionAlternate_GetTextRangeFromStrokes(This,Strokes,selectionStart,selectionLength) (This)->lpVtbl->GetTextRangeFromStrokes(This,Strokes,selectionStart,selectionLength)
#define IInkRecognitionAlternate_AlternatesWithConstantPropertyValues(This,PropertyType,AlternatesWithConstantPropertyValues) (This)->lpVtbl->AlternatesWithConstantPropertyValues(This,PropertyType,AlternatesWithConstantPropertyValues)
#define IInkRecognitionAlternate_GetPropertyValue(This,PropertyType,PropertyValue) (This)->lpVtbl->GetPropertyValue(This,PropertyType,PropertyValue)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IInkRecognitionAlternate_QueryInterface(IInkRecognitionAlternate* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IInkRecognitionAlternate_AddRef(IInkRecognitionAlternate* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IInkRecognitionAlternate_Release(IInkRecognitionAlternate* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IInkRecognitionAlternate_GetTypeInfoCount(IInkRecognitionAlternate* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IInkRecognitionAlternate_GetTypeInfo(IInkRecognitionAlternate* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IInkRecognitionAlternate_GetIDsOfNames(IInkRecognitionAlternate* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IInkRecognitionAlternate_Invoke(IInkRecognitionAlternate* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IInkRecognitionAlternate methods ***/
static FORCEINLINE HRESULT IInkRecognitionAlternate_get_String(IInkRecognitionAlternate* This,BSTR *RecoString) {
    return This->lpVtbl->get_String(This,RecoString);
}
static FORCEINLINE HRESULT IInkRecognitionAlternate_get_Confidence(IInkRecognitionAlternate* This,InkRecognitionConfidence *Confidence) {
    return This->lpVtbl->get_Confidence(This,Confidence);
}
static FORCEINLINE HRESULT IInkRecognitionAlternate_get_Baseline(IInkRecognitionAlternate* This,VARIANT *Baseline) {
    return This->lpVtbl->get_Baseline(This,Baseline);
}
static FORCEINLINE HRESULT IInkRecognitionAlternate_get_Midline(IInkRecognitionAlternate* This,VARIANT *Midline) {
    return This->lpVtbl->get_Midline(This,Midline);
}
static FORCEINLINE HRESULT IInkRecognitionAlternate_get_Ascender(IInkRecognitionAlternate* This,VARIANT *Ascender) {
    return This->lpVtbl->get_Ascender(This,Ascender);
}
static FORCEINLINE HRESULT IInkRecognitionAlternate_get_Descender(IInkRecognitionAlternate* This,VARIANT *Descender) {
    return This->lpVtbl->get_Descender(This,Descender);
}
static FORCEINLINE HRESULT IInkRecognitionAlternate_get_LineNumber(IInkRecognitionAlternate* This,LONG *LineNumber) {
    return This->lpVtbl->get_LineNumber(This,LineNumber);
}
static FORCEINLINE HRESULT IInkRecognitionAlternate_get_Strokes(IInkRecognitionAlternate* This,IInkStrokes **Strokes) {
    return This->lpVtbl->get_Strokes(This,Strokes);
}
static FORCEINLINE HRESULT IInkRecognitionAlternate_get_LineAlternates(IInkRecognitionAlternate* This,IInkRecognitionAlternates **LineAlternates) {
    return This->lpVtbl->get_LineAlternates(This,LineAlternates);
}
static FORCEINLINE HRESULT IInkRecognitionAlternate_get_ConfidenceAlternates(IInkRecognitionAlternate* This,IInkRecognitionAlternates **ConfidenceAlternates) {
    return This->lpVtbl->get_ConfidenceAlternates(This,ConfidenceAlternates);
}
static FORCEINLINE HRESULT IInkRecognitionAlternate_GetStrokesFromStrokeRanges(IInkRecognitionAlternate* This,IInkStrokes *Strokes,IInkStrokes **GetStrokesFromStrokeRanges) {
    return This->lpVtbl->GetStrokesFromStrokeRanges(This,Strokes,GetStrokesFromStrokeRanges);
}
static FORCEINLINE HRESULT IInkRecognitionAlternate_GetStrokesFromTextRange(IInkRecognitionAlternate* This,LONG *selectionStart,LONG *selectionLength,IInkStrokes **GetStrokesFromTextRange) {
    return This->lpVtbl->GetStrokesFromTextRange(This,selectionStart,selectionLength,GetStrokesFromTextRange);
}
static FORCEINLINE HRESULT IInkRecognitionAlternate_GetTextRangeFromStrokes(IInkRecognitionAlternate* This,IInkStrokes *Strokes,LONG *selectionStart,LONG *selectionLength) {
    return This->lpVtbl->GetTextRangeFromStrokes(This,Strokes,selectionStart,selectionLength);
}
static FORCEINLINE HRESULT IInkRecognitionAlternate_AlternatesWithConstantPropertyValues(IInkRecognitionAlternate* This,BSTR PropertyType,IInkRecognitionAlternates **AlternatesWithConstantPropertyValues) {
    return This->lpVtbl->AlternatesWithConstantPropertyValues(This,PropertyType,AlternatesWithConstantPropertyValues);
}
static FORCEINLINE HRESULT IInkRecognitionAlternate_GetPropertyValue(IInkRecognitionAlternate* This,BSTR PropertyType,VARIANT *PropertyValue) {
    return This->lpVtbl->GetPropertyValue(This,PropertyType,PropertyValue);
}
#endif
#endif

#endif


#endif  /* __IInkRecognitionAlternate_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IInkRecognitionResult interface
 */
#ifndef __IInkRecognitionResult_INTERFACE_DEFINED__
#define __IInkRecognitionResult_INTERFACE_DEFINED__

DEFINE_GUID(IID_IInkRecognitionResult, 0x3bc129a8, 0x86cd, 0x45ad, 0xbd,0xe8, 0xe0,0xd3,0x2d,0x61,0xc1,0x6d);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3bc129a8-86cd-45ad-bde8-e0d32d61c16d")
IInkRecognitionResult : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_TopString(
        BSTR *TopString) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_TopAlternate(
        IInkRecognitionAlternate **TopAlternate) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_TopConfidence(
        InkRecognitionConfidence *TopConfidence) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Strokes(
        IInkStrokes **Strokes) = 0;

    virtual HRESULT STDMETHODCALLTYPE AlternatesFromSelection(
        LONG selectionStart,
        LONG selectionLength,
        LONG maximumAlternates,
        IInkRecognitionAlternates **AlternatesFromSelection) = 0;

    virtual HRESULT STDMETHODCALLTYPE ModifyTopAlternate(
        IInkRecognitionAlternate *Alternate) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetResultOnStrokes(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IInkRecognitionResult, 0x3bc129a8, 0x86cd, 0x45ad, 0xbd,0xe8, 0xe0,0xd3,0x2d,0x61,0xc1,0x6d)
#endif
#else
typedef struct IInkRecognitionResultVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IInkRecognitionResult *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IInkRecognitionResult *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IInkRecognitionResult *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IInkRecognitionResult *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IInkRecognitionResult *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IInkRecognitionResult *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IInkRecognitionResult *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IInkRecognitionResult methods ***/
    HRESULT (STDMETHODCALLTYPE *get_TopString)(
        IInkRecognitionResult *This,
        BSTR *TopString);

    HRESULT (STDMETHODCALLTYPE *get_TopAlternate)(
        IInkRecognitionResult *This,
        IInkRecognitionAlternate **TopAlternate);

    HRESULT (STDMETHODCALLTYPE *get_TopConfidence)(
        IInkRecognitionResult *This,
        InkRecognitionConfidence *TopConfidence);

    HRESULT (STDMETHODCALLTYPE *get_Strokes)(
        IInkRecognitionResult *This,
        IInkStrokes **Strokes);

    HRESULT (STDMETHODCALLTYPE *AlternatesFromSelection)(
        IInkRecognitionResult *This,
        LONG selectionStart,
        LONG selectionLength,
        LONG maximumAlternates,
        IInkRecognitionAlternates **AlternatesFromSelection);

    HRESULT (STDMETHODCALLTYPE *ModifyTopAlternate)(
        IInkRecognitionResult *This,
        IInkRecognitionAlternate *Alternate);

    HRESULT (STDMETHODCALLTYPE *SetResultOnStrokes)(
        IInkRecognitionResult *This);

    END_INTERFACE
} IInkRecognitionResultVtbl;

interface IInkRecognitionResult {
    CONST_VTBL IInkRecognitionResultVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IInkRecognitionResult_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IInkRecognitionResult_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IInkRecognitionResult_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IInkRecognitionResult_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IInkRecognitionResult_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IInkRecognitionResult_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IInkRecognitionResult_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IInkRecognitionResult methods ***/
#define IInkRecognitionResult_get_TopString(This,TopString) (This)->lpVtbl->get_TopString(This,TopString)
#define IInkRecognitionResult_get_TopAlternate(This,TopAlternate) (This)->lpVtbl->get_TopAlternate(This,TopAlternate)
#define IInkRecognitionResult_get_TopConfidence(This,TopConfidence) (This)->lpVtbl->get_TopConfidence(This,TopConfidence)
#define IInkRecognitionResult_get_Strokes(This,Strokes) (This)->lpVtbl->get_Strokes(This,Strokes)
#define IInkRecognitionResult_AlternatesFromSelection(This,selectionStart,selectionLength,maximumAlternates,AlternatesFromSelection) (This)->lpVtbl->AlternatesFromSelection(This,selectionStart,selectionLength,maximumAlternates,AlternatesFromSelection)
#define IInkRecognitionResult_ModifyTopAlternate(This,Alternate) (This)->lpVtbl->ModifyTopAlternate(This,Alternate)
#define IInkRecognitionResult_SetResultOnStrokes(This) (This)->lpVtbl->SetResultOnStrokes(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IInkRecognitionResult_QueryInterface(IInkRecognitionResult* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IInkRecognitionResult_AddRef(IInkRecognitionResult* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IInkRecognitionResult_Release(IInkRecognitionResult* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IInkRecognitionResult_GetTypeInfoCount(IInkRecognitionResult* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IInkRecognitionResult_GetTypeInfo(IInkRecognitionResult* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IInkRecognitionResult_GetIDsOfNames(IInkRecognitionResult* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IInkRecognitionResult_Invoke(IInkRecognitionResult* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IInkRecognitionResult methods ***/
static FORCEINLINE HRESULT IInkRecognitionResult_get_TopString(IInkRecognitionResult* This,BSTR *TopString) {
    return This->lpVtbl->get_TopString(This,TopString);
}
static FORCEINLINE HRESULT IInkRecognitionResult_get_TopAlternate(IInkRecognitionResult* This,IInkRecognitionAlternate **TopAlternate) {
    return This->lpVtbl->get_TopAlternate(This,TopAlternate);
}
static FORCEINLINE HRESULT IInkRecognitionResult_get_TopConfidence(IInkRecognitionResult* This,InkRecognitionConfidence *TopConfidence) {
    return This->lpVtbl->get_TopConfidence(This,TopConfidence);
}
static FORCEINLINE HRESULT IInkRecognitionResult_get_Strokes(IInkRecognitionResult* This,IInkStrokes **Strokes) {
    return This->lpVtbl->get_Strokes(This,Strokes);
}
static FORCEINLINE HRESULT IInkRecognitionResult_AlternatesFromSelection(IInkRecognitionResult* This,LONG selectionStart,LONG selectionLength,LONG maximumAlternates,IInkRecognitionAlternates **AlternatesFromSelection) {
    return This->lpVtbl->AlternatesFromSelection(This,selectionStart,selectionLength,maximumAlternates,AlternatesFromSelection);
}
static FORCEINLINE HRESULT IInkRecognitionResult_ModifyTopAlternate(IInkRecognitionResult* This,IInkRecognitionAlternate *Alternate) {
    return This->lpVtbl->ModifyTopAlternate(This,Alternate);
}
static FORCEINLINE HRESULT IInkRecognitionResult_SetResultOnStrokes(IInkRecognitionResult* This) {
    return This->lpVtbl->SetResultOnStrokes(This);
}
#endif
#endif

#endif


#endif  /* __IInkRecognitionResult_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IInkStrokeDisp interface
 */
#ifndef __IInkStrokeDisp_INTERFACE_DEFINED__
#define __IInkStrokeDisp_INTERFACE_DEFINED__

DEFINE_GUID(IID_IInkStrokeDisp, 0x43242fea, 0x91d1, 0x4a72, 0x96,0x3e, 0xfb,0xb9,0x18,0x29,0xcf,0xa2);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("43242fea-91d1-4a72-963e-fbb91829cfa2")
IInkStrokeDisp : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_ID(
        LONG *ID) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_BezierPoints(
        VARIANT *Points) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_DrawingAttributes(
        IInkDrawingAttributes **DrawAttrs) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_DrawingAttributes(
        IInkDrawingAttributes *DrawAttrs) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Ink(
        IInkDisp **Ink) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ExtendedProperties(
        IInkExtendedProperties **Properties) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_PolylineCusps(
        VARIANT *Cusps) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_BezierCusps(
        VARIANT *Cusps) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_SelfIntersections(
        VARIANT *Intersections) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_PacketCount(
        LONG *plCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_PacketSize(
        LONG *plSize) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_PacketDescription(
        VARIANT *PacketDescription) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Deleted(
        VARIANT_BOOL *Deleted) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetBoundingBox(
        InkBoundingBoxMode BoundingBoxMode,
        IInkRectangle **Rectangle) = 0;

    virtual HRESULT STDMETHODCALLTYPE FindIntersections(
        IInkStrokes *Strokes,
        VARIANT *Intersections) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRectangleIntersections(
        IInkRectangle *Rectangle,
        VARIANT *Intersections) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clip(
        IInkRectangle *Rectangle) = 0;

    virtual HRESULT STDMETHODCALLTYPE HitTestCircle(
        LONG X,
        LONG Y,
        float Radius,
        VARIANT_BOOL *Intersects) = 0;

    virtual HRESULT STDMETHODCALLTYPE NearestPoint(
        LONG X,
        LONG Y,
        float *Distance,
        float *Point) = 0;

    virtual HRESULT STDMETHODCALLTYPE Split(
        float SplitAt,
        IInkStrokeDisp **NewStroke) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPacketDescriptionPropertyMetrics(
        BSTR PropertyName,
        LONG *Minimum,
        LONG *Maximum,
        TabletPropertyMetricUnit *Units,
        float *Resolution) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPoints(
        LONG Index,
        LONG Count,
        VARIANT *Points) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetPoints(
        VARIANT Points,
        LONG Index,
        LONG Count,
        LONG *NumberOfPointsSet) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPacketData(
        LONG Index,
        LONG Count,
        VARIANT *PacketData) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPacketValuesByProperty(
        BSTR PropertyName,
        LONG Index,
        LONG Count,
        VARIANT *PacketValues) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetPacketValuesByProperty(
        BSTR bstrPropertyName,
        VARIANT PacketValues,
        LONG Index,
        LONG Count,
        LONG *NumberOfPacketsSet) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFlattenedBezierPoints(
        LONG FittingError,
        VARIANT *FlattenedBezierPoints) = 0;

    virtual HRESULT STDMETHODCALLTYPE Transform(
        IInkTransform *Transform,
        VARIANT_BOOL ApplyOnPenWidth = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE ScaleToRectangle(
        IInkRectangle *Rectangle) = 0;

    virtual HRESULT STDMETHODCALLTYPE Move(
        float HorizontalComponent,
        float VerticalComponent) = 0;

    virtual HRESULT STDMETHODCALLTYPE Rotate(
        float Degrees,
        float x = 0,
        float y = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE Shear(
        float HorizontalMultiplier,
        float VerticalMultiplier) = 0;

    virtual HRESULT STDMETHODCALLTYPE ScaleTransform(
        float HorizontalMultiplier,
        float VerticalMultiplier) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IInkStrokeDisp, 0x43242fea, 0x91d1, 0x4a72, 0x96,0x3e, 0xfb,0xb9,0x18,0x29,0xcf,0xa2)
#endif
#else
typedef struct IInkStrokeDispVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IInkStrokeDisp *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IInkStrokeDisp *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IInkStrokeDisp *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IInkStrokeDisp *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IInkStrokeDisp *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IInkStrokeDisp *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IInkStrokeDisp *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IInkStrokeDisp methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ID)(
        IInkStrokeDisp *This,
        LONG *ID);

    HRESULT (STDMETHODCALLTYPE *get_BezierPoints)(
        IInkStrokeDisp *This,
        VARIANT *Points);

    HRESULT (STDMETHODCALLTYPE *get_DrawingAttributes)(
        IInkStrokeDisp *This,
        IInkDrawingAttributes **DrawAttrs);

    HRESULT (STDMETHODCALLTYPE *putref_DrawingAttributes)(
        IInkStrokeDisp *This,
        IInkDrawingAttributes *DrawAttrs);

    HRESULT (STDMETHODCALLTYPE *get_Ink)(
        IInkStrokeDisp *This,
        IInkDisp **Ink);

    HRESULT (STDMETHODCALLTYPE *get_ExtendedProperties)(
        IInkStrokeDisp *This,
        IInkExtendedProperties **Properties);

    HRESULT (STDMETHODCALLTYPE *get_PolylineCusps)(
        IInkStrokeDisp *This,
        VARIANT *Cusps);

    HRESULT (STDMETHODCALLTYPE *get_BezierCusps)(
        IInkStrokeDisp *This,
        VARIANT *Cusps);

    HRESULT (STDMETHODCALLTYPE *get_SelfIntersections)(
        IInkStrokeDisp *This,
        VARIANT *Intersections);

    HRESULT (STDMETHODCALLTYPE *get_PacketCount)(
        IInkStrokeDisp *This,
        LONG *plCount);

    HRESULT (STDMETHODCALLTYPE *get_PacketSize)(
        IInkStrokeDisp *This,
        LONG *plSize);

    HRESULT (STDMETHODCALLTYPE *get_PacketDescription)(
        IInkStrokeDisp *This,
        VARIANT *PacketDescription);

    HRESULT (STDMETHODCALLTYPE *get_Deleted)(
        IInkStrokeDisp *This,
        VARIANT_BOOL *Deleted);

    HRESULT (STDMETHODCALLTYPE *GetBoundingBox)(
        IInkStrokeDisp *This,
        InkBoundingBoxMode BoundingBoxMode,
        IInkRectangle **Rectangle);

    HRESULT (STDMETHODCALLTYPE *FindIntersections)(
        IInkStrokeDisp *This,
        IInkStrokes *Strokes,
        VARIANT *Intersections);

    HRESULT (STDMETHODCALLTYPE *GetRectangleIntersections)(
        IInkStrokeDisp *This,
        IInkRectangle *Rectangle,
        VARIANT *Intersections);

    HRESULT (STDMETHODCALLTYPE *Clip)(
        IInkStrokeDisp *This,
        IInkRectangle *Rectangle);

    HRESULT (STDMETHODCALLTYPE *HitTestCircle)(
        IInkStrokeDisp *This,
        LONG X,
        LONG Y,
        float Radius,
        VARIANT_BOOL *Intersects);

    HRESULT (STDMETHODCALLTYPE *NearestPoint)(
        IInkStrokeDisp *This,
        LONG X,
        LONG Y,
        float *Distance,
        float *Point);

    HRESULT (STDMETHODCALLTYPE *Split)(
        IInkStrokeDisp *This,
        float SplitAt,
        IInkStrokeDisp **NewStroke);

    HRESULT (STDMETHODCALLTYPE *GetPacketDescriptionPropertyMetrics)(
        IInkStrokeDisp *This,
        BSTR PropertyName,
        LONG *Minimum,
        LONG *Maximum,
        TabletPropertyMetricUnit *Units,
        float *Resolution);

    HRESULT (STDMETHODCALLTYPE *GetPoints)(
        IInkStrokeDisp *This,
        LONG Index,
        LONG Count,
        VARIANT *Points);

    HRESULT (STDMETHODCALLTYPE *SetPoints)(
        IInkStrokeDisp *This,
        VARIANT Points,
        LONG Index,
        LONG Count,
        LONG *NumberOfPointsSet);

    HRESULT (STDMETHODCALLTYPE *GetPacketData)(
        IInkStrokeDisp *This,
        LONG Index,
        LONG Count,
        VARIANT *PacketData);

    HRESULT (STDMETHODCALLTYPE *GetPacketValuesByProperty)(
        IInkStrokeDisp *This,
        BSTR PropertyName,
        LONG Index,
        LONG Count,
        VARIANT *PacketValues);

    HRESULT (STDMETHODCALLTYPE *SetPacketValuesByProperty)(
        IInkStrokeDisp *This,
        BSTR bstrPropertyName,
        VARIANT PacketValues,
        LONG Index,
        LONG Count,
        LONG *NumberOfPacketsSet);

    HRESULT (STDMETHODCALLTYPE *GetFlattenedBezierPoints)(
        IInkStrokeDisp *This,
        LONG FittingError,
        VARIANT *FlattenedBezierPoints);

    HRESULT (STDMETHODCALLTYPE *Transform)(
        IInkStrokeDisp *This,
        IInkTransform *Transform,
        VARIANT_BOOL ApplyOnPenWidth);

    HRESULT (STDMETHODCALLTYPE *ScaleToRectangle)(
        IInkStrokeDisp *This,
        IInkRectangle *Rectangle);

    HRESULT (STDMETHODCALLTYPE *Move)(
        IInkStrokeDisp *This,
        float HorizontalComponent,
        float VerticalComponent);

    HRESULT (STDMETHODCALLTYPE *Rotate)(
        IInkStrokeDisp *This,
        float Degrees,
        float x,
        float y);

    HRESULT (STDMETHODCALLTYPE *Shear)(
        IInkStrokeDisp *This,
        float HorizontalMultiplier,
        float VerticalMultiplier);

    HRESULT (STDMETHODCALLTYPE *ScaleTransform)(
        IInkStrokeDisp *This,
        float HorizontalMultiplier,
        float VerticalMultiplier);

    END_INTERFACE
} IInkStrokeDispVtbl;

interface IInkStrokeDisp {
    CONST_VTBL IInkStrokeDispVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IInkStrokeDisp_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IInkStrokeDisp_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IInkStrokeDisp_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IInkStrokeDisp_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IInkStrokeDisp_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IInkStrokeDisp_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IInkStrokeDisp_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IInkStrokeDisp methods ***/
#define IInkStrokeDisp_get_ID(This,ID) (This)->lpVtbl->get_ID(This,ID)
#define IInkStrokeDisp_get_BezierPoints(This,Points) (This)->lpVtbl->get_BezierPoints(This,Points)
#define IInkStrokeDisp_get_DrawingAttributes(This,DrawAttrs) (This)->lpVtbl->get_DrawingAttributes(This,DrawAttrs)
#define IInkStrokeDisp_putref_DrawingAttributes(This,DrawAttrs) (This)->lpVtbl->putref_DrawingAttributes(This,DrawAttrs)
#define IInkStrokeDisp_get_Ink(This,Ink) (This)->lpVtbl->get_Ink(This,Ink)
#define IInkStrokeDisp_get_ExtendedProperties(This,Properties) (This)->lpVtbl->get_ExtendedProperties(This,Properties)
#define IInkStrokeDisp_get_PolylineCusps(This,Cusps) (This)->lpVtbl->get_PolylineCusps(This,Cusps)
#define IInkStrokeDisp_get_BezierCusps(This,Cusps) (This)->lpVtbl->get_BezierCusps(This,Cusps)
#define IInkStrokeDisp_get_SelfIntersections(This,Intersections) (This)->lpVtbl->get_SelfIntersections(This,Intersections)
#define IInkStrokeDisp_get_PacketCount(This,plCount) (This)->lpVtbl->get_PacketCount(This,plCount)
#define IInkStrokeDisp_get_PacketSize(This,plSize) (This)->lpVtbl->get_PacketSize(This,plSize)
#define IInkStrokeDisp_get_PacketDescription(This,PacketDescription) (This)->lpVtbl->get_PacketDescription(This,PacketDescription)
#define IInkStrokeDisp_get_Deleted(This,Deleted) (This)->lpVtbl->get_Deleted(This,Deleted)
#define IInkStrokeDisp_GetBoundingBox(This,BoundingBoxMode,Rectangle) (This)->lpVtbl->GetBoundingBox(This,BoundingBoxMode,Rectangle)
#define IInkStrokeDisp_FindIntersections(This,Strokes,Intersections) (This)->lpVtbl->FindIntersections(This,Strokes,Intersections)
#define IInkStrokeDisp_GetRectangleIntersections(This,Rectangle,Intersections) (This)->lpVtbl->GetRectangleIntersections(This,Rectangle,Intersections)
#define IInkStrokeDisp_Clip(This,Rectangle) (This)->lpVtbl->Clip(This,Rectangle)
#define IInkStrokeDisp_HitTestCircle(This,X,Y,Radius,Intersects) (This)->lpVtbl->HitTestCircle(This,X,Y,Radius,Intersects)
#define IInkStrokeDisp_NearestPoint(This,X,Y,Distance,Point) (This)->lpVtbl->NearestPoint(This,X,Y,Distance,Point)
#define IInkStrokeDisp_Split(This,SplitAt,NewStroke) (This)->lpVtbl->Split(This,SplitAt,NewStroke)
#define IInkStrokeDisp_GetPacketDescriptionPropertyMetrics(This,PropertyName,Minimum,Maximum,Units,Resolution) (This)->lpVtbl->GetPacketDescriptionPropertyMetrics(This,PropertyName,Minimum,Maximum,Units,Resolution)
#define IInkStrokeDisp_GetPoints(This,Index,Count,Points) (This)->lpVtbl->GetPoints(This,Index,Count,Points)
#define IInkStrokeDisp_SetPoints(This,Points,Index,Count,NumberOfPointsSet) (This)->lpVtbl->SetPoints(This,Points,Index,Count,NumberOfPointsSet)
#define IInkStrokeDisp_GetPacketData(This,Index,Count,PacketData) (This)->lpVtbl->GetPacketData(This,Index,Count,PacketData)
#define IInkStrokeDisp_GetPacketValuesByProperty(This,PropertyName,Index,Count,PacketValues) (This)->lpVtbl->GetPacketValuesByProperty(This,PropertyName,Index,Count,PacketValues)
#define IInkStrokeDisp_SetPacketValuesByProperty(This,bstrPropertyName,PacketValues,Index,Count,NumberOfPacketsSet) (This)->lpVtbl->SetPacketValuesByProperty(This,bstrPropertyName,PacketValues,Index,Count,NumberOfPacketsSet)
#define IInkStrokeDisp_GetFlattenedBezierPoints(This,FittingError,FlattenedBezierPoints) (This)->lpVtbl->GetFlattenedBezierPoints(This,FittingError,FlattenedBezierPoints)
#define IInkStrokeDisp_Transform(This,Transform,ApplyOnPenWidth) (This)->lpVtbl->Transform(This,Transform,ApplyOnPenWidth)
#define IInkStrokeDisp_ScaleToRectangle(This,Rectangle) (This)->lpVtbl->ScaleToRectangle(This,Rectangle)
#define IInkStrokeDisp_Move(This,HorizontalComponent,VerticalComponent) (This)->lpVtbl->Move(This,HorizontalComponent,VerticalComponent)
#define IInkStrokeDisp_Rotate(This,Degrees,x,y) (This)->lpVtbl->Rotate(This,Degrees,x,y)
#define IInkStrokeDisp_Shear(This,HorizontalMultiplier,VerticalMultiplier) (This)->lpVtbl->Shear(This,HorizontalMultiplier,VerticalMultiplier)
#define IInkStrokeDisp_ScaleTransform(This,HorizontalMultiplier,VerticalMultiplier) (This)->lpVtbl->ScaleTransform(This,HorizontalMultiplier,VerticalMultiplier)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IInkStrokeDisp_QueryInterface(IInkStrokeDisp* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IInkStrokeDisp_AddRef(IInkStrokeDisp* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IInkStrokeDisp_Release(IInkStrokeDisp* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IInkStrokeDisp_GetTypeInfoCount(IInkStrokeDisp* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IInkStrokeDisp_GetTypeInfo(IInkStrokeDisp* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IInkStrokeDisp_GetIDsOfNames(IInkStrokeDisp* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IInkStrokeDisp_Invoke(IInkStrokeDisp* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IInkStrokeDisp methods ***/
static FORCEINLINE HRESULT IInkStrokeDisp_get_ID(IInkStrokeDisp* This,LONG *ID) {
    return This->lpVtbl->get_ID(This,ID);
}
static FORCEINLINE HRESULT IInkStrokeDisp_get_BezierPoints(IInkStrokeDisp* This,VARIANT *Points) {
    return This->lpVtbl->get_BezierPoints(This,Points);
}
static FORCEINLINE HRESULT IInkStrokeDisp_get_DrawingAttributes(IInkStrokeDisp* This,IInkDrawingAttributes **DrawAttrs) {
    return This->lpVtbl->get_DrawingAttributes(This,DrawAttrs);
}
static FORCEINLINE HRESULT IInkStrokeDisp_putref_DrawingAttributes(IInkStrokeDisp* This,IInkDrawingAttributes *DrawAttrs) {
    return This->lpVtbl->putref_DrawingAttributes(This,DrawAttrs);
}
static FORCEINLINE HRESULT IInkStrokeDisp_get_Ink(IInkStrokeDisp* This,IInkDisp **Ink) {
    return This->lpVtbl->get_Ink(This,Ink);
}
static FORCEINLINE HRESULT IInkStrokeDisp_get_ExtendedProperties(IInkStrokeDisp* This,IInkExtendedProperties **Properties) {
    return This->lpVtbl->get_ExtendedProperties(This,Properties);
}
static FORCEINLINE HRESULT IInkStrokeDisp_get_PolylineCusps(IInkStrokeDisp* This,VARIANT *Cusps) {
    return This->lpVtbl->get_PolylineCusps(This,Cusps);
}
static FORCEINLINE HRESULT IInkStrokeDisp_get_BezierCusps(IInkStrokeDisp* This,VARIANT *Cusps) {
    return This->lpVtbl->get_BezierCusps(This,Cusps);
}
static FORCEINLINE HRESULT IInkStrokeDisp_get_SelfIntersections(IInkStrokeDisp* This,VARIANT *Intersections) {
    return This->lpVtbl->get_SelfIntersections(This,Intersections);
}
static FORCEINLINE HRESULT IInkStrokeDisp_get_PacketCount(IInkStrokeDisp* This,LONG *plCount) {
    return This->lpVtbl->get_PacketCount(This,plCount);
}
static FORCEINLINE HRESULT IInkStrokeDisp_get_PacketSize(IInkStrokeDisp* This,LONG *plSize) {
    return This->lpVtbl->get_PacketSize(This,plSize);
}
static FORCEINLINE HRESULT IInkStrokeDisp_get_PacketDescription(IInkStrokeDisp* This,VARIANT *PacketDescription) {
    return This->lpVtbl->get_PacketDescription(This,PacketDescription);
}
static FORCEINLINE HRESULT IInkStrokeDisp_get_Deleted(IInkStrokeDisp* This,VARIANT_BOOL *Deleted) {
    return This->lpVtbl->get_Deleted(This,Deleted);
}
static FORCEINLINE HRESULT IInkStrokeDisp_GetBoundingBox(IInkStrokeDisp* This,InkBoundingBoxMode BoundingBoxMode,IInkRectangle **Rectangle) {
    return This->lpVtbl->GetBoundingBox(This,BoundingBoxMode,Rectangle);
}
static FORCEINLINE HRESULT IInkStrokeDisp_FindIntersections(IInkStrokeDisp* This,IInkStrokes *Strokes,VARIANT *Intersections) {
    return This->lpVtbl->FindIntersections(This,Strokes,Intersections);
}
static FORCEINLINE HRESULT IInkStrokeDisp_GetRectangleIntersections(IInkStrokeDisp* This,IInkRectangle *Rectangle,VARIANT *Intersections) {
    return This->lpVtbl->GetRectangleIntersections(This,Rectangle,Intersections);
}
static FORCEINLINE HRESULT IInkStrokeDisp_Clip(IInkStrokeDisp* This,IInkRectangle *Rectangle) {
    return This->lpVtbl->Clip(This,Rectangle);
}
static FORCEINLINE HRESULT IInkStrokeDisp_HitTestCircle(IInkStrokeDisp* This,LONG X,LONG Y,float Radius,VARIANT_BOOL *Intersects) {
    return This->lpVtbl->HitTestCircle(This,X,Y,Radius,Intersects);
}
static FORCEINLINE HRESULT IInkStrokeDisp_NearestPoint(IInkStrokeDisp* This,LONG X,LONG Y,float *Distance,float *Point) {
    return This->lpVtbl->NearestPoint(This,X,Y,Distance,Point);
}
static FORCEINLINE HRESULT IInkStrokeDisp_Split(IInkStrokeDisp* This,float SplitAt,IInkStrokeDisp **NewStroke) {
    return This->lpVtbl->Split(This,SplitAt,NewStroke);
}
static FORCEINLINE HRESULT IInkStrokeDisp_GetPacketDescriptionPropertyMetrics(IInkStrokeDisp* This,BSTR PropertyName,LONG *Minimum,LONG *Maximum,TabletPropertyMetricUnit *Units,float *Resolution) {
    return This->lpVtbl->GetPacketDescriptionPropertyMetrics(This,PropertyName,Minimum,Maximum,Units,Resolution);
}
static FORCEINLINE HRESULT IInkStrokeDisp_GetPoints(IInkStrokeDisp* This,LONG Index,LONG Count,VARIANT *Points) {
    return This->lpVtbl->GetPoints(This,Index,Count,Points);
}
static FORCEINLINE HRESULT IInkStrokeDisp_SetPoints(IInkStrokeDisp* This,VARIANT Points,LONG Index,LONG Count,LONG *NumberOfPointsSet) {
    return This->lpVtbl->SetPoints(This,Points,Index,Count,NumberOfPointsSet);
}
static FORCEINLINE HRESULT IInkStrokeDisp_GetPacketData(IInkStrokeDisp* This,LONG Index,LONG Count,VARIANT *PacketData) {
    return This->lpVtbl->GetPacketData(This,Index,Count,PacketData);
}
static FORCEINLINE HRESULT IInkStrokeDisp_GetPacketValuesByProperty(IInkStrokeDisp* This,BSTR PropertyName,LONG Index,LONG Count,VARIANT *PacketValues) {
    return This->lpVtbl->GetPacketValuesByProperty(This,PropertyName,Index,Count,PacketValues);
}
static FORCEINLINE HRESULT IInkStrokeDisp_SetPacketValuesByProperty(IInkStrokeDisp* This,BSTR bstrPropertyName,VARIANT PacketValues,LONG Index,LONG Count,LONG *NumberOfPacketsSet) {
    return This->lpVtbl->SetPacketValuesByProperty(This,bstrPropertyName,PacketValues,Index,Count,NumberOfPacketsSet);
}
static FORCEINLINE HRESULT IInkStrokeDisp_GetFlattenedBezierPoints(IInkStrokeDisp* This,LONG FittingError,VARIANT *FlattenedBezierPoints) {
    return This->lpVtbl->GetFlattenedBezierPoints(This,FittingError,FlattenedBezierPoints);
}
static FORCEINLINE HRESULT IInkStrokeDisp_Transform(IInkStrokeDisp* This,IInkTransform *Transform,VARIANT_BOOL ApplyOnPenWidth) {
    return This->lpVtbl->Transform(This,Transform,ApplyOnPenWidth);
}
static FORCEINLINE HRESULT IInkStrokeDisp_ScaleToRectangle(IInkStrokeDisp* This,IInkRectangle *Rectangle) {
    return This->lpVtbl->ScaleToRectangle(This,Rectangle);
}
static FORCEINLINE HRESULT IInkStrokeDisp_Move(IInkStrokeDisp* This,float HorizontalComponent,float VerticalComponent) {
    return This->lpVtbl->Move(This,HorizontalComponent,VerticalComponent);
}
static FORCEINLINE HRESULT IInkStrokeDisp_Rotate(IInkStrokeDisp* This,float Degrees,float x,float y) {
    return This->lpVtbl->Rotate(This,Degrees,x,y);
}
static FORCEINLINE HRESULT IInkStrokeDisp_Shear(IInkStrokeDisp* This,float HorizontalMultiplier,float VerticalMultiplier) {
    return This->lpVtbl->Shear(This,HorizontalMultiplier,VerticalMultiplier);
}
static FORCEINLINE HRESULT IInkStrokeDisp_ScaleTransform(IInkStrokeDisp* This,float HorizontalMultiplier,float VerticalMultiplier) {
    return This->lpVtbl->ScaleTransform(This,HorizontalMultiplier,VerticalMultiplier);
}
#endif
#endif

#endif


#endif  /* __IInkStrokeDisp_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IInkCustomStrokes interface
 */
#ifndef __IInkCustomStrokes_INTERFACE_DEFINED__
#define __IInkCustomStrokes_INTERFACE_DEFINED__

DEFINE_GUID(IID_IInkCustomStrokes, 0x7e23a88f, 0xc30e, 0x420f, 0x9b,0xdb, 0x28,0x90,0x25,0x43,0xf0,0xc1);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("7e23a88f-c30e-420f-9bdb-28902543f0c1")
IInkCustomStrokes : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Count(
        LONG *Count) = 0;

    virtual HRESULT STDMETHODCALLTYPE get__NewEnum(
        IUnknown **_NewEnum) = 0;

    virtual HRESULT STDMETHODCALLTYPE Item(
        VARIANT Identifier,
        IInkStrokes **Strokes) = 0;

    virtual HRESULT STDMETHODCALLTYPE Add(
        BSTR Name,
        IInkStrokes *Strokes) = 0;

    virtual HRESULT STDMETHODCALLTYPE Remove(
        VARIANT Identifier) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clear(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IInkCustomStrokes, 0x7e23a88f, 0xc30e, 0x420f, 0x9b,0xdb, 0x28,0x90,0x25,0x43,0xf0,0xc1)
#endif
#else
typedef struct IInkCustomStrokesVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IInkCustomStrokes *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IInkCustomStrokes *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IInkCustomStrokes *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IInkCustomStrokes *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IInkCustomStrokes *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IInkCustomStrokes *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IInkCustomStrokes *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IInkCustomStrokes methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Count)(
        IInkCustomStrokes *This,
        LONG *Count);

    HRESULT (STDMETHODCALLTYPE *get__NewEnum)(
        IInkCustomStrokes *This,
        IUnknown **_NewEnum);

    HRESULT (STDMETHODCALLTYPE *Item)(
        IInkCustomStrokes *This,
        VARIANT Identifier,
        IInkStrokes **Strokes);

    HRESULT (STDMETHODCALLTYPE *Add)(
        IInkCustomStrokes *This,
        BSTR Name,
        IInkStrokes *Strokes);

    HRESULT (STDMETHODCALLTYPE *Remove)(
        IInkCustomStrokes *This,
        VARIANT Identifier);

    HRESULT (STDMETHODCALLTYPE *Clear)(
        IInkCustomStrokes *This);

    END_INTERFACE
} IInkCustomStrokesVtbl;

interface IInkCustomStrokes {
    CONST_VTBL IInkCustomStrokesVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IInkCustomStrokes_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IInkCustomStrokes_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IInkCustomStrokes_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IInkCustomStrokes_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IInkCustomStrokes_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IInkCustomStrokes_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IInkCustomStrokes_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IInkCustomStrokes methods ***/
#define IInkCustomStrokes_get_Count(This,Count) (This)->lpVtbl->get_Count(This,Count)
#define IInkCustomStrokes_get__NewEnum(This,_NewEnum) (This)->lpVtbl->get__NewEnum(This,_NewEnum)
#define IInkCustomStrokes_Item(This,Identifier,Strokes) (This)->lpVtbl->Item(This,Identifier,Strokes)
#define IInkCustomStrokes_Add(This,Name,Strokes) (This)->lpVtbl->Add(This,Name,Strokes)
#define IInkCustomStrokes_Remove(This,Identifier) (This)->lpVtbl->Remove(This,Identifier)
#define IInkCustomStrokes_Clear(This) (This)->lpVtbl->Clear(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IInkCustomStrokes_QueryInterface(IInkCustomStrokes* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IInkCustomStrokes_AddRef(IInkCustomStrokes* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IInkCustomStrokes_Release(IInkCustomStrokes* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IInkCustomStrokes_GetTypeInfoCount(IInkCustomStrokes* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IInkCustomStrokes_GetTypeInfo(IInkCustomStrokes* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IInkCustomStrokes_GetIDsOfNames(IInkCustomStrokes* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IInkCustomStrokes_Invoke(IInkCustomStrokes* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IInkCustomStrokes methods ***/
static FORCEINLINE HRESULT IInkCustomStrokes_get_Count(IInkCustomStrokes* This,LONG *Count) {
    return This->lpVtbl->get_Count(This,Count);
}
static FORCEINLINE HRESULT IInkCustomStrokes_get__NewEnum(IInkCustomStrokes* This,IUnknown **_NewEnum) {
    return This->lpVtbl->get__NewEnum(This,_NewEnum);
}
static FORCEINLINE HRESULT IInkCustomStrokes_Item(IInkCustomStrokes* This,VARIANT Identifier,IInkStrokes **Strokes) {
    return This->lpVtbl->Item(This,Identifier,Strokes);
}
static FORCEINLINE HRESULT IInkCustomStrokes_Add(IInkCustomStrokes* This,BSTR Name,IInkStrokes *Strokes) {
    return This->lpVtbl->Add(This,Name,Strokes);
}
static FORCEINLINE HRESULT IInkCustomStrokes_Remove(IInkCustomStrokes* This,VARIANT Identifier) {
    return This->lpVtbl->Remove(This,Identifier);
}
static FORCEINLINE HRESULT IInkCustomStrokes_Clear(IInkCustomStrokes* This) {
    return This->lpVtbl->Clear(This);
}
#endif
#endif

#endif


#endif  /* __IInkCustomStrokes_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IInkDisp interface
 */
#ifndef __IInkDisp_INTERFACE_DEFINED__
#define __IInkDisp_INTERFACE_DEFINED__

DEFINE_GUID(IID_IInkDisp, 0x9d398fa0, 0xc4e2, 0x4fcd, 0x99,0x73, 0x97,0x5c,0xaa,0xf4,0x7e,0xa6);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("9d398fa0-c4e2-4fcd-9973-975caaf47ea6")
IInkDisp : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Strokes(
        IInkStrokes **Strokes) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ExtendedProperties(
        IInkExtendedProperties **Properties) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Dirty(
        VARIANT_BOOL *Dirty) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Dirty(
        VARIANT_BOOL Dirty) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CustomStrokes(
        IInkCustomStrokes **ppunkInkCustomStrokes) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetBoundingBox(
        InkBoundingBoxMode BoundingBoxMode,
        IInkRectangle **Rectangle) = 0;

    virtual HRESULT STDMETHODCALLTYPE DeleteStrokes(
        IInkStrokes *Strokes = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE DeleteStroke(
        IInkStrokeDisp *Stroke) = 0;

    virtual HRESULT STDMETHODCALLTYPE ExtractStrokes(
        IInkStrokes *Strokes,
        InkExtractFlags ExtractFlags,
        IInkDisp **ExtractedInk) = 0;

    virtual HRESULT STDMETHODCALLTYPE ExtractWithRectangle(
        IInkRectangle *Rectangle,
        InkExtractFlags extractFlags,
        IInkDisp **ExtractedInk) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clip(
        IInkRectangle *Rectangle) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IInkDisp **NewInk) = 0;

    virtual HRESULT STDMETHODCALLTYPE HitTestCircle(
        LONG X,
        LONG Y,
        float radius,
        IInkStrokes **Strokes) = 0;

    virtual HRESULT STDMETHODCALLTYPE HitTestWithRectangle(
        IInkRectangle *SelectionRectangle,
        float IntersectPercent,
        IInkStrokes **Strokes) = 0;

    virtual HRESULT STDMETHODCALLTYPE HitTestWithLasso(
        VARIANT Points,
        float IntersectPercent,
        VARIANT *LassoPoints,
        IInkStrokes **Strokes) = 0;

    virtual HRESULT STDMETHODCALLTYPE NearestPoint(
        LONG X,
        LONG Y,
        float *PointOnStroke,
        float *DistanceFromPacket,
        IInkStrokeDisp **Stroke) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateStrokes(
        VARIANT StrokeIds,
        IInkStrokes **Strokes) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddStrokesAtRectangle(
        IInkStrokes *SourceStrokes,
        IInkRectangle *TargetRectangle) = 0;

    virtual HRESULT STDMETHODCALLTYPE Save(
        InkPersistenceFormat PersistenceFormat,
        InkPersistenceCompressionMode CompressionMode,
        VARIANT *Data) = 0;

    virtual HRESULT STDMETHODCALLTYPE Load(
        VARIANT Data) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateStroke(
        VARIANT PacketData,
        VARIANT PacketDescription,
        IInkStrokeDisp **Stroke) = 0;

    virtual HRESULT STDMETHODCALLTYPE ClipboardCopyWithRectangle(
        IInkRectangle *Rectangle,
        InkClipboardFormats ClipboardFormats,
        InkClipboardModes ClipboardModes,
        IDataObject **DataObject) = 0;

    virtual HRESULT STDMETHODCALLTYPE ClipboardCopy(
        IInkStrokes *strokes,
        InkClipboardFormats ClipboardFormats,
        InkClipboardModes ClipboardModes,
        IDataObject **DataObject) = 0;

    virtual HRESULT STDMETHODCALLTYPE CanPaste(
        IDataObject *DataObject,
        VARIANT_BOOL *CanPaste) = 0;

    virtual HRESULT STDMETHODCALLTYPE ClipboardPaste(
        LONG x,
        LONG y,
        IDataObject *DataObject,
        IInkStrokes **Strokes) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IInkDisp, 0x9d398fa0, 0xc4e2, 0x4fcd, 0x99,0x73, 0x97,0x5c,0xaa,0xf4,0x7e,0xa6)
#endif
#else
typedef struct IInkDispVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IInkDisp *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IInkDisp *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IInkDisp *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IInkDisp *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IInkDisp *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IInkDisp *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IInkDisp *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IInkDisp methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Strokes)(
        IInkDisp *This,
        IInkStrokes **Strokes);

    HRESULT (STDMETHODCALLTYPE *get_ExtendedProperties)(
        IInkDisp *This,
        IInkExtendedProperties **Properties);

    HRESULT (STDMETHODCALLTYPE *get_Dirty)(
        IInkDisp *This,
        VARIANT_BOOL *Dirty);

    HRESULT (STDMETHODCALLTYPE *put_Dirty)(
        IInkDisp *This,
        VARIANT_BOOL Dirty);

    HRESULT (STDMETHODCALLTYPE *get_CustomStrokes)(
        IInkDisp *This,
        IInkCustomStrokes **ppunkInkCustomStrokes);

    HRESULT (STDMETHODCALLTYPE *GetBoundingBox)(
        IInkDisp *This,
        InkBoundingBoxMode BoundingBoxMode,
        IInkRectangle **Rectangle);

    HRESULT (STDMETHODCALLTYPE *DeleteStrokes)(
        IInkDisp *This,
        IInkStrokes *Strokes);

    HRESULT (STDMETHODCALLTYPE *DeleteStroke)(
        IInkDisp *This,
        IInkStrokeDisp *Stroke);

    HRESULT (STDMETHODCALLTYPE *ExtractStrokes)(
        IInkDisp *This,
        IInkStrokes *Strokes,
        InkExtractFlags ExtractFlags,
        IInkDisp **ExtractedInk);

    HRESULT (STDMETHODCALLTYPE *ExtractWithRectangle)(
        IInkDisp *This,
        IInkRectangle *Rectangle,
        InkExtractFlags extractFlags,
        IInkDisp **ExtractedInk);

    HRESULT (STDMETHODCALLTYPE *Clip)(
        IInkDisp *This,
        IInkRectangle *Rectangle);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IInkDisp *This,
        IInkDisp **NewInk);

    HRESULT (STDMETHODCALLTYPE *HitTestCircle)(
        IInkDisp *This,
        LONG X,
        LONG Y,
        float radius,
        IInkStrokes **Strokes);

    HRESULT (STDMETHODCALLTYPE *HitTestWithRectangle)(
        IInkDisp *This,
        IInkRectangle *SelectionRectangle,
        float IntersectPercent,
        IInkStrokes **Strokes);

    HRESULT (STDMETHODCALLTYPE *HitTestWithLasso)(
        IInkDisp *This,
        VARIANT Points,
        float IntersectPercent,
        VARIANT *LassoPoints,
        IInkStrokes **Strokes);

    HRESULT (STDMETHODCALLTYPE *NearestPoint)(
        IInkDisp *This,
        LONG X,
        LONG Y,
        float *PointOnStroke,
        float *DistanceFromPacket,
        IInkStrokeDisp **Stroke);

    HRESULT (STDMETHODCALLTYPE *CreateStrokes)(
        IInkDisp *This,
        VARIANT StrokeIds,
        IInkStrokes **Strokes);

    HRESULT (STDMETHODCALLTYPE *AddStrokesAtRectangle)(
        IInkDisp *This,
        IInkStrokes *SourceStrokes,
        IInkRectangle *TargetRectangle);

    HRESULT (STDMETHODCALLTYPE *Save)(
        IInkDisp *This,
        InkPersistenceFormat PersistenceFormat,
        InkPersistenceCompressionMode CompressionMode,
        VARIANT *Data);

    HRESULT (STDMETHODCALLTYPE *Load)(
        IInkDisp *This,
        VARIANT Data);

    HRESULT (STDMETHODCALLTYPE *CreateStroke)(
        IInkDisp *This,
        VARIANT PacketData,
        VARIANT PacketDescription,
        IInkStrokeDisp **Stroke);

    HRESULT (STDMETHODCALLTYPE *ClipboardCopyWithRectangle)(
        IInkDisp *This,
        IInkRectangle *Rectangle,
        InkClipboardFormats ClipboardFormats,
        InkClipboardModes ClipboardModes,
        IDataObject **DataObject);

    HRESULT (STDMETHODCALLTYPE *ClipboardCopy)(
        IInkDisp *This,
        IInkStrokes *strokes,
        InkClipboardFormats ClipboardFormats,
        InkClipboardModes ClipboardModes,
        IDataObject **DataObject);

    HRESULT (STDMETHODCALLTYPE *CanPaste)(
        IInkDisp *This,
        IDataObject *DataObject,
        VARIANT_BOOL *CanPaste);

    HRESULT (STDMETHODCALLTYPE *ClipboardPaste)(
        IInkDisp *This,
        LONG x,
        LONG y,
        IDataObject *DataObject,
        IInkStrokes **Strokes);

    END_INTERFACE
} IInkDispVtbl;

interface IInkDisp {
    CONST_VTBL IInkDispVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IInkDisp_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IInkDisp_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IInkDisp_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IInkDisp_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IInkDisp_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IInkDisp_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IInkDisp_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IInkDisp methods ***/
#define IInkDisp_get_Strokes(This,Strokes) (This)->lpVtbl->get_Strokes(This,Strokes)
#define IInkDisp_get_ExtendedProperties(This,Properties) (This)->lpVtbl->get_ExtendedProperties(This,Properties)
#define IInkDisp_get_Dirty(This,Dirty) (This)->lpVtbl->get_Dirty(This,Dirty)
#define IInkDisp_put_Dirty(This,Dirty) (This)->lpVtbl->put_Dirty(This,Dirty)
#define IInkDisp_get_CustomStrokes(This,ppunkInkCustomStrokes) (This)->lpVtbl->get_CustomStrokes(This,ppunkInkCustomStrokes)
#define IInkDisp_GetBoundingBox(This,BoundingBoxMode,Rectangle) (This)->lpVtbl->GetBoundingBox(This,BoundingBoxMode,Rectangle)
#define IInkDisp_DeleteStrokes(This,Strokes) (This)->lpVtbl->DeleteStrokes(This,Strokes)
#define IInkDisp_DeleteStroke(This,Stroke) (This)->lpVtbl->DeleteStroke(This,Stroke)
#define IInkDisp_ExtractStrokes(This,Strokes,ExtractFlags,ExtractedInk) (This)->lpVtbl->ExtractStrokes(This,Strokes,ExtractFlags,ExtractedInk)
#define IInkDisp_ExtractWithRectangle(This,Rectangle,extractFlags,ExtractedInk) (This)->lpVtbl->ExtractWithRectangle(This,Rectangle,extractFlags,ExtractedInk)
#define IInkDisp_Clip(This,Rectangle) (This)->lpVtbl->Clip(This,Rectangle)
#define IInkDisp_Clone(This,NewInk) (This)->lpVtbl->Clone(This,NewInk)
#define IInkDisp_HitTestCircle(This,X,Y,radius,Strokes) (This)->lpVtbl->HitTestCircle(This,X,Y,radius,Strokes)
#define IInkDisp_HitTestWithRectangle(This,SelectionRectangle,IntersectPercent,Strokes) (This)->lpVtbl->HitTestWithRectangle(This,SelectionRectangle,IntersectPercent,Strokes)
#define IInkDisp_HitTestWithLasso(This,Points,IntersectPercent,LassoPoints,Strokes) (This)->lpVtbl->HitTestWithLasso(This,Points,IntersectPercent,LassoPoints,Strokes)
#define IInkDisp_NearestPoint(This,X,Y,PointOnStroke,DistanceFromPacket,Stroke) (This)->lpVtbl->NearestPoint(This,X,Y,PointOnStroke,DistanceFromPacket,Stroke)
#define IInkDisp_CreateStrokes(This,StrokeIds,Strokes) (This)->lpVtbl->CreateStrokes(This,StrokeIds,Strokes)
#define IInkDisp_AddStrokesAtRectangle(This,SourceStrokes,TargetRectangle) (This)->lpVtbl->AddStrokesAtRectangle(This,SourceStrokes,TargetRectangle)
#define IInkDisp_Save(This,PersistenceFormat,CompressionMode,Data) (This)->lpVtbl->Save(This,PersistenceFormat,CompressionMode,Data)
#define IInkDisp_Load(This,Data) (This)->lpVtbl->Load(This,Data)
#define IInkDisp_CreateStroke(This,PacketData,PacketDescription,Stroke) (This)->lpVtbl->CreateStroke(This,PacketData,PacketDescription,Stroke)
#define IInkDisp_ClipboardCopyWithRectangle(This,Rectangle,ClipboardFormats,ClipboardModes,DataObject) (This)->lpVtbl->ClipboardCopyWithRectangle(This,Rectangle,ClipboardFormats,ClipboardModes,DataObject)
#define IInkDisp_ClipboardCopy(This,strokes,ClipboardFormats,ClipboardModes,DataObject) (This)->lpVtbl->ClipboardCopy(This,strokes,ClipboardFormats,ClipboardModes,DataObject)
#define IInkDisp_CanPaste(This,DataObject,CanPaste) (This)->lpVtbl->CanPaste(This,DataObject,CanPaste)
#define IInkDisp_ClipboardPaste(This,x,y,DataObject,Strokes) (This)->lpVtbl->ClipboardPaste(This,x,y,DataObject,Strokes)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IInkDisp_QueryInterface(IInkDisp* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IInkDisp_AddRef(IInkDisp* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IInkDisp_Release(IInkDisp* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IInkDisp_GetTypeInfoCount(IInkDisp* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IInkDisp_GetTypeInfo(IInkDisp* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IInkDisp_GetIDsOfNames(IInkDisp* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IInkDisp_Invoke(IInkDisp* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IInkDisp methods ***/
static FORCEINLINE HRESULT IInkDisp_get_Strokes(IInkDisp* This,IInkStrokes **Strokes) {
    return This->lpVtbl->get_Strokes(This,Strokes);
}
static FORCEINLINE HRESULT IInkDisp_get_ExtendedProperties(IInkDisp* This,IInkExtendedProperties **Properties) {
    return This->lpVtbl->get_ExtendedProperties(This,Properties);
}
static FORCEINLINE HRESULT IInkDisp_get_Dirty(IInkDisp* This,VARIANT_BOOL *Dirty) {
    return This->lpVtbl->get_Dirty(This,Dirty);
}
static FORCEINLINE HRESULT IInkDisp_put_Dirty(IInkDisp* This,VARIANT_BOOL Dirty) {
    return This->lpVtbl->put_Dirty(This,Dirty);
}
static FORCEINLINE HRESULT IInkDisp_get_CustomStrokes(IInkDisp* This,IInkCustomStrokes **ppunkInkCustomStrokes) {
    return This->lpVtbl->get_CustomStrokes(This,ppunkInkCustomStrokes);
}
static FORCEINLINE HRESULT IInkDisp_GetBoundingBox(IInkDisp* This,InkBoundingBoxMode BoundingBoxMode,IInkRectangle **Rectangle) {
    return This->lpVtbl->GetBoundingBox(This,BoundingBoxMode,Rectangle);
}
static FORCEINLINE HRESULT IInkDisp_DeleteStrokes(IInkDisp* This,IInkStrokes *Strokes) {
    return This->lpVtbl->DeleteStrokes(This,Strokes);
}
static FORCEINLINE HRESULT IInkDisp_DeleteStroke(IInkDisp* This,IInkStrokeDisp *Stroke) {
    return This->lpVtbl->DeleteStroke(This,Stroke);
}
static FORCEINLINE HRESULT IInkDisp_ExtractStrokes(IInkDisp* This,IInkStrokes *Strokes,InkExtractFlags ExtractFlags,IInkDisp **ExtractedInk) {
    return This->lpVtbl->ExtractStrokes(This,Strokes,ExtractFlags,ExtractedInk);
}
static FORCEINLINE HRESULT IInkDisp_ExtractWithRectangle(IInkDisp* This,IInkRectangle *Rectangle,InkExtractFlags extractFlags,IInkDisp **ExtractedInk) {
    return This->lpVtbl->ExtractWithRectangle(This,Rectangle,extractFlags,ExtractedInk);
}
static FORCEINLINE HRESULT IInkDisp_Clip(IInkDisp* This,IInkRectangle *Rectangle) {
    return This->lpVtbl->Clip(This,Rectangle);
}
static FORCEINLINE HRESULT IInkDisp_Clone(IInkDisp* This,IInkDisp **NewInk) {
    return This->lpVtbl->Clone(This,NewInk);
}
static FORCEINLINE HRESULT IInkDisp_HitTestCircle(IInkDisp* This,LONG X,LONG Y,float radius,IInkStrokes **Strokes) {
    return This->lpVtbl->HitTestCircle(This,X,Y,radius,Strokes);
}
static FORCEINLINE HRESULT IInkDisp_HitTestWithRectangle(IInkDisp* This,IInkRectangle *SelectionRectangle,float IntersectPercent,IInkStrokes **Strokes) {
    return This->lpVtbl->HitTestWithRectangle(This,SelectionRectangle,IntersectPercent,Strokes);
}
static FORCEINLINE HRESULT IInkDisp_HitTestWithLasso(IInkDisp* This,VARIANT Points,float IntersectPercent,VARIANT *LassoPoints,IInkStrokes **Strokes) {
    return This->lpVtbl->HitTestWithLasso(This,Points,IntersectPercent,LassoPoints,Strokes);
}
static FORCEINLINE HRESULT IInkDisp_NearestPoint(IInkDisp* This,LONG X,LONG Y,float *PointOnStroke,float *DistanceFromPacket,IInkStrokeDisp **Stroke) {
    return This->lpVtbl->NearestPoint(This,X,Y,PointOnStroke,DistanceFromPacket,Stroke);
}
static FORCEINLINE HRESULT IInkDisp_CreateStrokes(IInkDisp* This,VARIANT StrokeIds,IInkStrokes **Strokes) {
    return This->lpVtbl->CreateStrokes(This,StrokeIds,Strokes);
}
static FORCEINLINE HRESULT IInkDisp_AddStrokesAtRectangle(IInkDisp* This,IInkStrokes *SourceStrokes,IInkRectangle *TargetRectangle) {
    return This->lpVtbl->AddStrokesAtRectangle(This,SourceStrokes,TargetRectangle);
}
static FORCEINLINE HRESULT IInkDisp_Save(IInkDisp* This,InkPersistenceFormat PersistenceFormat,InkPersistenceCompressionMode CompressionMode,VARIANT *Data) {
    return This->lpVtbl->Save(This,PersistenceFormat,CompressionMode,Data);
}
static FORCEINLINE HRESULT IInkDisp_Load(IInkDisp* This,VARIANT Data) {
    return This->lpVtbl->Load(This,Data);
}
static FORCEINLINE HRESULT IInkDisp_CreateStroke(IInkDisp* This,VARIANT PacketData,VARIANT PacketDescription,IInkStrokeDisp **Stroke) {
    return This->lpVtbl->CreateStroke(This,PacketData,PacketDescription,Stroke);
}
static FORCEINLINE HRESULT IInkDisp_ClipboardCopyWithRectangle(IInkDisp* This,IInkRectangle *Rectangle,InkClipboardFormats ClipboardFormats,InkClipboardModes ClipboardModes,IDataObject **DataObject) {
    return This->lpVtbl->ClipboardCopyWithRectangle(This,Rectangle,ClipboardFormats,ClipboardModes,DataObject);
}
static FORCEINLINE HRESULT IInkDisp_ClipboardCopy(IInkDisp* This,IInkStrokes *strokes,InkClipboardFormats ClipboardFormats,InkClipboardModes ClipboardModes,IDataObject **DataObject) {
    return This->lpVtbl->ClipboardCopy(This,strokes,ClipboardFormats,ClipboardModes,DataObject);
}
static FORCEINLINE HRESULT IInkDisp_CanPaste(IInkDisp* This,IDataObject *DataObject,VARIANT_BOOL *CanPaste) {
    return This->lpVtbl->CanPaste(This,DataObject,CanPaste);
}
static FORCEINLINE HRESULT IInkDisp_ClipboardPaste(IInkDisp* This,LONG x,LONG y,IDataObject *DataObject,IInkStrokes **Strokes) {
    return This->lpVtbl->ClipboardPaste(This,x,y,DataObject,Strokes);
}
#endif
#endif

#endif


#endif  /* __IInkDisp_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IInkStrokes interface
 */
#ifndef __IInkStrokes_INTERFACE_DEFINED__
#define __IInkStrokes_INTERFACE_DEFINED__

DEFINE_GUID(IID_IInkStrokes, 0xf1f4c9d8, 0x590a, 0x4963, 0xb3,0xae, 0x19,0x35,0x67,0x1b,0xb6,0xf3);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("f1f4c9d8-590a-4963-b3ae-1935671bb6f3")
IInkStrokes : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Count(
        LONG *Count) = 0;

    virtual HRESULT STDMETHODCALLTYPE get__NewEnum(
        IUnknown **_NewEnum) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Ink(
        IInkDisp **Ink) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_RecognitionResult(
        IInkRecognitionResult **RecognitionResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE ToString(
        BSTR *ToString) = 0;

    virtual HRESULT STDMETHODCALLTYPE Item(
        LONG Index,
        IInkStrokeDisp **Stroke) = 0;

    virtual HRESULT STDMETHODCALLTYPE Add(
        IInkStrokeDisp *InkStroke) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddStrokes(
        IInkStrokes *InkStrokes) = 0;

    virtual HRESULT STDMETHODCALLTYPE Remove(
        IInkStrokeDisp *InkStroke) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveStrokes(
        IInkStrokes *InkStrokes) = 0;

    virtual HRESULT STDMETHODCALLTYPE ModifyDrawingAttributes(
        IInkDrawingAttributes *DrawAttrs) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetBoundingBox(
        InkBoundingBoxMode BoundingBoxMode,
        IInkRectangle **BoundingBox) = 0;

    virtual HRESULT STDMETHODCALLTYPE Transform(
        IInkTransform *Transform,
        VARIANT_BOOL ApplyOnPenWidth = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE ScaleToRectangle(
        IInkRectangle *Rectangle) = 0;

    virtual HRESULT STDMETHODCALLTYPE Move(
        float HorizontalComponent,
        float VerticalComponent) = 0;

    virtual HRESULT STDMETHODCALLTYPE Rotate(
        float Degrees,
        float x = 0,
        float y = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE Shear(
        float HorizontalMultiplier,
        float VerticalMultiplier) = 0;

    virtual HRESULT STDMETHODCALLTYPE ScaleTransform(
        float HorizontalMultiplier,
        float VerticalMultiplier) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clip(
        IInkRectangle *Rectangle) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveRecognitionResult(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IInkStrokes, 0xf1f4c9d8, 0x590a, 0x4963, 0xb3,0xae, 0x19,0x35,0x67,0x1b,0xb6,0xf3)
#endif
#else
typedef struct IInkStrokesVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IInkStrokes *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IInkStrokes *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IInkStrokes *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IInkStrokes *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IInkStrokes *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IInkStrokes *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IInkStrokes *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IInkStrokes methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Count)(
        IInkStrokes *This,
        LONG *Count);

    HRESULT (STDMETHODCALLTYPE *get__NewEnum)(
        IInkStrokes *This,
        IUnknown **_NewEnum);

    HRESULT (STDMETHODCALLTYPE *get_Ink)(
        IInkStrokes *This,
        IInkDisp **Ink);

    HRESULT (STDMETHODCALLTYPE *get_RecognitionResult)(
        IInkStrokes *This,
        IInkRecognitionResult **RecognitionResult);

    HRESULT (STDMETHODCALLTYPE *ToString)(
        IInkStrokes *This,
        BSTR *ToString);

    HRESULT (STDMETHODCALLTYPE *Item)(
        IInkStrokes *This,
        LONG Index,
        IInkStrokeDisp **Stroke);

    HRESULT (STDMETHODCALLTYPE *Add)(
        IInkStrokes *This,
        IInkStrokeDisp *InkStroke);

    HRESULT (STDMETHODCALLTYPE *AddStrokes)(
        IInkStrokes *This,
        IInkStrokes *InkStrokes);

    HRESULT (STDMETHODCALLTYPE *Remove)(
        IInkStrokes *This,
        IInkStrokeDisp *InkStroke);

    HRESULT (STDMETHODCALLTYPE *RemoveStrokes)(
        IInkStrokes *This,
        IInkStrokes *InkStrokes);

    HRESULT (STDMETHODCALLTYPE *ModifyDrawingAttributes)(
        IInkStrokes *This,
        IInkDrawingAttributes *DrawAttrs);

    HRESULT (STDMETHODCALLTYPE *GetBoundingBox)(
        IInkStrokes *This,
        InkBoundingBoxMode BoundingBoxMode,
        IInkRectangle **BoundingBox);

    HRESULT (STDMETHODCALLTYPE *Transform)(
        IInkStrokes *This,
        IInkTransform *Transform,
        VARIANT_BOOL ApplyOnPenWidth);

    HRESULT (STDMETHODCALLTYPE *ScaleToRectangle)(
        IInkStrokes *This,
        IInkRectangle *Rectangle);

    HRESULT (STDMETHODCALLTYPE *Move)(
        IInkStrokes *This,
        float HorizontalComponent,
        float VerticalComponent);

    HRESULT (STDMETHODCALLTYPE *Rotate)(
        IInkStrokes *This,
        float Degrees,
        float x,
        float y);

    HRESULT (STDMETHODCALLTYPE *Shear)(
        IInkStrokes *This,
        float HorizontalMultiplier,
        float VerticalMultiplier);

    HRESULT (STDMETHODCALLTYPE *ScaleTransform)(
        IInkStrokes *This,
        float HorizontalMultiplier,
        float VerticalMultiplier);

    HRESULT (STDMETHODCALLTYPE *Clip)(
        IInkStrokes *This,
        IInkRectangle *Rectangle);

    HRESULT (STDMETHODCALLTYPE *RemoveRecognitionResult)(
        IInkStrokes *This);

    END_INTERFACE
} IInkStrokesVtbl;

interface IInkStrokes {
    CONST_VTBL IInkStrokesVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IInkStrokes_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IInkStrokes_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IInkStrokes_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IInkStrokes_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IInkStrokes_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IInkStrokes_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IInkStrokes_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IInkStrokes methods ***/
#define IInkStrokes_get_Count(This,Count) (This)->lpVtbl->get_Count(This,Count)
#define IInkStrokes_get__NewEnum(This,_NewEnum) (This)->lpVtbl->get__NewEnum(This,_NewEnum)
#define IInkStrokes_get_Ink(This,Ink) (This)->lpVtbl->get_Ink(This,Ink)
#define IInkStrokes_get_RecognitionResult(This,RecognitionResult) (This)->lpVtbl->get_RecognitionResult(This,RecognitionResult)
#define IInkStrokes_ToString(This,ToString) (This)->lpVtbl->ToString(This,ToString)
#define IInkStrokes_Item(This,Index,Stroke) (This)->lpVtbl->Item(This,Index,Stroke)
#define IInkStrokes_Add(This,InkStroke) (This)->lpVtbl->Add(This,InkStroke)
#define IInkStrokes_AddStrokes(This,InkStrokes) (This)->lpVtbl->AddStrokes(This,InkStrokes)
#define IInkStrokes_Remove(This,InkStroke) (This)->lpVtbl->Remove(This,InkStroke)
#define IInkStrokes_RemoveStrokes(This,InkStrokes) (This)->lpVtbl->RemoveStrokes(This,InkStrokes)
#define IInkStrokes_ModifyDrawingAttributes(This,DrawAttrs) (This)->lpVtbl->ModifyDrawingAttributes(This,DrawAttrs)
#define IInkStrokes_GetBoundingBox(This,BoundingBoxMode,BoundingBox) (This)->lpVtbl->GetBoundingBox(This,BoundingBoxMode,BoundingBox)
#define IInkStrokes_Transform(This,Transform,ApplyOnPenWidth) (This)->lpVtbl->Transform(This,Transform,ApplyOnPenWidth)
#define IInkStrokes_ScaleToRectangle(This,Rectangle) (This)->lpVtbl->ScaleToRectangle(This,Rectangle)
#define IInkStrokes_Move(This,HorizontalComponent,VerticalComponent) (This)->lpVtbl->Move(This,HorizontalComponent,VerticalComponent)
#define IInkStrokes_Rotate(This,Degrees,x,y) (This)->lpVtbl->Rotate(This,Degrees,x,y)
#define IInkStrokes_Shear(This,HorizontalMultiplier,VerticalMultiplier) (This)->lpVtbl->Shear(This,HorizontalMultiplier,VerticalMultiplier)
#define IInkStrokes_ScaleTransform(This,HorizontalMultiplier,VerticalMultiplier) (This)->lpVtbl->ScaleTransform(This,HorizontalMultiplier,VerticalMultiplier)
#define IInkStrokes_Clip(This,Rectangle) (This)->lpVtbl->Clip(This,Rectangle)
#define IInkStrokes_RemoveRecognitionResult(This) (This)->lpVtbl->RemoveRecognitionResult(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IInkStrokes_QueryInterface(IInkStrokes* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IInkStrokes_AddRef(IInkStrokes* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IInkStrokes_Release(IInkStrokes* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IInkStrokes_GetTypeInfoCount(IInkStrokes* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IInkStrokes_GetTypeInfo(IInkStrokes* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IInkStrokes_GetIDsOfNames(IInkStrokes* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IInkStrokes_Invoke(IInkStrokes* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IInkStrokes methods ***/
static FORCEINLINE HRESULT IInkStrokes_get_Count(IInkStrokes* This,LONG *Count) {
    return This->lpVtbl->get_Count(This,Count);
}
static FORCEINLINE HRESULT IInkStrokes_get__NewEnum(IInkStrokes* This,IUnknown **_NewEnum) {
    return This->lpVtbl->get__NewEnum(This,_NewEnum);
}
static FORCEINLINE HRESULT IInkStrokes_get_Ink(IInkStrokes* This,IInkDisp **Ink) {
    return This->lpVtbl->get_Ink(This,Ink);
}
static FORCEINLINE HRESULT IInkStrokes_get_RecognitionResult(IInkStrokes* This,IInkRecognitionResult **RecognitionResult) {
    return This->lpVtbl->get_RecognitionResult(This,RecognitionResult);
}
static FORCEINLINE HRESULT IInkStrokes_ToString(IInkStrokes* This,BSTR *ToString) {
    return This->lpVtbl->ToString(This,ToString);
}
static FORCEINLINE HRESULT IInkStrokes_Item(IInkStrokes* This,LONG Index,IInkStrokeDisp **Stroke) {
    return This->lpVtbl->Item(This,Index,Stroke);
}
static FORCEINLINE HRESULT IInkStrokes_Add(IInkStrokes* This,IInkStrokeDisp *InkStroke) {
    return This->lpVtbl->Add(This,InkStroke);
}
static FORCEINLINE HRESULT IInkStrokes_AddStrokes(IInkStrokes* This,IInkStrokes *InkStrokes) {
    return This->lpVtbl->AddStrokes(This,InkStrokes);
}
static FORCEINLINE HRESULT IInkStrokes_Remove(IInkStrokes* This,IInkStrokeDisp *InkStroke) {
    return This->lpVtbl->Remove(This,InkStroke);
}
static FORCEINLINE HRESULT IInkStrokes_RemoveStrokes(IInkStrokes* This,IInkStrokes *InkStrokes) {
    return This->lpVtbl->RemoveStrokes(This,InkStrokes);
}
static FORCEINLINE HRESULT IInkStrokes_ModifyDrawingAttributes(IInkStrokes* This,IInkDrawingAttributes *DrawAttrs) {
    return This->lpVtbl->ModifyDrawingAttributes(This,DrawAttrs);
}
static FORCEINLINE HRESULT IInkStrokes_GetBoundingBox(IInkStrokes* This,InkBoundingBoxMode BoundingBoxMode,IInkRectangle **BoundingBox) {
    return This->lpVtbl->GetBoundingBox(This,BoundingBoxMode,BoundingBox);
}
static FORCEINLINE HRESULT IInkStrokes_Transform(IInkStrokes* This,IInkTransform *Transform,VARIANT_BOOL ApplyOnPenWidth) {
    return This->lpVtbl->Transform(This,Transform,ApplyOnPenWidth);
}
static FORCEINLINE HRESULT IInkStrokes_ScaleToRectangle(IInkStrokes* This,IInkRectangle *Rectangle) {
    return This->lpVtbl->ScaleToRectangle(This,Rectangle);
}
static FORCEINLINE HRESULT IInkStrokes_Move(IInkStrokes* This,float HorizontalComponent,float VerticalComponent) {
    return This->lpVtbl->Move(This,HorizontalComponent,VerticalComponent);
}
static FORCEINLINE HRESULT IInkStrokes_Rotate(IInkStrokes* This,float Degrees,float x,float y) {
    return This->lpVtbl->Rotate(This,Degrees,x,y);
}
static FORCEINLINE HRESULT IInkStrokes_Shear(IInkStrokes* This,float HorizontalMultiplier,float VerticalMultiplier) {
    return This->lpVtbl->Shear(This,HorizontalMultiplier,VerticalMultiplier);
}
static FORCEINLINE HRESULT IInkStrokes_ScaleTransform(IInkStrokes* This,float HorizontalMultiplier,float VerticalMultiplier) {
    return This->lpVtbl->ScaleTransform(This,HorizontalMultiplier,VerticalMultiplier);
}
static FORCEINLINE HRESULT IInkStrokes_Clip(IInkStrokes* This,IInkRectangle *Rectangle) {
    return This->lpVtbl->Clip(This,Rectangle);
}
static FORCEINLINE HRESULT IInkStrokes_RemoveRecognitionResult(IInkStrokes* This) {
    return This->lpVtbl->RemoveRecognitionResult(This);
}
#endif
#endif

#endif


#endif  /* __IInkStrokes_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IInkRenderer interface
 */
#ifndef __IInkRenderer_INTERFACE_DEFINED__
#define __IInkRenderer_INTERFACE_DEFINED__

DEFINE_GUID(IID_IInkRenderer, 0xe6257a9c, 0xb511, 0x4f4c, 0xa8,0xb0, 0xa7,0xdb,0xc9,0x50,0x6b,0x83);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("e6257a9c-b511-4f4c-a8b0-a7dbc9506b83")
IInkRenderer : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE GetViewTransform(
        IInkTransform *ViewTransform) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetViewTransform(
        IInkTransform *ViewTransform) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetObjectTransform(
        IInkTransform *ObjectTransform) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetObjectTransform(
        IInkTransform *ObjectTransform) = 0;

    virtual HRESULT STDMETHODCALLTYPE Draw(
        LONG_PTR hDC,
        IInkStrokes *Strokes) = 0;

    virtual HRESULT STDMETHODCALLTYPE DrawStroke(
        LONG_PTR hDC,
        IInkStrokeDisp *Stroke,
        IInkDrawingAttributes *DrawingAttributes = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE PixelToInkSpace(
        LONG_PTR hDC,
        LONG *x,
        LONG *y) = 0;

    virtual HRESULT STDMETHODCALLTYPE InkSpaceToPixel(
        LONG_PTR hdcDisplay,
        LONG *x,
        LONG *y) = 0;

    virtual HRESULT STDMETHODCALLTYPE PixelToInkSpaceFromPoints(
        LONG_PTR hDC,
        VARIANT *Points) = 0;

    virtual HRESULT STDMETHODCALLTYPE InkSpaceToPixelFromPoints(
        LONG_PTR hDC,
        VARIANT *Points) = 0;

    virtual HRESULT STDMETHODCALLTYPE Measure(
        IInkStrokes *Strokes,
        IInkRectangle **Rectangle) = 0;

    virtual HRESULT STDMETHODCALLTYPE MeasureStroke(
        IInkStrokeDisp *Stroke,
        IInkDrawingAttributes *DrawingAttributes,
        IInkRectangle **Rectangle) = 0;

    virtual HRESULT STDMETHODCALLTYPE Move(
        float HorizontalComponent,
        float VerticalComponent) = 0;

    virtual HRESULT STDMETHODCALLTYPE Rotate(
        float Degrees,
        float x = 0,
        float y = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE ScaleTransform(
        float HorizontalMultiplier,
        float VerticalMultiplier,
        VARIANT_BOOL ApplyOnPenWidth = -1) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IInkRenderer, 0xe6257a9c, 0xb511, 0x4f4c, 0xa8,0xb0, 0xa7,0xdb,0xc9,0x50,0x6b,0x83)
#endif
#else
typedef struct IInkRendererVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IInkRenderer *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IInkRenderer *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IInkRenderer *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IInkRenderer *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IInkRenderer *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IInkRenderer *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IInkRenderer *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IInkRenderer methods ***/
    HRESULT (STDMETHODCALLTYPE *GetViewTransform)(
        IInkRenderer *This,
        IInkTransform *ViewTransform);

    HRESULT (STDMETHODCALLTYPE *SetViewTransform)(
        IInkRenderer *This,
        IInkTransform *ViewTransform);

    HRESULT (STDMETHODCALLTYPE *GetObjectTransform)(
        IInkRenderer *This,
        IInkTransform *ObjectTransform);

    HRESULT (STDMETHODCALLTYPE *SetObjectTransform)(
        IInkRenderer *This,
        IInkTransform *ObjectTransform);

    HRESULT (STDMETHODCALLTYPE *Draw)(
        IInkRenderer *This,
        LONG_PTR hDC,
        IInkStrokes *Strokes);

    HRESULT (STDMETHODCALLTYPE *DrawStroke)(
        IInkRenderer *This,
        LONG_PTR hDC,
        IInkStrokeDisp *Stroke,
        IInkDrawingAttributes *DrawingAttributes);

    HRESULT (STDMETHODCALLTYPE *PixelToInkSpace)(
        IInkRenderer *This,
        LONG_PTR hDC,
        LONG *x,
        LONG *y);

    HRESULT (STDMETHODCALLTYPE *InkSpaceToPixel)(
        IInkRenderer *This,
        LONG_PTR hdcDisplay,
        LONG *x,
        LONG *y);

    HRESULT (STDMETHODCALLTYPE *PixelToInkSpaceFromPoints)(
        IInkRenderer *This,
        LONG_PTR hDC,
        VARIANT *Points);

    HRESULT (STDMETHODCALLTYPE *InkSpaceToPixelFromPoints)(
        IInkRenderer *This,
        LONG_PTR hDC,
        VARIANT *Points);

    HRESULT (STDMETHODCALLTYPE *Measure)(
        IInkRenderer *This,
        IInkStrokes *Strokes,
        IInkRectangle **Rectangle);

    HRESULT (STDMETHODCALLTYPE *MeasureStroke)(
        IInkRenderer *This,
        IInkStrokeDisp *Stroke,
        IInkDrawingAttributes *DrawingAttributes,
        IInkRectangle **Rectangle);

    HRESULT (STDMETHODCALLTYPE *Move)(
        IInkRenderer *This,
        float HorizontalComponent,
        float VerticalComponent);

    HRESULT (STDMETHODCALLTYPE *Rotate)(
        IInkRenderer *This,
        float Degrees,
        float x,
        float y);

    HRESULT (STDMETHODCALLTYPE *ScaleTransform)(
        IInkRenderer *This,
        float HorizontalMultiplier,
        float VerticalMultiplier,
        VARIANT_BOOL ApplyOnPenWidth);

    END_INTERFACE
} IInkRendererVtbl;

interface IInkRenderer {
    CONST_VTBL IInkRendererVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IInkRenderer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IInkRenderer_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IInkRenderer_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IInkRenderer_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IInkRenderer_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IInkRenderer_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IInkRenderer_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IInkRenderer methods ***/
#define IInkRenderer_GetViewTransform(This,ViewTransform) (This)->lpVtbl->GetViewTransform(This,ViewTransform)
#define IInkRenderer_SetViewTransform(This,ViewTransform) (This)->lpVtbl->SetViewTransform(This,ViewTransform)
#define IInkRenderer_GetObjectTransform(This,ObjectTransform) (This)->lpVtbl->GetObjectTransform(This,ObjectTransform)
#define IInkRenderer_SetObjectTransform(This,ObjectTransform) (This)->lpVtbl->SetObjectTransform(This,ObjectTransform)
#define IInkRenderer_Draw(This,hDC,Strokes) (This)->lpVtbl->Draw(This,hDC,Strokes)
#define IInkRenderer_DrawStroke(This,hDC,Stroke,DrawingAttributes) (This)->lpVtbl->DrawStroke(This,hDC,Stroke,DrawingAttributes)
#define IInkRenderer_PixelToInkSpace(This,hDC,x,y) (This)->lpVtbl->PixelToInkSpace(This,hDC,x,y)
#define IInkRenderer_InkSpaceToPixel(This,hdcDisplay,x,y) (This)->lpVtbl->InkSpaceToPixel(This,hdcDisplay,x,y)
#define IInkRenderer_PixelToInkSpaceFromPoints(This,hDC,Points) (This)->lpVtbl->PixelToInkSpaceFromPoints(This,hDC,Points)
#define IInkRenderer_InkSpaceToPixelFromPoints(This,hDC,Points) (This)->lpVtbl->InkSpaceToPixelFromPoints(This,hDC,Points)
#define IInkRenderer_Measure(This,Strokes,Rectangle) (This)->lpVtbl->Measure(This,Strokes,Rectangle)
#define IInkRenderer_MeasureStroke(This,Stroke,DrawingAttributes,Rectangle) (This)->lpVtbl->MeasureStroke(This,Stroke,DrawingAttributes,Rectangle)
#define IInkRenderer_Move(This,HorizontalComponent,VerticalComponent) (This)->lpVtbl->Move(This,HorizontalComponent,VerticalComponent)
#define IInkRenderer_Rotate(This,Degrees,x,y) (This)->lpVtbl->Rotate(This,Degrees,x,y)
#define IInkRenderer_ScaleTransform(This,HorizontalMultiplier,VerticalMultiplier,ApplyOnPenWidth) (This)->lpVtbl->ScaleTransform(This,HorizontalMultiplier,VerticalMultiplier,ApplyOnPenWidth)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IInkRenderer_QueryInterface(IInkRenderer* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IInkRenderer_AddRef(IInkRenderer* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IInkRenderer_Release(IInkRenderer* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IInkRenderer_GetTypeInfoCount(IInkRenderer* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IInkRenderer_GetTypeInfo(IInkRenderer* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IInkRenderer_GetIDsOfNames(IInkRenderer* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IInkRenderer_Invoke(IInkRenderer* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IInkRenderer methods ***/
static FORCEINLINE HRESULT IInkRenderer_GetViewTransform(IInkRenderer* This,IInkTransform *ViewTransform) {
    return This->lpVtbl->GetViewTransform(This,ViewTransform);
}
static FORCEINLINE HRESULT IInkRenderer_SetViewTransform(IInkRenderer* This,IInkTransform *ViewTransform) {
    return This->lpVtbl->SetViewTransform(This,ViewTransform);
}
static FORCEINLINE HRESULT IInkRenderer_GetObjectTransform(IInkRenderer* This,IInkTransform *ObjectTransform) {
    return This->lpVtbl->GetObjectTransform(This,ObjectTransform);
}
static FORCEINLINE HRESULT IInkRenderer_SetObjectTransform(IInkRenderer* This,IInkTransform *ObjectTransform) {
    return This->lpVtbl->SetObjectTransform(This,ObjectTransform);
}
static FORCEINLINE HRESULT IInkRenderer_Draw(IInkRenderer* This,LONG_PTR hDC,IInkStrokes *Strokes) {
    return This->lpVtbl->Draw(This,hDC,Strokes);
}
static FORCEINLINE HRESULT IInkRenderer_DrawStroke(IInkRenderer* This,LONG_PTR hDC,IInkStrokeDisp *Stroke,IInkDrawingAttributes *DrawingAttributes) {
    return This->lpVtbl->DrawStroke(This,hDC,Stroke,DrawingAttributes);
}
static FORCEINLINE HRESULT IInkRenderer_PixelToInkSpace(IInkRenderer* This,LONG_PTR hDC,LONG *x,LONG *y) {
    return This->lpVtbl->PixelToInkSpace(This,hDC,x,y);
}
static FORCEINLINE HRESULT IInkRenderer_InkSpaceToPixel(IInkRenderer* This,LONG_PTR hdcDisplay,LONG *x,LONG *y) {
    return This->lpVtbl->InkSpaceToPixel(This,hdcDisplay,x,y);
}
static FORCEINLINE HRESULT IInkRenderer_PixelToInkSpaceFromPoints(IInkRenderer* This,LONG_PTR hDC,VARIANT *Points) {
    return This->lpVtbl->PixelToInkSpaceFromPoints(This,hDC,Points);
}
static FORCEINLINE HRESULT IInkRenderer_InkSpaceToPixelFromPoints(IInkRenderer* This,LONG_PTR hDC,VARIANT *Points) {
    return This->lpVtbl->InkSpaceToPixelFromPoints(This,hDC,Points);
}
static FORCEINLINE HRESULT IInkRenderer_Measure(IInkRenderer* This,IInkStrokes *Strokes,IInkRectangle **Rectangle) {
    return This->lpVtbl->Measure(This,Strokes,Rectangle);
}
static FORCEINLINE HRESULT IInkRenderer_MeasureStroke(IInkRenderer* This,IInkStrokeDisp *Stroke,IInkDrawingAttributes *DrawingAttributes,IInkRectangle **Rectangle) {
    return This->lpVtbl->MeasureStroke(This,Stroke,DrawingAttributes,Rectangle);
}
static FORCEINLINE HRESULT IInkRenderer_Move(IInkRenderer* This,float HorizontalComponent,float VerticalComponent) {
    return This->lpVtbl->Move(This,HorizontalComponent,VerticalComponent);
}
static FORCEINLINE HRESULT IInkRenderer_Rotate(IInkRenderer* This,float Degrees,float x,float y) {
    return This->lpVtbl->Rotate(This,Degrees,x,y);
}
static FORCEINLINE HRESULT IInkRenderer_ScaleTransform(IInkRenderer* This,float HorizontalMultiplier,float VerticalMultiplier,VARIANT_BOOL ApplyOnPenWidth) {
    return This->lpVtbl->ScaleTransform(This,HorizontalMultiplier,VerticalMultiplier,ApplyOnPenWidth);
}
#endif
#endif

#endif


#endif  /* __IInkRenderer_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IInkCursors interface
 */
#ifndef __IInkCursors_INTERFACE_DEFINED__
#define __IInkCursors_INTERFACE_DEFINED__

DEFINE_GUID(IID_IInkCursors, 0xa248c1ac, 0xc698, 0x4e06, 0x9e,0x5c, 0xd5,0x7f,0x77,0xc7,0xe6,0x47);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a248c1ac-c698-4e06-9e5c-d57f77c7e647")
IInkCursors : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Count(
        LONG *Count) = 0;

    virtual HRESULT STDMETHODCALLTYPE get__NewEnum(
        IUnknown **_NewEnum) = 0;

    virtual HRESULT STDMETHODCALLTYPE Item(
        LONG Index,
        IInkCursor **Cursor) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IInkCursors, 0xa248c1ac, 0xc698, 0x4e06, 0x9e,0x5c, 0xd5,0x7f,0x77,0xc7,0xe6,0x47)
#endif
#else
typedef struct IInkCursorsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IInkCursors *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IInkCursors *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IInkCursors *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IInkCursors *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IInkCursors *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IInkCursors *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IInkCursors *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IInkCursors methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Count)(
        IInkCursors *This,
        LONG *Count);

    HRESULT (STDMETHODCALLTYPE *get__NewEnum)(
        IInkCursors *This,
        IUnknown **_NewEnum);

    HRESULT (STDMETHODCALLTYPE *Item)(
        IInkCursors *This,
        LONG Index,
        IInkCursor **Cursor);

    END_INTERFACE
} IInkCursorsVtbl;

interface IInkCursors {
    CONST_VTBL IInkCursorsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IInkCursors_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IInkCursors_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IInkCursors_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IInkCursors_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IInkCursors_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IInkCursors_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IInkCursors_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IInkCursors methods ***/
#define IInkCursors_get_Count(This,Count) (This)->lpVtbl->get_Count(This,Count)
#define IInkCursors_get__NewEnum(This,_NewEnum) (This)->lpVtbl->get__NewEnum(This,_NewEnum)
#define IInkCursors_Item(This,Index,Cursor) (This)->lpVtbl->Item(This,Index,Cursor)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IInkCursors_QueryInterface(IInkCursors* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IInkCursors_AddRef(IInkCursors* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IInkCursors_Release(IInkCursors* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IInkCursors_GetTypeInfoCount(IInkCursors* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IInkCursors_GetTypeInfo(IInkCursors* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IInkCursors_GetIDsOfNames(IInkCursors* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IInkCursors_Invoke(IInkCursors* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IInkCursors methods ***/
static FORCEINLINE HRESULT IInkCursors_get_Count(IInkCursors* This,LONG *Count) {
    return This->lpVtbl->get_Count(This,Count);
}
static FORCEINLINE HRESULT IInkCursors_get__NewEnum(IInkCursors* This,IUnknown **_NewEnum) {
    return This->lpVtbl->get__NewEnum(This,_NewEnum);
}
static FORCEINLINE HRESULT IInkCursors_Item(IInkCursors* This,LONG Index,IInkCursor **Cursor) {
    return This->lpVtbl->Item(This,Index,Cursor);
}
#endif
#endif

#endif


#endif  /* __IInkCursors_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IInkCollector interface
 */
#ifndef __IInkCollector_INTERFACE_DEFINED__
#define __IInkCollector_INTERFACE_DEFINED__

DEFINE_GUID(IID_IInkCollector, 0xf0f060b5, 0x8b1f, 0x4a7c, 0x89,0xec, 0x88,0x06,0x92,0x58,0x8a,0x4f);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("f0f060b5-8b1f-4a7c-89ec-880692588a4f")
IInkCollector : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_hWnd(
        LONG_PTR *CurrentWindow) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_hWnd(
        LONG_PTR NewWindow) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Enabled(
        VARIANT_BOOL *Collecting) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Enabled(
        VARIANT_BOOL Collecting) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_DefaultDrawingAttributes(
        IInkDrawingAttributes **CurrentAttributes) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_DefaultDrawingAttributes(
        IInkDrawingAttributes *NewAttributes) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Renderer(
        IInkRenderer **CurrentInkRenderer) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_Renderer(
        IInkRenderer *NewInkRenderer) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Ink(
        IInkDisp **Ink) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_Ink(
        IInkDisp *NewInk) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_AutoRedraw(
        VARIANT_BOOL *AutoRedraw) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_AutoRedraw(
        VARIANT_BOOL AutoRedraw) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CollectingInk(
        VARIANT_BOOL *Collecting) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CollectionMode(
        InkCollectionMode *Mode) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_CollectionMode(
        InkCollectionMode Mode) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_DynamicRendering(
        VARIANT_BOOL *Enabled) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_DynamicRendering(
        VARIANT_BOOL Enabled) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_DesiredPacketDescription(
        VARIANT *PacketGuids) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_DesiredPacketDescription(
        VARIANT PacketGuids) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_MouseIcon(
        IPictureDisp **MouseIcon) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_MouseIcon(
        IPictureDisp *MouseIcon) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_MouseIcon(
        IPictureDisp *MouseIcon) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_MousePointer(
        InkMousePointer *MousePointer) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_MousePointer(
        InkMousePointer MousePointer) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Cursors(
        IInkCursors **Cursors) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_MarginX(
        LONG *MarginX) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_MarginX(
        LONG MarginX) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_MarginY(
        LONG *MarginY) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_MarginY(
        LONG MarginY) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Tablet(
        IInkTablet **SingleTablet) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_SupportHighContrastInk(
        VARIANT_BOOL *Support) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_SupportHighContrastInk(
        VARIANT_BOOL Support) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetGestureStatus(
        InkApplicationGesture Gesture,
        VARIANT_BOOL Listen) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetGestureStatus(
        InkApplicationGesture Gesture,
        VARIANT_BOOL *Listening) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetWindowInputRectangle(
        IInkRectangle **WindowInputRectangle) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetWindowInputRectangle(
        IInkRectangle *WindowInputRectangle) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetAllTabletsMode(
        VARIANT_BOOL UseMouseForInput = -1) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSingleTabletIntegratedMode(
        IInkTablet *Tablet) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetEventInterest(
        InkCollectorEventInterest EventId,
        VARIANT_BOOL *Listen) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetEventInterest(
        InkCollectorEventInterest EventId,
        VARIANT_BOOL Listen) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IInkCollector, 0xf0f060b5, 0x8b1f, 0x4a7c, 0x89,0xec, 0x88,0x06,0x92,0x58,0x8a,0x4f)
#endif
#else
typedef struct IInkCollectorVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IInkCollector *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IInkCollector *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IInkCollector *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IInkCollector *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IInkCollector *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IInkCollector *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IInkCollector *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IInkCollector methods ***/
    HRESULT (STDMETHODCALLTYPE *get_hWnd)(
        IInkCollector *This,
        LONG_PTR *CurrentWindow);

    HRESULT (STDMETHODCALLTYPE *put_hWnd)(
        IInkCollector *This,
        LONG_PTR NewWindow);

    HRESULT (STDMETHODCALLTYPE *get_Enabled)(
        IInkCollector *This,
        VARIANT_BOOL *Collecting);

    HRESULT (STDMETHODCALLTYPE *put_Enabled)(
        IInkCollector *This,
        VARIANT_BOOL Collecting);

    HRESULT (STDMETHODCALLTYPE *get_DefaultDrawingAttributes)(
        IInkCollector *This,
        IInkDrawingAttributes **CurrentAttributes);

    HRESULT (STDMETHODCALLTYPE *putref_DefaultDrawingAttributes)(
        IInkCollector *This,
        IInkDrawingAttributes *NewAttributes);

    HRESULT (STDMETHODCALLTYPE *get_Renderer)(
        IInkCollector *This,
        IInkRenderer **CurrentInkRenderer);

    HRESULT (STDMETHODCALLTYPE *putref_Renderer)(
        IInkCollector *This,
        IInkRenderer *NewInkRenderer);

    HRESULT (STDMETHODCALLTYPE *get_Ink)(
        IInkCollector *This,
        IInkDisp **Ink);

    HRESULT (STDMETHODCALLTYPE *putref_Ink)(
        IInkCollector *This,
        IInkDisp *NewInk);

    HRESULT (STDMETHODCALLTYPE *get_AutoRedraw)(
        IInkCollector *This,
        VARIANT_BOOL *AutoRedraw);

    HRESULT (STDMETHODCALLTYPE *put_AutoRedraw)(
        IInkCollector *This,
        VARIANT_BOOL AutoRedraw);

    HRESULT (STDMETHODCALLTYPE *get_CollectingInk)(
        IInkCollector *This,
        VARIANT_BOOL *Collecting);

    HRESULT (STDMETHODCALLTYPE *get_CollectionMode)(
        IInkCollector *This,
        InkCollectionMode *Mode);

    HRESULT (STDMETHODCALLTYPE *put_CollectionMode)(
        IInkCollector *This,
        InkCollectionMode Mode);

    HRESULT (STDMETHODCALLTYPE *get_DynamicRendering)(
        IInkCollector *This,
        VARIANT_BOOL *Enabled);

    HRESULT (STDMETHODCALLTYPE *put_DynamicRendering)(
        IInkCollector *This,
        VARIANT_BOOL Enabled);

    HRESULT (STDMETHODCALLTYPE *get_DesiredPacketDescription)(
        IInkCollector *This,
        VARIANT *PacketGuids);

    HRESULT (STDMETHODCALLTYPE *put_DesiredPacketDescription)(
        IInkCollector *This,
        VARIANT PacketGuids);

    HRESULT (STDMETHODCALLTYPE *get_MouseIcon)(
        IInkCollector *This,
        IPictureDisp **MouseIcon);

    HRESULT (STDMETHODCALLTYPE *put_MouseIcon)(
        IInkCollector *This,
        IPictureDisp *MouseIcon);

    HRESULT (STDMETHODCALLTYPE *putref_MouseIcon)(
        IInkCollector *This,
        IPictureDisp *MouseIcon);

    HRESULT (STDMETHODCALLTYPE *get_MousePointer)(
        IInkCollector *This,
        InkMousePointer *MousePointer);

    HRESULT (STDMETHODCALLTYPE *put_MousePointer)(
        IInkCollector *This,
        InkMousePointer MousePointer);

    HRESULT (STDMETHODCALLTYPE *get_Cursors)(
        IInkCollector *This,
        IInkCursors **Cursors);

    HRESULT (STDMETHODCALLTYPE *get_MarginX)(
        IInkCollector *This,
        LONG *MarginX);

    HRESULT (STDMETHODCALLTYPE *put_MarginX)(
        IInkCollector *This,
        LONG MarginX);

    HRESULT (STDMETHODCALLTYPE *get_MarginY)(
        IInkCollector *This,
        LONG *MarginY);

    HRESULT (STDMETHODCALLTYPE *put_MarginY)(
        IInkCollector *This,
        LONG MarginY);

    HRESULT (STDMETHODCALLTYPE *get_Tablet)(
        IInkCollector *This,
        IInkTablet **SingleTablet);

    HRESULT (STDMETHODCALLTYPE *get_SupportHighContrastInk)(
        IInkCollector *This,
        VARIANT_BOOL *Support);

    HRESULT (STDMETHODCALLTYPE *put_SupportHighContrastInk)(
        IInkCollector *This,
        VARIANT_BOOL Support);

    HRESULT (STDMETHODCALLTYPE *SetGestureStatus)(
        IInkCollector *This,
        InkApplicationGesture Gesture,
        VARIANT_BOOL Listen);

    HRESULT (STDMETHODCALLTYPE *GetGestureStatus)(
        IInkCollector *This,
        InkApplicationGesture Gesture,
        VARIANT_BOOL *Listening);

    HRESULT (STDMETHODCALLTYPE *GetWindowInputRectangle)(
        IInkCollector *This,
        IInkRectangle **WindowInputRectangle);

    HRESULT (STDMETHODCALLTYPE *SetWindowInputRectangle)(
        IInkCollector *This,
        IInkRectangle *WindowInputRectangle);

    HRESULT (STDMETHODCALLTYPE *SetAllTabletsMode)(
        IInkCollector *This,
        VARIANT_BOOL UseMouseForInput);

    HRESULT (STDMETHODCALLTYPE *SetSingleTabletIntegratedMode)(
        IInkCollector *This,
        IInkTablet *Tablet);

    HRESULT (STDMETHODCALLTYPE *GetEventInterest)(
        IInkCollector *This,
        InkCollectorEventInterest EventId,
        VARIANT_BOOL *Listen);

    HRESULT (STDMETHODCALLTYPE *SetEventInterest)(
        IInkCollector *This,
        InkCollectorEventInterest EventId,
        VARIANT_BOOL Listen);

    END_INTERFACE
} IInkCollectorVtbl;

interface IInkCollector {
    CONST_VTBL IInkCollectorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IInkCollector_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IInkCollector_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IInkCollector_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IInkCollector_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IInkCollector_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IInkCollector_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IInkCollector_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IInkCollector methods ***/
#define IInkCollector_get_hWnd(This,CurrentWindow) (This)->lpVtbl->get_hWnd(This,CurrentWindow)
#define IInkCollector_put_hWnd(This,NewWindow) (This)->lpVtbl->put_hWnd(This,NewWindow)
#define IInkCollector_get_Enabled(This,Collecting) (This)->lpVtbl->get_Enabled(This,Collecting)
#define IInkCollector_put_Enabled(This,Collecting) (This)->lpVtbl->put_Enabled(This,Collecting)
#define IInkCollector_get_DefaultDrawingAttributes(This,CurrentAttributes) (This)->lpVtbl->get_DefaultDrawingAttributes(This,CurrentAttributes)
#define IInkCollector_putref_DefaultDrawingAttributes(This,NewAttributes) (This)->lpVtbl->putref_DefaultDrawingAttributes(This,NewAttributes)
#define IInkCollector_get_Renderer(This,CurrentInkRenderer) (This)->lpVtbl->get_Renderer(This,CurrentInkRenderer)
#define IInkCollector_putref_Renderer(This,NewInkRenderer) (This)->lpVtbl->putref_Renderer(This,NewInkRenderer)
#define IInkCollector_get_Ink(This,Ink) (This)->lpVtbl->get_Ink(This,Ink)
#define IInkCollector_putref_Ink(This,NewInk) (This)->lpVtbl->putref_Ink(This,NewInk)
#define IInkCollector_get_AutoRedraw(This,AutoRedraw) (This)->lpVtbl->get_AutoRedraw(This,AutoRedraw)
#define IInkCollector_put_AutoRedraw(This,AutoRedraw) (This)->lpVtbl->put_AutoRedraw(This,AutoRedraw)
#define IInkCollector_get_CollectingInk(This,Collecting) (This)->lpVtbl->get_CollectingInk(This,Collecting)
#define IInkCollector_get_CollectionMode(This,Mode) (This)->lpVtbl->get_CollectionMode(This,Mode)
#define IInkCollector_put_CollectionMode(This,Mode) (This)->lpVtbl->put_CollectionMode(This,Mode)
#define IInkCollector_get_DynamicRendering(This,Enabled) (This)->lpVtbl->get_DynamicRendering(This,Enabled)
#define IInkCollector_put_DynamicRendering(This,Enabled) (This)->lpVtbl->put_DynamicRendering(This,Enabled)
#define IInkCollector_get_DesiredPacketDescription(This,PacketGuids) (This)->lpVtbl->get_DesiredPacketDescription(This,PacketGuids)
#define IInkCollector_put_DesiredPacketDescription(This,PacketGuids) (This)->lpVtbl->put_DesiredPacketDescription(This,PacketGuids)
#define IInkCollector_get_MouseIcon(This,MouseIcon) (This)->lpVtbl->get_MouseIcon(This,MouseIcon)
#define IInkCollector_put_MouseIcon(This,MouseIcon) (This)->lpVtbl->put_MouseIcon(This,MouseIcon)
#define IInkCollector_putref_MouseIcon(This,MouseIcon) (This)->lpVtbl->putref_MouseIcon(This,MouseIcon)
#define IInkCollector_get_MousePointer(This,MousePointer) (This)->lpVtbl->get_MousePointer(This,MousePointer)
#define IInkCollector_put_MousePointer(This,MousePointer) (This)->lpVtbl->put_MousePointer(This,MousePointer)
#define IInkCollector_get_Cursors(This,Cursors) (This)->lpVtbl->get_Cursors(This,Cursors)
#define IInkCollector_get_MarginX(This,MarginX) (This)->lpVtbl->get_MarginX(This,MarginX)
#define IInkCollector_put_MarginX(This,MarginX) (This)->lpVtbl->put_MarginX(This,MarginX)
#define IInkCollector_get_MarginY(This,MarginY) (This)->lpVtbl->get_MarginY(This,MarginY)
#define IInkCollector_put_MarginY(This,MarginY) (This)->lpVtbl->put_MarginY(This,MarginY)
#define IInkCollector_get_Tablet(This,SingleTablet) (This)->lpVtbl->get_Tablet(This,SingleTablet)
#define IInkCollector_get_SupportHighContrastInk(This,Support) (This)->lpVtbl->get_SupportHighContrastInk(This,Support)
#define IInkCollector_put_SupportHighContrastInk(This,Support) (This)->lpVtbl->put_SupportHighContrastInk(This,Support)
#define IInkCollector_SetGestureStatus(This,Gesture,Listen) (This)->lpVtbl->SetGestureStatus(This,Gesture,Listen)
#define IInkCollector_GetGestureStatus(This,Gesture,Listening) (This)->lpVtbl->GetGestureStatus(This,Gesture,Listening)
#define IInkCollector_GetWindowInputRectangle(This,WindowInputRectangle) (This)->lpVtbl->GetWindowInputRectangle(This,WindowInputRectangle)
#define IInkCollector_SetWindowInputRectangle(This,WindowInputRectangle) (This)->lpVtbl->SetWindowInputRectangle(This,WindowInputRectangle)
#define IInkCollector_SetAllTabletsMode(This,UseMouseForInput) (This)->lpVtbl->SetAllTabletsMode(This,UseMouseForInput)
#define IInkCollector_SetSingleTabletIntegratedMode(This,Tablet) (This)->lpVtbl->SetSingleTabletIntegratedMode(This,Tablet)
#define IInkCollector_GetEventInterest(This,EventId,Listen) (This)->lpVtbl->GetEventInterest(This,EventId,Listen)
#define IInkCollector_SetEventInterest(This,EventId,Listen) (This)->lpVtbl->SetEventInterest(This,EventId,Listen)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IInkCollector_QueryInterface(IInkCollector* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IInkCollector_AddRef(IInkCollector* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IInkCollector_Release(IInkCollector* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IInkCollector_GetTypeInfoCount(IInkCollector* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IInkCollector_GetTypeInfo(IInkCollector* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IInkCollector_GetIDsOfNames(IInkCollector* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IInkCollector_Invoke(IInkCollector* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IInkCollector methods ***/
static FORCEINLINE HRESULT IInkCollector_get_hWnd(IInkCollector* This,LONG_PTR *CurrentWindow) {
    return This->lpVtbl->get_hWnd(This,CurrentWindow);
}
static FORCEINLINE HRESULT IInkCollector_put_hWnd(IInkCollector* This,LONG_PTR NewWindow) {
    return This->lpVtbl->put_hWnd(This,NewWindow);
}
static FORCEINLINE HRESULT IInkCollector_get_Enabled(IInkCollector* This,VARIANT_BOOL *Collecting) {
    return This->lpVtbl->get_Enabled(This,Collecting);
}
static FORCEINLINE HRESULT IInkCollector_put_Enabled(IInkCollector* This,VARIANT_BOOL Collecting) {
    return This->lpVtbl->put_Enabled(This,Collecting);
}
static FORCEINLINE HRESULT IInkCollector_get_DefaultDrawingAttributes(IInkCollector* This,IInkDrawingAttributes **CurrentAttributes) {
    return This->lpVtbl->get_DefaultDrawingAttributes(This,CurrentAttributes);
}
static FORCEINLINE HRESULT IInkCollector_putref_DefaultDrawingAttributes(IInkCollector* This,IInkDrawingAttributes *NewAttributes) {
    return This->lpVtbl->putref_DefaultDrawingAttributes(This,NewAttributes);
}
static FORCEINLINE HRESULT IInkCollector_get_Renderer(IInkCollector* This,IInkRenderer **CurrentInkRenderer) {
    return This->lpVtbl->get_Renderer(This,CurrentInkRenderer);
}
static FORCEINLINE HRESULT IInkCollector_putref_Renderer(IInkCollector* This,IInkRenderer *NewInkRenderer) {
    return This->lpVtbl->putref_Renderer(This,NewInkRenderer);
}
static FORCEINLINE HRESULT IInkCollector_get_Ink(IInkCollector* This,IInkDisp **Ink) {
    return This->lpVtbl->get_Ink(This,Ink);
}
static FORCEINLINE HRESULT IInkCollector_putref_Ink(IInkCollector* This,IInkDisp *NewInk) {
    return This->lpVtbl->putref_Ink(This,NewInk);
}
static FORCEINLINE HRESULT IInkCollector_get_AutoRedraw(IInkCollector* This,VARIANT_BOOL *AutoRedraw) {
    return This->lpVtbl->get_AutoRedraw(This,AutoRedraw);
}
static FORCEINLINE HRESULT IInkCollector_put_AutoRedraw(IInkCollector* This,VARIANT_BOOL AutoRedraw) {
    return This->lpVtbl->put_AutoRedraw(This,AutoRedraw);
}
static FORCEINLINE HRESULT IInkCollector_get_CollectingInk(IInkCollector* This,VARIANT_BOOL *Collecting) {
    return This->lpVtbl->get_CollectingInk(This,Collecting);
}
static FORCEINLINE HRESULT IInkCollector_get_CollectionMode(IInkCollector* This,InkCollectionMode *Mode) {
    return This->lpVtbl->get_CollectionMode(This,Mode);
}
static FORCEINLINE HRESULT IInkCollector_put_CollectionMode(IInkCollector* This,InkCollectionMode Mode) {
    return This->lpVtbl->put_CollectionMode(This,Mode);
}
static FORCEINLINE HRESULT IInkCollector_get_DynamicRendering(IInkCollector* This,VARIANT_BOOL *Enabled) {
    return This->lpVtbl->get_DynamicRendering(This,Enabled);
}
static FORCEINLINE HRESULT IInkCollector_put_DynamicRendering(IInkCollector* This,VARIANT_BOOL Enabled) {
    return This->lpVtbl->put_DynamicRendering(This,Enabled);
}
static FORCEINLINE HRESULT IInkCollector_get_DesiredPacketDescription(IInkCollector* This,VARIANT *PacketGuids) {
    return This->lpVtbl->get_DesiredPacketDescription(This,PacketGuids);
}
static FORCEINLINE HRESULT IInkCollector_put_DesiredPacketDescription(IInkCollector* This,VARIANT PacketGuids) {
    return This->lpVtbl->put_DesiredPacketDescription(This,PacketGuids);
}
static FORCEINLINE HRESULT IInkCollector_get_MouseIcon(IInkCollector* This,IPictureDisp **MouseIcon) {
    return This->lpVtbl->get_MouseIcon(This,MouseIcon);
}
static FORCEINLINE HRESULT IInkCollector_put_MouseIcon(IInkCollector* This,IPictureDisp *MouseIcon) {
    return This->lpVtbl->put_MouseIcon(This,MouseIcon);
}
static FORCEINLINE HRESULT IInkCollector_putref_MouseIcon(IInkCollector* This,IPictureDisp *MouseIcon) {
    return This->lpVtbl->putref_MouseIcon(This,MouseIcon);
}
static FORCEINLINE HRESULT IInkCollector_get_MousePointer(IInkCollector* This,InkMousePointer *MousePointer) {
    return This->lpVtbl->get_MousePointer(This,MousePointer);
}
static FORCEINLINE HRESULT IInkCollector_put_MousePointer(IInkCollector* This,InkMousePointer MousePointer) {
    return This->lpVtbl->put_MousePointer(This,MousePointer);
}
static FORCEINLINE HRESULT IInkCollector_get_Cursors(IInkCollector* This,IInkCursors **Cursors) {
    return This->lpVtbl->get_Cursors(This,Cursors);
}
static FORCEINLINE HRESULT IInkCollector_get_MarginX(IInkCollector* This,LONG *MarginX) {
    return This->lpVtbl->get_MarginX(This,MarginX);
}
static FORCEINLINE HRESULT IInkCollector_put_MarginX(IInkCollector* This,LONG MarginX) {
    return This->lpVtbl->put_MarginX(This,MarginX);
}
static FORCEINLINE HRESULT IInkCollector_get_MarginY(IInkCollector* This,LONG *MarginY) {
    return This->lpVtbl->get_MarginY(This,MarginY);
}
static FORCEINLINE HRESULT IInkCollector_put_MarginY(IInkCollector* This,LONG MarginY) {
    return This->lpVtbl->put_MarginY(This,MarginY);
}
static FORCEINLINE HRESULT IInkCollector_get_Tablet(IInkCollector* This,IInkTablet **SingleTablet) {
    return This->lpVtbl->get_Tablet(This,SingleTablet);
}
static FORCEINLINE HRESULT IInkCollector_get_SupportHighContrastInk(IInkCollector* This,VARIANT_BOOL *Support) {
    return This->lpVtbl->get_SupportHighContrastInk(This,Support);
}
static FORCEINLINE HRESULT IInkCollector_put_SupportHighContrastInk(IInkCollector* This,VARIANT_BOOL Support) {
    return This->lpVtbl->put_SupportHighContrastInk(This,Support);
}
static FORCEINLINE HRESULT IInkCollector_SetGestureStatus(IInkCollector* This,InkApplicationGesture Gesture,VARIANT_BOOL Listen) {
    return This->lpVtbl->SetGestureStatus(This,Gesture,Listen);
}
static FORCEINLINE HRESULT IInkCollector_GetGestureStatus(IInkCollector* This,InkApplicationGesture Gesture,VARIANT_BOOL *Listening) {
    return This->lpVtbl->GetGestureStatus(This,Gesture,Listening);
}
static FORCEINLINE HRESULT IInkCollector_GetWindowInputRectangle(IInkCollector* This,IInkRectangle **WindowInputRectangle) {
    return This->lpVtbl->GetWindowInputRectangle(This,WindowInputRectangle);
}
static FORCEINLINE HRESULT IInkCollector_SetWindowInputRectangle(IInkCollector* This,IInkRectangle *WindowInputRectangle) {
    return This->lpVtbl->SetWindowInputRectangle(This,WindowInputRectangle);
}
static FORCEINLINE HRESULT IInkCollector_SetAllTabletsMode(IInkCollector* This,VARIANT_BOOL UseMouseForInput) {
    return This->lpVtbl->SetAllTabletsMode(This,UseMouseForInput);
}
static FORCEINLINE HRESULT IInkCollector_SetSingleTabletIntegratedMode(IInkCollector* This,IInkTablet *Tablet) {
    return This->lpVtbl->SetSingleTabletIntegratedMode(This,Tablet);
}
static FORCEINLINE HRESULT IInkCollector_GetEventInterest(IInkCollector* This,InkCollectorEventInterest EventId,VARIANT_BOOL *Listen) {
    return This->lpVtbl->GetEventInterest(This,EventId,Listen);
}
static FORCEINLINE HRESULT IInkCollector_SetEventInterest(IInkCollector* This,InkCollectorEventInterest EventId,VARIANT_BOOL Listen) {
    return This->lpVtbl->SetEventInterest(This,EventId,Listen);
}
#endif
#endif

#endif


#endif  /* __IInkCollector_INTERFACE_DEFINED__ */

/*****************************************************************************
 * _IInkCollectorEvents dispinterface
 */
#ifndef ___IInkCollectorEvents_DISPINTERFACE_DEFINED__
#define ___IInkCollectorEvents_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID__IInkCollectorEvents, 0x11a583f2, 0x712d, 0x4fea, 0xab,0xcf, 0xab,0x4a,0xf3,0x8e,0xa0,0x6b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("11a583f2-712d-4fea-abcf-ab4af38ea06b")
_IInkCollectorEvents : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(_IInkCollectorEvents, 0x11a583f2, 0x712d, 0x4fea, 0xab,0xcf, 0xab,0x4a,0xf3,0x8e,0xa0,0x6b)
#endif
#else
typedef struct _IInkCollectorEventsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        _IInkCollectorEvents *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        _IInkCollectorEvents *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        _IInkCollectorEvents *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        _IInkCollectorEvents *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        _IInkCollectorEvents *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        _IInkCollectorEvents *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        _IInkCollectorEvents *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} _IInkCollectorEventsVtbl;

interface _IInkCollectorEvents {
    CONST_VTBL _IInkCollectorEventsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define _IInkCollectorEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define _IInkCollectorEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define _IInkCollectorEvents_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define _IInkCollectorEvents_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define _IInkCollectorEvents_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define _IInkCollectorEvents_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define _IInkCollectorEvents_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT _IInkCollectorEvents_QueryInterface(_IInkCollectorEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG _IInkCollectorEvents_AddRef(_IInkCollectorEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG _IInkCollectorEvents_Release(_IInkCollectorEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT _IInkCollectorEvents_GetTypeInfoCount(_IInkCollectorEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT _IInkCollectorEvents_GetTypeInfo(_IInkCollectorEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT _IInkCollectorEvents_GetIDsOfNames(_IInkCollectorEvents* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT _IInkCollectorEvents_Invoke(_IInkCollectorEvents* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
#endif
#endif

#endif

#endif  /* ___IInkCollectorEvents_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * InkCollector coclass
 */

DEFINE_GUID(CLSID_InkCollector, 0x43fb1553, 0xad74, 0x4ee8, 0x88,0xe4, 0x3e,0x6d,0xaa,0xc9,0x15,0xdb);

#ifdef __cplusplus
class DECLSPEC_UUID("43fb1553-ad74-4ee8-88e4-3e6daac915db") InkCollector;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(InkCollector, 0x43fb1553, 0xad74, 0x4ee8, 0x88,0xe4, 0x3e,0x6d,0xaa,0xc9,0x15,0xdb)
#endif
#endif

/* Begin additional prototypes for all interfaces */

ULONG           __RPC_USER BSTR_UserSize     (ULONG *, ULONG, BSTR *);
unsigned char * __RPC_USER BSTR_UserMarshal  (ULONG *, unsigned char *, BSTR *);
unsigned char * __RPC_USER BSTR_UserUnmarshal(ULONG *, unsigned char *, BSTR *);
void            __RPC_USER BSTR_UserFree     (ULONG *, BSTR *);
ULONG           __RPC_USER VARIANT_UserSize     (ULONG *, ULONG, VARIANT *);
unsigned char * __RPC_USER VARIANT_UserMarshal  (ULONG *, unsigned char *, VARIANT *);
unsigned char * __RPC_USER VARIANT_UserUnmarshal(ULONG *, unsigned char *, VARIANT *);
void            __RPC_USER VARIANT_UserFree     (ULONG *, VARIANT *);

/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __msinkaut_h__ */
