/*** Autogenerated by WIDL 9.8 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 __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__ */

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