/*** Autogenerated by WIDL 9.17 from include/uiautomationcore.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 __uiautomationcore_h__
#define __uiautomationcore_h__

#ifndef __WIDL_INLINE
#if defined(__cplusplus) || defined(_MSC_VER)
#define __WIDL_INLINE inline
#elif defined(__GNUC__)
#define __WIDL_INLINE __inline__
#endif
#endif

/* Forward declarations */

#ifndef __IRawElementProviderSimple_FWD_DEFINED__
#define __IRawElementProviderSimple_FWD_DEFINED__
typedef interface IRawElementProviderSimple IRawElementProviderSimple;
#ifdef __cplusplus
interface IRawElementProviderSimple;
#endif /* __cplusplus */
#endif

#ifndef __IRawElementProviderSimple2_FWD_DEFINED__
#define __IRawElementProviderSimple2_FWD_DEFINED__
typedef interface IRawElementProviderSimple2 IRawElementProviderSimple2;
#ifdef __cplusplus
interface IRawElementProviderSimple2;
#endif /* __cplusplus */
#endif

#ifndef __IRawElementProviderSimple3_FWD_DEFINED__
#define __IRawElementProviderSimple3_FWD_DEFINED__
typedef interface IRawElementProviderSimple3 IRawElementProviderSimple3;
#ifdef __cplusplus
interface IRawElementProviderSimple3;
#endif /* __cplusplus */
#endif

#ifndef __IAccessibleEx_FWD_DEFINED__
#define __IAccessibleEx_FWD_DEFINED__
typedef interface IAccessibleEx IAccessibleEx;
#ifdef __cplusplus
interface IAccessibleEx;
#endif /* __cplusplus */
#endif

#ifndef __IRawElementProviderFragment_FWD_DEFINED__
#define __IRawElementProviderFragment_FWD_DEFINED__
typedef interface IRawElementProviderFragment IRawElementProviderFragment;
#ifdef __cplusplus
interface IRawElementProviderFragment;
#endif /* __cplusplus */
#endif

#ifndef __IRawElementProviderFragmentRoot_FWD_DEFINED__
#define __IRawElementProviderFragmentRoot_FWD_DEFINED__
typedef interface IRawElementProviderFragmentRoot IRawElementProviderFragmentRoot;
#ifdef __cplusplus
interface IRawElementProviderFragmentRoot;
#endif /* __cplusplus */
#endif

#ifndef __IRawElementProviderHwndOverride_FWD_DEFINED__
#define __IRawElementProviderHwndOverride_FWD_DEFINED__
typedef interface IRawElementProviderHwndOverride IRawElementProviderHwndOverride;
#ifdef __cplusplus
interface IRawElementProviderHwndOverride;
#endif /* __cplusplus */
#endif

#ifndef __IRawElementProviderAdviseEvents_FWD_DEFINED__
#define __IRawElementProviderAdviseEvents_FWD_DEFINED__
typedef interface IRawElementProviderAdviseEvents IRawElementProviderAdviseEvents;
#ifdef __cplusplus
interface IRawElementProviderAdviseEvents;
#endif /* __cplusplus */
#endif

#ifndef __IProxyProviderWinEventSink_FWD_DEFINED__
#define __IProxyProviderWinEventSink_FWD_DEFINED__
typedef interface IProxyProviderWinEventSink IProxyProviderWinEventSink;
#ifdef __cplusplus
interface IProxyProviderWinEventSink;
#endif /* __cplusplus */
#endif

#ifndef __IProxyProviderWinEventHandler_FWD_DEFINED__
#define __IProxyProviderWinEventHandler_FWD_DEFINED__
typedef interface IProxyProviderWinEventHandler IProxyProviderWinEventHandler;
#ifdef __cplusplus
interface IProxyProviderWinEventHandler;
#endif /* __cplusplus */
#endif

#ifndef __IRawElementProviderWindowlessSite_FWD_DEFINED__
#define __IRawElementProviderWindowlessSite_FWD_DEFINED__
typedef interface IRawElementProviderWindowlessSite IRawElementProviderWindowlessSite;
#ifdef __cplusplus
interface IRawElementProviderWindowlessSite;
#endif /* __cplusplus */
#endif

#ifndef __IAccessibleHostingElementProviders_FWD_DEFINED__
#define __IAccessibleHostingElementProviders_FWD_DEFINED__
typedef interface IAccessibleHostingElementProviders IAccessibleHostingElementProviders;
#ifdef __cplusplus
interface IAccessibleHostingElementProviders;
#endif /* __cplusplus */
#endif

#ifndef __IRawElementProviderHostingAccessibles_FWD_DEFINED__
#define __IRawElementProviderHostingAccessibles_FWD_DEFINED__
typedef interface IRawElementProviderHostingAccessibles IRawElementProviderHostingAccessibles;
#ifdef __cplusplus
interface IRawElementProviderHostingAccessibles;
#endif /* __cplusplus */
#endif

#ifndef __ILegacyIAccessibleProvider_FWD_DEFINED__
#define __ILegacyIAccessibleProvider_FWD_DEFINED__
typedef interface ILegacyIAccessibleProvider ILegacyIAccessibleProvider;
#ifdef __cplusplus
interface ILegacyIAccessibleProvider;
#endif /* __cplusplus */
#endif

#ifndef __IDockProvider_FWD_DEFINED__
#define __IDockProvider_FWD_DEFINED__
typedef interface IDockProvider IDockProvider;
#ifdef __cplusplus
interface IDockProvider;
#endif /* __cplusplus */
#endif

#ifndef __IExpandCollapseProvider_FWD_DEFINED__
#define __IExpandCollapseProvider_FWD_DEFINED__
typedef interface IExpandCollapseProvider IExpandCollapseProvider;
#ifdef __cplusplus
interface IExpandCollapseProvider;
#endif /* __cplusplus */
#endif

#ifndef __IGridProvider_FWD_DEFINED__
#define __IGridProvider_FWD_DEFINED__
typedef interface IGridProvider IGridProvider;
#ifdef __cplusplus
interface IGridProvider;
#endif /* __cplusplus */
#endif

#ifndef __IGridItemProvider_FWD_DEFINED__
#define __IGridItemProvider_FWD_DEFINED__
typedef interface IGridItemProvider IGridItemProvider;
#ifdef __cplusplus
interface IGridItemProvider;
#endif /* __cplusplus */
#endif

#ifndef __IInvokeProvider_FWD_DEFINED__
#define __IInvokeProvider_FWD_DEFINED__
typedef interface IInvokeProvider IInvokeProvider;
#ifdef __cplusplus
interface IInvokeProvider;
#endif /* __cplusplus */
#endif

#ifndef __IMultipleViewProvider_FWD_DEFINED__
#define __IMultipleViewProvider_FWD_DEFINED__
typedef interface IMultipleViewProvider IMultipleViewProvider;
#ifdef __cplusplus
interface IMultipleViewProvider;
#endif /* __cplusplus */
#endif

#ifndef __IRangeValueProvider_FWD_DEFINED__
#define __IRangeValueProvider_FWD_DEFINED__
typedef interface IRangeValueProvider IRangeValueProvider;
#ifdef __cplusplus
interface IRangeValueProvider;
#endif /* __cplusplus */
#endif

#ifndef __IScrollItemProvider_FWD_DEFINED__
#define __IScrollItemProvider_FWD_DEFINED__
typedef interface IScrollItemProvider IScrollItemProvider;
#ifdef __cplusplus
interface IScrollItemProvider;
#endif /* __cplusplus */
#endif

#ifndef __ISelectionProvider_FWD_DEFINED__
#define __ISelectionProvider_FWD_DEFINED__
typedef interface ISelectionProvider ISelectionProvider;
#ifdef __cplusplus
interface ISelectionProvider;
#endif /* __cplusplus */
#endif

#ifndef __ISelectionProvider2_FWD_DEFINED__
#define __ISelectionProvider2_FWD_DEFINED__
typedef interface ISelectionProvider2 ISelectionProvider2;
#ifdef __cplusplus
interface ISelectionProvider2;
#endif /* __cplusplus */
#endif

#ifndef __IScrollProvider_FWD_DEFINED__
#define __IScrollProvider_FWD_DEFINED__
typedef interface IScrollProvider IScrollProvider;
#ifdef __cplusplus
interface IScrollProvider;
#endif /* __cplusplus */
#endif

#ifndef __ISelectionItemProvider_FWD_DEFINED__
#define __ISelectionItemProvider_FWD_DEFINED__
typedef interface ISelectionItemProvider ISelectionItemProvider;
#ifdef __cplusplus
interface ISelectionItemProvider;
#endif /* __cplusplus */
#endif

#ifndef __ISynchronizedInputProvider_FWD_DEFINED__
#define __ISynchronizedInputProvider_FWD_DEFINED__
typedef interface ISynchronizedInputProvider ISynchronizedInputProvider;
#ifdef __cplusplus
interface ISynchronizedInputProvider;
#endif /* __cplusplus */
#endif

#ifndef __ITableProvider_FWD_DEFINED__
#define __ITableProvider_FWD_DEFINED__
typedef interface ITableProvider ITableProvider;
#ifdef __cplusplus
interface ITableProvider;
#endif /* __cplusplus */
#endif

#ifndef __ITableItemProvider_FWD_DEFINED__
#define __ITableItemProvider_FWD_DEFINED__
typedef interface ITableItemProvider ITableItemProvider;
#ifdef __cplusplus
interface ITableItemProvider;
#endif /* __cplusplus */
#endif

#ifndef __IToggleProvider_FWD_DEFINED__
#define __IToggleProvider_FWD_DEFINED__
typedef interface IToggleProvider IToggleProvider;
#ifdef __cplusplus
interface IToggleProvider;
#endif /* __cplusplus */
#endif

#ifndef __ITransformProvider_FWD_DEFINED__
#define __ITransformProvider_FWD_DEFINED__
typedef interface ITransformProvider ITransformProvider;
#ifdef __cplusplus
interface ITransformProvider;
#endif /* __cplusplus */
#endif

#ifndef __IValueProvider_FWD_DEFINED__
#define __IValueProvider_FWD_DEFINED__
typedef interface IValueProvider IValueProvider;
#ifdef __cplusplus
interface IValueProvider;
#endif /* __cplusplus */
#endif

#ifndef __IWindowProvider_FWD_DEFINED__
#define __IWindowProvider_FWD_DEFINED__
typedef interface IWindowProvider IWindowProvider;
#ifdef __cplusplus
interface IWindowProvider;
#endif /* __cplusplus */
#endif

#ifndef __IItemContainerProvider_FWD_DEFINED__
#define __IItemContainerProvider_FWD_DEFINED__
typedef interface IItemContainerProvider IItemContainerProvider;
#ifdef __cplusplus
interface IItemContainerProvider;
#endif /* __cplusplus */
#endif

#ifndef __IVirtualizedItemProvider_FWD_DEFINED__
#define __IVirtualizedItemProvider_FWD_DEFINED__
typedef interface IVirtualizedItemProvider IVirtualizedItemProvider;
#ifdef __cplusplus
interface IVirtualizedItemProvider;
#endif /* __cplusplus */
#endif

#ifndef __IObjectModelProvider_FWD_DEFINED__
#define __IObjectModelProvider_FWD_DEFINED__
typedef interface IObjectModelProvider IObjectModelProvider;
#ifdef __cplusplus
interface IObjectModelProvider;
#endif /* __cplusplus */
#endif

#ifndef __IAnnotationProvider_FWD_DEFINED__
#define __IAnnotationProvider_FWD_DEFINED__
typedef interface IAnnotationProvider IAnnotationProvider;
#ifdef __cplusplus
interface IAnnotationProvider;
#endif /* __cplusplus */
#endif

#ifndef __IStylesProvider_FWD_DEFINED__
#define __IStylesProvider_FWD_DEFINED__
typedef interface IStylesProvider IStylesProvider;
#ifdef __cplusplus
interface IStylesProvider;
#endif /* __cplusplus */
#endif

#ifndef __ISpreadsheetProvider_FWD_DEFINED__
#define __ISpreadsheetProvider_FWD_DEFINED__
typedef interface ISpreadsheetProvider ISpreadsheetProvider;
#ifdef __cplusplus
interface ISpreadsheetProvider;
#endif /* __cplusplus */
#endif

#ifndef __ISpreadsheetItemProvider_FWD_DEFINED__
#define __ISpreadsheetItemProvider_FWD_DEFINED__
typedef interface ISpreadsheetItemProvider ISpreadsheetItemProvider;
#ifdef __cplusplus
interface ISpreadsheetItemProvider;
#endif /* __cplusplus */
#endif

#ifndef __ITransformProvider2_FWD_DEFINED__
#define __ITransformProvider2_FWD_DEFINED__
typedef interface ITransformProvider2 ITransformProvider2;
#ifdef __cplusplus
interface ITransformProvider2;
#endif /* __cplusplus */
#endif

#ifndef __IDragProvider_FWD_DEFINED__
#define __IDragProvider_FWD_DEFINED__
typedef interface IDragProvider IDragProvider;
#ifdef __cplusplus
interface IDragProvider;
#endif /* __cplusplus */
#endif

#ifndef __IDropTargetProvider_FWD_DEFINED__
#define __IDropTargetProvider_FWD_DEFINED__
typedef interface IDropTargetProvider IDropTargetProvider;
#ifdef __cplusplus
interface IDropTargetProvider;
#endif /* __cplusplus */
#endif

#ifndef __ITextProvider_FWD_DEFINED__
#define __ITextProvider_FWD_DEFINED__
typedef interface ITextProvider ITextProvider;
#ifdef __cplusplus
interface ITextProvider;
#endif /* __cplusplus */
#endif

#ifndef __ITextProvider2_FWD_DEFINED__
#define __ITextProvider2_FWD_DEFINED__
typedef interface ITextProvider2 ITextProvider2;
#ifdef __cplusplus
interface ITextProvider2;
#endif /* __cplusplus */
#endif

#ifndef __ITextEditProvider_FWD_DEFINED__
#define __ITextEditProvider_FWD_DEFINED__
typedef interface ITextEditProvider ITextEditProvider;
#ifdef __cplusplus
interface ITextEditProvider;
#endif /* __cplusplus */
#endif

#ifndef __ITextRangeProvider_FWD_DEFINED__
#define __ITextRangeProvider_FWD_DEFINED__
typedef interface ITextRangeProvider ITextRangeProvider;
#ifdef __cplusplus
interface ITextRangeProvider;
#endif /* __cplusplus */
#endif

#ifndef __ITextRangeProvider2_FWD_DEFINED__
#define __ITextRangeProvider2_FWD_DEFINED__
typedef interface ITextRangeProvider2 ITextRangeProvider2;
#ifdef __cplusplus
interface ITextRangeProvider2;
#endif /* __cplusplus */
#endif

#ifndef __ITextChildProvider_FWD_DEFINED__
#define __ITextChildProvider_FWD_DEFINED__
typedef interface ITextChildProvider ITextChildProvider;
#ifdef __cplusplus
interface ITextChildProvider;
#endif /* __cplusplus */
#endif

#ifndef __ICustomNavigationProvider_FWD_DEFINED__
#define __ICustomNavigationProvider_FWD_DEFINED__
typedef interface ICustomNavigationProvider ICustomNavigationProvider;
#ifdef __cplusplus
interface ICustomNavigationProvider;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationPatternInstance_FWD_DEFINED__
#define __IUIAutomationPatternInstance_FWD_DEFINED__
typedef interface IUIAutomationPatternInstance IUIAutomationPatternInstance;
#ifdef __cplusplus
interface IUIAutomationPatternInstance;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationPatternHandler_FWD_DEFINED__
#define __IUIAutomationPatternHandler_FWD_DEFINED__
typedef interface IUIAutomationPatternHandler IUIAutomationPatternHandler;
#ifdef __cplusplus
interface IUIAutomationPatternHandler;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationRegistrar_FWD_DEFINED__
#define __IUIAutomationRegistrar_FWD_DEFINED__
typedef interface IUIAutomationRegistrar IUIAutomationRegistrar;
#ifdef __cplusplus
interface IUIAutomationRegistrar;
#endif /* __cplusplus */
#endif

#ifndef __CUIAutomationRegistrar_FWD_DEFINED__
#define __CUIAutomationRegistrar_FWD_DEFINED__
#ifdef __cplusplus
typedef class CUIAutomationRegistrar CUIAutomationRegistrar;
#else
typedef struct CUIAutomationRegistrar CUIAutomationRegistrar;
#endif /* defined __cplusplus */
#endif /* defined __CUIAutomationRegistrar_FWD_DEFINED__ */

/* Headers for imported files */

#include <oaidl.h>
#include <oleacc.h>

#ifdef __cplusplus
extern "C" {
#endif

enum NavigateDirection {
    NavigateDirection_Parent = 0x0,
    NavigateDirection_NextSibling = 0x1,
    NavigateDirection_PreviousSibling = 0x2,
    NavigateDirection_FirstChild = 0x3,
    NavigateDirection_LastChild = 0x4
};
enum ProviderOptions {
    ProviderOptions_ClientSideProvider = 0x1,
    ProviderOptions_ServerSideProvider = 0x2,
    ProviderOptions_NonClientAreaProvider = 0x4,
    ProviderOptions_OverrideProvider = 0x8,
    ProviderOptions_ProviderOwnsSetFocus = 0x10,
    ProviderOptions_UseComThreading = 0x20,
    ProviderOptions_RefuseNonClientSupport = 0x40,
    ProviderOptions_HasNativeIAccessible = 0x80,
    ProviderOptions_UseClientCoordinates = 0x100
};
enum StructureChangeType {
    StructureChangeType_ChildAdded = 0x0,
    StructureChangeType_ChildRemoved = 0x1,
    StructureChangeType_ChildrenInvalidated = 0x2,
    StructureChangeType_ChildrenBulkAdded = 0x3,
    StructureChangeType_ChildrenBulkRemoved = 0x4,
    StructureChangeType_ChildrenReordered = 0x5
};
enum TextEditChangeType {
    TextEditChangeType_None = 0x0,
    TextEditChangeType_AutoCorrect = 0x1,
    TextEditChangeType_Composition = 0x2,
    TextEditChangeType_CompositionFinalized = 0x3,
    TextEditChangeType_AutoComplete = 0x4
};
enum OrientationType {
    OrientationType_None = 0x0,
    OrientationType_Horizontal = 0x1,
    OrientationType_Vertical = 0x2
};
enum DockPosition {
    DockPosition_Top = 0x0,
    DockPosition_Left = 0x1,
    DockPosition_Bottom = 0x2,
    DockPosition_Right = 0x3,
    DockPosition_Fill = 0x4,
    DockPosition_None = 0x5
};
enum ExpandCollapseState {
    ExpandCollapseState_Collapsed = 0x0,
    ExpandCollapseState_Expanded = 0x1,
    ExpandCollapseState_PartiallyExpanded = 0x2,
    ExpandCollapseState_LeafNode = 0x3
};
enum ScrollAmount {
    ScrollAmount_LargeDecrement = 0x0,
    ScrollAmount_SmallDecrement = 0x1,
    ScrollAmount_NoAmount = 0x2,
    ScrollAmount_LargeIncrement = 0x3,
    ScrollAmount_SmallIncrement = 0x4
};
enum RowOrColumnMajor {
    RowOrColumnMajor_RowMajor = 0x0,
    RowOrColumnMajor_ColumnMajor = 0x1,
    RowOrColumnMajor_Indeterminate = 0x2
};
enum ToggleState {
    ToggleState_Off = 0x0,
    ToggleState_On = 0x1,
    ToggleState_Indeterminate = 0x2
};
enum WindowVisualState {
    WindowVisualState_Normal = 0x0,
    WindowVisualState_Maximized = 0x1,
    WindowVisualState_Minimized = 0x2
};
enum SynchronizedInputType {
    SynchronizedInputType_KeyUp = 0x1,
    SynchronizedInputType_KeyDown = 0x2,
    SynchronizedInputType_LeftMouseUp = 0x4,
    SynchronizedInputType_LeftMouseDown = 0x8,
    SynchronizedInputType_RightMouseUp = 0x10,
    SynchronizedInputType_RightMouseDown = 0x20
};
DEFINE_ENUM_FLAG_OPERATORS(SynchronizedInputType)
enum WindowInteractionState {
    WindowInteractionState_Running = 0x0,
    WindowInteractionState_Closing = 0x1,
    WindowInteractionState_ReadyForUserInteraction = 0x2,
    WindowInteractionState_BlockedByModalWindow = 0x3,
    WindowInteractionState_NotResponding = 0x4
};
enum TextUnit {
    TextUnit_Character = 0x0,
    TextUnit_Format = 0x1,
    TextUnit_Word = 0x2,
    TextUnit_Line = 0x3,
    TextUnit_Paragraph = 0x4,
    TextUnit_Page = 0x5,
    TextUnit_Document = 0x6
};
enum TextPatternRangeEndpoint {
    TextPatternRangeEndpoint_Start = 0x0,
    TextPatternRangeEndpoint_End = 0x1
};
enum SupportedTextSelection {
    SupportedTextSelection_None = 0x0,
    SupportedTextSelection_Single = 0x1,
    SupportedTextSelection_Multiple = 0x2
};
enum LiveSetting {
    Off = 0x0,
    Polite = 0x1,
    Assertive = 0x2
};
enum ZoomUnit {
    ZoomUnit_NoAmount = 0x0,
    ZoomUnit_LargeDecrement = 0x1,
    ZoomUnit_SmallDecrement = 0x2,
    ZoomUnit_LargeIncrement = 0x3,
    ZoomUnit_SmallIncrement = 0x4
};
enum NotificationProcessing {
    NotificationProcessing_ImportantAll = 0x0,
    NotificationProcessing_ImportantMostRecent = 0x1,
    NotificationProcessing_All = 0x2,
    NotificationProcessing_MostRecent = 0x3,
    NotificationProcessing_CurrentThenMostRecent = 0x4
};
enum NotificationKind {
    NotificationKind_ItemAdded = 0x0,
    NotificationKind_ItemRemoved = 0x1,
    NotificationKind_ActionCompleted = 0x2,
    NotificationKind_ActionAborted = 0x3,
    NotificationKind_Other = 0x4
};
typedef int PROPERTYID;
typedef int PATTERNID;
typedef int EVENTID;
typedef int TEXTATTRIBUTEID;
typedef int CONTROLTYPEID;
typedef int LANDMARKTYPEID;
typedef int METADATAID;
typedef int HEADINGLEVELID;
struct UiaRect {
    double left;
    double top;
    double width;
    double height;
};
struct UiaPoint {
    double x;
    double y;
};
struct UiaChangeInfo {
    int uiaId;
    VARIANT payload;
    VARIANT extraInfo;
};
#ifndef __UIA_LIBRARY_DEFINED__
#define __UIA_LIBRARY_DEFINED__

DEFINE_GUID(LIBID_UIA, 0x930299ce, 0x9965, 0x4dec, 0xb0,0xf4, 0xa5,0x48,0x48,0xd4,0xb6,0x67);

/*****************************************************************************
 * IRawElementProviderSimple interface
 */
#ifndef __IRawElementProviderSimple_INTERFACE_DEFINED__
#define __IRawElementProviderSimple_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRawElementProviderSimple, 0xd6dd68d1, 0x86fd, 0x4332, 0x86,0x66, 0x9a,0xbe,0xde,0xa2,0xd2,0x4c);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d6dd68d1-86fd-4332-8666-9abedea2d24c")
IRawElementProviderSimple : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE get_ProviderOptions(
        enum ProviderOptions *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPatternProvider(
        PATTERNID patternId,
        IUnknown **pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPropertyValue(
        PROPERTYID propertyId,
        VARIANT *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HostRawElementProvider(
        IRawElementProviderSimple **pRetVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRawElementProviderSimple, 0xd6dd68d1, 0x86fd, 0x4332, 0x86,0x66, 0x9a,0xbe,0xde,0xa2,0xd2,0x4c)
#endif
#else
typedef struct IRawElementProviderSimpleVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IRawElementProviderSimple methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ProviderOptions)(
        IRawElementProviderSimple *This,
        enum ProviderOptions *pRetVal);

    HRESULT (STDMETHODCALLTYPE *GetPatternProvider)(
        IRawElementProviderSimple *This,
        PATTERNID patternId,
        IUnknown **pRetVal);

    HRESULT (STDMETHODCALLTYPE *GetPropertyValue)(
        IRawElementProviderSimple *This,
        PROPERTYID propertyId,
        VARIANT *pRetVal);

    HRESULT (STDMETHODCALLTYPE *get_HostRawElementProvider)(
        IRawElementProviderSimple *This,
        IRawElementProviderSimple **pRetVal);

    END_INTERFACE
} IRawElementProviderSimpleVtbl;

interface IRawElementProviderSimple {
    CONST_VTBL IRawElementProviderSimpleVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRawElementProviderSimple_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRawElementProviderSimple_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRawElementProviderSimple_Release(This) (This)->lpVtbl->Release(This)
/*** IRawElementProviderSimple methods ***/
#define IRawElementProviderSimple_get_ProviderOptions(This,pRetVal) (This)->lpVtbl->get_ProviderOptions(This,pRetVal)
#define IRawElementProviderSimple_GetPatternProvider(This,patternId,pRetVal) (This)->lpVtbl->GetPatternProvider(This,patternId,pRetVal)
#define IRawElementProviderSimple_GetPropertyValue(This,propertyId,pRetVal) (This)->lpVtbl->GetPropertyValue(This,propertyId,pRetVal)
#define IRawElementProviderSimple_get_HostRawElementProvider(This,pRetVal) (This)->lpVtbl->get_HostRawElementProvider(This,pRetVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IRawElementProviderSimple_QueryInterface(IRawElementProviderSimple* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IRawElementProviderSimple_AddRef(IRawElementProviderSimple* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IRawElementProviderSimple_Release(IRawElementProviderSimple* This) {
    return This->lpVtbl->Release(This);
}
/*** IRawElementProviderSimple methods ***/
static __WIDL_INLINE HRESULT IRawElementProviderSimple_get_ProviderOptions(IRawElementProviderSimple* This,enum ProviderOptions *pRetVal) {
    return This->lpVtbl->get_ProviderOptions(This,pRetVal);
}
static __WIDL_INLINE HRESULT IRawElementProviderSimple_GetPatternProvider(IRawElementProviderSimple* This,PATTERNID patternId,IUnknown **pRetVal) {
    return This->lpVtbl->GetPatternProvider(This,patternId,pRetVal);
}
static __WIDL_INLINE HRESULT IRawElementProviderSimple_GetPropertyValue(IRawElementProviderSimple* This,PROPERTYID propertyId,VARIANT *pRetVal) {
    return This->lpVtbl->GetPropertyValue(This,propertyId,pRetVal);
}
static __WIDL_INLINE HRESULT IRawElementProviderSimple_get_HostRawElementProvider(IRawElementProviderSimple* This,IRawElementProviderSimple **pRetVal) {
    return This->lpVtbl->get_HostRawElementProvider(This,pRetVal);
}
#endif
#endif

#endif


#endif  /* __IRawElementProviderSimple_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IRawElementProviderSimple2 interface
 */
#ifndef __IRawElementProviderSimple2_INTERFACE_DEFINED__
#define __IRawElementProviderSimple2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRawElementProviderSimple2, 0xa0a839a9, 0x8da1, 0x4a82, 0x80,0x6a, 0x8e,0x0d,0x44,0xe7,0x9f,0x56);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a0a839a9-8da1-4a82-806a-8e0d44e79f56")
IRawElementProviderSimple2 : public IRawElementProviderSimple
{
    virtual HRESULT STDMETHODCALLTYPE ShowContextMenu(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRawElementProviderSimple2, 0xa0a839a9, 0x8da1, 0x4a82, 0x80,0x6a, 0x8e,0x0d,0x44,0xe7,0x9f,0x56)
#endif
#else
typedef struct IRawElementProviderSimple2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IRawElementProviderSimple methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ProviderOptions)(
        IRawElementProviderSimple2 *This,
        enum ProviderOptions *pRetVal);

    HRESULT (STDMETHODCALLTYPE *GetPatternProvider)(
        IRawElementProviderSimple2 *This,
        PATTERNID patternId,
        IUnknown **pRetVal);

    HRESULT (STDMETHODCALLTYPE *GetPropertyValue)(
        IRawElementProviderSimple2 *This,
        PROPERTYID propertyId,
        VARIANT *pRetVal);

    HRESULT (STDMETHODCALLTYPE *get_HostRawElementProvider)(
        IRawElementProviderSimple2 *This,
        IRawElementProviderSimple **pRetVal);

    /*** IRawElementProviderSimple2 methods ***/
    HRESULT (STDMETHODCALLTYPE *ShowContextMenu)(
        IRawElementProviderSimple2 *This);

    END_INTERFACE
} IRawElementProviderSimple2Vtbl;

interface IRawElementProviderSimple2 {
    CONST_VTBL IRawElementProviderSimple2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRawElementProviderSimple2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRawElementProviderSimple2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRawElementProviderSimple2_Release(This) (This)->lpVtbl->Release(This)
/*** IRawElementProviderSimple methods ***/
#define IRawElementProviderSimple2_get_ProviderOptions(This,pRetVal) (This)->lpVtbl->get_ProviderOptions(This,pRetVal)
#define IRawElementProviderSimple2_GetPatternProvider(This,patternId,pRetVal) (This)->lpVtbl->GetPatternProvider(This,patternId,pRetVal)
#define IRawElementProviderSimple2_GetPropertyValue(This,propertyId,pRetVal) (This)->lpVtbl->GetPropertyValue(This,propertyId,pRetVal)
#define IRawElementProviderSimple2_get_HostRawElementProvider(This,pRetVal) (This)->lpVtbl->get_HostRawElementProvider(This,pRetVal)
/*** IRawElementProviderSimple2 methods ***/
#define IRawElementProviderSimple2_ShowContextMenu(This) (This)->lpVtbl->ShowContextMenu(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IRawElementProviderSimple2_QueryInterface(IRawElementProviderSimple2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IRawElementProviderSimple2_AddRef(IRawElementProviderSimple2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IRawElementProviderSimple2_Release(IRawElementProviderSimple2* This) {
    return This->lpVtbl->Release(This);
}
/*** IRawElementProviderSimple methods ***/
static __WIDL_INLINE HRESULT IRawElementProviderSimple2_get_ProviderOptions(IRawElementProviderSimple2* This,enum ProviderOptions *pRetVal) {
    return This->lpVtbl->get_ProviderOptions(This,pRetVal);
}
static __WIDL_INLINE HRESULT IRawElementProviderSimple2_GetPatternProvider(IRawElementProviderSimple2* This,PATTERNID patternId,IUnknown **pRetVal) {
    return This->lpVtbl->GetPatternProvider(This,patternId,pRetVal);
}
static __WIDL_INLINE HRESULT IRawElementProviderSimple2_GetPropertyValue(IRawElementProviderSimple2* This,PROPERTYID propertyId,VARIANT *pRetVal) {
    return This->lpVtbl->GetPropertyValue(This,propertyId,pRetVal);
}
static __WIDL_INLINE HRESULT IRawElementProviderSimple2_get_HostRawElementProvider(IRawElementProviderSimple2* This,IRawElementProviderSimple **pRetVal) {
    return This->lpVtbl->get_HostRawElementProvider(This,pRetVal);
}
/*** IRawElementProviderSimple2 methods ***/
static __WIDL_INLINE HRESULT IRawElementProviderSimple2_ShowContextMenu(IRawElementProviderSimple2* This) {
    return This->lpVtbl->ShowContextMenu(This);
}
#endif
#endif

#endif


#endif  /* __IRawElementProviderSimple2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IRawElementProviderSimple3 interface
 */
#ifndef __IRawElementProviderSimple3_INTERFACE_DEFINED__
#define __IRawElementProviderSimple3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRawElementProviderSimple3, 0xfcf5d820, 0xd7ec, 0x4613, 0xbd,0xf6, 0x42,0xa8,0x4c,0xe7,0xda,0xaf);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("fcf5d820-d7ec-4613-bdf6-42a84ce7daaf")
IRawElementProviderSimple3 : public IRawElementProviderSimple2
{
    virtual HRESULT STDMETHODCALLTYPE GetMetadataValue(
        int targetId,
        METADATAID metadataId,
        VARIANT *returnVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRawElementProviderSimple3, 0xfcf5d820, 0xd7ec, 0x4613, 0xbd,0xf6, 0x42,0xa8,0x4c,0xe7,0xda,0xaf)
#endif
#else
typedef struct IRawElementProviderSimple3Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IRawElementProviderSimple methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ProviderOptions)(
        IRawElementProviderSimple3 *This,
        enum ProviderOptions *pRetVal);

    HRESULT (STDMETHODCALLTYPE *GetPatternProvider)(
        IRawElementProviderSimple3 *This,
        PATTERNID patternId,
        IUnknown **pRetVal);

    HRESULT (STDMETHODCALLTYPE *GetPropertyValue)(
        IRawElementProviderSimple3 *This,
        PROPERTYID propertyId,
        VARIANT *pRetVal);

    HRESULT (STDMETHODCALLTYPE *get_HostRawElementProvider)(
        IRawElementProviderSimple3 *This,
        IRawElementProviderSimple **pRetVal);

    /*** IRawElementProviderSimple2 methods ***/
    HRESULT (STDMETHODCALLTYPE *ShowContextMenu)(
        IRawElementProviderSimple3 *This);

    /*** IRawElementProviderSimple3 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetMetadataValue)(
        IRawElementProviderSimple3 *This,
        int targetId,
        METADATAID metadataId,
        VARIANT *returnVal);

    END_INTERFACE
} IRawElementProviderSimple3Vtbl;

interface IRawElementProviderSimple3 {
    CONST_VTBL IRawElementProviderSimple3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRawElementProviderSimple3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRawElementProviderSimple3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRawElementProviderSimple3_Release(This) (This)->lpVtbl->Release(This)
/*** IRawElementProviderSimple methods ***/
#define IRawElementProviderSimple3_get_ProviderOptions(This,pRetVal) (This)->lpVtbl->get_ProviderOptions(This,pRetVal)
#define IRawElementProviderSimple3_GetPatternProvider(This,patternId,pRetVal) (This)->lpVtbl->GetPatternProvider(This,patternId,pRetVal)
#define IRawElementProviderSimple3_GetPropertyValue(This,propertyId,pRetVal) (This)->lpVtbl->GetPropertyValue(This,propertyId,pRetVal)
#define IRawElementProviderSimple3_get_HostRawElementProvider(This,pRetVal) (This)->lpVtbl->get_HostRawElementProvider(This,pRetVal)
/*** IRawElementProviderSimple2 methods ***/
#define IRawElementProviderSimple3_ShowContextMenu(This) (This)->lpVtbl->ShowContextMenu(This)
/*** IRawElementProviderSimple3 methods ***/
#define IRawElementProviderSimple3_GetMetadataValue(This,targetId,metadataId,returnVal) (This)->lpVtbl->GetMetadataValue(This,targetId,metadataId,returnVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IRawElementProviderSimple3_QueryInterface(IRawElementProviderSimple3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IRawElementProviderSimple3_AddRef(IRawElementProviderSimple3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IRawElementProviderSimple3_Release(IRawElementProviderSimple3* This) {
    return This->lpVtbl->Release(This);
}
/*** IRawElementProviderSimple methods ***/
static __WIDL_INLINE HRESULT IRawElementProviderSimple3_get_ProviderOptions(IRawElementProviderSimple3* This,enum ProviderOptions *pRetVal) {
    return This->lpVtbl->get_ProviderOptions(This,pRetVal);
}
static __WIDL_INLINE HRESULT IRawElementProviderSimple3_GetPatternProvider(IRawElementProviderSimple3* This,PATTERNID patternId,IUnknown **pRetVal) {
    return This->lpVtbl->GetPatternProvider(This,patternId,pRetVal);
}
static __WIDL_INLINE HRESULT IRawElementProviderSimple3_GetPropertyValue(IRawElementProviderSimple3* This,PROPERTYID propertyId,VARIANT *pRetVal) {
    return This->lpVtbl->GetPropertyValue(This,propertyId,pRetVal);
}
static __WIDL_INLINE HRESULT IRawElementProviderSimple3_get_HostRawElementProvider(IRawElementProviderSimple3* This,IRawElementProviderSimple **pRetVal) {
    return This->lpVtbl->get_HostRawElementProvider(This,pRetVal);
}
/*** IRawElementProviderSimple2 methods ***/
static __WIDL_INLINE HRESULT IRawElementProviderSimple3_ShowContextMenu(IRawElementProviderSimple3* This) {
    return This->lpVtbl->ShowContextMenu(This);
}
/*** IRawElementProviderSimple3 methods ***/
static __WIDL_INLINE HRESULT IRawElementProviderSimple3_GetMetadataValue(IRawElementProviderSimple3* This,int targetId,METADATAID metadataId,VARIANT *returnVal) {
    return This->lpVtbl->GetMetadataValue(This,targetId,metadataId,returnVal);
}
#endif
#endif

#endif


#endif  /* __IRawElementProviderSimple3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAccessibleEx interface
 */
#ifndef __IAccessibleEx_INTERFACE_DEFINED__
#define __IAccessibleEx_INTERFACE_DEFINED__

DEFINE_GUID(IID_IAccessibleEx, 0xf8b80ada, 0x2c44, 0x48d0, 0x89,0xbe, 0x5f,0xf2,0x3c,0x9c,0xd8,0x75);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("f8b80ada-2c44-48d0-89be-5ff23c9cd875")
IAccessibleEx : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetObjectForChild(
        LONG idChild,
        IAccessibleEx **pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetIAccessiblePair(
        IAccessible **ppAcc,
        LONG *pidChild) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRuntimeId(
        SAFEARRAY **pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE ConvertReturnedElement(
        IRawElementProviderSimple *pIn,
        IAccessibleEx **ppRetValOut) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IAccessibleEx, 0xf8b80ada, 0x2c44, 0x48d0, 0x89,0xbe, 0x5f,0xf2,0x3c,0x9c,0xd8,0x75)
#endif
#else
typedef struct IAccessibleExVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAccessibleEx methods ***/
    HRESULT (STDMETHODCALLTYPE *GetObjectForChild)(
        IAccessibleEx *This,
        LONG idChild,
        IAccessibleEx **pRetVal);

    HRESULT (STDMETHODCALLTYPE *GetIAccessiblePair)(
        IAccessibleEx *This,
        IAccessible **ppAcc,
        LONG *pidChild);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeId)(
        IAccessibleEx *This,
        SAFEARRAY **pRetVal);

    HRESULT (STDMETHODCALLTYPE *ConvertReturnedElement)(
        IAccessibleEx *This,
        IRawElementProviderSimple *pIn,
        IAccessibleEx **ppRetValOut);

    END_INTERFACE
} IAccessibleExVtbl;

interface IAccessibleEx {
    CONST_VTBL IAccessibleExVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IAccessibleEx_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IAccessibleEx_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IAccessibleEx_Release(This) (This)->lpVtbl->Release(This)
/*** IAccessibleEx methods ***/
#define IAccessibleEx_GetObjectForChild(This,idChild,pRetVal) (This)->lpVtbl->GetObjectForChild(This,idChild,pRetVal)
#define IAccessibleEx_GetIAccessiblePair(This,ppAcc,pidChild) (This)->lpVtbl->GetIAccessiblePair(This,ppAcc,pidChild)
#define IAccessibleEx_GetRuntimeId(This,pRetVal) (This)->lpVtbl->GetRuntimeId(This,pRetVal)
#define IAccessibleEx_ConvertReturnedElement(This,pIn,ppRetValOut) (This)->lpVtbl->ConvertReturnedElement(This,pIn,ppRetValOut)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IAccessibleEx_QueryInterface(IAccessibleEx* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IAccessibleEx_AddRef(IAccessibleEx* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IAccessibleEx_Release(IAccessibleEx* This) {
    return This->lpVtbl->Release(This);
}
/*** IAccessibleEx methods ***/
static __WIDL_INLINE HRESULT IAccessibleEx_GetObjectForChild(IAccessibleEx* This,LONG idChild,IAccessibleEx **pRetVal) {
    return This->lpVtbl->GetObjectForChild(This,idChild,pRetVal);
}
static __WIDL_INLINE HRESULT IAccessibleEx_GetIAccessiblePair(IAccessibleEx* This,IAccessible **ppAcc,LONG *pidChild) {
    return This->lpVtbl->GetIAccessiblePair(This,ppAcc,pidChild);
}
static __WIDL_INLINE HRESULT IAccessibleEx_GetRuntimeId(IAccessibleEx* This,SAFEARRAY **pRetVal) {
    return This->lpVtbl->GetRuntimeId(This,pRetVal);
}
static __WIDL_INLINE HRESULT IAccessibleEx_ConvertReturnedElement(IAccessibleEx* This,IRawElementProviderSimple *pIn,IAccessibleEx **ppRetValOut) {
    return This->lpVtbl->ConvertReturnedElement(This,pIn,ppRetValOut);
}
#endif
#endif

#endif


#endif  /* __IAccessibleEx_INTERFACE_DEFINED__ */

#ifndef __IRawElementProviderFragmentRoot_FWD_DEFINED__
#define __IRawElementProviderFragmentRoot_FWD_DEFINED__
typedef interface IRawElementProviderFragmentRoot IRawElementProviderFragmentRoot;
#ifdef __cplusplus
interface IRawElementProviderFragmentRoot;
#endif /* __cplusplus */
#endif

/*****************************************************************************
 * IRawElementProviderFragment interface
 */
#ifndef __IRawElementProviderFragment_INTERFACE_DEFINED__
#define __IRawElementProviderFragment_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRawElementProviderFragment, 0xf7063da8, 0x8359, 0x439c, 0x92,0x97, 0xbb,0xc5,0x29,0x9a,0x7d,0x87);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("f7063da8-8359-439c-9297-bbc5299a7d87")
IRawElementProviderFragment : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Navigate(
        enum NavigateDirection direction,
        IRawElementProviderFragment **pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRuntimeId(
        SAFEARRAY **pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_BoundingRectangle(
        struct UiaRect *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetEmbeddedFragmentRoots(
        SAFEARRAY **pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetFocus(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_FragmentRoot(
        IRawElementProviderFragmentRoot **pRetVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRawElementProviderFragment, 0xf7063da8, 0x8359, 0x439c, 0x92,0x97, 0xbb,0xc5,0x29,0x9a,0x7d,0x87)
#endif
#else
typedef struct IRawElementProviderFragmentVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IRawElementProviderFragment methods ***/
    HRESULT (STDMETHODCALLTYPE *Navigate)(
        IRawElementProviderFragment *This,
        enum NavigateDirection direction,
        IRawElementProviderFragment **pRetVal);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeId)(
        IRawElementProviderFragment *This,
        SAFEARRAY **pRetVal);

    HRESULT (STDMETHODCALLTYPE *get_BoundingRectangle)(
        IRawElementProviderFragment *This,
        struct UiaRect *pRetVal);

    HRESULT (STDMETHODCALLTYPE *GetEmbeddedFragmentRoots)(
        IRawElementProviderFragment *This,
        SAFEARRAY **pRetVal);

    HRESULT (STDMETHODCALLTYPE *SetFocus)(
        IRawElementProviderFragment *This);

    HRESULT (STDMETHODCALLTYPE *get_FragmentRoot)(
        IRawElementProviderFragment *This,
        IRawElementProviderFragmentRoot **pRetVal);

    END_INTERFACE
} IRawElementProviderFragmentVtbl;

interface IRawElementProviderFragment {
    CONST_VTBL IRawElementProviderFragmentVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRawElementProviderFragment_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRawElementProviderFragment_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRawElementProviderFragment_Release(This) (This)->lpVtbl->Release(This)
/*** IRawElementProviderFragment methods ***/
#define IRawElementProviderFragment_Navigate(This,direction,pRetVal) (This)->lpVtbl->Navigate(This,direction,pRetVal)
#define IRawElementProviderFragment_GetRuntimeId(This,pRetVal) (This)->lpVtbl->GetRuntimeId(This,pRetVal)
#define IRawElementProviderFragment_get_BoundingRectangle(This,pRetVal) (This)->lpVtbl->get_BoundingRectangle(This,pRetVal)
#define IRawElementProviderFragment_GetEmbeddedFragmentRoots(This,pRetVal) (This)->lpVtbl->GetEmbeddedFragmentRoots(This,pRetVal)
#define IRawElementProviderFragment_SetFocus(This) (This)->lpVtbl->SetFocus(This)
#define IRawElementProviderFragment_get_FragmentRoot(This,pRetVal) (This)->lpVtbl->get_FragmentRoot(This,pRetVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IRawElementProviderFragment_QueryInterface(IRawElementProviderFragment* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IRawElementProviderFragment_AddRef(IRawElementProviderFragment* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IRawElementProviderFragment_Release(IRawElementProviderFragment* This) {
    return This->lpVtbl->Release(This);
}
/*** IRawElementProviderFragment methods ***/
static __WIDL_INLINE HRESULT IRawElementProviderFragment_Navigate(IRawElementProviderFragment* This,enum NavigateDirection direction,IRawElementProviderFragment **pRetVal) {
    return This->lpVtbl->Navigate(This,direction,pRetVal);
}
static __WIDL_INLINE HRESULT IRawElementProviderFragment_GetRuntimeId(IRawElementProviderFragment* This,SAFEARRAY **pRetVal) {
    return This->lpVtbl->GetRuntimeId(This,pRetVal);
}
static __WIDL_INLINE HRESULT IRawElementProviderFragment_get_BoundingRectangle(IRawElementProviderFragment* This,struct UiaRect *pRetVal) {
    return This->lpVtbl->get_BoundingRectangle(This,pRetVal);
}
static __WIDL_INLINE HRESULT IRawElementProviderFragment_GetEmbeddedFragmentRoots(IRawElementProviderFragment* This,SAFEARRAY **pRetVal) {
    return This->lpVtbl->GetEmbeddedFragmentRoots(This,pRetVal);
}
static __WIDL_INLINE HRESULT IRawElementProviderFragment_SetFocus(IRawElementProviderFragment* This) {
    return This->lpVtbl->SetFocus(This);
}
static __WIDL_INLINE HRESULT IRawElementProviderFragment_get_FragmentRoot(IRawElementProviderFragment* This,IRawElementProviderFragmentRoot **pRetVal) {
    return This->lpVtbl->get_FragmentRoot(This,pRetVal);
}
#endif
#endif

#endif


#endif  /* __IRawElementProviderFragment_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IRawElementProviderFragmentRoot interface
 */
#ifndef __IRawElementProviderFragmentRoot_INTERFACE_DEFINED__
#define __IRawElementProviderFragmentRoot_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRawElementProviderFragmentRoot, 0x620ce2a5, 0xab8f, 0x40a9, 0x86,0xcb, 0xde,0x3c,0x75,0x59,0x9b,0x58);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("620ce2a5-ab8f-40a9-86cb-de3c75599b58")
IRawElementProviderFragmentRoot : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE ElementProviderFromPoint(
        double x,
        double y,
        IRawElementProviderFragment **pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFocus(
        IRawElementProviderFragment **pRetVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRawElementProviderFragmentRoot, 0x620ce2a5, 0xab8f, 0x40a9, 0x86,0xcb, 0xde,0x3c,0x75,0x59,0x9b,0x58)
#endif
#else
typedef struct IRawElementProviderFragmentRootVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IRawElementProviderFragmentRoot methods ***/
    HRESULT (STDMETHODCALLTYPE *ElementProviderFromPoint)(
        IRawElementProviderFragmentRoot *This,
        double x,
        double y,
        IRawElementProviderFragment **pRetVal);

    HRESULT (STDMETHODCALLTYPE *GetFocus)(
        IRawElementProviderFragmentRoot *This,
        IRawElementProviderFragment **pRetVal);

    END_INTERFACE
} IRawElementProviderFragmentRootVtbl;

interface IRawElementProviderFragmentRoot {
    CONST_VTBL IRawElementProviderFragmentRootVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRawElementProviderFragmentRoot_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRawElementProviderFragmentRoot_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRawElementProviderFragmentRoot_Release(This) (This)->lpVtbl->Release(This)
/*** IRawElementProviderFragmentRoot methods ***/
#define IRawElementProviderFragmentRoot_ElementProviderFromPoint(This,x,y,pRetVal) (This)->lpVtbl->ElementProviderFromPoint(This,x,y,pRetVal)
#define IRawElementProviderFragmentRoot_GetFocus(This,pRetVal) (This)->lpVtbl->GetFocus(This,pRetVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IRawElementProviderFragmentRoot_QueryInterface(IRawElementProviderFragmentRoot* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IRawElementProviderFragmentRoot_AddRef(IRawElementProviderFragmentRoot* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IRawElementProviderFragmentRoot_Release(IRawElementProviderFragmentRoot* This) {
    return This->lpVtbl->Release(This);
}
/*** IRawElementProviderFragmentRoot methods ***/
static __WIDL_INLINE HRESULT IRawElementProviderFragmentRoot_ElementProviderFromPoint(IRawElementProviderFragmentRoot* This,double x,double y,IRawElementProviderFragment **pRetVal) {
    return This->lpVtbl->ElementProviderFromPoint(This,x,y,pRetVal);
}
static __WIDL_INLINE HRESULT IRawElementProviderFragmentRoot_GetFocus(IRawElementProviderFragmentRoot* This,IRawElementProviderFragment **pRetVal) {
    return This->lpVtbl->GetFocus(This,pRetVal);
}
#endif
#endif

#endif


#endif  /* __IRawElementProviderFragmentRoot_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IRawElementProviderHwndOverride interface
 */
#ifndef __IRawElementProviderHwndOverride_INTERFACE_DEFINED__
#define __IRawElementProviderHwndOverride_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRawElementProviderHwndOverride, 0x1d5df27c, 0x8947, 0x4425, 0xb8,0xd9, 0x79,0x78,0x7b,0xb4,0x60,0xb8);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("1d5df27c-8947-4425-b8d9-79787bb460b8")
IRawElementProviderHwndOverride : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetOverrideProviderForHwnd(
        HWND hwnd,
        IRawElementProviderSimple **pRetVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRawElementProviderHwndOverride, 0x1d5df27c, 0x8947, 0x4425, 0xb8,0xd9, 0x79,0x78,0x7b,0xb4,0x60,0xb8)
#endif
#else
typedef struct IRawElementProviderHwndOverrideVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IRawElementProviderHwndOverride methods ***/
    HRESULT (STDMETHODCALLTYPE *GetOverrideProviderForHwnd)(
        IRawElementProviderHwndOverride *This,
        HWND hwnd,
        IRawElementProviderSimple **pRetVal);

    END_INTERFACE
} IRawElementProviderHwndOverrideVtbl;

interface IRawElementProviderHwndOverride {
    CONST_VTBL IRawElementProviderHwndOverrideVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRawElementProviderHwndOverride_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRawElementProviderHwndOverride_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRawElementProviderHwndOverride_Release(This) (This)->lpVtbl->Release(This)
/*** IRawElementProviderHwndOverride methods ***/
#define IRawElementProviderHwndOverride_GetOverrideProviderForHwnd(This,hwnd,pRetVal) (This)->lpVtbl->GetOverrideProviderForHwnd(This,hwnd,pRetVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IRawElementProviderHwndOverride_QueryInterface(IRawElementProviderHwndOverride* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IRawElementProviderHwndOverride_AddRef(IRawElementProviderHwndOverride* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IRawElementProviderHwndOverride_Release(IRawElementProviderHwndOverride* This) {
    return This->lpVtbl->Release(This);
}
/*** IRawElementProviderHwndOverride methods ***/
static __WIDL_INLINE HRESULT IRawElementProviderHwndOverride_GetOverrideProviderForHwnd(IRawElementProviderHwndOverride* This,HWND hwnd,IRawElementProviderSimple **pRetVal) {
    return This->lpVtbl->GetOverrideProviderForHwnd(This,hwnd,pRetVal);
}
#endif
#endif

#endif


#endif  /* __IRawElementProviderHwndOverride_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IRawElementProviderAdviseEvents interface
 */
#ifndef __IRawElementProviderAdviseEvents_INTERFACE_DEFINED__
#define __IRawElementProviderAdviseEvents_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRawElementProviderAdviseEvents, 0xa407b27b, 0x0f6d, 0x4427, 0x92,0x92, 0x47,0x3c,0x7b,0xf9,0x32,0x58);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a407b27b-0f6d-4427-9292-473c7bf93258")
IRawElementProviderAdviseEvents : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE AdviseEventAdded(
        EVENTID eventId,
        SAFEARRAY *propertyIDs) = 0;

    virtual HRESULT STDMETHODCALLTYPE AdviseEventRemoved(
        EVENTID eventId,
        SAFEARRAY *propertyIDs) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRawElementProviderAdviseEvents, 0xa407b27b, 0x0f6d, 0x4427, 0x92,0x92, 0x47,0x3c,0x7b,0xf9,0x32,0x58)
#endif
#else
typedef struct IRawElementProviderAdviseEventsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IRawElementProviderAdviseEvents methods ***/
    HRESULT (STDMETHODCALLTYPE *AdviseEventAdded)(
        IRawElementProviderAdviseEvents *This,
        EVENTID eventId,
        SAFEARRAY *propertyIDs);

    HRESULT (STDMETHODCALLTYPE *AdviseEventRemoved)(
        IRawElementProviderAdviseEvents *This,
        EVENTID eventId,
        SAFEARRAY *propertyIDs);

    END_INTERFACE
} IRawElementProviderAdviseEventsVtbl;

interface IRawElementProviderAdviseEvents {
    CONST_VTBL IRawElementProviderAdviseEventsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRawElementProviderAdviseEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRawElementProviderAdviseEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRawElementProviderAdviseEvents_Release(This) (This)->lpVtbl->Release(This)
/*** IRawElementProviderAdviseEvents methods ***/
#define IRawElementProviderAdviseEvents_AdviseEventAdded(This,eventId,propertyIDs) (This)->lpVtbl->AdviseEventAdded(This,eventId,propertyIDs)
#define IRawElementProviderAdviseEvents_AdviseEventRemoved(This,eventId,propertyIDs) (This)->lpVtbl->AdviseEventRemoved(This,eventId,propertyIDs)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IRawElementProviderAdviseEvents_QueryInterface(IRawElementProviderAdviseEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IRawElementProviderAdviseEvents_AddRef(IRawElementProviderAdviseEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IRawElementProviderAdviseEvents_Release(IRawElementProviderAdviseEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IRawElementProviderAdviseEvents methods ***/
static __WIDL_INLINE HRESULT IRawElementProviderAdviseEvents_AdviseEventAdded(IRawElementProviderAdviseEvents* This,EVENTID eventId,SAFEARRAY *propertyIDs) {
    return This->lpVtbl->AdviseEventAdded(This,eventId,propertyIDs);
}
static __WIDL_INLINE HRESULT IRawElementProviderAdviseEvents_AdviseEventRemoved(IRawElementProviderAdviseEvents* This,EVENTID eventId,SAFEARRAY *propertyIDs) {
    return This->lpVtbl->AdviseEventRemoved(This,eventId,propertyIDs);
}
#endif
#endif

#endif


#endif  /* __IRawElementProviderAdviseEvents_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IProxyProviderWinEventSink interface
 */
#ifndef __IProxyProviderWinEventSink_INTERFACE_DEFINED__
#define __IProxyProviderWinEventSink_INTERFACE_DEFINED__

DEFINE_GUID(IID_IProxyProviderWinEventSink, 0x4fd82b78, 0xa43e, 0x46ac, 0x98,0x03, 0x0a,0x69,0x69,0xc7,0xc1,0x83);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("4fd82b78-a43e-46ac-9803-0a6969c7c183")
IProxyProviderWinEventSink : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE AddAutomationPropertyChangedEvent(
        IRawElementProviderSimple *pProvider,
        PROPERTYID id,
        VARIANT newValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddAutomationEvent(
        IRawElementProviderSimple *pProvider,
        EVENTID id) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddStructureChangedEvent(
        IRawElementProviderSimple *pProvider,
        enum StructureChangeType structureChangeType,
        SAFEARRAY *runtimeId) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IProxyProviderWinEventSink, 0x4fd82b78, 0xa43e, 0x46ac, 0x98,0x03, 0x0a,0x69,0x69,0xc7,0xc1,0x83)
#endif
#else
typedef struct IProxyProviderWinEventSinkVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IProxyProviderWinEventSink methods ***/
    HRESULT (STDMETHODCALLTYPE *AddAutomationPropertyChangedEvent)(
        IProxyProviderWinEventSink *This,
        IRawElementProviderSimple *pProvider,
        PROPERTYID id,
        VARIANT newValue);

    HRESULT (STDMETHODCALLTYPE *AddAutomationEvent)(
        IProxyProviderWinEventSink *This,
        IRawElementProviderSimple *pProvider,
        EVENTID id);

    HRESULT (STDMETHODCALLTYPE *AddStructureChangedEvent)(
        IProxyProviderWinEventSink *This,
        IRawElementProviderSimple *pProvider,
        enum StructureChangeType structureChangeType,
        SAFEARRAY *runtimeId);

    END_INTERFACE
} IProxyProviderWinEventSinkVtbl;

interface IProxyProviderWinEventSink {
    CONST_VTBL IProxyProviderWinEventSinkVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IProxyProviderWinEventSink_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IProxyProviderWinEventSink_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IProxyProviderWinEventSink_Release(This) (This)->lpVtbl->Release(This)
/*** IProxyProviderWinEventSink methods ***/
#define IProxyProviderWinEventSink_AddAutomationPropertyChangedEvent(This,pProvider,id,newValue) (This)->lpVtbl->AddAutomationPropertyChangedEvent(This,pProvider,id,newValue)
#define IProxyProviderWinEventSink_AddAutomationEvent(This,pProvider,id) (This)->lpVtbl->AddAutomationEvent(This,pProvider,id)
#define IProxyProviderWinEventSink_AddStructureChangedEvent(This,pProvider,structureChangeType,runtimeId) (This)->lpVtbl->AddStructureChangedEvent(This,pProvider,structureChangeType,runtimeId)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IProxyProviderWinEventSink_QueryInterface(IProxyProviderWinEventSink* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IProxyProviderWinEventSink_AddRef(IProxyProviderWinEventSink* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IProxyProviderWinEventSink_Release(IProxyProviderWinEventSink* This) {
    return This->lpVtbl->Release(This);
}
/*** IProxyProviderWinEventSink methods ***/
static __WIDL_INLINE HRESULT IProxyProviderWinEventSink_AddAutomationPropertyChangedEvent(IProxyProviderWinEventSink* This,IRawElementProviderSimple *pProvider,PROPERTYID id,VARIANT newValue) {
    return This->lpVtbl->AddAutomationPropertyChangedEvent(This,pProvider,id,newValue);
}
static __WIDL_INLINE HRESULT IProxyProviderWinEventSink_AddAutomationEvent(IProxyProviderWinEventSink* This,IRawElementProviderSimple *pProvider,EVENTID id) {
    return This->lpVtbl->AddAutomationEvent(This,pProvider,id);
}
static __WIDL_INLINE HRESULT IProxyProviderWinEventSink_AddStructureChangedEvent(IProxyProviderWinEventSink* This,IRawElementProviderSimple *pProvider,enum StructureChangeType structureChangeType,SAFEARRAY *runtimeId) {
    return This->lpVtbl->AddStructureChangedEvent(This,pProvider,structureChangeType,runtimeId);
}
#endif
#endif

#endif


#endif  /* __IProxyProviderWinEventSink_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IProxyProviderWinEventHandler interface
 */
#ifndef __IProxyProviderWinEventHandler_INTERFACE_DEFINED__
#define __IProxyProviderWinEventHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID_IProxyProviderWinEventHandler, 0x89592ad4, 0xf4e0, 0x43d5, 0xa3,0xb6, 0xba,0xd7,0xe1,0x11,0xb4,0x35);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("89592ad4-f4e0-43d5-a3b6-bad7e111b435")
IProxyProviderWinEventHandler : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE RespondToWinEvent(
        DWORD idWinEvent,
        HWND hwnd,
        LONG idObject,
        LONG idChild,
        IProxyProviderWinEventSink *pSink) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IProxyProviderWinEventHandler, 0x89592ad4, 0xf4e0, 0x43d5, 0xa3,0xb6, 0xba,0xd7,0xe1,0x11,0xb4,0x35)
#endif
#else
typedef struct IProxyProviderWinEventHandlerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IProxyProviderWinEventHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *RespondToWinEvent)(
        IProxyProviderWinEventHandler *This,
        DWORD idWinEvent,
        HWND hwnd,
        LONG idObject,
        LONG idChild,
        IProxyProviderWinEventSink *pSink);

    END_INTERFACE
} IProxyProviderWinEventHandlerVtbl;

interface IProxyProviderWinEventHandler {
    CONST_VTBL IProxyProviderWinEventHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IProxyProviderWinEventHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IProxyProviderWinEventHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IProxyProviderWinEventHandler_Release(This) (This)->lpVtbl->Release(This)
/*** IProxyProviderWinEventHandler methods ***/
#define IProxyProviderWinEventHandler_RespondToWinEvent(This,idWinEvent,hwnd,idObject,idChild,pSink) (This)->lpVtbl->RespondToWinEvent(This,idWinEvent,hwnd,idObject,idChild,pSink)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IProxyProviderWinEventHandler_QueryInterface(IProxyProviderWinEventHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IProxyProviderWinEventHandler_AddRef(IProxyProviderWinEventHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IProxyProviderWinEventHandler_Release(IProxyProviderWinEventHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IProxyProviderWinEventHandler methods ***/
static __WIDL_INLINE HRESULT IProxyProviderWinEventHandler_RespondToWinEvent(IProxyProviderWinEventHandler* This,DWORD idWinEvent,HWND hwnd,LONG idObject,LONG idChild,IProxyProviderWinEventSink *pSink) {
    return This->lpVtbl->RespondToWinEvent(This,idWinEvent,hwnd,idObject,idChild,pSink);
}
#endif
#endif

#endif


#endif  /* __IProxyProviderWinEventHandler_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IRawElementProviderWindowlessSite interface
 */
#ifndef __IRawElementProviderWindowlessSite_INTERFACE_DEFINED__
#define __IRawElementProviderWindowlessSite_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRawElementProviderWindowlessSite, 0x0a2a93cc, 0xbfad, 0x42ac, 0x9b,0x2e, 0x09,0x91,0xfb,0x0d,0x3e,0xa0);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("0a2a93cc-bfad-42ac-9b2e-0991fb0d3ea0")
IRawElementProviderWindowlessSite : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetAdjacentFragment(
        enum NavigateDirection direction,
        IRawElementProviderFragment **ppParent) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRuntimeIdPrefix(
        SAFEARRAY **pRetVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRawElementProviderWindowlessSite, 0x0a2a93cc, 0xbfad, 0x42ac, 0x9b,0x2e, 0x09,0x91,0xfb,0x0d,0x3e,0xa0)
#endif
#else
typedef struct IRawElementProviderWindowlessSiteVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IRawElementProviderWindowlessSite methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAdjacentFragment)(
        IRawElementProviderWindowlessSite *This,
        enum NavigateDirection direction,
        IRawElementProviderFragment **ppParent);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeIdPrefix)(
        IRawElementProviderWindowlessSite *This,
        SAFEARRAY **pRetVal);

    END_INTERFACE
} IRawElementProviderWindowlessSiteVtbl;

interface IRawElementProviderWindowlessSite {
    CONST_VTBL IRawElementProviderWindowlessSiteVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRawElementProviderWindowlessSite_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRawElementProviderWindowlessSite_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRawElementProviderWindowlessSite_Release(This) (This)->lpVtbl->Release(This)
/*** IRawElementProviderWindowlessSite methods ***/
#define IRawElementProviderWindowlessSite_GetAdjacentFragment(This,direction,ppParent) (This)->lpVtbl->GetAdjacentFragment(This,direction,ppParent)
#define IRawElementProviderWindowlessSite_GetRuntimeIdPrefix(This,pRetVal) (This)->lpVtbl->GetRuntimeIdPrefix(This,pRetVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IRawElementProviderWindowlessSite_QueryInterface(IRawElementProviderWindowlessSite* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IRawElementProviderWindowlessSite_AddRef(IRawElementProviderWindowlessSite* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IRawElementProviderWindowlessSite_Release(IRawElementProviderWindowlessSite* This) {
    return This->lpVtbl->Release(This);
}
/*** IRawElementProviderWindowlessSite methods ***/
static __WIDL_INLINE HRESULT IRawElementProviderWindowlessSite_GetAdjacentFragment(IRawElementProviderWindowlessSite* This,enum NavigateDirection direction,IRawElementProviderFragment **ppParent) {
    return This->lpVtbl->GetAdjacentFragment(This,direction,ppParent);
}
static __WIDL_INLINE HRESULT IRawElementProviderWindowlessSite_GetRuntimeIdPrefix(IRawElementProviderWindowlessSite* This,SAFEARRAY **pRetVal) {
    return This->lpVtbl->GetRuntimeIdPrefix(This,pRetVal);
}
#endif
#endif

#endif


#endif  /* __IRawElementProviderWindowlessSite_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAccessibleHostingElementProviders interface
 */
#ifndef __IAccessibleHostingElementProviders_INTERFACE_DEFINED__
#define __IAccessibleHostingElementProviders_INTERFACE_DEFINED__

DEFINE_GUID(IID_IAccessibleHostingElementProviders, 0x33ac331b, 0x943e, 0x4020, 0xb2,0x95, 0xdb,0x37,0x78,0x49,0x74,0xa3);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("33ac331b-943e-4020-b295-db37784974a3")
IAccessibleHostingElementProviders : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetEmbeddedFragmentRoots(
        SAFEARRAY **pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetObjectIdForProvider(
        IRawElementProviderSimple *pProvider,
        LONG *pidObject) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IAccessibleHostingElementProviders, 0x33ac331b, 0x943e, 0x4020, 0xb2,0x95, 0xdb,0x37,0x78,0x49,0x74,0xa3)
#endif
#else
typedef struct IAccessibleHostingElementProvidersVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAccessibleHostingElementProviders methods ***/
    HRESULT (STDMETHODCALLTYPE *GetEmbeddedFragmentRoots)(
        IAccessibleHostingElementProviders *This,
        SAFEARRAY **pRetVal);

    HRESULT (STDMETHODCALLTYPE *GetObjectIdForProvider)(
        IAccessibleHostingElementProviders *This,
        IRawElementProviderSimple *pProvider,
        LONG *pidObject);

    END_INTERFACE
} IAccessibleHostingElementProvidersVtbl;

interface IAccessibleHostingElementProviders {
    CONST_VTBL IAccessibleHostingElementProvidersVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IAccessibleHostingElementProviders_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IAccessibleHostingElementProviders_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IAccessibleHostingElementProviders_Release(This) (This)->lpVtbl->Release(This)
/*** IAccessibleHostingElementProviders methods ***/
#define IAccessibleHostingElementProviders_GetEmbeddedFragmentRoots(This,pRetVal) (This)->lpVtbl->GetEmbeddedFragmentRoots(This,pRetVal)
#define IAccessibleHostingElementProviders_GetObjectIdForProvider(This,pProvider,pidObject) (This)->lpVtbl->GetObjectIdForProvider(This,pProvider,pidObject)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IAccessibleHostingElementProviders_QueryInterface(IAccessibleHostingElementProviders* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IAccessibleHostingElementProviders_AddRef(IAccessibleHostingElementProviders* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IAccessibleHostingElementProviders_Release(IAccessibleHostingElementProviders* This) {
    return This->lpVtbl->Release(This);
}
/*** IAccessibleHostingElementProviders methods ***/
static __WIDL_INLINE HRESULT IAccessibleHostingElementProviders_GetEmbeddedFragmentRoots(IAccessibleHostingElementProviders* This,SAFEARRAY **pRetVal) {
    return This->lpVtbl->GetEmbeddedFragmentRoots(This,pRetVal);
}
static __WIDL_INLINE HRESULT IAccessibleHostingElementProviders_GetObjectIdForProvider(IAccessibleHostingElementProviders* This,IRawElementProviderSimple *pProvider,LONG *pidObject) {
    return This->lpVtbl->GetObjectIdForProvider(This,pProvider,pidObject);
}
#endif
#endif

#endif


#endif  /* __IAccessibleHostingElementProviders_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IRawElementProviderHostingAccessibles interface
 */
#ifndef __IRawElementProviderHostingAccessibles_INTERFACE_DEFINED__
#define __IRawElementProviderHostingAccessibles_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRawElementProviderHostingAccessibles, 0x24be0b07, 0xd37d, 0x487a, 0x98,0xcf, 0xa1,0x3e,0xd4,0x65,0xe9,0xb3);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("24be0b07-d37d-487a-98cf-a13ed465e9b3")
IRawElementProviderHostingAccessibles : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetEmbeddedAccessibles(
        SAFEARRAY **pRetVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRawElementProviderHostingAccessibles, 0x24be0b07, 0xd37d, 0x487a, 0x98,0xcf, 0xa1,0x3e,0xd4,0x65,0xe9,0xb3)
#endif
#else
typedef struct IRawElementProviderHostingAccessiblesVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IRawElementProviderHostingAccessibles methods ***/
    HRESULT (STDMETHODCALLTYPE *GetEmbeddedAccessibles)(
        IRawElementProviderHostingAccessibles *This,
        SAFEARRAY **pRetVal);

    END_INTERFACE
} IRawElementProviderHostingAccessiblesVtbl;

interface IRawElementProviderHostingAccessibles {
    CONST_VTBL IRawElementProviderHostingAccessiblesVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRawElementProviderHostingAccessibles_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRawElementProviderHostingAccessibles_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRawElementProviderHostingAccessibles_Release(This) (This)->lpVtbl->Release(This)
/*** IRawElementProviderHostingAccessibles methods ***/
#define IRawElementProviderHostingAccessibles_GetEmbeddedAccessibles(This,pRetVal) (This)->lpVtbl->GetEmbeddedAccessibles(This,pRetVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IRawElementProviderHostingAccessibles_QueryInterface(IRawElementProviderHostingAccessibles* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IRawElementProviderHostingAccessibles_AddRef(IRawElementProviderHostingAccessibles* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IRawElementProviderHostingAccessibles_Release(IRawElementProviderHostingAccessibles* This) {
    return This->lpVtbl->Release(This);
}
/*** IRawElementProviderHostingAccessibles methods ***/
static __WIDL_INLINE HRESULT IRawElementProviderHostingAccessibles_GetEmbeddedAccessibles(IRawElementProviderHostingAccessibles* This,SAFEARRAY **pRetVal) {
    return This->lpVtbl->GetEmbeddedAccessibles(This,pRetVal);
}
#endif
#endif

#endif


#endif  /* __IRawElementProviderHostingAccessibles_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ILegacyIAccessibleProvider interface
 */
#ifndef __ILegacyIAccessibleProvider_INTERFACE_DEFINED__
#define __ILegacyIAccessibleProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID_ILegacyIAccessibleProvider, 0xe44c3566, 0x915d, 0x4070, 0x99,0xc6, 0x04,0x7b,0xff,0x5a,0x08,0xf5);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("e44c3566-915d-4070-99c6-047bff5a08f5")
ILegacyIAccessibleProvider : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Select(
        LONG flagsSelect) = 0;

    virtual HRESULT STDMETHODCALLTYPE DoDefaultAction(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetValue(
        LPCWSTR szValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetIAccessible(
        IAccessible **ppAccessible) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ChildId(
        int *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Name(
        BSTR *pszName) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Value(
        BSTR *pszValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Description(
        BSTR *pszDescription) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Role(
        DWORD *pdwRole) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_State(
        DWORD *pdwState) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Help(
        BSTR *pszHelp) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_KeyboardShortcut(
        BSTR *pszKeyboardShortcut) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSelection(
        SAFEARRAY **pvarSelectedChildren) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_DefaultAction(
        BSTR *pszDefaultAction) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ILegacyIAccessibleProvider, 0xe44c3566, 0x915d, 0x4070, 0x99,0xc6, 0x04,0x7b,0xff,0x5a,0x08,0xf5)
#endif
#else
typedef struct ILegacyIAccessibleProviderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ILegacyIAccessibleProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *Select)(
        ILegacyIAccessibleProvider *This,
        LONG flagsSelect);

    HRESULT (STDMETHODCALLTYPE *DoDefaultAction)(
        ILegacyIAccessibleProvider *This);

    HRESULT (STDMETHODCALLTYPE *SetValue)(
        ILegacyIAccessibleProvider *This,
        LPCWSTR szValue);

    HRESULT (STDMETHODCALLTYPE *GetIAccessible)(
        ILegacyIAccessibleProvider *This,
        IAccessible **ppAccessible);

    HRESULT (STDMETHODCALLTYPE *get_ChildId)(
        ILegacyIAccessibleProvider *This,
        int *pRetVal);

    HRESULT (STDMETHODCALLTYPE *get_Name)(
        ILegacyIAccessibleProvider *This,
        BSTR *pszName);

    HRESULT (STDMETHODCALLTYPE *get_Value)(
        ILegacyIAccessibleProvider *This,
        BSTR *pszValue);

    HRESULT (STDMETHODCALLTYPE *get_Description)(
        ILegacyIAccessibleProvider *This,
        BSTR *pszDescription);

    HRESULT (STDMETHODCALLTYPE *get_Role)(
        ILegacyIAccessibleProvider *This,
        DWORD *pdwRole);

    HRESULT (STDMETHODCALLTYPE *get_State)(
        ILegacyIAccessibleProvider *This,
        DWORD *pdwState);

    HRESULT (STDMETHODCALLTYPE *get_Help)(
        ILegacyIAccessibleProvider *This,
        BSTR *pszHelp);

    HRESULT (STDMETHODCALLTYPE *get_KeyboardShortcut)(
        ILegacyIAccessibleProvider *This,
        BSTR *pszKeyboardShortcut);

    HRESULT (STDMETHODCALLTYPE *GetSelection)(
        ILegacyIAccessibleProvider *This,
        SAFEARRAY **pvarSelectedChildren);

    HRESULT (STDMETHODCALLTYPE *get_DefaultAction)(
        ILegacyIAccessibleProvider *This,
        BSTR *pszDefaultAction);

    END_INTERFACE
} ILegacyIAccessibleProviderVtbl;

interface ILegacyIAccessibleProvider {
    CONST_VTBL ILegacyIAccessibleProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ILegacyIAccessibleProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ILegacyIAccessibleProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ILegacyIAccessibleProvider_Release(This) (This)->lpVtbl->Release(This)
/*** ILegacyIAccessibleProvider methods ***/
#define ILegacyIAccessibleProvider_Select(This,flagsSelect) (This)->lpVtbl->Select(This,flagsSelect)
#define ILegacyIAccessibleProvider_DoDefaultAction(This) (This)->lpVtbl->DoDefaultAction(This)
#define ILegacyIAccessibleProvider_SetValue(This,szValue) (This)->lpVtbl->SetValue(This,szValue)
#define ILegacyIAccessibleProvider_GetIAccessible(This,ppAccessible) (This)->lpVtbl->GetIAccessible(This,ppAccessible)
#define ILegacyIAccessibleProvider_get_ChildId(This,pRetVal) (This)->lpVtbl->get_ChildId(This,pRetVal)
#define ILegacyIAccessibleProvider_get_Name(This,pszName) (This)->lpVtbl->get_Name(This,pszName)
#define ILegacyIAccessibleProvider_get_Value(This,pszValue) (This)->lpVtbl->get_Value(This,pszValue)
#define ILegacyIAccessibleProvider_get_Description(This,pszDescription) (This)->lpVtbl->get_Description(This,pszDescription)
#define ILegacyIAccessibleProvider_get_Role(This,pdwRole) (This)->lpVtbl->get_Role(This,pdwRole)
#define ILegacyIAccessibleProvider_get_State(This,pdwState) (This)->lpVtbl->get_State(This,pdwState)
#define ILegacyIAccessibleProvider_get_Help(This,pszHelp) (This)->lpVtbl->get_Help(This,pszHelp)
#define ILegacyIAccessibleProvider_get_KeyboardShortcut(This,pszKeyboardShortcut) (This)->lpVtbl->get_KeyboardShortcut(This,pszKeyboardShortcut)
#define ILegacyIAccessibleProvider_GetSelection(This,pvarSelectedChildren) (This)->lpVtbl->GetSelection(This,pvarSelectedChildren)
#define ILegacyIAccessibleProvider_get_DefaultAction(This,pszDefaultAction) (This)->lpVtbl->get_DefaultAction(This,pszDefaultAction)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ILegacyIAccessibleProvider_QueryInterface(ILegacyIAccessibleProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ILegacyIAccessibleProvider_AddRef(ILegacyIAccessibleProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ILegacyIAccessibleProvider_Release(ILegacyIAccessibleProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** ILegacyIAccessibleProvider methods ***/
static __WIDL_INLINE HRESULT ILegacyIAccessibleProvider_Select(ILegacyIAccessibleProvider* This,LONG flagsSelect) {
    return This->lpVtbl->Select(This,flagsSelect);
}
static __WIDL_INLINE HRESULT ILegacyIAccessibleProvider_DoDefaultAction(ILegacyIAccessibleProvider* This) {
    return This->lpVtbl->DoDefaultAction(This);
}
static __WIDL_INLINE HRESULT ILegacyIAccessibleProvider_SetValue(ILegacyIAccessibleProvider* This,LPCWSTR szValue) {
    return This->lpVtbl->SetValue(This,szValue);
}
static __WIDL_INLINE HRESULT ILegacyIAccessibleProvider_GetIAccessible(ILegacyIAccessibleProvider* This,IAccessible **ppAccessible) {
    return This->lpVtbl->GetIAccessible(This,ppAccessible);
}
static __WIDL_INLINE HRESULT ILegacyIAccessibleProvider_get_ChildId(ILegacyIAccessibleProvider* This,int *pRetVal) {
    return This->lpVtbl->get_ChildId(This,pRetVal);
}
static __WIDL_INLINE HRESULT ILegacyIAccessibleProvider_get_Name(ILegacyIAccessibleProvider* This,BSTR *pszName) {
    return This->lpVtbl->get_Name(This,pszName);
}
static __WIDL_INLINE HRESULT ILegacyIAccessibleProvider_get_Value(ILegacyIAccessibleProvider* This,BSTR *pszValue) {
    return This->lpVtbl->get_Value(This,pszValue);
}
static __WIDL_INLINE HRESULT ILegacyIAccessibleProvider_get_Description(ILegacyIAccessibleProvider* This,BSTR *pszDescription) {
    return This->lpVtbl->get_Description(This,pszDescription);
}
static __WIDL_INLINE HRESULT ILegacyIAccessibleProvider_get_Role(ILegacyIAccessibleProvider* This,DWORD *pdwRole) {
    return This->lpVtbl->get_Role(This,pdwRole);
}
static __WIDL_INLINE HRESULT ILegacyIAccessibleProvider_get_State(ILegacyIAccessibleProvider* This,DWORD *pdwState) {
    return This->lpVtbl->get_State(This,pdwState);
}
static __WIDL_INLINE HRESULT ILegacyIAccessibleProvider_get_Help(ILegacyIAccessibleProvider* This,BSTR *pszHelp) {
    return This->lpVtbl->get_Help(This,pszHelp);
}
static __WIDL_INLINE HRESULT ILegacyIAccessibleProvider_get_KeyboardShortcut(ILegacyIAccessibleProvider* This,BSTR *pszKeyboardShortcut) {
    return This->lpVtbl->get_KeyboardShortcut(This,pszKeyboardShortcut);
}
static __WIDL_INLINE HRESULT ILegacyIAccessibleProvider_GetSelection(ILegacyIAccessibleProvider* This,SAFEARRAY **pvarSelectedChildren) {
    return This->lpVtbl->GetSelection(This,pvarSelectedChildren);
}
static __WIDL_INLINE HRESULT ILegacyIAccessibleProvider_get_DefaultAction(ILegacyIAccessibleProvider* This,BSTR *pszDefaultAction) {
    return This->lpVtbl->get_DefaultAction(This,pszDefaultAction);
}
#endif
#endif

#endif


#endif  /* __ILegacyIAccessibleProvider_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDockProvider interface
 */
#ifndef __IDockProvider_INTERFACE_DEFINED__
#define __IDockProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDockProvider, 0x159bc72c, 0x4ad3, 0x485e, 0x96,0x37, 0xd7,0x05,0x2e,0xdf,0x01,0x46);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("159bc72c-4ad3-485e-9637-d7052edf0146")
IDockProvider : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetDockPosition(
        enum DockPosition dockPosition) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_DockPosition(
        enum DockPosition *pRetVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDockProvider, 0x159bc72c, 0x4ad3, 0x485e, 0x96,0x37, 0xd7,0x05,0x2e,0xdf,0x01,0x46)
#endif
#else
typedef struct IDockProviderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDockProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *SetDockPosition)(
        IDockProvider *This,
        enum DockPosition dockPosition);

    HRESULT (STDMETHODCALLTYPE *get_DockPosition)(
        IDockProvider *This,
        enum DockPosition *pRetVal);

    END_INTERFACE
} IDockProviderVtbl;

interface IDockProvider {
    CONST_VTBL IDockProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDockProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDockProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDockProvider_Release(This) (This)->lpVtbl->Release(This)
/*** IDockProvider methods ***/
#define IDockProvider_SetDockPosition(This,dockPosition) (This)->lpVtbl->SetDockPosition(This,dockPosition)
#define IDockProvider_get_DockPosition(This,pRetVal) (This)->lpVtbl->get_DockPosition(This,pRetVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IDockProvider_QueryInterface(IDockProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDockProvider_AddRef(IDockProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDockProvider_Release(IDockProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** IDockProvider methods ***/
static __WIDL_INLINE HRESULT IDockProvider_SetDockPosition(IDockProvider* This,enum DockPosition dockPosition) {
    return This->lpVtbl->SetDockPosition(This,dockPosition);
}
static __WIDL_INLINE HRESULT IDockProvider_get_DockPosition(IDockProvider* This,enum DockPosition *pRetVal) {
    return This->lpVtbl->get_DockPosition(This,pRetVal);
}
#endif
#endif

#endif


#endif  /* __IDockProvider_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IExpandCollapseProvider interface
 */
#ifndef __IExpandCollapseProvider_INTERFACE_DEFINED__
#define __IExpandCollapseProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID_IExpandCollapseProvider, 0xd847d3a5, 0xcab0, 0x4a98, 0x8c,0x32, 0xec,0xb4,0x5c,0x59,0xad,0x24);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d847d3a5-cab0-4a98-8c32-ecb45c59ad24")
IExpandCollapseProvider : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Expand(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Collapse(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ExpandCollapseState(
        enum ExpandCollapseState *pRetVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IExpandCollapseProvider, 0xd847d3a5, 0xcab0, 0x4a98, 0x8c,0x32, 0xec,0xb4,0x5c,0x59,0xad,0x24)
#endif
#else
typedef struct IExpandCollapseProviderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IExpandCollapseProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *Expand)(
        IExpandCollapseProvider *This);

    HRESULT (STDMETHODCALLTYPE *Collapse)(
        IExpandCollapseProvider *This);

    HRESULT (STDMETHODCALLTYPE *get_ExpandCollapseState)(
        IExpandCollapseProvider *This,
        enum ExpandCollapseState *pRetVal);

    END_INTERFACE
} IExpandCollapseProviderVtbl;

interface IExpandCollapseProvider {
    CONST_VTBL IExpandCollapseProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IExpandCollapseProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IExpandCollapseProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IExpandCollapseProvider_Release(This) (This)->lpVtbl->Release(This)
/*** IExpandCollapseProvider methods ***/
#define IExpandCollapseProvider_Expand(This) (This)->lpVtbl->Expand(This)
#define IExpandCollapseProvider_Collapse(This) (This)->lpVtbl->Collapse(This)
#define IExpandCollapseProvider_get_ExpandCollapseState(This,pRetVal) (This)->lpVtbl->get_ExpandCollapseState(This,pRetVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IExpandCollapseProvider_QueryInterface(IExpandCollapseProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IExpandCollapseProvider_AddRef(IExpandCollapseProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IExpandCollapseProvider_Release(IExpandCollapseProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** IExpandCollapseProvider methods ***/
static __WIDL_INLINE HRESULT IExpandCollapseProvider_Expand(IExpandCollapseProvider* This) {
    return This->lpVtbl->Expand(This);
}
static __WIDL_INLINE HRESULT IExpandCollapseProvider_Collapse(IExpandCollapseProvider* This) {
    return This->lpVtbl->Collapse(This);
}
static __WIDL_INLINE HRESULT IExpandCollapseProvider_get_ExpandCollapseState(IExpandCollapseProvider* This,enum ExpandCollapseState *pRetVal) {
    return This->lpVtbl->get_ExpandCollapseState(This,pRetVal);
}
#endif
#endif

#endif


#endif  /* __IExpandCollapseProvider_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IGridProvider interface
 */
#ifndef __IGridProvider_INTERFACE_DEFINED__
#define __IGridProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID_IGridProvider, 0xb17d6187, 0x0907, 0x464b, 0xa1,0x68, 0x0e,0xf1,0x7a,0x15,0x72,0xb1);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("b17d6187-0907-464b-a168-0ef17a1572b1")
IGridProvider : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetItem(
        int row,
        int column,
        IRawElementProviderSimple **pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_RowCount(
        int *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ColumnCount(
        int *pRetVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IGridProvider, 0xb17d6187, 0x0907, 0x464b, 0xa1,0x68, 0x0e,0xf1,0x7a,0x15,0x72,0xb1)
#endif
#else
typedef struct IGridProviderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IGridProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *GetItem)(
        IGridProvider *This,
        int row,
        int column,
        IRawElementProviderSimple **pRetVal);

    HRESULT (STDMETHODCALLTYPE *get_RowCount)(
        IGridProvider *This,
        int *pRetVal);

    HRESULT (STDMETHODCALLTYPE *get_ColumnCount)(
        IGridProvider *This,
        int *pRetVal);

    END_INTERFACE
} IGridProviderVtbl;

interface IGridProvider {
    CONST_VTBL IGridProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IGridProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IGridProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IGridProvider_Release(This) (This)->lpVtbl->Release(This)
/*** IGridProvider methods ***/
#define IGridProvider_GetItem(This,row,column,pRetVal) (This)->lpVtbl->GetItem(This,row,column,pRetVal)
#define IGridProvider_get_RowCount(This,pRetVal) (This)->lpVtbl->get_RowCount(This,pRetVal)
#define IGridProvider_get_ColumnCount(This,pRetVal) (This)->lpVtbl->get_ColumnCount(This,pRetVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IGridProvider_QueryInterface(IGridProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IGridProvider_AddRef(IGridProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IGridProvider_Release(IGridProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** IGridProvider methods ***/
static __WIDL_INLINE HRESULT IGridProvider_GetItem(IGridProvider* This,int row,int column,IRawElementProviderSimple **pRetVal) {
    return This->lpVtbl->GetItem(This,row,column,pRetVal);
}
static __WIDL_INLINE HRESULT IGridProvider_get_RowCount(IGridProvider* This,int *pRetVal) {
    return This->lpVtbl->get_RowCount(This,pRetVal);
}
static __WIDL_INLINE HRESULT IGridProvider_get_ColumnCount(IGridProvider* This,int *pRetVal) {
    return This->lpVtbl->get_ColumnCount(This,pRetVal);
}
#endif
#endif

#endif


#endif  /* __IGridProvider_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IGridItemProvider interface
 */
#ifndef __IGridItemProvider_INTERFACE_DEFINED__
#define __IGridItemProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID_IGridItemProvider, 0xd02541f1, 0xfb81, 0x4d64, 0xae,0x32, 0xf5,0x20,0xf8,0xa6,0xdb,0xd1);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d02541f1-fb81-4d64-ae32-f520f8a6dbd1")
IGridItemProvider : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE get_Row(
        int *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Column(
        int *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_RowSpan(
        int *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ColumnSpan(
        int *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ContainingGrid(
        IRawElementProviderSimple **pRetVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IGridItemProvider, 0xd02541f1, 0xfb81, 0x4d64, 0xae,0x32, 0xf5,0x20,0xf8,0xa6,0xdb,0xd1)
#endif
#else
typedef struct IGridItemProviderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IGridItemProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Row)(
        IGridItemProvider *This,
        int *pRetVal);

    HRESULT (STDMETHODCALLTYPE *get_Column)(
        IGridItemProvider *This,
        int *pRetVal);

    HRESULT (STDMETHODCALLTYPE *get_RowSpan)(
        IGridItemProvider *This,
        int *pRetVal);

    HRESULT (STDMETHODCALLTYPE *get_ColumnSpan)(
        IGridItemProvider *This,
        int *pRetVal);

    HRESULT (STDMETHODCALLTYPE *get_ContainingGrid)(
        IGridItemProvider *This,
        IRawElementProviderSimple **pRetVal);

    END_INTERFACE
} IGridItemProviderVtbl;

interface IGridItemProvider {
    CONST_VTBL IGridItemProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IGridItemProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IGridItemProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IGridItemProvider_Release(This) (This)->lpVtbl->Release(This)
/*** IGridItemProvider methods ***/
#define IGridItemProvider_get_Row(This,pRetVal) (This)->lpVtbl->get_Row(This,pRetVal)
#define IGridItemProvider_get_Column(This,pRetVal) (This)->lpVtbl->get_Column(This,pRetVal)
#define IGridItemProvider_get_RowSpan(This,pRetVal) (This)->lpVtbl->get_RowSpan(This,pRetVal)
#define IGridItemProvider_get_ColumnSpan(This,pRetVal) (This)->lpVtbl->get_ColumnSpan(This,pRetVal)
#define IGridItemProvider_get_ContainingGrid(This,pRetVal) (This)->lpVtbl->get_ContainingGrid(This,pRetVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IGridItemProvider_QueryInterface(IGridItemProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IGridItemProvider_AddRef(IGridItemProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IGridItemProvider_Release(IGridItemProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** IGridItemProvider methods ***/
static __WIDL_INLINE HRESULT IGridItemProvider_get_Row(IGridItemProvider* This,int *pRetVal) {
    return This->lpVtbl->get_Row(This,pRetVal);
}
static __WIDL_INLINE HRESULT IGridItemProvider_get_Column(IGridItemProvider* This,int *pRetVal) {
    return This->lpVtbl->get_Column(This,pRetVal);
}
static __WIDL_INLINE HRESULT IGridItemProvider_get_RowSpan(IGridItemProvider* This,int *pRetVal) {
    return This->lpVtbl->get_RowSpan(This,pRetVal);
}
static __WIDL_INLINE HRESULT IGridItemProvider_get_ColumnSpan(IGridItemProvider* This,int *pRetVal) {
    return This->lpVtbl->get_ColumnSpan(This,pRetVal);
}
static __WIDL_INLINE HRESULT IGridItemProvider_get_ContainingGrid(IGridItemProvider* This,IRawElementProviderSimple **pRetVal) {
    return This->lpVtbl->get_ContainingGrid(This,pRetVal);
}
#endif
#endif

#endif


#endif  /* __IGridItemProvider_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IInvokeProvider interface
 */
#ifndef __IInvokeProvider_INTERFACE_DEFINED__
#define __IInvokeProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID_IInvokeProvider, 0x54fcb24b, 0xe18e, 0x47a2, 0xb4,0xd3, 0xec,0xcb,0xe7,0x75,0x99,0xa2);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("54fcb24b-e18e-47a2-b4d3-eccbe77599a2")
IInvokeProvider : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Invoke(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IInvokeProvider, 0x54fcb24b, 0xe18e, 0x47a2, 0xb4,0xd3, 0xec,0xcb,0xe7,0x75,0x99,0xa2)
#endif
#else
typedef struct IInvokeProviderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInvokeProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IInvokeProvider *This);

    END_INTERFACE
} IInvokeProviderVtbl;

interface IInvokeProvider {
    CONST_VTBL IInvokeProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IInvokeProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IInvokeProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IInvokeProvider_Release(This) (This)->lpVtbl->Release(This)
/*** IInvokeProvider methods ***/
#define IInvokeProvider_Invoke(This) (This)->lpVtbl->Invoke(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IInvokeProvider_QueryInterface(IInvokeProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IInvokeProvider_AddRef(IInvokeProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IInvokeProvider_Release(IInvokeProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** IInvokeProvider methods ***/
static __WIDL_INLINE HRESULT IInvokeProvider_Invoke(IInvokeProvider* This) {
    return This->lpVtbl->Invoke(This);
}
#endif
#endif

#endif


#endif  /* __IInvokeProvider_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMultipleViewProvider interface
 */
#ifndef __IMultipleViewProvider_INTERFACE_DEFINED__
#define __IMultipleViewProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMultipleViewProvider, 0x6278cab1, 0xb556, 0x4a1a, 0xb4,0xe0, 0x41,0x8a,0xcc,0x52,0x32,0x01);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("6278cab1-b556-4a1a-b4e0-418acc523201")
IMultipleViewProvider : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetViewName(
        int viewId,
        BSTR *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetCurrentView(
        int viewId) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CurrentView(
        int *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSupportedViews(
        SAFEARRAY **pRetVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMultipleViewProvider, 0x6278cab1, 0xb556, 0x4a1a, 0xb4,0xe0, 0x41,0x8a,0xcc,0x52,0x32,0x01)
#endif
#else
typedef struct IMultipleViewProviderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IMultipleViewProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *GetViewName)(
        IMultipleViewProvider *This,
        int viewId,
        BSTR *pRetVal);

    HRESULT (STDMETHODCALLTYPE *SetCurrentView)(
        IMultipleViewProvider *This,
        int viewId);

    HRESULT (STDMETHODCALLTYPE *get_CurrentView)(
        IMultipleViewProvider *This,
        int *pRetVal);

    HRESULT (STDMETHODCALLTYPE *GetSupportedViews)(
        IMultipleViewProvider *This,
        SAFEARRAY **pRetVal);

    END_INTERFACE
} IMultipleViewProviderVtbl;

interface IMultipleViewProvider {
    CONST_VTBL IMultipleViewProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMultipleViewProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMultipleViewProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMultipleViewProvider_Release(This) (This)->lpVtbl->Release(This)
/*** IMultipleViewProvider methods ***/
#define IMultipleViewProvider_GetViewName(This,viewId,pRetVal) (This)->lpVtbl->GetViewName(This,viewId,pRetVal)
#define IMultipleViewProvider_SetCurrentView(This,viewId) (This)->lpVtbl->SetCurrentView(This,viewId)
#define IMultipleViewProvider_get_CurrentView(This,pRetVal) (This)->lpVtbl->get_CurrentView(This,pRetVal)
#define IMultipleViewProvider_GetSupportedViews(This,pRetVal) (This)->lpVtbl->GetSupportedViews(This,pRetVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IMultipleViewProvider_QueryInterface(IMultipleViewProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IMultipleViewProvider_AddRef(IMultipleViewProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IMultipleViewProvider_Release(IMultipleViewProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** IMultipleViewProvider methods ***/
static __WIDL_INLINE HRESULT IMultipleViewProvider_GetViewName(IMultipleViewProvider* This,int viewId,BSTR *pRetVal) {
    return This->lpVtbl->GetViewName(This,viewId,pRetVal);
}
static __WIDL_INLINE HRESULT IMultipleViewProvider_SetCurrentView(IMultipleViewProvider* This,int viewId) {
    return This->lpVtbl->SetCurrentView(This,viewId);
}
static __WIDL_INLINE HRESULT IMultipleViewProvider_get_CurrentView(IMultipleViewProvider* This,int *pRetVal) {
    return This->lpVtbl->get_CurrentView(This,pRetVal);
}
static __WIDL_INLINE HRESULT IMultipleViewProvider_GetSupportedViews(IMultipleViewProvider* This,SAFEARRAY **pRetVal) {
    return This->lpVtbl->GetSupportedViews(This,pRetVal);
}
#endif
#endif

#endif


#endif  /* __IMultipleViewProvider_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IRangeValueProvider interface
 */
#ifndef __IRangeValueProvider_INTERFACE_DEFINED__
#define __IRangeValueProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRangeValueProvider, 0x36dc7aef, 0x33e6, 0x4691, 0xaf,0xe1, 0x2b,0xe7,0x27,0x4b,0x3d,0x33);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("36dc7aef-33e6-4691-afe1-2be7274b3d33")
IRangeValueProvider : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetValue(
        double val) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Value(
        double *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_IsReadOnly(
        WINBOOL *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Maximum(
        double *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Minimum(
        double *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_LargeChange(
        double *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_SmallChange(
        double *pRetVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRangeValueProvider, 0x36dc7aef, 0x33e6, 0x4691, 0xaf,0xe1, 0x2b,0xe7,0x27,0x4b,0x3d,0x33)
#endif
#else
typedef struct IRangeValueProviderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IRangeValueProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *SetValue)(
        IRangeValueProvider *This,
        double val);

    HRESULT (STDMETHODCALLTYPE *get_Value)(
        IRangeValueProvider *This,
        double *pRetVal);

    HRESULT (STDMETHODCALLTYPE *get_IsReadOnly)(
        IRangeValueProvider *This,
        WINBOOL *pRetVal);

    HRESULT (STDMETHODCALLTYPE *get_Maximum)(
        IRangeValueProvider *This,
        double *pRetVal);

    HRESULT (STDMETHODCALLTYPE *get_Minimum)(
        IRangeValueProvider *This,
        double *pRetVal);

    HRESULT (STDMETHODCALLTYPE *get_LargeChange)(
        IRangeValueProvider *This,
        double *pRetVal);

    HRESULT (STDMETHODCALLTYPE *get_SmallChange)(
        IRangeValueProvider *This,
        double *pRetVal);

    END_INTERFACE
} IRangeValueProviderVtbl;

interface IRangeValueProvider {
    CONST_VTBL IRangeValueProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRangeValueProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRangeValueProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRangeValueProvider_Release(This) (This)->lpVtbl->Release(This)
/*** IRangeValueProvider methods ***/
#define IRangeValueProvider_SetValue(This,val) (This)->lpVtbl->SetValue(This,val)
#define IRangeValueProvider_get_Value(This,pRetVal) (This)->lpVtbl->get_Value(This,pRetVal)
#define IRangeValueProvider_get_IsReadOnly(This,pRetVal) (This)->lpVtbl->get_IsReadOnly(This,pRetVal)
#define IRangeValueProvider_get_Maximum(This,pRetVal) (This)->lpVtbl->get_Maximum(This,pRetVal)
#define IRangeValueProvider_get_Minimum(This,pRetVal) (This)->lpVtbl->get_Minimum(This,pRetVal)
#define IRangeValueProvider_get_LargeChange(This,pRetVal) (This)->lpVtbl->get_LargeChange(This,pRetVal)
#define IRangeValueProvider_get_SmallChange(This,pRetVal) (This)->lpVtbl->get_SmallChange(This,pRetVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IRangeValueProvider_QueryInterface(IRangeValueProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IRangeValueProvider_AddRef(IRangeValueProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IRangeValueProvider_Release(IRangeValueProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** IRangeValueProvider methods ***/
static __WIDL_INLINE HRESULT IRangeValueProvider_SetValue(IRangeValueProvider* This,double val) {
    return This->lpVtbl->SetValue(This,val);
}
static __WIDL_INLINE HRESULT IRangeValueProvider_get_Value(IRangeValueProvider* This,double *pRetVal) {
    return This->lpVtbl->get_Value(This,pRetVal);
}
static __WIDL_INLINE HRESULT IRangeValueProvider_get_IsReadOnly(IRangeValueProvider* This,WINBOOL *pRetVal) {
    return This->lpVtbl->get_IsReadOnly(This,pRetVal);
}
static __WIDL_INLINE HRESULT IRangeValueProvider_get_Maximum(IRangeValueProvider* This,double *pRetVal) {
    return This->lpVtbl->get_Maximum(This,pRetVal);
}
static __WIDL_INLINE HRESULT IRangeValueProvider_get_Minimum(IRangeValueProvider* This,double *pRetVal) {
    return This->lpVtbl->get_Minimum(This,pRetVal);
}
static __WIDL_INLINE HRESULT IRangeValueProvider_get_LargeChange(IRangeValueProvider* This,double *pRetVal) {
    return This->lpVtbl->get_LargeChange(This,pRetVal);
}
static __WIDL_INLINE HRESULT IRangeValueProvider_get_SmallChange(IRangeValueProvider* This,double *pRetVal) {
    return This->lpVtbl->get_SmallChange(This,pRetVal);
}
#endif
#endif

#endif


#endif  /* __IRangeValueProvider_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IScrollItemProvider interface
 */
#ifndef __IScrollItemProvider_INTERFACE_DEFINED__
#define __IScrollItemProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID_IScrollItemProvider, 0x2360c714, 0x4bf1, 0x4b26, 0xba,0x65, 0x9b,0x21,0x31,0x61,0x27,0xeb);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2360c714-4bf1-4b26-ba65-9b21316127eb")
IScrollItemProvider : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE ScrollIntoView(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IScrollItemProvider, 0x2360c714, 0x4bf1, 0x4b26, 0xba,0x65, 0x9b,0x21,0x31,0x61,0x27,0xeb)
#endif
#else
typedef struct IScrollItemProviderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IScrollItemProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *ScrollIntoView)(
        IScrollItemProvider *This);

    END_INTERFACE
} IScrollItemProviderVtbl;

interface IScrollItemProvider {
    CONST_VTBL IScrollItemProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IScrollItemProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IScrollItemProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IScrollItemProvider_Release(This) (This)->lpVtbl->Release(This)
/*** IScrollItemProvider methods ***/
#define IScrollItemProvider_ScrollIntoView(This) (This)->lpVtbl->ScrollIntoView(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IScrollItemProvider_QueryInterface(IScrollItemProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IScrollItemProvider_AddRef(IScrollItemProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IScrollItemProvider_Release(IScrollItemProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** IScrollItemProvider methods ***/
static __WIDL_INLINE HRESULT IScrollItemProvider_ScrollIntoView(IScrollItemProvider* This) {
    return This->lpVtbl->ScrollIntoView(This);
}
#endif
#endif

#endif


#endif  /* __IScrollItemProvider_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISelectionProvider interface
 */
#ifndef __ISelectionProvider_INTERFACE_DEFINED__
#define __ISelectionProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISelectionProvider, 0xfb8b03af, 0x3bdf, 0x48d4, 0xbd,0x36, 0x1a,0x65,0x79,0x3b,0xe1,0x68);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("fb8b03af-3bdf-48d4-bd36-1a65793be168")
ISelectionProvider : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetSelection(
        SAFEARRAY **pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CanSelectMultiple(
        WINBOOL *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_IsSelectionRequired(
        WINBOOL *pRetVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISelectionProvider, 0xfb8b03af, 0x3bdf, 0x48d4, 0xbd,0x36, 0x1a,0x65,0x79,0x3b,0xe1,0x68)
#endif
#else
typedef struct ISelectionProviderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ISelectionProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSelection)(
        ISelectionProvider *This,
        SAFEARRAY **pRetVal);

    HRESULT (STDMETHODCALLTYPE *get_CanSelectMultiple)(
        ISelectionProvider *This,
        WINBOOL *pRetVal);

    HRESULT (STDMETHODCALLTYPE *get_IsSelectionRequired)(
        ISelectionProvider *This,
        WINBOOL *pRetVal);

    END_INTERFACE
} ISelectionProviderVtbl;

interface ISelectionProvider {
    CONST_VTBL ISelectionProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISelectionProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISelectionProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISelectionProvider_Release(This) (This)->lpVtbl->Release(This)
/*** ISelectionProvider methods ***/
#define ISelectionProvider_GetSelection(This,pRetVal) (This)->lpVtbl->GetSelection(This,pRetVal)
#define ISelectionProvider_get_CanSelectMultiple(This,pRetVal) (This)->lpVtbl->get_CanSelectMultiple(This,pRetVal)
#define ISelectionProvider_get_IsSelectionRequired(This,pRetVal) (This)->lpVtbl->get_IsSelectionRequired(This,pRetVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ISelectionProvider_QueryInterface(ISelectionProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISelectionProvider_AddRef(ISelectionProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISelectionProvider_Release(ISelectionProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** ISelectionProvider methods ***/
static __WIDL_INLINE HRESULT ISelectionProvider_GetSelection(ISelectionProvider* This,SAFEARRAY **pRetVal) {
    return This->lpVtbl->GetSelection(This,pRetVal);
}
static __WIDL_INLINE HRESULT ISelectionProvider_get_CanSelectMultiple(ISelectionProvider* This,WINBOOL *pRetVal) {
    return This->lpVtbl->get_CanSelectMultiple(This,pRetVal);
}
static __WIDL_INLINE HRESULT ISelectionProvider_get_IsSelectionRequired(ISelectionProvider* This,WINBOOL *pRetVal) {
    return This->lpVtbl->get_IsSelectionRequired(This,pRetVal);
}
#endif
#endif

#endif


#endif  /* __ISelectionProvider_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISelectionProvider2 interface
 */
#ifndef __ISelectionProvider2_INTERFACE_DEFINED__
#define __ISelectionProvider2_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISelectionProvider2, 0x14f68475, 0xee1c, 0x44f6, 0xa8,0x69, 0xd2,0x39,0x38,0x1f,0x0f,0xe7);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("14f68475-ee1c-44f6-a869-d239381f0fe7")
ISelectionProvider2 : public ISelectionProvider
{
    virtual HRESULT STDMETHODCALLTYPE get_FirstSelectedItem(
        IRawElementProviderSimple **val) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_LastSelectedItem(
        IRawElementProviderSimple **val) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CurrentSelectedItem(
        IRawElementProviderSimple **val) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ItemCount(
        int *val) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISelectionProvider2, 0x14f68475, 0xee1c, 0x44f6, 0xa8,0x69, 0xd2,0x39,0x38,0x1f,0x0f,0xe7)
#endif
#else
typedef struct ISelectionProvider2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ISelectionProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSelection)(
        ISelectionProvider2 *This,
        SAFEARRAY **pRetVal);

    HRESULT (STDMETHODCALLTYPE *get_CanSelectMultiple)(
        ISelectionProvider2 *This,
        WINBOOL *pRetVal);

    HRESULT (STDMETHODCALLTYPE *get_IsSelectionRequired)(
        ISelectionProvider2 *This,
        WINBOOL *pRetVal);

    /*** ISelectionProvider2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_FirstSelectedItem)(
        ISelectionProvider2 *This,
        IRawElementProviderSimple **val);

    HRESULT (STDMETHODCALLTYPE *get_LastSelectedItem)(
        ISelectionProvider2 *This,
        IRawElementProviderSimple **val);

    HRESULT (STDMETHODCALLTYPE *get_CurrentSelectedItem)(
        ISelectionProvider2 *This,
        IRawElementProviderSimple **val);

    HRESULT (STDMETHODCALLTYPE *get_ItemCount)(
        ISelectionProvider2 *This,
        int *val);

    END_INTERFACE
} ISelectionProvider2Vtbl;

interface ISelectionProvider2 {
    CONST_VTBL ISelectionProvider2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISelectionProvider2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISelectionProvider2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISelectionProvider2_Release(This) (This)->lpVtbl->Release(This)
/*** ISelectionProvider methods ***/
#define ISelectionProvider2_GetSelection(This,pRetVal) (This)->lpVtbl->GetSelection(This,pRetVal)
#define ISelectionProvider2_get_CanSelectMultiple(This,pRetVal) (This)->lpVtbl->get_CanSelectMultiple(This,pRetVal)
#define ISelectionProvider2_get_IsSelectionRequired(This,pRetVal) (This)->lpVtbl->get_IsSelectionRequired(This,pRetVal)
/*** ISelectionProvider2 methods ***/
#define ISelectionProvider2_get_FirstSelectedItem(This,val) (This)->lpVtbl->get_FirstSelectedItem(This,val)
#define ISelectionProvider2_get_LastSelectedItem(This,val) (This)->lpVtbl->get_LastSelectedItem(This,val)
#define ISelectionProvider2_get_CurrentSelectedItem(This,val) (This)->lpVtbl->get_CurrentSelectedItem(This,val)
#define ISelectionProvider2_get_ItemCount(This,val) (This)->lpVtbl->get_ItemCount(This,val)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ISelectionProvider2_QueryInterface(ISelectionProvider2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISelectionProvider2_AddRef(ISelectionProvider2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISelectionProvider2_Release(ISelectionProvider2* This) {
    return This->lpVtbl->Release(This);
}
/*** ISelectionProvider methods ***/
static __WIDL_INLINE HRESULT ISelectionProvider2_GetSelection(ISelectionProvider2* This,SAFEARRAY **pRetVal) {
    return This->lpVtbl->GetSelection(This,pRetVal);
}
static __WIDL_INLINE HRESULT ISelectionProvider2_get_CanSelectMultiple(ISelectionProvider2* This,WINBOOL *pRetVal) {
    return This->lpVtbl->get_CanSelectMultiple(This,pRetVal);
}
static __WIDL_INLINE HRESULT ISelectionProvider2_get_IsSelectionRequired(ISelectionProvider2* This,WINBOOL *pRetVal) {
    return This->lpVtbl->get_IsSelectionRequired(This,pRetVal);
}
/*** ISelectionProvider2 methods ***/
static __WIDL_INLINE HRESULT ISelectionProvider2_get_FirstSelectedItem(ISelectionProvider2* This,IRawElementProviderSimple **val) {
    return This->lpVtbl->get_FirstSelectedItem(This,val);
}
static __WIDL_INLINE HRESULT ISelectionProvider2_get_LastSelectedItem(ISelectionProvider2* This,IRawElementProviderSimple **val) {
    return This->lpVtbl->get_LastSelectedItem(This,val);
}
static __WIDL_INLINE HRESULT ISelectionProvider2_get_CurrentSelectedItem(ISelectionProvider2* This,IRawElementProviderSimple **val) {
    return This->lpVtbl->get_CurrentSelectedItem(This,val);
}
static __WIDL_INLINE HRESULT ISelectionProvider2_get_ItemCount(ISelectionProvider2* This,int *val) {
    return This->lpVtbl->get_ItemCount(This,val);
}
#endif
#endif

#endif


#endif  /* __ISelectionProvider2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IScrollProvider interface
 */
#ifndef __IScrollProvider_INTERFACE_DEFINED__
#define __IScrollProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID_IScrollProvider, 0xb38b8077, 0x1fc3, 0x42a5, 0x8c,0xae, 0xd4,0x0c,0x22,0x15,0x05,0x5a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("b38b8077-1fc3-42a5-8cae-d40c2215055a")
IScrollProvider : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Scroll(
        enum ScrollAmount horizontalAmount,
        enum ScrollAmount verticalAmount) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetScrollPercent(
        double horizontalPercent,
        double verticalPercent) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HorizontalScrollPercent(
        double *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_VerticalScrollPercent(
        double *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HorizontalViewSize(
        double *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_VerticalViewSize(
        double *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HorizontallyScrollable(
        WINBOOL *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_VerticallyScrollable(
        WINBOOL *pRetVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IScrollProvider, 0xb38b8077, 0x1fc3, 0x42a5, 0x8c,0xae, 0xd4,0x0c,0x22,0x15,0x05,0x5a)
#endif
#else
typedef struct IScrollProviderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IScrollProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *Scroll)(
        IScrollProvider *This,
        enum ScrollAmount horizontalAmount,
        enum ScrollAmount verticalAmount);

    HRESULT (STDMETHODCALLTYPE *SetScrollPercent)(
        IScrollProvider *This,
        double horizontalPercent,
        double verticalPercent);

    HRESULT (STDMETHODCALLTYPE *get_HorizontalScrollPercent)(
        IScrollProvider *This,
        double *pRetVal);

    HRESULT (STDMETHODCALLTYPE *get_VerticalScrollPercent)(
        IScrollProvider *This,
        double *pRetVal);

    HRESULT (STDMETHODCALLTYPE *get_HorizontalViewSize)(
        IScrollProvider *This,
        double *pRetVal);

    HRESULT (STDMETHODCALLTYPE *get_VerticalViewSize)(
        IScrollProvider *This,
        double *pRetVal);

    HRESULT (STDMETHODCALLTYPE *get_HorizontallyScrollable)(
        IScrollProvider *This,
        WINBOOL *pRetVal);

    HRESULT (STDMETHODCALLTYPE *get_VerticallyScrollable)(
        IScrollProvider *This,
        WINBOOL *pRetVal);

    END_INTERFACE
} IScrollProviderVtbl;

interface IScrollProvider {
    CONST_VTBL IScrollProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IScrollProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IScrollProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IScrollProvider_Release(This) (This)->lpVtbl->Release(This)
/*** IScrollProvider methods ***/
#define IScrollProvider_Scroll(This,horizontalAmount,verticalAmount) (This)->lpVtbl->Scroll(This,horizontalAmount,verticalAmount)
#define IScrollProvider_SetScrollPercent(This,horizontalPercent,verticalPercent) (This)->lpVtbl->SetScrollPercent(This,horizontalPercent,verticalPercent)
#define IScrollProvider_get_HorizontalScrollPercent(This,pRetVal) (This)->lpVtbl->get_HorizontalScrollPercent(This,pRetVal)
#define IScrollProvider_get_VerticalScrollPercent(This,pRetVal) (This)->lpVtbl->get_VerticalScrollPercent(This,pRetVal)
#define IScrollProvider_get_HorizontalViewSize(This,pRetVal) (This)->lpVtbl->get_HorizontalViewSize(This,pRetVal)
#define IScrollProvider_get_VerticalViewSize(This,pRetVal) (This)->lpVtbl->get_VerticalViewSize(This,pRetVal)
#define IScrollProvider_get_HorizontallyScrollable(This,pRetVal) (This)->lpVtbl->get_HorizontallyScrollable(This,pRetVal)
#define IScrollProvider_get_VerticallyScrollable(This,pRetVal) (This)->lpVtbl->get_VerticallyScrollable(This,pRetVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IScrollProvider_QueryInterface(IScrollProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IScrollProvider_AddRef(IScrollProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IScrollProvider_Release(IScrollProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** IScrollProvider methods ***/
static __WIDL_INLINE HRESULT IScrollProvider_Scroll(IScrollProvider* This,enum ScrollAmount horizontalAmount,enum ScrollAmount verticalAmount) {
    return This->lpVtbl->Scroll(This,horizontalAmount,verticalAmount);
}
static __WIDL_INLINE HRESULT IScrollProvider_SetScrollPercent(IScrollProvider* This,double horizontalPercent,double verticalPercent) {
    return This->lpVtbl->SetScrollPercent(This,horizontalPercent,verticalPercent);
}
static __WIDL_INLINE HRESULT IScrollProvider_get_HorizontalScrollPercent(IScrollProvider* This,double *pRetVal) {
    return This->lpVtbl->get_HorizontalScrollPercent(This,pRetVal);
}
static __WIDL_INLINE HRESULT IScrollProvider_get_VerticalScrollPercent(IScrollProvider* This,double *pRetVal) {
    return This->lpVtbl->get_VerticalScrollPercent(This,pRetVal);
}
static __WIDL_INLINE HRESULT IScrollProvider_get_HorizontalViewSize(IScrollProvider* This,double *pRetVal) {
    return This->lpVtbl->get_HorizontalViewSize(This,pRetVal);
}
static __WIDL_INLINE HRESULT IScrollProvider_get_VerticalViewSize(IScrollProvider* This,double *pRetVal) {
    return This->lpVtbl->get_VerticalViewSize(This,pRetVal);
}
static __WIDL_INLINE HRESULT IScrollProvider_get_HorizontallyScrollable(IScrollProvider* This,WINBOOL *pRetVal) {
    return This->lpVtbl->get_HorizontallyScrollable(This,pRetVal);
}
static __WIDL_INLINE HRESULT IScrollProvider_get_VerticallyScrollable(IScrollProvider* This,WINBOOL *pRetVal) {
    return This->lpVtbl->get_VerticallyScrollable(This,pRetVal);
}
#endif
#endif

#endif


#endif  /* __IScrollProvider_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISelectionItemProvider interface
 */
#ifndef __ISelectionItemProvider_INTERFACE_DEFINED__
#define __ISelectionItemProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISelectionItemProvider, 0x2acad808, 0xb2d4, 0x452d, 0xa4,0x07, 0x91,0xff,0x1a,0xd1,0x67,0xb2);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2acad808-b2d4-452d-a407-91ff1ad167b2")
ISelectionItemProvider : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Select(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddToSelection(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveFromSelection(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_IsSelected(
        WINBOOL *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_SelectionContainer(
        IRawElementProviderSimple **pRetVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISelectionItemProvider, 0x2acad808, 0xb2d4, 0x452d, 0xa4,0x07, 0x91,0xff,0x1a,0xd1,0x67,0xb2)
#endif
#else
typedef struct ISelectionItemProviderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ISelectionItemProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *Select)(
        ISelectionItemProvider *This);

    HRESULT (STDMETHODCALLTYPE *AddToSelection)(
        ISelectionItemProvider *This);

    HRESULT (STDMETHODCALLTYPE *RemoveFromSelection)(
        ISelectionItemProvider *This);

    HRESULT (STDMETHODCALLTYPE *get_IsSelected)(
        ISelectionItemProvider *This,
        WINBOOL *pRetVal);

    HRESULT (STDMETHODCALLTYPE *get_SelectionContainer)(
        ISelectionItemProvider *This,
        IRawElementProviderSimple **pRetVal);

    END_INTERFACE
} ISelectionItemProviderVtbl;

interface ISelectionItemProvider {
    CONST_VTBL ISelectionItemProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISelectionItemProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISelectionItemProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISelectionItemProvider_Release(This) (This)->lpVtbl->Release(This)
/*** ISelectionItemProvider methods ***/
#define ISelectionItemProvider_Select(This) (This)->lpVtbl->Select(This)
#define ISelectionItemProvider_AddToSelection(This) (This)->lpVtbl->AddToSelection(This)
#define ISelectionItemProvider_RemoveFromSelection(This) (This)->lpVtbl->RemoveFromSelection(This)
#define ISelectionItemProvider_get_IsSelected(This,pRetVal) (This)->lpVtbl->get_IsSelected(This,pRetVal)
#define ISelectionItemProvider_get_SelectionContainer(This,pRetVal) (This)->lpVtbl->get_SelectionContainer(This,pRetVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ISelectionItemProvider_QueryInterface(ISelectionItemProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISelectionItemProvider_AddRef(ISelectionItemProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISelectionItemProvider_Release(ISelectionItemProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** ISelectionItemProvider methods ***/
static __WIDL_INLINE HRESULT ISelectionItemProvider_Select(ISelectionItemProvider* This) {
    return This->lpVtbl->Select(This);
}
static __WIDL_INLINE HRESULT ISelectionItemProvider_AddToSelection(ISelectionItemProvider* This) {
    return This->lpVtbl->AddToSelection(This);
}
static __WIDL_INLINE HRESULT ISelectionItemProvider_RemoveFromSelection(ISelectionItemProvider* This) {
    return This->lpVtbl->RemoveFromSelection(This);
}
static __WIDL_INLINE HRESULT ISelectionItemProvider_get_IsSelected(ISelectionItemProvider* This,WINBOOL *pRetVal) {
    return This->lpVtbl->get_IsSelected(This,pRetVal);
}
static __WIDL_INLINE HRESULT ISelectionItemProvider_get_SelectionContainer(ISelectionItemProvider* This,IRawElementProviderSimple **pRetVal) {
    return This->lpVtbl->get_SelectionContainer(This,pRetVal);
}
#endif
#endif

#endif


#endif  /* __ISelectionItemProvider_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISynchronizedInputProvider interface
 */
#ifndef __ISynchronizedInputProvider_INTERFACE_DEFINED__
#define __ISynchronizedInputProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISynchronizedInputProvider, 0x29db1a06, 0x02ce, 0x4cf7, 0x9b,0x42, 0x56,0x5d,0x4f,0xab,0x20,0xee);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("29db1a06-02ce-4cf7-9b42-565d4fab20ee")
ISynchronizedInputProvider : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE StartListening(
        enum SynchronizedInputType inputType) = 0;

    virtual HRESULT STDMETHODCALLTYPE Cancel(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISynchronizedInputProvider, 0x29db1a06, 0x02ce, 0x4cf7, 0x9b,0x42, 0x56,0x5d,0x4f,0xab,0x20,0xee)
#endif
#else
typedef struct ISynchronizedInputProviderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ISynchronizedInputProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *StartListening)(
        ISynchronizedInputProvider *This,
        enum SynchronizedInputType inputType);

    HRESULT (STDMETHODCALLTYPE *Cancel)(
        ISynchronizedInputProvider *This);

    END_INTERFACE
} ISynchronizedInputProviderVtbl;

interface ISynchronizedInputProvider {
    CONST_VTBL ISynchronizedInputProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISynchronizedInputProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISynchronizedInputProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISynchronizedInputProvider_Release(This) (This)->lpVtbl->Release(This)
/*** ISynchronizedInputProvider methods ***/
#define ISynchronizedInputProvider_StartListening(This,inputType) (This)->lpVtbl->StartListening(This,inputType)
#define ISynchronizedInputProvider_Cancel(This) (This)->lpVtbl->Cancel(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ISynchronizedInputProvider_QueryInterface(ISynchronizedInputProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISynchronizedInputProvider_AddRef(ISynchronizedInputProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISynchronizedInputProvider_Release(ISynchronizedInputProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** ISynchronizedInputProvider methods ***/
static __WIDL_INLINE HRESULT ISynchronizedInputProvider_StartListening(ISynchronizedInputProvider* This,enum SynchronizedInputType inputType) {
    return This->lpVtbl->StartListening(This,inputType);
}
static __WIDL_INLINE HRESULT ISynchronizedInputProvider_Cancel(ISynchronizedInputProvider* This) {
    return This->lpVtbl->Cancel(This);
}
#endif
#endif

#endif


#endif  /* __ISynchronizedInputProvider_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITableProvider interface
 */
#ifndef __ITableProvider_INTERFACE_DEFINED__
#define __ITableProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID_ITableProvider, 0x9c860395, 0x97b3, 0x490a, 0xb5,0x2a, 0x85,0x8c,0xc2,0x2a,0xf1,0x66);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("9c860395-97b3-490a-b52a-858cc22af166")
ITableProvider : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetRowHeaders(
        SAFEARRAY **pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetColumnHeaders(
        SAFEARRAY **pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_RowOrColumnMajor(
        enum RowOrColumnMajor *pRetVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ITableProvider, 0x9c860395, 0x97b3, 0x490a, 0xb5,0x2a, 0x85,0x8c,0xc2,0x2a,0xf1,0x66)
#endif
#else
typedef struct ITableProviderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITableProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *GetRowHeaders)(
        ITableProvider *This,
        SAFEARRAY **pRetVal);

    HRESULT (STDMETHODCALLTYPE *GetColumnHeaders)(
        ITableProvider *This,
        SAFEARRAY **pRetVal);

    HRESULT (STDMETHODCALLTYPE *get_RowOrColumnMajor)(
        ITableProvider *This,
        enum RowOrColumnMajor *pRetVal);

    END_INTERFACE
} ITableProviderVtbl;

interface ITableProvider {
    CONST_VTBL ITableProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ITableProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITableProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITableProvider_Release(This) (This)->lpVtbl->Release(This)
/*** ITableProvider methods ***/
#define ITableProvider_GetRowHeaders(This,pRetVal) (This)->lpVtbl->GetRowHeaders(This,pRetVal)
#define ITableProvider_GetColumnHeaders(This,pRetVal) (This)->lpVtbl->GetColumnHeaders(This,pRetVal)
#define ITableProvider_get_RowOrColumnMajor(This,pRetVal) (This)->lpVtbl->get_RowOrColumnMajor(This,pRetVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ITableProvider_QueryInterface(ITableProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ITableProvider_AddRef(ITableProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ITableProvider_Release(ITableProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** ITableProvider methods ***/
static __WIDL_INLINE HRESULT ITableProvider_GetRowHeaders(ITableProvider* This,SAFEARRAY **pRetVal) {
    return This->lpVtbl->GetRowHeaders(This,pRetVal);
}
static __WIDL_INLINE HRESULT ITableProvider_GetColumnHeaders(ITableProvider* This,SAFEARRAY **pRetVal) {
    return This->lpVtbl->GetColumnHeaders(This,pRetVal);
}
static __WIDL_INLINE HRESULT ITableProvider_get_RowOrColumnMajor(ITableProvider* This,enum RowOrColumnMajor *pRetVal) {
    return This->lpVtbl->get_RowOrColumnMajor(This,pRetVal);
}
#endif
#endif

#endif


#endif  /* __ITableProvider_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITableItemProvider interface
 */
#ifndef __ITableItemProvider_INTERFACE_DEFINED__
#define __ITableItemProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID_ITableItemProvider, 0xb9734fa6, 0x771f, 0x4d78, 0x9c,0x90, 0x25,0x17,0x99,0x93,0x49,0xcd);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("b9734fa6-771f-4d78-9c90-2517999349cd")
ITableItemProvider : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetRowHeaderItems(
        SAFEARRAY **pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetColumnHeaderItems(
        SAFEARRAY **pRetVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ITableItemProvider, 0xb9734fa6, 0x771f, 0x4d78, 0x9c,0x90, 0x25,0x17,0x99,0x93,0x49,0xcd)
#endif
#else
typedef struct ITableItemProviderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITableItemProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *GetRowHeaderItems)(
        ITableItemProvider *This,
        SAFEARRAY **pRetVal);

    HRESULT (STDMETHODCALLTYPE *GetColumnHeaderItems)(
        ITableItemProvider *This,
        SAFEARRAY **pRetVal);

    END_INTERFACE
} ITableItemProviderVtbl;

interface ITableItemProvider {
    CONST_VTBL ITableItemProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ITableItemProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITableItemProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITableItemProvider_Release(This) (This)->lpVtbl->Release(This)
/*** ITableItemProvider methods ***/
#define ITableItemProvider_GetRowHeaderItems(This,pRetVal) (This)->lpVtbl->GetRowHeaderItems(This,pRetVal)
#define ITableItemProvider_GetColumnHeaderItems(This,pRetVal) (This)->lpVtbl->GetColumnHeaderItems(This,pRetVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ITableItemProvider_QueryInterface(ITableItemProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ITableItemProvider_AddRef(ITableItemProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ITableItemProvider_Release(ITableItemProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** ITableItemProvider methods ***/
static __WIDL_INLINE HRESULT ITableItemProvider_GetRowHeaderItems(ITableItemProvider* This,SAFEARRAY **pRetVal) {
    return This->lpVtbl->GetRowHeaderItems(This,pRetVal);
}
static __WIDL_INLINE HRESULT ITableItemProvider_GetColumnHeaderItems(ITableItemProvider* This,SAFEARRAY **pRetVal) {
    return This->lpVtbl->GetColumnHeaderItems(This,pRetVal);
}
#endif
#endif

#endif


#endif  /* __ITableItemProvider_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IToggleProvider interface
 */
#ifndef __IToggleProvider_INTERFACE_DEFINED__
#define __IToggleProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID_IToggleProvider, 0x56d00bd0, 0xc4f4, 0x433c, 0xa8,0x36, 0x1a,0x52,0xa5,0x7e,0x08,0x92);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("56d00bd0-c4f4-433c-a836-1a52a57e0892")
IToggleProvider : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Toggle(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ToggleState(
        enum ToggleState *pRetVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IToggleProvider, 0x56d00bd0, 0xc4f4, 0x433c, 0xa8,0x36, 0x1a,0x52,0xa5,0x7e,0x08,0x92)
#endif
#else
typedef struct IToggleProviderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IToggleProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *Toggle)(
        IToggleProvider *This);

    HRESULT (STDMETHODCALLTYPE *get_ToggleState)(
        IToggleProvider *This,
        enum ToggleState *pRetVal);

    END_INTERFACE
} IToggleProviderVtbl;

interface IToggleProvider {
    CONST_VTBL IToggleProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IToggleProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IToggleProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IToggleProvider_Release(This) (This)->lpVtbl->Release(This)
/*** IToggleProvider methods ***/
#define IToggleProvider_Toggle(This) (This)->lpVtbl->Toggle(This)
#define IToggleProvider_get_ToggleState(This,pRetVal) (This)->lpVtbl->get_ToggleState(This,pRetVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IToggleProvider_QueryInterface(IToggleProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IToggleProvider_AddRef(IToggleProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IToggleProvider_Release(IToggleProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** IToggleProvider methods ***/
static __WIDL_INLINE HRESULT IToggleProvider_Toggle(IToggleProvider* This) {
    return This->lpVtbl->Toggle(This);
}
static __WIDL_INLINE HRESULT IToggleProvider_get_ToggleState(IToggleProvider* This,enum ToggleState *pRetVal) {
    return This->lpVtbl->get_ToggleState(This,pRetVal);
}
#endif
#endif

#endif


#endif  /* __IToggleProvider_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITransformProvider interface
 */
#ifndef __ITransformProvider_INTERFACE_DEFINED__
#define __ITransformProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID_ITransformProvider, 0x6829ddc4, 0x4f91, 0x4ffa, 0xb8,0x6f, 0xbd,0x3e,0x29,0x87,0xcb,0x4c);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("6829ddc4-4f91-4ffa-b86f-bd3e2987cb4c")
ITransformProvider : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Move(
        double x,
        double y) = 0;

    virtual HRESULT STDMETHODCALLTYPE Resize(
        double width,
        double height) = 0;

    virtual HRESULT STDMETHODCALLTYPE Rotate(
        double degrees) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CanMove(
        WINBOOL *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CanResize(
        WINBOOL *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CanRotate(
        WINBOOL *pRetVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ITransformProvider, 0x6829ddc4, 0x4f91, 0x4ffa, 0xb8,0x6f, 0xbd,0x3e,0x29,0x87,0xcb,0x4c)
#endif
#else
typedef struct ITransformProviderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITransformProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *Move)(
        ITransformProvider *This,
        double x,
        double y);

    HRESULT (STDMETHODCALLTYPE *Resize)(
        ITransformProvider *This,
        double width,
        double height);

    HRESULT (STDMETHODCALLTYPE *Rotate)(
        ITransformProvider *This,
        double degrees);

    HRESULT (STDMETHODCALLTYPE *get_CanMove)(
        ITransformProvider *This,
        WINBOOL *pRetVal);

    HRESULT (STDMETHODCALLTYPE *get_CanResize)(
        ITransformProvider *This,
        WINBOOL *pRetVal);

    HRESULT (STDMETHODCALLTYPE *get_CanRotate)(
        ITransformProvider *This,
        WINBOOL *pRetVal);

    END_INTERFACE
} ITransformProviderVtbl;

interface ITransformProvider {
    CONST_VTBL ITransformProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ITransformProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITransformProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITransformProvider_Release(This) (This)->lpVtbl->Release(This)
/*** ITransformProvider methods ***/
#define ITransformProvider_Move(This,x,y) (This)->lpVtbl->Move(This,x,y)
#define ITransformProvider_Resize(This,width,height) (This)->lpVtbl->Resize(This,width,height)
#define ITransformProvider_Rotate(This,degrees) (This)->lpVtbl->Rotate(This,degrees)
#define ITransformProvider_get_CanMove(This,pRetVal) (This)->lpVtbl->get_CanMove(This,pRetVal)
#define ITransformProvider_get_CanResize(This,pRetVal) (This)->lpVtbl->get_CanResize(This,pRetVal)
#define ITransformProvider_get_CanRotate(This,pRetVal) (This)->lpVtbl->get_CanRotate(This,pRetVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ITransformProvider_QueryInterface(ITransformProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ITransformProvider_AddRef(ITransformProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ITransformProvider_Release(ITransformProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** ITransformProvider methods ***/
static __WIDL_INLINE HRESULT ITransformProvider_Move(ITransformProvider* This,double x,double y) {
    return This->lpVtbl->Move(This,x,y);
}
static __WIDL_INLINE HRESULT ITransformProvider_Resize(ITransformProvider* This,double width,double height) {
    return This->lpVtbl->Resize(This,width,height);
}
static __WIDL_INLINE HRESULT ITransformProvider_Rotate(ITransformProvider* This,double degrees) {
    return This->lpVtbl->Rotate(This,degrees);
}
static __WIDL_INLINE HRESULT ITransformProvider_get_CanMove(ITransformProvider* This,WINBOOL *pRetVal) {
    return This->lpVtbl->get_CanMove(This,pRetVal);
}
static __WIDL_INLINE HRESULT ITransformProvider_get_CanResize(ITransformProvider* This,WINBOOL *pRetVal) {
    return This->lpVtbl->get_CanResize(This,pRetVal);
}
static __WIDL_INLINE HRESULT ITransformProvider_get_CanRotate(ITransformProvider* This,WINBOOL *pRetVal) {
    return This->lpVtbl->get_CanRotate(This,pRetVal);
}
#endif
#endif

#endif


#endif  /* __ITransformProvider_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IValueProvider interface
 */
#ifndef __IValueProvider_INTERFACE_DEFINED__
#define __IValueProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID_IValueProvider, 0xc7935180, 0x6fb3, 0x4201, 0xb1,0x74, 0x7d,0xf7,0x3a,0xdb,0xf6,0x4a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c7935180-6fb3-4201-b174-7df73adbf64a")
IValueProvider : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetValue(
        LPCWSTR val) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Value(
        BSTR *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_IsReadOnly(
        WINBOOL *pRetVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IValueProvider, 0xc7935180, 0x6fb3, 0x4201, 0xb1,0x74, 0x7d,0xf7,0x3a,0xdb,0xf6,0x4a)
#endif
#else
typedef struct IValueProviderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IValueProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *SetValue)(
        IValueProvider *This,
        LPCWSTR val);

    HRESULT (STDMETHODCALLTYPE *get_Value)(
        IValueProvider *This,
        BSTR *pRetVal);

    HRESULT (STDMETHODCALLTYPE *get_IsReadOnly)(
        IValueProvider *This,
        WINBOOL *pRetVal);

    END_INTERFACE
} IValueProviderVtbl;

interface IValueProvider {
    CONST_VTBL IValueProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IValueProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IValueProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IValueProvider_Release(This) (This)->lpVtbl->Release(This)
/*** IValueProvider methods ***/
#define IValueProvider_SetValue(This,val) (This)->lpVtbl->SetValue(This,val)
#define IValueProvider_get_Value(This,pRetVal) (This)->lpVtbl->get_Value(This,pRetVal)
#define IValueProvider_get_IsReadOnly(This,pRetVal) (This)->lpVtbl->get_IsReadOnly(This,pRetVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IValueProvider_QueryInterface(IValueProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IValueProvider_AddRef(IValueProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IValueProvider_Release(IValueProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** IValueProvider methods ***/
static __WIDL_INLINE HRESULT IValueProvider_SetValue(IValueProvider* This,LPCWSTR val) {
    return This->lpVtbl->SetValue(This,val);
}
static __WIDL_INLINE HRESULT IValueProvider_get_Value(IValueProvider* This,BSTR *pRetVal) {
    return This->lpVtbl->get_Value(This,pRetVal);
}
static __WIDL_INLINE HRESULT IValueProvider_get_IsReadOnly(IValueProvider* This,WINBOOL *pRetVal) {
    return This->lpVtbl->get_IsReadOnly(This,pRetVal);
}
#endif
#endif

#endif


#endif  /* __IValueProvider_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWindowProvider interface
 */
#ifndef __IWindowProvider_INTERFACE_DEFINED__
#define __IWindowProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWindowProvider, 0x987df77b, 0xdb06, 0x4d77, 0x8f,0x8a, 0x86,0xa9,0xc3,0xbb,0x90,0xb9);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("987df77b-db06-4d77-8f8a-86a9c3bb90b9")
IWindowProvider : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetVisualState(
        enum WindowVisualState state) = 0;

    virtual HRESULT STDMETHODCALLTYPE Close(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE WaitForInputIdle(
        int milliseconds,
        WINBOOL *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CanMaximize(
        WINBOOL *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CanMinimize(
        WINBOOL *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_IsModal(
        WINBOOL *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_WindowVisualState(
        enum WindowVisualState *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_WindowInteractionState(
        enum WindowInteractionState *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_IsTopmost(
        WINBOOL *pRetVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWindowProvider, 0x987df77b, 0xdb06, 0x4d77, 0x8f,0x8a, 0x86,0xa9,0xc3,0xbb,0x90,0xb9)
#endif
#else
typedef struct IWindowProviderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWindowProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *SetVisualState)(
        IWindowProvider *This,
        enum WindowVisualState state);

    HRESULT (STDMETHODCALLTYPE *Close)(
        IWindowProvider *This);

    HRESULT (STDMETHODCALLTYPE *WaitForInputIdle)(
        IWindowProvider *This,
        int milliseconds,
        WINBOOL *pRetVal);

    HRESULT (STDMETHODCALLTYPE *get_CanMaximize)(
        IWindowProvider *This,
        WINBOOL *pRetVal);

    HRESULT (STDMETHODCALLTYPE *get_CanMinimize)(
        IWindowProvider *This,
        WINBOOL *pRetVal);

    HRESULT (STDMETHODCALLTYPE *get_IsModal)(
        IWindowProvider *This,
        WINBOOL *pRetVal);

    HRESULT (STDMETHODCALLTYPE *get_WindowVisualState)(
        IWindowProvider *This,
        enum WindowVisualState *pRetVal);

    HRESULT (STDMETHODCALLTYPE *get_WindowInteractionState)(
        IWindowProvider *This,
        enum WindowInteractionState *pRetVal);

    HRESULT (STDMETHODCALLTYPE *get_IsTopmost)(
        IWindowProvider *This,
        WINBOOL *pRetVal);

    END_INTERFACE
} IWindowProviderVtbl;

interface IWindowProvider {
    CONST_VTBL IWindowProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWindowProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWindowProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWindowProvider_Release(This) (This)->lpVtbl->Release(This)
/*** IWindowProvider methods ***/
#define IWindowProvider_SetVisualState(This,state) (This)->lpVtbl->SetVisualState(This,state)
#define IWindowProvider_Close(This) (This)->lpVtbl->Close(This)
#define IWindowProvider_WaitForInputIdle(This,milliseconds,pRetVal) (This)->lpVtbl->WaitForInputIdle(This,milliseconds,pRetVal)
#define IWindowProvider_get_CanMaximize(This,pRetVal) (This)->lpVtbl->get_CanMaximize(This,pRetVal)
#define IWindowProvider_get_CanMinimize(This,pRetVal) (This)->lpVtbl->get_CanMinimize(This,pRetVal)
#define IWindowProvider_get_IsModal(This,pRetVal) (This)->lpVtbl->get_IsModal(This,pRetVal)
#define IWindowProvider_get_WindowVisualState(This,pRetVal) (This)->lpVtbl->get_WindowVisualState(This,pRetVal)
#define IWindowProvider_get_WindowInteractionState(This,pRetVal) (This)->lpVtbl->get_WindowInteractionState(This,pRetVal)
#define IWindowProvider_get_IsTopmost(This,pRetVal) (This)->lpVtbl->get_IsTopmost(This,pRetVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IWindowProvider_QueryInterface(IWindowProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWindowProvider_AddRef(IWindowProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWindowProvider_Release(IWindowProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** IWindowProvider methods ***/
static __WIDL_INLINE HRESULT IWindowProvider_SetVisualState(IWindowProvider* This,enum WindowVisualState state) {
    return This->lpVtbl->SetVisualState(This,state);
}
static __WIDL_INLINE HRESULT IWindowProvider_Close(IWindowProvider* This) {
    return This->lpVtbl->Close(This);
}
static __WIDL_INLINE HRESULT IWindowProvider_WaitForInputIdle(IWindowProvider* This,int milliseconds,WINBOOL *pRetVal) {
    return This->lpVtbl->WaitForInputIdle(This,milliseconds,pRetVal);
}
static __WIDL_INLINE HRESULT IWindowProvider_get_CanMaximize(IWindowProvider* This,WINBOOL *pRetVal) {
    return This->lpVtbl->get_CanMaximize(This,pRetVal);
}
static __WIDL_INLINE HRESULT IWindowProvider_get_CanMinimize(IWindowProvider* This,WINBOOL *pRetVal) {
    return This->lpVtbl->get_CanMinimize(This,pRetVal);
}
static __WIDL_INLINE HRESULT IWindowProvider_get_IsModal(IWindowProvider* This,WINBOOL *pRetVal) {
    return This->lpVtbl->get_IsModal(This,pRetVal);
}
static __WIDL_INLINE HRESULT IWindowProvider_get_WindowVisualState(IWindowProvider* This,enum WindowVisualState *pRetVal) {
    return This->lpVtbl->get_WindowVisualState(This,pRetVal);
}
static __WIDL_INLINE HRESULT IWindowProvider_get_WindowInteractionState(IWindowProvider* This,enum WindowInteractionState *pRetVal) {
    return This->lpVtbl->get_WindowInteractionState(This,pRetVal);
}
static __WIDL_INLINE HRESULT IWindowProvider_get_IsTopmost(IWindowProvider* This,WINBOOL *pRetVal) {
    return This->lpVtbl->get_IsTopmost(This,pRetVal);
}
#endif
#endif

#endif


#endif  /* __IWindowProvider_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IItemContainerProvider interface
 */
#ifndef __IItemContainerProvider_INTERFACE_DEFINED__
#define __IItemContainerProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID_IItemContainerProvider, 0xe747770b, 0x39ce, 0x4382, 0xab,0x30, 0xd8,0xfb,0x3f,0x33,0x6f,0x24);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("e747770b-39ce-4382-ab30-d8fb3f336f24")
IItemContainerProvider : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE FindItemByProperty(
        IRawElementProviderSimple *pStartAfter,
        PROPERTYID propertyId,
        VARIANT value,
        IRawElementProviderSimple **pFound) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IItemContainerProvider, 0xe747770b, 0x39ce, 0x4382, 0xab,0x30, 0xd8,0xfb,0x3f,0x33,0x6f,0x24)
#endif
#else
typedef struct IItemContainerProviderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IItemContainerProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *FindItemByProperty)(
        IItemContainerProvider *This,
        IRawElementProviderSimple *pStartAfter,
        PROPERTYID propertyId,
        VARIANT value,
        IRawElementProviderSimple **pFound);

    END_INTERFACE
} IItemContainerProviderVtbl;

interface IItemContainerProvider {
    CONST_VTBL IItemContainerProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IItemContainerProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IItemContainerProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IItemContainerProvider_Release(This) (This)->lpVtbl->Release(This)
/*** IItemContainerProvider methods ***/
#define IItemContainerProvider_FindItemByProperty(This,pStartAfter,propertyId,value,pFound) (This)->lpVtbl->FindItemByProperty(This,pStartAfter,propertyId,value,pFound)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IItemContainerProvider_QueryInterface(IItemContainerProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IItemContainerProvider_AddRef(IItemContainerProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IItemContainerProvider_Release(IItemContainerProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** IItemContainerProvider methods ***/
static __WIDL_INLINE HRESULT IItemContainerProvider_FindItemByProperty(IItemContainerProvider* This,IRawElementProviderSimple *pStartAfter,PROPERTYID propertyId,VARIANT value,IRawElementProviderSimple **pFound) {
    return This->lpVtbl->FindItemByProperty(This,pStartAfter,propertyId,value,pFound);
}
#endif
#endif

#endif


#endif  /* __IItemContainerProvider_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVirtualizedItemProvider interface
 */
#ifndef __IVirtualizedItemProvider_INTERFACE_DEFINED__
#define __IVirtualizedItemProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVirtualizedItemProvider, 0xcb98b665, 0x2d35, 0x4fac, 0xad,0x35, 0xf3,0xc6,0x0d,0x0c,0x0b,0x8b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("cb98b665-2d35-4fac-ad35-f3c60d0c0b8b")
IVirtualizedItemProvider : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Realize(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVirtualizedItemProvider, 0xcb98b665, 0x2d35, 0x4fac, 0xad,0x35, 0xf3,0xc6,0x0d,0x0c,0x0b,0x8b)
#endif
#else
typedef struct IVirtualizedItemProviderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IVirtualizedItemProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *Realize)(
        IVirtualizedItemProvider *This);

    END_INTERFACE
} IVirtualizedItemProviderVtbl;

interface IVirtualizedItemProvider {
    CONST_VTBL IVirtualizedItemProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVirtualizedItemProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVirtualizedItemProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVirtualizedItemProvider_Release(This) (This)->lpVtbl->Release(This)
/*** IVirtualizedItemProvider methods ***/
#define IVirtualizedItemProvider_Realize(This) (This)->lpVtbl->Realize(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IVirtualizedItemProvider_QueryInterface(IVirtualizedItemProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IVirtualizedItemProvider_AddRef(IVirtualizedItemProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IVirtualizedItemProvider_Release(IVirtualizedItemProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** IVirtualizedItemProvider methods ***/
static __WIDL_INLINE HRESULT IVirtualizedItemProvider_Realize(IVirtualizedItemProvider* This) {
    return This->lpVtbl->Realize(This);
}
#endif
#endif

#endif


#endif  /* __IVirtualizedItemProvider_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IObjectModelProvider interface
 */
#ifndef __IObjectModelProvider_INTERFACE_DEFINED__
#define __IObjectModelProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID_IObjectModelProvider, 0x3ad86ebd, 0xf5ef, 0x483d, 0xbb,0x18, 0xb1,0x04,0x2a,0x47,0x5d,0x64);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3ad86ebd-f5ef-483d-bb18-b1042a475d64")
IObjectModelProvider : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetUnderlyingObjectModel(
        IUnknown **ppUnknown) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IObjectModelProvider, 0x3ad86ebd, 0xf5ef, 0x483d, 0xbb,0x18, 0xb1,0x04,0x2a,0x47,0x5d,0x64)
#endif
#else
typedef struct IObjectModelProviderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IObjectModelProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *GetUnderlyingObjectModel)(
        IObjectModelProvider *This,
        IUnknown **ppUnknown);

    END_INTERFACE
} IObjectModelProviderVtbl;

interface IObjectModelProvider {
    CONST_VTBL IObjectModelProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IObjectModelProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IObjectModelProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IObjectModelProvider_Release(This) (This)->lpVtbl->Release(This)
/*** IObjectModelProvider methods ***/
#define IObjectModelProvider_GetUnderlyingObjectModel(This,ppUnknown) (This)->lpVtbl->GetUnderlyingObjectModel(This,ppUnknown)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IObjectModelProvider_QueryInterface(IObjectModelProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IObjectModelProvider_AddRef(IObjectModelProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IObjectModelProvider_Release(IObjectModelProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** IObjectModelProvider methods ***/
static __WIDL_INLINE HRESULT IObjectModelProvider_GetUnderlyingObjectModel(IObjectModelProvider* This,IUnknown **ppUnknown) {
    return This->lpVtbl->GetUnderlyingObjectModel(This,ppUnknown);
}
#endif
#endif

#endif


#endif  /* __IObjectModelProvider_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAnnotationProvider interface
 */
#ifndef __IAnnotationProvider_INTERFACE_DEFINED__
#define __IAnnotationProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID_IAnnotationProvider, 0xf95c7e80, 0xbd63, 0x4601, 0x97,0x82, 0x44,0x5e,0xbf,0xf0,0x11,0xfc);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("f95c7e80-bd63-4601-9782-445ebff011fc")
IAnnotationProvider : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE get_AnnotationTypeId(
        int *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_AnnotationTypeName(
        BSTR *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Author(
        BSTR *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_DateTime(
        BSTR *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Target(
        IRawElementProviderSimple **retVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IAnnotationProvider, 0xf95c7e80, 0xbd63, 0x4601, 0x97,0x82, 0x44,0x5e,0xbf,0xf0,0x11,0xfc)
#endif
#else
typedef struct IAnnotationProviderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAnnotationProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *get_AnnotationTypeId)(
        IAnnotationProvider *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_AnnotationTypeName)(
        IAnnotationProvider *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_Author)(
        IAnnotationProvider *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_DateTime)(
        IAnnotationProvider *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_Target)(
        IAnnotationProvider *This,
        IRawElementProviderSimple **retVal);

    END_INTERFACE
} IAnnotationProviderVtbl;

interface IAnnotationProvider {
    CONST_VTBL IAnnotationProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IAnnotationProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IAnnotationProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IAnnotationProvider_Release(This) (This)->lpVtbl->Release(This)
/*** IAnnotationProvider methods ***/
#define IAnnotationProvider_get_AnnotationTypeId(This,retVal) (This)->lpVtbl->get_AnnotationTypeId(This,retVal)
#define IAnnotationProvider_get_AnnotationTypeName(This,retVal) (This)->lpVtbl->get_AnnotationTypeName(This,retVal)
#define IAnnotationProvider_get_Author(This,retVal) (This)->lpVtbl->get_Author(This,retVal)
#define IAnnotationProvider_get_DateTime(This,retVal) (This)->lpVtbl->get_DateTime(This,retVal)
#define IAnnotationProvider_get_Target(This,retVal) (This)->lpVtbl->get_Target(This,retVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IAnnotationProvider_QueryInterface(IAnnotationProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IAnnotationProvider_AddRef(IAnnotationProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IAnnotationProvider_Release(IAnnotationProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** IAnnotationProvider methods ***/
static __WIDL_INLINE HRESULT IAnnotationProvider_get_AnnotationTypeId(IAnnotationProvider* This,int *retVal) {
    return This->lpVtbl->get_AnnotationTypeId(This,retVal);
}
static __WIDL_INLINE HRESULT IAnnotationProvider_get_AnnotationTypeName(IAnnotationProvider* This,BSTR *retVal) {
    return This->lpVtbl->get_AnnotationTypeName(This,retVal);
}
static __WIDL_INLINE HRESULT IAnnotationProvider_get_Author(IAnnotationProvider* This,BSTR *retVal) {
    return This->lpVtbl->get_Author(This,retVal);
}
static __WIDL_INLINE HRESULT IAnnotationProvider_get_DateTime(IAnnotationProvider* This,BSTR *retVal) {
    return This->lpVtbl->get_DateTime(This,retVal);
}
static __WIDL_INLINE HRESULT IAnnotationProvider_get_Target(IAnnotationProvider* This,IRawElementProviderSimple **retVal) {
    return This->lpVtbl->get_Target(This,retVal);
}
#endif
#endif

#endif


#endif  /* __IAnnotationProvider_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IStylesProvider interface
 */
#ifndef __IStylesProvider_INTERFACE_DEFINED__
#define __IStylesProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID_IStylesProvider, 0x19b6b649, 0xf5d7, 0x4a6d, 0xbd,0xcb, 0x12,0x92,0x52,0xbe,0x58,0x8a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("19b6b649-f5d7-4a6d-bdcb-129252be588a")
IStylesProvider : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE get_StyleId(
        int *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_StyleName(
        BSTR *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_FillColor(
        int *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_FillPatternStyle(
        BSTR *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Shape(
        BSTR *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_FillPatternColor(
        int *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ExtendedProperties(
        BSTR *retVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IStylesProvider, 0x19b6b649, 0xf5d7, 0x4a6d, 0xbd,0xcb, 0x12,0x92,0x52,0xbe,0x58,0x8a)
#endif
#else
typedef struct IStylesProviderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IStylesProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *get_StyleId)(
        IStylesProvider *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_StyleName)(
        IStylesProvider *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_FillColor)(
        IStylesProvider *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_FillPatternStyle)(
        IStylesProvider *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_Shape)(
        IStylesProvider *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_FillPatternColor)(
        IStylesProvider *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_ExtendedProperties)(
        IStylesProvider *This,
        BSTR *retVal);

    END_INTERFACE
} IStylesProviderVtbl;

interface IStylesProvider {
    CONST_VTBL IStylesProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IStylesProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IStylesProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IStylesProvider_Release(This) (This)->lpVtbl->Release(This)
/*** IStylesProvider methods ***/
#define IStylesProvider_get_StyleId(This,retVal) (This)->lpVtbl->get_StyleId(This,retVal)
#define IStylesProvider_get_StyleName(This,retVal) (This)->lpVtbl->get_StyleName(This,retVal)
#define IStylesProvider_get_FillColor(This,retVal) (This)->lpVtbl->get_FillColor(This,retVal)
#define IStylesProvider_get_FillPatternStyle(This,retVal) (This)->lpVtbl->get_FillPatternStyle(This,retVal)
#define IStylesProvider_get_Shape(This,retVal) (This)->lpVtbl->get_Shape(This,retVal)
#define IStylesProvider_get_FillPatternColor(This,retVal) (This)->lpVtbl->get_FillPatternColor(This,retVal)
#define IStylesProvider_get_ExtendedProperties(This,retVal) (This)->lpVtbl->get_ExtendedProperties(This,retVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IStylesProvider_QueryInterface(IStylesProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IStylesProvider_AddRef(IStylesProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IStylesProvider_Release(IStylesProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** IStylesProvider methods ***/
static __WIDL_INLINE HRESULT IStylesProvider_get_StyleId(IStylesProvider* This,int *retVal) {
    return This->lpVtbl->get_StyleId(This,retVal);
}
static __WIDL_INLINE HRESULT IStylesProvider_get_StyleName(IStylesProvider* This,BSTR *retVal) {
    return This->lpVtbl->get_StyleName(This,retVal);
}
static __WIDL_INLINE HRESULT IStylesProvider_get_FillColor(IStylesProvider* This,int *retVal) {
    return This->lpVtbl->get_FillColor(This,retVal);
}
static __WIDL_INLINE HRESULT IStylesProvider_get_FillPatternStyle(IStylesProvider* This,BSTR *retVal) {
    return This->lpVtbl->get_FillPatternStyle(This,retVal);
}
static __WIDL_INLINE HRESULT IStylesProvider_get_Shape(IStylesProvider* This,BSTR *retVal) {
    return This->lpVtbl->get_Shape(This,retVal);
}
static __WIDL_INLINE HRESULT IStylesProvider_get_FillPatternColor(IStylesProvider* This,int *retVal) {
    return This->lpVtbl->get_FillPatternColor(This,retVal);
}
static __WIDL_INLINE HRESULT IStylesProvider_get_ExtendedProperties(IStylesProvider* This,BSTR *retVal) {
    return This->lpVtbl->get_ExtendedProperties(This,retVal);
}
#endif
#endif

#endif


#endif  /* __IStylesProvider_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISpreadsheetProvider interface
 */
#ifndef __ISpreadsheetProvider_INTERFACE_DEFINED__
#define __ISpreadsheetProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISpreadsheetProvider, 0x6f6b5d35, 0x5525, 0x4f80, 0xb7,0x58, 0x85,0x47,0x38,0x32,0xff,0xc7);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("6f6b5d35-5525-4f80-b758-85473832ffc7")
ISpreadsheetProvider : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetItemByName(
        LPCWSTR name,
        IRawElementProviderSimple **pRetVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISpreadsheetProvider, 0x6f6b5d35, 0x5525, 0x4f80, 0xb7,0x58, 0x85,0x47,0x38,0x32,0xff,0xc7)
#endif
#else
typedef struct ISpreadsheetProviderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ISpreadsheetProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *GetItemByName)(
        ISpreadsheetProvider *This,
        LPCWSTR name,
        IRawElementProviderSimple **pRetVal);

    END_INTERFACE
} ISpreadsheetProviderVtbl;

interface ISpreadsheetProvider {
    CONST_VTBL ISpreadsheetProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISpreadsheetProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISpreadsheetProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISpreadsheetProvider_Release(This) (This)->lpVtbl->Release(This)
/*** ISpreadsheetProvider methods ***/
#define ISpreadsheetProvider_GetItemByName(This,name,pRetVal) (This)->lpVtbl->GetItemByName(This,name,pRetVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ISpreadsheetProvider_QueryInterface(ISpreadsheetProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISpreadsheetProvider_AddRef(ISpreadsheetProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISpreadsheetProvider_Release(ISpreadsheetProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** ISpreadsheetProvider methods ***/
static __WIDL_INLINE HRESULT ISpreadsheetProvider_GetItemByName(ISpreadsheetProvider* This,LPCWSTR name,IRawElementProviderSimple **pRetVal) {
    return This->lpVtbl->GetItemByName(This,name,pRetVal);
}
#endif
#endif

#endif


#endif  /* __ISpreadsheetProvider_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISpreadsheetItemProvider interface
 */
#ifndef __ISpreadsheetItemProvider_INTERFACE_DEFINED__
#define __ISpreadsheetItemProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISpreadsheetItemProvider, 0xeaed4660, 0x7b3d, 0x4879, 0xa2,0xe6, 0x36,0x5c,0xe6,0x03,0xf3,0xd0);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("eaed4660-7b3d-4879-a2e6-365ce603f3d0")
ISpreadsheetItemProvider : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE get_Formula(
        BSTR *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAnnotationObjects(
        SAFEARRAY **pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAnnotationTypes(
        SAFEARRAY **pRetVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISpreadsheetItemProvider, 0xeaed4660, 0x7b3d, 0x4879, 0xa2,0xe6, 0x36,0x5c,0xe6,0x03,0xf3,0xd0)
#endif
#else
typedef struct ISpreadsheetItemProviderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ISpreadsheetItemProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Formula)(
        ISpreadsheetItemProvider *This,
        BSTR *pRetVal);

    HRESULT (STDMETHODCALLTYPE *GetAnnotationObjects)(
        ISpreadsheetItemProvider *This,
        SAFEARRAY **pRetVal);

    HRESULT (STDMETHODCALLTYPE *GetAnnotationTypes)(
        ISpreadsheetItemProvider *This,
        SAFEARRAY **pRetVal);

    END_INTERFACE
} ISpreadsheetItemProviderVtbl;

interface ISpreadsheetItemProvider {
    CONST_VTBL ISpreadsheetItemProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISpreadsheetItemProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISpreadsheetItemProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISpreadsheetItemProvider_Release(This) (This)->lpVtbl->Release(This)
/*** ISpreadsheetItemProvider methods ***/
#define ISpreadsheetItemProvider_get_Formula(This,pRetVal) (This)->lpVtbl->get_Formula(This,pRetVal)
#define ISpreadsheetItemProvider_GetAnnotationObjects(This,pRetVal) (This)->lpVtbl->GetAnnotationObjects(This,pRetVal)
#define ISpreadsheetItemProvider_GetAnnotationTypes(This,pRetVal) (This)->lpVtbl->GetAnnotationTypes(This,pRetVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ISpreadsheetItemProvider_QueryInterface(ISpreadsheetItemProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISpreadsheetItemProvider_AddRef(ISpreadsheetItemProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISpreadsheetItemProvider_Release(ISpreadsheetItemProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** ISpreadsheetItemProvider methods ***/
static __WIDL_INLINE HRESULT ISpreadsheetItemProvider_get_Formula(ISpreadsheetItemProvider* This,BSTR *pRetVal) {
    return This->lpVtbl->get_Formula(This,pRetVal);
}
static __WIDL_INLINE HRESULT ISpreadsheetItemProvider_GetAnnotationObjects(ISpreadsheetItemProvider* This,SAFEARRAY **pRetVal) {
    return This->lpVtbl->GetAnnotationObjects(This,pRetVal);
}
static __WIDL_INLINE HRESULT ISpreadsheetItemProvider_GetAnnotationTypes(ISpreadsheetItemProvider* This,SAFEARRAY **pRetVal) {
    return This->lpVtbl->GetAnnotationTypes(This,pRetVal);
}
#endif
#endif

#endif


#endif  /* __ISpreadsheetItemProvider_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITransformProvider2 interface
 */
#ifndef __ITransformProvider2_INTERFACE_DEFINED__
#define __ITransformProvider2_INTERFACE_DEFINED__

DEFINE_GUID(IID_ITransformProvider2, 0x4758742f, 0x7ac2, 0x460c, 0xbc,0x48, 0x09,0xfc,0x09,0x30,0x8a,0x93);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("4758742f-7ac2-460c-bc48-09fc09308a93")
ITransformProvider2 : public ITransformProvider
{
    virtual HRESULT STDMETHODCALLTYPE Zoom(
        double zoom) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CanZoom(
        WINBOOL *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ZoomLevel(
        double *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ZoomMinimum(
        double *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ZoomMaximum(
        double *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE ZoomByUnit(
        enum ZoomUnit zoomUnit) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ITransformProvider2, 0x4758742f, 0x7ac2, 0x460c, 0xbc,0x48, 0x09,0xfc,0x09,0x30,0x8a,0x93)
#endif
#else
typedef struct ITransformProvider2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITransformProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *Move)(
        ITransformProvider2 *This,
        double x,
        double y);

    HRESULT (STDMETHODCALLTYPE *Resize)(
        ITransformProvider2 *This,
        double width,
        double height);

    HRESULT (STDMETHODCALLTYPE *Rotate)(
        ITransformProvider2 *This,
        double degrees);

    HRESULT (STDMETHODCALLTYPE *get_CanMove)(
        ITransformProvider2 *This,
        WINBOOL *pRetVal);

    HRESULT (STDMETHODCALLTYPE *get_CanResize)(
        ITransformProvider2 *This,
        WINBOOL *pRetVal);

    HRESULT (STDMETHODCALLTYPE *get_CanRotate)(
        ITransformProvider2 *This,
        WINBOOL *pRetVal);

    /*** ITransformProvider2 methods ***/
    HRESULT (STDMETHODCALLTYPE *Zoom)(
        ITransformProvider2 *This,
        double zoom);

    HRESULT (STDMETHODCALLTYPE *get_CanZoom)(
        ITransformProvider2 *This,
        WINBOOL *pRetVal);

    HRESULT (STDMETHODCALLTYPE *get_ZoomLevel)(
        ITransformProvider2 *This,
        double *pRetVal);

    HRESULT (STDMETHODCALLTYPE *get_ZoomMinimum)(
        ITransformProvider2 *This,
        double *pRetVal);

    HRESULT (STDMETHODCALLTYPE *get_ZoomMaximum)(
        ITransformProvider2 *This,
        double *pRetVal);

    HRESULT (STDMETHODCALLTYPE *ZoomByUnit)(
        ITransformProvider2 *This,
        enum ZoomUnit zoomUnit);

    END_INTERFACE
} ITransformProvider2Vtbl;

interface ITransformProvider2 {
    CONST_VTBL ITransformProvider2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ITransformProvider2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITransformProvider2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITransformProvider2_Release(This) (This)->lpVtbl->Release(This)
/*** ITransformProvider methods ***/
#define ITransformProvider2_Move(This,x,y) (This)->lpVtbl->Move(This,x,y)
#define ITransformProvider2_Resize(This,width,height) (This)->lpVtbl->Resize(This,width,height)
#define ITransformProvider2_Rotate(This,degrees) (This)->lpVtbl->Rotate(This,degrees)
#define ITransformProvider2_get_CanMove(This,pRetVal) (This)->lpVtbl->get_CanMove(This,pRetVal)
#define ITransformProvider2_get_CanResize(This,pRetVal) (This)->lpVtbl->get_CanResize(This,pRetVal)
#define ITransformProvider2_get_CanRotate(This,pRetVal) (This)->lpVtbl->get_CanRotate(This,pRetVal)
/*** ITransformProvider2 methods ***/
#define ITransformProvider2_Zoom(This,zoom) (This)->lpVtbl->Zoom(This,zoom)
#define ITransformProvider2_get_CanZoom(This,pRetVal) (This)->lpVtbl->get_CanZoom(This,pRetVal)
#define ITransformProvider2_get_ZoomLevel(This,pRetVal) (This)->lpVtbl->get_ZoomLevel(This,pRetVal)
#define ITransformProvider2_get_ZoomMinimum(This,pRetVal) (This)->lpVtbl->get_ZoomMinimum(This,pRetVal)
#define ITransformProvider2_get_ZoomMaximum(This,pRetVal) (This)->lpVtbl->get_ZoomMaximum(This,pRetVal)
#define ITransformProvider2_ZoomByUnit(This,zoomUnit) (This)->lpVtbl->ZoomByUnit(This,zoomUnit)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ITransformProvider2_QueryInterface(ITransformProvider2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ITransformProvider2_AddRef(ITransformProvider2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ITransformProvider2_Release(ITransformProvider2* This) {
    return This->lpVtbl->Release(This);
}
/*** ITransformProvider methods ***/
static __WIDL_INLINE HRESULT ITransformProvider2_Move(ITransformProvider2* This,double x,double y) {
    return This->lpVtbl->Move(This,x,y);
}
static __WIDL_INLINE HRESULT ITransformProvider2_Resize(ITransformProvider2* This,double width,double height) {
    return This->lpVtbl->Resize(This,width,height);
}
static __WIDL_INLINE HRESULT ITransformProvider2_Rotate(ITransformProvider2* This,double degrees) {
    return This->lpVtbl->Rotate(This,degrees);
}
static __WIDL_INLINE HRESULT ITransformProvider2_get_CanMove(ITransformProvider2* This,WINBOOL *pRetVal) {
    return This->lpVtbl->get_CanMove(This,pRetVal);
}
static __WIDL_INLINE HRESULT ITransformProvider2_get_CanResize(ITransformProvider2* This,WINBOOL *pRetVal) {
    return This->lpVtbl->get_CanResize(This,pRetVal);
}
static __WIDL_INLINE HRESULT ITransformProvider2_get_CanRotate(ITransformProvider2* This,WINBOOL *pRetVal) {
    return This->lpVtbl->get_CanRotate(This,pRetVal);
}
/*** ITransformProvider2 methods ***/
static __WIDL_INLINE HRESULT ITransformProvider2_Zoom(ITransformProvider2* This,double zoom) {
    return This->lpVtbl->Zoom(This,zoom);
}
static __WIDL_INLINE HRESULT ITransformProvider2_get_CanZoom(ITransformProvider2* This,WINBOOL *pRetVal) {
    return This->lpVtbl->get_CanZoom(This,pRetVal);
}
static __WIDL_INLINE HRESULT ITransformProvider2_get_ZoomLevel(ITransformProvider2* This,double *pRetVal) {
    return This->lpVtbl->get_ZoomLevel(This,pRetVal);
}
static __WIDL_INLINE HRESULT ITransformProvider2_get_ZoomMinimum(ITransformProvider2* This,double *pRetVal) {
    return This->lpVtbl->get_ZoomMinimum(This,pRetVal);
}
static __WIDL_INLINE HRESULT ITransformProvider2_get_ZoomMaximum(ITransformProvider2* This,double *pRetVal) {
    return This->lpVtbl->get_ZoomMaximum(This,pRetVal);
}
static __WIDL_INLINE HRESULT ITransformProvider2_ZoomByUnit(ITransformProvider2* This,enum ZoomUnit zoomUnit) {
    return This->lpVtbl->ZoomByUnit(This,zoomUnit);
}
#endif
#endif

#endif


#endif  /* __ITransformProvider2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDragProvider interface
 */
#ifndef __IDragProvider_INTERFACE_DEFINED__
#define __IDragProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDragProvider, 0x6aa7bbbb, 0x7ff9, 0x497d, 0x90,0x4f, 0xd2,0x0b,0x89,0x79,0x29,0xd8);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("6aa7bbbb-7ff9-497d-904f-d20b897929d8")
IDragProvider : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE get_IsGrabbed(
        WINBOOL *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_DropEffect(
        BSTR *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_DropEffects(
        SAFEARRAY **pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetGrabbedItems(
        SAFEARRAY **pRetVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDragProvider, 0x6aa7bbbb, 0x7ff9, 0x497d, 0x90,0x4f, 0xd2,0x0b,0x89,0x79,0x29,0xd8)
#endif
#else
typedef struct IDragProviderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDragProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *get_IsGrabbed)(
        IDragProvider *This,
        WINBOOL *pRetVal);

    HRESULT (STDMETHODCALLTYPE *get_DropEffect)(
        IDragProvider *This,
        BSTR *pRetVal);

    HRESULT (STDMETHODCALLTYPE *get_DropEffects)(
        IDragProvider *This,
        SAFEARRAY **pRetVal);

    HRESULT (STDMETHODCALLTYPE *GetGrabbedItems)(
        IDragProvider *This,
        SAFEARRAY **pRetVal);

    END_INTERFACE
} IDragProviderVtbl;

interface IDragProvider {
    CONST_VTBL IDragProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDragProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDragProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDragProvider_Release(This) (This)->lpVtbl->Release(This)
/*** IDragProvider methods ***/
#define IDragProvider_get_IsGrabbed(This,pRetVal) (This)->lpVtbl->get_IsGrabbed(This,pRetVal)
#define IDragProvider_get_DropEffect(This,pRetVal) (This)->lpVtbl->get_DropEffect(This,pRetVal)
#define IDragProvider_get_DropEffects(This,pRetVal) (This)->lpVtbl->get_DropEffects(This,pRetVal)
#define IDragProvider_GetGrabbedItems(This,pRetVal) (This)->lpVtbl->GetGrabbedItems(This,pRetVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IDragProvider_QueryInterface(IDragProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDragProvider_AddRef(IDragProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDragProvider_Release(IDragProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** IDragProvider methods ***/
static __WIDL_INLINE HRESULT IDragProvider_get_IsGrabbed(IDragProvider* This,WINBOOL *pRetVal) {
    return This->lpVtbl->get_IsGrabbed(This,pRetVal);
}
static __WIDL_INLINE HRESULT IDragProvider_get_DropEffect(IDragProvider* This,BSTR *pRetVal) {
    return This->lpVtbl->get_DropEffect(This,pRetVal);
}
static __WIDL_INLINE HRESULT IDragProvider_get_DropEffects(IDragProvider* This,SAFEARRAY **pRetVal) {
    return This->lpVtbl->get_DropEffects(This,pRetVal);
}
static __WIDL_INLINE HRESULT IDragProvider_GetGrabbedItems(IDragProvider* This,SAFEARRAY **pRetVal) {
    return This->lpVtbl->GetGrabbedItems(This,pRetVal);
}
#endif
#endif

#endif


#endif  /* __IDragProvider_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDropTargetProvider interface
 */
#ifndef __IDropTargetProvider_INTERFACE_DEFINED__
#define __IDropTargetProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDropTargetProvider, 0xbae82bfd, 0x358a, 0x481c, 0x85,0xa0, 0xd8,0xb4,0xd9,0x0a,0x5d,0x61);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("bae82bfd-358a-481c-85a0-d8b4d90a5d61")
IDropTargetProvider : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE get_DropTargetEffect(
        BSTR *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_DropTargetEffects(
        SAFEARRAY **pRetVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDropTargetProvider, 0xbae82bfd, 0x358a, 0x481c, 0x85,0xa0, 0xd8,0xb4,0xd9,0x0a,0x5d,0x61)
#endif
#else
typedef struct IDropTargetProviderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDropTargetProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *get_DropTargetEffect)(
        IDropTargetProvider *This,
        BSTR *pRetVal);

    HRESULT (STDMETHODCALLTYPE *get_DropTargetEffects)(
        IDropTargetProvider *This,
        SAFEARRAY **pRetVal);

    END_INTERFACE
} IDropTargetProviderVtbl;

interface IDropTargetProvider {
    CONST_VTBL IDropTargetProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDropTargetProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDropTargetProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDropTargetProvider_Release(This) (This)->lpVtbl->Release(This)
/*** IDropTargetProvider methods ***/
#define IDropTargetProvider_get_DropTargetEffect(This,pRetVal) (This)->lpVtbl->get_DropTargetEffect(This,pRetVal)
#define IDropTargetProvider_get_DropTargetEffects(This,pRetVal) (This)->lpVtbl->get_DropTargetEffects(This,pRetVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IDropTargetProvider_QueryInterface(IDropTargetProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDropTargetProvider_AddRef(IDropTargetProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDropTargetProvider_Release(IDropTargetProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** IDropTargetProvider methods ***/
static __WIDL_INLINE HRESULT IDropTargetProvider_get_DropTargetEffect(IDropTargetProvider* This,BSTR *pRetVal) {
    return This->lpVtbl->get_DropTargetEffect(This,pRetVal);
}
static __WIDL_INLINE HRESULT IDropTargetProvider_get_DropTargetEffects(IDropTargetProvider* This,SAFEARRAY **pRetVal) {
    return This->lpVtbl->get_DropTargetEffects(This,pRetVal);
}
#endif
#endif

#endif


#endif  /* __IDropTargetProvider_INTERFACE_DEFINED__ */

#ifndef __ITextRangeProvider_FWD_DEFINED__
#define __ITextRangeProvider_FWD_DEFINED__
typedef interface ITextRangeProvider ITextRangeProvider;
#ifdef __cplusplus
interface ITextRangeProvider;
#endif /* __cplusplus */
#endif

/*****************************************************************************
 * ITextProvider interface
 */
#ifndef __ITextProvider_INTERFACE_DEFINED__
#define __ITextProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID_ITextProvider, 0x3589c92c, 0x63f3, 0x4367, 0x99,0xbb, 0xad,0xa6,0x53,0xb7,0x7c,0xf2);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3589c92c-63f3-4367-99bb-ada653b77cf2")
ITextProvider : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetSelection(
        SAFEARRAY **pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetVisibleRanges(
        SAFEARRAY **pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE RangeFromChild(
        IRawElementProviderSimple *childElement,
        ITextRangeProvider **pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE RangeFromPoint(
        struct UiaPoint point,
        ITextRangeProvider **pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_DocumentRange(
        ITextRangeProvider **pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_SupportedTextSelection(
        enum SupportedTextSelection *pRetVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ITextProvider, 0x3589c92c, 0x63f3, 0x4367, 0x99,0xbb, 0xad,0xa6,0x53,0xb7,0x7c,0xf2)
#endif
#else
typedef struct ITextProviderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITextProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSelection)(
        ITextProvider *This,
        SAFEARRAY **pRetVal);

    HRESULT (STDMETHODCALLTYPE *GetVisibleRanges)(
        ITextProvider *This,
        SAFEARRAY **pRetVal);

    HRESULT (STDMETHODCALLTYPE *RangeFromChild)(
        ITextProvider *This,
        IRawElementProviderSimple *childElement,
        ITextRangeProvider **pRetVal);

    HRESULT (STDMETHODCALLTYPE *RangeFromPoint)(
        ITextProvider *This,
        struct UiaPoint point,
        ITextRangeProvider **pRetVal);

    HRESULT (STDMETHODCALLTYPE *get_DocumentRange)(
        ITextProvider *This,
        ITextRangeProvider **pRetVal);

    HRESULT (STDMETHODCALLTYPE *get_SupportedTextSelection)(
        ITextProvider *This,
        enum SupportedTextSelection *pRetVal);

    END_INTERFACE
} ITextProviderVtbl;

interface ITextProvider {
    CONST_VTBL ITextProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ITextProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITextProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITextProvider_Release(This) (This)->lpVtbl->Release(This)
/*** ITextProvider methods ***/
#define ITextProvider_GetSelection(This,pRetVal) (This)->lpVtbl->GetSelection(This,pRetVal)
#define ITextProvider_GetVisibleRanges(This,pRetVal) (This)->lpVtbl->GetVisibleRanges(This,pRetVal)
#define ITextProvider_RangeFromChild(This,childElement,pRetVal) (This)->lpVtbl->RangeFromChild(This,childElement,pRetVal)
#define ITextProvider_RangeFromPoint(This,point,pRetVal) (This)->lpVtbl->RangeFromPoint(This,point,pRetVal)
#define ITextProvider_get_DocumentRange(This,pRetVal) (This)->lpVtbl->get_DocumentRange(This,pRetVal)
#define ITextProvider_get_SupportedTextSelection(This,pRetVal) (This)->lpVtbl->get_SupportedTextSelection(This,pRetVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ITextProvider_QueryInterface(ITextProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ITextProvider_AddRef(ITextProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ITextProvider_Release(ITextProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** ITextProvider methods ***/
static __WIDL_INLINE HRESULT ITextProvider_GetSelection(ITextProvider* This,SAFEARRAY **pRetVal) {
    return This->lpVtbl->GetSelection(This,pRetVal);
}
static __WIDL_INLINE HRESULT ITextProvider_GetVisibleRanges(ITextProvider* This,SAFEARRAY **pRetVal) {
    return This->lpVtbl->GetVisibleRanges(This,pRetVal);
}
static __WIDL_INLINE HRESULT ITextProvider_RangeFromChild(ITextProvider* This,IRawElementProviderSimple *childElement,ITextRangeProvider **pRetVal) {
    return This->lpVtbl->RangeFromChild(This,childElement,pRetVal);
}
static __WIDL_INLINE HRESULT ITextProvider_RangeFromPoint(ITextProvider* This,struct UiaPoint point,ITextRangeProvider **pRetVal) {
    return This->lpVtbl->RangeFromPoint(This,point,pRetVal);
}
static __WIDL_INLINE HRESULT ITextProvider_get_DocumentRange(ITextProvider* This,ITextRangeProvider **pRetVal) {
    return This->lpVtbl->get_DocumentRange(This,pRetVal);
}
static __WIDL_INLINE HRESULT ITextProvider_get_SupportedTextSelection(ITextProvider* This,enum SupportedTextSelection *pRetVal) {
    return This->lpVtbl->get_SupportedTextSelection(This,pRetVal);
}
#endif
#endif

#endif


#endif  /* __ITextProvider_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITextProvider2 interface
 */
#ifndef __ITextProvider2_INTERFACE_DEFINED__
#define __ITextProvider2_INTERFACE_DEFINED__

DEFINE_GUID(IID_ITextProvider2, 0x0dc5e6ed, 0x3e16, 0x4bf1, 0x8f,0x9a, 0xa9,0x79,0x87,0x8b,0xc1,0x95);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("0dc5e6ed-3e16-4bf1-8f9a-a979878bc195")
ITextProvider2 : public ITextProvider
{
    virtual HRESULT STDMETHODCALLTYPE RangeFromAnnotation(
        IRawElementProviderSimple *annotationElement,
        ITextRangeProvider **pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCaretRange(
        WINBOOL *isActive,
        ITextRangeProvider **pRetVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ITextProvider2, 0x0dc5e6ed, 0x3e16, 0x4bf1, 0x8f,0x9a, 0xa9,0x79,0x87,0x8b,0xc1,0x95)
#endif
#else
typedef struct ITextProvider2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITextProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSelection)(
        ITextProvider2 *This,
        SAFEARRAY **pRetVal);

    HRESULT (STDMETHODCALLTYPE *GetVisibleRanges)(
        ITextProvider2 *This,
        SAFEARRAY **pRetVal);

    HRESULT (STDMETHODCALLTYPE *RangeFromChild)(
        ITextProvider2 *This,
        IRawElementProviderSimple *childElement,
        ITextRangeProvider **pRetVal);

    HRESULT (STDMETHODCALLTYPE *RangeFromPoint)(
        ITextProvider2 *This,
        struct UiaPoint point,
        ITextRangeProvider **pRetVal);

    HRESULT (STDMETHODCALLTYPE *get_DocumentRange)(
        ITextProvider2 *This,
        ITextRangeProvider **pRetVal);

    HRESULT (STDMETHODCALLTYPE *get_SupportedTextSelection)(
        ITextProvider2 *This,
        enum SupportedTextSelection *pRetVal);

    /*** ITextProvider2 methods ***/
    HRESULT (STDMETHODCALLTYPE *RangeFromAnnotation)(
        ITextProvider2 *This,
        IRawElementProviderSimple *annotationElement,
        ITextRangeProvider **pRetVal);

    HRESULT (STDMETHODCALLTYPE *GetCaretRange)(
        ITextProvider2 *This,
        WINBOOL *isActive,
        ITextRangeProvider **pRetVal);

    END_INTERFACE
} ITextProvider2Vtbl;

interface ITextProvider2 {
    CONST_VTBL ITextProvider2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ITextProvider2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITextProvider2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITextProvider2_Release(This) (This)->lpVtbl->Release(This)
/*** ITextProvider methods ***/
#define ITextProvider2_GetSelection(This,pRetVal) (This)->lpVtbl->GetSelection(This,pRetVal)
#define ITextProvider2_GetVisibleRanges(This,pRetVal) (This)->lpVtbl->GetVisibleRanges(This,pRetVal)
#define ITextProvider2_RangeFromChild(This,childElement,pRetVal) (This)->lpVtbl->RangeFromChild(This,childElement,pRetVal)
#define ITextProvider2_RangeFromPoint(This,point,pRetVal) (This)->lpVtbl->RangeFromPoint(This,point,pRetVal)
#define ITextProvider2_get_DocumentRange(This,pRetVal) (This)->lpVtbl->get_DocumentRange(This,pRetVal)
#define ITextProvider2_get_SupportedTextSelection(This,pRetVal) (This)->lpVtbl->get_SupportedTextSelection(This,pRetVal)
/*** ITextProvider2 methods ***/
#define ITextProvider2_RangeFromAnnotation(This,annotationElement,pRetVal) (This)->lpVtbl->RangeFromAnnotation(This,annotationElement,pRetVal)
#define ITextProvider2_GetCaretRange(This,isActive,pRetVal) (This)->lpVtbl->GetCaretRange(This,isActive,pRetVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ITextProvider2_QueryInterface(ITextProvider2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ITextProvider2_AddRef(ITextProvider2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ITextProvider2_Release(ITextProvider2* This) {
    return This->lpVtbl->Release(This);
}
/*** ITextProvider methods ***/
static __WIDL_INLINE HRESULT ITextProvider2_GetSelection(ITextProvider2* This,SAFEARRAY **pRetVal) {
    return This->lpVtbl->GetSelection(This,pRetVal);
}
static __WIDL_INLINE HRESULT ITextProvider2_GetVisibleRanges(ITextProvider2* This,SAFEARRAY **pRetVal) {
    return This->lpVtbl->GetVisibleRanges(This,pRetVal);
}
static __WIDL_INLINE HRESULT ITextProvider2_RangeFromChild(ITextProvider2* This,IRawElementProviderSimple *childElement,ITextRangeProvider **pRetVal) {
    return This->lpVtbl->RangeFromChild(This,childElement,pRetVal);
}
static __WIDL_INLINE HRESULT ITextProvider2_RangeFromPoint(ITextProvider2* This,struct UiaPoint point,ITextRangeProvider **pRetVal) {
    return This->lpVtbl->RangeFromPoint(This,point,pRetVal);
}
static __WIDL_INLINE HRESULT ITextProvider2_get_DocumentRange(ITextProvider2* This,ITextRangeProvider **pRetVal) {
    return This->lpVtbl->get_DocumentRange(This,pRetVal);
}
static __WIDL_INLINE HRESULT ITextProvider2_get_SupportedTextSelection(ITextProvider2* This,enum SupportedTextSelection *pRetVal) {
    return This->lpVtbl->get_SupportedTextSelection(This,pRetVal);
}
/*** ITextProvider2 methods ***/
static __WIDL_INLINE HRESULT ITextProvider2_RangeFromAnnotation(ITextProvider2* This,IRawElementProviderSimple *annotationElement,ITextRangeProvider **pRetVal) {
    return This->lpVtbl->RangeFromAnnotation(This,annotationElement,pRetVal);
}
static __WIDL_INLINE HRESULT ITextProvider2_GetCaretRange(ITextProvider2* This,WINBOOL *isActive,ITextRangeProvider **pRetVal) {
    return This->lpVtbl->GetCaretRange(This,isActive,pRetVal);
}
#endif
#endif

#endif


#endif  /* __ITextProvider2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITextEditProvider interface
 */
#ifndef __ITextEditProvider_INTERFACE_DEFINED__
#define __ITextEditProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID_ITextEditProvider, 0xea3605b4, 0x3a05, 0x400e, 0xb5,0xf9, 0x4e,0x91,0xb4,0x0f,0x61,0x76);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("ea3605b4-3a05-400e-b5f9-4e91b40f6176")
ITextEditProvider : public ITextProvider
{
    virtual HRESULT STDMETHODCALLTYPE GetActiveComposition(
        ITextRangeProvider **pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetConversionTarget(
        ITextRangeProvider **pRetVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ITextEditProvider, 0xea3605b4, 0x3a05, 0x400e, 0xb5,0xf9, 0x4e,0x91,0xb4,0x0f,0x61,0x76)
#endif
#else
typedef struct ITextEditProviderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITextProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSelection)(
        ITextEditProvider *This,
        SAFEARRAY **pRetVal);

    HRESULT (STDMETHODCALLTYPE *GetVisibleRanges)(
        ITextEditProvider *This,
        SAFEARRAY **pRetVal);

    HRESULT (STDMETHODCALLTYPE *RangeFromChild)(
        ITextEditProvider *This,
        IRawElementProviderSimple *childElement,
        ITextRangeProvider **pRetVal);

    HRESULT (STDMETHODCALLTYPE *RangeFromPoint)(
        ITextEditProvider *This,
        struct UiaPoint point,
        ITextRangeProvider **pRetVal);

    HRESULT (STDMETHODCALLTYPE *get_DocumentRange)(
        ITextEditProvider *This,
        ITextRangeProvider **pRetVal);

    HRESULT (STDMETHODCALLTYPE *get_SupportedTextSelection)(
        ITextEditProvider *This,
        enum SupportedTextSelection *pRetVal);

    /*** ITextEditProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *GetActiveComposition)(
        ITextEditProvider *This,
        ITextRangeProvider **pRetVal);

    HRESULT (STDMETHODCALLTYPE *GetConversionTarget)(
        ITextEditProvider *This,
        ITextRangeProvider **pRetVal);

    END_INTERFACE
} ITextEditProviderVtbl;

interface ITextEditProvider {
    CONST_VTBL ITextEditProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ITextEditProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITextEditProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITextEditProvider_Release(This) (This)->lpVtbl->Release(This)
/*** ITextProvider methods ***/
#define ITextEditProvider_GetSelection(This,pRetVal) (This)->lpVtbl->GetSelection(This,pRetVal)
#define ITextEditProvider_GetVisibleRanges(This,pRetVal) (This)->lpVtbl->GetVisibleRanges(This,pRetVal)
#define ITextEditProvider_RangeFromChild(This,childElement,pRetVal) (This)->lpVtbl->RangeFromChild(This,childElement,pRetVal)
#define ITextEditProvider_RangeFromPoint(This,point,pRetVal) (This)->lpVtbl->RangeFromPoint(This,point,pRetVal)
#define ITextEditProvider_get_DocumentRange(This,pRetVal) (This)->lpVtbl->get_DocumentRange(This,pRetVal)
#define ITextEditProvider_get_SupportedTextSelection(This,pRetVal) (This)->lpVtbl->get_SupportedTextSelection(This,pRetVal)
/*** ITextEditProvider methods ***/
#define ITextEditProvider_GetActiveComposition(This,pRetVal) (This)->lpVtbl->GetActiveComposition(This,pRetVal)
#define ITextEditProvider_GetConversionTarget(This,pRetVal) (This)->lpVtbl->GetConversionTarget(This,pRetVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ITextEditProvider_QueryInterface(ITextEditProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ITextEditProvider_AddRef(ITextEditProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ITextEditProvider_Release(ITextEditProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** ITextProvider methods ***/
static __WIDL_INLINE HRESULT ITextEditProvider_GetSelection(ITextEditProvider* This,SAFEARRAY **pRetVal) {
    return This->lpVtbl->GetSelection(This,pRetVal);
}
static __WIDL_INLINE HRESULT ITextEditProvider_GetVisibleRanges(ITextEditProvider* This,SAFEARRAY **pRetVal) {
    return This->lpVtbl->GetVisibleRanges(This,pRetVal);
}
static __WIDL_INLINE HRESULT ITextEditProvider_RangeFromChild(ITextEditProvider* This,IRawElementProviderSimple *childElement,ITextRangeProvider **pRetVal) {
    return This->lpVtbl->RangeFromChild(This,childElement,pRetVal);
}
static __WIDL_INLINE HRESULT ITextEditProvider_RangeFromPoint(ITextEditProvider* This,struct UiaPoint point,ITextRangeProvider **pRetVal) {
    return This->lpVtbl->RangeFromPoint(This,point,pRetVal);
}
static __WIDL_INLINE HRESULT ITextEditProvider_get_DocumentRange(ITextEditProvider* This,ITextRangeProvider **pRetVal) {
    return This->lpVtbl->get_DocumentRange(This,pRetVal);
}
static __WIDL_INLINE HRESULT ITextEditProvider_get_SupportedTextSelection(ITextEditProvider* This,enum SupportedTextSelection *pRetVal) {
    return This->lpVtbl->get_SupportedTextSelection(This,pRetVal);
}
/*** ITextEditProvider methods ***/
static __WIDL_INLINE HRESULT ITextEditProvider_GetActiveComposition(ITextEditProvider* This,ITextRangeProvider **pRetVal) {
    return This->lpVtbl->GetActiveComposition(This,pRetVal);
}
static __WIDL_INLINE HRESULT ITextEditProvider_GetConversionTarget(ITextEditProvider* This,ITextRangeProvider **pRetVal) {
    return This->lpVtbl->GetConversionTarget(This,pRetVal);
}
#endif
#endif

#endif


#endif  /* __ITextEditProvider_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITextRangeProvider interface
 */
#ifndef __ITextRangeProvider_INTERFACE_DEFINED__
#define __ITextRangeProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID_ITextRangeProvider, 0x5347ad7b, 0xc355, 0x46f8, 0xaf,0xf5, 0x90,0x90,0x33,0x58,0x2f,0x63);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("5347ad7b-c355-46f8-aff5-909033582f63")
ITextRangeProvider : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Clone(
        ITextRangeProvider **pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE Compare(
        ITextRangeProvider *range,
        WINBOOL *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE CompareEndpoints(
        enum TextPatternRangeEndpoint endpoint,
        ITextRangeProvider *targetRange,
        enum TextPatternRangeEndpoint targetEndpoint,
        int *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE ExpandToEnclosingUnit(
        enum TextUnit unit) = 0;

    virtual HRESULT STDMETHODCALLTYPE FindAttribute(
        TEXTATTRIBUTEID attributeId,
        VARIANT val,
        WINBOOL backward,
        ITextRangeProvider **pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE FindText(
        BSTR text,
        WINBOOL backward,
        WINBOOL ignoreCase,
        ITextRangeProvider **pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAttributeValue(
        TEXTATTRIBUTEID attributeId,
        VARIANT *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetBoundingRectangles(
        SAFEARRAY **pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetEnclosingElement(
        IRawElementProviderSimple **pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetText(
        int maxLength,
        BSTR *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE Move(
        enum TextUnit unit,
        int count,
        int *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE MoveEndpointByUnit(
        enum TextPatternRangeEndpoint endpoint,
        enum TextUnit unit,
        int count,
        int *pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE MoveEndpointByRange(
        enum TextPatternRangeEndpoint endpoint,
        ITextRangeProvider *targetRange,
        enum TextPatternRangeEndpoint targetEndpoint) = 0;

    virtual HRESULT STDMETHODCALLTYPE Select(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddToSelection(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveFromSelection(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE ScrollIntoView(
        WINBOOL alignToTop) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetChildren(
        SAFEARRAY **pRetVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ITextRangeProvider, 0x5347ad7b, 0xc355, 0x46f8, 0xaf,0xf5, 0x90,0x90,0x33,0x58,0x2f,0x63)
#endif
#else
typedef struct ITextRangeProviderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITextRangeProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *Clone)(
        ITextRangeProvider *This,
        ITextRangeProvider **pRetVal);

    HRESULT (STDMETHODCALLTYPE *Compare)(
        ITextRangeProvider *This,
        ITextRangeProvider *range,
        WINBOOL *pRetVal);

    HRESULT (STDMETHODCALLTYPE *CompareEndpoints)(
        ITextRangeProvider *This,
        enum TextPatternRangeEndpoint endpoint,
        ITextRangeProvider *targetRange,
        enum TextPatternRangeEndpoint targetEndpoint,
        int *pRetVal);

    HRESULT (STDMETHODCALLTYPE *ExpandToEnclosingUnit)(
        ITextRangeProvider *This,
        enum TextUnit unit);

    HRESULT (STDMETHODCALLTYPE *FindAttribute)(
        ITextRangeProvider *This,
        TEXTATTRIBUTEID attributeId,
        VARIANT val,
        WINBOOL backward,
        ITextRangeProvider **pRetVal);

    HRESULT (STDMETHODCALLTYPE *FindText)(
        ITextRangeProvider *This,
        BSTR text,
        WINBOOL backward,
        WINBOOL ignoreCase,
        ITextRangeProvider **pRetVal);

    HRESULT (STDMETHODCALLTYPE *GetAttributeValue)(
        ITextRangeProvider *This,
        TEXTATTRIBUTEID attributeId,
        VARIANT *pRetVal);

    HRESULT (STDMETHODCALLTYPE *GetBoundingRectangles)(
        ITextRangeProvider *This,
        SAFEARRAY **pRetVal);

    HRESULT (STDMETHODCALLTYPE *GetEnclosingElement)(
        ITextRangeProvider *This,
        IRawElementProviderSimple **pRetVal);

    HRESULT (STDMETHODCALLTYPE *GetText)(
        ITextRangeProvider *This,
        int maxLength,
        BSTR *pRetVal);

    HRESULT (STDMETHODCALLTYPE *Move)(
        ITextRangeProvider *This,
        enum TextUnit unit,
        int count,
        int *pRetVal);

    HRESULT (STDMETHODCALLTYPE *MoveEndpointByUnit)(
        ITextRangeProvider *This,
        enum TextPatternRangeEndpoint endpoint,
        enum TextUnit unit,
        int count,
        int *pRetVal);

    HRESULT (STDMETHODCALLTYPE *MoveEndpointByRange)(
        ITextRangeProvider *This,
        enum TextPatternRangeEndpoint endpoint,
        ITextRangeProvider *targetRange,
        enum TextPatternRangeEndpoint targetEndpoint);

    HRESULT (STDMETHODCALLTYPE *Select)(
        ITextRangeProvider *This);

    HRESULT (STDMETHODCALLTYPE *AddToSelection)(
        ITextRangeProvider *This);

    HRESULT (STDMETHODCALLTYPE *RemoveFromSelection)(
        ITextRangeProvider *This);

    HRESULT (STDMETHODCALLTYPE *ScrollIntoView)(
        ITextRangeProvider *This,
        WINBOOL alignToTop);

    HRESULT (STDMETHODCALLTYPE *GetChildren)(
        ITextRangeProvider *This,
        SAFEARRAY **pRetVal);

    END_INTERFACE
} ITextRangeProviderVtbl;

interface ITextRangeProvider {
    CONST_VTBL ITextRangeProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ITextRangeProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITextRangeProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITextRangeProvider_Release(This) (This)->lpVtbl->Release(This)
/*** ITextRangeProvider methods ***/
#define ITextRangeProvider_Clone(This,pRetVal) (This)->lpVtbl->Clone(This,pRetVal)
#define ITextRangeProvider_Compare(This,range,pRetVal) (This)->lpVtbl->Compare(This,range,pRetVal)
#define ITextRangeProvider_CompareEndpoints(This,endpoint,targetRange,targetEndpoint,pRetVal) (This)->lpVtbl->CompareEndpoints(This,endpoint,targetRange,targetEndpoint,pRetVal)
#define ITextRangeProvider_ExpandToEnclosingUnit(This,unit) (This)->lpVtbl->ExpandToEnclosingUnit(This,unit)
#define ITextRangeProvider_FindAttribute(This,attributeId,val,backward,pRetVal) (This)->lpVtbl->FindAttribute(This,attributeId,val,backward,pRetVal)
#define ITextRangeProvider_FindText(This,text,backward,ignoreCase,pRetVal) (This)->lpVtbl->FindText(This,text,backward,ignoreCase,pRetVal)
#define ITextRangeProvider_GetAttributeValue(This,attributeId,pRetVal) (This)->lpVtbl->GetAttributeValue(This,attributeId,pRetVal)
#define ITextRangeProvider_GetBoundingRectangles(This,pRetVal) (This)->lpVtbl->GetBoundingRectangles(This,pRetVal)
#define ITextRangeProvider_GetEnclosingElement(This,pRetVal) (This)->lpVtbl->GetEnclosingElement(This,pRetVal)
#define ITextRangeProvider_GetText(This,maxLength,pRetVal) (This)->lpVtbl->GetText(This,maxLength,pRetVal)
#define ITextRangeProvider_Move(This,unit,count,pRetVal) (This)->lpVtbl->Move(This,unit,count,pRetVal)
#define ITextRangeProvider_MoveEndpointByUnit(This,endpoint,unit,count,pRetVal) (This)->lpVtbl->MoveEndpointByUnit(This,endpoint,unit,count,pRetVal)
#define ITextRangeProvider_MoveEndpointByRange(This,endpoint,targetRange,targetEndpoint) (This)->lpVtbl->MoveEndpointByRange(This,endpoint,targetRange,targetEndpoint)
#define ITextRangeProvider_Select(This) (This)->lpVtbl->Select(This)
#define ITextRangeProvider_AddToSelection(This) (This)->lpVtbl->AddToSelection(This)
#define ITextRangeProvider_RemoveFromSelection(This) (This)->lpVtbl->RemoveFromSelection(This)
#define ITextRangeProvider_ScrollIntoView(This,alignToTop) (This)->lpVtbl->ScrollIntoView(This,alignToTop)
#define ITextRangeProvider_GetChildren(This,pRetVal) (This)->lpVtbl->GetChildren(This,pRetVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ITextRangeProvider_QueryInterface(ITextRangeProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ITextRangeProvider_AddRef(ITextRangeProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ITextRangeProvider_Release(ITextRangeProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** ITextRangeProvider methods ***/
static __WIDL_INLINE HRESULT ITextRangeProvider_Clone(ITextRangeProvider* This,ITextRangeProvider **pRetVal) {
    return This->lpVtbl->Clone(This,pRetVal);
}
static __WIDL_INLINE HRESULT ITextRangeProvider_Compare(ITextRangeProvider* This,ITextRangeProvider *range,WINBOOL *pRetVal) {
    return This->lpVtbl->Compare(This,range,pRetVal);
}
static __WIDL_INLINE HRESULT ITextRangeProvider_CompareEndpoints(ITextRangeProvider* This,enum TextPatternRangeEndpoint endpoint,ITextRangeProvider *targetRange,enum TextPatternRangeEndpoint targetEndpoint,int *pRetVal) {
    return This->lpVtbl->CompareEndpoints(This,endpoint,targetRange,targetEndpoint,pRetVal);
}
static __WIDL_INLINE HRESULT ITextRangeProvider_ExpandToEnclosingUnit(ITextRangeProvider* This,enum TextUnit unit) {
    return This->lpVtbl->ExpandToEnclosingUnit(This,unit);
}
static __WIDL_INLINE HRESULT ITextRangeProvider_FindAttribute(ITextRangeProvider* This,TEXTATTRIBUTEID attributeId,VARIANT val,WINBOOL backward,ITextRangeProvider **pRetVal) {
    return This->lpVtbl->FindAttribute(This,attributeId,val,backward,pRetVal);
}
static __WIDL_INLINE HRESULT ITextRangeProvider_FindText(ITextRangeProvider* This,BSTR text,WINBOOL backward,WINBOOL ignoreCase,ITextRangeProvider **pRetVal) {
    return This->lpVtbl->FindText(This,text,backward,ignoreCase,pRetVal);
}
static __WIDL_INLINE HRESULT ITextRangeProvider_GetAttributeValue(ITextRangeProvider* This,TEXTATTRIBUTEID attributeId,VARIANT *pRetVal) {
    return This->lpVtbl->GetAttributeValue(This,attributeId,pRetVal);
}
static __WIDL_INLINE HRESULT ITextRangeProvider_GetBoundingRectangles(ITextRangeProvider* This,SAFEARRAY **pRetVal) {
    return This->lpVtbl->GetBoundingRectangles(This,pRetVal);
}
static __WIDL_INLINE HRESULT ITextRangeProvider_GetEnclosingElement(ITextRangeProvider* This,IRawElementProviderSimple **pRetVal) {
    return This->lpVtbl->GetEnclosingElement(This,pRetVal);
}
static __WIDL_INLINE HRESULT ITextRangeProvider_GetText(ITextRangeProvider* This,int maxLength,BSTR *pRetVal) {
    return This->lpVtbl->GetText(This,maxLength,pRetVal);
}
static __WIDL_INLINE HRESULT ITextRangeProvider_Move(ITextRangeProvider* This,enum TextUnit unit,int count,int *pRetVal) {
    return This->lpVtbl->Move(This,unit,count,pRetVal);
}
static __WIDL_INLINE HRESULT ITextRangeProvider_MoveEndpointByUnit(ITextRangeProvider* This,enum TextPatternRangeEndpoint endpoint,enum TextUnit unit,int count,int *pRetVal) {
    return This->lpVtbl->MoveEndpointByUnit(This,endpoint,unit,count,pRetVal);
}
static __WIDL_INLINE HRESULT ITextRangeProvider_MoveEndpointByRange(ITextRangeProvider* This,enum TextPatternRangeEndpoint endpoint,ITextRangeProvider *targetRange,enum TextPatternRangeEndpoint targetEndpoint) {
    return This->lpVtbl->MoveEndpointByRange(This,endpoint,targetRange,targetEndpoint);
}
static __WIDL_INLINE HRESULT ITextRangeProvider_Select(ITextRangeProvider* This) {
    return This->lpVtbl->Select(This);
}
static __WIDL_INLINE HRESULT ITextRangeProvider_AddToSelection(ITextRangeProvider* This) {
    return This->lpVtbl->AddToSelection(This);
}
static __WIDL_INLINE HRESULT ITextRangeProvider_RemoveFromSelection(ITextRangeProvider* This) {
    return This->lpVtbl->RemoveFromSelection(This);
}
static __WIDL_INLINE HRESULT ITextRangeProvider_ScrollIntoView(ITextRangeProvider* This,WINBOOL alignToTop) {
    return This->lpVtbl->ScrollIntoView(This,alignToTop);
}
static __WIDL_INLINE HRESULT ITextRangeProvider_GetChildren(ITextRangeProvider* This,SAFEARRAY **pRetVal) {
    return This->lpVtbl->GetChildren(This,pRetVal);
}
#endif
#endif

#endif


#endif  /* __ITextRangeProvider_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITextRangeProvider2 interface
 */
#ifndef __ITextRangeProvider2_INTERFACE_DEFINED__
#define __ITextRangeProvider2_INTERFACE_DEFINED__

DEFINE_GUID(IID_ITextRangeProvider2, 0x9bbce42c, 0x1921, 0x4f18, 0x89,0xca, 0xdb,0xa1,0x91,0x0a,0x03,0x86);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("9bbce42c-1921-4f18-89ca-dba1910a0386")
ITextRangeProvider2 : public ITextRangeProvider
{
    virtual HRESULT STDMETHODCALLTYPE ShowContextMenu(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ITextRangeProvider2, 0x9bbce42c, 0x1921, 0x4f18, 0x89,0xca, 0xdb,0xa1,0x91,0x0a,0x03,0x86)
#endif
#else
typedef struct ITextRangeProvider2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITextRangeProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *Clone)(
        ITextRangeProvider2 *This,
        ITextRangeProvider **pRetVal);

    HRESULT (STDMETHODCALLTYPE *Compare)(
        ITextRangeProvider2 *This,
        ITextRangeProvider *range,
        WINBOOL *pRetVal);

    HRESULT (STDMETHODCALLTYPE *CompareEndpoints)(
        ITextRangeProvider2 *This,
        enum TextPatternRangeEndpoint endpoint,
        ITextRangeProvider *targetRange,
        enum TextPatternRangeEndpoint targetEndpoint,
        int *pRetVal);

    HRESULT (STDMETHODCALLTYPE *ExpandToEnclosingUnit)(
        ITextRangeProvider2 *This,
        enum TextUnit unit);

    HRESULT (STDMETHODCALLTYPE *FindAttribute)(
        ITextRangeProvider2 *This,
        TEXTATTRIBUTEID attributeId,
        VARIANT val,
        WINBOOL backward,
        ITextRangeProvider **pRetVal);

    HRESULT (STDMETHODCALLTYPE *FindText)(
        ITextRangeProvider2 *This,
        BSTR text,
        WINBOOL backward,
        WINBOOL ignoreCase,
        ITextRangeProvider **pRetVal);

    HRESULT (STDMETHODCALLTYPE *GetAttributeValue)(
        ITextRangeProvider2 *This,
        TEXTATTRIBUTEID attributeId,
        VARIANT *pRetVal);

    HRESULT (STDMETHODCALLTYPE *GetBoundingRectangles)(
        ITextRangeProvider2 *This,
        SAFEARRAY **pRetVal);

    HRESULT (STDMETHODCALLTYPE *GetEnclosingElement)(
        ITextRangeProvider2 *This,
        IRawElementProviderSimple **pRetVal);

    HRESULT (STDMETHODCALLTYPE *GetText)(
        ITextRangeProvider2 *This,
        int maxLength,
        BSTR *pRetVal);

    HRESULT (STDMETHODCALLTYPE *Move)(
        ITextRangeProvider2 *This,
        enum TextUnit unit,
        int count,
        int *pRetVal);

    HRESULT (STDMETHODCALLTYPE *MoveEndpointByUnit)(
        ITextRangeProvider2 *This,
        enum TextPatternRangeEndpoint endpoint,
        enum TextUnit unit,
        int count,
        int *pRetVal);

    HRESULT (STDMETHODCALLTYPE *MoveEndpointByRange)(
        ITextRangeProvider2 *This,
        enum TextPatternRangeEndpoint endpoint,
        ITextRangeProvider *targetRange,
        enum TextPatternRangeEndpoint targetEndpoint);

    HRESULT (STDMETHODCALLTYPE *Select)(
        ITextRangeProvider2 *This);

    HRESULT (STDMETHODCALLTYPE *AddToSelection)(
        ITextRangeProvider2 *This);

    HRESULT (STDMETHODCALLTYPE *RemoveFromSelection)(
        ITextRangeProvider2 *This);

    HRESULT (STDMETHODCALLTYPE *ScrollIntoView)(
        ITextRangeProvider2 *This,
        WINBOOL alignToTop);

    HRESULT (STDMETHODCALLTYPE *GetChildren)(
        ITextRangeProvider2 *This,
        SAFEARRAY **pRetVal);

    /*** ITextRangeProvider2 methods ***/
    HRESULT (STDMETHODCALLTYPE *ShowContextMenu)(
        ITextRangeProvider2 *This);

    END_INTERFACE
} ITextRangeProvider2Vtbl;

interface ITextRangeProvider2 {
    CONST_VTBL ITextRangeProvider2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ITextRangeProvider2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITextRangeProvider2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITextRangeProvider2_Release(This) (This)->lpVtbl->Release(This)
/*** ITextRangeProvider methods ***/
#define ITextRangeProvider2_Clone(This,pRetVal) (This)->lpVtbl->Clone(This,pRetVal)
#define ITextRangeProvider2_Compare(This,range,pRetVal) (This)->lpVtbl->Compare(This,range,pRetVal)
#define ITextRangeProvider2_CompareEndpoints(This,endpoint,targetRange,targetEndpoint,pRetVal) (This)->lpVtbl->CompareEndpoints(This,endpoint,targetRange,targetEndpoint,pRetVal)
#define ITextRangeProvider2_ExpandToEnclosingUnit(This,unit) (This)->lpVtbl->ExpandToEnclosingUnit(This,unit)
#define ITextRangeProvider2_FindAttribute(This,attributeId,val,backward,pRetVal) (This)->lpVtbl->FindAttribute(This,attributeId,val,backward,pRetVal)
#define ITextRangeProvider2_FindText(This,text,backward,ignoreCase,pRetVal) (This)->lpVtbl->FindText(This,text,backward,ignoreCase,pRetVal)
#define ITextRangeProvider2_GetAttributeValue(This,attributeId,pRetVal) (This)->lpVtbl->GetAttributeValue(This,attributeId,pRetVal)
#define ITextRangeProvider2_GetBoundingRectangles(This,pRetVal) (This)->lpVtbl->GetBoundingRectangles(This,pRetVal)
#define ITextRangeProvider2_GetEnclosingElement(This,pRetVal) (This)->lpVtbl->GetEnclosingElement(This,pRetVal)
#define ITextRangeProvider2_GetText(This,maxLength,pRetVal) (This)->lpVtbl->GetText(This,maxLength,pRetVal)
#define ITextRangeProvider2_Move(This,unit,count,pRetVal) (This)->lpVtbl->Move(This,unit,count,pRetVal)
#define ITextRangeProvider2_MoveEndpointByUnit(This,endpoint,unit,count,pRetVal) (This)->lpVtbl->MoveEndpointByUnit(This,endpoint,unit,count,pRetVal)
#define ITextRangeProvider2_MoveEndpointByRange(This,endpoint,targetRange,targetEndpoint) (This)->lpVtbl->MoveEndpointByRange(This,endpoint,targetRange,targetEndpoint)
#define ITextRangeProvider2_Select(This) (This)->lpVtbl->Select(This)
#define ITextRangeProvider2_AddToSelection(This) (This)->lpVtbl->AddToSelection(This)
#define ITextRangeProvider2_RemoveFromSelection(This) (This)->lpVtbl->RemoveFromSelection(This)
#define ITextRangeProvider2_ScrollIntoView(This,alignToTop) (This)->lpVtbl->ScrollIntoView(This,alignToTop)
#define ITextRangeProvider2_GetChildren(This,pRetVal) (This)->lpVtbl->GetChildren(This,pRetVal)
/*** ITextRangeProvider2 methods ***/
#define ITextRangeProvider2_ShowContextMenu(This) (This)->lpVtbl->ShowContextMenu(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ITextRangeProvider2_QueryInterface(ITextRangeProvider2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ITextRangeProvider2_AddRef(ITextRangeProvider2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ITextRangeProvider2_Release(ITextRangeProvider2* This) {
    return This->lpVtbl->Release(This);
}
/*** ITextRangeProvider methods ***/
static __WIDL_INLINE HRESULT ITextRangeProvider2_Clone(ITextRangeProvider2* This,ITextRangeProvider **pRetVal) {
    return This->lpVtbl->Clone(This,pRetVal);
}
static __WIDL_INLINE HRESULT ITextRangeProvider2_Compare(ITextRangeProvider2* This,ITextRangeProvider *range,WINBOOL *pRetVal) {
    return This->lpVtbl->Compare(This,range,pRetVal);
}
static __WIDL_INLINE HRESULT ITextRangeProvider2_CompareEndpoints(ITextRangeProvider2* This,enum TextPatternRangeEndpoint endpoint,ITextRangeProvider *targetRange,enum TextPatternRangeEndpoint targetEndpoint,int *pRetVal) {
    return This->lpVtbl->CompareEndpoints(This,endpoint,targetRange,targetEndpoint,pRetVal);
}
static __WIDL_INLINE HRESULT ITextRangeProvider2_ExpandToEnclosingUnit(ITextRangeProvider2* This,enum TextUnit unit) {
    return This->lpVtbl->ExpandToEnclosingUnit(This,unit);
}
static __WIDL_INLINE HRESULT ITextRangeProvider2_FindAttribute(ITextRangeProvider2* This,TEXTATTRIBUTEID attributeId,VARIANT val,WINBOOL backward,ITextRangeProvider **pRetVal) {
    return This->lpVtbl->FindAttribute(This,attributeId,val,backward,pRetVal);
}
static __WIDL_INLINE HRESULT ITextRangeProvider2_FindText(ITextRangeProvider2* This,BSTR text,WINBOOL backward,WINBOOL ignoreCase,ITextRangeProvider **pRetVal) {
    return This->lpVtbl->FindText(This,text,backward,ignoreCase,pRetVal);
}
static __WIDL_INLINE HRESULT ITextRangeProvider2_GetAttributeValue(ITextRangeProvider2* This,TEXTATTRIBUTEID attributeId,VARIANT *pRetVal) {
    return This->lpVtbl->GetAttributeValue(This,attributeId,pRetVal);
}
static __WIDL_INLINE HRESULT ITextRangeProvider2_GetBoundingRectangles(ITextRangeProvider2* This,SAFEARRAY **pRetVal) {
    return This->lpVtbl->GetBoundingRectangles(This,pRetVal);
}
static __WIDL_INLINE HRESULT ITextRangeProvider2_GetEnclosingElement(ITextRangeProvider2* This,IRawElementProviderSimple **pRetVal) {
    return This->lpVtbl->GetEnclosingElement(This,pRetVal);
}
static __WIDL_INLINE HRESULT ITextRangeProvider2_GetText(ITextRangeProvider2* This,int maxLength,BSTR *pRetVal) {
    return This->lpVtbl->GetText(This,maxLength,pRetVal);
}
static __WIDL_INLINE HRESULT ITextRangeProvider2_Move(ITextRangeProvider2* This,enum TextUnit unit,int count,int *pRetVal) {
    return This->lpVtbl->Move(This,unit,count,pRetVal);
}
static __WIDL_INLINE HRESULT ITextRangeProvider2_MoveEndpointByUnit(ITextRangeProvider2* This,enum TextPatternRangeEndpoint endpoint,enum TextUnit unit,int count,int *pRetVal) {
    return This->lpVtbl->MoveEndpointByUnit(This,endpoint,unit,count,pRetVal);
}
static __WIDL_INLINE HRESULT ITextRangeProvider2_MoveEndpointByRange(ITextRangeProvider2* This,enum TextPatternRangeEndpoint endpoint,ITextRangeProvider *targetRange,enum TextPatternRangeEndpoint targetEndpoint) {
    return This->lpVtbl->MoveEndpointByRange(This,endpoint,targetRange,targetEndpoint);
}
static __WIDL_INLINE HRESULT ITextRangeProvider2_Select(ITextRangeProvider2* This) {
    return This->lpVtbl->Select(This);
}
static __WIDL_INLINE HRESULT ITextRangeProvider2_AddToSelection(ITextRangeProvider2* This) {
    return This->lpVtbl->AddToSelection(This);
}
static __WIDL_INLINE HRESULT ITextRangeProvider2_RemoveFromSelection(ITextRangeProvider2* This) {
    return This->lpVtbl->RemoveFromSelection(This);
}
static __WIDL_INLINE HRESULT ITextRangeProvider2_ScrollIntoView(ITextRangeProvider2* This,WINBOOL alignToTop) {
    return This->lpVtbl->ScrollIntoView(This,alignToTop);
}
static __WIDL_INLINE HRESULT ITextRangeProvider2_GetChildren(ITextRangeProvider2* This,SAFEARRAY **pRetVal) {
    return This->lpVtbl->GetChildren(This,pRetVal);
}
/*** ITextRangeProvider2 methods ***/
static __WIDL_INLINE HRESULT ITextRangeProvider2_ShowContextMenu(ITextRangeProvider2* This) {
    return This->lpVtbl->ShowContextMenu(This);
}
#endif
#endif

#endif


#endif  /* __ITextRangeProvider2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITextChildProvider interface
 */
#ifndef __ITextChildProvider_INTERFACE_DEFINED__
#define __ITextChildProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID_ITextChildProvider, 0x4c2de2b9, 0xc88f, 0x4f88, 0xa1,0x11, 0xf1,0xd3,0x36,0xb7,0xd1,0xa9);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("4c2de2b9-c88f-4f88-a111-f1d336b7d1a9")
ITextChildProvider : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE get_TextContainer(
        IRawElementProviderSimple **pRetVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_TextRange(
        ITextRangeProvider **pRetVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ITextChildProvider, 0x4c2de2b9, 0xc88f, 0x4f88, 0xa1,0x11, 0xf1,0xd3,0x36,0xb7,0xd1,0xa9)
#endif
#else
typedef struct ITextChildProviderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITextChildProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *get_TextContainer)(
        ITextChildProvider *This,
        IRawElementProviderSimple **pRetVal);

    HRESULT (STDMETHODCALLTYPE *get_TextRange)(
        ITextChildProvider *This,
        ITextRangeProvider **pRetVal);

    END_INTERFACE
} ITextChildProviderVtbl;

interface ITextChildProvider {
    CONST_VTBL ITextChildProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ITextChildProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITextChildProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITextChildProvider_Release(This) (This)->lpVtbl->Release(This)
/*** ITextChildProvider methods ***/
#define ITextChildProvider_get_TextContainer(This,pRetVal) (This)->lpVtbl->get_TextContainer(This,pRetVal)
#define ITextChildProvider_get_TextRange(This,pRetVal) (This)->lpVtbl->get_TextRange(This,pRetVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ITextChildProvider_QueryInterface(ITextChildProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ITextChildProvider_AddRef(ITextChildProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ITextChildProvider_Release(ITextChildProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** ITextChildProvider methods ***/
static __WIDL_INLINE HRESULT ITextChildProvider_get_TextContainer(ITextChildProvider* This,IRawElementProviderSimple **pRetVal) {
    return This->lpVtbl->get_TextContainer(This,pRetVal);
}
static __WIDL_INLINE HRESULT ITextChildProvider_get_TextRange(ITextChildProvider* This,ITextRangeProvider **pRetVal) {
    return This->lpVtbl->get_TextRange(This,pRetVal);
}
#endif
#endif

#endif


#endif  /* __ITextChildProvider_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ICustomNavigationProvider interface
 */
#ifndef __ICustomNavigationProvider_INTERFACE_DEFINED__
#define __ICustomNavigationProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID_ICustomNavigationProvider, 0x2062a28a, 0x8c07, 0x4b94, 0x8e,0x12, 0x70,0x37,0xc6,0x22,0xae,0xb8);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2062a28a-8c07-4b94-8e12-7037c622aeb8")
ICustomNavigationProvider : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Navigate(
        enum NavigateDirection direction,
        IRawElementProviderSimple **pRetVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ICustomNavigationProvider, 0x2062a28a, 0x8c07, 0x4b94, 0x8e,0x12, 0x70,0x37,0xc6,0x22,0xae,0xb8)
#endif
#else
typedef struct ICustomNavigationProviderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ICustomNavigationProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *Navigate)(
        ICustomNavigationProvider *This,
        enum NavigateDirection direction,
        IRawElementProviderSimple **pRetVal);

    END_INTERFACE
} ICustomNavigationProviderVtbl;

interface ICustomNavigationProvider {
    CONST_VTBL ICustomNavigationProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ICustomNavigationProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ICustomNavigationProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ICustomNavigationProvider_Release(This) (This)->lpVtbl->Release(This)
/*** ICustomNavigationProvider methods ***/
#define ICustomNavigationProvider_Navigate(This,direction,pRetVal) (This)->lpVtbl->Navigate(This,direction,pRetVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ICustomNavigationProvider_QueryInterface(ICustomNavigationProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ICustomNavigationProvider_AddRef(ICustomNavigationProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ICustomNavigationProvider_Release(ICustomNavigationProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** ICustomNavigationProvider methods ***/
static __WIDL_INLINE HRESULT ICustomNavigationProvider_Navigate(ICustomNavigationProvider* This,enum NavigateDirection direction,IRawElementProviderSimple **pRetVal) {
    return This->lpVtbl->Navigate(This,direction,pRetVal);
}
#endif
#endif

#endif


#endif  /* __ICustomNavigationProvider_INTERFACE_DEFINED__ */

enum UIAutomationType {
    UIAutomationType_Int = 0x1,
    UIAutomationType_Bool = 0x2,
    UIAutomationType_String = 0x3,
    UIAutomationType_Double = 0x4,
    UIAutomationType_Point = 0x5,
    UIAutomationType_Rect = 0x6,
    UIAutomationType_Element = 0x7,
    UIAutomationType_Array = 0x10000,
    UIAutomationType_Out = 0x20000,
    UIAutomationType_IntArray = UIAutomationType_Int | UIAutomationType_Array,
    UIAutomationType_BoolArray = UIAutomationType_Bool | UIAutomationType_Array,
    UIAutomationType_StringArray = UIAutomationType_String | UIAutomationType_Array,
    UIAutomationType_DoubleArray = UIAutomationType_Double | UIAutomationType_Array,
    UIAutomationType_PointArray = UIAutomationType_Point | UIAutomationType_Array,
    UIAutomationType_RectArray = UIAutomationType_Rect | UIAutomationType_Array,
    UIAutomationType_ElementArray = UIAutomationType_Element | UIAutomationType_Array,
    UIAutomationType_OutInt = UIAutomationType_Int | UIAutomationType_Out,
    UIAutomationType_OutBool = UIAutomationType_Bool | UIAutomationType_Out,
    UIAutomationType_OutString = UIAutomationType_String | UIAutomationType_Out,
    UIAutomationType_OutDouble = UIAutomationType_Double | UIAutomationType_Out,
    UIAutomationType_OutPoint = UIAutomationType_Point | UIAutomationType_Out,
    UIAutomationType_OutRect = UIAutomationType_Rect | UIAutomationType_Out,
    UIAutomationType_OutElement = UIAutomationType_Element | UIAutomationType_Out,
    UIAutomationType_OutIntArray = (UIAutomationType_Int | UIAutomationType_Array) | UIAutomationType_Out,
    UIAutomationType_OutBoolArray = (UIAutomationType_Bool | UIAutomationType_Array) | UIAutomationType_Out,
    UIAutomationType_OutStringArray = (UIAutomationType_String | UIAutomationType_Array) | UIAutomationType_Out,
    UIAutomationType_OutDoubleArray = (UIAutomationType_Double | UIAutomationType_Array) | UIAutomationType_Out,
    UIAutomationType_OutPointArray = (UIAutomationType_Point | UIAutomationType_Array) | UIAutomationType_Out,
    UIAutomationType_OutRectArray = (UIAutomationType_Rect | UIAutomationType_Array) | UIAutomationType_Out,
    UIAutomationType_OutElementArray = (UIAutomationType_Element | UIAutomationType_Array) | UIAutomationType_Out
};
DEFINE_ENUM_FLAG_OPERATORS(UIAutomationType)
struct UIAutomationParameter {
    enum UIAutomationType type;
    void *pData;
};
struct UIAutomationPropertyInfo {
    GUID guid;
    LPCWSTR pProgrammaticName;
    enum UIAutomationType type;
};
struct UIAutomationEventInfo {
    GUID guid;
    LPCWSTR pProgrammaticName;
};
struct UIAutomationMethodInfo {
    LPCWSTR pProgrammaticName;
    WINBOOL doSetFocus;
    UINT cInParameters;
    UINT cOutParameters;
    enum UIAutomationType *pParameterTypes;
    LPCWSTR *pParameterNames;
};
/*****************************************************************************
 * IUIAutomationPatternInstance interface
 */
#ifndef __IUIAutomationPatternInstance_INTERFACE_DEFINED__
#define __IUIAutomationPatternInstance_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationPatternInstance, 0xc03a7fe4, 0x9431, 0x409f, 0xbe,0xd8, 0xae,0x7c,0x22,0x99,0xbc,0x8d);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c03a7fe4-9431-409f-bed8-ae7c2299bc8d")
IUIAutomationPatternInstance : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetProperty(
        UINT index,
        WINBOOL cached,
        enum UIAutomationType type,
        void *pPtr) = 0;

    virtual HRESULT STDMETHODCALLTYPE CallMethod(
        UINT index,
        const struct UIAutomationParameter *pParams,
        UINT cParams) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationPatternInstance, 0xc03a7fe4, 0x9431, 0x409f, 0xbe,0xd8, 0xae,0x7c,0x22,0x99,0xbc,0x8d)
#endif
#else
typedef struct IUIAutomationPatternInstanceVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomationPatternInstance methods ***/
    HRESULT (STDMETHODCALLTYPE *GetProperty)(
        IUIAutomationPatternInstance *This,
        UINT index,
        WINBOOL cached,
        enum UIAutomationType type,
        void *pPtr);

    HRESULT (STDMETHODCALLTYPE *CallMethod)(
        IUIAutomationPatternInstance *This,
        UINT index,
        const struct UIAutomationParameter *pParams,
        UINT cParams);

    END_INTERFACE
} IUIAutomationPatternInstanceVtbl;

interface IUIAutomationPatternInstance {
    CONST_VTBL IUIAutomationPatternInstanceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationPatternInstance_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationPatternInstance_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationPatternInstance_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationPatternInstance methods ***/
#define IUIAutomationPatternInstance_GetProperty(This,index,cached,type,pPtr) (This)->lpVtbl->GetProperty(This,index,cached,type,pPtr)
#define IUIAutomationPatternInstance_CallMethod(This,index,pParams,cParams) (This)->lpVtbl->CallMethod(This,index,pParams,cParams)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationPatternInstance_QueryInterface(IUIAutomationPatternInstance* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationPatternInstance_AddRef(IUIAutomationPatternInstance* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationPatternInstance_Release(IUIAutomationPatternInstance* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationPatternInstance methods ***/
static __WIDL_INLINE HRESULT IUIAutomationPatternInstance_GetProperty(IUIAutomationPatternInstance* This,UINT index,WINBOOL cached,enum UIAutomationType type,void *pPtr) {
    return This->lpVtbl->GetProperty(This,index,cached,type,pPtr);
}
static __WIDL_INLINE HRESULT IUIAutomationPatternInstance_CallMethod(IUIAutomationPatternInstance* This,UINT index,const struct UIAutomationParameter *pParams,UINT cParams) {
    return This->lpVtbl->CallMethod(This,index,pParams,cParams);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationPatternInstance_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationPatternHandler interface
 */
#ifndef __IUIAutomationPatternHandler_INTERFACE_DEFINED__
#define __IUIAutomationPatternHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationPatternHandler, 0xd97022f3, 0xa947, 0x465e, 0x8b,0x2a, 0xac,0x43,0x15,0xfa,0x54,0xe8);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d97022f3-a947-465e-8b2a-ac4315fa54e8")
IUIAutomationPatternHandler : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE CreateClientWrapper(
        IUIAutomationPatternInstance *pPatternInstance,
        IUnknown **pClientWrapper) = 0;

    virtual HRESULT STDMETHODCALLTYPE Dispatch(
        IUnknown *pTarget,
        UINT index,
        const struct UIAutomationParameter *pParams,
        UINT cParams) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationPatternHandler, 0xd97022f3, 0xa947, 0x465e, 0x8b,0x2a, 0xac,0x43,0x15,0xfa,0x54,0xe8)
#endif
#else
typedef struct IUIAutomationPatternHandlerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomationPatternHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateClientWrapper)(
        IUIAutomationPatternHandler *This,
        IUIAutomationPatternInstance *pPatternInstance,
        IUnknown **pClientWrapper);

    HRESULT (STDMETHODCALLTYPE *Dispatch)(
        IUIAutomationPatternHandler *This,
        IUnknown *pTarget,
        UINT index,
        const struct UIAutomationParameter *pParams,
        UINT cParams);

    END_INTERFACE
} IUIAutomationPatternHandlerVtbl;

interface IUIAutomationPatternHandler {
    CONST_VTBL IUIAutomationPatternHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationPatternHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationPatternHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationPatternHandler_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationPatternHandler methods ***/
#define IUIAutomationPatternHandler_CreateClientWrapper(This,pPatternInstance,pClientWrapper) (This)->lpVtbl->CreateClientWrapper(This,pPatternInstance,pClientWrapper)
#define IUIAutomationPatternHandler_Dispatch(This,pTarget,index,pParams,cParams) (This)->lpVtbl->Dispatch(This,pTarget,index,pParams,cParams)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationPatternHandler_QueryInterface(IUIAutomationPatternHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationPatternHandler_AddRef(IUIAutomationPatternHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationPatternHandler_Release(IUIAutomationPatternHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationPatternHandler methods ***/
static __WIDL_INLINE HRESULT IUIAutomationPatternHandler_CreateClientWrapper(IUIAutomationPatternHandler* This,IUIAutomationPatternInstance *pPatternInstance,IUnknown **pClientWrapper) {
    return This->lpVtbl->CreateClientWrapper(This,pPatternInstance,pClientWrapper);
}
static __WIDL_INLINE HRESULT IUIAutomationPatternHandler_Dispatch(IUIAutomationPatternHandler* This,IUnknown *pTarget,UINT index,const struct UIAutomationParameter *pParams,UINT cParams) {
    return This->lpVtbl->Dispatch(This,pTarget,index,pParams,cParams);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationPatternHandler_INTERFACE_DEFINED__ */

struct UIAutomationPatternInfo {
    GUID guid;
    LPCWSTR pProgrammaticName;
    GUID providerInterfaceId;
    GUID clientInterfaceId;
    UINT cProperties;
    struct UIAutomationPropertyInfo *pProperties;
    UINT cMethods;
    struct UIAutomationMethodInfo *pMethods;
    UINT cEvents;
    struct UIAutomationEventInfo *pEvents;
    IUIAutomationPatternHandler *pPatternHandler;
};
/*****************************************************************************
 * IUIAutomationRegistrar interface
 */
#ifndef __IUIAutomationRegistrar_INTERFACE_DEFINED__
#define __IUIAutomationRegistrar_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationRegistrar, 0x8609c4ec, 0x4a1a, 0x4d88, 0xa3,0x57, 0x5a,0x66,0xe0,0x60,0xe1,0xcf);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("8609c4ec-4a1a-4d88-a357-5a66e060e1cf")
IUIAutomationRegistrar : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE RegisterProperty(
        const struct UIAutomationPropertyInfo *property,
        PROPERTYID *propertyId) = 0;

    virtual HRESULT STDMETHODCALLTYPE RegisterEvent(
        const struct UIAutomationEventInfo *event,
        EVENTID *eventId) = 0;

    virtual HRESULT STDMETHODCALLTYPE RegisterPattern(
        const struct UIAutomationPatternInfo *pattern,
        PATTERNID *pPatternId,
        PROPERTYID *pPatternAvailablePropertyId,
        UINT propertyIdCount,
        PROPERTYID *pPropertyIds,
        UINT eventIdCount,
        EVENTID *pEventIds) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationRegistrar, 0x8609c4ec, 0x4a1a, 0x4d88, 0xa3,0x57, 0x5a,0x66,0xe0,0x60,0xe1,0xcf)
#endif
#else
typedef struct IUIAutomationRegistrarVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomationRegistrar methods ***/
    HRESULT (STDMETHODCALLTYPE *RegisterProperty)(
        IUIAutomationRegistrar *This,
        const struct UIAutomationPropertyInfo *property,
        PROPERTYID *propertyId);

    HRESULT (STDMETHODCALLTYPE *RegisterEvent)(
        IUIAutomationRegistrar *This,
        const struct UIAutomationEventInfo *event,
        EVENTID *eventId);

    HRESULT (STDMETHODCALLTYPE *RegisterPattern)(
        IUIAutomationRegistrar *This,
        const struct UIAutomationPatternInfo *pattern,
        PATTERNID *pPatternId,
        PROPERTYID *pPatternAvailablePropertyId,
        UINT propertyIdCount,
        PROPERTYID *pPropertyIds,
        UINT eventIdCount,
        EVENTID *pEventIds);

    END_INTERFACE
} IUIAutomationRegistrarVtbl;

interface IUIAutomationRegistrar {
    CONST_VTBL IUIAutomationRegistrarVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationRegistrar_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationRegistrar_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationRegistrar_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationRegistrar methods ***/
#define IUIAutomationRegistrar_RegisterProperty(This,property,propertyId) (This)->lpVtbl->RegisterProperty(This,property,propertyId)
#define IUIAutomationRegistrar_RegisterEvent(This,event,eventId) (This)->lpVtbl->RegisterEvent(This,event,eventId)
#define IUIAutomationRegistrar_RegisterPattern(This,pattern,pPatternId,pPatternAvailablePropertyId,propertyIdCount,pPropertyIds,eventIdCount,pEventIds) (This)->lpVtbl->RegisterPattern(This,pattern,pPatternId,pPatternAvailablePropertyId,propertyIdCount,pPropertyIds,eventIdCount,pEventIds)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationRegistrar_QueryInterface(IUIAutomationRegistrar* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationRegistrar_AddRef(IUIAutomationRegistrar* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationRegistrar_Release(IUIAutomationRegistrar* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationRegistrar methods ***/
static __WIDL_INLINE HRESULT IUIAutomationRegistrar_RegisterProperty(IUIAutomationRegistrar* This,const struct UIAutomationPropertyInfo *property,PROPERTYID *propertyId) {
    return This->lpVtbl->RegisterProperty(This,property,propertyId);
}
static __WIDL_INLINE HRESULT IUIAutomationRegistrar_RegisterEvent(IUIAutomationRegistrar* This,const struct UIAutomationEventInfo *event,EVENTID *eventId) {
    return This->lpVtbl->RegisterEvent(This,event,eventId);
}
static __WIDL_INLINE HRESULT IUIAutomationRegistrar_RegisterPattern(IUIAutomationRegistrar* This,const struct UIAutomationPatternInfo *pattern,PATTERNID *pPatternId,PROPERTYID *pPatternAvailablePropertyId,UINT propertyIdCount,PROPERTYID *pPropertyIds,UINT eventIdCount,EVENTID *pEventIds) {
    return This->lpVtbl->RegisterPattern(This,pattern,pPatternId,pPatternAvailablePropertyId,propertyIdCount,pPropertyIds,eventIdCount,pEventIds);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationRegistrar_INTERFACE_DEFINED__ */

/*****************************************************************************
 * CUIAutomationRegistrar coclass
 */

DEFINE_GUID(CLSID_CUIAutomationRegistrar, 0x6e29fabf, 0x9977, 0x42d1, 0x8d,0x0e, 0xca,0x7e,0x61,0xad,0x87,0xe6);

#ifdef __cplusplus
class DECLSPEC_UUID("6e29fabf-9977-42d1-8d0e-ca7e61ad87e6") CUIAutomationRegistrar;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(CUIAutomationRegistrar, 0x6e29fabf, 0x9977, 0x42d1, 0x8d,0x0e, 0xca,0x7e,0x61,0xad,0x87,0xe6)
#endif
#endif

#endif /* __UIA_LIBRARY_DEFINED__ */
/* Begin additional prototypes for all interfaces */

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 *);
ULONG           __RPC_USER HWND_UserSize     (ULONG *, ULONG, HWND *);
unsigned char * __RPC_USER HWND_UserMarshal  (ULONG *, unsigned char *, HWND *);
unsigned char * __RPC_USER HWND_UserUnmarshal(ULONG *, unsigned char *, HWND *);
void            __RPC_USER HWND_UserFree     (ULONG *, HWND *);
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 *);

/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __uiautomationcore_h__ */
