/*** Autogenerated by WIDL 8.13 from include/uiautomationclient.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 __uiautomationclient_h__
#define __uiautomationclient_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 __IUIAutomationCondition_FWD_DEFINED__
#define __IUIAutomationCondition_FWD_DEFINED__
typedef interface IUIAutomationCondition IUIAutomationCondition;
#ifdef __cplusplus
interface IUIAutomationCondition;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationBoolCondition_FWD_DEFINED__
#define __IUIAutomationBoolCondition_FWD_DEFINED__
typedef interface IUIAutomationBoolCondition IUIAutomationBoolCondition;
#ifdef __cplusplus
interface IUIAutomationBoolCondition;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationPropertyCondition_FWD_DEFINED__
#define __IUIAutomationPropertyCondition_FWD_DEFINED__
typedef interface IUIAutomationPropertyCondition IUIAutomationPropertyCondition;
#ifdef __cplusplus
interface IUIAutomationPropertyCondition;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationAndCondition_FWD_DEFINED__
#define __IUIAutomationAndCondition_FWD_DEFINED__
typedef interface IUIAutomationAndCondition IUIAutomationAndCondition;
#ifdef __cplusplus
interface IUIAutomationAndCondition;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationOrCondition_FWD_DEFINED__
#define __IUIAutomationOrCondition_FWD_DEFINED__
typedef interface IUIAutomationOrCondition IUIAutomationOrCondition;
#ifdef __cplusplus
interface IUIAutomationOrCondition;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationNotCondition_FWD_DEFINED__
#define __IUIAutomationNotCondition_FWD_DEFINED__
typedef interface IUIAutomationNotCondition IUIAutomationNotCondition;
#ifdef __cplusplus
interface IUIAutomationNotCondition;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationCacheRequest_FWD_DEFINED__
#define __IUIAutomationCacheRequest_FWD_DEFINED__
typedef interface IUIAutomationCacheRequest IUIAutomationCacheRequest;
#ifdef __cplusplus
interface IUIAutomationCacheRequest;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationTreeWalker_FWD_DEFINED__
#define __IUIAutomationTreeWalker_FWD_DEFINED__
typedef interface IUIAutomationTreeWalker IUIAutomationTreeWalker;
#ifdef __cplusplus
interface IUIAutomationTreeWalker;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationEventHandler_FWD_DEFINED__
#define __IUIAutomationEventHandler_FWD_DEFINED__
typedef interface IUIAutomationEventHandler IUIAutomationEventHandler;
#ifdef __cplusplus
interface IUIAutomationEventHandler;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationPropertyChangedEventHandler_FWD_DEFINED__
#define __IUIAutomationPropertyChangedEventHandler_FWD_DEFINED__
typedef interface IUIAutomationPropertyChangedEventHandler IUIAutomationPropertyChangedEventHandler;
#ifdef __cplusplus
interface IUIAutomationPropertyChangedEventHandler;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationStructureChangedEventHandler_FWD_DEFINED__
#define __IUIAutomationStructureChangedEventHandler_FWD_DEFINED__
typedef interface IUIAutomationStructureChangedEventHandler IUIAutomationStructureChangedEventHandler;
#ifdef __cplusplus
interface IUIAutomationStructureChangedEventHandler;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationFocusChangedEventHandler_FWD_DEFINED__
#define __IUIAutomationFocusChangedEventHandler_FWD_DEFINED__
typedef interface IUIAutomationFocusChangedEventHandler IUIAutomationFocusChangedEventHandler;
#ifdef __cplusplus
interface IUIAutomationFocusChangedEventHandler;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationTextEditTextChangedEventHandler_FWD_DEFINED__
#define __IUIAutomationTextEditTextChangedEventHandler_FWD_DEFINED__
typedef interface IUIAutomationTextEditTextChangedEventHandler IUIAutomationTextEditTextChangedEventHandler;
#ifdef __cplusplus
interface IUIAutomationTextEditTextChangedEventHandler;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationChangesEventHandler_FWD_DEFINED__
#define __IUIAutomationChangesEventHandler_FWD_DEFINED__
typedef interface IUIAutomationChangesEventHandler IUIAutomationChangesEventHandler;
#ifdef __cplusplus
interface IUIAutomationChangesEventHandler;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationNotificationEventHandler_FWD_DEFINED__
#define __IUIAutomationNotificationEventHandler_FWD_DEFINED__
typedef interface IUIAutomationNotificationEventHandler IUIAutomationNotificationEventHandler;
#ifdef __cplusplus
interface IUIAutomationNotificationEventHandler;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationInvokePattern_FWD_DEFINED__
#define __IUIAutomationInvokePattern_FWD_DEFINED__
typedef interface IUIAutomationInvokePattern IUIAutomationInvokePattern;
#ifdef __cplusplus
interface IUIAutomationInvokePattern;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationDockPattern_FWD_DEFINED__
#define __IUIAutomationDockPattern_FWD_DEFINED__
typedef interface IUIAutomationDockPattern IUIAutomationDockPattern;
#ifdef __cplusplus
interface IUIAutomationDockPattern;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationExpandCollapsePattern_FWD_DEFINED__
#define __IUIAutomationExpandCollapsePattern_FWD_DEFINED__
typedef interface IUIAutomationExpandCollapsePattern IUIAutomationExpandCollapsePattern;
#ifdef __cplusplus
interface IUIAutomationExpandCollapsePattern;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationGridPattern_FWD_DEFINED__
#define __IUIAutomationGridPattern_FWD_DEFINED__
typedef interface IUIAutomationGridPattern IUIAutomationGridPattern;
#ifdef __cplusplus
interface IUIAutomationGridPattern;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationGridItemPattern_FWD_DEFINED__
#define __IUIAutomationGridItemPattern_FWD_DEFINED__
typedef interface IUIAutomationGridItemPattern IUIAutomationGridItemPattern;
#ifdef __cplusplus
interface IUIAutomationGridItemPattern;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationMultipleViewPattern_FWD_DEFINED__
#define __IUIAutomationMultipleViewPattern_FWD_DEFINED__
typedef interface IUIAutomationMultipleViewPattern IUIAutomationMultipleViewPattern;
#ifdef __cplusplus
interface IUIAutomationMultipleViewPattern;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationObjectModelPattern_FWD_DEFINED__
#define __IUIAutomationObjectModelPattern_FWD_DEFINED__
typedef interface IUIAutomationObjectModelPattern IUIAutomationObjectModelPattern;
#ifdef __cplusplus
interface IUIAutomationObjectModelPattern;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationRangeValuePattern_FWD_DEFINED__
#define __IUIAutomationRangeValuePattern_FWD_DEFINED__
typedef interface IUIAutomationRangeValuePattern IUIAutomationRangeValuePattern;
#ifdef __cplusplus
interface IUIAutomationRangeValuePattern;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationScrollPattern_FWD_DEFINED__
#define __IUIAutomationScrollPattern_FWD_DEFINED__
typedef interface IUIAutomationScrollPattern IUIAutomationScrollPattern;
#ifdef __cplusplus
interface IUIAutomationScrollPattern;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationScrollItemPattern_FWD_DEFINED__
#define __IUIAutomationScrollItemPattern_FWD_DEFINED__
typedef interface IUIAutomationScrollItemPattern IUIAutomationScrollItemPattern;
#ifdef __cplusplus
interface IUIAutomationScrollItemPattern;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationSelectionPattern_FWD_DEFINED__
#define __IUIAutomationSelectionPattern_FWD_DEFINED__
typedef interface IUIAutomationSelectionPattern IUIAutomationSelectionPattern;
#ifdef __cplusplus
interface IUIAutomationSelectionPattern;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationSelectionItemPattern_FWD_DEFINED__
#define __IUIAutomationSelectionItemPattern_FWD_DEFINED__
typedef interface IUIAutomationSelectionItemPattern IUIAutomationSelectionItemPattern;
#ifdef __cplusplus
interface IUIAutomationSelectionItemPattern;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationSynchronizedInputPattern_FWD_DEFINED__
#define __IUIAutomationSynchronizedInputPattern_FWD_DEFINED__
typedef interface IUIAutomationSynchronizedInputPattern IUIAutomationSynchronizedInputPattern;
#ifdef __cplusplus
interface IUIAutomationSynchronizedInputPattern;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationTablePattern_FWD_DEFINED__
#define __IUIAutomationTablePattern_FWD_DEFINED__
typedef interface IUIAutomationTablePattern IUIAutomationTablePattern;
#ifdef __cplusplus
interface IUIAutomationTablePattern;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationTableItemPattern_FWD_DEFINED__
#define __IUIAutomationTableItemPattern_FWD_DEFINED__
typedef interface IUIAutomationTableItemPattern IUIAutomationTableItemPattern;
#ifdef __cplusplus
interface IUIAutomationTableItemPattern;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationTogglePattern_FWD_DEFINED__
#define __IUIAutomationTogglePattern_FWD_DEFINED__
typedef interface IUIAutomationTogglePattern IUIAutomationTogglePattern;
#ifdef __cplusplus
interface IUIAutomationTogglePattern;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationTransformPattern_FWD_DEFINED__
#define __IUIAutomationTransformPattern_FWD_DEFINED__
typedef interface IUIAutomationTransformPattern IUIAutomationTransformPattern;
#ifdef __cplusplus
interface IUIAutomationTransformPattern;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationValuePattern_FWD_DEFINED__
#define __IUIAutomationValuePattern_FWD_DEFINED__
typedef interface IUIAutomationValuePattern IUIAutomationValuePattern;
#ifdef __cplusplus
interface IUIAutomationValuePattern;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationWindowPattern_FWD_DEFINED__
#define __IUIAutomationWindowPattern_FWD_DEFINED__
typedef interface IUIAutomationWindowPattern IUIAutomationWindowPattern;
#ifdef __cplusplus
interface IUIAutomationWindowPattern;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationTextRange_FWD_DEFINED__
#define __IUIAutomationTextRange_FWD_DEFINED__
typedef interface IUIAutomationTextRange IUIAutomationTextRange;
#ifdef __cplusplus
interface IUIAutomationTextRange;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationTextRange2_FWD_DEFINED__
#define __IUIAutomationTextRange2_FWD_DEFINED__
typedef interface IUIAutomationTextRange2 IUIAutomationTextRange2;
#ifdef __cplusplus
interface IUIAutomationTextRange2;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationTextRangeArray_FWD_DEFINED__
#define __IUIAutomationTextRangeArray_FWD_DEFINED__
typedef interface IUIAutomationTextRangeArray IUIAutomationTextRangeArray;
#ifdef __cplusplus
interface IUIAutomationTextRangeArray;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationTextPattern_FWD_DEFINED__
#define __IUIAutomationTextPattern_FWD_DEFINED__
typedef interface IUIAutomationTextPattern IUIAutomationTextPattern;
#ifdef __cplusplus
interface IUIAutomationTextPattern;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationTextPattern2_FWD_DEFINED__
#define __IUIAutomationTextPattern2_FWD_DEFINED__
typedef interface IUIAutomationTextPattern2 IUIAutomationTextPattern2;
#ifdef __cplusplus
interface IUIAutomationTextPattern2;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationTextEditPattern_FWD_DEFINED__
#define __IUIAutomationTextEditPattern_FWD_DEFINED__
typedef interface IUIAutomationTextEditPattern IUIAutomationTextEditPattern;
#ifdef __cplusplus
interface IUIAutomationTextEditPattern;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationCustomNavigationPattern_FWD_DEFINED__
#define __IUIAutomationCustomNavigationPattern_FWD_DEFINED__
typedef interface IUIAutomationCustomNavigationPattern IUIAutomationCustomNavigationPattern;
#ifdef __cplusplus
interface IUIAutomationCustomNavigationPattern;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationActiveTextPositionChangedEventHandler_FWD_DEFINED__
#define __IUIAutomationActiveTextPositionChangedEventHandler_FWD_DEFINED__
typedef interface IUIAutomationActiveTextPositionChangedEventHandler IUIAutomationActiveTextPositionChangedEventHandler;
#ifdef __cplusplus
interface IUIAutomationActiveTextPositionChangedEventHandler;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationLegacyIAccessiblePattern_FWD_DEFINED__
#define __IUIAutomationLegacyIAccessiblePattern_FWD_DEFINED__
typedef interface IUIAutomationLegacyIAccessiblePattern IUIAutomationLegacyIAccessiblePattern;
#ifdef __cplusplus
interface IUIAutomationLegacyIAccessiblePattern;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationItemContainerPattern_FWD_DEFINED__
#define __IUIAutomationItemContainerPattern_FWD_DEFINED__
typedef interface IUIAutomationItemContainerPattern IUIAutomationItemContainerPattern;
#ifdef __cplusplus
interface IUIAutomationItemContainerPattern;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationVirtualizedItemPattern_FWD_DEFINED__
#define __IUIAutomationVirtualizedItemPattern_FWD_DEFINED__
typedef interface IUIAutomationVirtualizedItemPattern IUIAutomationVirtualizedItemPattern;
#ifdef __cplusplus
interface IUIAutomationVirtualizedItemPattern;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationAnnotationPattern_FWD_DEFINED__
#define __IUIAutomationAnnotationPattern_FWD_DEFINED__
typedef interface IUIAutomationAnnotationPattern IUIAutomationAnnotationPattern;
#ifdef __cplusplus
interface IUIAutomationAnnotationPattern;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationStylesPattern_FWD_DEFINED__
#define __IUIAutomationStylesPattern_FWD_DEFINED__
typedef interface IUIAutomationStylesPattern IUIAutomationStylesPattern;
#ifdef __cplusplus
interface IUIAutomationStylesPattern;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationSpreadsheetPattern_FWD_DEFINED__
#define __IUIAutomationSpreadsheetPattern_FWD_DEFINED__
typedef interface IUIAutomationSpreadsheetPattern IUIAutomationSpreadsheetPattern;
#ifdef __cplusplus
interface IUIAutomationSpreadsheetPattern;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationSpreadsheetItemPattern_FWD_DEFINED__
#define __IUIAutomationSpreadsheetItemPattern_FWD_DEFINED__
typedef interface IUIAutomationSpreadsheetItemPattern IUIAutomationSpreadsheetItemPattern;
#ifdef __cplusplus
interface IUIAutomationSpreadsheetItemPattern;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationTransformPattern2_FWD_DEFINED__
#define __IUIAutomationTransformPattern2_FWD_DEFINED__
typedef interface IUIAutomationTransformPattern2 IUIAutomationTransformPattern2;
#ifdef __cplusplus
interface IUIAutomationTransformPattern2;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationTextChildPattern_FWD_DEFINED__
#define __IUIAutomationTextChildPattern_FWD_DEFINED__
typedef interface IUIAutomationTextChildPattern IUIAutomationTextChildPattern;
#ifdef __cplusplus
interface IUIAutomationTextChildPattern;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationDragPattern_FWD_DEFINED__
#define __IUIAutomationDragPattern_FWD_DEFINED__
typedef interface IUIAutomationDragPattern IUIAutomationDragPattern;
#ifdef __cplusplus
interface IUIAutomationDragPattern;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationDropTargetPattern_FWD_DEFINED__
#define __IUIAutomationDropTargetPattern_FWD_DEFINED__
typedef interface IUIAutomationDropTargetPattern IUIAutomationDropTargetPattern;
#ifdef __cplusplus
interface IUIAutomationDropTargetPattern;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationElement_FWD_DEFINED__
#define __IUIAutomationElement_FWD_DEFINED__
typedef interface IUIAutomationElement IUIAutomationElement;
#ifdef __cplusplus
interface IUIAutomationElement;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationElement2_FWD_DEFINED__
#define __IUIAutomationElement2_FWD_DEFINED__
typedef interface IUIAutomationElement2 IUIAutomationElement2;
#ifdef __cplusplus
interface IUIAutomationElement2;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationElement3_FWD_DEFINED__
#define __IUIAutomationElement3_FWD_DEFINED__
typedef interface IUIAutomationElement3 IUIAutomationElement3;
#ifdef __cplusplus
interface IUIAutomationElement3;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationElement4_FWD_DEFINED__
#define __IUIAutomationElement4_FWD_DEFINED__
typedef interface IUIAutomationElement4 IUIAutomationElement4;
#ifdef __cplusplus
interface IUIAutomationElement4;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationElement5_FWD_DEFINED__
#define __IUIAutomationElement5_FWD_DEFINED__
typedef interface IUIAutomationElement5 IUIAutomationElement5;
#ifdef __cplusplus
interface IUIAutomationElement5;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationElement6_FWD_DEFINED__
#define __IUIAutomationElement6_FWD_DEFINED__
typedef interface IUIAutomationElement6 IUIAutomationElement6;
#ifdef __cplusplus
interface IUIAutomationElement6;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationElement7_FWD_DEFINED__
#define __IUIAutomationElement7_FWD_DEFINED__
typedef interface IUIAutomationElement7 IUIAutomationElement7;
#ifdef __cplusplus
interface IUIAutomationElement7;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationElement8_FWD_DEFINED__
#define __IUIAutomationElement8_FWD_DEFINED__
typedef interface IUIAutomationElement8 IUIAutomationElement8;
#ifdef __cplusplus
interface IUIAutomationElement8;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationElement9_FWD_DEFINED__
#define __IUIAutomationElement9_FWD_DEFINED__
typedef interface IUIAutomationElement9 IUIAutomationElement9;
#ifdef __cplusplus
interface IUIAutomationElement9;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationElementArray_FWD_DEFINED__
#define __IUIAutomationElementArray_FWD_DEFINED__
typedef interface IUIAutomationElementArray IUIAutomationElementArray;
#ifdef __cplusplus
interface IUIAutomationElementArray;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationProxyFactory_FWD_DEFINED__
#define __IUIAutomationProxyFactory_FWD_DEFINED__
typedef interface IUIAutomationProxyFactory IUIAutomationProxyFactory;
#ifdef __cplusplus
interface IUIAutomationProxyFactory;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationProxyFactoryEntry_FWD_DEFINED__
#define __IUIAutomationProxyFactoryEntry_FWD_DEFINED__
typedef interface IUIAutomationProxyFactoryEntry IUIAutomationProxyFactoryEntry;
#ifdef __cplusplus
interface IUIAutomationProxyFactoryEntry;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationProxyFactoryMapping_FWD_DEFINED__
#define __IUIAutomationProxyFactoryMapping_FWD_DEFINED__
typedef interface IUIAutomationProxyFactoryMapping IUIAutomationProxyFactoryMapping;
#ifdef __cplusplus
interface IUIAutomationProxyFactoryMapping;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationEventHandlerGroup_FWD_DEFINED__
#define __IUIAutomationEventHandlerGroup_FWD_DEFINED__
typedef interface IUIAutomationEventHandlerGroup IUIAutomationEventHandlerGroup;
#ifdef __cplusplus
interface IUIAutomationEventHandlerGroup;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomation_FWD_DEFINED__
#define __IUIAutomation_FWD_DEFINED__
typedef interface IUIAutomation IUIAutomation;
#ifdef __cplusplus
interface IUIAutomation;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomation2_FWD_DEFINED__
#define __IUIAutomation2_FWD_DEFINED__
typedef interface IUIAutomation2 IUIAutomation2;
#ifdef __cplusplus
interface IUIAutomation2;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomation3_FWD_DEFINED__
#define __IUIAutomation3_FWD_DEFINED__
typedef interface IUIAutomation3 IUIAutomation3;
#ifdef __cplusplus
interface IUIAutomation3;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomation4_FWD_DEFINED__
#define __IUIAutomation4_FWD_DEFINED__
typedef interface IUIAutomation4 IUIAutomation4;
#ifdef __cplusplus
interface IUIAutomation4;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomation5_FWD_DEFINED__
#define __IUIAutomation5_FWD_DEFINED__
typedef interface IUIAutomation5 IUIAutomation5;
#ifdef __cplusplus
interface IUIAutomation5;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomation6_FWD_DEFINED__
#define __IUIAutomation6_FWD_DEFINED__
typedef interface IUIAutomation6 IUIAutomation6;
#ifdef __cplusplus
interface IUIAutomation6;
#endif /* __cplusplus */
#endif

#ifndef __CUIAutomation_FWD_DEFINED__
#define __CUIAutomation_FWD_DEFINED__
#ifdef __cplusplus
typedef class CUIAutomation CUIAutomation;
#else
typedef struct CUIAutomation CUIAutomation;
#endif /* defined __cplusplus */
#endif /* defined __CUIAutomation_FWD_DEFINED__ */

#ifndef __CUIAutomation8_FWD_DEFINED__
#define __CUIAutomation8_FWD_DEFINED__
#ifdef __cplusplus
typedef class CUIAutomation8 CUIAutomation8;
#else
typedef struct CUIAutomation8 CUIAutomation8;
#endif /* defined __cplusplus */
#endif /* defined __CUIAutomation8_FWD_DEFINED__ */

/* Headers for imported files */

#include <uiautomationcore.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef _INC_UIAUTOMATIONCOREAPI
enum TreeScope {
    TreeScope_Element = 0x1,
    TreeScope_Children = 0x2,
    TreeScope_Descendants = 0x4,
    TreeScope_Parent = 0x8,
    TreeScope_Ancestors = 0x10,
    TreeScope_SubTree = (TreeScope_Element | TreeScope_Children) | TreeScope_Descendants
};
enum PropertyConditionFlags {
    PropertyConditionFlags_None = 0x0,
    PropertyConditionFlags_IgnoreCase = 0x1
};
enum AutomationElementMode {
    AutomationElementMode_None = 0x0,
    AutomationElementMode_Full = 0x1
};
enum TreeTraversalOptions {
    TreeTraversalOptions_Default = 0x0,
    TreeTraversalOptions_PostOrder = 0x1,
    TreeTraversalOptions_LastToFirstOrder = 0x2
};
enum ConnectionRecoveryBehaviorOptions {
    ConnectionRecoveryBehaviorOptions_Disabled = 0x0,
    ConnectionRecoveryBehaviorOptions_Enabled = 0x1
};
enum CoalesceEventsOptions {
    CoalesceEventsOptions_Disabled = 0x0,
    CoalesceEventsOptions_Enabled = 0x1
};
#endif
struct ExtendedProperty {
    BSTR PropertyName;
    BSTR PropertyValue;
};
typedef void *UIA_HWND;
#ifndef __UIAutomationClient_LIBRARY_DEFINED__
#define __UIAutomationClient_LIBRARY_DEFINED__

DEFINE_GUID(LIBID_UIAutomationClient, 0x944de083, 0x8fb8, 0x45cf, 0xbc,0xb7, 0xc4,0x77,0xac,0xb2,0xf8,0x97);

#define UIA_InvokePatternId (10000)

#define UIA_SelectionPatternId (10001)

#define UIA_ValuePatternId (10002)

#define UIA_RangeValuePatternId (10003)

#define UIA_ScrollPatternId (10004)

#define UIA_ExpandCollapsePatternId (10005)

#define UIA_GridPatternId (10006)

#define UIA_GridItemPatternId (10007)

#define UIA_MultipleViewPatternId (10008)

#define UIA_WindowPatternId (10009)

#define UIA_SelectionItemPatternId (10010)

#define UIA_DockPatternId (10011)

#define UIA_TablePatternId (10012)

#define UIA_TableItemPatternId (10013)

#define UIA_TextPatternId (10014)

#define UIA_TogglePatternId (10015)

#define UIA_TransformPatternId (10016)

#define UIA_ScrollItemPatternId (10017)

#define UIA_LegacyIAccessiblePatternId (10018)

#define UIA_ItemContainerPatternId (10019)

#define UIA_VirtualizedItemPatternId (10020)

#define UIA_SynchronizedInputPatternId (10021)

#define UIA_ObjectModelPatternId (10022)

#define UIA_AnnotationPatternId (10023)

#define UIA_TextPattern2Id (10024)

#define UIA_StylesPatternId (10025)

#define UIA_SpreadsheetPatternId (10026)

#define UIA_SpreadsheetItemPatternId (10027)

#define UIA_TransformPattern2Id (10028)

#define UIA_TextChildPatternId (10029)

#define UIA_DragPatternId (10030)

#define UIA_DropTargetPatternId (10031)

#define UIA_TextEditPatternId (10032)

#define UIA_CustomNavigationPatternId (10033)

#define UIA_ToolTipOpenedEventId (20000)

#define UIA_ToolTipClosedEventId (20001)

#define UIA_StructureChangedEventId (20002)

#define UIA_MenuOpenedEventId (20003)

#define UIA_AutomationPropertyChangedEventId (20004)

#define UIA_AutomationFocusChangedEventId (20005)

#define UIA_AsyncContentLoadedEventId (20006)

#define UIA_MenuClosedEventId (20007)

#define UIA_LayoutInvalidatedEventId (20008)

#define UIA_Invoke_InvokedEventId (20009)

#define UIA_SelectionItem_ElementAddedToSelectionEventId (20010)

#define UIA_SelectionItem_ElementRemovedFromSelectionEventId (20011)

#define UIA_SelectionItem_ElementSelectedEventId (20012)

#define UIA_Selection_InvalidatedEventId (20013)

#define UIA_Text_TextSelectionChangedEventId (20014)

#define UIA_Text_TextChangedEventId (20015)

#define UIA_Window_WindowOpenedEventId (20016)

#define UIA_Window_WindowClosedEventId (20017)

#define UIA_MenuModeStartEventId (20018)

#define UIA_MenuModeEndEventId (20019)

#define UIA_InputReachedTargetEventId (20020)

#define UIA_InputReachedOtherElementEventId (20021)

#define UIA_InputDiscardedEventId (20022)

#define UIA_SystemAlertEventId (20023)

#define UIA_LiveRegionChangedEventId (20024)

#define UIA_HostedFragmentRootsInvalidatedEventId (20025)

#define UIA_Drag_DragStartEventId (20026)

#define UIA_Drag_DragCancelEventId (20027)

#define UIA_Drag_DragCompleteEventId (20028)

#define UIA_DropTarget_DragEnterEventId (20029)

#define UIA_DropTarget_DragLeaveEventId (20030)

#define UIA_DropTarget_DroppedEventId (20031)

#define UIA_TextEdit_TextChangedEventId (20032)

#define UIA_TextEdit_ConversionTargetChangedEventId (20033)

#define UIA_ChangesEventId (20034)

#define UIA_NotificationEventId (20035)

#define UIA_RuntimeIdPropertyId (30000)

#define UIA_BoundingRectanglePropertyId (30001)

#define UIA_ProcessIdPropertyId (30002)

#define UIA_ControlTypePropertyId (30003)

#define UIA_LocalizedControlTypePropertyId (30004)

#define UIA_NamePropertyId (30005)

#define UIA_AcceleratorKeyPropertyId (30006)

#define UIA_AccessKeyPropertyId (30007)

#define UIA_HasKeyboardFocusPropertyId (30008)

#define UIA_IsKeyboardFocusablePropertyId (30009)

#define UIA_IsEnabledPropertyId (30010)

#define UIA_AutomationIdPropertyId (30011)

#define UIA_ClassNamePropertyId (30012)

#define UIA_HelpTextPropertyId (30013)

#define UIA_ClickablePointPropertyId (30014)

#define UIA_CulturePropertyId (30015)

#define UIA_IsControlElementPropertyId (30016)

#define UIA_IsContentElementPropertyId (30017)

#define UIA_LabeledByPropertyId (30018)

#define UIA_IsPasswordPropertyId (30019)

#define UIA_NativeWindowHandlePropertyId (30020)

#define UIA_ItemTypePropertyId (30021)

#define UIA_IsOffscreenPropertyId (30022)

#define UIA_OrientationPropertyId (30023)

#define UIA_FrameworkIdPropertyId (30024)

#define UIA_IsRequiredForFormPropertyId (30025)

#define UIA_ItemStatusPropertyId (30026)

#define UIA_IsDockPatternAvailablePropertyId (30027)

#define UIA_IsExpandCollapsePatternAvailablePropertyId (30028)

#define UIA_IsGridItemPatternAvailablePropertyId (30029)

#define UIA_IsGridPatternAvailablePropertyId (30030)

#define UIA_IsInvokePatternAvailablePropertyId (30031)

#define UIA_IsMultipleViewPatternAvailablePropertyId (30032)

#define UIA_IsRangeValuePatternAvailablePropertyId (30033)

#define UIA_IsScrollPatternAvailablePropertyId (30034)

#define UIA_IsScrollItemPatternAvailablePropertyId (30035)

#define UIA_IsSelectionItemPatternAvailablePropertyId (30036)

#define UIA_IsSelectionPatternAvailablePropertyId (30037)

#define UIA_IsTablePatternAvailablePropertyId (30038)

#define UIA_IsTableItemPatternAvailablePropertyId (30039)

#define UIA_IsTextPatternAvailablePropertyId (30040)

#define UIA_IsTogglePatternAvailablePropertyId (30041)

#define UIA_IsTransformPatternAvailablePropertyId (30042)

#define UIA_IsValuePatternAvailablePropertyId (30043)

#define UIA_IsWindowPatternAvailablePropertyId (30044)

#define UIA_ValueValuePropertyId (30045)

#define UIA_ValueIsReadOnlyPropertyId (30046)

#define UIA_RangeValueValuePropertyId (30047)

#define UIA_RangeValueIsReadOnlyPropertyId (30048)

#define UIA_RangeValueMinimumPropertyId (30049)

#define UIA_RangeValueMaximumPropertyId (30050)

#define UIA_RangeValueLargeChangePropertyId (30051)

#define UIA_RangeValueSmallChangePropertyId (30052)

#define UIA_ScrollHorizontalScrollPercentPropertyId (30053)

#define UIA_ScrollHorizontalViewSizePropertyId (30054)

#define UIA_ScrollVerticalScrollPercentPropertyId (30055)

#define UIA_ScrollVerticalViewSizePropertyId (30056)

#define UIA_ScrollHorizontallyScrollablePropertyId (30057)

#define UIA_ScrollVerticallyScrollablePropertyId (30058)

#define UIA_SelectionSelectionPropertyId (30059)

#define UIA_SelectionCanSelectMultiplePropertyId (30060)

#define UIA_SelectionIsSelectionRequiredPropertyId (30061)

#define UIA_GridRowCountPropertyId (30062)

#define UIA_GridColumnCountPropertyId (30063)

#define UIA_GridItemRowPropertyId (30064)

#define UIA_GridItemColumnPropertyId (30065)

#define UIA_GridItemRowSpanPropertyId (30066)

#define UIA_GridItemColumnSpanPropertyId (30067)

#define UIA_GridItemContainingGridPropertyId (30068)

#define UIA_DockDockPositionPropertyId (30069)

#define UIA_ExpandCollapseExpandCollapseStatePropertyId (30070)

#define UIA_MultipleViewCurrentViewPropertyId (30071)

#define UIA_MultipleViewSupportedViewsPropertyId (30072)

#define UIA_WindowCanMaximizePropertyId (30073)

#define UIA_WindowCanMinimizePropertyId (30074)

#define UIA_WindowWindowVisualStatePropertyId (30075)

#define UIA_WindowWindowInteractionStatePropertyId (30076)

#define UIA_WindowIsModalPropertyId (30077)

#define UIA_WindowIsTopmostPropertyId (30078)

#define UIA_SelectionItemIsSelectedPropertyId (30079)

#define UIA_SelectionItemSelectionContainerPropertyId (30080)

#define UIA_TableRowHeadersPropertyId (30081)

#define UIA_TableColumnHeadersPropertyId (30082)

#define UIA_TableRowOrColumnMajorPropertyId (30083)

#define UIA_TableItemRowHeaderItemsPropertyId (30084)

#define UIA_TableItemColumnHeaderItemsPropertyId (30085)

#define UIA_ToggleToggleStatePropertyId (30086)

#define UIA_TransformCanMovePropertyId (30087)

#define UIA_TransformCanResizePropertyId (30088)

#define UIA_TransformCanRotatePropertyId (30089)

#define UIA_IsLegacyIAccessiblePatternAvailablePropertyId (30090)

#define UIA_LegacyIAccessibleChildIdPropertyId (30091)

#define UIA_LegacyIAccessibleNamePropertyId (30092)

#define UIA_LegacyIAccessibleValuePropertyId (30093)

#define UIA_LegacyIAccessibleDescriptionPropertyId (30094)

#define UIA_LegacyIAccessibleRolePropertyId (30095)

#define UIA_LegacyIAccessibleStatePropertyId (30096)

#define UIA_LegacyIAccessibleHelpPropertyId (30097)

#define UIA_LegacyIAccessibleKeyboardShortcutPropertyId (30098)

#define UIA_LegacyIAccessibleSelectionPropertyId (30099)

#define UIA_LegacyIAccessibleDefaultActionPropertyId (30100)

#define UIA_AriaRolePropertyId (30101)

#define UIA_AriaPropertiesPropertyId (30102)

#define UIA_IsDataValidForFormPropertyId (30103)

#define UIA_ControllerForPropertyId (30104)

#define UIA_DescribedByPropertyId (30105)

#define UIA_FlowsToPropertyId (30106)

#define UIA_ProviderDescriptionPropertyId (30107)

#define UIA_IsItemContainerPatternAvailablePropertyId (30108)

#define UIA_IsVirtualizedItemPatternAvailablePropertyId (30109)

#define UIA_IsSynchronizedInputPatternAvailablePropertyId (30110)

#define UIA_OptimizeForVisualContentPropertyId (30111)

#define UIA_IsObjectModelPatternAvailablePropertyId (30112)

#define UIA_AnnotationAnnotationTypeIdPropertyId (30113)

#define UIA_AnnotationAnnotationTypeNamePropertyId (30114)

#define UIA_AnnotationAuthorPropertyId (30115)

#define UIA_AnnotationDateTimePropertyId (30116)

#define UIA_AnnotationTargetPropertyId (30117)

#define UIA_IsAnnotationPatternAvailablePropertyId (30118)

#define UIA_IsTextPattern2AvailablePropertyId (30119)

#define UIA_StylesStyleIdPropertyId (30120)

#define UIA_StylesStyleNamePropertyId (30121)

#define UIA_StylesFillColorPropertyId (30122)

#define UIA_StylesFillPatternStylePropertyId (30123)

#define UIA_StylesShapePropertyId (30124)

#define UIA_StylesFillPatternColorPropertyId (30125)

#define UIA_StylesExtendedPropertiesPropertyId (30126)

#define UIA_IsStylesPatternAvailablePropertyId (30127)

#define UIA_IsSpreadsheetPatternAvailablePropertyId (30128)

#define UIA_SpreadsheetItemFormulaPropertyId (30129)

#define UIA_SpreadsheetItemAnnotationObjectsPropertyId (30130)

#define UIA_SpreadsheetItemAnnotationTypesPropertyId (30131)

#define UIA_IsSpreadsheetItemPatternAvailablePropertyId (30132)

#define UIA_Transform2CanZoomPropertyId (30133)

#define UIA_IsTransformPattern2AvailablePropertyId (30134)

#define UIA_LiveSettingPropertyId (30135)

#define UIA_IsTextChildPatternAvailablePropertyId (30136)

#define UIA_IsDragPatternAvailablePropertyId (30137)

#define UIA_DragIsGrabbedPropertyId (30138)

#define UIA_DragDropEffectPropertyId (30139)

#define UIA_DragDropEffectsPropertyId (30140)

#define UIA_IsDropTargetPatternAvailablePropertyId (30141)

#define UIA_DropTargetDropTargetEffectPropertyId (30142)

#define UIA_DropTargetDropTargetEffectsPropertyId (30143)

#define UIA_DragGrabbedItemsPropertyId (30144)

#define UIA_Transform2ZoomLevelPropertyId (30145)

#define UIA_Transform2ZoomMinimumPropertyId (30146)

#define UIA_Transform2ZoomMaximumPropertyId (30147)

#define UIA_FlowsFromPropertyId (30148)

#define UIA_IsTextEditPatternAvailablePropertyId (30149)

#define UIA_IsPeripheralPropertyId (30150)

#define UIA_IsCustomNavigationPatternAvailablePropertyId (30151)

#define UIA_PositionInSetPropertyId (30152)

#define UIA_SizeOfSetPropertyId (30153)

#define UIA_LevelPropertyId (30154)

#define UIA_AnnotationTypesPropertyId (30155)

#define UIA_AnnotationObjectsPropertyId (30156)

#define UIA_LandmarkTypePropertyId (30157)

#define UIA_LocalizedLandmarkTypePropertyId (30158)

#define UIA_FullDescriptionPropertyId (30159)

#define UIA_FillColorPropertyId (30160)

#define UIA_OutlineColorPropertyId (30161)

#define UIA_FillTypePropertyId (30162)

#define UIA_VisualEffectsPropertyId (30163)

#define UIA_OutlineThicknessPropertyId (30164)

#define UIA_CenterPointPropertyId (30165)

#define UIA_RotationPropertyId (30166)

#define UIA_SizePropertyId (30167)

#define UIA_IsSelectionPattern2AvailablePropertyId (30168)

#define UIA_Selection2FirstSelectedItemPropertyId (30169)

#define UIA_Selection2LastSelectedItemPropertyId (30170)

#define UIA_Selection2CurrentSelectedItemPropertyId (30171)

#define UIA_Selection2ItemCountPropertyId (30172)

#define UIA_HeadingLevelPropertyId (30173)

#define UIA_IsDialogPropertyId (30174)

#define UIA_ButtonControlTypeId (50000)

#define UIA_CalendarControlTypeId (50001)

#define UIA_CheckBoxControlTypeId (50002)

#define UIA_ComboBoxControlTypeId (50003)

#define UIA_EditControlTypeId (50004)

#define UIA_HyperlinkControlTypeId (50005)

#define UIA_ImageControlTypeId (50006)

#define UIA_ListItemControlTypeId (50007)

#define UIA_ListControlTypeId (50008)

#define UIA_MenuControlTypeId (50009)

#define UIA_MenuBarControlTypeId (50010)

#define UIA_MenuItemControlTypeId (50011)

#define UIA_ProgressBarControlTypeId (50012)

#define UIA_RadioButtonControlTypeId (50013)

#define UIA_ScrollBarControlTypeId (50014)

#define UIA_SliderControlTypeId (50015)

#define UIA_SpinnerControlTypeId (50016)

#define UIA_StatusBarControlTypeId (50017)

#define UIA_TabControlTypeId (50018)

#define UIA_TabItemControlTypeId (50019)

#define UIA_TextControlTypeId (50020)

#define UIA_ToolBarControlTypeId (50021)

#define UIA_ToolTipControlTypeId (50022)

#define UIA_TreeControlTypeId (50023)

#define UIA_TreeItemControlTypeId (50024)

#define UIA_CustomControlTypeId (50025)

#define UIA_GroupControlTypeId (50026)

#define UIA_ThumbControlTypeId (50027)

#define UIA_DataGridControlTypeId (50028)

#define UIA_DataItemControlTypeId (50029)

#define UIA_DocumentControlTypeId (50030)

#define UIA_SplitButtonControlTypeId (50031)

#define UIA_WindowControlTypeId (50032)

#define UIA_PaneControlTypeId (50033)

#define UIA_HeaderControlTypeId (50034)

#define UIA_HeaderItemControlTypeId (50035)

#define UIA_TableControlTypeId (50036)

#define UIA_TitleBarControlTypeId (50037)

#define UIA_SeparatorControlTypeId (50038)

#define UIA_SemanticZoomControlTypeId (50039)

#define UIA_AppBarControlTypeId (50040)

#ifndef __IUIAutomationElement_FWD_DEFINED__
#define __IUIAutomationElement_FWD_DEFINED__
typedef interface IUIAutomationElement IUIAutomationElement;
#ifdef __cplusplus
interface IUIAutomationElement;
#endif /* __cplusplus */
#endif

#ifndef __IUIAutomationElementArray_FWD_DEFINED__
#define __IUIAutomationElementArray_FWD_DEFINED__
typedef interface IUIAutomationElementArray IUIAutomationElementArray;
#ifdef __cplusplus
interface IUIAutomationElementArray;
#endif /* __cplusplus */
#endif

/*****************************************************************************
 * IUIAutomationCondition interface
 */
#ifndef __IUIAutomationCondition_INTERFACE_DEFINED__
#define __IUIAutomationCondition_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationCondition, 0x352ffba8, 0x0973, 0x437c, 0xa6,0x1f, 0xf6,0x4c,0xaf,0xd8,0x1d,0xf9);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("352ffba8-0973-437c-a61f-f64cafd81df9")
IUIAutomationCondition : public IUnknown
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationCondition, 0x352ffba8, 0x0973, 0x437c, 0xa6,0x1f, 0xf6,0x4c,0xaf,0xd8,0x1d,0xf9)
#endif
#else
typedef struct IUIAutomationConditionVtbl {
    BEGIN_INTERFACE

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

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

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

    END_INTERFACE
} IUIAutomationConditionVtbl;

interface IUIAutomationCondition {
    CONST_VTBL IUIAutomationConditionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationCondition_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationCondition_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationCondition_Release(This) (This)->lpVtbl->Release(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationCondition_QueryInterface(IUIAutomationCondition* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationCondition_AddRef(IUIAutomationCondition* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationCondition_Release(IUIAutomationCondition* This) {
    return This->lpVtbl->Release(This);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationCondition_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationBoolCondition interface
 */
#ifndef __IUIAutomationBoolCondition_INTERFACE_DEFINED__
#define __IUIAutomationBoolCondition_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationBoolCondition, 0x1b4e1f2e, 0x75eb, 0x4d0b, 0x89,0x52, 0x5a,0x69,0x98,0x8e,0x23,0x07);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("1b4e1f2e-75eb-4d0b-8952-5a69988e2307")
IUIAutomationBoolCondition : public IUIAutomationCondition
{
    virtual HRESULT STDMETHODCALLTYPE get_BooleanValue(
        WINBOOL *boolVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationBoolCondition, 0x1b4e1f2e, 0x75eb, 0x4d0b, 0x89,0x52, 0x5a,0x69,0x98,0x8e,0x23,0x07)
#endif
#else
typedef struct IUIAutomationBoolConditionVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomationBoolCondition methods ***/
    HRESULT (STDMETHODCALLTYPE *get_BooleanValue)(
        IUIAutomationBoolCondition *This,
        WINBOOL *boolVal);

    END_INTERFACE
} IUIAutomationBoolConditionVtbl;

interface IUIAutomationBoolCondition {
    CONST_VTBL IUIAutomationBoolConditionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationBoolCondition_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationBoolCondition_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationBoolCondition_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationBoolCondition methods ***/
#define IUIAutomationBoolCondition_get_BooleanValue(This,boolVal) (This)->lpVtbl->get_BooleanValue(This,boolVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationBoolCondition_QueryInterface(IUIAutomationBoolCondition* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationBoolCondition_AddRef(IUIAutomationBoolCondition* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationBoolCondition_Release(IUIAutomationBoolCondition* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationBoolCondition methods ***/
static __WIDL_INLINE HRESULT IUIAutomationBoolCondition_get_BooleanValue(IUIAutomationBoolCondition* This,WINBOOL *boolVal) {
    return This->lpVtbl->get_BooleanValue(This,boolVal);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationBoolCondition_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationPropertyCondition interface
 */
#ifndef __IUIAutomationPropertyCondition_INTERFACE_DEFINED__
#define __IUIAutomationPropertyCondition_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationPropertyCondition, 0x99ebf2cb, 0x5578, 0x4267, 0x9a,0xd4, 0xaf,0xd6,0xea,0x77,0xe9,0x4b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("99ebf2cb-5578-4267-9ad4-afd6ea77e94b")
IUIAutomationPropertyCondition : public IUIAutomationCondition
{
    virtual HRESULT STDMETHODCALLTYPE get_PropertyId(
        PROPERTYID *propertyId) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_PropertyValue(
        VARIANT *propertyValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_PropertyConditionFlags(
        enum PropertyConditionFlags *flags) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationPropertyCondition, 0x99ebf2cb, 0x5578, 0x4267, 0x9a,0xd4, 0xaf,0xd6,0xea,0x77,0xe9,0x4b)
#endif
#else
typedef struct IUIAutomationPropertyConditionVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomationPropertyCondition methods ***/
    HRESULT (STDMETHODCALLTYPE *get_PropertyId)(
        IUIAutomationPropertyCondition *This,
        PROPERTYID *propertyId);

    HRESULT (STDMETHODCALLTYPE *get_PropertyValue)(
        IUIAutomationPropertyCondition *This,
        VARIANT *propertyValue);

    HRESULT (STDMETHODCALLTYPE *get_PropertyConditionFlags)(
        IUIAutomationPropertyCondition *This,
        enum PropertyConditionFlags *flags);

    END_INTERFACE
} IUIAutomationPropertyConditionVtbl;

interface IUIAutomationPropertyCondition {
    CONST_VTBL IUIAutomationPropertyConditionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationPropertyCondition_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationPropertyCondition_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationPropertyCondition_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationPropertyCondition methods ***/
#define IUIAutomationPropertyCondition_get_PropertyId(This,propertyId) (This)->lpVtbl->get_PropertyId(This,propertyId)
#define IUIAutomationPropertyCondition_get_PropertyValue(This,propertyValue) (This)->lpVtbl->get_PropertyValue(This,propertyValue)
#define IUIAutomationPropertyCondition_get_PropertyConditionFlags(This,flags) (This)->lpVtbl->get_PropertyConditionFlags(This,flags)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationPropertyCondition_QueryInterface(IUIAutomationPropertyCondition* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationPropertyCondition_AddRef(IUIAutomationPropertyCondition* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationPropertyCondition_Release(IUIAutomationPropertyCondition* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationPropertyCondition methods ***/
static __WIDL_INLINE HRESULT IUIAutomationPropertyCondition_get_PropertyId(IUIAutomationPropertyCondition* This,PROPERTYID *propertyId) {
    return This->lpVtbl->get_PropertyId(This,propertyId);
}
static __WIDL_INLINE HRESULT IUIAutomationPropertyCondition_get_PropertyValue(IUIAutomationPropertyCondition* This,VARIANT *propertyValue) {
    return This->lpVtbl->get_PropertyValue(This,propertyValue);
}
static __WIDL_INLINE HRESULT IUIAutomationPropertyCondition_get_PropertyConditionFlags(IUIAutomationPropertyCondition* This,enum PropertyConditionFlags *flags) {
    return This->lpVtbl->get_PropertyConditionFlags(This,flags);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationPropertyCondition_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationAndCondition interface
 */
#ifndef __IUIAutomationAndCondition_INTERFACE_DEFINED__
#define __IUIAutomationAndCondition_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationAndCondition, 0xa7d0af36, 0xb912, 0x45fe, 0x98,0x55, 0x09,0x1d,0xdc,0x17,0x4a,0xec);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a7d0af36-b912-45fe-9855-091ddc174aec")
IUIAutomationAndCondition : public IUIAutomationCondition
{
    virtual HRESULT STDMETHODCALLTYPE get_ChildCount(
        int *childCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetChildrenAsNativeArray(
        IUIAutomationCondition ***childArray,
        int *childArrayCount) = 0;

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

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationAndCondition, 0xa7d0af36, 0xb912, 0x45fe, 0x98,0x55, 0x09,0x1d,0xdc,0x17,0x4a,0xec)
#endif
#else
typedef struct IUIAutomationAndConditionVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomationAndCondition methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ChildCount)(
        IUIAutomationAndCondition *This,
        int *childCount);

    HRESULT (STDMETHODCALLTYPE *GetChildrenAsNativeArray)(
        IUIAutomationAndCondition *This,
        IUIAutomationCondition ***childArray,
        int *childArrayCount);

    HRESULT (STDMETHODCALLTYPE *GetChildren)(
        IUIAutomationAndCondition *This,
        SAFEARRAY **childArray);

    END_INTERFACE
} IUIAutomationAndConditionVtbl;

interface IUIAutomationAndCondition {
    CONST_VTBL IUIAutomationAndConditionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationAndCondition_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationAndCondition_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationAndCondition_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationAndCondition methods ***/
#define IUIAutomationAndCondition_get_ChildCount(This,childCount) (This)->lpVtbl->get_ChildCount(This,childCount)
#define IUIAutomationAndCondition_GetChildrenAsNativeArray(This,childArray,childArrayCount) (This)->lpVtbl->GetChildrenAsNativeArray(This,childArray,childArrayCount)
#define IUIAutomationAndCondition_GetChildren(This,childArray) (This)->lpVtbl->GetChildren(This,childArray)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationAndCondition_QueryInterface(IUIAutomationAndCondition* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationAndCondition_AddRef(IUIAutomationAndCondition* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationAndCondition_Release(IUIAutomationAndCondition* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationAndCondition methods ***/
static __WIDL_INLINE HRESULT IUIAutomationAndCondition_get_ChildCount(IUIAutomationAndCondition* This,int *childCount) {
    return This->lpVtbl->get_ChildCount(This,childCount);
}
static __WIDL_INLINE HRESULT IUIAutomationAndCondition_GetChildrenAsNativeArray(IUIAutomationAndCondition* This,IUIAutomationCondition ***childArray,int *childArrayCount) {
    return This->lpVtbl->GetChildrenAsNativeArray(This,childArray,childArrayCount);
}
static __WIDL_INLINE HRESULT IUIAutomationAndCondition_GetChildren(IUIAutomationAndCondition* This,SAFEARRAY **childArray) {
    return This->lpVtbl->GetChildren(This,childArray);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationAndCondition_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationOrCondition interface
 */
#ifndef __IUIAutomationOrCondition_INTERFACE_DEFINED__
#define __IUIAutomationOrCondition_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationOrCondition, 0x8753f032, 0x3db1, 0x47b5, 0xa1,0xfc, 0x6e,0x34,0xa2,0x66,0xc7,0x12);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("8753f032-3db1-47b5-a1fc-6e34a266c712")
IUIAutomationOrCondition : public IUIAutomationCondition
{
    virtual HRESULT STDMETHODCALLTYPE get_ChildCount(
        int *childCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetChildrenAsNativeArray(
        IUIAutomationCondition ***childArray,
        int *childArrayCount) = 0;

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

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationOrCondition, 0x8753f032, 0x3db1, 0x47b5, 0xa1,0xfc, 0x6e,0x34,0xa2,0x66,0xc7,0x12)
#endif
#else
typedef struct IUIAutomationOrConditionVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomationOrCondition methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ChildCount)(
        IUIAutomationOrCondition *This,
        int *childCount);

    HRESULT (STDMETHODCALLTYPE *GetChildrenAsNativeArray)(
        IUIAutomationOrCondition *This,
        IUIAutomationCondition ***childArray,
        int *childArrayCount);

    HRESULT (STDMETHODCALLTYPE *GetChildren)(
        IUIAutomationOrCondition *This,
        SAFEARRAY **childArray);

    END_INTERFACE
} IUIAutomationOrConditionVtbl;

interface IUIAutomationOrCondition {
    CONST_VTBL IUIAutomationOrConditionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationOrCondition_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationOrCondition_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationOrCondition_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationOrCondition methods ***/
#define IUIAutomationOrCondition_get_ChildCount(This,childCount) (This)->lpVtbl->get_ChildCount(This,childCount)
#define IUIAutomationOrCondition_GetChildrenAsNativeArray(This,childArray,childArrayCount) (This)->lpVtbl->GetChildrenAsNativeArray(This,childArray,childArrayCount)
#define IUIAutomationOrCondition_GetChildren(This,childArray) (This)->lpVtbl->GetChildren(This,childArray)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationOrCondition_QueryInterface(IUIAutomationOrCondition* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationOrCondition_AddRef(IUIAutomationOrCondition* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationOrCondition_Release(IUIAutomationOrCondition* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationOrCondition methods ***/
static __WIDL_INLINE HRESULT IUIAutomationOrCondition_get_ChildCount(IUIAutomationOrCondition* This,int *childCount) {
    return This->lpVtbl->get_ChildCount(This,childCount);
}
static __WIDL_INLINE HRESULT IUIAutomationOrCondition_GetChildrenAsNativeArray(IUIAutomationOrCondition* This,IUIAutomationCondition ***childArray,int *childArrayCount) {
    return This->lpVtbl->GetChildrenAsNativeArray(This,childArray,childArrayCount);
}
static __WIDL_INLINE HRESULT IUIAutomationOrCondition_GetChildren(IUIAutomationOrCondition* This,SAFEARRAY **childArray) {
    return This->lpVtbl->GetChildren(This,childArray);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationOrCondition_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationNotCondition interface
 */
#ifndef __IUIAutomationNotCondition_INTERFACE_DEFINED__
#define __IUIAutomationNotCondition_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationNotCondition, 0xf528b657, 0x847b, 0x498c, 0x88,0x96, 0xd5,0x2b,0x56,0x54,0x07,0xa1);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("f528b657-847b-498c-8896-d52b565407a1")
IUIAutomationNotCondition : public IUIAutomationCondition
{
    virtual HRESULT STDMETHODCALLTYPE GetChild(
        IUIAutomationCondition **condition) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationNotCondition, 0xf528b657, 0x847b, 0x498c, 0x88,0x96, 0xd5,0x2b,0x56,0x54,0x07,0xa1)
#endif
#else
typedef struct IUIAutomationNotConditionVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomationNotCondition methods ***/
    HRESULT (STDMETHODCALLTYPE *GetChild)(
        IUIAutomationNotCondition *This,
        IUIAutomationCondition **condition);

    END_INTERFACE
} IUIAutomationNotConditionVtbl;

interface IUIAutomationNotCondition {
    CONST_VTBL IUIAutomationNotConditionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationNotCondition_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationNotCondition_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationNotCondition_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationNotCondition methods ***/
#define IUIAutomationNotCondition_GetChild(This,condition) (This)->lpVtbl->GetChild(This,condition)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationNotCondition_QueryInterface(IUIAutomationNotCondition* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationNotCondition_AddRef(IUIAutomationNotCondition* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationNotCondition_Release(IUIAutomationNotCondition* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationNotCondition methods ***/
static __WIDL_INLINE HRESULT IUIAutomationNotCondition_GetChild(IUIAutomationNotCondition* This,IUIAutomationCondition **condition) {
    return This->lpVtbl->GetChild(This,condition);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationNotCondition_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationCacheRequest interface
 */
#ifndef __IUIAutomationCacheRequest_INTERFACE_DEFINED__
#define __IUIAutomationCacheRequest_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationCacheRequest, 0xb32a92b5, 0xbc25, 0x4078, 0x9c,0x08, 0xd7,0xee,0x95,0xc4,0x8e,0x03);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("b32a92b5-bc25-4078-9c08-d7ee95c48e03")
IUIAutomationCacheRequest : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE AddProperty(
        PROPERTYID propertyId) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddPattern(
        PATTERNID patternId) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IUIAutomationCacheRequest **clonedRequest) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_TreeScope(
        enum TreeScope *scope) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_TreeScope(
        enum TreeScope scope) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_TreeFilter(
        IUIAutomationCondition **filter) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_TreeFilter(
        IUIAutomationCondition *filter) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_AutomationElementMode(
        enum AutomationElementMode *mode) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_AutomationElementMode(
        enum AutomationElementMode mode) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationCacheRequest, 0xb32a92b5, 0xbc25, 0x4078, 0x9c,0x08, 0xd7,0xee,0x95,0xc4,0x8e,0x03)
#endif
#else
typedef struct IUIAutomationCacheRequestVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomationCacheRequest methods ***/
    HRESULT (STDMETHODCALLTYPE *AddProperty)(
        IUIAutomationCacheRequest *This,
        PROPERTYID propertyId);

    HRESULT (STDMETHODCALLTYPE *AddPattern)(
        IUIAutomationCacheRequest *This,
        PATTERNID patternId);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IUIAutomationCacheRequest *This,
        IUIAutomationCacheRequest **clonedRequest);

    HRESULT (STDMETHODCALLTYPE *get_TreeScope)(
        IUIAutomationCacheRequest *This,
        enum TreeScope *scope);

    HRESULT (STDMETHODCALLTYPE *put_TreeScope)(
        IUIAutomationCacheRequest *This,
        enum TreeScope scope);

    HRESULT (STDMETHODCALLTYPE *get_TreeFilter)(
        IUIAutomationCacheRequest *This,
        IUIAutomationCondition **filter);

    HRESULT (STDMETHODCALLTYPE *put_TreeFilter)(
        IUIAutomationCacheRequest *This,
        IUIAutomationCondition *filter);

    HRESULT (STDMETHODCALLTYPE *get_AutomationElementMode)(
        IUIAutomationCacheRequest *This,
        enum AutomationElementMode *mode);

    HRESULT (STDMETHODCALLTYPE *put_AutomationElementMode)(
        IUIAutomationCacheRequest *This,
        enum AutomationElementMode mode);

    END_INTERFACE
} IUIAutomationCacheRequestVtbl;

interface IUIAutomationCacheRequest {
    CONST_VTBL IUIAutomationCacheRequestVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationCacheRequest_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationCacheRequest_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationCacheRequest_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationCacheRequest methods ***/
#define IUIAutomationCacheRequest_AddProperty(This,propertyId) (This)->lpVtbl->AddProperty(This,propertyId)
#define IUIAutomationCacheRequest_AddPattern(This,patternId) (This)->lpVtbl->AddPattern(This,patternId)
#define IUIAutomationCacheRequest_Clone(This,clonedRequest) (This)->lpVtbl->Clone(This,clonedRequest)
#define IUIAutomationCacheRequest_get_TreeScope(This,scope) (This)->lpVtbl->get_TreeScope(This,scope)
#define IUIAutomationCacheRequest_put_TreeScope(This,scope) (This)->lpVtbl->put_TreeScope(This,scope)
#define IUIAutomationCacheRequest_get_TreeFilter(This,filter) (This)->lpVtbl->get_TreeFilter(This,filter)
#define IUIAutomationCacheRequest_put_TreeFilter(This,filter) (This)->lpVtbl->put_TreeFilter(This,filter)
#define IUIAutomationCacheRequest_get_AutomationElementMode(This,mode) (This)->lpVtbl->get_AutomationElementMode(This,mode)
#define IUIAutomationCacheRequest_put_AutomationElementMode(This,mode) (This)->lpVtbl->put_AutomationElementMode(This,mode)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationCacheRequest_QueryInterface(IUIAutomationCacheRequest* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationCacheRequest_AddRef(IUIAutomationCacheRequest* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationCacheRequest_Release(IUIAutomationCacheRequest* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationCacheRequest methods ***/
static __WIDL_INLINE HRESULT IUIAutomationCacheRequest_AddProperty(IUIAutomationCacheRequest* This,PROPERTYID propertyId) {
    return This->lpVtbl->AddProperty(This,propertyId);
}
static __WIDL_INLINE HRESULT IUIAutomationCacheRequest_AddPattern(IUIAutomationCacheRequest* This,PATTERNID patternId) {
    return This->lpVtbl->AddPattern(This,patternId);
}
static __WIDL_INLINE HRESULT IUIAutomationCacheRequest_Clone(IUIAutomationCacheRequest* This,IUIAutomationCacheRequest **clonedRequest) {
    return This->lpVtbl->Clone(This,clonedRequest);
}
static __WIDL_INLINE HRESULT IUIAutomationCacheRequest_get_TreeScope(IUIAutomationCacheRequest* This,enum TreeScope *scope) {
    return This->lpVtbl->get_TreeScope(This,scope);
}
static __WIDL_INLINE HRESULT IUIAutomationCacheRequest_put_TreeScope(IUIAutomationCacheRequest* This,enum TreeScope scope) {
    return This->lpVtbl->put_TreeScope(This,scope);
}
static __WIDL_INLINE HRESULT IUIAutomationCacheRequest_get_TreeFilter(IUIAutomationCacheRequest* This,IUIAutomationCondition **filter) {
    return This->lpVtbl->get_TreeFilter(This,filter);
}
static __WIDL_INLINE HRESULT IUIAutomationCacheRequest_put_TreeFilter(IUIAutomationCacheRequest* This,IUIAutomationCondition *filter) {
    return This->lpVtbl->put_TreeFilter(This,filter);
}
static __WIDL_INLINE HRESULT IUIAutomationCacheRequest_get_AutomationElementMode(IUIAutomationCacheRequest* This,enum AutomationElementMode *mode) {
    return This->lpVtbl->get_AutomationElementMode(This,mode);
}
static __WIDL_INLINE HRESULT IUIAutomationCacheRequest_put_AutomationElementMode(IUIAutomationCacheRequest* This,enum AutomationElementMode mode) {
    return This->lpVtbl->put_AutomationElementMode(This,mode);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationCacheRequest_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationTreeWalker interface
 */
#ifndef __IUIAutomationTreeWalker_INTERFACE_DEFINED__
#define __IUIAutomationTreeWalker_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationTreeWalker, 0x4042c624, 0x389c, 0x4afc, 0xa6,0x30, 0x9d,0xf8,0x54,0xa5,0x41,0xfc);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("4042c624-389c-4afc-a630-9df854a541fc")
IUIAutomationTreeWalker : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetParentElement(
        IUIAutomationElement *element,
        IUIAutomationElement **parent) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFirstChildElement(
        IUIAutomationElement *element,
        IUIAutomationElement **first) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetLastChildElement(
        IUIAutomationElement *element,
        IUIAutomationElement **last) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetNextSiblingElement(
        IUIAutomationElement *element,
        IUIAutomationElement **next) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPreviousSiblingElement(
        IUIAutomationElement *element,
        IUIAutomationElement **previous) = 0;

    virtual HRESULT STDMETHODCALLTYPE NormalizeElement(
        IUIAutomationElement *element,
        IUIAutomationElement **normalized) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetParentElementBuildCache(
        IUIAutomationElement *element,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **parent) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFirstChildElementBuildCache(
        IUIAutomationElement *element,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **first) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetLastChildElementBuildCache(
        IUIAutomationElement *element,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **last) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetNextSiblingElementBuildCache(
        IUIAutomationElement *element,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **next) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPreviousSiblingElementBuildCache(
        IUIAutomationElement *element,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **previous) = 0;

    virtual HRESULT STDMETHODCALLTYPE NormalizeElementBuildCache(
        IUIAutomationElement *element,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **normalized) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Condition(
        IUIAutomationCondition **condition) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationTreeWalker, 0x4042c624, 0x389c, 0x4afc, 0xa6,0x30, 0x9d,0xf8,0x54,0xa5,0x41,0xfc)
#endif
#else
typedef struct IUIAutomationTreeWalkerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomationTreeWalker methods ***/
    HRESULT (STDMETHODCALLTYPE *GetParentElement)(
        IUIAutomationTreeWalker *This,
        IUIAutomationElement *element,
        IUIAutomationElement **parent);

    HRESULT (STDMETHODCALLTYPE *GetFirstChildElement)(
        IUIAutomationTreeWalker *This,
        IUIAutomationElement *element,
        IUIAutomationElement **first);

    HRESULT (STDMETHODCALLTYPE *GetLastChildElement)(
        IUIAutomationTreeWalker *This,
        IUIAutomationElement *element,
        IUIAutomationElement **last);

    HRESULT (STDMETHODCALLTYPE *GetNextSiblingElement)(
        IUIAutomationTreeWalker *This,
        IUIAutomationElement *element,
        IUIAutomationElement **next);

    HRESULT (STDMETHODCALLTYPE *GetPreviousSiblingElement)(
        IUIAutomationTreeWalker *This,
        IUIAutomationElement *element,
        IUIAutomationElement **previous);

    HRESULT (STDMETHODCALLTYPE *NormalizeElement)(
        IUIAutomationTreeWalker *This,
        IUIAutomationElement *element,
        IUIAutomationElement **normalized);

    HRESULT (STDMETHODCALLTYPE *GetParentElementBuildCache)(
        IUIAutomationTreeWalker *This,
        IUIAutomationElement *element,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **parent);

    HRESULT (STDMETHODCALLTYPE *GetFirstChildElementBuildCache)(
        IUIAutomationTreeWalker *This,
        IUIAutomationElement *element,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **first);

    HRESULT (STDMETHODCALLTYPE *GetLastChildElementBuildCache)(
        IUIAutomationTreeWalker *This,
        IUIAutomationElement *element,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **last);

    HRESULT (STDMETHODCALLTYPE *GetNextSiblingElementBuildCache)(
        IUIAutomationTreeWalker *This,
        IUIAutomationElement *element,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **next);

    HRESULT (STDMETHODCALLTYPE *GetPreviousSiblingElementBuildCache)(
        IUIAutomationTreeWalker *This,
        IUIAutomationElement *element,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **previous);

    HRESULT (STDMETHODCALLTYPE *NormalizeElementBuildCache)(
        IUIAutomationTreeWalker *This,
        IUIAutomationElement *element,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **normalized);

    HRESULT (STDMETHODCALLTYPE *get_Condition)(
        IUIAutomationTreeWalker *This,
        IUIAutomationCondition **condition);

    END_INTERFACE
} IUIAutomationTreeWalkerVtbl;

interface IUIAutomationTreeWalker {
    CONST_VTBL IUIAutomationTreeWalkerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationTreeWalker_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationTreeWalker_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationTreeWalker_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationTreeWalker methods ***/
#define IUIAutomationTreeWalker_GetParentElement(This,element,parent) (This)->lpVtbl->GetParentElement(This,element,parent)
#define IUIAutomationTreeWalker_GetFirstChildElement(This,element,first) (This)->lpVtbl->GetFirstChildElement(This,element,first)
#define IUIAutomationTreeWalker_GetLastChildElement(This,element,last) (This)->lpVtbl->GetLastChildElement(This,element,last)
#define IUIAutomationTreeWalker_GetNextSiblingElement(This,element,next) (This)->lpVtbl->GetNextSiblingElement(This,element,next)
#define IUIAutomationTreeWalker_GetPreviousSiblingElement(This,element,previous) (This)->lpVtbl->GetPreviousSiblingElement(This,element,previous)
#define IUIAutomationTreeWalker_NormalizeElement(This,element,normalized) (This)->lpVtbl->NormalizeElement(This,element,normalized)
#define IUIAutomationTreeWalker_GetParentElementBuildCache(This,element,cacheRequest,parent) (This)->lpVtbl->GetParentElementBuildCache(This,element,cacheRequest,parent)
#define IUIAutomationTreeWalker_GetFirstChildElementBuildCache(This,element,cacheRequest,first) (This)->lpVtbl->GetFirstChildElementBuildCache(This,element,cacheRequest,first)
#define IUIAutomationTreeWalker_GetLastChildElementBuildCache(This,element,cacheRequest,last) (This)->lpVtbl->GetLastChildElementBuildCache(This,element,cacheRequest,last)
#define IUIAutomationTreeWalker_GetNextSiblingElementBuildCache(This,element,cacheRequest,next) (This)->lpVtbl->GetNextSiblingElementBuildCache(This,element,cacheRequest,next)
#define IUIAutomationTreeWalker_GetPreviousSiblingElementBuildCache(This,element,cacheRequest,previous) (This)->lpVtbl->GetPreviousSiblingElementBuildCache(This,element,cacheRequest,previous)
#define IUIAutomationTreeWalker_NormalizeElementBuildCache(This,element,cacheRequest,normalized) (This)->lpVtbl->NormalizeElementBuildCache(This,element,cacheRequest,normalized)
#define IUIAutomationTreeWalker_get_Condition(This,condition) (This)->lpVtbl->get_Condition(This,condition)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationTreeWalker_QueryInterface(IUIAutomationTreeWalker* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationTreeWalker_AddRef(IUIAutomationTreeWalker* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationTreeWalker_Release(IUIAutomationTreeWalker* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationTreeWalker methods ***/
static __WIDL_INLINE HRESULT IUIAutomationTreeWalker_GetParentElement(IUIAutomationTreeWalker* This,IUIAutomationElement *element,IUIAutomationElement **parent) {
    return This->lpVtbl->GetParentElement(This,element,parent);
}
static __WIDL_INLINE HRESULT IUIAutomationTreeWalker_GetFirstChildElement(IUIAutomationTreeWalker* This,IUIAutomationElement *element,IUIAutomationElement **first) {
    return This->lpVtbl->GetFirstChildElement(This,element,first);
}
static __WIDL_INLINE HRESULT IUIAutomationTreeWalker_GetLastChildElement(IUIAutomationTreeWalker* This,IUIAutomationElement *element,IUIAutomationElement **last) {
    return This->lpVtbl->GetLastChildElement(This,element,last);
}
static __WIDL_INLINE HRESULT IUIAutomationTreeWalker_GetNextSiblingElement(IUIAutomationTreeWalker* This,IUIAutomationElement *element,IUIAutomationElement **next) {
    return This->lpVtbl->GetNextSiblingElement(This,element,next);
}
static __WIDL_INLINE HRESULT IUIAutomationTreeWalker_GetPreviousSiblingElement(IUIAutomationTreeWalker* This,IUIAutomationElement *element,IUIAutomationElement **previous) {
    return This->lpVtbl->GetPreviousSiblingElement(This,element,previous);
}
static __WIDL_INLINE HRESULT IUIAutomationTreeWalker_NormalizeElement(IUIAutomationTreeWalker* This,IUIAutomationElement *element,IUIAutomationElement **normalized) {
    return This->lpVtbl->NormalizeElement(This,element,normalized);
}
static __WIDL_INLINE HRESULT IUIAutomationTreeWalker_GetParentElementBuildCache(IUIAutomationTreeWalker* This,IUIAutomationElement *element,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **parent) {
    return This->lpVtbl->GetParentElementBuildCache(This,element,cacheRequest,parent);
}
static __WIDL_INLINE HRESULT IUIAutomationTreeWalker_GetFirstChildElementBuildCache(IUIAutomationTreeWalker* This,IUIAutomationElement *element,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **first) {
    return This->lpVtbl->GetFirstChildElementBuildCache(This,element,cacheRequest,first);
}
static __WIDL_INLINE HRESULT IUIAutomationTreeWalker_GetLastChildElementBuildCache(IUIAutomationTreeWalker* This,IUIAutomationElement *element,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **last) {
    return This->lpVtbl->GetLastChildElementBuildCache(This,element,cacheRequest,last);
}
static __WIDL_INLINE HRESULT IUIAutomationTreeWalker_GetNextSiblingElementBuildCache(IUIAutomationTreeWalker* This,IUIAutomationElement *element,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **next) {
    return This->lpVtbl->GetNextSiblingElementBuildCache(This,element,cacheRequest,next);
}
static __WIDL_INLINE HRESULT IUIAutomationTreeWalker_GetPreviousSiblingElementBuildCache(IUIAutomationTreeWalker* This,IUIAutomationElement *element,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **previous) {
    return This->lpVtbl->GetPreviousSiblingElementBuildCache(This,element,cacheRequest,previous);
}
static __WIDL_INLINE HRESULT IUIAutomationTreeWalker_NormalizeElementBuildCache(IUIAutomationTreeWalker* This,IUIAutomationElement *element,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **normalized) {
    return This->lpVtbl->NormalizeElementBuildCache(This,element,cacheRequest,normalized);
}
static __WIDL_INLINE HRESULT IUIAutomationTreeWalker_get_Condition(IUIAutomationTreeWalker* This,IUIAutomationCondition **condition) {
    return This->lpVtbl->get_Condition(This,condition);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationTreeWalker_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationEventHandler interface
 */
#ifndef __IUIAutomationEventHandler_INTERFACE_DEFINED__
#define __IUIAutomationEventHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationEventHandler, 0x146c3c17, 0xf12e, 0x4e22, 0x8c,0x27, 0xf8,0x94,0xb9,0xb7,0x9c,0x69);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("146c3c17-f12e-4e22-8c27-f894b9b79c69")
IUIAutomationEventHandler : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE HandleAutomationEvent(
        IUIAutomationElement *sender,
        EVENTID eventId) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationEventHandler, 0x146c3c17, 0xf12e, 0x4e22, 0x8c,0x27, 0xf8,0x94,0xb9,0xb7,0x9c,0x69)
#endif
#else
typedef struct IUIAutomationEventHandlerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomationEventHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *HandleAutomationEvent)(
        IUIAutomationEventHandler *This,
        IUIAutomationElement *sender,
        EVENTID eventId);

    END_INTERFACE
} IUIAutomationEventHandlerVtbl;

interface IUIAutomationEventHandler {
    CONST_VTBL IUIAutomationEventHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationEventHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationEventHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationEventHandler_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationEventHandler methods ***/
#define IUIAutomationEventHandler_HandleAutomationEvent(This,sender,eventId) (This)->lpVtbl->HandleAutomationEvent(This,sender,eventId)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationEventHandler_QueryInterface(IUIAutomationEventHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationEventHandler_AddRef(IUIAutomationEventHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationEventHandler_Release(IUIAutomationEventHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationEventHandler methods ***/
static __WIDL_INLINE HRESULT IUIAutomationEventHandler_HandleAutomationEvent(IUIAutomationEventHandler* This,IUIAutomationElement *sender,EVENTID eventId) {
    return This->lpVtbl->HandleAutomationEvent(This,sender,eventId);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationEventHandler_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationPropertyChangedEventHandler interface
 */
#ifndef __IUIAutomationPropertyChangedEventHandler_INTERFACE_DEFINED__
#define __IUIAutomationPropertyChangedEventHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationPropertyChangedEventHandler, 0x40cd37d4, 0xc756, 0x4b0c, 0x8c,0x6f, 0xbd,0xdf,0xee,0xb1,0x3b,0x50);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("40cd37d4-c756-4b0c-8c6f-bddfeeb13b50")
IUIAutomationPropertyChangedEventHandler : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE HandlePropertyChangedEvent(
        IUIAutomationElement *sender,
        PROPERTYID propertyId,
        VARIANT newValue) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationPropertyChangedEventHandler, 0x40cd37d4, 0xc756, 0x4b0c, 0x8c,0x6f, 0xbd,0xdf,0xee,0xb1,0x3b,0x50)
#endif
#else
typedef struct IUIAutomationPropertyChangedEventHandlerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomationPropertyChangedEventHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *HandlePropertyChangedEvent)(
        IUIAutomationPropertyChangedEventHandler *This,
        IUIAutomationElement *sender,
        PROPERTYID propertyId,
        VARIANT newValue);

    END_INTERFACE
} IUIAutomationPropertyChangedEventHandlerVtbl;

interface IUIAutomationPropertyChangedEventHandler {
    CONST_VTBL IUIAutomationPropertyChangedEventHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationPropertyChangedEventHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationPropertyChangedEventHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationPropertyChangedEventHandler_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationPropertyChangedEventHandler methods ***/
#define IUIAutomationPropertyChangedEventHandler_HandlePropertyChangedEvent(This,sender,propertyId,newValue) (This)->lpVtbl->HandlePropertyChangedEvent(This,sender,propertyId,newValue)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationPropertyChangedEventHandler_QueryInterface(IUIAutomationPropertyChangedEventHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationPropertyChangedEventHandler_AddRef(IUIAutomationPropertyChangedEventHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationPropertyChangedEventHandler_Release(IUIAutomationPropertyChangedEventHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationPropertyChangedEventHandler methods ***/
static __WIDL_INLINE HRESULT IUIAutomationPropertyChangedEventHandler_HandlePropertyChangedEvent(IUIAutomationPropertyChangedEventHandler* This,IUIAutomationElement *sender,PROPERTYID propertyId,VARIANT newValue) {
    return This->lpVtbl->HandlePropertyChangedEvent(This,sender,propertyId,newValue);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationPropertyChangedEventHandler_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationStructureChangedEventHandler interface
 */
#ifndef __IUIAutomationStructureChangedEventHandler_INTERFACE_DEFINED__
#define __IUIAutomationStructureChangedEventHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationStructureChangedEventHandler, 0xe81d1b4e, 0x11c5, 0x42f8, 0x97,0x54, 0xe7,0x03,0x6c,0x79,0xf0,0x54);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("e81d1b4e-11c5-42f8-9754-e7036c79f054")
IUIAutomationStructureChangedEventHandler : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE HandleStructureChangedEvent(
        IUIAutomationElement *sender,
        enum StructureChangeType changeType,
        SAFEARRAY *runtimeId) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationStructureChangedEventHandler, 0xe81d1b4e, 0x11c5, 0x42f8, 0x97,0x54, 0xe7,0x03,0x6c,0x79,0xf0,0x54)
#endif
#else
typedef struct IUIAutomationStructureChangedEventHandlerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomationStructureChangedEventHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *HandleStructureChangedEvent)(
        IUIAutomationStructureChangedEventHandler *This,
        IUIAutomationElement *sender,
        enum StructureChangeType changeType,
        SAFEARRAY *runtimeId);

    END_INTERFACE
} IUIAutomationStructureChangedEventHandlerVtbl;

interface IUIAutomationStructureChangedEventHandler {
    CONST_VTBL IUIAutomationStructureChangedEventHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationStructureChangedEventHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationStructureChangedEventHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationStructureChangedEventHandler_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationStructureChangedEventHandler methods ***/
#define IUIAutomationStructureChangedEventHandler_HandleStructureChangedEvent(This,sender,changeType,runtimeId) (This)->lpVtbl->HandleStructureChangedEvent(This,sender,changeType,runtimeId)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationStructureChangedEventHandler_QueryInterface(IUIAutomationStructureChangedEventHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationStructureChangedEventHandler_AddRef(IUIAutomationStructureChangedEventHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationStructureChangedEventHandler_Release(IUIAutomationStructureChangedEventHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationStructureChangedEventHandler methods ***/
static __WIDL_INLINE HRESULT IUIAutomationStructureChangedEventHandler_HandleStructureChangedEvent(IUIAutomationStructureChangedEventHandler* This,IUIAutomationElement *sender,enum StructureChangeType changeType,SAFEARRAY *runtimeId) {
    return This->lpVtbl->HandleStructureChangedEvent(This,sender,changeType,runtimeId);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationStructureChangedEventHandler_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationFocusChangedEventHandler interface
 */
#ifndef __IUIAutomationFocusChangedEventHandler_INTERFACE_DEFINED__
#define __IUIAutomationFocusChangedEventHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationFocusChangedEventHandler, 0xc270f6b5, 0x5c69, 0x4290, 0x97,0x45, 0x7a,0x7f,0x97,0x16,0x94,0x68);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c270f6b5-5c69-4290-9745-7a7f97169468")
IUIAutomationFocusChangedEventHandler : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE HandleFocusChangedEvent(
        IUIAutomationElement *sender) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationFocusChangedEventHandler, 0xc270f6b5, 0x5c69, 0x4290, 0x97,0x45, 0x7a,0x7f,0x97,0x16,0x94,0x68)
#endif
#else
typedef struct IUIAutomationFocusChangedEventHandlerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomationFocusChangedEventHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *HandleFocusChangedEvent)(
        IUIAutomationFocusChangedEventHandler *This,
        IUIAutomationElement *sender);

    END_INTERFACE
} IUIAutomationFocusChangedEventHandlerVtbl;

interface IUIAutomationFocusChangedEventHandler {
    CONST_VTBL IUIAutomationFocusChangedEventHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationFocusChangedEventHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationFocusChangedEventHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationFocusChangedEventHandler_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationFocusChangedEventHandler methods ***/
#define IUIAutomationFocusChangedEventHandler_HandleFocusChangedEvent(This,sender) (This)->lpVtbl->HandleFocusChangedEvent(This,sender)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationFocusChangedEventHandler_QueryInterface(IUIAutomationFocusChangedEventHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationFocusChangedEventHandler_AddRef(IUIAutomationFocusChangedEventHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationFocusChangedEventHandler_Release(IUIAutomationFocusChangedEventHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationFocusChangedEventHandler methods ***/
static __WIDL_INLINE HRESULT IUIAutomationFocusChangedEventHandler_HandleFocusChangedEvent(IUIAutomationFocusChangedEventHandler* This,IUIAutomationElement *sender) {
    return This->lpVtbl->HandleFocusChangedEvent(This,sender);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationFocusChangedEventHandler_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationTextEditTextChangedEventHandler interface
 */
#ifndef __IUIAutomationTextEditTextChangedEventHandler_INTERFACE_DEFINED__
#define __IUIAutomationTextEditTextChangedEventHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationTextEditTextChangedEventHandler, 0x92faa680, 0xe704, 0x4156, 0x93,0x1a, 0xe3,0x2d,0x5b,0xb3,0x8f,0x3f);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("92faa680-e704-4156-931a-e32d5bb38f3f")
IUIAutomationTextEditTextChangedEventHandler : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE HandleTextEditTextChangedEvent(
        IUIAutomationElement *sender,
        enum TextEditChangeType textEditChangeType,
        SAFEARRAY *eventStrings) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationTextEditTextChangedEventHandler, 0x92faa680, 0xe704, 0x4156, 0x93,0x1a, 0xe3,0x2d,0x5b,0xb3,0x8f,0x3f)
#endif
#else
typedef struct IUIAutomationTextEditTextChangedEventHandlerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomationTextEditTextChangedEventHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *HandleTextEditTextChangedEvent)(
        IUIAutomationTextEditTextChangedEventHandler *This,
        IUIAutomationElement *sender,
        enum TextEditChangeType textEditChangeType,
        SAFEARRAY *eventStrings);

    END_INTERFACE
} IUIAutomationTextEditTextChangedEventHandlerVtbl;

interface IUIAutomationTextEditTextChangedEventHandler {
    CONST_VTBL IUIAutomationTextEditTextChangedEventHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationTextEditTextChangedEventHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationTextEditTextChangedEventHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationTextEditTextChangedEventHandler_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationTextEditTextChangedEventHandler methods ***/
#define IUIAutomationTextEditTextChangedEventHandler_HandleTextEditTextChangedEvent(This,sender,textEditChangeType,eventStrings) (This)->lpVtbl->HandleTextEditTextChangedEvent(This,sender,textEditChangeType,eventStrings)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationTextEditTextChangedEventHandler_QueryInterface(IUIAutomationTextEditTextChangedEventHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationTextEditTextChangedEventHandler_AddRef(IUIAutomationTextEditTextChangedEventHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationTextEditTextChangedEventHandler_Release(IUIAutomationTextEditTextChangedEventHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationTextEditTextChangedEventHandler methods ***/
static __WIDL_INLINE HRESULT IUIAutomationTextEditTextChangedEventHandler_HandleTextEditTextChangedEvent(IUIAutomationTextEditTextChangedEventHandler* This,IUIAutomationElement *sender,enum TextEditChangeType textEditChangeType,SAFEARRAY *eventStrings) {
    return This->lpVtbl->HandleTextEditTextChangedEvent(This,sender,textEditChangeType,eventStrings);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationTextEditTextChangedEventHandler_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationChangesEventHandler interface
 */
#ifndef __IUIAutomationChangesEventHandler_INTERFACE_DEFINED__
#define __IUIAutomationChangesEventHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationChangesEventHandler, 0x58edca55, 0x2c3e, 0x4980, 0xb1,0xb9, 0x56,0xc1,0x7f,0x27,0xa2,0xa0);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("58edca55-2c3e-4980-b1b9-56c17f27a2a0")
IUIAutomationChangesEventHandler : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE HandleChangesEvent(
        IUIAutomationElement *sender,
        struct UiaChangeInfo *uiaChanges,
        int changesCount) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationChangesEventHandler, 0x58edca55, 0x2c3e, 0x4980, 0xb1,0xb9, 0x56,0xc1,0x7f,0x27,0xa2,0xa0)
#endif
#else
typedef struct IUIAutomationChangesEventHandlerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomationChangesEventHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *HandleChangesEvent)(
        IUIAutomationChangesEventHandler *This,
        IUIAutomationElement *sender,
        struct UiaChangeInfo *uiaChanges,
        int changesCount);

    END_INTERFACE
} IUIAutomationChangesEventHandlerVtbl;

interface IUIAutomationChangesEventHandler {
    CONST_VTBL IUIAutomationChangesEventHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationChangesEventHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationChangesEventHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationChangesEventHandler_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationChangesEventHandler methods ***/
#define IUIAutomationChangesEventHandler_HandleChangesEvent(This,sender,uiaChanges,changesCount) (This)->lpVtbl->HandleChangesEvent(This,sender,uiaChanges,changesCount)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationChangesEventHandler_QueryInterface(IUIAutomationChangesEventHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationChangesEventHandler_AddRef(IUIAutomationChangesEventHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationChangesEventHandler_Release(IUIAutomationChangesEventHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationChangesEventHandler methods ***/
static __WIDL_INLINE HRESULT IUIAutomationChangesEventHandler_HandleChangesEvent(IUIAutomationChangesEventHandler* This,IUIAutomationElement *sender,struct UiaChangeInfo *uiaChanges,int changesCount) {
    return This->lpVtbl->HandleChangesEvent(This,sender,uiaChanges,changesCount);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationChangesEventHandler_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationNotificationEventHandler interface
 */
#ifndef __IUIAutomationNotificationEventHandler_INTERFACE_DEFINED__
#define __IUIAutomationNotificationEventHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationNotificationEventHandler, 0xc7cb2637, 0xe6c2, 0x4d0c, 0x85,0xde, 0x49,0x48,0xc0,0x21,0x75,0xc7);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c7cb2637-e6c2-4d0c-85de-4948c02175c7")
IUIAutomationNotificationEventHandler : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE HandleNotificationEvent(
        IUIAutomationElement *sender,
        enum NotificationKind notificationKind,
        enum NotificationProcessing notificationProcessing,
        BSTR displayString,
        BSTR activityId) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationNotificationEventHandler, 0xc7cb2637, 0xe6c2, 0x4d0c, 0x85,0xde, 0x49,0x48,0xc0,0x21,0x75,0xc7)
#endif
#else
typedef struct IUIAutomationNotificationEventHandlerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomationNotificationEventHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *HandleNotificationEvent)(
        IUIAutomationNotificationEventHandler *This,
        IUIAutomationElement *sender,
        enum NotificationKind notificationKind,
        enum NotificationProcessing notificationProcessing,
        BSTR displayString,
        BSTR activityId);

    END_INTERFACE
} IUIAutomationNotificationEventHandlerVtbl;

interface IUIAutomationNotificationEventHandler {
    CONST_VTBL IUIAutomationNotificationEventHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationNotificationEventHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationNotificationEventHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationNotificationEventHandler_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationNotificationEventHandler methods ***/
#define IUIAutomationNotificationEventHandler_HandleNotificationEvent(This,sender,notificationKind,notificationProcessing,displayString,activityId) (This)->lpVtbl->HandleNotificationEvent(This,sender,notificationKind,notificationProcessing,displayString,activityId)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationNotificationEventHandler_QueryInterface(IUIAutomationNotificationEventHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationNotificationEventHandler_AddRef(IUIAutomationNotificationEventHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationNotificationEventHandler_Release(IUIAutomationNotificationEventHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationNotificationEventHandler methods ***/
static __WIDL_INLINE HRESULT IUIAutomationNotificationEventHandler_HandleNotificationEvent(IUIAutomationNotificationEventHandler* This,IUIAutomationElement *sender,enum NotificationKind notificationKind,enum NotificationProcessing notificationProcessing,BSTR displayString,BSTR activityId) {
    return This->lpVtbl->HandleNotificationEvent(This,sender,notificationKind,notificationProcessing,displayString,activityId);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationNotificationEventHandler_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationInvokePattern interface
 */
#ifndef __IUIAutomationInvokePattern_INTERFACE_DEFINED__
#define __IUIAutomationInvokePattern_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationInvokePattern, 0xfb377fbe, 0x8ea6, 0x46d5, 0x9c,0x73, 0x64,0x99,0x64,0x2d,0x30,0x59);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("fb377fbe-8ea6-46d5-9c73-6499642d3059")
IUIAutomationInvokePattern : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Invoke(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationInvokePattern, 0xfb377fbe, 0x8ea6, 0x46d5, 0x9c,0x73, 0x64,0x99,0x64,0x2d,0x30,0x59)
#endif
#else
typedef struct IUIAutomationInvokePatternVtbl {
    BEGIN_INTERFACE

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

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

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

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

    END_INTERFACE
} IUIAutomationInvokePatternVtbl;

interface IUIAutomationInvokePattern {
    CONST_VTBL IUIAutomationInvokePatternVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationInvokePattern_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationInvokePattern_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationInvokePattern_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationInvokePattern methods ***/
#define IUIAutomationInvokePattern_Invoke(This) (This)->lpVtbl->Invoke(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationInvokePattern_QueryInterface(IUIAutomationInvokePattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationInvokePattern_AddRef(IUIAutomationInvokePattern* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationInvokePattern_Release(IUIAutomationInvokePattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationInvokePattern methods ***/
static __WIDL_INLINE HRESULT IUIAutomationInvokePattern_Invoke(IUIAutomationInvokePattern* This) {
    return This->lpVtbl->Invoke(This);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationInvokePattern_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationDockPattern interface
 */
#ifndef __IUIAutomationDockPattern_INTERFACE_DEFINED__
#define __IUIAutomationDockPattern_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationDockPattern, 0xfde5ef97, 0x1464, 0x48f6, 0x90,0xbf, 0x43,0xd0,0x94,0x8e,0x86,0xec);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("fde5ef97-1464-48f6-90bf-43d0948e86ec")
IUIAutomationDockPattern : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetDockPosition(
        enum DockPosition dockPos) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CurrentDockPosition(
        enum DockPosition *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CachedDockPosition(
        enum DockPosition *retVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationDockPattern, 0xfde5ef97, 0x1464, 0x48f6, 0x90,0xbf, 0x43,0xd0,0x94,0x8e,0x86,0xec)
#endif
#else
typedef struct IUIAutomationDockPatternVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomationDockPattern methods ***/
    HRESULT (STDMETHODCALLTYPE *SetDockPosition)(
        IUIAutomationDockPattern *This,
        enum DockPosition dockPos);

    HRESULT (STDMETHODCALLTYPE *get_CurrentDockPosition)(
        IUIAutomationDockPattern *This,
        enum DockPosition *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedDockPosition)(
        IUIAutomationDockPattern *This,
        enum DockPosition *retVal);

    END_INTERFACE
} IUIAutomationDockPatternVtbl;

interface IUIAutomationDockPattern {
    CONST_VTBL IUIAutomationDockPatternVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationDockPattern_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationDockPattern_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationDockPattern_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationDockPattern methods ***/
#define IUIAutomationDockPattern_SetDockPosition(This,dockPos) (This)->lpVtbl->SetDockPosition(This,dockPos)
#define IUIAutomationDockPattern_get_CurrentDockPosition(This,retVal) (This)->lpVtbl->get_CurrentDockPosition(This,retVal)
#define IUIAutomationDockPattern_get_CachedDockPosition(This,retVal) (This)->lpVtbl->get_CachedDockPosition(This,retVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationDockPattern_QueryInterface(IUIAutomationDockPattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationDockPattern_AddRef(IUIAutomationDockPattern* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationDockPattern_Release(IUIAutomationDockPattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationDockPattern methods ***/
static __WIDL_INLINE HRESULT IUIAutomationDockPattern_SetDockPosition(IUIAutomationDockPattern* This,enum DockPosition dockPos) {
    return This->lpVtbl->SetDockPosition(This,dockPos);
}
static __WIDL_INLINE HRESULT IUIAutomationDockPattern_get_CurrentDockPosition(IUIAutomationDockPattern* This,enum DockPosition *retVal) {
    return This->lpVtbl->get_CurrentDockPosition(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationDockPattern_get_CachedDockPosition(IUIAutomationDockPattern* This,enum DockPosition *retVal) {
    return This->lpVtbl->get_CachedDockPosition(This,retVal);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationDockPattern_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationExpandCollapsePattern interface
 */
#ifndef __IUIAutomationExpandCollapsePattern_INTERFACE_DEFINED__
#define __IUIAutomationExpandCollapsePattern_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationExpandCollapsePattern, 0x619be086, 0x1f4e, 0x4ee4, 0xba,0xfa, 0x21,0x01,0x28,0x73,0x87,0x30);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("619be086-1f4e-4ee4-bafa-210128738730")
IUIAutomationExpandCollapsePattern : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Expand(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Collapse(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CurrentExpandCollapseState(
        enum ExpandCollapseState *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CachedExpandCollapseState(
        enum ExpandCollapseState *retVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationExpandCollapsePattern, 0x619be086, 0x1f4e, 0x4ee4, 0xba,0xfa, 0x21,0x01,0x28,0x73,0x87,0x30)
#endif
#else
typedef struct IUIAutomationExpandCollapsePatternVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

    HRESULT (STDMETHODCALLTYPE *get_CurrentExpandCollapseState)(
        IUIAutomationExpandCollapsePattern *This,
        enum ExpandCollapseState *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedExpandCollapseState)(
        IUIAutomationExpandCollapsePattern *This,
        enum ExpandCollapseState *retVal);

    END_INTERFACE
} IUIAutomationExpandCollapsePatternVtbl;

interface IUIAutomationExpandCollapsePattern {
    CONST_VTBL IUIAutomationExpandCollapsePatternVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationExpandCollapsePattern_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationExpandCollapsePattern_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationExpandCollapsePattern_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationExpandCollapsePattern methods ***/
#define IUIAutomationExpandCollapsePattern_Expand(This) (This)->lpVtbl->Expand(This)
#define IUIAutomationExpandCollapsePattern_Collapse(This) (This)->lpVtbl->Collapse(This)
#define IUIAutomationExpandCollapsePattern_get_CurrentExpandCollapseState(This,retVal) (This)->lpVtbl->get_CurrentExpandCollapseState(This,retVal)
#define IUIAutomationExpandCollapsePattern_get_CachedExpandCollapseState(This,retVal) (This)->lpVtbl->get_CachedExpandCollapseState(This,retVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationExpandCollapsePattern_QueryInterface(IUIAutomationExpandCollapsePattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationExpandCollapsePattern_AddRef(IUIAutomationExpandCollapsePattern* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationExpandCollapsePattern_Release(IUIAutomationExpandCollapsePattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationExpandCollapsePattern methods ***/
static __WIDL_INLINE HRESULT IUIAutomationExpandCollapsePattern_Expand(IUIAutomationExpandCollapsePattern* This) {
    return This->lpVtbl->Expand(This);
}
static __WIDL_INLINE HRESULT IUIAutomationExpandCollapsePattern_Collapse(IUIAutomationExpandCollapsePattern* This) {
    return This->lpVtbl->Collapse(This);
}
static __WIDL_INLINE HRESULT IUIAutomationExpandCollapsePattern_get_CurrentExpandCollapseState(IUIAutomationExpandCollapsePattern* This,enum ExpandCollapseState *retVal) {
    return This->lpVtbl->get_CurrentExpandCollapseState(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationExpandCollapsePattern_get_CachedExpandCollapseState(IUIAutomationExpandCollapsePattern* This,enum ExpandCollapseState *retVal) {
    return This->lpVtbl->get_CachedExpandCollapseState(This,retVal);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationExpandCollapsePattern_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationGridPattern interface
 */
#ifndef __IUIAutomationGridPattern_INTERFACE_DEFINED__
#define __IUIAutomationGridPattern_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationGridPattern, 0x414c3cdc, 0x856b, 0x4f5b, 0x85,0x38, 0x31,0x31,0xc6,0x30,0x25,0x50);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("414c3cdc-856b-4f5b-8538-3131c6302550")
IUIAutomationGridPattern : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetItem(
        int row,
        int column,
        IUIAutomationElement **element) = 0;

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

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

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

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

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationGridPattern, 0x414c3cdc, 0x856b, 0x4f5b, 0x85,0x38, 0x31,0x31,0xc6,0x30,0x25,0x50)
#endif
#else
typedef struct IUIAutomationGridPatternVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomationGridPattern methods ***/
    HRESULT (STDMETHODCALLTYPE *GetItem)(
        IUIAutomationGridPattern *This,
        int row,
        int column,
        IUIAutomationElement **element);

    HRESULT (STDMETHODCALLTYPE *get_CurrentRowCount)(
        IUIAutomationGridPattern *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentColumnCount)(
        IUIAutomationGridPattern *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedRowCount)(
        IUIAutomationGridPattern *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedColumnCount)(
        IUIAutomationGridPattern *This,
        int *retVal);

    END_INTERFACE
} IUIAutomationGridPatternVtbl;

interface IUIAutomationGridPattern {
    CONST_VTBL IUIAutomationGridPatternVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationGridPattern_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationGridPattern_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationGridPattern_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationGridPattern methods ***/
#define IUIAutomationGridPattern_GetItem(This,row,column,element) (This)->lpVtbl->GetItem(This,row,column,element)
#define IUIAutomationGridPattern_get_CurrentRowCount(This,retVal) (This)->lpVtbl->get_CurrentRowCount(This,retVal)
#define IUIAutomationGridPattern_get_CurrentColumnCount(This,retVal) (This)->lpVtbl->get_CurrentColumnCount(This,retVal)
#define IUIAutomationGridPattern_get_CachedRowCount(This,retVal) (This)->lpVtbl->get_CachedRowCount(This,retVal)
#define IUIAutomationGridPattern_get_CachedColumnCount(This,retVal) (This)->lpVtbl->get_CachedColumnCount(This,retVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationGridPattern_QueryInterface(IUIAutomationGridPattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationGridPattern_AddRef(IUIAutomationGridPattern* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationGridPattern_Release(IUIAutomationGridPattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationGridPattern methods ***/
static __WIDL_INLINE HRESULT IUIAutomationGridPattern_GetItem(IUIAutomationGridPattern* This,int row,int column,IUIAutomationElement **element) {
    return This->lpVtbl->GetItem(This,row,column,element);
}
static __WIDL_INLINE HRESULT IUIAutomationGridPattern_get_CurrentRowCount(IUIAutomationGridPattern* This,int *retVal) {
    return This->lpVtbl->get_CurrentRowCount(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationGridPattern_get_CurrentColumnCount(IUIAutomationGridPattern* This,int *retVal) {
    return This->lpVtbl->get_CurrentColumnCount(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationGridPattern_get_CachedRowCount(IUIAutomationGridPattern* This,int *retVal) {
    return This->lpVtbl->get_CachedRowCount(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationGridPattern_get_CachedColumnCount(IUIAutomationGridPattern* This,int *retVal) {
    return This->lpVtbl->get_CachedColumnCount(This,retVal);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationGridPattern_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationGridItemPattern interface
 */
#ifndef __IUIAutomationGridItemPattern_INTERFACE_DEFINED__
#define __IUIAutomationGridItemPattern_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationGridItemPattern, 0x78f8ef57, 0x66c3, 0x4e09, 0xbd,0x7c, 0xe7,0x9b,0x20,0x04,0x89,0x4d);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("78f8ef57-66c3-4e09-bd7c-e79b2004894d")
IUIAutomationGridItemPattern : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE get_CurrentContainingGrid(
        IUIAutomationElement **retVal) = 0;

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

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

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

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

    virtual HRESULT STDMETHODCALLTYPE get_CachedContainingGrid(
        IUIAutomationElement **retVal) = 0;

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

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

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

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

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationGridItemPattern, 0x78f8ef57, 0x66c3, 0x4e09, 0xbd,0x7c, 0xe7,0x9b,0x20,0x04,0x89,0x4d)
#endif
#else
typedef struct IUIAutomationGridItemPatternVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomationGridItemPattern methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CurrentContainingGrid)(
        IUIAutomationGridItemPattern *This,
        IUIAutomationElement **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentRow)(
        IUIAutomationGridItemPattern *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentColumn)(
        IUIAutomationGridItemPattern *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentRowSpan)(
        IUIAutomationGridItemPattern *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentColumnSpan)(
        IUIAutomationGridItemPattern *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedContainingGrid)(
        IUIAutomationGridItemPattern *This,
        IUIAutomationElement **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedRow)(
        IUIAutomationGridItemPattern *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedColumn)(
        IUIAutomationGridItemPattern *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedRowSpan)(
        IUIAutomationGridItemPattern *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedColumnSpan)(
        IUIAutomationGridItemPattern *This,
        int *retVal);

    END_INTERFACE
} IUIAutomationGridItemPatternVtbl;

interface IUIAutomationGridItemPattern {
    CONST_VTBL IUIAutomationGridItemPatternVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationGridItemPattern_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationGridItemPattern_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationGridItemPattern_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationGridItemPattern methods ***/
#define IUIAutomationGridItemPattern_get_CurrentContainingGrid(This,retVal) (This)->lpVtbl->get_CurrentContainingGrid(This,retVal)
#define IUIAutomationGridItemPattern_get_CurrentRow(This,retVal) (This)->lpVtbl->get_CurrentRow(This,retVal)
#define IUIAutomationGridItemPattern_get_CurrentColumn(This,retVal) (This)->lpVtbl->get_CurrentColumn(This,retVal)
#define IUIAutomationGridItemPattern_get_CurrentRowSpan(This,retVal) (This)->lpVtbl->get_CurrentRowSpan(This,retVal)
#define IUIAutomationGridItemPattern_get_CurrentColumnSpan(This,retVal) (This)->lpVtbl->get_CurrentColumnSpan(This,retVal)
#define IUIAutomationGridItemPattern_get_CachedContainingGrid(This,retVal) (This)->lpVtbl->get_CachedContainingGrid(This,retVal)
#define IUIAutomationGridItemPattern_get_CachedRow(This,retVal) (This)->lpVtbl->get_CachedRow(This,retVal)
#define IUIAutomationGridItemPattern_get_CachedColumn(This,retVal) (This)->lpVtbl->get_CachedColumn(This,retVal)
#define IUIAutomationGridItemPattern_get_CachedRowSpan(This,retVal) (This)->lpVtbl->get_CachedRowSpan(This,retVal)
#define IUIAutomationGridItemPattern_get_CachedColumnSpan(This,retVal) (This)->lpVtbl->get_CachedColumnSpan(This,retVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationGridItemPattern_QueryInterface(IUIAutomationGridItemPattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationGridItemPattern_AddRef(IUIAutomationGridItemPattern* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationGridItemPattern_Release(IUIAutomationGridItemPattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationGridItemPattern methods ***/
static __WIDL_INLINE HRESULT IUIAutomationGridItemPattern_get_CurrentContainingGrid(IUIAutomationGridItemPattern* This,IUIAutomationElement **retVal) {
    return This->lpVtbl->get_CurrentContainingGrid(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationGridItemPattern_get_CurrentRow(IUIAutomationGridItemPattern* This,int *retVal) {
    return This->lpVtbl->get_CurrentRow(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationGridItemPattern_get_CurrentColumn(IUIAutomationGridItemPattern* This,int *retVal) {
    return This->lpVtbl->get_CurrentColumn(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationGridItemPattern_get_CurrentRowSpan(IUIAutomationGridItemPattern* This,int *retVal) {
    return This->lpVtbl->get_CurrentRowSpan(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationGridItemPattern_get_CurrentColumnSpan(IUIAutomationGridItemPattern* This,int *retVal) {
    return This->lpVtbl->get_CurrentColumnSpan(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationGridItemPattern_get_CachedContainingGrid(IUIAutomationGridItemPattern* This,IUIAutomationElement **retVal) {
    return This->lpVtbl->get_CachedContainingGrid(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationGridItemPattern_get_CachedRow(IUIAutomationGridItemPattern* This,int *retVal) {
    return This->lpVtbl->get_CachedRow(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationGridItemPattern_get_CachedColumn(IUIAutomationGridItemPattern* This,int *retVal) {
    return This->lpVtbl->get_CachedColumn(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationGridItemPattern_get_CachedRowSpan(IUIAutomationGridItemPattern* This,int *retVal) {
    return This->lpVtbl->get_CachedRowSpan(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationGridItemPattern_get_CachedColumnSpan(IUIAutomationGridItemPattern* This,int *retVal) {
    return This->lpVtbl->get_CachedColumnSpan(This,retVal);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationGridItemPattern_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationMultipleViewPattern interface
 */
#ifndef __IUIAutomationMultipleViewPattern_INTERFACE_DEFINED__
#define __IUIAutomationMultipleViewPattern_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationMultipleViewPattern, 0x8d253c91, 0x1dc5, 0x4bb5, 0xb1,0x8f, 0xad,0xe1,0x6f,0xa4,0x95,0xe8);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("8d253c91-1dc5-4bb5-b18f-ade16fa495e8")
IUIAutomationMultipleViewPattern : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetViewName(
        int view,
        BSTR *name) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetCurrentView(
        int view) = 0;

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

    virtual HRESULT STDMETHODCALLTYPE GetCurrentSupportedViews(
        SAFEARRAY **retVal) = 0;

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

    virtual HRESULT STDMETHODCALLTYPE GetCachedSupportedViews(
        SAFEARRAY **retVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationMultipleViewPattern, 0x8d253c91, 0x1dc5, 0x4bb5, 0xb1,0x8f, 0xad,0xe1,0x6f,0xa4,0x95,0xe8)
#endif
#else
typedef struct IUIAutomationMultipleViewPatternVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomationMultipleViewPattern methods ***/
    HRESULT (STDMETHODCALLTYPE *GetViewName)(
        IUIAutomationMultipleViewPattern *This,
        int view,
        BSTR *name);

    HRESULT (STDMETHODCALLTYPE *SetCurrentView)(
        IUIAutomationMultipleViewPattern *This,
        int view);

    HRESULT (STDMETHODCALLTYPE *get_CurrentCurrentView)(
        IUIAutomationMultipleViewPattern *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *GetCurrentSupportedViews)(
        IUIAutomationMultipleViewPattern *This,
        SAFEARRAY **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedCurrentView)(
        IUIAutomationMultipleViewPattern *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *GetCachedSupportedViews)(
        IUIAutomationMultipleViewPattern *This,
        SAFEARRAY **retVal);

    END_INTERFACE
} IUIAutomationMultipleViewPatternVtbl;

interface IUIAutomationMultipleViewPattern {
    CONST_VTBL IUIAutomationMultipleViewPatternVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationMultipleViewPattern_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationMultipleViewPattern_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationMultipleViewPattern_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationMultipleViewPattern methods ***/
#define IUIAutomationMultipleViewPattern_GetViewName(This,view,name) (This)->lpVtbl->GetViewName(This,view,name)
#define IUIAutomationMultipleViewPattern_SetCurrentView(This,view) (This)->lpVtbl->SetCurrentView(This,view)
#define IUIAutomationMultipleViewPattern_get_CurrentCurrentView(This,retVal) (This)->lpVtbl->get_CurrentCurrentView(This,retVal)
#define IUIAutomationMultipleViewPattern_GetCurrentSupportedViews(This,retVal) (This)->lpVtbl->GetCurrentSupportedViews(This,retVal)
#define IUIAutomationMultipleViewPattern_get_CachedCurrentView(This,retVal) (This)->lpVtbl->get_CachedCurrentView(This,retVal)
#define IUIAutomationMultipleViewPattern_GetCachedSupportedViews(This,retVal) (This)->lpVtbl->GetCachedSupportedViews(This,retVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationMultipleViewPattern_QueryInterface(IUIAutomationMultipleViewPattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationMultipleViewPattern_AddRef(IUIAutomationMultipleViewPattern* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationMultipleViewPattern_Release(IUIAutomationMultipleViewPattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationMultipleViewPattern methods ***/
static __WIDL_INLINE HRESULT IUIAutomationMultipleViewPattern_GetViewName(IUIAutomationMultipleViewPattern* This,int view,BSTR *name) {
    return This->lpVtbl->GetViewName(This,view,name);
}
static __WIDL_INLINE HRESULT IUIAutomationMultipleViewPattern_SetCurrentView(IUIAutomationMultipleViewPattern* This,int view) {
    return This->lpVtbl->SetCurrentView(This,view);
}
static __WIDL_INLINE HRESULT IUIAutomationMultipleViewPattern_get_CurrentCurrentView(IUIAutomationMultipleViewPattern* This,int *retVal) {
    return This->lpVtbl->get_CurrentCurrentView(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationMultipleViewPattern_GetCurrentSupportedViews(IUIAutomationMultipleViewPattern* This,SAFEARRAY **retVal) {
    return This->lpVtbl->GetCurrentSupportedViews(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationMultipleViewPattern_get_CachedCurrentView(IUIAutomationMultipleViewPattern* This,int *retVal) {
    return This->lpVtbl->get_CachedCurrentView(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationMultipleViewPattern_GetCachedSupportedViews(IUIAutomationMultipleViewPattern* This,SAFEARRAY **retVal) {
    return This->lpVtbl->GetCachedSupportedViews(This,retVal);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationMultipleViewPattern_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationObjectModelPattern interface
 */
#ifndef __IUIAutomationObjectModelPattern_INTERFACE_DEFINED__
#define __IUIAutomationObjectModelPattern_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationObjectModelPattern, 0x71c284b3, 0xc14d, 0x4d14, 0x98,0x1e, 0x19,0x75,0x1b,0x0d,0x75,0x6d);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("71c284b3-c14d-4d14-981e-19751b0d756d")
IUIAutomationObjectModelPattern : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetUnderlyingObjectModel(
        IUnknown **retVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationObjectModelPattern, 0x71c284b3, 0xc14d, 0x4d14, 0x98,0x1e, 0x19,0x75,0x1b,0x0d,0x75,0x6d)
#endif
#else
typedef struct IUIAutomationObjectModelPatternVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomationObjectModelPattern methods ***/
    HRESULT (STDMETHODCALLTYPE *GetUnderlyingObjectModel)(
        IUIAutomationObjectModelPattern *This,
        IUnknown **retVal);

    END_INTERFACE
} IUIAutomationObjectModelPatternVtbl;

interface IUIAutomationObjectModelPattern {
    CONST_VTBL IUIAutomationObjectModelPatternVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationObjectModelPattern_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationObjectModelPattern_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationObjectModelPattern_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationObjectModelPattern methods ***/
#define IUIAutomationObjectModelPattern_GetUnderlyingObjectModel(This,retVal) (This)->lpVtbl->GetUnderlyingObjectModel(This,retVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationObjectModelPattern_QueryInterface(IUIAutomationObjectModelPattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationObjectModelPattern_AddRef(IUIAutomationObjectModelPattern* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationObjectModelPattern_Release(IUIAutomationObjectModelPattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationObjectModelPattern methods ***/
static __WIDL_INLINE HRESULT IUIAutomationObjectModelPattern_GetUnderlyingObjectModel(IUIAutomationObjectModelPattern* This,IUnknown **retVal) {
    return This->lpVtbl->GetUnderlyingObjectModel(This,retVal);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationObjectModelPattern_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationRangeValuePattern interface
 */
#ifndef __IUIAutomationRangeValuePattern_INTERFACE_DEFINED__
#define __IUIAutomationRangeValuePattern_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationRangeValuePattern, 0x59213f4f, 0x7346, 0x49e5, 0xb1,0x20, 0x80,0x55,0x59,0x87,0xa1,0x48);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("59213f4f-7346-49e5-b120-80555987a148")
IUIAutomationRangeValuePattern : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetValue(
        double val) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CurrentValue(
        double *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CurrentIsReadOnly(
        WINBOOL *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CurrentMaximum(
        double *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CurrentMinimum(
        double *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CurrentLargeChange(
        double *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CurrentSmallChange(
        double *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CachedValue(
        double *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CachedIsReadOnly(
        WINBOOL *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CachedMaximum(
        double *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CachedMinimum(
        double *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CachedLargeChange(
        double *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CachedSmallChange(
        double *retVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationRangeValuePattern, 0x59213f4f, 0x7346, 0x49e5, 0xb1,0x20, 0x80,0x55,0x59,0x87,0xa1,0x48)
#endif
#else
typedef struct IUIAutomationRangeValuePatternVtbl {
    BEGIN_INTERFACE

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

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

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

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

    HRESULT (STDMETHODCALLTYPE *get_CurrentValue)(
        IUIAutomationRangeValuePattern *This,
        double *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsReadOnly)(
        IUIAutomationRangeValuePattern *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentMaximum)(
        IUIAutomationRangeValuePattern *This,
        double *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentMinimum)(
        IUIAutomationRangeValuePattern *This,
        double *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentLargeChange)(
        IUIAutomationRangeValuePattern *This,
        double *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentSmallChange)(
        IUIAutomationRangeValuePattern *This,
        double *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedValue)(
        IUIAutomationRangeValuePattern *This,
        double *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsReadOnly)(
        IUIAutomationRangeValuePattern *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedMaximum)(
        IUIAutomationRangeValuePattern *This,
        double *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedMinimum)(
        IUIAutomationRangeValuePattern *This,
        double *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedLargeChange)(
        IUIAutomationRangeValuePattern *This,
        double *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedSmallChange)(
        IUIAutomationRangeValuePattern *This,
        double *retVal);

    END_INTERFACE
} IUIAutomationRangeValuePatternVtbl;

interface IUIAutomationRangeValuePattern {
    CONST_VTBL IUIAutomationRangeValuePatternVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationRangeValuePattern_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationRangeValuePattern_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationRangeValuePattern_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationRangeValuePattern methods ***/
#define IUIAutomationRangeValuePattern_SetValue(This,val) (This)->lpVtbl->SetValue(This,val)
#define IUIAutomationRangeValuePattern_get_CurrentValue(This,retVal) (This)->lpVtbl->get_CurrentValue(This,retVal)
#define IUIAutomationRangeValuePattern_get_CurrentIsReadOnly(This,retVal) (This)->lpVtbl->get_CurrentIsReadOnly(This,retVal)
#define IUIAutomationRangeValuePattern_get_CurrentMaximum(This,retVal) (This)->lpVtbl->get_CurrentMaximum(This,retVal)
#define IUIAutomationRangeValuePattern_get_CurrentMinimum(This,retVal) (This)->lpVtbl->get_CurrentMinimum(This,retVal)
#define IUIAutomationRangeValuePattern_get_CurrentLargeChange(This,retVal) (This)->lpVtbl->get_CurrentLargeChange(This,retVal)
#define IUIAutomationRangeValuePattern_get_CurrentSmallChange(This,retVal) (This)->lpVtbl->get_CurrentSmallChange(This,retVal)
#define IUIAutomationRangeValuePattern_get_CachedValue(This,retVal) (This)->lpVtbl->get_CachedValue(This,retVal)
#define IUIAutomationRangeValuePattern_get_CachedIsReadOnly(This,retVal) (This)->lpVtbl->get_CachedIsReadOnly(This,retVal)
#define IUIAutomationRangeValuePattern_get_CachedMaximum(This,retVal) (This)->lpVtbl->get_CachedMaximum(This,retVal)
#define IUIAutomationRangeValuePattern_get_CachedMinimum(This,retVal) (This)->lpVtbl->get_CachedMinimum(This,retVal)
#define IUIAutomationRangeValuePattern_get_CachedLargeChange(This,retVal) (This)->lpVtbl->get_CachedLargeChange(This,retVal)
#define IUIAutomationRangeValuePattern_get_CachedSmallChange(This,retVal) (This)->lpVtbl->get_CachedSmallChange(This,retVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationRangeValuePattern_QueryInterface(IUIAutomationRangeValuePattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationRangeValuePattern_AddRef(IUIAutomationRangeValuePattern* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationRangeValuePattern_Release(IUIAutomationRangeValuePattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationRangeValuePattern methods ***/
static __WIDL_INLINE HRESULT IUIAutomationRangeValuePattern_SetValue(IUIAutomationRangeValuePattern* This,double val) {
    return This->lpVtbl->SetValue(This,val);
}
static __WIDL_INLINE HRESULT IUIAutomationRangeValuePattern_get_CurrentValue(IUIAutomationRangeValuePattern* This,double *retVal) {
    return This->lpVtbl->get_CurrentValue(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationRangeValuePattern_get_CurrentIsReadOnly(IUIAutomationRangeValuePattern* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsReadOnly(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationRangeValuePattern_get_CurrentMaximum(IUIAutomationRangeValuePattern* This,double *retVal) {
    return This->lpVtbl->get_CurrentMaximum(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationRangeValuePattern_get_CurrentMinimum(IUIAutomationRangeValuePattern* This,double *retVal) {
    return This->lpVtbl->get_CurrentMinimum(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationRangeValuePattern_get_CurrentLargeChange(IUIAutomationRangeValuePattern* This,double *retVal) {
    return This->lpVtbl->get_CurrentLargeChange(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationRangeValuePattern_get_CurrentSmallChange(IUIAutomationRangeValuePattern* This,double *retVal) {
    return This->lpVtbl->get_CurrentSmallChange(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationRangeValuePattern_get_CachedValue(IUIAutomationRangeValuePattern* This,double *retVal) {
    return This->lpVtbl->get_CachedValue(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationRangeValuePattern_get_CachedIsReadOnly(IUIAutomationRangeValuePattern* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsReadOnly(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationRangeValuePattern_get_CachedMaximum(IUIAutomationRangeValuePattern* This,double *retVal) {
    return This->lpVtbl->get_CachedMaximum(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationRangeValuePattern_get_CachedMinimum(IUIAutomationRangeValuePattern* This,double *retVal) {
    return This->lpVtbl->get_CachedMinimum(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationRangeValuePattern_get_CachedLargeChange(IUIAutomationRangeValuePattern* This,double *retVal) {
    return This->lpVtbl->get_CachedLargeChange(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationRangeValuePattern_get_CachedSmallChange(IUIAutomationRangeValuePattern* This,double *retVal) {
    return This->lpVtbl->get_CachedSmallChange(This,retVal);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationRangeValuePattern_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationScrollPattern interface
 */
#ifndef __IUIAutomationScrollPattern_INTERFACE_DEFINED__
#define __IUIAutomationScrollPattern_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationScrollPattern, 0x88f4d42a, 0xe881, 0x459d, 0xa7,0x7c, 0x73,0xbb,0xbb,0x7e,0x02,0xdc);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("88f4d42a-e881-459d-a77c-73bbbb7e02dc")
IUIAutomationScrollPattern : 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_CurrentHorizontalScrollPercent(
        double *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CurrentVerticalScrollPercent(
        double *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CurrentHorizontalViewSize(
        double *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CurrentVerticalViewSize(
        double *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CurrentHorizontallyScrollable(
        WINBOOL *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CurrentVerticallyScrollable(
        WINBOOL *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CachedHorizontalScrollPercent(
        double *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CachedVerticalScrollPercent(
        double *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CachedHorizontalViewSize(
        double *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CachedVerticalViewSize(
        double *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CachedHorizontallyScrollable(
        WINBOOL *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CachedVerticallyScrollable(
        WINBOOL *retVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationScrollPattern, 0x88f4d42a, 0xe881, 0x459d, 0xa7,0x7c, 0x73,0xbb,0xbb,0x7e,0x02,0xdc)
#endif
#else
typedef struct IUIAutomationScrollPatternVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

    HRESULT (STDMETHODCALLTYPE *get_CurrentHorizontalScrollPercent)(
        IUIAutomationScrollPattern *This,
        double *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentVerticalScrollPercent)(
        IUIAutomationScrollPattern *This,
        double *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentHorizontalViewSize)(
        IUIAutomationScrollPattern *This,
        double *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentVerticalViewSize)(
        IUIAutomationScrollPattern *This,
        double *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentHorizontallyScrollable)(
        IUIAutomationScrollPattern *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentVerticallyScrollable)(
        IUIAutomationScrollPattern *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedHorizontalScrollPercent)(
        IUIAutomationScrollPattern *This,
        double *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedVerticalScrollPercent)(
        IUIAutomationScrollPattern *This,
        double *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedHorizontalViewSize)(
        IUIAutomationScrollPattern *This,
        double *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedVerticalViewSize)(
        IUIAutomationScrollPattern *This,
        double *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedHorizontallyScrollable)(
        IUIAutomationScrollPattern *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedVerticallyScrollable)(
        IUIAutomationScrollPattern *This,
        WINBOOL *retVal);

    END_INTERFACE
} IUIAutomationScrollPatternVtbl;

interface IUIAutomationScrollPattern {
    CONST_VTBL IUIAutomationScrollPatternVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationScrollPattern_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationScrollPattern_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationScrollPattern_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationScrollPattern methods ***/
#define IUIAutomationScrollPattern_Scroll(This,horizontalAmount,verticalAmount) (This)->lpVtbl->Scroll(This,horizontalAmount,verticalAmount)
#define IUIAutomationScrollPattern_SetScrollPercent(This,horizontalPercent,verticalPercent) (This)->lpVtbl->SetScrollPercent(This,horizontalPercent,verticalPercent)
#define IUIAutomationScrollPattern_get_CurrentHorizontalScrollPercent(This,retVal) (This)->lpVtbl->get_CurrentHorizontalScrollPercent(This,retVal)
#define IUIAutomationScrollPattern_get_CurrentVerticalScrollPercent(This,retVal) (This)->lpVtbl->get_CurrentVerticalScrollPercent(This,retVal)
#define IUIAutomationScrollPattern_get_CurrentHorizontalViewSize(This,retVal) (This)->lpVtbl->get_CurrentHorizontalViewSize(This,retVal)
#define IUIAutomationScrollPattern_get_CurrentVerticalViewSize(This,retVal) (This)->lpVtbl->get_CurrentVerticalViewSize(This,retVal)
#define IUIAutomationScrollPattern_get_CurrentHorizontallyScrollable(This,retVal) (This)->lpVtbl->get_CurrentHorizontallyScrollable(This,retVal)
#define IUIAutomationScrollPattern_get_CurrentVerticallyScrollable(This,retVal) (This)->lpVtbl->get_CurrentVerticallyScrollable(This,retVal)
#define IUIAutomationScrollPattern_get_CachedHorizontalScrollPercent(This,retVal) (This)->lpVtbl->get_CachedHorizontalScrollPercent(This,retVal)
#define IUIAutomationScrollPattern_get_CachedVerticalScrollPercent(This,retVal) (This)->lpVtbl->get_CachedVerticalScrollPercent(This,retVal)
#define IUIAutomationScrollPattern_get_CachedHorizontalViewSize(This,retVal) (This)->lpVtbl->get_CachedHorizontalViewSize(This,retVal)
#define IUIAutomationScrollPattern_get_CachedVerticalViewSize(This,retVal) (This)->lpVtbl->get_CachedVerticalViewSize(This,retVal)
#define IUIAutomationScrollPattern_get_CachedHorizontallyScrollable(This,retVal) (This)->lpVtbl->get_CachedHorizontallyScrollable(This,retVal)
#define IUIAutomationScrollPattern_get_CachedVerticallyScrollable(This,retVal) (This)->lpVtbl->get_CachedVerticallyScrollable(This,retVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationScrollPattern_QueryInterface(IUIAutomationScrollPattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationScrollPattern_AddRef(IUIAutomationScrollPattern* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationScrollPattern_Release(IUIAutomationScrollPattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationScrollPattern methods ***/
static __WIDL_INLINE HRESULT IUIAutomationScrollPattern_Scroll(IUIAutomationScrollPattern* This,enum ScrollAmount horizontalAmount,enum ScrollAmount verticalAmount) {
    return This->lpVtbl->Scroll(This,horizontalAmount,verticalAmount);
}
static __WIDL_INLINE HRESULT IUIAutomationScrollPattern_SetScrollPercent(IUIAutomationScrollPattern* This,double horizontalPercent,double verticalPercent) {
    return This->lpVtbl->SetScrollPercent(This,horizontalPercent,verticalPercent);
}
static __WIDL_INLINE HRESULT IUIAutomationScrollPattern_get_CurrentHorizontalScrollPercent(IUIAutomationScrollPattern* This,double *retVal) {
    return This->lpVtbl->get_CurrentHorizontalScrollPercent(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationScrollPattern_get_CurrentVerticalScrollPercent(IUIAutomationScrollPattern* This,double *retVal) {
    return This->lpVtbl->get_CurrentVerticalScrollPercent(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationScrollPattern_get_CurrentHorizontalViewSize(IUIAutomationScrollPattern* This,double *retVal) {
    return This->lpVtbl->get_CurrentHorizontalViewSize(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationScrollPattern_get_CurrentVerticalViewSize(IUIAutomationScrollPattern* This,double *retVal) {
    return This->lpVtbl->get_CurrentVerticalViewSize(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationScrollPattern_get_CurrentHorizontallyScrollable(IUIAutomationScrollPattern* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentHorizontallyScrollable(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationScrollPattern_get_CurrentVerticallyScrollable(IUIAutomationScrollPattern* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentVerticallyScrollable(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationScrollPattern_get_CachedHorizontalScrollPercent(IUIAutomationScrollPattern* This,double *retVal) {
    return This->lpVtbl->get_CachedHorizontalScrollPercent(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationScrollPattern_get_CachedVerticalScrollPercent(IUIAutomationScrollPattern* This,double *retVal) {
    return This->lpVtbl->get_CachedVerticalScrollPercent(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationScrollPattern_get_CachedHorizontalViewSize(IUIAutomationScrollPattern* This,double *retVal) {
    return This->lpVtbl->get_CachedHorizontalViewSize(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationScrollPattern_get_CachedVerticalViewSize(IUIAutomationScrollPattern* This,double *retVal) {
    return This->lpVtbl->get_CachedVerticalViewSize(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationScrollPattern_get_CachedHorizontallyScrollable(IUIAutomationScrollPattern* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedHorizontallyScrollable(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationScrollPattern_get_CachedVerticallyScrollable(IUIAutomationScrollPattern* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedVerticallyScrollable(This,retVal);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationScrollPattern_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationScrollItemPattern interface
 */
#ifndef __IUIAutomationScrollItemPattern_INTERFACE_DEFINED__
#define __IUIAutomationScrollItemPattern_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationScrollItemPattern, 0xb488300f, 0xd015, 0x4f19, 0x9c,0x29, 0xbb,0x59,0x5e,0x36,0x45,0xef);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("b488300f-d015-4f19-9c29-bb595e3645ef")
IUIAutomationScrollItemPattern : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE ScrollIntoView(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationScrollItemPattern, 0xb488300f, 0xd015, 0x4f19, 0x9c,0x29, 0xbb,0x59,0x5e,0x36,0x45,0xef)
#endif
#else
typedef struct IUIAutomationScrollItemPatternVtbl {
    BEGIN_INTERFACE

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

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

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

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

    END_INTERFACE
} IUIAutomationScrollItemPatternVtbl;

interface IUIAutomationScrollItemPattern {
    CONST_VTBL IUIAutomationScrollItemPatternVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationScrollItemPattern_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationScrollItemPattern_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationScrollItemPattern_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationScrollItemPattern methods ***/
#define IUIAutomationScrollItemPattern_ScrollIntoView(This) (This)->lpVtbl->ScrollIntoView(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationScrollItemPattern_QueryInterface(IUIAutomationScrollItemPattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationScrollItemPattern_AddRef(IUIAutomationScrollItemPattern* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationScrollItemPattern_Release(IUIAutomationScrollItemPattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationScrollItemPattern methods ***/
static __WIDL_INLINE HRESULT IUIAutomationScrollItemPattern_ScrollIntoView(IUIAutomationScrollItemPattern* This) {
    return This->lpVtbl->ScrollIntoView(This);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationScrollItemPattern_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationSelectionPattern interface
 */
#ifndef __IUIAutomationSelectionPattern_INTERFACE_DEFINED__
#define __IUIAutomationSelectionPattern_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationSelectionPattern, 0x5ed5202e, 0xb2ac, 0x47a6, 0xb6,0x38, 0x4b,0x0b,0xf1,0x40,0xd7,0x8e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("5ed5202e-b2ac-47a6-b638-4b0bf140d78e")
IUIAutomationSelectionPattern : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetCurrentSelection(
        IUIAutomationElementArray **retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CurrentCanSelectMultiple(
        WINBOOL *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CurrentIsSelectionRequired(
        WINBOOL *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCachedSelection(
        IUIAutomationElementArray **retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CachedCanSelectMultiple(
        WINBOOL *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CachedIsSelectionRequired(
        WINBOOL *retVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationSelectionPattern, 0x5ed5202e, 0xb2ac, 0x47a6, 0xb6,0x38, 0x4b,0x0b,0xf1,0x40,0xd7,0x8e)
#endif
#else
typedef struct IUIAutomationSelectionPatternVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomationSelectionPattern methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCurrentSelection)(
        IUIAutomationSelectionPattern *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentCanSelectMultiple)(
        IUIAutomationSelectionPattern *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsSelectionRequired)(
        IUIAutomationSelectionPattern *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *GetCachedSelection)(
        IUIAutomationSelectionPattern *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedCanSelectMultiple)(
        IUIAutomationSelectionPattern *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsSelectionRequired)(
        IUIAutomationSelectionPattern *This,
        WINBOOL *retVal);

    END_INTERFACE
} IUIAutomationSelectionPatternVtbl;

interface IUIAutomationSelectionPattern {
    CONST_VTBL IUIAutomationSelectionPatternVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationSelectionPattern_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationSelectionPattern_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationSelectionPattern_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationSelectionPattern methods ***/
#define IUIAutomationSelectionPattern_GetCurrentSelection(This,retVal) (This)->lpVtbl->GetCurrentSelection(This,retVal)
#define IUIAutomationSelectionPattern_get_CurrentCanSelectMultiple(This,retVal) (This)->lpVtbl->get_CurrentCanSelectMultiple(This,retVal)
#define IUIAutomationSelectionPattern_get_CurrentIsSelectionRequired(This,retVal) (This)->lpVtbl->get_CurrentIsSelectionRequired(This,retVal)
#define IUIAutomationSelectionPattern_GetCachedSelection(This,retVal) (This)->lpVtbl->GetCachedSelection(This,retVal)
#define IUIAutomationSelectionPattern_get_CachedCanSelectMultiple(This,retVal) (This)->lpVtbl->get_CachedCanSelectMultiple(This,retVal)
#define IUIAutomationSelectionPattern_get_CachedIsSelectionRequired(This,retVal) (This)->lpVtbl->get_CachedIsSelectionRequired(This,retVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationSelectionPattern_QueryInterface(IUIAutomationSelectionPattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationSelectionPattern_AddRef(IUIAutomationSelectionPattern* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationSelectionPattern_Release(IUIAutomationSelectionPattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationSelectionPattern methods ***/
static __WIDL_INLINE HRESULT IUIAutomationSelectionPattern_GetCurrentSelection(IUIAutomationSelectionPattern* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->GetCurrentSelection(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationSelectionPattern_get_CurrentCanSelectMultiple(IUIAutomationSelectionPattern* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentCanSelectMultiple(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationSelectionPattern_get_CurrentIsSelectionRequired(IUIAutomationSelectionPattern* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsSelectionRequired(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationSelectionPattern_GetCachedSelection(IUIAutomationSelectionPattern* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->GetCachedSelection(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationSelectionPattern_get_CachedCanSelectMultiple(IUIAutomationSelectionPattern* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedCanSelectMultiple(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationSelectionPattern_get_CachedIsSelectionRequired(IUIAutomationSelectionPattern* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsSelectionRequired(This,retVal);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationSelectionPattern_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationSelectionItemPattern interface
 */
#ifndef __IUIAutomationSelectionItemPattern_INTERFACE_DEFINED__
#define __IUIAutomationSelectionItemPattern_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationSelectionItemPattern, 0xa8efa66a, 0x0fda, 0x421a, 0x91,0x94, 0x38,0x02,0x1f,0x35,0x78,0xea);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a8efa66a-0fda-421a-9194-38021f3578ea")
IUIAutomationSelectionItemPattern : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Select(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddToSelection(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveFromSelection(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CurrentIsSelected(
        WINBOOL *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CurrentSelectionContainer(
        IUIAutomationElement **retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CachedIsSelected(
        WINBOOL *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CachedSelectionContainer(
        IUIAutomationElement **retVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationSelectionItemPattern, 0xa8efa66a, 0x0fda, 0x421a, 0x91,0x94, 0x38,0x02,0x1f,0x35,0x78,0xea)
#endif
#else
typedef struct IUIAutomationSelectionItemPatternVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsSelected)(
        IUIAutomationSelectionItemPattern *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentSelectionContainer)(
        IUIAutomationSelectionItemPattern *This,
        IUIAutomationElement **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsSelected)(
        IUIAutomationSelectionItemPattern *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedSelectionContainer)(
        IUIAutomationSelectionItemPattern *This,
        IUIAutomationElement **retVal);

    END_INTERFACE
} IUIAutomationSelectionItemPatternVtbl;

interface IUIAutomationSelectionItemPattern {
    CONST_VTBL IUIAutomationSelectionItemPatternVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationSelectionItemPattern_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationSelectionItemPattern_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationSelectionItemPattern_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationSelectionItemPattern methods ***/
#define IUIAutomationSelectionItemPattern_Select(This) (This)->lpVtbl->Select(This)
#define IUIAutomationSelectionItemPattern_AddToSelection(This) (This)->lpVtbl->AddToSelection(This)
#define IUIAutomationSelectionItemPattern_RemoveFromSelection(This) (This)->lpVtbl->RemoveFromSelection(This)
#define IUIAutomationSelectionItemPattern_get_CurrentIsSelected(This,retVal) (This)->lpVtbl->get_CurrentIsSelected(This,retVal)
#define IUIAutomationSelectionItemPattern_get_CurrentSelectionContainer(This,retVal) (This)->lpVtbl->get_CurrentSelectionContainer(This,retVal)
#define IUIAutomationSelectionItemPattern_get_CachedIsSelected(This,retVal) (This)->lpVtbl->get_CachedIsSelected(This,retVal)
#define IUIAutomationSelectionItemPattern_get_CachedSelectionContainer(This,retVal) (This)->lpVtbl->get_CachedSelectionContainer(This,retVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationSelectionItemPattern_QueryInterface(IUIAutomationSelectionItemPattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationSelectionItemPattern_AddRef(IUIAutomationSelectionItemPattern* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationSelectionItemPattern_Release(IUIAutomationSelectionItemPattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationSelectionItemPattern methods ***/
static __WIDL_INLINE HRESULT IUIAutomationSelectionItemPattern_Select(IUIAutomationSelectionItemPattern* This) {
    return This->lpVtbl->Select(This);
}
static __WIDL_INLINE HRESULT IUIAutomationSelectionItemPattern_AddToSelection(IUIAutomationSelectionItemPattern* This) {
    return This->lpVtbl->AddToSelection(This);
}
static __WIDL_INLINE HRESULT IUIAutomationSelectionItemPattern_RemoveFromSelection(IUIAutomationSelectionItemPattern* This) {
    return This->lpVtbl->RemoveFromSelection(This);
}
static __WIDL_INLINE HRESULT IUIAutomationSelectionItemPattern_get_CurrentIsSelected(IUIAutomationSelectionItemPattern* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsSelected(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationSelectionItemPattern_get_CurrentSelectionContainer(IUIAutomationSelectionItemPattern* This,IUIAutomationElement **retVal) {
    return This->lpVtbl->get_CurrentSelectionContainer(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationSelectionItemPattern_get_CachedIsSelected(IUIAutomationSelectionItemPattern* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsSelected(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationSelectionItemPattern_get_CachedSelectionContainer(IUIAutomationSelectionItemPattern* This,IUIAutomationElement **retVal) {
    return This->lpVtbl->get_CachedSelectionContainer(This,retVal);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationSelectionItemPattern_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationSynchronizedInputPattern interface
 */
#ifndef __IUIAutomationSynchronizedInputPattern_INTERFACE_DEFINED__
#define __IUIAutomationSynchronizedInputPattern_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationSynchronizedInputPattern, 0x2233be0b, 0xafb7, 0x448b, 0x9f,0xda, 0x3b,0x37,0x8a,0xa5,0xea,0xe1);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2233be0b-afb7-448b-9fda-3b378aa5eae1")
IUIAutomationSynchronizedInputPattern : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE StartListening(
        enum SynchronizedInputType inputType) = 0;

    virtual HRESULT STDMETHODCALLTYPE Cancel(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationSynchronizedInputPattern, 0x2233be0b, 0xafb7, 0x448b, 0x9f,0xda, 0x3b,0x37,0x8a,0xa5,0xea,0xe1)
#endif
#else
typedef struct IUIAutomationSynchronizedInputPatternVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

    END_INTERFACE
} IUIAutomationSynchronizedInputPatternVtbl;

interface IUIAutomationSynchronizedInputPattern {
    CONST_VTBL IUIAutomationSynchronizedInputPatternVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationSynchronizedInputPattern_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationSynchronizedInputPattern_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationSynchronizedInputPattern_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationSynchronizedInputPattern methods ***/
#define IUIAutomationSynchronizedInputPattern_StartListening(This,inputType) (This)->lpVtbl->StartListening(This,inputType)
#define IUIAutomationSynchronizedInputPattern_Cancel(This) (This)->lpVtbl->Cancel(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationSynchronizedInputPattern_QueryInterface(IUIAutomationSynchronizedInputPattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationSynchronizedInputPattern_AddRef(IUIAutomationSynchronizedInputPattern* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationSynchronizedInputPattern_Release(IUIAutomationSynchronizedInputPattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationSynchronizedInputPattern methods ***/
static __WIDL_INLINE HRESULT IUIAutomationSynchronizedInputPattern_StartListening(IUIAutomationSynchronizedInputPattern* This,enum SynchronizedInputType inputType) {
    return This->lpVtbl->StartListening(This,inputType);
}
static __WIDL_INLINE HRESULT IUIAutomationSynchronizedInputPattern_Cancel(IUIAutomationSynchronizedInputPattern* This) {
    return This->lpVtbl->Cancel(This);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationSynchronizedInputPattern_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationTablePattern interface
 */
#ifndef __IUIAutomationTablePattern_INTERFACE_DEFINED__
#define __IUIAutomationTablePattern_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationTablePattern, 0x620e691c, 0xea96, 0x4710, 0xa8,0x50, 0x75,0x4b,0x24,0xce,0x24,0x17);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("620e691c-ea96-4710-a850-754b24ce2417")
IUIAutomationTablePattern : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetCurrentRowHeaders(
        IUIAutomationElementArray **retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrentColumnHeaders(
        IUIAutomationElementArray **retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CurrentRowOrColumnMajor(
        enum RowOrColumnMajor *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCachedRowHeaders(
        IUIAutomationElementArray **retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCachedColumnHeaders(
        IUIAutomationElementArray **retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CachedRowOrColumnMajor(
        enum RowOrColumnMajor *retVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationTablePattern, 0x620e691c, 0xea96, 0x4710, 0xa8,0x50, 0x75,0x4b,0x24,0xce,0x24,0x17)
#endif
#else
typedef struct IUIAutomationTablePatternVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomationTablePattern methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCurrentRowHeaders)(
        IUIAutomationTablePattern *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *GetCurrentColumnHeaders)(
        IUIAutomationTablePattern *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentRowOrColumnMajor)(
        IUIAutomationTablePattern *This,
        enum RowOrColumnMajor *retVal);

    HRESULT (STDMETHODCALLTYPE *GetCachedRowHeaders)(
        IUIAutomationTablePattern *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *GetCachedColumnHeaders)(
        IUIAutomationTablePattern *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedRowOrColumnMajor)(
        IUIAutomationTablePattern *This,
        enum RowOrColumnMajor *retVal);

    END_INTERFACE
} IUIAutomationTablePatternVtbl;

interface IUIAutomationTablePattern {
    CONST_VTBL IUIAutomationTablePatternVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationTablePattern_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationTablePattern_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationTablePattern_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationTablePattern methods ***/
#define IUIAutomationTablePattern_GetCurrentRowHeaders(This,retVal) (This)->lpVtbl->GetCurrentRowHeaders(This,retVal)
#define IUIAutomationTablePattern_GetCurrentColumnHeaders(This,retVal) (This)->lpVtbl->GetCurrentColumnHeaders(This,retVal)
#define IUIAutomationTablePattern_get_CurrentRowOrColumnMajor(This,retVal) (This)->lpVtbl->get_CurrentRowOrColumnMajor(This,retVal)
#define IUIAutomationTablePattern_GetCachedRowHeaders(This,retVal) (This)->lpVtbl->GetCachedRowHeaders(This,retVal)
#define IUIAutomationTablePattern_GetCachedColumnHeaders(This,retVal) (This)->lpVtbl->GetCachedColumnHeaders(This,retVal)
#define IUIAutomationTablePattern_get_CachedRowOrColumnMajor(This,retVal) (This)->lpVtbl->get_CachedRowOrColumnMajor(This,retVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationTablePattern_QueryInterface(IUIAutomationTablePattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationTablePattern_AddRef(IUIAutomationTablePattern* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationTablePattern_Release(IUIAutomationTablePattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationTablePattern methods ***/
static __WIDL_INLINE HRESULT IUIAutomationTablePattern_GetCurrentRowHeaders(IUIAutomationTablePattern* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->GetCurrentRowHeaders(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationTablePattern_GetCurrentColumnHeaders(IUIAutomationTablePattern* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->GetCurrentColumnHeaders(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationTablePattern_get_CurrentRowOrColumnMajor(IUIAutomationTablePattern* This,enum RowOrColumnMajor *retVal) {
    return This->lpVtbl->get_CurrentRowOrColumnMajor(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationTablePattern_GetCachedRowHeaders(IUIAutomationTablePattern* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->GetCachedRowHeaders(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationTablePattern_GetCachedColumnHeaders(IUIAutomationTablePattern* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->GetCachedColumnHeaders(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationTablePattern_get_CachedRowOrColumnMajor(IUIAutomationTablePattern* This,enum RowOrColumnMajor *retVal) {
    return This->lpVtbl->get_CachedRowOrColumnMajor(This,retVal);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationTablePattern_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationTableItemPattern interface
 */
#ifndef __IUIAutomationTableItemPattern_INTERFACE_DEFINED__
#define __IUIAutomationTableItemPattern_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationTableItemPattern, 0x0b964eb3, 0xef2e, 0x4464, 0x9c,0x79, 0x61,0xd6,0x17,0x37,0xa2,0x7e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("0b964eb3-ef2e-4464-9c79-61d61737a27e")
IUIAutomationTableItemPattern : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetCurrentRowHeaderItems(
        IUIAutomationElementArray **retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrentColumnHeaderItems(
        IUIAutomationElementArray **retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCachedRowHeaderItems(
        IUIAutomationElementArray **retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCachedColumnHeaderItems(
        IUIAutomationElementArray **retVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationTableItemPattern, 0x0b964eb3, 0xef2e, 0x4464, 0x9c,0x79, 0x61,0xd6,0x17,0x37,0xa2,0x7e)
#endif
#else
typedef struct IUIAutomationTableItemPatternVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomationTableItemPattern methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCurrentRowHeaderItems)(
        IUIAutomationTableItemPattern *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *GetCurrentColumnHeaderItems)(
        IUIAutomationTableItemPattern *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *GetCachedRowHeaderItems)(
        IUIAutomationTableItemPattern *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *GetCachedColumnHeaderItems)(
        IUIAutomationTableItemPattern *This,
        IUIAutomationElementArray **retVal);

    END_INTERFACE
} IUIAutomationTableItemPatternVtbl;

interface IUIAutomationTableItemPattern {
    CONST_VTBL IUIAutomationTableItemPatternVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationTableItemPattern_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationTableItemPattern_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationTableItemPattern_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationTableItemPattern methods ***/
#define IUIAutomationTableItemPattern_GetCurrentRowHeaderItems(This,retVal) (This)->lpVtbl->GetCurrentRowHeaderItems(This,retVal)
#define IUIAutomationTableItemPattern_GetCurrentColumnHeaderItems(This,retVal) (This)->lpVtbl->GetCurrentColumnHeaderItems(This,retVal)
#define IUIAutomationTableItemPattern_GetCachedRowHeaderItems(This,retVal) (This)->lpVtbl->GetCachedRowHeaderItems(This,retVal)
#define IUIAutomationTableItemPattern_GetCachedColumnHeaderItems(This,retVal) (This)->lpVtbl->GetCachedColumnHeaderItems(This,retVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationTableItemPattern_QueryInterface(IUIAutomationTableItemPattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationTableItemPattern_AddRef(IUIAutomationTableItemPattern* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationTableItemPattern_Release(IUIAutomationTableItemPattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationTableItemPattern methods ***/
static __WIDL_INLINE HRESULT IUIAutomationTableItemPattern_GetCurrentRowHeaderItems(IUIAutomationTableItemPattern* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->GetCurrentRowHeaderItems(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationTableItemPattern_GetCurrentColumnHeaderItems(IUIAutomationTableItemPattern* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->GetCurrentColumnHeaderItems(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationTableItemPattern_GetCachedRowHeaderItems(IUIAutomationTableItemPattern* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->GetCachedRowHeaderItems(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationTableItemPattern_GetCachedColumnHeaderItems(IUIAutomationTableItemPattern* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->GetCachedColumnHeaderItems(This,retVal);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationTableItemPattern_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationTogglePattern interface
 */
#ifndef __IUIAutomationTogglePattern_INTERFACE_DEFINED__
#define __IUIAutomationTogglePattern_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationTogglePattern, 0x94cf8058, 0x9b8d, 0x4ab9, 0x8b,0xfd, 0x4c,0xd0,0xa3,0x3c,0x8c,0x70);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("94cf8058-9b8d-4ab9-8bfd-4cd0a33c8c70")
IUIAutomationTogglePattern : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Toggle(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CurrentToggleState(
        enum ToggleState *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CachedToggleState(
        enum ToggleState *retVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationTogglePattern, 0x94cf8058, 0x9b8d, 0x4ab9, 0x8b,0xfd, 0x4c,0xd0,0xa3,0x3c,0x8c,0x70)
#endif
#else
typedef struct IUIAutomationTogglePatternVtbl {
    BEGIN_INTERFACE

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

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

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

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

    HRESULT (STDMETHODCALLTYPE *get_CurrentToggleState)(
        IUIAutomationTogglePattern *This,
        enum ToggleState *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedToggleState)(
        IUIAutomationTogglePattern *This,
        enum ToggleState *retVal);

    END_INTERFACE
} IUIAutomationTogglePatternVtbl;

interface IUIAutomationTogglePattern {
    CONST_VTBL IUIAutomationTogglePatternVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationTogglePattern_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationTogglePattern_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationTogglePattern_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationTogglePattern methods ***/
#define IUIAutomationTogglePattern_Toggle(This) (This)->lpVtbl->Toggle(This)
#define IUIAutomationTogglePattern_get_CurrentToggleState(This,retVal) (This)->lpVtbl->get_CurrentToggleState(This,retVal)
#define IUIAutomationTogglePattern_get_CachedToggleState(This,retVal) (This)->lpVtbl->get_CachedToggleState(This,retVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationTogglePattern_QueryInterface(IUIAutomationTogglePattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationTogglePattern_AddRef(IUIAutomationTogglePattern* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationTogglePattern_Release(IUIAutomationTogglePattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationTogglePattern methods ***/
static __WIDL_INLINE HRESULT IUIAutomationTogglePattern_Toggle(IUIAutomationTogglePattern* This) {
    return This->lpVtbl->Toggle(This);
}
static __WIDL_INLINE HRESULT IUIAutomationTogglePattern_get_CurrentToggleState(IUIAutomationTogglePattern* This,enum ToggleState *retVal) {
    return This->lpVtbl->get_CurrentToggleState(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationTogglePattern_get_CachedToggleState(IUIAutomationTogglePattern* This,enum ToggleState *retVal) {
    return This->lpVtbl->get_CachedToggleState(This,retVal);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationTogglePattern_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationTransformPattern interface
 */
#ifndef __IUIAutomationTransformPattern_INTERFACE_DEFINED__
#define __IUIAutomationTransformPattern_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationTransformPattern, 0xa9b55844, 0xa55d, 0x4ef0, 0x92,0x6d, 0x56,0x9c,0x16,0xff,0x89,0xbb);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a9b55844-a55d-4ef0-926d-569c16ff89bb")
IUIAutomationTransformPattern : 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_CurrentCanMove(
        WINBOOL *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CurrentCanResize(
        WINBOOL *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CurrentCanRotate(
        WINBOOL *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CachedCanMove(
        WINBOOL *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CachedCanResize(
        WINBOOL *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CachedCanRotate(
        WINBOOL *retVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationTransformPattern, 0xa9b55844, 0xa55d, 0x4ef0, 0x92,0x6d, 0x56,0x9c,0x16,0xff,0x89,0xbb)
#endif
#else
typedef struct IUIAutomationTransformPatternVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    HRESULT (STDMETHODCALLTYPE *get_CurrentCanMove)(
        IUIAutomationTransformPattern *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentCanResize)(
        IUIAutomationTransformPattern *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentCanRotate)(
        IUIAutomationTransformPattern *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedCanMove)(
        IUIAutomationTransformPattern *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedCanResize)(
        IUIAutomationTransformPattern *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedCanRotate)(
        IUIAutomationTransformPattern *This,
        WINBOOL *retVal);

    END_INTERFACE
} IUIAutomationTransformPatternVtbl;

interface IUIAutomationTransformPattern {
    CONST_VTBL IUIAutomationTransformPatternVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationTransformPattern_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationTransformPattern_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationTransformPattern_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationTransformPattern methods ***/
#define IUIAutomationTransformPattern_Move(This,x,y) (This)->lpVtbl->Move(This,x,y)
#define IUIAutomationTransformPattern_Resize(This,width,height) (This)->lpVtbl->Resize(This,width,height)
#define IUIAutomationTransformPattern_Rotate(This,degrees) (This)->lpVtbl->Rotate(This,degrees)
#define IUIAutomationTransformPattern_get_CurrentCanMove(This,retVal) (This)->lpVtbl->get_CurrentCanMove(This,retVal)
#define IUIAutomationTransformPattern_get_CurrentCanResize(This,retVal) (This)->lpVtbl->get_CurrentCanResize(This,retVal)
#define IUIAutomationTransformPattern_get_CurrentCanRotate(This,retVal) (This)->lpVtbl->get_CurrentCanRotate(This,retVal)
#define IUIAutomationTransformPattern_get_CachedCanMove(This,retVal) (This)->lpVtbl->get_CachedCanMove(This,retVal)
#define IUIAutomationTransformPattern_get_CachedCanResize(This,retVal) (This)->lpVtbl->get_CachedCanResize(This,retVal)
#define IUIAutomationTransformPattern_get_CachedCanRotate(This,retVal) (This)->lpVtbl->get_CachedCanRotate(This,retVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationTransformPattern_QueryInterface(IUIAutomationTransformPattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationTransformPattern_AddRef(IUIAutomationTransformPattern* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationTransformPattern_Release(IUIAutomationTransformPattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationTransformPattern methods ***/
static __WIDL_INLINE HRESULT IUIAutomationTransformPattern_Move(IUIAutomationTransformPattern* This,double x,double y) {
    return This->lpVtbl->Move(This,x,y);
}
static __WIDL_INLINE HRESULT IUIAutomationTransformPattern_Resize(IUIAutomationTransformPattern* This,double width,double height) {
    return This->lpVtbl->Resize(This,width,height);
}
static __WIDL_INLINE HRESULT IUIAutomationTransformPattern_Rotate(IUIAutomationTransformPattern* This,double degrees) {
    return This->lpVtbl->Rotate(This,degrees);
}
static __WIDL_INLINE HRESULT IUIAutomationTransformPattern_get_CurrentCanMove(IUIAutomationTransformPattern* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentCanMove(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationTransformPattern_get_CurrentCanResize(IUIAutomationTransformPattern* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentCanResize(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationTransformPattern_get_CurrentCanRotate(IUIAutomationTransformPattern* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentCanRotate(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationTransformPattern_get_CachedCanMove(IUIAutomationTransformPattern* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedCanMove(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationTransformPattern_get_CachedCanResize(IUIAutomationTransformPattern* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedCanResize(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationTransformPattern_get_CachedCanRotate(IUIAutomationTransformPattern* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedCanRotate(This,retVal);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationTransformPattern_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationValuePattern interface
 */
#ifndef __IUIAutomationValuePattern_INTERFACE_DEFINED__
#define __IUIAutomationValuePattern_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationValuePattern, 0xa94cd8b1, 0x0844, 0x4cd6, 0x9d,0x2d, 0x64,0x05,0x37,0xab,0x39,0xe9);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a94cd8b1-0844-4cd6-9d2d-640537ab39e9")
IUIAutomationValuePattern : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetValue(
        BSTR val) = 0;

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

    virtual HRESULT STDMETHODCALLTYPE get_CurrentIsReadOnly(
        WINBOOL *retVal) = 0;

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

    virtual HRESULT STDMETHODCALLTYPE get_CachedIsReadOnly(
        WINBOOL *retVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationValuePattern, 0xa94cd8b1, 0x0844, 0x4cd6, 0x9d,0x2d, 0x64,0x05,0x37,0xab,0x39,0xe9)
#endif
#else
typedef struct IUIAutomationValuePatternVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomationValuePattern methods ***/
    HRESULT (STDMETHODCALLTYPE *SetValue)(
        IUIAutomationValuePattern *This,
        BSTR val);

    HRESULT (STDMETHODCALLTYPE *get_CurrentValue)(
        IUIAutomationValuePattern *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsReadOnly)(
        IUIAutomationValuePattern *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedValue)(
        IUIAutomationValuePattern *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsReadOnly)(
        IUIAutomationValuePattern *This,
        WINBOOL *retVal);

    END_INTERFACE
} IUIAutomationValuePatternVtbl;

interface IUIAutomationValuePattern {
    CONST_VTBL IUIAutomationValuePatternVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationValuePattern_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationValuePattern_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationValuePattern_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationValuePattern methods ***/
#define IUIAutomationValuePattern_SetValue(This,val) (This)->lpVtbl->SetValue(This,val)
#define IUIAutomationValuePattern_get_CurrentValue(This,retVal) (This)->lpVtbl->get_CurrentValue(This,retVal)
#define IUIAutomationValuePattern_get_CurrentIsReadOnly(This,retVal) (This)->lpVtbl->get_CurrentIsReadOnly(This,retVal)
#define IUIAutomationValuePattern_get_CachedValue(This,retVal) (This)->lpVtbl->get_CachedValue(This,retVal)
#define IUIAutomationValuePattern_get_CachedIsReadOnly(This,retVal) (This)->lpVtbl->get_CachedIsReadOnly(This,retVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationValuePattern_QueryInterface(IUIAutomationValuePattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationValuePattern_AddRef(IUIAutomationValuePattern* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationValuePattern_Release(IUIAutomationValuePattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationValuePattern methods ***/
static __WIDL_INLINE HRESULT IUIAutomationValuePattern_SetValue(IUIAutomationValuePattern* This,BSTR val) {
    return This->lpVtbl->SetValue(This,val);
}
static __WIDL_INLINE HRESULT IUIAutomationValuePattern_get_CurrentValue(IUIAutomationValuePattern* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentValue(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationValuePattern_get_CurrentIsReadOnly(IUIAutomationValuePattern* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsReadOnly(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationValuePattern_get_CachedValue(IUIAutomationValuePattern* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedValue(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationValuePattern_get_CachedIsReadOnly(IUIAutomationValuePattern* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsReadOnly(This,retVal);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationValuePattern_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationWindowPattern interface
 */
#ifndef __IUIAutomationWindowPattern_INTERFACE_DEFINED__
#define __IUIAutomationWindowPattern_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationWindowPattern, 0x0faef453, 0x9208, 0x43ef, 0xbb,0xb2, 0x3b,0x48,0x51,0x77,0x86,0x4f);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("0faef453-9208-43ef-bbb2-3b485177864f")
IUIAutomationWindowPattern : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Close(
        ) = 0;

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

    virtual HRESULT STDMETHODCALLTYPE SetWindowVisualState(
        enum WindowVisualState state) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CurrentCanMaximize(
        WINBOOL *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CurrentCanMinimize(
        WINBOOL *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CurrentIsModal(
        WINBOOL *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CurrentIsTopmost(
        WINBOOL *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CurrentWindowVisualState(
        enum WindowVisualState *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CurrentWindowInteractionState(
        enum WindowInteractionState *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CachedCanMaximize(
        WINBOOL *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CachedCanMinimize(
        WINBOOL *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CachedIsModal(
        WINBOOL *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CachedIsTopmost(
        WINBOOL *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CachedWindowVisualState(
        enum WindowVisualState *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CachedWindowInteractionState(
        enum WindowInteractionState *retVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationWindowPattern, 0x0faef453, 0x9208, 0x43ef, 0xbb,0xb2, 0x3b,0x48,0x51,0x77,0x86,0x4f)
#endif
#else
typedef struct IUIAutomationWindowPatternVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomationWindowPattern methods ***/
    HRESULT (STDMETHODCALLTYPE *Close)(
        IUIAutomationWindowPattern *This);

    HRESULT (STDMETHODCALLTYPE *WaitForInputIdle)(
        IUIAutomationWindowPattern *This,
        int milliseconds,
        WINBOOL *success);

    HRESULT (STDMETHODCALLTYPE *SetWindowVisualState)(
        IUIAutomationWindowPattern *This,
        enum WindowVisualState state);

    HRESULT (STDMETHODCALLTYPE *get_CurrentCanMaximize)(
        IUIAutomationWindowPattern *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentCanMinimize)(
        IUIAutomationWindowPattern *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsModal)(
        IUIAutomationWindowPattern *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsTopmost)(
        IUIAutomationWindowPattern *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentWindowVisualState)(
        IUIAutomationWindowPattern *This,
        enum WindowVisualState *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentWindowInteractionState)(
        IUIAutomationWindowPattern *This,
        enum WindowInteractionState *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedCanMaximize)(
        IUIAutomationWindowPattern *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedCanMinimize)(
        IUIAutomationWindowPattern *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsModal)(
        IUIAutomationWindowPattern *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsTopmost)(
        IUIAutomationWindowPattern *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedWindowVisualState)(
        IUIAutomationWindowPattern *This,
        enum WindowVisualState *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedWindowInteractionState)(
        IUIAutomationWindowPattern *This,
        enum WindowInteractionState *retVal);

    END_INTERFACE
} IUIAutomationWindowPatternVtbl;

interface IUIAutomationWindowPattern {
    CONST_VTBL IUIAutomationWindowPatternVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationWindowPattern_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationWindowPattern_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationWindowPattern_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationWindowPattern methods ***/
#define IUIAutomationWindowPattern_Close(This) (This)->lpVtbl->Close(This)
#define IUIAutomationWindowPattern_WaitForInputIdle(This,milliseconds,success) (This)->lpVtbl->WaitForInputIdle(This,milliseconds,success)
#define IUIAutomationWindowPattern_SetWindowVisualState(This,state) (This)->lpVtbl->SetWindowVisualState(This,state)
#define IUIAutomationWindowPattern_get_CurrentCanMaximize(This,retVal) (This)->lpVtbl->get_CurrentCanMaximize(This,retVal)
#define IUIAutomationWindowPattern_get_CurrentCanMinimize(This,retVal) (This)->lpVtbl->get_CurrentCanMinimize(This,retVal)
#define IUIAutomationWindowPattern_get_CurrentIsModal(This,retVal) (This)->lpVtbl->get_CurrentIsModal(This,retVal)
#define IUIAutomationWindowPattern_get_CurrentIsTopmost(This,retVal) (This)->lpVtbl->get_CurrentIsTopmost(This,retVal)
#define IUIAutomationWindowPattern_get_CurrentWindowVisualState(This,retVal) (This)->lpVtbl->get_CurrentWindowVisualState(This,retVal)
#define IUIAutomationWindowPattern_get_CurrentWindowInteractionState(This,retVal) (This)->lpVtbl->get_CurrentWindowInteractionState(This,retVal)
#define IUIAutomationWindowPattern_get_CachedCanMaximize(This,retVal) (This)->lpVtbl->get_CachedCanMaximize(This,retVal)
#define IUIAutomationWindowPattern_get_CachedCanMinimize(This,retVal) (This)->lpVtbl->get_CachedCanMinimize(This,retVal)
#define IUIAutomationWindowPattern_get_CachedIsModal(This,retVal) (This)->lpVtbl->get_CachedIsModal(This,retVal)
#define IUIAutomationWindowPattern_get_CachedIsTopmost(This,retVal) (This)->lpVtbl->get_CachedIsTopmost(This,retVal)
#define IUIAutomationWindowPattern_get_CachedWindowVisualState(This,retVal) (This)->lpVtbl->get_CachedWindowVisualState(This,retVal)
#define IUIAutomationWindowPattern_get_CachedWindowInteractionState(This,retVal) (This)->lpVtbl->get_CachedWindowInteractionState(This,retVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationWindowPattern_QueryInterface(IUIAutomationWindowPattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationWindowPattern_AddRef(IUIAutomationWindowPattern* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationWindowPattern_Release(IUIAutomationWindowPattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationWindowPattern methods ***/
static __WIDL_INLINE HRESULT IUIAutomationWindowPattern_Close(IUIAutomationWindowPattern* This) {
    return This->lpVtbl->Close(This);
}
static __WIDL_INLINE HRESULT IUIAutomationWindowPattern_WaitForInputIdle(IUIAutomationWindowPattern* This,int milliseconds,WINBOOL *success) {
    return This->lpVtbl->WaitForInputIdle(This,milliseconds,success);
}
static __WIDL_INLINE HRESULT IUIAutomationWindowPattern_SetWindowVisualState(IUIAutomationWindowPattern* This,enum WindowVisualState state) {
    return This->lpVtbl->SetWindowVisualState(This,state);
}
static __WIDL_INLINE HRESULT IUIAutomationWindowPattern_get_CurrentCanMaximize(IUIAutomationWindowPattern* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentCanMaximize(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationWindowPattern_get_CurrentCanMinimize(IUIAutomationWindowPattern* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentCanMinimize(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationWindowPattern_get_CurrentIsModal(IUIAutomationWindowPattern* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsModal(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationWindowPattern_get_CurrentIsTopmost(IUIAutomationWindowPattern* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsTopmost(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationWindowPattern_get_CurrentWindowVisualState(IUIAutomationWindowPattern* This,enum WindowVisualState *retVal) {
    return This->lpVtbl->get_CurrentWindowVisualState(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationWindowPattern_get_CurrentWindowInteractionState(IUIAutomationWindowPattern* This,enum WindowInteractionState *retVal) {
    return This->lpVtbl->get_CurrentWindowInteractionState(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationWindowPattern_get_CachedCanMaximize(IUIAutomationWindowPattern* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedCanMaximize(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationWindowPattern_get_CachedCanMinimize(IUIAutomationWindowPattern* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedCanMinimize(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationWindowPattern_get_CachedIsModal(IUIAutomationWindowPattern* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsModal(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationWindowPattern_get_CachedIsTopmost(IUIAutomationWindowPattern* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsTopmost(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationWindowPattern_get_CachedWindowVisualState(IUIAutomationWindowPattern* This,enum WindowVisualState *retVal) {
    return This->lpVtbl->get_CachedWindowVisualState(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationWindowPattern_get_CachedWindowInteractionState(IUIAutomationWindowPattern* This,enum WindowInteractionState *retVal) {
    return This->lpVtbl->get_CachedWindowInteractionState(This,retVal);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationWindowPattern_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationTextRange interface
 */
#ifndef __IUIAutomationTextRange_INTERFACE_DEFINED__
#define __IUIAutomationTextRange_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationTextRange, 0xa543cc6a, 0xf4ae, 0x494b, 0x82,0x39, 0xc8,0x14,0x48,0x11,0x87,0xa8);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a543cc6a-f4ae-494b-8239-c814481187a8")
IUIAutomationTextRange : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Clone(
        IUIAutomationTextRange **clonedRange) = 0;

    virtual HRESULT STDMETHODCALLTYPE Compare(
        IUIAutomationTextRange *range,
        WINBOOL *areSame) = 0;

    virtual HRESULT STDMETHODCALLTYPE CompareEndpoints(
        enum TextPatternRangeEndpoint srcEndPoint,
        IUIAutomationTextRange *range,
        enum TextPatternRangeEndpoint targetEndPoint,
        int *compValue) = 0;

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

    virtual HRESULT STDMETHODCALLTYPE FindAttribute(
        TEXTATTRIBUTEID attr,
        VARIANT val,
        WINBOOL backward,
        IUIAutomationTextRange **found) = 0;

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

    virtual HRESULT STDMETHODCALLTYPE GetAttributeValue(
        TEXTATTRIBUTEID attr,
        VARIANT *value) = 0;

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

    virtual HRESULT STDMETHODCALLTYPE GetEnclosingElement(
        IUIAutomationElement **enclosingElement) = 0;

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

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

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

    virtual HRESULT STDMETHODCALLTYPE MoveEndpointByRange(
        enum TextPatternRangeEndpoint srcEndPoint,
        IUIAutomationTextRange *range,
        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(
        IUIAutomationElementArray **children) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationTextRange, 0xa543cc6a, 0xf4ae, 0x494b, 0x82,0x39, 0xc8,0x14,0x48,0x11,0x87,0xa8)
#endif
#else
typedef struct IUIAutomationTextRangeVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomationTextRange methods ***/
    HRESULT (STDMETHODCALLTYPE *Clone)(
        IUIAutomationTextRange *This,
        IUIAutomationTextRange **clonedRange);

    HRESULT (STDMETHODCALLTYPE *Compare)(
        IUIAutomationTextRange *This,
        IUIAutomationTextRange *range,
        WINBOOL *areSame);

    HRESULT (STDMETHODCALLTYPE *CompareEndpoints)(
        IUIAutomationTextRange *This,
        enum TextPatternRangeEndpoint srcEndPoint,
        IUIAutomationTextRange *range,
        enum TextPatternRangeEndpoint targetEndPoint,
        int *compValue);

    HRESULT (STDMETHODCALLTYPE *ExpandToEnclosingUnit)(
        IUIAutomationTextRange *This,
        enum TextUnit textUnit);

    HRESULT (STDMETHODCALLTYPE *FindAttribute)(
        IUIAutomationTextRange *This,
        TEXTATTRIBUTEID attr,
        VARIANT val,
        WINBOOL backward,
        IUIAutomationTextRange **found);

    HRESULT (STDMETHODCALLTYPE *FindText)(
        IUIAutomationTextRange *This,
        BSTR text,
        WINBOOL backward,
        WINBOOL ignoreCase,
        IUIAutomationTextRange **found);

    HRESULT (STDMETHODCALLTYPE *GetAttributeValue)(
        IUIAutomationTextRange *This,
        TEXTATTRIBUTEID attr,
        VARIANT *value);

    HRESULT (STDMETHODCALLTYPE *GetBoundingRectangles)(
        IUIAutomationTextRange *This,
        SAFEARRAY **boundingRects);

    HRESULT (STDMETHODCALLTYPE *GetEnclosingElement)(
        IUIAutomationTextRange *This,
        IUIAutomationElement **enclosingElement);

    HRESULT (STDMETHODCALLTYPE *GetText)(
        IUIAutomationTextRange *This,
        int maxLength,
        BSTR *text);

    HRESULT (STDMETHODCALLTYPE *Move)(
        IUIAutomationTextRange *This,
        enum TextUnit unit,
        int count,
        int *moved);

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

    HRESULT (STDMETHODCALLTYPE *MoveEndpointByRange)(
        IUIAutomationTextRange *This,
        enum TextPatternRangeEndpoint srcEndPoint,
        IUIAutomationTextRange *range,
        enum TextPatternRangeEndpoint targetEndPoint);

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

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

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

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

    HRESULT (STDMETHODCALLTYPE *GetChildren)(
        IUIAutomationTextRange *This,
        IUIAutomationElementArray **children);

    END_INTERFACE
} IUIAutomationTextRangeVtbl;

interface IUIAutomationTextRange {
    CONST_VTBL IUIAutomationTextRangeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationTextRange_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationTextRange_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationTextRange_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationTextRange methods ***/
#define IUIAutomationTextRange_Clone(This,clonedRange) (This)->lpVtbl->Clone(This,clonedRange)
#define IUIAutomationTextRange_Compare(This,range,areSame) (This)->lpVtbl->Compare(This,range,areSame)
#define IUIAutomationTextRange_CompareEndpoints(This,srcEndPoint,range,targetEndPoint,compValue) (This)->lpVtbl->CompareEndpoints(This,srcEndPoint,range,targetEndPoint,compValue)
#define IUIAutomationTextRange_ExpandToEnclosingUnit(This,textUnit) (This)->lpVtbl->ExpandToEnclosingUnit(This,textUnit)
#define IUIAutomationTextRange_FindAttribute(This,attr,val,backward,found) (This)->lpVtbl->FindAttribute(This,attr,val,backward,found)
#define IUIAutomationTextRange_FindText(This,text,backward,ignoreCase,found) (This)->lpVtbl->FindText(This,text,backward,ignoreCase,found)
#define IUIAutomationTextRange_GetAttributeValue(This,attr,value) (This)->lpVtbl->GetAttributeValue(This,attr,value)
#define IUIAutomationTextRange_GetBoundingRectangles(This,boundingRects) (This)->lpVtbl->GetBoundingRectangles(This,boundingRects)
#define IUIAutomationTextRange_GetEnclosingElement(This,enclosingElement) (This)->lpVtbl->GetEnclosingElement(This,enclosingElement)
#define IUIAutomationTextRange_GetText(This,maxLength,text) (This)->lpVtbl->GetText(This,maxLength,text)
#define IUIAutomationTextRange_Move(This,unit,count,moved) (This)->lpVtbl->Move(This,unit,count,moved)
#define IUIAutomationTextRange_MoveEndpointByUnit(This,endpoint,unit,count,moved) (This)->lpVtbl->MoveEndpointByUnit(This,endpoint,unit,count,moved)
#define IUIAutomationTextRange_MoveEndpointByRange(This,srcEndPoint,range,targetEndPoint) (This)->lpVtbl->MoveEndpointByRange(This,srcEndPoint,range,targetEndPoint)
#define IUIAutomationTextRange_Select(This) (This)->lpVtbl->Select(This)
#define IUIAutomationTextRange_AddToSelection(This) (This)->lpVtbl->AddToSelection(This)
#define IUIAutomationTextRange_RemoveFromSelection(This) (This)->lpVtbl->RemoveFromSelection(This)
#define IUIAutomationTextRange_ScrollIntoView(This,alignToTop) (This)->lpVtbl->ScrollIntoView(This,alignToTop)
#define IUIAutomationTextRange_GetChildren(This,children) (This)->lpVtbl->GetChildren(This,children)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationTextRange_QueryInterface(IUIAutomationTextRange* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationTextRange_AddRef(IUIAutomationTextRange* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationTextRange_Release(IUIAutomationTextRange* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationTextRange methods ***/
static __WIDL_INLINE HRESULT IUIAutomationTextRange_Clone(IUIAutomationTextRange* This,IUIAutomationTextRange **clonedRange) {
    return This->lpVtbl->Clone(This,clonedRange);
}
static __WIDL_INLINE HRESULT IUIAutomationTextRange_Compare(IUIAutomationTextRange* This,IUIAutomationTextRange *range,WINBOOL *areSame) {
    return This->lpVtbl->Compare(This,range,areSame);
}
static __WIDL_INLINE HRESULT IUIAutomationTextRange_CompareEndpoints(IUIAutomationTextRange* This,enum TextPatternRangeEndpoint srcEndPoint,IUIAutomationTextRange *range,enum TextPatternRangeEndpoint targetEndPoint,int *compValue) {
    return This->lpVtbl->CompareEndpoints(This,srcEndPoint,range,targetEndPoint,compValue);
}
static __WIDL_INLINE HRESULT IUIAutomationTextRange_ExpandToEnclosingUnit(IUIAutomationTextRange* This,enum TextUnit textUnit) {
    return This->lpVtbl->ExpandToEnclosingUnit(This,textUnit);
}
static __WIDL_INLINE HRESULT IUIAutomationTextRange_FindAttribute(IUIAutomationTextRange* This,TEXTATTRIBUTEID attr,VARIANT val,WINBOOL backward,IUIAutomationTextRange **found) {
    return This->lpVtbl->FindAttribute(This,attr,val,backward,found);
}
static __WIDL_INLINE HRESULT IUIAutomationTextRange_FindText(IUIAutomationTextRange* This,BSTR text,WINBOOL backward,WINBOOL ignoreCase,IUIAutomationTextRange **found) {
    return This->lpVtbl->FindText(This,text,backward,ignoreCase,found);
}
static __WIDL_INLINE HRESULT IUIAutomationTextRange_GetAttributeValue(IUIAutomationTextRange* This,TEXTATTRIBUTEID attr,VARIANT *value) {
    return This->lpVtbl->GetAttributeValue(This,attr,value);
}
static __WIDL_INLINE HRESULT IUIAutomationTextRange_GetBoundingRectangles(IUIAutomationTextRange* This,SAFEARRAY **boundingRects) {
    return This->lpVtbl->GetBoundingRectangles(This,boundingRects);
}
static __WIDL_INLINE HRESULT IUIAutomationTextRange_GetEnclosingElement(IUIAutomationTextRange* This,IUIAutomationElement **enclosingElement) {
    return This->lpVtbl->GetEnclosingElement(This,enclosingElement);
}
static __WIDL_INLINE HRESULT IUIAutomationTextRange_GetText(IUIAutomationTextRange* This,int maxLength,BSTR *text) {
    return This->lpVtbl->GetText(This,maxLength,text);
}
static __WIDL_INLINE HRESULT IUIAutomationTextRange_Move(IUIAutomationTextRange* This,enum TextUnit unit,int count,int *moved) {
    return This->lpVtbl->Move(This,unit,count,moved);
}
static __WIDL_INLINE HRESULT IUIAutomationTextRange_MoveEndpointByUnit(IUIAutomationTextRange* This,enum TextPatternRangeEndpoint endpoint,enum TextUnit unit,int count,int *moved) {
    return This->lpVtbl->MoveEndpointByUnit(This,endpoint,unit,count,moved);
}
static __WIDL_INLINE HRESULT IUIAutomationTextRange_MoveEndpointByRange(IUIAutomationTextRange* This,enum TextPatternRangeEndpoint srcEndPoint,IUIAutomationTextRange *range,enum TextPatternRangeEndpoint targetEndPoint) {
    return This->lpVtbl->MoveEndpointByRange(This,srcEndPoint,range,targetEndPoint);
}
static __WIDL_INLINE HRESULT IUIAutomationTextRange_Select(IUIAutomationTextRange* This) {
    return This->lpVtbl->Select(This);
}
static __WIDL_INLINE HRESULT IUIAutomationTextRange_AddToSelection(IUIAutomationTextRange* This) {
    return This->lpVtbl->AddToSelection(This);
}
static __WIDL_INLINE HRESULT IUIAutomationTextRange_RemoveFromSelection(IUIAutomationTextRange* This) {
    return This->lpVtbl->RemoveFromSelection(This);
}
static __WIDL_INLINE HRESULT IUIAutomationTextRange_ScrollIntoView(IUIAutomationTextRange* This,WINBOOL alignToTop) {
    return This->lpVtbl->ScrollIntoView(This,alignToTop);
}
static __WIDL_INLINE HRESULT IUIAutomationTextRange_GetChildren(IUIAutomationTextRange* This,IUIAutomationElementArray **children) {
    return This->lpVtbl->GetChildren(This,children);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationTextRange_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationTextRange2 interface
 */
#ifndef __IUIAutomationTextRange2_INTERFACE_DEFINED__
#define __IUIAutomationTextRange2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationTextRange2, 0xbb9b40e0, 0x5e04, 0x46bd, 0x9b,0xe0, 0x4b,0x60,0x1b,0x9a,0xfa,0xd4);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("bb9b40e0-5e04-46bd-9be0-4b601b9afad4")
IUIAutomationTextRange2 : public IUIAutomationTextRange
{
    virtual HRESULT STDMETHODCALLTYPE ShowContextMenu(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationTextRange2, 0xbb9b40e0, 0x5e04, 0x46bd, 0x9b,0xe0, 0x4b,0x60,0x1b,0x9a,0xfa,0xd4)
#endif
#else
typedef struct IUIAutomationTextRange2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomationTextRange methods ***/
    HRESULT (STDMETHODCALLTYPE *Clone)(
        IUIAutomationTextRange2 *This,
        IUIAutomationTextRange **clonedRange);

    HRESULT (STDMETHODCALLTYPE *Compare)(
        IUIAutomationTextRange2 *This,
        IUIAutomationTextRange *range,
        WINBOOL *areSame);

    HRESULT (STDMETHODCALLTYPE *CompareEndpoints)(
        IUIAutomationTextRange2 *This,
        enum TextPatternRangeEndpoint srcEndPoint,
        IUIAutomationTextRange *range,
        enum TextPatternRangeEndpoint targetEndPoint,
        int *compValue);

    HRESULT (STDMETHODCALLTYPE *ExpandToEnclosingUnit)(
        IUIAutomationTextRange2 *This,
        enum TextUnit textUnit);

    HRESULT (STDMETHODCALLTYPE *FindAttribute)(
        IUIAutomationTextRange2 *This,
        TEXTATTRIBUTEID attr,
        VARIANT val,
        WINBOOL backward,
        IUIAutomationTextRange **found);

    HRESULT (STDMETHODCALLTYPE *FindText)(
        IUIAutomationTextRange2 *This,
        BSTR text,
        WINBOOL backward,
        WINBOOL ignoreCase,
        IUIAutomationTextRange **found);

    HRESULT (STDMETHODCALLTYPE *GetAttributeValue)(
        IUIAutomationTextRange2 *This,
        TEXTATTRIBUTEID attr,
        VARIANT *value);

    HRESULT (STDMETHODCALLTYPE *GetBoundingRectangles)(
        IUIAutomationTextRange2 *This,
        SAFEARRAY **boundingRects);

    HRESULT (STDMETHODCALLTYPE *GetEnclosingElement)(
        IUIAutomationTextRange2 *This,
        IUIAutomationElement **enclosingElement);

    HRESULT (STDMETHODCALLTYPE *GetText)(
        IUIAutomationTextRange2 *This,
        int maxLength,
        BSTR *text);

    HRESULT (STDMETHODCALLTYPE *Move)(
        IUIAutomationTextRange2 *This,
        enum TextUnit unit,
        int count,
        int *moved);

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

    HRESULT (STDMETHODCALLTYPE *MoveEndpointByRange)(
        IUIAutomationTextRange2 *This,
        enum TextPatternRangeEndpoint srcEndPoint,
        IUIAutomationTextRange *range,
        enum TextPatternRangeEndpoint targetEndPoint);

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

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

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

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

    HRESULT (STDMETHODCALLTYPE *GetChildren)(
        IUIAutomationTextRange2 *This,
        IUIAutomationElementArray **children);

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

    END_INTERFACE
} IUIAutomationTextRange2Vtbl;

interface IUIAutomationTextRange2 {
    CONST_VTBL IUIAutomationTextRange2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationTextRange2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationTextRange2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationTextRange2_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationTextRange methods ***/
#define IUIAutomationTextRange2_Clone(This,clonedRange) (This)->lpVtbl->Clone(This,clonedRange)
#define IUIAutomationTextRange2_Compare(This,range,areSame) (This)->lpVtbl->Compare(This,range,areSame)
#define IUIAutomationTextRange2_CompareEndpoints(This,srcEndPoint,range,targetEndPoint,compValue) (This)->lpVtbl->CompareEndpoints(This,srcEndPoint,range,targetEndPoint,compValue)
#define IUIAutomationTextRange2_ExpandToEnclosingUnit(This,textUnit) (This)->lpVtbl->ExpandToEnclosingUnit(This,textUnit)
#define IUIAutomationTextRange2_FindAttribute(This,attr,val,backward,found) (This)->lpVtbl->FindAttribute(This,attr,val,backward,found)
#define IUIAutomationTextRange2_FindText(This,text,backward,ignoreCase,found) (This)->lpVtbl->FindText(This,text,backward,ignoreCase,found)
#define IUIAutomationTextRange2_GetAttributeValue(This,attr,value) (This)->lpVtbl->GetAttributeValue(This,attr,value)
#define IUIAutomationTextRange2_GetBoundingRectangles(This,boundingRects) (This)->lpVtbl->GetBoundingRectangles(This,boundingRects)
#define IUIAutomationTextRange2_GetEnclosingElement(This,enclosingElement) (This)->lpVtbl->GetEnclosingElement(This,enclosingElement)
#define IUIAutomationTextRange2_GetText(This,maxLength,text) (This)->lpVtbl->GetText(This,maxLength,text)
#define IUIAutomationTextRange2_Move(This,unit,count,moved) (This)->lpVtbl->Move(This,unit,count,moved)
#define IUIAutomationTextRange2_MoveEndpointByUnit(This,endpoint,unit,count,moved) (This)->lpVtbl->MoveEndpointByUnit(This,endpoint,unit,count,moved)
#define IUIAutomationTextRange2_MoveEndpointByRange(This,srcEndPoint,range,targetEndPoint) (This)->lpVtbl->MoveEndpointByRange(This,srcEndPoint,range,targetEndPoint)
#define IUIAutomationTextRange2_Select(This) (This)->lpVtbl->Select(This)
#define IUIAutomationTextRange2_AddToSelection(This) (This)->lpVtbl->AddToSelection(This)
#define IUIAutomationTextRange2_RemoveFromSelection(This) (This)->lpVtbl->RemoveFromSelection(This)
#define IUIAutomationTextRange2_ScrollIntoView(This,alignToTop) (This)->lpVtbl->ScrollIntoView(This,alignToTop)
#define IUIAutomationTextRange2_GetChildren(This,children) (This)->lpVtbl->GetChildren(This,children)
/*** IUIAutomationTextRange2 methods ***/
#define IUIAutomationTextRange2_ShowContextMenu(This) (This)->lpVtbl->ShowContextMenu(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationTextRange2_QueryInterface(IUIAutomationTextRange2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationTextRange2_AddRef(IUIAutomationTextRange2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationTextRange2_Release(IUIAutomationTextRange2* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationTextRange methods ***/
static __WIDL_INLINE HRESULT IUIAutomationTextRange2_Clone(IUIAutomationTextRange2* This,IUIAutomationTextRange **clonedRange) {
    return This->lpVtbl->Clone(This,clonedRange);
}
static __WIDL_INLINE HRESULT IUIAutomationTextRange2_Compare(IUIAutomationTextRange2* This,IUIAutomationTextRange *range,WINBOOL *areSame) {
    return This->lpVtbl->Compare(This,range,areSame);
}
static __WIDL_INLINE HRESULT IUIAutomationTextRange2_CompareEndpoints(IUIAutomationTextRange2* This,enum TextPatternRangeEndpoint srcEndPoint,IUIAutomationTextRange *range,enum TextPatternRangeEndpoint targetEndPoint,int *compValue) {
    return This->lpVtbl->CompareEndpoints(This,srcEndPoint,range,targetEndPoint,compValue);
}
static __WIDL_INLINE HRESULT IUIAutomationTextRange2_ExpandToEnclosingUnit(IUIAutomationTextRange2* This,enum TextUnit textUnit) {
    return This->lpVtbl->ExpandToEnclosingUnit(This,textUnit);
}
static __WIDL_INLINE HRESULT IUIAutomationTextRange2_FindAttribute(IUIAutomationTextRange2* This,TEXTATTRIBUTEID attr,VARIANT val,WINBOOL backward,IUIAutomationTextRange **found) {
    return This->lpVtbl->FindAttribute(This,attr,val,backward,found);
}
static __WIDL_INLINE HRESULT IUIAutomationTextRange2_FindText(IUIAutomationTextRange2* This,BSTR text,WINBOOL backward,WINBOOL ignoreCase,IUIAutomationTextRange **found) {
    return This->lpVtbl->FindText(This,text,backward,ignoreCase,found);
}
static __WIDL_INLINE HRESULT IUIAutomationTextRange2_GetAttributeValue(IUIAutomationTextRange2* This,TEXTATTRIBUTEID attr,VARIANT *value) {
    return This->lpVtbl->GetAttributeValue(This,attr,value);
}
static __WIDL_INLINE HRESULT IUIAutomationTextRange2_GetBoundingRectangles(IUIAutomationTextRange2* This,SAFEARRAY **boundingRects) {
    return This->lpVtbl->GetBoundingRectangles(This,boundingRects);
}
static __WIDL_INLINE HRESULT IUIAutomationTextRange2_GetEnclosingElement(IUIAutomationTextRange2* This,IUIAutomationElement **enclosingElement) {
    return This->lpVtbl->GetEnclosingElement(This,enclosingElement);
}
static __WIDL_INLINE HRESULT IUIAutomationTextRange2_GetText(IUIAutomationTextRange2* This,int maxLength,BSTR *text) {
    return This->lpVtbl->GetText(This,maxLength,text);
}
static __WIDL_INLINE HRESULT IUIAutomationTextRange2_Move(IUIAutomationTextRange2* This,enum TextUnit unit,int count,int *moved) {
    return This->lpVtbl->Move(This,unit,count,moved);
}
static __WIDL_INLINE HRESULT IUIAutomationTextRange2_MoveEndpointByUnit(IUIAutomationTextRange2* This,enum TextPatternRangeEndpoint endpoint,enum TextUnit unit,int count,int *moved) {
    return This->lpVtbl->MoveEndpointByUnit(This,endpoint,unit,count,moved);
}
static __WIDL_INLINE HRESULT IUIAutomationTextRange2_MoveEndpointByRange(IUIAutomationTextRange2* This,enum TextPatternRangeEndpoint srcEndPoint,IUIAutomationTextRange *range,enum TextPatternRangeEndpoint targetEndPoint) {
    return This->lpVtbl->MoveEndpointByRange(This,srcEndPoint,range,targetEndPoint);
}
static __WIDL_INLINE HRESULT IUIAutomationTextRange2_Select(IUIAutomationTextRange2* This) {
    return This->lpVtbl->Select(This);
}
static __WIDL_INLINE HRESULT IUIAutomationTextRange2_AddToSelection(IUIAutomationTextRange2* This) {
    return This->lpVtbl->AddToSelection(This);
}
static __WIDL_INLINE HRESULT IUIAutomationTextRange2_RemoveFromSelection(IUIAutomationTextRange2* This) {
    return This->lpVtbl->RemoveFromSelection(This);
}
static __WIDL_INLINE HRESULT IUIAutomationTextRange2_ScrollIntoView(IUIAutomationTextRange2* This,WINBOOL alignToTop) {
    return This->lpVtbl->ScrollIntoView(This,alignToTop);
}
static __WIDL_INLINE HRESULT IUIAutomationTextRange2_GetChildren(IUIAutomationTextRange2* This,IUIAutomationElementArray **children) {
    return This->lpVtbl->GetChildren(This,children);
}
/*** IUIAutomationTextRange2 methods ***/
static __WIDL_INLINE HRESULT IUIAutomationTextRange2_ShowContextMenu(IUIAutomationTextRange2* This) {
    return This->lpVtbl->ShowContextMenu(This);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationTextRange2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationTextRangeArray interface
 */
#ifndef __IUIAutomationTextRangeArray_INTERFACE_DEFINED__
#define __IUIAutomationTextRangeArray_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationTextRangeArray, 0xce4ae76a, 0xe717, 0x4c98, 0x81,0xea, 0x47,0x37,0x1d,0x02,0x8e,0xb6);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("ce4ae76a-e717-4c98-81ea-47371d028eb6")
IUIAutomationTextRangeArray : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE get_Length(
        int *length) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetElement(
        int index,
        IUIAutomationTextRange **element) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationTextRangeArray, 0xce4ae76a, 0xe717, 0x4c98, 0x81,0xea, 0x47,0x37,0x1d,0x02,0x8e,0xb6)
#endif
#else
typedef struct IUIAutomationTextRangeArrayVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomationTextRangeArray methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Length)(
        IUIAutomationTextRangeArray *This,
        int *length);

    HRESULT (STDMETHODCALLTYPE *GetElement)(
        IUIAutomationTextRangeArray *This,
        int index,
        IUIAutomationTextRange **element);

    END_INTERFACE
} IUIAutomationTextRangeArrayVtbl;

interface IUIAutomationTextRangeArray {
    CONST_VTBL IUIAutomationTextRangeArrayVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationTextRangeArray_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationTextRangeArray_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationTextRangeArray_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationTextRangeArray methods ***/
#define IUIAutomationTextRangeArray_get_Length(This,length) (This)->lpVtbl->get_Length(This,length)
#define IUIAutomationTextRangeArray_GetElement(This,index,element) (This)->lpVtbl->GetElement(This,index,element)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationTextRangeArray_QueryInterface(IUIAutomationTextRangeArray* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationTextRangeArray_AddRef(IUIAutomationTextRangeArray* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationTextRangeArray_Release(IUIAutomationTextRangeArray* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationTextRangeArray methods ***/
static __WIDL_INLINE HRESULT IUIAutomationTextRangeArray_get_Length(IUIAutomationTextRangeArray* This,int *length) {
    return This->lpVtbl->get_Length(This,length);
}
static __WIDL_INLINE HRESULT IUIAutomationTextRangeArray_GetElement(IUIAutomationTextRangeArray* This,int index,IUIAutomationTextRange **element) {
    return This->lpVtbl->GetElement(This,index,element);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationTextRangeArray_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationTextPattern interface
 */
#ifndef __IUIAutomationTextPattern_INTERFACE_DEFINED__
#define __IUIAutomationTextPattern_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationTextPattern, 0x32eba289, 0x3583, 0x42c9, 0x9c,0x59, 0x3b,0x6d,0x9a,0x1e,0x9b,0x6a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("32eba289-3583-42c9-9c59-3b6d9a1e9b6a")
IUIAutomationTextPattern : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE RangeFromPoint(
        POINT pt,
        IUIAutomationTextRange **range) = 0;

    virtual HRESULT STDMETHODCALLTYPE RangeFromChild(
        IUIAutomationElement *child,
        IUIAutomationTextRange **range) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSelection(
        IUIAutomationTextRangeArray **ranges) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetVisibleRanges(
        IUIAutomationTextRangeArray **ranges) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_DocumentRange(
        IUIAutomationTextRange **range) = 0;

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

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationTextPattern, 0x32eba289, 0x3583, 0x42c9, 0x9c,0x59, 0x3b,0x6d,0x9a,0x1e,0x9b,0x6a)
#endif
#else
typedef struct IUIAutomationTextPatternVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomationTextPattern methods ***/
    HRESULT (STDMETHODCALLTYPE *RangeFromPoint)(
        IUIAutomationTextPattern *This,
        POINT pt,
        IUIAutomationTextRange **range);

    HRESULT (STDMETHODCALLTYPE *RangeFromChild)(
        IUIAutomationTextPattern *This,
        IUIAutomationElement *child,
        IUIAutomationTextRange **range);

    HRESULT (STDMETHODCALLTYPE *GetSelection)(
        IUIAutomationTextPattern *This,
        IUIAutomationTextRangeArray **ranges);

    HRESULT (STDMETHODCALLTYPE *GetVisibleRanges)(
        IUIAutomationTextPattern *This,
        IUIAutomationTextRangeArray **ranges);

    HRESULT (STDMETHODCALLTYPE *get_DocumentRange)(
        IUIAutomationTextPattern *This,
        IUIAutomationTextRange **range);

    HRESULT (STDMETHODCALLTYPE *get_SupportedTextSelection)(
        IUIAutomationTextPattern *This,
        enum SupportedTextSelection *supportedTextSelection);

    END_INTERFACE
} IUIAutomationTextPatternVtbl;

interface IUIAutomationTextPattern {
    CONST_VTBL IUIAutomationTextPatternVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationTextPattern_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationTextPattern_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationTextPattern_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationTextPattern methods ***/
#define IUIAutomationTextPattern_RangeFromPoint(This,pt,range) (This)->lpVtbl->RangeFromPoint(This,pt,range)
#define IUIAutomationTextPattern_RangeFromChild(This,child,range) (This)->lpVtbl->RangeFromChild(This,child,range)
#define IUIAutomationTextPattern_GetSelection(This,ranges) (This)->lpVtbl->GetSelection(This,ranges)
#define IUIAutomationTextPattern_GetVisibleRanges(This,ranges) (This)->lpVtbl->GetVisibleRanges(This,ranges)
#define IUIAutomationTextPattern_get_DocumentRange(This,range) (This)->lpVtbl->get_DocumentRange(This,range)
#define IUIAutomationTextPattern_get_SupportedTextSelection(This,supportedTextSelection) (This)->lpVtbl->get_SupportedTextSelection(This,supportedTextSelection)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationTextPattern_QueryInterface(IUIAutomationTextPattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationTextPattern_AddRef(IUIAutomationTextPattern* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationTextPattern_Release(IUIAutomationTextPattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationTextPattern methods ***/
static __WIDL_INLINE HRESULT IUIAutomationTextPattern_RangeFromPoint(IUIAutomationTextPattern* This,POINT pt,IUIAutomationTextRange **range) {
    return This->lpVtbl->RangeFromPoint(This,pt,range);
}
static __WIDL_INLINE HRESULT IUIAutomationTextPattern_RangeFromChild(IUIAutomationTextPattern* This,IUIAutomationElement *child,IUIAutomationTextRange **range) {
    return This->lpVtbl->RangeFromChild(This,child,range);
}
static __WIDL_INLINE HRESULT IUIAutomationTextPattern_GetSelection(IUIAutomationTextPattern* This,IUIAutomationTextRangeArray **ranges) {
    return This->lpVtbl->GetSelection(This,ranges);
}
static __WIDL_INLINE HRESULT IUIAutomationTextPattern_GetVisibleRanges(IUIAutomationTextPattern* This,IUIAutomationTextRangeArray **ranges) {
    return This->lpVtbl->GetVisibleRanges(This,ranges);
}
static __WIDL_INLINE HRESULT IUIAutomationTextPattern_get_DocumentRange(IUIAutomationTextPattern* This,IUIAutomationTextRange **range) {
    return This->lpVtbl->get_DocumentRange(This,range);
}
static __WIDL_INLINE HRESULT IUIAutomationTextPattern_get_SupportedTextSelection(IUIAutomationTextPattern* This,enum SupportedTextSelection *supportedTextSelection) {
    return This->lpVtbl->get_SupportedTextSelection(This,supportedTextSelection);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationTextPattern_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationTextPattern2 interface
 */
#ifndef __IUIAutomationTextPattern2_INTERFACE_DEFINED__
#define __IUIAutomationTextPattern2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationTextPattern2, 0x506a921a, 0xfcc9, 0x409f, 0xb2,0x3b, 0x37,0xeb,0x74,0x10,0x68,0x72);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("506a921a-fcc9-409f-b23b-37eb74106872")
IUIAutomationTextPattern2 : public IUIAutomationTextPattern
{
    virtual HRESULT STDMETHODCALLTYPE RangeFromAnnotation(
        IUIAutomationElement *annotation,
        IUIAutomationTextRange **range) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCaretRange(
        WINBOOL *isActive,
        IUIAutomationTextRange **range) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationTextPattern2, 0x506a921a, 0xfcc9, 0x409f, 0xb2,0x3b, 0x37,0xeb,0x74,0x10,0x68,0x72)
#endif
#else
typedef struct IUIAutomationTextPattern2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomationTextPattern methods ***/
    HRESULT (STDMETHODCALLTYPE *RangeFromPoint)(
        IUIAutomationTextPattern2 *This,
        POINT pt,
        IUIAutomationTextRange **range);

    HRESULT (STDMETHODCALLTYPE *RangeFromChild)(
        IUIAutomationTextPattern2 *This,
        IUIAutomationElement *child,
        IUIAutomationTextRange **range);

    HRESULT (STDMETHODCALLTYPE *GetSelection)(
        IUIAutomationTextPattern2 *This,
        IUIAutomationTextRangeArray **ranges);

    HRESULT (STDMETHODCALLTYPE *GetVisibleRanges)(
        IUIAutomationTextPattern2 *This,
        IUIAutomationTextRangeArray **ranges);

    HRESULT (STDMETHODCALLTYPE *get_DocumentRange)(
        IUIAutomationTextPattern2 *This,
        IUIAutomationTextRange **range);

    HRESULT (STDMETHODCALLTYPE *get_SupportedTextSelection)(
        IUIAutomationTextPattern2 *This,
        enum SupportedTextSelection *supportedTextSelection);

    /*** IUIAutomationTextPattern2 methods ***/
    HRESULT (STDMETHODCALLTYPE *RangeFromAnnotation)(
        IUIAutomationTextPattern2 *This,
        IUIAutomationElement *annotation,
        IUIAutomationTextRange **range);

    HRESULT (STDMETHODCALLTYPE *GetCaretRange)(
        IUIAutomationTextPattern2 *This,
        WINBOOL *isActive,
        IUIAutomationTextRange **range);

    END_INTERFACE
} IUIAutomationTextPattern2Vtbl;

interface IUIAutomationTextPattern2 {
    CONST_VTBL IUIAutomationTextPattern2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationTextPattern2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationTextPattern2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationTextPattern2_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationTextPattern methods ***/
#define IUIAutomationTextPattern2_RangeFromPoint(This,pt,range) (This)->lpVtbl->RangeFromPoint(This,pt,range)
#define IUIAutomationTextPattern2_RangeFromChild(This,child,range) (This)->lpVtbl->RangeFromChild(This,child,range)
#define IUIAutomationTextPattern2_GetSelection(This,ranges) (This)->lpVtbl->GetSelection(This,ranges)
#define IUIAutomationTextPattern2_GetVisibleRanges(This,ranges) (This)->lpVtbl->GetVisibleRanges(This,ranges)
#define IUIAutomationTextPattern2_get_DocumentRange(This,range) (This)->lpVtbl->get_DocumentRange(This,range)
#define IUIAutomationTextPattern2_get_SupportedTextSelection(This,supportedTextSelection) (This)->lpVtbl->get_SupportedTextSelection(This,supportedTextSelection)
/*** IUIAutomationTextPattern2 methods ***/
#define IUIAutomationTextPattern2_RangeFromAnnotation(This,annotation,range) (This)->lpVtbl->RangeFromAnnotation(This,annotation,range)
#define IUIAutomationTextPattern2_GetCaretRange(This,isActive,range) (This)->lpVtbl->GetCaretRange(This,isActive,range)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationTextPattern2_QueryInterface(IUIAutomationTextPattern2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationTextPattern2_AddRef(IUIAutomationTextPattern2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationTextPattern2_Release(IUIAutomationTextPattern2* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationTextPattern methods ***/
static __WIDL_INLINE HRESULT IUIAutomationTextPattern2_RangeFromPoint(IUIAutomationTextPattern2* This,POINT pt,IUIAutomationTextRange **range) {
    return This->lpVtbl->RangeFromPoint(This,pt,range);
}
static __WIDL_INLINE HRESULT IUIAutomationTextPattern2_RangeFromChild(IUIAutomationTextPattern2* This,IUIAutomationElement *child,IUIAutomationTextRange **range) {
    return This->lpVtbl->RangeFromChild(This,child,range);
}
static __WIDL_INLINE HRESULT IUIAutomationTextPattern2_GetSelection(IUIAutomationTextPattern2* This,IUIAutomationTextRangeArray **ranges) {
    return This->lpVtbl->GetSelection(This,ranges);
}
static __WIDL_INLINE HRESULT IUIAutomationTextPattern2_GetVisibleRanges(IUIAutomationTextPattern2* This,IUIAutomationTextRangeArray **ranges) {
    return This->lpVtbl->GetVisibleRanges(This,ranges);
}
static __WIDL_INLINE HRESULT IUIAutomationTextPattern2_get_DocumentRange(IUIAutomationTextPattern2* This,IUIAutomationTextRange **range) {
    return This->lpVtbl->get_DocumentRange(This,range);
}
static __WIDL_INLINE HRESULT IUIAutomationTextPattern2_get_SupportedTextSelection(IUIAutomationTextPattern2* This,enum SupportedTextSelection *supportedTextSelection) {
    return This->lpVtbl->get_SupportedTextSelection(This,supportedTextSelection);
}
/*** IUIAutomationTextPattern2 methods ***/
static __WIDL_INLINE HRESULT IUIAutomationTextPattern2_RangeFromAnnotation(IUIAutomationTextPattern2* This,IUIAutomationElement *annotation,IUIAutomationTextRange **range) {
    return This->lpVtbl->RangeFromAnnotation(This,annotation,range);
}
static __WIDL_INLINE HRESULT IUIAutomationTextPattern2_GetCaretRange(IUIAutomationTextPattern2* This,WINBOOL *isActive,IUIAutomationTextRange **range) {
    return This->lpVtbl->GetCaretRange(This,isActive,range);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationTextPattern2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationTextEditPattern interface
 */
#ifndef __IUIAutomationTextEditPattern_INTERFACE_DEFINED__
#define __IUIAutomationTextEditPattern_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationTextEditPattern, 0x17e21576, 0x996c, 0x4870, 0x99,0xd9, 0xbf,0xf3,0x23,0x38,0x0c,0x06);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("17e21576-996c-4870-99d9-bff323380c06")
IUIAutomationTextEditPattern : public IUIAutomationTextPattern
{
    virtual HRESULT STDMETHODCALLTYPE GetActiveComposition(
        IUIAutomationTextRange **range) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetConversionTarget(
        IUIAutomationTextRange **range) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationTextEditPattern, 0x17e21576, 0x996c, 0x4870, 0x99,0xd9, 0xbf,0xf3,0x23,0x38,0x0c,0x06)
#endif
#else
typedef struct IUIAutomationTextEditPatternVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomationTextPattern methods ***/
    HRESULT (STDMETHODCALLTYPE *RangeFromPoint)(
        IUIAutomationTextEditPattern *This,
        POINT pt,
        IUIAutomationTextRange **range);

    HRESULT (STDMETHODCALLTYPE *RangeFromChild)(
        IUIAutomationTextEditPattern *This,
        IUIAutomationElement *child,
        IUIAutomationTextRange **range);

    HRESULT (STDMETHODCALLTYPE *GetSelection)(
        IUIAutomationTextEditPattern *This,
        IUIAutomationTextRangeArray **ranges);

    HRESULT (STDMETHODCALLTYPE *GetVisibleRanges)(
        IUIAutomationTextEditPattern *This,
        IUIAutomationTextRangeArray **ranges);

    HRESULT (STDMETHODCALLTYPE *get_DocumentRange)(
        IUIAutomationTextEditPattern *This,
        IUIAutomationTextRange **range);

    HRESULT (STDMETHODCALLTYPE *get_SupportedTextSelection)(
        IUIAutomationTextEditPattern *This,
        enum SupportedTextSelection *supportedTextSelection);

    /*** IUIAutomationTextEditPattern methods ***/
    HRESULT (STDMETHODCALLTYPE *GetActiveComposition)(
        IUIAutomationTextEditPattern *This,
        IUIAutomationTextRange **range);

    HRESULT (STDMETHODCALLTYPE *GetConversionTarget)(
        IUIAutomationTextEditPattern *This,
        IUIAutomationTextRange **range);

    END_INTERFACE
} IUIAutomationTextEditPatternVtbl;

interface IUIAutomationTextEditPattern {
    CONST_VTBL IUIAutomationTextEditPatternVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationTextEditPattern_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationTextEditPattern_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationTextEditPattern_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationTextPattern methods ***/
#define IUIAutomationTextEditPattern_RangeFromPoint(This,pt,range) (This)->lpVtbl->RangeFromPoint(This,pt,range)
#define IUIAutomationTextEditPattern_RangeFromChild(This,child,range) (This)->lpVtbl->RangeFromChild(This,child,range)
#define IUIAutomationTextEditPattern_GetSelection(This,ranges) (This)->lpVtbl->GetSelection(This,ranges)
#define IUIAutomationTextEditPattern_GetVisibleRanges(This,ranges) (This)->lpVtbl->GetVisibleRanges(This,ranges)
#define IUIAutomationTextEditPattern_get_DocumentRange(This,range) (This)->lpVtbl->get_DocumentRange(This,range)
#define IUIAutomationTextEditPattern_get_SupportedTextSelection(This,supportedTextSelection) (This)->lpVtbl->get_SupportedTextSelection(This,supportedTextSelection)
/*** IUIAutomationTextEditPattern methods ***/
#define IUIAutomationTextEditPattern_GetActiveComposition(This,range) (This)->lpVtbl->GetActiveComposition(This,range)
#define IUIAutomationTextEditPattern_GetConversionTarget(This,range) (This)->lpVtbl->GetConversionTarget(This,range)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationTextEditPattern_QueryInterface(IUIAutomationTextEditPattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationTextEditPattern_AddRef(IUIAutomationTextEditPattern* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationTextEditPattern_Release(IUIAutomationTextEditPattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationTextPattern methods ***/
static __WIDL_INLINE HRESULT IUIAutomationTextEditPattern_RangeFromPoint(IUIAutomationTextEditPattern* This,POINT pt,IUIAutomationTextRange **range) {
    return This->lpVtbl->RangeFromPoint(This,pt,range);
}
static __WIDL_INLINE HRESULT IUIAutomationTextEditPattern_RangeFromChild(IUIAutomationTextEditPattern* This,IUIAutomationElement *child,IUIAutomationTextRange **range) {
    return This->lpVtbl->RangeFromChild(This,child,range);
}
static __WIDL_INLINE HRESULT IUIAutomationTextEditPattern_GetSelection(IUIAutomationTextEditPattern* This,IUIAutomationTextRangeArray **ranges) {
    return This->lpVtbl->GetSelection(This,ranges);
}
static __WIDL_INLINE HRESULT IUIAutomationTextEditPattern_GetVisibleRanges(IUIAutomationTextEditPattern* This,IUIAutomationTextRangeArray **ranges) {
    return This->lpVtbl->GetVisibleRanges(This,ranges);
}
static __WIDL_INLINE HRESULT IUIAutomationTextEditPattern_get_DocumentRange(IUIAutomationTextEditPattern* This,IUIAutomationTextRange **range) {
    return This->lpVtbl->get_DocumentRange(This,range);
}
static __WIDL_INLINE HRESULT IUIAutomationTextEditPattern_get_SupportedTextSelection(IUIAutomationTextEditPattern* This,enum SupportedTextSelection *supportedTextSelection) {
    return This->lpVtbl->get_SupportedTextSelection(This,supportedTextSelection);
}
/*** IUIAutomationTextEditPattern methods ***/
static __WIDL_INLINE HRESULT IUIAutomationTextEditPattern_GetActiveComposition(IUIAutomationTextEditPattern* This,IUIAutomationTextRange **range) {
    return This->lpVtbl->GetActiveComposition(This,range);
}
static __WIDL_INLINE HRESULT IUIAutomationTextEditPattern_GetConversionTarget(IUIAutomationTextEditPattern* This,IUIAutomationTextRange **range) {
    return This->lpVtbl->GetConversionTarget(This,range);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationTextEditPattern_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationCustomNavigationPattern interface
 */
#ifndef __IUIAutomationCustomNavigationPattern_INTERFACE_DEFINED__
#define __IUIAutomationCustomNavigationPattern_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationCustomNavigationPattern, 0x01ea217a, 0x1766, 0x47ed, 0xa6,0xcc, 0xac,0xf4,0x92,0x85,0x4b,0x1f);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("01ea217a-1766-47ed-a6cc-acf492854b1f")
IUIAutomationCustomNavigationPattern : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Navigate(
        enum NavigateDirection direction,
        IUIAutomationElement **pRetVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationCustomNavigationPattern, 0x01ea217a, 0x1766, 0x47ed, 0xa6,0xcc, 0xac,0xf4,0x92,0x85,0x4b,0x1f)
#endif
#else
typedef struct IUIAutomationCustomNavigationPatternVtbl {
    BEGIN_INTERFACE

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

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

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

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

    END_INTERFACE
} IUIAutomationCustomNavigationPatternVtbl;

interface IUIAutomationCustomNavigationPattern {
    CONST_VTBL IUIAutomationCustomNavigationPatternVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationCustomNavigationPattern_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationCustomNavigationPattern_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationCustomNavigationPattern_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationCustomNavigationPattern methods ***/
#define IUIAutomationCustomNavigationPattern_Navigate(This,direction,pRetVal) (This)->lpVtbl->Navigate(This,direction,pRetVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationCustomNavigationPattern_QueryInterface(IUIAutomationCustomNavigationPattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationCustomNavigationPattern_AddRef(IUIAutomationCustomNavigationPattern* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationCustomNavigationPattern_Release(IUIAutomationCustomNavigationPattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationCustomNavigationPattern methods ***/
static __WIDL_INLINE HRESULT IUIAutomationCustomNavigationPattern_Navigate(IUIAutomationCustomNavigationPattern* This,enum NavigateDirection direction,IUIAutomationElement **pRetVal) {
    return This->lpVtbl->Navigate(This,direction,pRetVal);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationCustomNavigationPattern_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationActiveTextPositionChangedEventHandler interface
 */
#ifndef __IUIAutomationActiveTextPositionChangedEventHandler_INTERFACE_DEFINED__
#define __IUIAutomationActiveTextPositionChangedEventHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationActiveTextPositionChangedEventHandler, 0xf97933b0, 0x8dae, 0x4496, 0x89,0x97, 0x5b,0xa0,0x15,0xfe,0x0d,0x82);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("f97933b0-8dae-4496-8997-5ba015fe0d82")
IUIAutomationActiveTextPositionChangedEventHandler : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE HandleActiveTextPositionChangedEvent(
        IUIAutomationElement *sender,
        IUIAutomationTextRange *range) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationActiveTextPositionChangedEventHandler, 0xf97933b0, 0x8dae, 0x4496, 0x89,0x97, 0x5b,0xa0,0x15,0xfe,0x0d,0x82)
#endif
#else
typedef struct IUIAutomationActiveTextPositionChangedEventHandlerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomationActiveTextPositionChangedEventHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *HandleActiveTextPositionChangedEvent)(
        IUIAutomationActiveTextPositionChangedEventHandler *This,
        IUIAutomationElement *sender,
        IUIAutomationTextRange *range);

    END_INTERFACE
} IUIAutomationActiveTextPositionChangedEventHandlerVtbl;

interface IUIAutomationActiveTextPositionChangedEventHandler {
    CONST_VTBL IUIAutomationActiveTextPositionChangedEventHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationActiveTextPositionChangedEventHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationActiveTextPositionChangedEventHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationActiveTextPositionChangedEventHandler_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationActiveTextPositionChangedEventHandler methods ***/
#define IUIAutomationActiveTextPositionChangedEventHandler_HandleActiveTextPositionChangedEvent(This,sender,range) (This)->lpVtbl->HandleActiveTextPositionChangedEvent(This,sender,range)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationActiveTextPositionChangedEventHandler_QueryInterface(IUIAutomationActiveTextPositionChangedEventHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationActiveTextPositionChangedEventHandler_AddRef(IUIAutomationActiveTextPositionChangedEventHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationActiveTextPositionChangedEventHandler_Release(IUIAutomationActiveTextPositionChangedEventHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationActiveTextPositionChangedEventHandler methods ***/
static __WIDL_INLINE HRESULT IUIAutomationActiveTextPositionChangedEventHandler_HandleActiveTextPositionChangedEvent(IUIAutomationActiveTextPositionChangedEventHandler* This,IUIAutomationElement *sender,IUIAutomationTextRange *range) {
    return This->lpVtbl->HandleActiveTextPositionChangedEvent(This,sender,range);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationActiveTextPositionChangedEventHandler_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationLegacyIAccessiblePattern interface
 */
#ifndef __IUIAutomationLegacyIAccessiblePattern_INTERFACE_DEFINED__
#define __IUIAutomationLegacyIAccessiblePattern_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationLegacyIAccessiblePattern, 0x828055ad, 0x355b, 0x4435, 0x86,0xd5, 0x3b,0x51,0xc1,0x4a,0x9b,0x1b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("828055ad-355b-4435-86d5-3b51c14a9b1b")
IUIAutomationLegacyIAccessiblePattern : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Select(
        LONG flagsSelect) = 0;

    virtual HRESULT STDMETHODCALLTYPE DoDefaultAction(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetValue(
        LPCWSTR szValue) = 0;

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

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

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

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

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

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

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

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

    virtual HRESULT STDMETHODCALLTYPE GetCurrentSelection(
        IUIAutomationElementArray **pvarSelectedChildren) = 0;

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

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

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

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

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

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

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

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

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

    virtual HRESULT STDMETHODCALLTYPE GetCachedSelection(
        IUIAutomationElementArray **pvarSelectedChildren) = 0;

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

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

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationLegacyIAccessiblePattern, 0x828055ad, 0x355b, 0x4435, 0x86,0xd5, 0x3b,0x51,0xc1,0x4a,0x9b,0x1b)
#endif
#else
typedef struct IUIAutomationLegacyIAccessiblePatternVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    HRESULT (STDMETHODCALLTYPE *get_CurrentChildId)(
        IUIAutomationLegacyIAccessiblePattern *This,
        int *pRetVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentName)(
        IUIAutomationLegacyIAccessiblePattern *This,
        BSTR *pszName);

    HRESULT (STDMETHODCALLTYPE *get_CurrentValue)(
        IUIAutomationLegacyIAccessiblePattern *This,
        BSTR *pszValue);

    HRESULT (STDMETHODCALLTYPE *get_CurrentDescription)(
        IUIAutomationLegacyIAccessiblePattern *This,
        BSTR *pszDescription);

    HRESULT (STDMETHODCALLTYPE *get_CurrentRole)(
        IUIAutomationLegacyIAccessiblePattern *This,
        DWORD *pdwRole);

    HRESULT (STDMETHODCALLTYPE *get_CurrentState)(
        IUIAutomationLegacyIAccessiblePattern *This,
        DWORD *pdwState);

    HRESULT (STDMETHODCALLTYPE *get_CurrentHelp)(
        IUIAutomationLegacyIAccessiblePattern *This,
        BSTR *pszHelp);

    HRESULT (STDMETHODCALLTYPE *get_CurrentKeyboardShortcut)(
        IUIAutomationLegacyIAccessiblePattern *This,
        BSTR *pszKeyboardShortcut);

    HRESULT (STDMETHODCALLTYPE *GetCurrentSelection)(
        IUIAutomationLegacyIAccessiblePattern *This,
        IUIAutomationElementArray **pvarSelectedChildren);

    HRESULT (STDMETHODCALLTYPE *get_CurrentDefaultAction)(
        IUIAutomationLegacyIAccessiblePattern *This,
        BSTR *pszDefaultAction);

    HRESULT (STDMETHODCALLTYPE *get_CachedChildId)(
        IUIAutomationLegacyIAccessiblePattern *This,
        int *pRetVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedName)(
        IUIAutomationLegacyIAccessiblePattern *This,
        BSTR *pszName);

    HRESULT (STDMETHODCALLTYPE *get_CachedValue)(
        IUIAutomationLegacyIAccessiblePattern *This,
        BSTR *pszValue);

    HRESULT (STDMETHODCALLTYPE *get_CachedDescription)(
        IUIAutomationLegacyIAccessiblePattern *This,
        BSTR *pszDescription);

    HRESULT (STDMETHODCALLTYPE *get_CachedRole)(
        IUIAutomationLegacyIAccessiblePattern *This,
        DWORD *pdwRole);

    HRESULT (STDMETHODCALLTYPE *get_CachedState)(
        IUIAutomationLegacyIAccessiblePattern *This,
        DWORD *pdwState);

    HRESULT (STDMETHODCALLTYPE *get_CachedHelp)(
        IUIAutomationLegacyIAccessiblePattern *This,
        BSTR *pszHelp);

    HRESULT (STDMETHODCALLTYPE *get_CachedKeyboardShortcut)(
        IUIAutomationLegacyIAccessiblePattern *This,
        BSTR *pszKeyboardShortcut);

    HRESULT (STDMETHODCALLTYPE *GetCachedSelection)(
        IUIAutomationLegacyIAccessiblePattern *This,
        IUIAutomationElementArray **pvarSelectedChildren);

    HRESULT (STDMETHODCALLTYPE *get_CachedDefaultAction)(
        IUIAutomationLegacyIAccessiblePattern *This,
        BSTR *pszDefaultAction);

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

    END_INTERFACE
} IUIAutomationLegacyIAccessiblePatternVtbl;

interface IUIAutomationLegacyIAccessiblePattern {
    CONST_VTBL IUIAutomationLegacyIAccessiblePatternVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationLegacyIAccessiblePattern_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationLegacyIAccessiblePattern_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationLegacyIAccessiblePattern_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationLegacyIAccessiblePattern methods ***/
#define IUIAutomationLegacyIAccessiblePattern_Select(This,flagsSelect) (This)->lpVtbl->Select(This,flagsSelect)
#define IUIAutomationLegacyIAccessiblePattern_DoDefaultAction(This) (This)->lpVtbl->DoDefaultAction(This)
#define IUIAutomationLegacyIAccessiblePattern_SetValue(This,szValue) (This)->lpVtbl->SetValue(This,szValue)
#define IUIAutomationLegacyIAccessiblePattern_get_CurrentChildId(This,pRetVal) (This)->lpVtbl->get_CurrentChildId(This,pRetVal)
#define IUIAutomationLegacyIAccessiblePattern_get_CurrentName(This,pszName) (This)->lpVtbl->get_CurrentName(This,pszName)
#define IUIAutomationLegacyIAccessiblePattern_get_CurrentValue(This,pszValue) (This)->lpVtbl->get_CurrentValue(This,pszValue)
#define IUIAutomationLegacyIAccessiblePattern_get_CurrentDescription(This,pszDescription) (This)->lpVtbl->get_CurrentDescription(This,pszDescription)
#define IUIAutomationLegacyIAccessiblePattern_get_CurrentRole(This,pdwRole) (This)->lpVtbl->get_CurrentRole(This,pdwRole)
#define IUIAutomationLegacyIAccessiblePattern_get_CurrentState(This,pdwState) (This)->lpVtbl->get_CurrentState(This,pdwState)
#define IUIAutomationLegacyIAccessiblePattern_get_CurrentHelp(This,pszHelp) (This)->lpVtbl->get_CurrentHelp(This,pszHelp)
#define IUIAutomationLegacyIAccessiblePattern_get_CurrentKeyboardShortcut(This,pszKeyboardShortcut) (This)->lpVtbl->get_CurrentKeyboardShortcut(This,pszKeyboardShortcut)
#define IUIAutomationLegacyIAccessiblePattern_GetCurrentSelection(This,pvarSelectedChildren) (This)->lpVtbl->GetCurrentSelection(This,pvarSelectedChildren)
#define IUIAutomationLegacyIAccessiblePattern_get_CurrentDefaultAction(This,pszDefaultAction) (This)->lpVtbl->get_CurrentDefaultAction(This,pszDefaultAction)
#define IUIAutomationLegacyIAccessiblePattern_get_CachedChildId(This,pRetVal) (This)->lpVtbl->get_CachedChildId(This,pRetVal)
#define IUIAutomationLegacyIAccessiblePattern_get_CachedName(This,pszName) (This)->lpVtbl->get_CachedName(This,pszName)
#define IUIAutomationLegacyIAccessiblePattern_get_CachedValue(This,pszValue) (This)->lpVtbl->get_CachedValue(This,pszValue)
#define IUIAutomationLegacyIAccessiblePattern_get_CachedDescription(This,pszDescription) (This)->lpVtbl->get_CachedDescription(This,pszDescription)
#define IUIAutomationLegacyIAccessiblePattern_get_CachedRole(This,pdwRole) (This)->lpVtbl->get_CachedRole(This,pdwRole)
#define IUIAutomationLegacyIAccessiblePattern_get_CachedState(This,pdwState) (This)->lpVtbl->get_CachedState(This,pdwState)
#define IUIAutomationLegacyIAccessiblePattern_get_CachedHelp(This,pszHelp) (This)->lpVtbl->get_CachedHelp(This,pszHelp)
#define IUIAutomationLegacyIAccessiblePattern_get_CachedKeyboardShortcut(This,pszKeyboardShortcut) (This)->lpVtbl->get_CachedKeyboardShortcut(This,pszKeyboardShortcut)
#define IUIAutomationLegacyIAccessiblePattern_GetCachedSelection(This,pvarSelectedChildren) (This)->lpVtbl->GetCachedSelection(This,pvarSelectedChildren)
#define IUIAutomationLegacyIAccessiblePattern_get_CachedDefaultAction(This,pszDefaultAction) (This)->lpVtbl->get_CachedDefaultAction(This,pszDefaultAction)
#define IUIAutomationLegacyIAccessiblePattern_GetIAccessible(This,ppAccessible) (This)->lpVtbl->GetIAccessible(This,ppAccessible)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationLegacyIAccessiblePattern_QueryInterface(IUIAutomationLegacyIAccessiblePattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationLegacyIAccessiblePattern_AddRef(IUIAutomationLegacyIAccessiblePattern* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationLegacyIAccessiblePattern_Release(IUIAutomationLegacyIAccessiblePattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationLegacyIAccessiblePattern methods ***/
static __WIDL_INLINE HRESULT IUIAutomationLegacyIAccessiblePattern_Select(IUIAutomationLegacyIAccessiblePattern* This,LONG flagsSelect) {
    return This->lpVtbl->Select(This,flagsSelect);
}
static __WIDL_INLINE HRESULT IUIAutomationLegacyIAccessiblePattern_DoDefaultAction(IUIAutomationLegacyIAccessiblePattern* This) {
    return This->lpVtbl->DoDefaultAction(This);
}
static __WIDL_INLINE HRESULT IUIAutomationLegacyIAccessiblePattern_SetValue(IUIAutomationLegacyIAccessiblePattern* This,LPCWSTR szValue) {
    return This->lpVtbl->SetValue(This,szValue);
}
static __WIDL_INLINE HRESULT IUIAutomationLegacyIAccessiblePattern_get_CurrentChildId(IUIAutomationLegacyIAccessiblePattern* This,int *pRetVal) {
    return This->lpVtbl->get_CurrentChildId(This,pRetVal);
}
static __WIDL_INLINE HRESULT IUIAutomationLegacyIAccessiblePattern_get_CurrentName(IUIAutomationLegacyIAccessiblePattern* This,BSTR *pszName) {
    return This->lpVtbl->get_CurrentName(This,pszName);
}
static __WIDL_INLINE HRESULT IUIAutomationLegacyIAccessiblePattern_get_CurrentValue(IUIAutomationLegacyIAccessiblePattern* This,BSTR *pszValue) {
    return This->lpVtbl->get_CurrentValue(This,pszValue);
}
static __WIDL_INLINE HRESULT IUIAutomationLegacyIAccessiblePattern_get_CurrentDescription(IUIAutomationLegacyIAccessiblePattern* This,BSTR *pszDescription) {
    return This->lpVtbl->get_CurrentDescription(This,pszDescription);
}
static __WIDL_INLINE HRESULT IUIAutomationLegacyIAccessiblePattern_get_CurrentRole(IUIAutomationLegacyIAccessiblePattern* This,DWORD *pdwRole) {
    return This->lpVtbl->get_CurrentRole(This,pdwRole);
}
static __WIDL_INLINE HRESULT IUIAutomationLegacyIAccessiblePattern_get_CurrentState(IUIAutomationLegacyIAccessiblePattern* This,DWORD *pdwState) {
    return This->lpVtbl->get_CurrentState(This,pdwState);
}
static __WIDL_INLINE HRESULT IUIAutomationLegacyIAccessiblePattern_get_CurrentHelp(IUIAutomationLegacyIAccessiblePattern* This,BSTR *pszHelp) {
    return This->lpVtbl->get_CurrentHelp(This,pszHelp);
}
static __WIDL_INLINE HRESULT IUIAutomationLegacyIAccessiblePattern_get_CurrentKeyboardShortcut(IUIAutomationLegacyIAccessiblePattern* This,BSTR *pszKeyboardShortcut) {
    return This->lpVtbl->get_CurrentKeyboardShortcut(This,pszKeyboardShortcut);
}
static __WIDL_INLINE HRESULT IUIAutomationLegacyIAccessiblePattern_GetCurrentSelection(IUIAutomationLegacyIAccessiblePattern* This,IUIAutomationElementArray **pvarSelectedChildren) {
    return This->lpVtbl->GetCurrentSelection(This,pvarSelectedChildren);
}
static __WIDL_INLINE HRESULT IUIAutomationLegacyIAccessiblePattern_get_CurrentDefaultAction(IUIAutomationLegacyIAccessiblePattern* This,BSTR *pszDefaultAction) {
    return This->lpVtbl->get_CurrentDefaultAction(This,pszDefaultAction);
}
static __WIDL_INLINE HRESULT IUIAutomationLegacyIAccessiblePattern_get_CachedChildId(IUIAutomationLegacyIAccessiblePattern* This,int *pRetVal) {
    return This->lpVtbl->get_CachedChildId(This,pRetVal);
}
static __WIDL_INLINE HRESULT IUIAutomationLegacyIAccessiblePattern_get_CachedName(IUIAutomationLegacyIAccessiblePattern* This,BSTR *pszName) {
    return This->lpVtbl->get_CachedName(This,pszName);
}
static __WIDL_INLINE HRESULT IUIAutomationLegacyIAccessiblePattern_get_CachedValue(IUIAutomationLegacyIAccessiblePattern* This,BSTR *pszValue) {
    return This->lpVtbl->get_CachedValue(This,pszValue);
}
static __WIDL_INLINE HRESULT IUIAutomationLegacyIAccessiblePattern_get_CachedDescription(IUIAutomationLegacyIAccessiblePattern* This,BSTR *pszDescription) {
    return This->lpVtbl->get_CachedDescription(This,pszDescription);
}
static __WIDL_INLINE HRESULT IUIAutomationLegacyIAccessiblePattern_get_CachedRole(IUIAutomationLegacyIAccessiblePattern* This,DWORD *pdwRole) {
    return This->lpVtbl->get_CachedRole(This,pdwRole);
}
static __WIDL_INLINE HRESULT IUIAutomationLegacyIAccessiblePattern_get_CachedState(IUIAutomationLegacyIAccessiblePattern* This,DWORD *pdwState) {
    return This->lpVtbl->get_CachedState(This,pdwState);
}
static __WIDL_INLINE HRESULT IUIAutomationLegacyIAccessiblePattern_get_CachedHelp(IUIAutomationLegacyIAccessiblePattern* This,BSTR *pszHelp) {
    return This->lpVtbl->get_CachedHelp(This,pszHelp);
}
static __WIDL_INLINE HRESULT IUIAutomationLegacyIAccessiblePattern_get_CachedKeyboardShortcut(IUIAutomationLegacyIAccessiblePattern* This,BSTR *pszKeyboardShortcut) {
    return This->lpVtbl->get_CachedKeyboardShortcut(This,pszKeyboardShortcut);
}
static __WIDL_INLINE HRESULT IUIAutomationLegacyIAccessiblePattern_GetCachedSelection(IUIAutomationLegacyIAccessiblePattern* This,IUIAutomationElementArray **pvarSelectedChildren) {
    return This->lpVtbl->GetCachedSelection(This,pvarSelectedChildren);
}
static __WIDL_INLINE HRESULT IUIAutomationLegacyIAccessiblePattern_get_CachedDefaultAction(IUIAutomationLegacyIAccessiblePattern* This,BSTR *pszDefaultAction) {
    return This->lpVtbl->get_CachedDefaultAction(This,pszDefaultAction);
}
static __WIDL_INLINE HRESULT IUIAutomationLegacyIAccessiblePattern_GetIAccessible(IUIAutomationLegacyIAccessiblePattern* This,IAccessible **ppAccessible) {
    return This->lpVtbl->GetIAccessible(This,ppAccessible);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationLegacyIAccessiblePattern_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationItemContainerPattern interface
 */
#ifndef __IUIAutomationItemContainerPattern_INTERFACE_DEFINED__
#define __IUIAutomationItemContainerPattern_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationItemContainerPattern, 0xc690fdb2, 0x27a8, 0x423c, 0x81,0x2d, 0x42,0x97,0x73,0xc9,0x08,0x4e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c690fdb2-27a8-423c-812d-429773c9084e")
IUIAutomationItemContainerPattern : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE FindItemByProperty(
        IUIAutomationElement *pStartAfter,
        PROPERTYID propertyId,
        VARIANT value,
        IUIAutomationElement **pFound) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationItemContainerPattern, 0xc690fdb2, 0x27a8, 0x423c, 0x81,0x2d, 0x42,0x97,0x73,0xc9,0x08,0x4e)
#endif
#else
typedef struct IUIAutomationItemContainerPatternVtbl {
    BEGIN_INTERFACE

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

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

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

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

    END_INTERFACE
} IUIAutomationItemContainerPatternVtbl;

interface IUIAutomationItemContainerPattern {
    CONST_VTBL IUIAutomationItemContainerPatternVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationItemContainerPattern_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationItemContainerPattern_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationItemContainerPattern_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationItemContainerPattern methods ***/
#define IUIAutomationItemContainerPattern_FindItemByProperty(This,pStartAfter,propertyId,value,pFound) (This)->lpVtbl->FindItemByProperty(This,pStartAfter,propertyId,value,pFound)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationItemContainerPattern_QueryInterface(IUIAutomationItemContainerPattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationItemContainerPattern_AddRef(IUIAutomationItemContainerPattern* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationItemContainerPattern_Release(IUIAutomationItemContainerPattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationItemContainerPattern methods ***/
static __WIDL_INLINE HRESULT IUIAutomationItemContainerPattern_FindItemByProperty(IUIAutomationItemContainerPattern* This,IUIAutomationElement *pStartAfter,PROPERTYID propertyId,VARIANT value,IUIAutomationElement **pFound) {
    return This->lpVtbl->FindItemByProperty(This,pStartAfter,propertyId,value,pFound);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationItemContainerPattern_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationVirtualizedItemPattern interface
 */
#ifndef __IUIAutomationVirtualizedItemPattern_INTERFACE_DEFINED__
#define __IUIAutomationVirtualizedItemPattern_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationVirtualizedItemPattern, 0x6ba3d7a6, 0x04cf, 0x4f11, 0x87,0x93, 0xa8,0xd1,0xcd,0xe9,0x96,0x9f);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("6ba3d7a6-04cf-4f11-8793-a8d1cde9969f")
IUIAutomationVirtualizedItemPattern : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Realize(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationVirtualizedItemPattern, 0x6ba3d7a6, 0x04cf, 0x4f11, 0x87,0x93, 0xa8,0xd1,0xcd,0xe9,0x96,0x9f)
#endif
#else
typedef struct IUIAutomationVirtualizedItemPatternVtbl {
    BEGIN_INTERFACE

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

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

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

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

    END_INTERFACE
} IUIAutomationVirtualizedItemPatternVtbl;

interface IUIAutomationVirtualizedItemPattern {
    CONST_VTBL IUIAutomationVirtualizedItemPatternVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationVirtualizedItemPattern_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationVirtualizedItemPattern_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationVirtualizedItemPattern_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationVirtualizedItemPattern methods ***/
#define IUIAutomationVirtualizedItemPattern_Realize(This) (This)->lpVtbl->Realize(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationVirtualizedItemPattern_QueryInterface(IUIAutomationVirtualizedItemPattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationVirtualizedItemPattern_AddRef(IUIAutomationVirtualizedItemPattern* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationVirtualizedItemPattern_Release(IUIAutomationVirtualizedItemPattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationVirtualizedItemPattern methods ***/
static __WIDL_INLINE HRESULT IUIAutomationVirtualizedItemPattern_Realize(IUIAutomationVirtualizedItemPattern* This) {
    return This->lpVtbl->Realize(This);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationVirtualizedItemPattern_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationAnnotationPattern interface
 */
#ifndef __IUIAutomationAnnotationPattern_INTERFACE_DEFINED__
#define __IUIAutomationAnnotationPattern_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationAnnotationPattern, 0x9a175b21, 0x339e, 0x41b1, 0x8e,0x8b, 0x62,0x3f,0x6b,0x68,0x10,0x98);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("9a175b21-339e-41b1-8e8b-623f6b681098")
IUIAutomationAnnotationPattern : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE get_CurrentAnnotationTypeId(
        int *retVal) = 0;

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

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

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

    virtual HRESULT STDMETHODCALLTYPE get_CurrentTarget(
        IUIAutomationElement **retVal) = 0;

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

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

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

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

    virtual HRESULT STDMETHODCALLTYPE get_CachedTarget(
        IUIAutomationElement **retVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationAnnotationPattern, 0x9a175b21, 0x339e, 0x41b1, 0x8e,0x8b, 0x62,0x3f,0x6b,0x68,0x10,0x98)
#endif
#else
typedef struct IUIAutomationAnnotationPatternVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomationAnnotationPattern methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CurrentAnnotationTypeId)(
        IUIAutomationAnnotationPattern *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAnnotationTypeName)(
        IUIAutomationAnnotationPattern *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAuthor)(
        IUIAutomationAnnotationPattern *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentDateTime)(
        IUIAutomationAnnotationPattern *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentTarget)(
        IUIAutomationAnnotationPattern *This,
        IUIAutomationElement **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAnnotationTypeId)(
        IUIAutomationAnnotationPattern *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAnnotationTypeName)(
        IUIAutomationAnnotationPattern *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAuthor)(
        IUIAutomationAnnotationPattern *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedDateTime)(
        IUIAutomationAnnotationPattern *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedTarget)(
        IUIAutomationAnnotationPattern *This,
        IUIAutomationElement **retVal);

    END_INTERFACE
} IUIAutomationAnnotationPatternVtbl;

interface IUIAutomationAnnotationPattern {
    CONST_VTBL IUIAutomationAnnotationPatternVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationAnnotationPattern_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationAnnotationPattern_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationAnnotationPattern_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationAnnotationPattern methods ***/
#define IUIAutomationAnnotationPattern_get_CurrentAnnotationTypeId(This,retVal) (This)->lpVtbl->get_CurrentAnnotationTypeId(This,retVal)
#define IUIAutomationAnnotationPattern_get_CurrentAnnotationTypeName(This,retVal) (This)->lpVtbl->get_CurrentAnnotationTypeName(This,retVal)
#define IUIAutomationAnnotationPattern_get_CurrentAuthor(This,retVal) (This)->lpVtbl->get_CurrentAuthor(This,retVal)
#define IUIAutomationAnnotationPattern_get_CurrentDateTime(This,retVal) (This)->lpVtbl->get_CurrentDateTime(This,retVal)
#define IUIAutomationAnnotationPattern_get_CurrentTarget(This,retVal) (This)->lpVtbl->get_CurrentTarget(This,retVal)
#define IUIAutomationAnnotationPattern_get_CachedAnnotationTypeId(This,retVal) (This)->lpVtbl->get_CachedAnnotationTypeId(This,retVal)
#define IUIAutomationAnnotationPattern_get_CachedAnnotationTypeName(This,retVal) (This)->lpVtbl->get_CachedAnnotationTypeName(This,retVal)
#define IUIAutomationAnnotationPattern_get_CachedAuthor(This,retVal) (This)->lpVtbl->get_CachedAuthor(This,retVal)
#define IUIAutomationAnnotationPattern_get_CachedDateTime(This,retVal) (This)->lpVtbl->get_CachedDateTime(This,retVal)
#define IUIAutomationAnnotationPattern_get_CachedTarget(This,retVal) (This)->lpVtbl->get_CachedTarget(This,retVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationAnnotationPattern_QueryInterface(IUIAutomationAnnotationPattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationAnnotationPattern_AddRef(IUIAutomationAnnotationPattern* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationAnnotationPattern_Release(IUIAutomationAnnotationPattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationAnnotationPattern methods ***/
static __WIDL_INLINE HRESULT IUIAutomationAnnotationPattern_get_CurrentAnnotationTypeId(IUIAutomationAnnotationPattern* This,int *retVal) {
    return This->lpVtbl->get_CurrentAnnotationTypeId(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationAnnotationPattern_get_CurrentAnnotationTypeName(IUIAutomationAnnotationPattern* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAnnotationTypeName(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationAnnotationPattern_get_CurrentAuthor(IUIAutomationAnnotationPattern* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAuthor(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationAnnotationPattern_get_CurrentDateTime(IUIAutomationAnnotationPattern* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentDateTime(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationAnnotationPattern_get_CurrentTarget(IUIAutomationAnnotationPattern* This,IUIAutomationElement **retVal) {
    return This->lpVtbl->get_CurrentTarget(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationAnnotationPattern_get_CachedAnnotationTypeId(IUIAutomationAnnotationPattern* This,int *retVal) {
    return This->lpVtbl->get_CachedAnnotationTypeId(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationAnnotationPattern_get_CachedAnnotationTypeName(IUIAutomationAnnotationPattern* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAnnotationTypeName(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationAnnotationPattern_get_CachedAuthor(IUIAutomationAnnotationPattern* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAuthor(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationAnnotationPattern_get_CachedDateTime(IUIAutomationAnnotationPattern* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedDateTime(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationAnnotationPattern_get_CachedTarget(IUIAutomationAnnotationPattern* This,IUIAutomationElement **retVal) {
    return This->lpVtbl->get_CachedTarget(This,retVal);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationAnnotationPattern_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationStylesPattern interface
 */
#ifndef __IUIAutomationStylesPattern_INTERFACE_DEFINED__
#define __IUIAutomationStylesPattern_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationStylesPattern, 0x85b5f0a2, 0xbd79, 0x484a, 0xad,0x2b, 0x38,0x8c,0x98,0x38,0xd5,0xfb);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("85b5f0a2-bd79-484a-ad2b-388c9838d5fb")
IUIAutomationStylesPattern : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE get_CurrentStyleId(
        int *retVal) = 0;

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

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

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

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

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

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

    virtual HRESULT STDMETHODCALLTYPE GetCurrentExtendedPropertiesAsArray(
        struct ExtendedProperty **propertyArray,
        int *propertyCount) = 0;

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

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

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

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

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

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

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

    virtual HRESULT STDMETHODCALLTYPE GetCachedExtendedPropertiesAsArray(
        struct ExtendedProperty **propertyArray,
        int *propertyCount) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationStylesPattern, 0x85b5f0a2, 0xbd79, 0x484a, 0xad,0x2b, 0x38,0x8c,0x98,0x38,0xd5,0xfb)
#endif
#else
typedef struct IUIAutomationStylesPatternVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomationStylesPattern methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CurrentStyleId)(
        IUIAutomationStylesPattern *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentStyleName)(
        IUIAutomationStylesPattern *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentFillColor)(
        IUIAutomationStylesPattern *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentFillPatternStyle)(
        IUIAutomationStylesPattern *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentShape)(
        IUIAutomationStylesPattern *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentFillPatternColor)(
        IUIAutomationStylesPattern *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentExtendedProperties)(
        IUIAutomationStylesPattern *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *GetCurrentExtendedPropertiesAsArray)(
        IUIAutomationStylesPattern *This,
        struct ExtendedProperty **propertyArray,
        int *propertyCount);

    HRESULT (STDMETHODCALLTYPE *get_CachedStyleId)(
        IUIAutomationStylesPattern *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedStyleName)(
        IUIAutomationStylesPattern *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedFillColor)(
        IUIAutomationStylesPattern *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedFillPatternStyle)(
        IUIAutomationStylesPattern *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedShape)(
        IUIAutomationStylesPattern *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedFillPatternColor)(
        IUIAutomationStylesPattern *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedExtendedProperties)(
        IUIAutomationStylesPattern *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *GetCachedExtendedPropertiesAsArray)(
        IUIAutomationStylesPattern *This,
        struct ExtendedProperty **propertyArray,
        int *propertyCount);

    END_INTERFACE
} IUIAutomationStylesPatternVtbl;

interface IUIAutomationStylesPattern {
    CONST_VTBL IUIAutomationStylesPatternVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationStylesPattern_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationStylesPattern_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationStylesPattern_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationStylesPattern methods ***/
#define IUIAutomationStylesPattern_get_CurrentStyleId(This,retVal) (This)->lpVtbl->get_CurrentStyleId(This,retVal)
#define IUIAutomationStylesPattern_get_CurrentStyleName(This,retVal) (This)->lpVtbl->get_CurrentStyleName(This,retVal)
#define IUIAutomationStylesPattern_get_CurrentFillColor(This,retVal) (This)->lpVtbl->get_CurrentFillColor(This,retVal)
#define IUIAutomationStylesPattern_get_CurrentFillPatternStyle(This,retVal) (This)->lpVtbl->get_CurrentFillPatternStyle(This,retVal)
#define IUIAutomationStylesPattern_get_CurrentShape(This,retVal) (This)->lpVtbl->get_CurrentShape(This,retVal)
#define IUIAutomationStylesPattern_get_CurrentFillPatternColor(This,retVal) (This)->lpVtbl->get_CurrentFillPatternColor(This,retVal)
#define IUIAutomationStylesPattern_get_CurrentExtendedProperties(This,retVal) (This)->lpVtbl->get_CurrentExtendedProperties(This,retVal)
#define IUIAutomationStylesPattern_GetCurrentExtendedPropertiesAsArray(This,propertyArray,propertyCount) (This)->lpVtbl->GetCurrentExtendedPropertiesAsArray(This,propertyArray,propertyCount)
#define IUIAutomationStylesPattern_get_CachedStyleId(This,retVal) (This)->lpVtbl->get_CachedStyleId(This,retVal)
#define IUIAutomationStylesPattern_get_CachedStyleName(This,retVal) (This)->lpVtbl->get_CachedStyleName(This,retVal)
#define IUIAutomationStylesPattern_get_CachedFillColor(This,retVal) (This)->lpVtbl->get_CachedFillColor(This,retVal)
#define IUIAutomationStylesPattern_get_CachedFillPatternStyle(This,retVal) (This)->lpVtbl->get_CachedFillPatternStyle(This,retVal)
#define IUIAutomationStylesPattern_get_CachedShape(This,retVal) (This)->lpVtbl->get_CachedShape(This,retVal)
#define IUIAutomationStylesPattern_get_CachedFillPatternColor(This,retVal) (This)->lpVtbl->get_CachedFillPatternColor(This,retVal)
#define IUIAutomationStylesPattern_get_CachedExtendedProperties(This,retVal) (This)->lpVtbl->get_CachedExtendedProperties(This,retVal)
#define IUIAutomationStylesPattern_GetCachedExtendedPropertiesAsArray(This,propertyArray,propertyCount) (This)->lpVtbl->GetCachedExtendedPropertiesAsArray(This,propertyArray,propertyCount)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationStylesPattern_QueryInterface(IUIAutomationStylesPattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationStylesPattern_AddRef(IUIAutomationStylesPattern* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationStylesPattern_Release(IUIAutomationStylesPattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationStylesPattern methods ***/
static __WIDL_INLINE HRESULT IUIAutomationStylesPattern_get_CurrentStyleId(IUIAutomationStylesPattern* This,int *retVal) {
    return This->lpVtbl->get_CurrentStyleId(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationStylesPattern_get_CurrentStyleName(IUIAutomationStylesPattern* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentStyleName(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationStylesPattern_get_CurrentFillColor(IUIAutomationStylesPattern* This,int *retVal) {
    return This->lpVtbl->get_CurrentFillColor(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationStylesPattern_get_CurrentFillPatternStyle(IUIAutomationStylesPattern* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentFillPatternStyle(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationStylesPattern_get_CurrentShape(IUIAutomationStylesPattern* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentShape(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationStylesPattern_get_CurrentFillPatternColor(IUIAutomationStylesPattern* This,int *retVal) {
    return This->lpVtbl->get_CurrentFillPatternColor(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationStylesPattern_get_CurrentExtendedProperties(IUIAutomationStylesPattern* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentExtendedProperties(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationStylesPattern_GetCurrentExtendedPropertiesAsArray(IUIAutomationStylesPattern* This,struct ExtendedProperty **propertyArray,int *propertyCount) {
    return This->lpVtbl->GetCurrentExtendedPropertiesAsArray(This,propertyArray,propertyCount);
}
static __WIDL_INLINE HRESULT IUIAutomationStylesPattern_get_CachedStyleId(IUIAutomationStylesPattern* This,int *retVal) {
    return This->lpVtbl->get_CachedStyleId(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationStylesPattern_get_CachedStyleName(IUIAutomationStylesPattern* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedStyleName(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationStylesPattern_get_CachedFillColor(IUIAutomationStylesPattern* This,int *retVal) {
    return This->lpVtbl->get_CachedFillColor(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationStylesPattern_get_CachedFillPatternStyle(IUIAutomationStylesPattern* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedFillPatternStyle(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationStylesPattern_get_CachedShape(IUIAutomationStylesPattern* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedShape(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationStylesPattern_get_CachedFillPatternColor(IUIAutomationStylesPattern* This,int *retVal) {
    return This->lpVtbl->get_CachedFillPatternColor(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationStylesPattern_get_CachedExtendedProperties(IUIAutomationStylesPattern* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedExtendedProperties(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationStylesPattern_GetCachedExtendedPropertiesAsArray(IUIAutomationStylesPattern* This,struct ExtendedProperty **propertyArray,int *propertyCount) {
    return This->lpVtbl->GetCachedExtendedPropertiesAsArray(This,propertyArray,propertyCount);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationStylesPattern_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationSpreadsheetPattern interface
 */
#ifndef __IUIAutomationSpreadsheetPattern_INTERFACE_DEFINED__
#define __IUIAutomationSpreadsheetPattern_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationSpreadsheetPattern, 0x7517a7c8, 0xfaae, 0x4de9, 0x9f,0x08, 0x29,0xb9,0x1e,0x85,0x95,0xc1);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("7517a7c8-faae-4de9-9f08-29b91e8595c1")
IUIAutomationSpreadsheetPattern : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetItemByName(
        BSTR name,
        IUIAutomationElement **element) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationSpreadsheetPattern, 0x7517a7c8, 0xfaae, 0x4de9, 0x9f,0x08, 0x29,0xb9,0x1e,0x85,0x95,0xc1)
#endif
#else
typedef struct IUIAutomationSpreadsheetPatternVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomationSpreadsheetPattern methods ***/
    HRESULT (STDMETHODCALLTYPE *GetItemByName)(
        IUIAutomationSpreadsheetPattern *This,
        BSTR name,
        IUIAutomationElement **element);

    END_INTERFACE
} IUIAutomationSpreadsheetPatternVtbl;

interface IUIAutomationSpreadsheetPattern {
    CONST_VTBL IUIAutomationSpreadsheetPatternVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationSpreadsheetPattern_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationSpreadsheetPattern_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationSpreadsheetPattern_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationSpreadsheetPattern methods ***/
#define IUIAutomationSpreadsheetPattern_GetItemByName(This,name,element) (This)->lpVtbl->GetItemByName(This,name,element)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationSpreadsheetPattern_QueryInterface(IUIAutomationSpreadsheetPattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationSpreadsheetPattern_AddRef(IUIAutomationSpreadsheetPattern* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationSpreadsheetPattern_Release(IUIAutomationSpreadsheetPattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationSpreadsheetPattern methods ***/
static __WIDL_INLINE HRESULT IUIAutomationSpreadsheetPattern_GetItemByName(IUIAutomationSpreadsheetPattern* This,BSTR name,IUIAutomationElement **element) {
    return This->lpVtbl->GetItemByName(This,name,element);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationSpreadsheetPattern_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationSpreadsheetItemPattern interface
 */
#ifndef __IUIAutomationSpreadsheetItemPattern_INTERFACE_DEFINED__
#define __IUIAutomationSpreadsheetItemPattern_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationSpreadsheetItemPattern, 0x7d4fb86c, 0x8d34, 0x40e1, 0x8e,0x83, 0x62,0xc1,0x52,0x04,0xe3,0x35);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("7d4fb86c-8d34-40e1-8e83-62c15204e335")
IUIAutomationSpreadsheetItemPattern : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE get_CurrentFormula(
        BSTR *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrentAnnotationObjects(
        IUIAutomationElementArray **retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrentAnnotationTypes(
        SAFEARRAY **retVal) = 0;

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

    virtual HRESULT STDMETHODCALLTYPE GetCachedAnnotationObjects(
        IUIAutomationElementArray **retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCachedAnnotationTypes(
        SAFEARRAY **retVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationSpreadsheetItemPattern, 0x7d4fb86c, 0x8d34, 0x40e1, 0x8e,0x83, 0x62,0xc1,0x52,0x04,0xe3,0x35)
#endif
#else
typedef struct IUIAutomationSpreadsheetItemPatternVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomationSpreadsheetItemPattern methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CurrentFormula)(
        IUIAutomationSpreadsheetItemPattern *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *GetCurrentAnnotationObjects)(
        IUIAutomationSpreadsheetItemPattern *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *GetCurrentAnnotationTypes)(
        IUIAutomationSpreadsheetItemPattern *This,
        SAFEARRAY **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedFormula)(
        IUIAutomationSpreadsheetItemPattern *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *GetCachedAnnotationObjects)(
        IUIAutomationSpreadsheetItemPattern *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *GetCachedAnnotationTypes)(
        IUIAutomationSpreadsheetItemPattern *This,
        SAFEARRAY **retVal);

    END_INTERFACE
} IUIAutomationSpreadsheetItemPatternVtbl;

interface IUIAutomationSpreadsheetItemPattern {
    CONST_VTBL IUIAutomationSpreadsheetItemPatternVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationSpreadsheetItemPattern_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationSpreadsheetItemPattern_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationSpreadsheetItemPattern_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationSpreadsheetItemPattern methods ***/
#define IUIAutomationSpreadsheetItemPattern_get_CurrentFormula(This,retVal) (This)->lpVtbl->get_CurrentFormula(This,retVal)
#define IUIAutomationSpreadsheetItemPattern_GetCurrentAnnotationObjects(This,retVal) (This)->lpVtbl->GetCurrentAnnotationObjects(This,retVal)
#define IUIAutomationSpreadsheetItemPattern_GetCurrentAnnotationTypes(This,retVal) (This)->lpVtbl->GetCurrentAnnotationTypes(This,retVal)
#define IUIAutomationSpreadsheetItemPattern_get_CachedFormula(This,retVal) (This)->lpVtbl->get_CachedFormula(This,retVal)
#define IUIAutomationSpreadsheetItemPattern_GetCachedAnnotationObjects(This,retVal) (This)->lpVtbl->GetCachedAnnotationObjects(This,retVal)
#define IUIAutomationSpreadsheetItemPattern_GetCachedAnnotationTypes(This,retVal) (This)->lpVtbl->GetCachedAnnotationTypes(This,retVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationSpreadsheetItemPattern_QueryInterface(IUIAutomationSpreadsheetItemPattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationSpreadsheetItemPattern_AddRef(IUIAutomationSpreadsheetItemPattern* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationSpreadsheetItemPattern_Release(IUIAutomationSpreadsheetItemPattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationSpreadsheetItemPattern methods ***/
static __WIDL_INLINE HRESULT IUIAutomationSpreadsheetItemPattern_get_CurrentFormula(IUIAutomationSpreadsheetItemPattern* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentFormula(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationSpreadsheetItemPattern_GetCurrentAnnotationObjects(IUIAutomationSpreadsheetItemPattern* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->GetCurrentAnnotationObjects(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationSpreadsheetItemPattern_GetCurrentAnnotationTypes(IUIAutomationSpreadsheetItemPattern* This,SAFEARRAY **retVal) {
    return This->lpVtbl->GetCurrentAnnotationTypes(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationSpreadsheetItemPattern_get_CachedFormula(IUIAutomationSpreadsheetItemPattern* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedFormula(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationSpreadsheetItemPattern_GetCachedAnnotationObjects(IUIAutomationSpreadsheetItemPattern* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->GetCachedAnnotationObjects(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationSpreadsheetItemPattern_GetCachedAnnotationTypes(IUIAutomationSpreadsheetItemPattern* This,SAFEARRAY **retVal) {
    return This->lpVtbl->GetCachedAnnotationTypes(This,retVal);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationSpreadsheetItemPattern_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationTransformPattern2 interface
 */
#ifndef __IUIAutomationTransformPattern2_INTERFACE_DEFINED__
#define __IUIAutomationTransformPattern2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationTransformPattern2, 0x6d74d017, 0x6ecb, 0x4381, 0xb3,0x8b, 0x3c,0x17,0xa4,0x8f,0xf1,0xc2);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("6d74d017-6ecb-4381-b38b-3c17a48ff1c2")
IUIAutomationTransformPattern2 : public IUIAutomationTransformPattern
{
    virtual HRESULT STDMETHODCALLTYPE Zoom(
        double zoomValue) = 0;

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

    virtual HRESULT STDMETHODCALLTYPE get_CurrentCanZoom(
        WINBOOL *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CachedCanZoom(
        WINBOOL *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CurrentZoomLevel(
        double *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CachedZoomLevel(
        double *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CurrentZoomMinimum(
        double *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CachedZoomMinimum(
        double *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CurrentZoomMaximum(
        double *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CachedZoomMaximum(
        double *retVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationTransformPattern2, 0x6d74d017, 0x6ecb, 0x4381, 0xb3,0x8b, 0x3c,0x17,0xa4,0x8f,0xf1,0xc2)
#endif
#else
typedef struct IUIAutomationTransformPattern2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    HRESULT (STDMETHODCALLTYPE *get_CurrentCanMove)(
        IUIAutomationTransformPattern2 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentCanResize)(
        IUIAutomationTransformPattern2 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentCanRotate)(
        IUIAutomationTransformPattern2 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedCanMove)(
        IUIAutomationTransformPattern2 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedCanResize)(
        IUIAutomationTransformPattern2 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedCanRotate)(
        IUIAutomationTransformPattern2 *This,
        WINBOOL *retVal);

    /*** IUIAutomationTransformPattern2 methods ***/
    HRESULT (STDMETHODCALLTYPE *Zoom)(
        IUIAutomationTransformPattern2 *This,
        double zoomValue);

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

    HRESULT (STDMETHODCALLTYPE *get_CurrentCanZoom)(
        IUIAutomationTransformPattern2 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedCanZoom)(
        IUIAutomationTransformPattern2 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentZoomLevel)(
        IUIAutomationTransformPattern2 *This,
        double *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedZoomLevel)(
        IUIAutomationTransformPattern2 *This,
        double *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentZoomMinimum)(
        IUIAutomationTransformPattern2 *This,
        double *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedZoomMinimum)(
        IUIAutomationTransformPattern2 *This,
        double *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentZoomMaximum)(
        IUIAutomationTransformPattern2 *This,
        double *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedZoomMaximum)(
        IUIAutomationTransformPattern2 *This,
        double *retVal);

    END_INTERFACE
} IUIAutomationTransformPattern2Vtbl;

interface IUIAutomationTransformPattern2 {
    CONST_VTBL IUIAutomationTransformPattern2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationTransformPattern2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationTransformPattern2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationTransformPattern2_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationTransformPattern methods ***/
#define IUIAutomationTransformPattern2_Move(This,x,y) (This)->lpVtbl->Move(This,x,y)
#define IUIAutomationTransformPattern2_Resize(This,width,height) (This)->lpVtbl->Resize(This,width,height)
#define IUIAutomationTransformPattern2_Rotate(This,degrees) (This)->lpVtbl->Rotate(This,degrees)
#define IUIAutomationTransformPattern2_get_CurrentCanMove(This,retVal) (This)->lpVtbl->get_CurrentCanMove(This,retVal)
#define IUIAutomationTransformPattern2_get_CurrentCanResize(This,retVal) (This)->lpVtbl->get_CurrentCanResize(This,retVal)
#define IUIAutomationTransformPattern2_get_CurrentCanRotate(This,retVal) (This)->lpVtbl->get_CurrentCanRotate(This,retVal)
#define IUIAutomationTransformPattern2_get_CachedCanMove(This,retVal) (This)->lpVtbl->get_CachedCanMove(This,retVal)
#define IUIAutomationTransformPattern2_get_CachedCanResize(This,retVal) (This)->lpVtbl->get_CachedCanResize(This,retVal)
#define IUIAutomationTransformPattern2_get_CachedCanRotate(This,retVal) (This)->lpVtbl->get_CachedCanRotate(This,retVal)
/*** IUIAutomationTransformPattern2 methods ***/
#define IUIAutomationTransformPattern2_Zoom(This,zoomValue) (This)->lpVtbl->Zoom(This,zoomValue)
#define IUIAutomationTransformPattern2_ZoomByUnit(This,zoomUnit) (This)->lpVtbl->ZoomByUnit(This,zoomUnit)
#define IUIAutomationTransformPattern2_get_CurrentCanZoom(This,retVal) (This)->lpVtbl->get_CurrentCanZoom(This,retVal)
#define IUIAutomationTransformPattern2_get_CachedCanZoom(This,retVal) (This)->lpVtbl->get_CachedCanZoom(This,retVal)
#define IUIAutomationTransformPattern2_get_CurrentZoomLevel(This,retVal) (This)->lpVtbl->get_CurrentZoomLevel(This,retVal)
#define IUIAutomationTransformPattern2_get_CachedZoomLevel(This,retVal) (This)->lpVtbl->get_CachedZoomLevel(This,retVal)
#define IUIAutomationTransformPattern2_get_CurrentZoomMinimum(This,retVal) (This)->lpVtbl->get_CurrentZoomMinimum(This,retVal)
#define IUIAutomationTransformPattern2_get_CachedZoomMinimum(This,retVal) (This)->lpVtbl->get_CachedZoomMinimum(This,retVal)
#define IUIAutomationTransformPattern2_get_CurrentZoomMaximum(This,retVal) (This)->lpVtbl->get_CurrentZoomMaximum(This,retVal)
#define IUIAutomationTransformPattern2_get_CachedZoomMaximum(This,retVal) (This)->lpVtbl->get_CachedZoomMaximum(This,retVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationTransformPattern2_QueryInterface(IUIAutomationTransformPattern2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationTransformPattern2_AddRef(IUIAutomationTransformPattern2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationTransformPattern2_Release(IUIAutomationTransformPattern2* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationTransformPattern methods ***/
static __WIDL_INLINE HRESULT IUIAutomationTransformPattern2_Move(IUIAutomationTransformPattern2* This,double x,double y) {
    return This->lpVtbl->Move(This,x,y);
}
static __WIDL_INLINE HRESULT IUIAutomationTransformPattern2_Resize(IUIAutomationTransformPattern2* This,double width,double height) {
    return This->lpVtbl->Resize(This,width,height);
}
static __WIDL_INLINE HRESULT IUIAutomationTransformPattern2_Rotate(IUIAutomationTransformPattern2* This,double degrees) {
    return This->lpVtbl->Rotate(This,degrees);
}
static __WIDL_INLINE HRESULT IUIAutomationTransformPattern2_get_CurrentCanMove(IUIAutomationTransformPattern2* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentCanMove(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationTransformPattern2_get_CurrentCanResize(IUIAutomationTransformPattern2* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentCanResize(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationTransformPattern2_get_CurrentCanRotate(IUIAutomationTransformPattern2* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentCanRotate(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationTransformPattern2_get_CachedCanMove(IUIAutomationTransformPattern2* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedCanMove(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationTransformPattern2_get_CachedCanResize(IUIAutomationTransformPattern2* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedCanResize(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationTransformPattern2_get_CachedCanRotate(IUIAutomationTransformPattern2* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedCanRotate(This,retVal);
}
/*** IUIAutomationTransformPattern2 methods ***/
static __WIDL_INLINE HRESULT IUIAutomationTransformPattern2_Zoom(IUIAutomationTransformPattern2* This,double zoomValue) {
    return This->lpVtbl->Zoom(This,zoomValue);
}
static __WIDL_INLINE HRESULT IUIAutomationTransformPattern2_ZoomByUnit(IUIAutomationTransformPattern2* This,enum ZoomUnit zoomUnit) {
    return This->lpVtbl->ZoomByUnit(This,zoomUnit);
}
static __WIDL_INLINE HRESULT IUIAutomationTransformPattern2_get_CurrentCanZoom(IUIAutomationTransformPattern2* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentCanZoom(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationTransformPattern2_get_CachedCanZoom(IUIAutomationTransformPattern2* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedCanZoom(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationTransformPattern2_get_CurrentZoomLevel(IUIAutomationTransformPattern2* This,double *retVal) {
    return This->lpVtbl->get_CurrentZoomLevel(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationTransformPattern2_get_CachedZoomLevel(IUIAutomationTransformPattern2* This,double *retVal) {
    return This->lpVtbl->get_CachedZoomLevel(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationTransformPattern2_get_CurrentZoomMinimum(IUIAutomationTransformPattern2* This,double *retVal) {
    return This->lpVtbl->get_CurrentZoomMinimum(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationTransformPattern2_get_CachedZoomMinimum(IUIAutomationTransformPattern2* This,double *retVal) {
    return This->lpVtbl->get_CachedZoomMinimum(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationTransformPattern2_get_CurrentZoomMaximum(IUIAutomationTransformPattern2* This,double *retVal) {
    return This->lpVtbl->get_CurrentZoomMaximum(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationTransformPattern2_get_CachedZoomMaximum(IUIAutomationTransformPattern2* This,double *retVal) {
    return This->lpVtbl->get_CachedZoomMaximum(This,retVal);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationTransformPattern2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationTextChildPattern interface
 */
#ifndef __IUIAutomationTextChildPattern_INTERFACE_DEFINED__
#define __IUIAutomationTextChildPattern_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationTextChildPattern, 0x6552b038, 0xae05, 0x40c8, 0xab,0xfd, 0xaa,0x08,0x35,0x2a,0xab,0x86);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("6552b038-ae05-40c8-abfd-aa08352aab86")
IUIAutomationTextChildPattern : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE get_TextContainer(
        IUIAutomationElement **container) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_TextRange(
        IUIAutomationTextRange **range) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationTextChildPattern, 0x6552b038, 0xae05, 0x40c8, 0xab,0xfd, 0xaa,0x08,0x35,0x2a,0xab,0x86)
#endif
#else
typedef struct IUIAutomationTextChildPatternVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomationTextChildPattern methods ***/
    HRESULT (STDMETHODCALLTYPE *get_TextContainer)(
        IUIAutomationTextChildPattern *This,
        IUIAutomationElement **container);

    HRESULT (STDMETHODCALLTYPE *get_TextRange)(
        IUIAutomationTextChildPattern *This,
        IUIAutomationTextRange **range);

    END_INTERFACE
} IUIAutomationTextChildPatternVtbl;

interface IUIAutomationTextChildPattern {
    CONST_VTBL IUIAutomationTextChildPatternVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationTextChildPattern_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationTextChildPattern_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationTextChildPattern_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationTextChildPattern methods ***/
#define IUIAutomationTextChildPattern_get_TextContainer(This,container) (This)->lpVtbl->get_TextContainer(This,container)
#define IUIAutomationTextChildPattern_get_TextRange(This,range) (This)->lpVtbl->get_TextRange(This,range)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationTextChildPattern_QueryInterface(IUIAutomationTextChildPattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationTextChildPattern_AddRef(IUIAutomationTextChildPattern* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationTextChildPattern_Release(IUIAutomationTextChildPattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationTextChildPattern methods ***/
static __WIDL_INLINE HRESULT IUIAutomationTextChildPattern_get_TextContainer(IUIAutomationTextChildPattern* This,IUIAutomationElement **container) {
    return This->lpVtbl->get_TextContainer(This,container);
}
static __WIDL_INLINE HRESULT IUIAutomationTextChildPattern_get_TextRange(IUIAutomationTextChildPattern* This,IUIAutomationTextRange **range) {
    return This->lpVtbl->get_TextRange(This,range);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationTextChildPattern_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationDragPattern interface
 */
#ifndef __IUIAutomationDragPattern_INTERFACE_DEFINED__
#define __IUIAutomationDragPattern_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationDragPattern, 0x1dc7b570, 0x1f54, 0x4bad, 0xbc,0xda, 0xd3,0x6a,0x72,0x2f,0xb7,0xbd);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("1dc7b570-1f54-4bad-bcda-d36a722fb7bd")
IUIAutomationDragPattern : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE get_CurrentIsGrabbed(
        WINBOOL *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CachedIsGrabbed(
        WINBOOL *retVal) = 0;

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

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

    virtual HRESULT STDMETHODCALLTYPE get_CurrentDropEffects(
        SAFEARRAY **retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CachedDropEffects(
        SAFEARRAY **retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrentGrabbedItems(
        IUIAutomationElementArray **retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCachedGrabbedItems(
        IUIAutomationElementArray **retVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationDragPattern, 0x1dc7b570, 0x1f54, 0x4bad, 0xbc,0xda, 0xd3,0x6a,0x72,0x2f,0xb7,0xbd)
#endif
#else
typedef struct IUIAutomationDragPatternVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomationDragPattern methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CurrentIsGrabbed)(
        IUIAutomationDragPattern *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsGrabbed)(
        IUIAutomationDragPattern *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentDropEffect)(
        IUIAutomationDragPattern *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedDropEffect)(
        IUIAutomationDragPattern *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentDropEffects)(
        IUIAutomationDragPattern *This,
        SAFEARRAY **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedDropEffects)(
        IUIAutomationDragPattern *This,
        SAFEARRAY **retVal);

    HRESULT (STDMETHODCALLTYPE *GetCurrentGrabbedItems)(
        IUIAutomationDragPattern *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *GetCachedGrabbedItems)(
        IUIAutomationDragPattern *This,
        IUIAutomationElementArray **retVal);

    END_INTERFACE
} IUIAutomationDragPatternVtbl;

interface IUIAutomationDragPattern {
    CONST_VTBL IUIAutomationDragPatternVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationDragPattern_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationDragPattern_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationDragPattern_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationDragPattern methods ***/
#define IUIAutomationDragPattern_get_CurrentIsGrabbed(This,retVal) (This)->lpVtbl->get_CurrentIsGrabbed(This,retVal)
#define IUIAutomationDragPattern_get_CachedIsGrabbed(This,retVal) (This)->lpVtbl->get_CachedIsGrabbed(This,retVal)
#define IUIAutomationDragPattern_get_CurrentDropEffect(This,retVal) (This)->lpVtbl->get_CurrentDropEffect(This,retVal)
#define IUIAutomationDragPattern_get_CachedDropEffect(This,retVal) (This)->lpVtbl->get_CachedDropEffect(This,retVal)
#define IUIAutomationDragPattern_get_CurrentDropEffects(This,retVal) (This)->lpVtbl->get_CurrentDropEffects(This,retVal)
#define IUIAutomationDragPattern_get_CachedDropEffects(This,retVal) (This)->lpVtbl->get_CachedDropEffects(This,retVal)
#define IUIAutomationDragPattern_GetCurrentGrabbedItems(This,retVal) (This)->lpVtbl->GetCurrentGrabbedItems(This,retVal)
#define IUIAutomationDragPattern_GetCachedGrabbedItems(This,retVal) (This)->lpVtbl->GetCachedGrabbedItems(This,retVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationDragPattern_QueryInterface(IUIAutomationDragPattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationDragPattern_AddRef(IUIAutomationDragPattern* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationDragPattern_Release(IUIAutomationDragPattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationDragPattern methods ***/
static __WIDL_INLINE HRESULT IUIAutomationDragPattern_get_CurrentIsGrabbed(IUIAutomationDragPattern* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsGrabbed(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationDragPattern_get_CachedIsGrabbed(IUIAutomationDragPattern* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsGrabbed(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationDragPattern_get_CurrentDropEffect(IUIAutomationDragPattern* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentDropEffect(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationDragPattern_get_CachedDropEffect(IUIAutomationDragPattern* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedDropEffect(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationDragPattern_get_CurrentDropEffects(IUIAutomationDragPattern* This,SAFEARRAY **retVal) {
    return This->lpVtbl->get_CurrentDropEffects(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationDragPattern_get_CachedDropEffects(IUIAutomationDragPattern* This,SAFEARRAY **retVal) {
    return This->lpVtbl->get_CachedDropEffects(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationDragPattern_GetCurrentGrabbedItems(IUIAutomationDragPattern* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->GetCurrentGrabbedItems(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationDragPattern_GetCachedGrabbedItems(IUIAutomationDragPattern* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->GetCachedGrabbedItems(This,retVal);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationDragPattern_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationDropTargetPattern interface
 */
#ifndef __IUIAutomationDropTargetPattern_INTERFACE_DEFINED__
#define __IUIAutomationDropTargetPattern_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationDropTargetPattern, 0x69a095f7, 0xeee4, 0x430e, 0xa4,0x6b, 0xfb,0x73,0xb1,0xae,0x39,0xa5);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("69a095f7-eee4-430e-a46b-fb73b1ae39a5")
IUIAutomationDropTargetPattern : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE get_CurrentDropTargetEffect(
        BSTR *retVal) = 0;

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

    virtual HRESULT STDMETHODCALLTYPE get_CurrentDropTargetEffects(
        SAFEARRAY **retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CachedDropTargetEffects(
        SAFEARRAY **retVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationDropTargetPattern, 0x69a095f7, 0xeee4, 0x430e, 0xa4,0x6b, 0xfb,0x73,0xb1,0xae,0x39,0xa5)
#endif
#else
typedef struct IUIAutomationDropTargetPatternVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomationDropTargetPattern methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CurrentDropTargetEffect)(
        IUIAutomationDropTargetPattern *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedDropTargetEffect)(
        IUIAutomationDropTargetPattern *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentDropTargetEffects)(
        IUIAutomationDropTargetPattern *This,
        SAFEARRAY **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedDropTargetEffects)(
        IUIAutomationDropTargetPattern *This,
        SAFEARRAY **retVal);

    END_INTERFACE
} IUIAutomationDropTargetPatternVtbl;

interface IUIAutomationDropTargetPattern {
    CONST_VTBL IUIAutomationDropTargetPatternVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationDropTargetPattern_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationDropTargetPattern_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationDropTargetPattern_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationDropTargetPattern methods ***/
#define IUIAutomationDropTargetPattern_get_CurrentDropTargetEffect(This,retVal) (This)->lpVtbl->get_CurrentDropTargetEffect(This,retVal)
#define IUIAutomationDropTargetPattern_get_CachedDropTargetEffect(This,retVal) (This)->lpVtbl->get_CachedDropTargetEffect(This,retVal)
#define IUIAutomationDropTargetPattern_get_CurrentDropTargetEffects(This,retVal) (This)->lpVtbl->get_CurrentDropTargetEffects(This,retVal)
#define IUIAutomationDropTargetPattern_get_CachedDropTargetEffects(This,retVal) (This)->lpVtbl->get_CachedDropTargetEffects(This,retVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationDropTargetPattern_QueryInterface(IUIAutomationDropTargetPattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationDropTargetPattern_AddRef(IUIAutomationDropTargetPattern* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationDropTargetPattern_Release(IUIAutomationDropTargetPattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationDropTargetPattern methods ***/
static __WIDL_INLINE HRESULT IUIAutomationDropTargetPattern_get_CurrentDropTargetEffect(IUIAutomationDropTargetPattern* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentDropTargetEffect(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationDropTargetPattern_get_CachedDropTargetEffect(IUIAutomationDropTargetPattern* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedDropTargetEffect(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationDropTargetPattern_get_CurrentDropTargetEffects(IUIAutomationDropTargetPattern* This,SAFEARRAY **retVal) {
    return This->lpVtbl->get_CurrentDropTargetEffects(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationDropTargetPattern_get_CachedDropTargetEffects(IUIAutomationDropTargetPattern* This,SAFEARRAY **retVal) {
    return This->lpVtbl->get_CachedDropTargetEffects(This,retVal);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationDropTargetPattern_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationElement interface
 */
#ifndef __IUIAutomationElement_INTERFACE_DEFINED__
#define __IUIAutomationElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationElement, 0xd22108aa, 0x8ac5, 0x49a5, 0x83,0x7b, 0x37,0xbb,0xb3,0xd7,0x59,0x1e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d22108aa-8ac5-49a5-837b-37bbb3d7591e")
IUIAutomationElement : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetFocus(
        ) = 0;

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

    virtual HRESULT STDMETHODCALLTYPE FindFirst(
        enum TreeScope scope,
        IUIAutomationCondition *condition,
        IUIAutomationElement **found) = 0;

    virtual HRESULT STDMETHODCALLTYPE FindAll(
        enum TreeScope scope,
        IUIAutomationCondition *condition,
        IUIAutomationElementArray **found) = 0;

    virtual HRESULT STDMETHODCALLTYPE FindFirstBuildCache(
        enum TreeScope scope,
        IUIAutomationCondition *condition,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **found) = 0;

    virtual HRESULT STDMETHODCALLTYPE FindAllBuildCache(
        enum TreeScope scope,
        IUIAutomationCondition *condition,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElementArray **found) = 0;

    virtual HRESULT STDMETHODCALLTYPE BuildUpdatedCache(
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **updatedElement) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrentPropertyValue(
        PROPERTYID propertyId,
        VARIANT *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrentPropertyValueEx(
        PROPERTYID propertyId,
        WINBOOL ignoreDefaultValue,
        VARIANT *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCachedPropertyValue(
        PROPERTYID propertyId,
        VARIANT *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCachedPropertyValueEx(
        PROPERTYID propertyId,
        WINBOOL ignoreDefaultValue,
        VARIANT *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrentPatternAs(
        PATTERNID patternId,
        REFIID riid,
        void **patternObject) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCachedPatternAs(
        PATTERNID patternId,
        REFIID riid,
        void **patternObject) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrentPattern(
        PATTERNID patternId,
        IUnknown **patternObject) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCachedPattern(
        PATTERNID patternId,
        IUnknown **patternObject) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCachedParent(
        IUIAutomationElement **parent) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCachedChildren(
        IUIAutomationElementArray **children) = 0;

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

    virtual HRESULT STDMETHODCALLTYPE get_CurrentControlType(
        CONTROLTYPEID *retVal) = 0;

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

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

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

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

    virtual HRESULT STDMETHODCALLTYPE get_CurrentHasKeyboardFocus(
        WINBOOL *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CurrentIsKeyboardFocusable(
        WINBOOL *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CurrentIsEnabled(
        WINBOOL *retVal) = 0;

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

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

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

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

    virtual HRESULT STDMETHODCALLTYPE get_CurrentIsControlElement(
        WINBOOL *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CurrentIsContentElement(
        WINBOOL *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CurrentIsPassword(
        WINBOOL *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CurrentNativeWindowHandle(
        UIA_HWND *retVal) = 0;

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

    virtual HRESULT STDMETHODCALLTYPE get_CurrentIsOffscreen(
        WINBOOL *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CurrentOrientation(
        enum OrientationType *retVal) = 0;

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

    virtual HRESULT STDMETHODCALLTYPE get_CurrentIsRequiredForForm(
        WINBOOL *retVal) = 0;

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

    virtual HRESULT STDMETHODCALLTYPE get_CurrentBoundingRectangle(
        RECT *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CurrentLabeledBy(
        IUIAutomationElement **retVal) = 0;

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

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

    virtual HRESULT STDMETHODCALLTYPE get_CurrentIsDataValidForForm(
        WINBOOL *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CurrentControllerFor(
        IUIAutomationElementArray **retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CurrentDescribedBy(
        IUIAutomationElementArray **retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CurrentFlowsTo(
        IUIAutomationElementArray **retVal) = 0;

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

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

    virtual HRESULT STDMETHODCALLTYPE get_CachedControlType(
        CONTROLTYPEID *retVal) = 0;

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

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

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

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

    virtual HRESULT STDMETHODCALLTYPE get_CachedHasKeyboardFocus(
        WINBOOL *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CachedIsKeyboardFocusable(
        WINBOOL *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CachedIsEnabled(
        WINBOOL *retVal) = 0;

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

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

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

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

    virtual HRESULT STDMETHODCALLTYPE get_CachedIsControlElement(
        WINBOOL *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CachedIsContentElement(
        WINBOOL *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CachedIsPassword(
        WINBOOL *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CachedNativeWindowHandle(
        UIA_HWND *retVal) = 0;

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

    virtual HRESULT STDMETHODCALLTYPE get_CachedIsOffscreen(
        WINBOOL *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CachedOrientation(
        enum OrientationType *retVal) = 0;

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

    virtual HRESULT STDMETHODCALLTYPE get_CachedIsRequiredForForm(
        WINBOOL *retVal) = 0;

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

    virtual HRESULT STDMETHODCALLTYPE get_CachedBoundingRectangle(
        RECT *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CachedLabeledBy(
        IUIAutomationElement **retVal) = 0;

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

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

    virtual HRESULT STDMETHODCALLTYPE get_CachedIsDataValidForForm(
        WINBOOL *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CachedControllerFor(
        IUIAutomationElementArray **retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CachedDescribedBy(
        IUIAutomationElementArray **retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CachedFlowsTo(
        IUIAutomationElementArray **retVal) = 0;

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

    virtual HRESULT STDMETHODCALLTYPE GetClickablePoint(
        POINT *clickable,
        WINBOOL *gotClickable) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationElement, 0xd22108aa, 0x8ac5, 0x49a5, 0x83,0x7b, 0x37,0xbb,0xb3,0xd7,0x59,0x1e)
#endif
#else
typedef struct IUIAutomationElementVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomationElement methods ***/
    HRESULT (STDMETHODCALLTYPE *SetFocus)(
        IUIAutomationElement *This);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeId)(
        IUIAutomationElement *This,
        SAFEARRAY **runtimeId);

    HRESULT (STDMETHODCALLTYPE *FindFirst)(
        IUIAutomationElement *This,
        enum TreeScope scope,
        IUIAutomationCondition *condition,
        IUIAutomationElement **found);

    HRESULT (STDMETHODCALLTYPE *FindAll)(
        IUIAutomationElement *This,
        enum TreeScope scope,
        IUIAutomationCondition *condition,
        IUIAutomationElementArray **found);

    HRESULT (STDMETHODCALLTYPE *FindFirstBuildCache)(
        IUIAutomationElement *This,
        enum TreeScope scope,
        IUIAutomationCondition *condition,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **found);

    HRESULT (STDMETHODCALLTYPE *FindAllBuildCache)(
        IUIAutomationElement *This,
        enum TreeScope scope,
        IUIAutomationCondition *condition,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElementArray **found);

    HRESULT (STDMETHODCALLTYPE *BuildUpdatedCache)(
        IUIAutomationElement *This,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **updatedElement);

    HRESULT (STDMETHODCALLTYPE *GetCurrentPropertyValue)(
        IUIAutomationElement *This,
        PROPERTYID propertyId,
        VARIANT *retVal);

    HRESULT (STDMETHODCALLTYPE *GetCurrentPropertyValueEx)(
        IUIAutomationElement *This,
        PROPERTYID propertyId,
        WINBOOL ignoreDefaultValue,
        VARIANT *retVal);

    HRESULT (STDMETHODCALLTYPE *GetCachedPropertyValue)(
        IUIAutomationElement *This,
        PROPERTYID propertyId,
        VARIANT *retVal);

    HRESULT (STDMETHODCALLTYPE *GetCachedPropertyValueEx)(
        IUIAutomationElement *This,
        PROPERTYID propertyId,
        WINBOOL ignoreDefaultValue,
        VARIANT *retVal);

    HRESULT (STDMETHODCALLTYPE *GetCurrentPatternAs)(
        IUIAutomationElement *This,
        PATTERNID patternId,
        REFIID riid,
        void **patternObject);

    HRESULT (STDMETHODCALLTYPE *GetCachedPatternAs)(
        IUIAutomationElement *This,
        PATTERNID patternId,
        REFIID riid,
        void **patternObject);

    HRESULT (STDMETHODCALLTYPE *GetCurrentPattern)(
        IUIAutomationElement *This,
        PATTERNID patternId,
        IUnknown **patternObject);

    HRESULT (STDMETHODCALLTYPE *GetCachedPattern)(
        IUIAutomationElement *This,
        PATTERNID patternId,
        IUnknown **patternObject);

    HRESULT (STDMETHODCALLTYPE *GetCachedParent)(
        IUIAutomationElement *This,
        IUIAutomationElement **parent);

    HRESULT (STDMETHODCALLTYPE *GetCachedChildren)(
        IUIAutomationElement *This,
        IUIAutomationElementArray **children);

    HRESULT (STDMETHODCALLTYPE *get_CurrentProcessId)(
        IUIAutomationElement *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentControlType)(
        IUIAutomationElement *This,
        CONTROLTYPEID *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentLocalizedControlType)(
        IUIAutomationElement *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentName)(
        IUIAutomationElement *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAcceleratorKey)(
        IUIAutomationElement *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAccessKey)(
        IUIAutomationElement *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentHasKeyboardFocus)(
        IUIAutomationElement *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsKeyboardFocusable)(
        IUIAutomationElement *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsEnabled)(
        IUIAutomationElement *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAutomationId)(
        IUIAutomationElement *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentClassName)(
        IUIAutomationElement *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentHelpText)(
        IUIAutomationElement *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentCulture)(
        IUIAutomationElement *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsControlElement)(
        IUIAutomationElement *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsContentElement)(
        IUIAutomationElement *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsPassword)(
        IUIAutomationElement *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentNativeWindowHandle)(
        IUIAutomationElement *This,
        UIA_HWND *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentItemType)(
        IUIAutomationElement *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsOffscreen)(
        IUIAutomationElement *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentOrientation)(
        IUIAutomationElement *This,
        enum OrientationType *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentFrameworkId)(
        IUIAutomationElement *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsRequiredForForm)(
        IUIAutomationElement *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentItemStatus)(
        IUIAutomationElement *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentBoundingRectangle)(
        IUIAutomationElement *This,
        RECT *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentLabeledBy)(
        IUIAutomationElement *This,
        IUIAutomationElement **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAriaRole)(
        IUIAutomationElement *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAriaProperties)(
        IUIAutomationElement *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsDataValidForForm)(
        IUIAutomationElement *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentControllerFor)(
        IUIAutomationElement *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentDescribedBy)(
        IUIAutomationElement *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentFlowsTo)(
        IUIAutomationElement *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentProviderDescription)(
        IUIAutomationElement *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedProcessId)(
        IUIAutomationElement *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedControlType)(
        IUIAutomationElement *This,
        CONTROLTYPEID *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedLocalizedControlType)(
        IUIAutomationElement *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedName)(
        IUIAutomationElement *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAcceleratorKey)(
        IUIAutomationElement *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAccessKey)(
        IUIAutomationElement *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedHasKeyboardFocus)(
        IUIAutomationElement *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsKeyboardFocusable)(
        IUIAutomationElement *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsEnabled)(
        IUIAutomationElement *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAutomationId)(
        IUIAutomationElement *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedClassName)(
        IUIAutomationElement *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedHelpText)(
        IUIAutomationElement *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedCulture)(
        IUIAutomationElement *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsControlElement)(
        IUIAutomationElement *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsContentElement)(
        IUIAutomationElement *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsPassword)(
        IUIAutomationElement *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedNativeWindowHandle)(
        IUIAutomationElement *This,
        UIA_HWND *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedItemType)(
        IUIAutomationElement *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsOffscreen)(
        IUIAutomationElement *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedOrientation)(
        IUIAutomationElement *This,
        enum OrientationType *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedFrameworkId)(
        IUIAutomationElement *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsRequiredForForm)(
        IUIAutomationElement *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedItemStatus)(
        IUIAutomationElement *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedBoundingRectangle)(
        IUIAutomationElement *This,
        RECT *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedLabeledBy)(
        IUIAutomationElement *This,
        IUIAutomationElement **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAriaRole)(
        IUIAutomationElement *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAriaProperties)(
        IUIAutomationElement *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsDataValidForForm)(
        IUIAutomationElement *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedControllerFor)(
        IUIAutomationElement *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedDescribedBy)(
        IUIAutomationElement *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedFlowsTo)(
        IUIAutomationElement *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedProviderDescription)(
        IUIAutomationElement *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *GetClickablePoint)(
        IUIAutomationElement *This,
        POINT *clickable,
        WINBOOL *gotClickable);

    END_INTERFACE
} IUIAutomationElementVtbl;

interface IUIAutomationElement {
    CONST_VTBL IUIAutomationElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationElement_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationElement methods ***/
#define IUIAutomationElement_SetFocus(This) (This)->lpVtbl->SetFocus(This)
#define IUIAutomationElement_GetRuntimeId(This,runtimeId) (This)->lpVtbl->GetRuntimeId(This,runtimeId)
#define IUIAutomationElement_FindFirst(This,scope,condition,found) (This)->lpVtbl->FindFirst(This,scope,condition,found)
#define IUIAutomationElement_FindAll(This,scope,condition,found) (This)->lpVtbl->FindAll(This,scope,condition,found)
#define IUIAutomationElement_FindFirstBuildCache(This,scope,condition,cacheRequest,found) (This)->lpVtbl->FindFirstBuildCache(This,scope,condition,cacheRequest,found)
#define IUIAutomationElement_FindAllBuildCache(This,scope,condition,cacheRequest,found) (This)->lpVtbl->FindAllBuildCache(This,scope,condition,cacheRequest,found)
#define IUIAutomationElement_BuildUpdatedCache(This,cacheRequest,updatedElement) (This)->lpVtbl->BuildUpdatedCache(This,cacheRequest,updatedElement)
#define IUIAutomationElement_GetCurrentPropertyValue(This,propertyId,retVal) (This)->lpVtbl->GetCurrentPropertyValue(This,propertyId,retVal)
#define IUIAutomationElement_GetCurrentPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal) (This)->lpVtbl->GetCurrentPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal)
#define IUIAutomationElement_GetCachedPropertyValue(This,propertyId,retVal) (This)->lpVtbl->GetCachedPropertyValue(This,propertyId,retVal)
#define IUIAutomationElement_GetCachedPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal) (This)->lpVtbl->GetCachedPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal)
#define IUIAutomationElement_GetCurrentPatternAs(This,patternId,riid,patternObject) (This)->lpVtbl->GetCurrentPatternAs(This,patternId,riid,patternObject)
#define IUIAutomationElement_GetCachedPatternAs(This,patternId,riid,patternObject) (This)->lpVtbl->GetCachedPatternAs(This,patternId,riid,patternObject)
#define IUIAutomationElement_GetCurrentPattern(This,patternId,patternObject) (This)->lpVtbl->GetCurrentPattern(This,patternId,patternObject)
#define IUIAutomationElement_GetCachedPattern(This,patternId,patternObject) (This)->lpVtbl->GetCachedPattern(This,patternId,patternObject)
#define IUIAutomationElement_GetCachedParent(This,parent) (This)->lpVtbl->GetCachedParent(This,parent)
#define IUIAutomationElement_GetCachedChildren(This,children) (This)->lpVtbl->GetCachedChildren(This,children)
#define IUIAutomationElement_get_CurrentProcessId(This,retVal) (This)->lpVtbl->get_CurrentProcessId(This,retVal)
#define IUIAutomationElement_get_CurrentControlType(This,retVal) (This)->lpVtbl->get_CurrentControlType(This,retVal)
#define IUIAutomationElement_get_CurrentLocalizedControlType(This,retVal) (This)->lpVtbl->get_CurrentLocalizedControlType(This,retVal)
#define IUIAutomationElement_get_CurrentName(This,retVal) (This)->lpVtbl->get_CurrentName(This,retVal)
#define IUIAutomationElement_get_CurrentAcceleratorKey(This,retVal) (This)->lpVtbl->get_CurrentAcceleratorKey(This,retVal)
#define IUIAutomationElement_get_CurrentAccessKey(This,retVal) (This)->lpVtbl->get_CurrentAccessKey(This,retVal)
#define IUIAutomationElement_get_CurrentHasKeyboardFocus(This,retVal) (This)->lpVtbl->get_CurrentHasKeyboardFocus(This,retVal)
#define IUIAutomationElement_get_CurrentIsKeyboardFocusable(This,retVal) (This)->lpVtbl->get_CurrentIsKeyboardFocusable(This,retVal)
#define IUIAutomationElement_get_CurrentIsEnabled(This,retVal) (This)->lpVtbl->get_CurrentIsEnabled(This,retVal)
#define IUIAutomationElement_get_CurrentAutomationId(This,retVal) (This)->lpVtbl->get_CurrentAutomationId(This,retVal)
#define IUIAutomationElement_get_CurrentClassName(This,retVal) (This)->lpVtbl->get_CurrentClassName(This,retVal)
#define IUIAutomationElement_get_CurrentHelpText(This,retVal) (This)->lpVtbl->get_CurrentHelpText(This,retVal)
#define IUIAutomationElement_get_CurrentCulture(This,retVal) (This)->lpVtbl->get_CurrentCulture(This,retVal)
#define IUIAutomationElement_get_CurrentIsControlElement(This,retVal) (This)->lpVtbl->get_CurrentIsControlElement(This,retVal)
#define IUIAutomationElement_get_CurrentIsContentElement(This,retVal) (This)->lpVtbl->get_CurrentIsContentElement(This,retVal)
#define IUIAutomationElement_get_CurrentIsPassword(This,retVal) (This)->lpVtbl->get_CurrentIsPassword(This,retVal)
#define IUIAutomationElement_get_CurrentNativeWindowHandle(This,retVal) (This)->lpVtbl->get_CurrentNativeWindowHandle(This,retVal)
#define IUIAutomationElement_get_CurrentItemType(This,retVal) (This)->lpVtbl->get_CurrentItemType(This,retVal)
#define IUIAutomationElement_get_CurrentIsOffscreen(This,retVal) (This)->lpVtbl->get_CurrentIsOffscreen(This,retVal)
#define IUIAutomationElement_get_CurrentOrientation(This,retVal) (This)->lpVtbl->get_CurrentOrientation(This,retVal)
#define IUIAutomationElement_get_CurrentFrameworkId(This,retVal) (This)->lpVtbl->get_CurrentFrameworkId(This,retVal)
#define IUIAutomationElement_get_CurrentIsRequiredForForm(This,retVal) (This)->lpVtbl->get_CurrentIsRequiredForForm(This,retVal)
#define IUIAutomationElement_get_CurrentItemStatus(This,retVal) (This)->lpVtbl->get_CurrentItemStatus(This,retVal)
#define IUIAutomationElement_get_CurrentBoundingRectangle(This,retVal) (This)->lpVtbl->get_CurrentBoundingRectangle(This,retVal)
#define IUIAutomationElement_get_CurrentLabeledBy(This,retVal) (This)->lpVtbl->get_CurrentLabeledBy(This,retVal)
#define IUIAutomationElement_get_CurrentAriaRole(This,retVal) (This)->lpVtbl->get_CurrentAriaRole(This,retVal)
#define IUIAutomationElement_get_CurrentAriaProperties(This,retVal) (This)->lpVtbl->get_CurrentAriaProperties(This,retVal)
#define IUIAutomationElement_get_CurrentIsDataValidForForm(This,retVal) (This)->lpVtbl->get_CurrentIsDataValidForForm(This,retVal)
#define IUIAutomationElement_get_CurrentControllerFor(This,retVal) (This)->lpVtbl->get_CurrentControllerFor(This,retVal)
#define IUIAutomationElement_get_CurrentDescribedBy(This,retVal) (This)->lpVtbl->get_CurrentDescribedBy(This,retVal)
#define IUIAutomationElement_get_CurrentFlowsTo(This,retVal) (This)->lpVtbl->get_CurrentFlowsTo(This,retVal)
#define IUIAutomationElement_get_CurrentProviderDescription(This,retVal) (This)->lpVtbl->get_CurrentProviderDescription(This,retVal)
#define IUIAutomationElement_get_CachedProcessId(This,retVal) (This)->lpVtbl->get_CachedProcessId(This,retVal)
#define IUIAutomationElement_get_CachedControlType(This,retVal) (This)->lpVtbl->get_CachedControlType(This,retVal)
#define IUIAutomationElement_get_CachedLocalizedControlType(This,retVal) (This)->lpVtbl->get_CachedLocalizedControlType(This,retVal)
#define IUIAutomationElement_get_CachedName(This,retVal) (This)->lpVtbl->get_CachedName(This,retVal)
#define IUIAutomationElement_get_CachedAcceleratorKey(This,retVal) (This)->lpVtbl->get_CachedAcceleratorKey(This,retVal)
#define IUIAutomationElement_get_CachedAccessKey(This,retVal) (This)->lpVtbl->get_CachedAccessKey(This,retVal)
#define IUIAutomationElement_get_CachedHasKeyboardFocus(This,retVal) (This)->lpVtbl->get_CachedHasKeyboardFocus(This,retVal)
#define IUIAutomationElement_get_CachedIsKeyboardFocusable(This,retVal) (This)->lpVtbl->get_CachedIsKeyboardFocusable(This,retVal)
#define IUIAutomationElement_get_CachedIsEnabled(This,retVal) (This)->lpVtbl->get_CachedIsEnabled(This,retVal)
#define IUIAutomationElement_get_CachedAutomationId(This,retVal) (This)->lpVtbl->get_CachedAutomationId(This,retVal)
#define IUIAutomationElement_get_CachedClassName(This,retVal) (This)->lpVtbl->get_CachedClassName(This,retVal)
#define IUIAutomationElement_get_CachedHelpText(This,retVal) (This)->lpVtbl->get_CachedHelpText(This,retVal)
#define IUIAutomationElement_get_CachedCulture(This,retVal) (This)->lpVtbl->get_CachedCulture(This,retVal)
#define IUIAutomationElement_get_CachedIsControlElement(This,retVal) (This)->lpVtbl->get_CachedIsControlElement(This,retVal)
#define IUIAutomationElement_get_CachedIsContentElement(This,retVal) (This)->lpVtbl->get_CachedIsContentElement(This,retVal)
#define IUIAutomationElement_get_CachedIsPassword(This,retVal) (This)->lpVtbl->get_CachedIsPassword(This,retVal)
#define IUIAutomationElement_get_CachedNativeWindowHandle(This,retVal) (This)->lpVtbl->get_CachedNativeWindowHandle(This,retVal)
#define IUIAutomationElement_get_CachedItemType(This,retVal) (This)->lpVtbl->get_CachedItemType(This,retVal)
#define IUIAutomationElement_get_CachedIsOffscreen(This,retVal) (This)->lpVtbl->get_CachedIsOffscreen(This,retVal)
#define IUIAutomationElement_get_CachedOrientation(This,retVal) (This)->lpVtbl->get_CachedOrientation(This,retVal)
#define IUIAutomationElement_get_CachedFrameworkId(This,retVal) (This)->lpVtbl->get_CachedFrameworkId(This,retVal)
#define IUIAutomationElement_get_CachedIsRequiredForForm(This,retVal) (This)->lpVtbl->get_CachedIsRequiredForForm(This,retVal)
#define IUIAutomationElement_get_CachedItemStatus(This,retVal) (This)->lpVtbl->get_CachedItemStatus(This,retVal)
#define IUIAutomationElement_get_CachedBoundingRectangle(This,retVal) (This)->lpVtbl->get_CachedBoundingRectangle(This,retVal)
#define IUIAutomationElement_get_CachedLabeledBy(This,retVal) (This)->lpVtbl->get_CachedLabeledBy(This,retVal)
#define IUIAutomationElement_get_CachedAriaRole(This,retVal) (This)->lpVtbl->get_CachedAriaRole(This,retVal)
#define IUIAutomationElement_get_CachedAriaProperties(This,retVal) (This)->lpVtbl->get_CachedAriaProperties(This,retVal)
#define IUIAutomationElement_get_CachedIsDataValidForForm(This,retVal) (This)->lpVtbl->get_CachedIsDataValidForForm(This,retVal)
#define IUIAutomationElement_get_CachedControllerFor(This,retVal) (This)->lpVtbl->get_CachedControllerFor(This,retVal)
#define IUIAutomationElement_get_CachedDescribedBy(This,retVal) (This)->lpVtbl->get_CachedDescribedBy(This,retVal)
#define IUIAutomationElement_get_CachedFlowsTo(This,retVal) (This)->lpVtbl->get_CachedFlowsTo(This,retVal)
#define IUIAutomationElement_get_CachedProviderDescription(This,retVal) (This)->lpVtbl->get_CachedProviderDescription(This,retVal)
#define IUIAutomationElement_GetClickablePoint(This,clickable,gotClickable) (This)->lpVtbl->GetClickablePoint(This,clickable,gotClickable)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationElement_QueryInterface(IUIAutomationElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationElement_AddRef(IUIAutomationElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationElement_Release(IUIAutomationElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationElement methods ***/
static __WIDL_INLINE HRESULT IUIAutomationElement_SetFocus(IUIAutomationElement* This) {
    return This->lpVtbl->SetFocus(This);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_GetRuntimeId(IUIAutomationElement* This,SAFEARRAY **runtimeId) {
    return This->lpVtbl->GetRuntimeId(This,runtimeId);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_FindFirst(IUIAutomationElement* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationElement **found) {
    return This->lpVtbl->FindFirst(This,scope,condition,found);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_FindAll(IUIAutomationElement* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationElementArray **found) {
    return This->lpVtbl->FindAll(This,scope,condition,found);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_FindFirstBuildCache(IUIAutomationElement* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **found) {
    return This->lpVtbl->FindFirstBuildCache(This,scope,condition,cacheRequest,found);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_FindAllBuildCache(IUIAutomationElement* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElementArray **found) {
    return This->lpVtbl->FindAllBuildCache(This,scope,condition,cacheRequest,found);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_BuildUpdatedCache(IUIAutomationElement* This,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **updatedElement) {
    return This->lpVtbl->BuildUpdatedCache(This,cacheRequest,updatedElement);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_GetCurrentPropertyValue(IUIAutomationElement* This,PROPERTYID propertyId,VARIANT *retVal) {
    return This->lpVtbl->GetCurrentPropertyValue(This,propertyId,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_GetCurrentPropertyValueEx(IUIAutomationElement* This,PROPERTYID propertyId,WINBOOL ignoreDefaultValue,VARIANT *retVal) {
    return This->lpVtbl->GetCurrentPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_GetCachedPropertyValue(IUIAutomationElement* This,PROPERTYID propertyId,VARIANT *retVal) {
    return This->lpVtbl->GetCachedPropertyValue(This,propertyId,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_GetCachedPropertyValueEx(IUIAutomationElement* This,PROPERTYID propertyId,WINBOOL ignoreDefaultValue,VARIANT *retVal) {
    return This->lpVtbl->GetCachedPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_GetCurrentPatternAs(IUIAutomationElement* This,PATTERNID patternId,REFIID riid,void **patternObject) {
    return This->lpVtbl->GetCurrentPatternAs(This,patternId,riid,patternObject);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_GetCachedPatternAs(IUIAutomationElement* This,PATTERNID patternId,REFIID riid,void **patternObject) {
    return This->lpVtbl->GetCachedPatternAs(This,patternId,riid,patternObject);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_GetCurrentPattern(IUIAutomationElement* This,PATTERNID patternId,IUnknown **patternObject) {
    return This->lpVtbl->GetCurrentPattern(This,patternId,patternObject);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_GetCachedPattern(IUIAutomationElement* This,PATTERNID patternId,IUnknown **patternObject) {
    return This->lpVtbl->GetCachedPattern(This,patternId,patternObject);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_GetCachedParent(IUIAutomationElement* This,IUIAutomationElement **parent) {
    return This->lpVtbl->GetCachedParent(This,parent);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_GetCachedChildren(IUIAutomationElement* This,IUIAutomationElementArray **children) {
    return This->lpVtbl->GetCachedChildren(This,children);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CurrentProcessId(IUIAutomationElement* This,int *retVal) {
    return This->lpVtbl->get_CurrentProcessId(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CurrentControlType(IUIAutomationElement* This,CONTROLTYPEID *retVal) {
    return This->lpVtbl->get_CurrentControlType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CurrentLocalizedControlType(IUIAutomationElement* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentLocalizedControlType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CurrentName(IUIAutomationElement* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentName(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CurrentAcceleratorKey(IUIAutomationElement* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAcceleratorKey(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CurrentAccessKey(IUIAutomationElement* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAccessKey(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CurrentHasKeyboardFocus(IUIAutomationElement* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentHasKeyboardFocus(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CurrentIsKeyboardFocusable(IUIAutomationElement* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsKeyboardFocusable(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CurrentIsEnabled(IUIAutomationElement* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsEnabled(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CurrentAutomationId(IUIAutomationElement* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAutomationId(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CurrentClassName(IUIAutomationElement* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentClassName(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CurrentHelpText(IUIAutomationElement* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentHelpText(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CurrentCulture(IUIAutomationElement* This,int *retVal) {
    return This->lpVtbl->get_CurrentCulture(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CurrentIsControlElement(IUIAutomationElement* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsControlElement(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CurrentIsContentElement(IUIAutomationElement* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsContentElement(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CurrentIsPassword(IUIAutomationElement* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsPassword(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CurrentNativeWindowHandle(IUIAutomationElement* This,UIA_HWND *retVal) {
    return This->lpVtbl->get_CurrentNativeWindowHandle(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CurrentItemType(IUIAutomationElement* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentItemType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CurrentIsOffscreen(IUIAutomationElement* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsOffscreen(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CurrentOrientation(IUIAutomationElement* This,enum OrientationType *retVal) {
    return This->lpVtbl->get_CurrentOrientation(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CurrentFrameworkId(IUIAutomationElement* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentFrameworkId(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CurrentIsRequiredForForm(IUIAutomationElement* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsRequiredForForm(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CurrentItemStatus(IUIAutomationElement* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentItemStatus(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CurrentBoundingRectangle(IUIAutomationElement* This,RECT *retVal) {
    return This->lpVtbl->get_CurrentBoundingRectangle(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CurrentLabeledBy(IUIAutomationElement* This,IUIAutomationElement **retVal) {
    return This->lpVtbl->get_CurrentLabeledBy(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CurrentAriaRole(IUIAutomationElement* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAriaRole(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CurrentAriaProperties(IUIAutomationElement* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAriaProperties(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CurrentIsDataValidForForm(IUIAutomationElement* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsDataValidForForm(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CurrentControllerFor(IUIAutomationElement* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentControllerFor(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CurrentDescribedBy(IUIAutomationElement* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentDescribedBy(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CurrentFlowsTo(IUIAutomationElement* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentFlowsTo(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CurrentProviderDescription(IUIAutomationElement* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentProviderDescription(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CachedProcessId(IUIAutomationElement* This,int *retVal) {
    return This->lpVtbl->get_CachedProcessId(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CachedControlType(IUIAutomationElement* This,CONTROLTYPEID *retVal) {
    return This->lpVtbl->get_CachedControlType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CachedLocalizedControlType(IUIAutomationElement* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedLocalizedControlType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CachedName(IUIAutomationElement* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedName(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CachedAcceleratorKey(IUIAutomationElement* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAcceleratorKey(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CachedAccessKey(IUIAutomationElement* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAccessKey(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CachedHasKeyboardFocus(IUIAutomationElement* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedHasKeyboardFocus(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CachedIsKeyboardFocusable(IUIAutomationElement* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsKeyboardFocusable(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CachedIsEnabled(IUIAutomationElement* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsEnabled(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CachedAutomationId(IUIAutomationElement* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAutomationId(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CachedClassName(IUIAutomationElement* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedClassName(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CachedHelpText(IUIAutomationElement* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedHelpText(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CachedCulture(IUIAutomationElement* This,int *retVal) {
    return This->lpVtbl->get_CachedCulture(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CachedIsControlElement(IUIAutomationElement* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsControlElement(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CachedIsContentElement(IUIAutomationElement* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsContentElement(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CachedIsPassword(IUIAutomationElement* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsPassword(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CachedNativeWindowHandle(IUIAutomationElement* This,UIA_HWND *retVal) {
    return This->lpVtbl->get_CachedNativeWindowHandle(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CachedItemType(IUIAutomationElement* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedItemType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CachedIsOffscreen(IUIAutomationElement* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsOffscreen(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CachedOrientation(IUIAutomationElement* This,enum OrientationType *retVal) {
    return This->lpVtbl->get_CachedOrientation(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CachedFrameworkId(IUIAutomationElement* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedFrameworkId(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CachedIsRequiredForForm(IUIAutomationElement* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsRequiredForForm(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CachedItemStatus(IUIAutomationElement* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedItemStatus(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CachedBoundingRectangle(IUIAutomationElement* This,RECT *retVal) {
    return This->lpVtbl->get_CachedBoundingRectangle(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CachedLabeledBy(IUIAutomationElement* This,IUIAutomationElement **retVal) {
    return This->lpVtbl->get_CachedLabeledBy(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CachedAriaRole(IUIAutomationElement* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAriaRole(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CachedAriaProperties(IUIAutomationElement* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAriaProperties(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CachedIsDataValidForForm(IUIAutomationElement* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsDataValidForForm(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CachedControllerFor(IUIAutomationElement* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedControllerFor(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CachedDescribedBy(IUIAutomationElement* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedDescribedBy(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CachedFlowsTo(IUIAutomationElement* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedFlowsTo(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_get_CachedProviderDescription(IUIAutomationElement* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedProviderDescription(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement_GetClickablePoint(IUIAutomationElement* This,POINT *clickable,WINBOOL *gotClickable) {
    return This->lpVtbl->GetClickablePoint(This,clickable,gotClickable);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationElement2 interface
 */
#ifndef __IUIAutomationElement2_INTERFACE_DEFINED__
#define __IUIAutomationElement2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationElement2, 0x6749c683, 0xf70d, 0x4487, 0xa6,0x98, 0x5f,0x79,0xd5,0x52,0x90,0xd6);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("6749c683-f70d-4487-a698-5f79d55290d6")
IUIAutomationElement2 : public IUIAutomationElement
{
    virtual HRESULT STDMETHODCALLTYPE get_CurrentOptimizeForVisualContent(
        WINBOOL *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CachedOptimizeForVisualContent(
        WINBOOL *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CurrentLiveSetting(
        enum LiveSetting *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CachedLiveSetting(
        enum LiveSetting *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CurrentFlowsFrom(
        IUIAutomationElementArray **retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CachedFlowsFrom(
        IUIAutomationElementArray **retVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationElement2, 0x6749c683, 0xf70d, 0x4487, 0xa6,0x98, 0x5f,0x79,0xd5,0x52,0x90,0xd6)
#endif
#else
typedef struct IUIAutomationElement2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomationElement methods ***/
    HRESULT (STDMETHODCALLTYPE *SetFocus)(
        IUIAutomationElement2 *This);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeId)(
        IUIAutomationElement2 *This,
        SAFEARRAY **runtimeId);

    HRESULT (STDMETHODCALLTYPE *FindFirst)(
        IUIAutomationElement2 *This,
        enum TreeScope scope,
        IUIAutomationCondition *condition,
        IUIAutomationElement **found);

    HRESULT (STDMETHODCALLTYPE *FindAll)(
        IUIAutomationElement2 *This,
        enum TreeScope scope,
        IUIAutomationCondition *condition,
        IUIAutomationElementArray **found);

    HRESULT (STDMETHODCALLTYPE *FindFirstBuildCache)(
        IUIAutomationElement2 *This,
        enum TreeScope scope,
        IUIAutomationCondition *condition,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **found);

    HRESULT (STDMETHODCALLTYPE *FindAllBuildCache)(
        IUIAutomationElement2 *This,
        enum TreeScope scope,
        IUIAutomationCondition *condition,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElementArray **found);

    HRESULT (STDMETHODCALLTYPE *BuildUpdatedCache)(
        IUIAutomationElement2 *This,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **updatedElement);

    HRESULT (STDMETHODCALLTYPE *GetCurrentPropertyValue)(
        IUIAutomationElement2 *This,
        PROPERTYID propertyId,
        VARIANT *retVal);

    HRESULT (STDMETHODCALLTYPE *GetCurrentPropertyValueEx)(
        IUIAutomationElement2 *This,
        PROPERTYID propertyId,
        WINBOOL ignoreDefaultValue,
        VARIANT *retVal);

    HRESULT (STDMETHODCALLTYPE *GetCachedPropertyValue)(
        IUIAutomationElement2 *This,
        PROPERTYID propertyId,
        VARIANT *retVal);

    HRESULT (STDMETHODCALLTYPE *GetCachedPropertyValueEx)(
        IUIAutomationElement2 *This,
        PROPERTYID propertyId,
        WINBOOL ignoreDefaultValue,
        VARIANT *retVal);

    HRESULT (STDMETHODCALLTYPE *GetCurrentPatternAs)(
        IUIAutomationElement2 *This,
        PATTERNID patternId,
        REFIID riid,
        void **patternObject);

    HRESULT (STDMETHODCALLTYPE *GetCachedPatternAs)(
        IUIAutomationElement2 *This,
        PATTERNID patternId,
        REFIID riid,
        void **patternObject);

    HRESULT (STDMETHODCALLTYPE *GetCurrentPattern)(
        IUIAutomationElement2 *This,
        PATTERNID patternId,
        IUnknown **patternObject);

    HRESULT (STDMETHODCALLTYPE *GetCachedPattern)(
        IUIAutomationElement2 *This,
        PATTERNID patternId,
        IUnknown **patternObject);

    HRESULT (STDMETHODCALLTYPE *GetCachedParent)(
        IUIAutomationElement2 *This,
        IUIAutomationElement **parent);

    HRESULT (STDMETHODCALLTYPE *GetCachedChildren)(
        IUIAutomationElement2 *This,
        IUIAutomationElementArray **children);

    HRESULT (STDMETHODCALLTYPE *get_CurrentProcessId)(
        IUIAutomationElement2 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentControlType)(
        IUIAutomationElement2 *This,
        CONTROLTYPEID *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentLocalizedControlType)(
        IUIAutomationElement2 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentName)(
        IUIAutomationElement2 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAcceleratorKey)(
        IUIAutomationElement2 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAccessKey)(
        IUIAutomationElement2 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentHasKeyboardFocus)(
        IUIAutomationElement2 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsKeyboardFocusable)(
        IUIAutomationElement2 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsEnabled)(
        IUIAutomationElement2 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAutomationId)(
        IUIAutomationElement2 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentClassName)(
        IUIAutomationElement2 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentHelpText)(
        IUIAutomationElement2 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentCulture)(
        IUIAutomationElement2 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsControlElement)(
        IUIAutomationElement2 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsContentElement)(
        IUIAutomationElement2 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsPassword)(
        IUIAutomationElement2 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentNativeWindowHandle)(
        IUIAutomationElement2 *This,
        UIA_HWND *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentItemType)(
        IUIAutomationElement2 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsOffscreen)(
        IUIAutomationElement2 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentOrientation)(
        IUIAutomationElement2 *This,
        enum OrientationType *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentFrameworkId)(
        IUIAutomationElement2 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsRequiredForForm)(
        IUIAutomationElement2 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentItemStatus)(
        IUIAutomationElement2 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentBoundingRectangle)(
        IUIAutomationElement2 *This,
        RECT *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentLabeledBy)(
        IUIAutomationElement2 *This,
        IUIAutomationElement **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAriaRole)(
        IUIAutomationElement2 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAriaProperties)(
        IUIAutomationElement2 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsDataValidForForm)(
        IUIAutomationElement2 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentControllerFor)(
        IUIAutomationElement2 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentDescribedBy)(
        IUIAutomationElement2 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentFlowsTo)(
        IUIAutomationElement2 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentProviderDescription)(
        IUIAutomationElement2 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedProcessId)(
        IUIAutomationElement2 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedControlType)(
        IUIAutomationElement2 *This,
        CONTROLTYPEID *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedLocalizedControlType)(
        IUIAutomationElement2 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedName)(
        IUIAutomationElement2 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAcceleratorKey)(
        IUIAutomationElement2 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAccessKey)(
        IUIAutomationElement2 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedHasKeyboardFocus)(
        IUIAutomationElement2 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsKeyboardFocusable)(
        IUIAutomationElement2 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsEnabled)(
        IUIAutomationElement2 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAutomationId)(
        IUIAutomationElement2 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedClassName)(
        IUIAutomationElement2 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedHelpText)(
        IUIAutomationElement2 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedCulture)(
        IUIAutomationElement2 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsControlElement)(
        IUIAutomationElement2 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsContentElement)(
        IUIAutomationElement2 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsPassword)(
        IUIAutomationElement2 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedNativeWindowHandle)(
        IUIAutomationElement2 *This,
        UIA_HWND *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedItemType)(
        IUIAutomationElement2 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsOffscreen)(
        IUIAutomationElement2 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedOrientation)(
        IUIAutomationElement2 *This,
        enum OrientationType *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedFrameworkId)(
        IUIAutomationElement2 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsRequiredForForm)(
        IUIAutomationElement2 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedItemStatus)(
        IUIAutomationElement2 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedBoundingRectangle)(
        IUIAutomationElement2 *This,
        RECT *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedLabeledBy)(
        IUIAutomationElement2 *This,
        IUIAutomationElement **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAriaRole)(
        IUIAutomationElement2 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAriaProperties)(
        IUIAutomationElement2 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsDataValidForForm)(
        IUIAutomationElement2 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedControllerFor)(
        IUIAutomationElement2 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedDescribedBy)(
        IUIAutomationElement2 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedFlowsTo)(
        IUIAutomationElement2 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedProviderDescription)(
        IUIAutomationElement2 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *GetClickablePoint)(
        IUIAutomationElement2 *This,
        POINT *clickable,
        WINBOOL *gotClickable);

    /*** IUIAutomationElement2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CurrentOptimizeForVisualContent)(
        IUIAutomationElement2 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedOptimizeForVisualContent)(
        IUIAutomationElement2 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentLiveSetting)(
        IUIAutomationElement2 *This,
        enum LiveSetting *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedLiveSetting)(
        IUIAutomationElement2 *This,
        enum LiveSetting *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentFlowsFrom)(
        IUIAutomationElement2 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedFlowsFrom)(
        IUIAutomationElement2 *This,
        IUIAutomationElementArray **retVal);

    END_INTERFACE
} IUIAutomationElement2Vtbl;

interface IUIAutomationElement2 {
    CONST_VTBL IUIAutomationElement2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationElement2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationElement2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationElement2_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationElement methods ***/
#define IUIAutomationElement2_SetFocus(This) (This)->lpVtbl->SetFocus(This)
#define IUIAutomationElement2_GetRuntimeId(This,runtimeId) (This)->lpVtbl->GetRuntimeId(This,runtimeId)
#define IUIAutomationElement2_FindFirst(This,scope,condition,found) (This)->lpVtbl->FindFirst(This,scope,condition,found)
#define IUIAutomationElement2_FindAll(This,scope,condition,found) (This)->lpVtbl->FindAll(This,scope,condition,found)
#define IUIAutomationElement2_FindFirstBuildCache(This,scope,condition,cacheRequest,found) (This)->lpVtbl->FindFirstBuildCache(This,scope,condition,cacheRequest,found)
#define IUIAutomationElement2_FindAllBuildCache(This,scope,condition,cacheRequest,found) (This)->lpVtbl->FindAllBuildCache(This,scope,condition,cacheRequest,found)
#define IUIAutomationElement2_BuildUpdatedCache(This,cacheRequest,updatedElement) (This)->lpVtbl->BuildUpdatedCache(This,cacheRequest,updatedElement)
#define IUIAutomationElement2_GetCurrentPropertyValue(This,propertyId,retVal) (This)->lpVtbl->GetCurrentPropertyValue(This,propertyId,retVal)
#define IUIAutomationElement2_GetCurrentPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal) (This)->lpVtbl->GetCurrentPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal)
#define IUIAutomationElement2_GetCachedPropertyValue(This,propertyId,retVal) (This)->lpVtbl->GetCachedPropertyValue(This,propertyId,retVal)
#define IUIAutomationElement2_GetCachedPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal) (This)->lpVtbl->GetCachedPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal)
#define IUIAutomationElement2_GetCurrentPatternAs(This,patternId,riid,patternObject) (This)->lpVtbl->GetCurrentPatternAs(This,patternId,riid,patternObject)
#define IUIAutomationElement2_GetCachedPatternAs(This,patternId,riid,patternObject) (This)->lpVtbl->GetCachedPatternAs(This,patternId,riid,patternObject)
#define IUIAutomationElement2_GetCurrentPattern(This,patternId,patternObject) (This)->lpVtbl->GetCurrentPattern(This,patternId,patternObject)
#define IUIAutomationElement2_GetCachedPattern(This,patternId,patternObject) (This)->lpVtbl->GetCachedPattern(This,patternId,patternObject)
#define IUIAutomationElement2_GetCachedParent(This,parent) (This)->lpVtbl->GetCachedParent(This,parent)
#define IUIAutomationElement2_GetCachedChildren(This,children) (This)->lpVtbl->GetCachedChildren(This,children)
#define IUIAutomationElement2_get_CurrentProcessId(This,retVal) (This)->lpVtbl->get_CurrentProcessId(This,retVal)
#define IUIAutomationElement2_get_CurrentControlType(This,retVal) (This)->lpVtbl->get_CurrentControlType(This,retVal)
#define IUIAutomationElement2_get_CurrentLocalizedControlType(This,retVal) (This)->lpVtbl->get_CurrentLocalizedControlType(This,retVal)
#define IUIAutomationElement2_get_CurrentName(This,retVal) (This)->lpVtbl->get_CurrentName(This,retVal)
#define IUIAutomationElement2_get_CurrentAcceleratorKey(This,retVal) (This)->lpVtbl->get_CurrentAcceleratorKey(This,retVal)
#define IUIAutomationElement2_get_CurrentAccessKey(This,retVal) (This)->lpVtbl->get_CurrentAccessKey(This,retVal)
#define IUIAutomationElement2_get_CurrentHasKeyboardFocus(This,retVal) (This)->lpVtbl->get_CurrentHasKeyboardFocus(This,retVal)
#define IUIAutomationElement2_get_CurrentIsKeyboardFocusable(This,retVal) (This)->lpVtbl->get_CurrentIsKeyboardFocusable(This,retVal)
#define IUIAutomationElement2_get_CurrentIsEnabled(This,retVal) (This)->lpVtbl->get_CurrentIsEnabled(This,retVal)
#define IUIAutomationElement2_get_CurrentAutomationId(This,retVal) (This)->lpVtbl->get_CurrentAutomationId(This,retVal)
#define IUIAutomationElement2_get_CurrentClassName(This,retVal) (This)->lpVtbl->get_CurrentClassName(This,retVal)
#define IUIAutomationElement2_get_CurrentHelpText(This,retVal) (This)->lpVtbl->get_CurrentHelpText(This,retVal)
#define IUIAutomationElement2_get_CurrentCulture(This,retVal) (This)->lpVtbl->get_CurrentCulture(This,retVal)
#define IUIAutomationElement2_get_CurrentIsControlElement(This,retVal) (This)->lpVtbl->get_CurrentIsControlElement(This,retVal)
#define IUIAutomationElement2_get_CurrentIsContentElement(This,retVal) (This)->lpVtbl->get_CurrentIsContentElement(This,retVal)
#define IUIAutomationElement2_get_CurrentIsPassword(This,retVal) (This)->lpVtbl->get_CurrentIsPassword(This,retVal)
#define IUIAutomationElement2_get_CurrentNativeWindowHandle(This,retVal) (This)->lpVtbl->get_CurrentNativeWindowHandle(This,retVal)
#define IUIAutomationElement2_get_CurrentItemType(This,retVal) (This)->lpVtbl->get_CurrentItemType(This,retVal)
#define IUIAutomationElement2_get_CurrentIsOffscreen(This,retVal) (This)->lpVtbl->get_CurrentIsOffscreen(This,retVal)
#define IUIAutomationElement2_get_CurrentOrientation(This,retVal) (This)->lpVtbl->get_CurrentOrientation(This,retVal)
#define IUIAutomationElement2_get_CurrentFrameworkId(This,retVal) (This)->lpVtbl->get_CurrentFrameworkId(This,retVal)
#define IUIAutomationElement2_get_CurrentIsRequiredForForm(This,retVal) (This)->lpVtbl->get_CurrentIsRequiredForForm(This,retVal)
#define IUIAutomationElement2_get_CurrentItemStatus(This,retVal) (This)->lpVtbl->get_CurrentItemStatus(This,retVal)
#define IUIAutomationElement2_get_CurrentBoundingRectangle(This,retVal) (This)->lpVtbl->get_CurrentBoundingRectangle(This,retVal)
#define IUIAutomationElement2_get_CurrentLabeledBy(This,retVal) (This)->lpVtbl->get_CurrentLabeledBy(This,retVal)
#define IUIAutomationElement2_get_CurrentAriaRole(This,retVal) (This)->lpVtbl->get_CurrentAriaRole(This,retVal)
#define IUIAutomationElement2_get_CurrentAriaProperties(This,retVal) (This)->lpVtbl->get_CurrentAriaProperties(This,retVal)
#define IUIAutomationElement2_get_CurrentIsDataValidForForm(This,retVal) (This)->lpVtbl->get_CurrentIsDataValidForForm(This,retVal)
#define IUIAutomationElement2_get_CurrentControllerFor(This,retVal) (This)->lpVtbl->get_CurrentControllerFor(This,retVal)
#define IUIAutomationElement2_get_CurrentDescribedBy(This,retVal) (This)->lpVtbl->get_CurrentDescribedBy(This,retVal)
#define IUIAutomationElement2_get_CurrentFlowsTo(This,retVal) (This)->lpVtbl->get_CurrentFlowsTo(This,retVal)
#define IUIAutomationElement2_get_CurrentProviderDescription(This,retVal) (This)->lpVtbl->get_CurrentProviderDescription(This,retVal)
#define IUIAutomationElement2_get_CachedProcessId(This,retVal) (This)->lpVtbl->get_CachedProcessId(This,retVal)
#define IUIAutomationElement2_get_CachedControlType(This,retVal) (This)->lpVtbl->get_CachedControlType(This,retVal)
#define IUIAutomationElement2_get_CachedLocalizedControlType(This,retVal) (This)->lpVtbl->get_CachedLocalizedControlType(This,retVal)
#define IUIAutomationElement2_get_CachedName(This,retVal) (This)->lpVtbl->get_CachedName(This,retVal)
#define IUIAutomationElement2_get_CachedAcceleratorKey(This,retVal) (This)->lpVtbl->get_CachedAcceleratorKey(This,retVal)
#define IUIAutomationElement2_get_CachedAccessKey(This,retVal) (This)->lpVtbl->get_CachedAccessKey(This,retVal)
#define IUIAutomationElement2_get_CachedHasKeyboardFocus(This,retVal) (This)->lpVtbl->get_CachedHasKeyboardFocus(This,retVal)
#define IUIAutomationElement2_get_CachedIsKeyboardFocusable(This,retVal) (This)->lpVtbl->get_CachedIsKeyboardFocusable(This,retVal)
#define IUIAutomationElement2_get_CachedIsEnabled(This,retVal) (This)->lpVtbl->get_CachedIsEnabled(This,retVal)
#define IUIAutomationElement2_get_CachedAutomationId(This,retVal) (This)->lpVtbl->get_CachedAutomationId(This,retVal)
#define IUIAutomationElement2_get_CachedClassName(This,retVal) (This)->lpVtbl->get_CachedClassName(This,retVal)
#define IUIAutomationElement2_get_CachedHelpText(This,retVal) (This)->lpVtbl->get_CachedHelpText(This,retVal)
#define IUIAutomationElement2_get_CachedCulture(This,retVal) (This)->lpVtbl->get_CachedCulture(This,retVal)
#define IUIAutomationElement2_get_CachedIsControlElement(This,retVal) (This)->lpVtbl->get_CachedIsControlElement(This,retVal)
#define IUIAutomationElement2_get_CachedIsContentElement(This,retVal) (This)->lpVtbl->get_CachedIsContentElement(This,retVal)
#define IUIAutomationElement2_get_CachedIsPassword(This,retVal) (This)->lpVtbl->get_CachedIsPassword(This,retVal)
#define IUIAutomationElement2_get_CachedNativeWindowHandle(This,retVal) (This)->lpVtbl->get_CachedNativeWindowHandle(This,retVal)
#define IUIAutomationElement2_get_CachedItemType(This,retVal) (This)->lpVtbl->get_CachedItemType(This,retVal)
#define IUIAutomationElement2_get_CachedIsOffscreen(This,retVal) (This)->lpVtbl->get_CachedIsOffscreen(This,retVal)
#define IUIAutomationElement2_get_CachedOrientation(This,retVal) (This)->lpVtbl->get_CachedOrientation(This,retVal)
#define IUIAutomationElement2_get_CachedFrameworkId(This,retVal) (This)->lpVtbl->get_CachedFrameworkId(This,retVal)
#define IUIAutomationElement2_get_CachedIsRequiredForForm(This,retVal) (This)->lpVtbl->get_CachedIsRequiredForForm(This,retVal)
#define IUIAutomationElement2_get_CachedItemStatus(This,retVal) (This)->lpVtbl->get_CachedItemStatus(This,retVal)
#define IUIAutomationElement2_get_CachedBoundingRectangle(This,retVal) (This)->lpVtbl->get_CachedBoundingRectangle(This,retVal)
#define IUIAutomationElement2_get_CachedLabeledBy(This,retVal) (This)->lpVtbl->get_CachedLabeledBy(This,retVal)
#define IUIAutomationElement2_get_CachedAriaRole(This,retVal) (This)->lpVtbl->get_CachedAriaRole(This,retVal)
#define IUIAutomationElement2_get_CachedAriaProperties(This,retVal) (This)->lpVtbl->get_CachedAriaProperties(This,retVal)
#define IUIAutomationElement2_get_CachedIsDataValidForForm(This,retVal) (This)->lpVtbl->get_CachedIsDataValidForForm(This,retVal)
#define IUIAutomationElement2_get_CachedControllerFor(This,retVal) (This)->lpVtbl->get_CachedControllerFor(This,retVal)
#define IUIAutomationElement2_get_CachedDescribedBy(This,retVal) (This)->lpVtbl->get_CachedDescribedBy(This,retVal)
#define IUIAutomationElement2_get_CachedFlowsTo(This,retVal) (This)->lpVtbl->get_CachedFlowsTo(This,retVal)
#define IUIAutomationElement2_get_CachedProviderDescription(This,retVal) (This)->lpVtbl->get_CachedProviderDescription(This,retVal)
#define IUIAutomationElement2_GetClickablePoint(This,clickable,gotClickable) (This)->lpVtbl->GetClickablePoint(This,clickable,gotClickable)
/*** IUIAutomationElement2 methods ***/
#define IUIAutomationElement2_get_CurrentOptimizeForVisualContent(This,retVal) (This)->lpVtbl->get_CurrentOptimizeForVisualContent(This,retVal)
#define IUIAutomationElement2_get_CachedOptimizeForVisualContent(This,retVal) (This)->lpVtbl->get_CachedOptimizeForVisualContent(This,retVal)
#define IUIAutomationElement2_get_CurrentLiveSetting(This,retVal) (This)->lpVtbl->get_CurrentLiveSetting(This,retVal)
#define IUIAutomationElement2_get_CachedLiveSetting(This,retVal) (This)->lpVtbl->get_CachedLiveSetting(This,retVal)
#define IUIAutomationElement2_get_CurrentFlowsFrom(This,retVal) (This)->lpVtbl->get_CurrentFlowsFrom(This,retVal)
#define IUIAutomationElement2_get_CachedFlowsFrom(This,retVal) (This)->lpVtbl->get_CachedFlowsFrom(This,retVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationElement2_QueryInterface(IUIAutomationElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationElement2_AddRef(IUIAutomationElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationElement2_Release(IUIAutomationElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationElement methods ***/
static __WIDL_INLINE HRESULT IUIAutomationElement2_SetFocus(IUIAutomationElement2* This) {
    return This->lpVtbl->SetFocus(This);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_GetRuntimeId(IUIAutomationElement2* This,SAFEARRAY **runtimeId) {
    return This->lpVtbl->GetRuntimeId(This,runtimeId);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_FindFirst(IUIAutomationElement2* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationElement **found) {
    return This->lpVtbl->FindFirst(This,scope,condition,found);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_FindAll(IUIAutomationElement2* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationElementArray **found) {
    return This->lpVtbl->FindAll(This,scope,condition,found);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_FindFirstBuildCache(IUIAutomationElement2* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **found) {
    return This->lpVtbl->FindFirstBuildCache(This,scope,condition,cacheRequest,found);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_FindAllBuildCache(IUIAutomationElement2* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElementArray **found) {
    return This->lpVtbl->FindAllBuildCache(This,scope,condition,cacheRequest,found);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_BuildUpdatedCache(IUIAutomationElement2* This,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **updatedElement) {
    return This->lpVtbl->BuildUpdatedCache(This,cacheRequest,updatedElement);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_GetCurrentPropertyValue(IUIAutomationElement2* This,PROPERTYID propertyId,VARIANT *retVal) {
    return This->lpVtbl->GetCurrentPropertyValue(This,propertyId,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_GetCurrentPropertyValueEx(IUIAutomationElement2* This,PROPERTYID propertyId,WINBOOL ignoreDefaultValue,VARIANT *retVal) {
    return This->lpVtbl->GetCurrentPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_GetCachedPropertyValue(IUIAutomationElement2* This,PROPERTYID propertyId,VARIANT *retVal) {
    return This->lpVtbl->GetCachedPropertyValue(This,propertyId,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_GetCachedPropertyValueEx(IUIAutomationElement2* This,PROPERTYID propertyId,WINBOOL ignoreDefaultValue,VARIANT *retVal) {
    return This->lpVtbl->GetCachedPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_GetCurrentPatternAs(IUIAutomationElement2* This,PATTERNID patternId,REFIID riid,void **patternObject) {
    return This->lpVtbl->GetCurrentPatternAs(This,patternId,riid,patternObject);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_GetCachedPatternAs(IUIAutomationElement2* This,PATTERNID patternId,REFIID riid,void **patternObject) {
    return This->lpVtbl->GetCachedPatternAs(This,patternId,riid,patternObject);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_GetCurrentPattern(IUIAutomationElement2* This,PATTERNID patternId,IUnknown **patternObject) {
    return This->lpVtbl->GetCurrentPattern(This,patternId,patternObject);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_GetCachedPattern(IUIAutomationElement2* This,PATTERNID patternId,IUnknown **patternObject) {
    return This->lpVtbl->GetCachedPattern(This,patternId,patternObject);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_GetCachedParent(IUIAutomationElement2* This,IUIAutomationElement **parent) {
    return This->lpVtbl->GetCachedParent(This,parent);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_GetCachedChildren(IUIAutomationElement2* This,IUIAutomationElementArray **children) {
    return This->lpVtbl->GetCachedChildren(This,children);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CurrentProcessId(IUIAutomationElement2* This,int *retVal) {
    return This->lpVtbl->get_CurrentProcessId(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CurrentControlType(IUIAutomationElement2* This,CONTROLTYPEID *retVal) {
    return This->lpVtbl->get_CurrentControlType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CurrentLocalizedControlType(IUIAutomationElement2* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentLocalizedControlType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CurrentName(IUIAutomationElement2* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentName(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CurrentAcceleratorKey(IUIAutomationElement2* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAcceleratorKey(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CurrentAccessKey(IUIAutomationElement2* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAccessKey(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CurrentHasKeyboardFocus(IUIAutomationElement2* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentHasKeyboardFocus(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CurrentIsKeyboardFocusable(IUIAutomationElement2* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsKeyboardFocusable(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CurrentIsEnabled(IUIAutomationElement2* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsEnabled(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CurrentAutomationId(IUIAutomationElement2* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAutomationId(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CurrentClassName(IUIAutomationElement2* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentClassName(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CurrentHelpText(IUIAutomationElement2* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentHelpText(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CurrentCulture(IUIAutomationElement2* This,int *retVal) {
    return This->lpVtbl->get_CurrentCulture(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CurrentIsControlElement(IUIAutomationElement2* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsControlElement(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CurrentIsContentElement(IUIAutomationElement2* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsContentElement(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CurrentIsPassword(IUIAutomationElement2* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsPassword(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CurrentNativeWindowHandle(IUIAutomationElement2* This,UIA_HWND *retVal) {
    return This->lpVtbl->get_CurrentNativeWindowHandle(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CurrentItemType(IUIAutomationElement2* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentItemType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CurrentIsOffscreen(IUIAutomationElement2* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsOffscreen(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CurrentOrientation(IUIAutomationElement2* This,enum OrientationType *retVal) {
    return This->lpVtbl->get_CurrentOrientation(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CurrentFrameworkId(IUIAutomationElement2* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentFrameworkId(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CurrentIsRequiredForForm(IUIAutomationElement2* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsRequiredForForm(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CurrentItemStatus(IUIAutomationElement2* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentItemStatus(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CurrentBoundingRectangle(IUIAutomationElement2* This,RECT *retVal) {
    return This->lpVtbl->get_CurrentBoundingRectangle(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CurrentLabeledBy(IUIAutomationElement2* This,IUIAutomationElement **retVal) {
    return This->lpVtbl->get_CurrentLabeledBy(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CurrentAriaRole(IUIAutomationElement2* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAriaRole(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CurrentAriaProperties(IUIAutomationElement2* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAriaProperties(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CurrentIsDataValidForForm(IUIAutomationElement2* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsDataValidForForm(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CurrentControllerFor(IUIAutomationElement2* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentControllerFor(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CurrentDescribedBy(IUIAutomationElement2* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentDescribedBy(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CurrentFlowsTo(IUIAutomationElement2* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentFlowsTo(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CurrentProviderDescription(IUIAutomationElement2* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentProviderDescription(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CachedProcessId(IUIAutomationElement2* This,int *retVal) {
    return This->lpVtbl->get_CachedProcessId(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CachedControlType(IUIAutomationElement2* This,CONTROLTYPEID *retVal) {
    return This->lpVtbl->get_CachedControlType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CachedLocalizedControlType(IUIAutomationElement2* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedLocalizedControlType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CachedName(IUIAutomationElement2* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedName(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CachedAcceleratorKey(IUIAutomationElement2* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAcceleratorKey(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CachedAccessKey(IUIAutomationElement2* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAccessKey(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CachedHasKeyboardFocus(IUIAutomationElement2* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedHasKeyboardFocus(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CachedIsKeyboardFocusable(IUIAutomationElement2* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsKeyboardFocusable(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CachedIsEnabled(IUIAutomationElement2* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsEnabled(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CachedAutomationId(IUIAutomationElement2* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAutomationId(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CachedClassName(IUIAutomationElement2* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedClassName(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CachedHelpText(IUIAutomationElement2* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedHelpText(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CachedCulture(IUIAutomationElement2* This,int *retVal) {
    return This->lpVtbl->get_CachedCulture(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CachedIsControlElement(IUIAutomationElement2* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsControlElement(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CachedIsContentElement(IUIAutomationElement2* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsContentElement(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CachedIsPassword(IUIAutomationElement2* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsPassword(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CachedNativeWindowHandle(IUIAutomationElement2* This,UIA_HWND *retVal) {
    return This->lpVtbl->get_CachedNativeWindowHandle(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CachedItemType(IUIAutomationElement2* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedItemType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CachedIsOffscreen(IUIAutomationElement2* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsOffscreen(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CachedOrientation(IUIAutomationElement2* This,enum OrientationType *retVal) {
    return This->lpVtbl->get_CachedOrientation(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CachedFrameworkId(IUIAutomationElement2* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedFrameworkId(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CachedIsRequiredForForm(IUIAutomationElement2* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsRequiredForForm(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CachedItemStatus(IUIAutomationElement2* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedItemStatus(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CachedBoundingRectangle(IUIAutomationElement2* This,RECT *retVal) {
    return This->lpVtbl->get_CachedBoundingRectangle(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CachedLabeledBy(IUIAutomationElement2* This,IUIAutomationElement **retVal) {
    return This->lpVtbl->get_CachedLabeledBy(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CachedAriaRole(IUIAutomationElement2* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAriaRole(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CachedAriaProperties(IUIAutomationElement2* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAriaProperties(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CachedIsDataValidForForm(IUIAutomationElement2* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsDataValidForForm(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CachedControllerFor(IUIAutomationElement2* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedControllerFor(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CachedDescribedBy(IUIAutomationElement2* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedDescribedBy(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CachedFlowsTo(IUIAutomationElement2* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedFlowsTo(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CachedProviderDescription(IUIAutomationElement2* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedProviderDescription(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_GetClickablePoint(IUIAutomationElement2* This,POINT *clickable,WINBOOL *gotClickable) {
    return This->lpVtbl->GetClickablePoint(This,clickable,gotClickable);
}
/*** IUIAutomationElement2 methods ***/
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CurrentOptimizeForVisualContent(IUIAutomationElement2* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentOptimizeForVisualContent(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CachedOptimizeForVisualContent(IUIAutomationElement2* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedOptimizeForVisualContent(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CurrentLiveSetting(IUIAutomationElement2* This,enum LiveSetting *retVal) {
    return This->lpVtbl->get_CurrentLiveSetting(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CachedLiveSetting(IUIAutomationElement2* This,enum LiveSetting *retVal) {
    return This->lpVtbl->get_CachedLiveSetting(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CurrentFlowsFrom(IUIAutomationElement2* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentFlowsFrom(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement2_get_CachedFlowsFrom(IUIAutomationElement2* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedFlowsFrom(This,retVal);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationElement2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationElement3 interface
 */
#ifndef __IUIAutomationElement3_INTERFACE_DEFINED__
#define __IUIAutomationElement3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationElement3, 0x8471df34, 0xaee0, 0x4a01, 0xa7,0xde, 0x7d,0xb9,0xaf,0x12,0xc2,0x96);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("8471df34-aee0-4a01-a7de-7db9af12c296")
IUIAutomationElement3 : public IUIAutomationElement2
{
    virtual HRESULT STDMETHODCALLTYPE ShowContextMenu(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CurrentIsPeripheral(
        WINBOOL *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CachedIsPeripheral(
        WINBOOL *retVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationElement3, 0x8471df34, 0xaee0, 0x4a01, 0xa7,0xde, 0x7d,0xb9,0xaf,0x12,0xc2,0x96)
#endif
#else
typedef struct IUIAutomationElement3Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomationElement methods ***/
    HRESULT (STDMETHODCALLTYPE *SetFocus)(
        IUIAutomationElement3 *This);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeId)(
        IUIAutomationElement3 *This,
        SAFEARRAY **runtimeId);

    HRESULT (STDMETHODCALLTYPE *FindFirst)(
        IUIAutomationElement3 *This,
        enum TreeScope scope,
        IUIAutomationCondition *condition,
        IUIAutomationElement **found);

    HRESULT (STDMETHODCALLTYPE *FindAll)(
        IUIAutomationElement3 *This,
        enum TreeScope scope,
        IUIAutomationCondition *condition,
        IUIAutomationElementArray **found);

    HRESULT (STDMETHODCALLTYPE *FindFirstBuildCache)(
        IUIAutomationElement3 *This,
        enum TreeScope scope,
        IUIAutomationCondition *condition,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **found);

    HRESULT (STDMETHODCALLTYPE *FindAllBuildCache)(
        IUIAutomationElement3 *This,
        enum TreeScope scope,
        IUIAutomationCondition *condition,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElementArray **found);

    HRESULT (STDMETHODCALLTYPE *BuildUpdatedCache)(
        IUIAutomationElement3 *This,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **updatedElement);

    HRESULT (STDMETHODCALLTYPE *GetCurrentPropertyValue)(
        IUIAutomationElement3 *This,
        PROPERTYID propertyId,
        VARIANT *retVal);

    HRESULT (STDMETHODCALLTYPE *GetCurrentPropertyValueEx)(
        IUIAutomationElement3 *This,
        PROPERTYID propertyId,
        WINBOOL ignoreDefaultValue,
        VARIANT *retVal);

    HRESULT (STDMETHODCALLTYPE *GetCachedPropertyValue)(
        IUIAutomationElement3 *This,
        PROPERTYID propertyId,
        VARIANT *retVal);

    HRESULT (STDMETHODCALLTYPE *GetCachedPropertyValueEx)(
        IUIAutomationElement3 *This,
        PROPERTYID propertyId,
        WINBOOL ignoreDefaultValue,
        VARIANT *retVal);

    HRESULT (STDMETHODCALLTYPE *GetCurrentPatternAs)(
        IUIAutomationElement3 *This,
        PATTERNID patternId,
        REFIID riid,
        void **patternObject);

    HRESULT (STDMETHODCALLTYPE *GetCachedPatternAs)(
        IUIAutomationElement3 *This,
        PATTERNID patternId,
        REFIID riid,
        void **patternObject);

    HRESULT (STDMETHODCALLTYPE *GetCurrentPattern)(
        IUIAutomationElement3 *This,
        PATTERNID patternId,
        IUnknown **patternObject);

    HRESULT (STDMETHODCALLTYPE *GetCachedPattern)(
        IUIAutomationElement3 *This,
        PATTERNID patternId,
        IUnknown **patternObject);

    HRESULT (STDMETHODCALLTYPE *GetCachedParent)(
        IUIAutomationElement3 *This,
        IUIAutomationElement **parent);

    HRESULT (STDMETHODCALLTYPE *GetCachedChildren)(
        IUIAutomationElement3 *This,
        IUIAutomationElementArray **children);

    HRESULT (STDMETHODCALLTYPE *get_CurrentProcessId)(
        IUIAutomationElement3 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentControlType)(
        IUIAutomationElement3 *This,
        CONTROLTYPEID *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentLocalizedControlType)(
        IUIAutomationElement3 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentName)(
        IUIAutomationElement3 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAcceleratorKey)(
        IUIAutomationElement3 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAccessKey)(
        IUIAutomationElement3 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentHasKeyboardFocus)(
        IUIAutomationElement3 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsKeyboardFocusable)(
        IUIAutomationElement3 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsEnabled)(
        IUIAutomationElement3 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAutomationId)(
        IUIAutomationElement3 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentClassName)(
        IUIAutomationElement3 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentHelpText)(
        IUIAutomationElement3 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentCulture)(
        IUIAutomationElement3 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsControlElement)(
        IUIAutomationElement3 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsContentElement)(
        IUIAutomationElement3 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsPassword)(
        IUIAutomationElement3 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentNativeWindowHandle)(
        IUIAutomationElement3 *This,
        UIA_HWND *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentItemType)(
        IUIAutomationElement3 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsOffscreen)(
        IUIAutomationElement3 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentOrientation)(
        IUIAutomationElement3 *This,
        enum OrientationType *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentFrameworkId)(
        IUIAutomationElement3 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsRequiredForForm)(
        IUIAutomationElement3 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentItemStatus)(
        IUIAutomationElement3 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentBoundingRectangle)(
        IUIAutomationElement3 *This,
        RECT *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentLabeledBy)(
        IUIAutomationElement3 *This,
        IUIAutomationElement **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAriaRole)(
        IUIAutomationElement3 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAriaProperties)(
        IUIAutomationElement3 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsDataValidForForm)(
        IUIAutomationElement3 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentControllerFor)(
        IUIAutomationElement3 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentDescribedBy)(
        IUIAutomationElement3 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentFlowsTo)(
        IUIAutomationElement3 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentProviderDescription)(
        IUIAutomationElement3 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedProcessId)(
        IUIAutomationElement3 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedControlType)(
        IUIAutomationElement3 *This,
        CONTROLTYPEID *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedLocalizedControlType)(
        IUIAutomationElement3 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedName)(
        IUIAutomationElement3 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAcceleratorKey)(
        IUIAutomationElement3 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAccessKey)(
        IUIAutomationElement3 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedHasKeyboardFocus)(
        IUIAutomationElement3 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsKeyboardFocusable)(
        IUIAutomationElement3 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsEnabled)(
        IUIAutomationElement3 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAutomationId)(
        IUIAutomationElement3 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedClassName)(
        IUIAutomationElement3 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedHelpText)(
        IUIAutomationElement3 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedCulture)(
        IUIAutomationElement3 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsControlElement)(
        IUIAutomationElement3 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsContentElement)(
        IUIAutomationElement3 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsPassword)(
        IUIAutomationElement3 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedNativeWindowHandle)(
        IUIAutomationElement3 *This,
        UIA_HWND *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedItemType)(
        IUIAutomationElement3 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsOffscreen)(
        IUIAutomationElement3 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedOrientation)(
        IUIAutomationElement3 *This,
        enum OrientationType *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedFrameworkId)(
        IUIAutomationElement3 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsRequiredForForm)(
        IUIAutomationElement3 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedItemStatus)(
        IUIAutomationElement3 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedBoundingRectangle)(
        IUIAutomationElement3 *This,
        RECT *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedLabeledBy)(
        IUIAutomationElement3 *This,
        IUIAutomationElement **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAriaRole)(
        IUIAutomationElement3 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAriaProperties)(
        IUIAutomationElement3 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsDataValidForForm)(
        IUIAutomationElement3 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedControllerFor)(
        IUIAutomationElement3 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedDescribedBy)(
        IUIAutomationElement3 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedFlowsTo)(
        IUIAutomationElement3 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedProviderDescription)(
        IUIAutomationElement3 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *GetClickablePoint)(
        IUIAutomationElement3 *This,
        POINT *clickable,
        WINBOOL *gotClickable);

    /*** IUIAutomationElement2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CurrentOptimizeForVisualContent)(
        IUIAutomationElement3 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedOptimizeForVisualContent)(
        IUIAutomationElement3 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentLiveSetting)(
        IUIAutomationElement3 *This,
        enum LiveSetting *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedLiveSetting)(
        IUIAutomationElement3 *This,
        enum LiveSetting *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentFlowsFrom)(
        IUIAutomationElement3 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedFlowsFrom)(
        IUIAutomationElement3 *This,
        IUIAutomationElementArray **retVal);

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

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsPeripheral)(
        IUIAutomationElement3 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsPeripheral)(
        IUIAutomationElement3 *This,
        WINBOOL *retVal);

    END_INTERFACE
} IUIAutomationElement3Vtbl;

interface IUIAutomationElement3 {
    CONST_VTBL IUIAutomationElement3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationElement3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationElement3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationElement3_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationElement methods ***/
#define IUIAutomationElement3_SetFocus(This) (This)->lpVtbl->SetFocus(This)
#define IUIAutomationElement3_GetRuntimeId(This,runtimeId) (This)->lpVtbl->GetRuntimeId(This,runtimeId)
#define IUIAutomationElement3_FindFirst(This,scope,condition,found) (This)->lpVtbl->FindFirst(This,scope,condition,found)
#define IUIAutomationElement3_FindAll(This,scope,condition,found) (This)->lpVtbl->FindAll(This,scope,condition,found)
#define IUIAutomationElement3_FindFirstBuildCache(This,scope,condition,cacheRequest,found) (This)->lpVtbl->FindFirstBuildCache(This,scope,condition,cacheRequest,found)
#define IUIAutomationElement3_FindAllBuildCache(This,scope,condition,cacheRequest,found) (This)->lpVtbl->FindAllBuildCache(This,scope,condition,cacheRequest,found)
#define IUIAutomationElement3_BuildUpdatedCache(This,cacheRequest,updatedElement) (This)->lpVtbl->BuildUpdatedCache(This,cacheRequest,updatedElement)
#define IUIAutomationElement3_GetCurrentPropertyValue(This,propertyId,retVal) (This)->lpVtbl->GetCurrentPropertyValue(This,propertyId,retVal)
#define IUIAutomationElement3_GetCurrentPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal) (This)->lpVtbl->GetCurrentPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal)
#define IUIAutomationElement3_GetCachedPropertyValue(This,propertyId,retVal) (This)->lpVtbl->GetCachedPropertyValue(This,propertyId,retVal)
#define IUIAutomationElement3_GetCachedPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal) (This)->lpVtbl->GetCachedPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal)
#define IUIAutomationElement3_GetCurrentPatternAs(This,patternId,riid,patternObject) (This)->lpVtbl->GetCurrentPatternAs(This,patternId,riid,patternObject)
#define IUIAutomationElement3_GetCachedPatternAs(This,patternId,riid,patternObject) (This)->lpVtbl->GetCachedPatternAs(This,patternId,riid,patternObject)
#define IUIAutomationElement3_GetCurrentPattern(This,patternId,patternObject) (This)->lpVtbl->GetCurrentPattern(This,patternId,patternObject)
#define IUIAutomationElement3_GetCachedPattern(This,patternId,patternObject) (This)->lpVtbl->GetCachedPattern(This,patternId,patternObject)
#define IUIAutomationElement3_GetCachedParent(This,parent) (This)->lpVtbl->GetCachedParent(This,parent)
#define IUIAutomationElement3_GetCachedChildren(This,children) (This)->lpVtbl->GetCachedChildren(This,children)
#define IUIAutomationElement3_get_CurrentProcessId(This,retVal) (This)->lpVtbl->get_CurrentProcessId(This,retVal)
#define IUIAutomationElement3_get_CurrentControlType(This,retVal) (This)->lpVtbl->get_CurrentControlType(This,retVal)
#define IUIAutomationElement3_get_CurrentLocalizedControlType(This,retVal) (This)->lpVtbl->get_CurrentLocalizedControlType(This,retVal)
#define IUIAutomationElement3_get_CurrentName(This,retVal) (This)->lpVtbl->get_CurrentName(This,retVal)
#define IUIAutomationElement3_get_CurrentAcceleratorKey(This,retVal) (This)->lpVtbl->get_CurrentAcceleratorKey(This,retVal)
#define IUIAutomationElement3_get_CurrentAccessKey(This,retVal) (This)->lpVtbl->get_CurrentAccessKey(This,retVal)
#define IUIAutomationElement3_get_CurrentHasKeyboardFocus(This,retVal) (This)->lpVtbl->get_CurrentHasKeyboardFocus(This,retVal)
#define IUIAutomationElement3_get_CurrentIsKeyboardFocusable(This,retVal) (This)->lpVtbl->get_CurrentIsKeyboardFocusable(This,retVal)
#define IUIAutomationElement3_get_CurrentIsEnabled(This,retVal) (This)->lpVtbl->get_CurrentIsEnabled(This,retVal)
#define IUIAutomationElement3_get_CurrentAutomationId(This,retVal) (This)->lpVtbl->get_CurrentAutomationId(This,retVal)
#define IUIAutomationElement3_get_CurrentClassName(This,retVal) (This)->lpVtbl->get_CurrentClassName(This,retVal)
#define IUIAutomationElement3_get_CurrentHelpText(This,retVal) (This)->lpVtbl->get_CurrentHelpText(This,retVal)
#define IUIAutomationElement3_get_CurrentCulture(This,retVal) (This)->lpVtbl->get_CurrentCulture(This,retVal)
#define IUIAutomationElement3_get_CurrentIsControlElement(This,retVal) (This)->lpVtbl->get_CurrentIsControlElement(This,retVal)
#define IUIAutomationElement3_get_CurrentIsContentElement(This,retVal) (This)->lpVtbl->get_CurrentIsContentElement(This,retVal)
#define IUIAutomationElement3_get_CurrentIsPassword(This,retVal) (This)->lpVtbl->get_CurrentIsPassword(This,retVal)
#define IUIAutomationElement3_get_CurrentNativeWindowHandle(This,retVal) (This)->lpVtbl->get_CurrentNativeWindowHandle(This,retVal)
#define IUIAutomationElement3_get_CurrentItemType(This,retVal) (This)->lpVtbl->get_CurrentItemType(This,retVal)
#define IUIAutomationElement3_get_CurrentIsOffscreen(This,retVal) (This)->lpVtbl->get_CurrentIsOffscreen(This,retVal)
#define IUIAutomationElement3_get_CurrentOrientation(This,retVal) (This)->lpVtbl->get_CurrentOrientation(This,retVal)
#define IUIAutomationElement3_get_CurrentFrameworkId(This,retVal) (This)->lpVtbl->get_CurrentFrameworkId(This,retVal)
#define IUIAutomationElement3_get_CurrentIsRequiredForForm(This,retVal) (This)->lpVtbl->get_CurrentIsRequiredForForm(This,retVal)
#define IUIAutomationElement3_get_CurrentItemStatus(This,retVal) (This)->lpVtbl->get_CurrentItemStatus(This,retVal)
#define IUIAutomationElement3_get_CurrentBoundingRectangle(This,retVal) (This)->lpVtbl->get_CurrentBoundingRectangle(This,retVal)
#define IUIAutomationElement3_get_CurrentLabeledBy(This,retVal) (This)->lpVtbl->get_CurrentLabeledBy(This,retVal)
#define IUIAutomationElement3_get_CurrentAriaRole(This,retVal) (This)->lpVtbl->get_CurrentAriaRole(This,retVal)
#define IUIAutomationElement3_get_CurrentAriaProperties(This,retVal) (This)->lpVtbl->get_CurrentAriaProperties(This,retVal)
#define IUIAutomationElement3_get_CurrentIsDataValidForForm(This,retVal) (This)->lpVtbl->get_CurrentIsDataValidForForm(This,retVal)
#define IUIAutomationElement3_get_CurrentControllerFor(This,retVal) (This)->lpVtbl->get_CurrentControllerFor(This,retVal)
#define IUIAutomationElement3_get_CurrentDescribedBy(This,retVal) (This)->lpVtbl->get_CurrentDescribedBy(This,retVal)
#define IUIAutomationElement3_get_CurrentFlowsTo(This,retVal) (This)->lpVtbl->get_CurrentFlowsTo(This,retVal)
#define IUIAutomationElement3_get_CurrentProviderDescription(This,retVal) (This)->lpVtbl->get_CurrentProviderDescription(This,retVal)
#define IUIAutomationElement3_get_CachedProcessId(This,retVal) (This)->lpVtbl->get_CachedProcessId(This,retVal)
#define IUIAutomationElement3_get_CachedControlType(This,retVal) (This)->lpVtbl->get_CachedControlType(This,retVal)
#define IUIAutomationElement3_get_CachedLocalizedControlType(This,retVal) (This)->lpVtbl->get_CachedLocalizedControlType(This,retVal)
#define IUIAutomationElement3_get_CachedName(This,retVal) (This)->lpVtbl->get_CachedName(This,retVal)
#define IUIAutomationElement3_get_CachedAcceleratorKey(This,retVal) (This)->lpVtbl->get_CachedAcceleratorKey(This,retVal)
#define IUIAutomationElement3_get_CachedAccessKey(This,retVal) (This)->lpVtbl->get_CachedAccessKey(This,retVal)
#define IUIAutomationElement3_get_CachedHasKeyboardFocus(This,retVal) (This)->lpVtbl->get_CachedHasKeyboardFocus(This,retVal)
#define IUIAutomationElement3_get_CachedIsKeyboardFocusable(This,retVal) (This)->lpVtbl->get_CachedIsKeyboardFocusable(This,retVal)
#define IUIAutomationElement3_get_CachedIsEnabled(This,retVal) (This)->lpVtbl->get_CachedIsEnabled(This,retVal)
#define IUIAutomationElement3_get_CachedAutomationId(This,retVal) (This)->lpVtbl->get_CachedAutomationId(This,retVal)
#define IUIAutomationElement3_get_CachedClassName(This,retVal) (This)->lpVtbl->get_CachedClassName(This,retVal)
#define IUIAutomationElement3_get_CachedHelpText(This,retVal) (This)->lpVtbl->get_CachedHelpText(This,retVal)
#define IUIAutomationElement3_get_CachedCulture(This,retVal) (This)->lpVtbl->get_CachedCulture(This,retVal)
#define IUIAutomationElement3_get_CachedIsControlElement(This,retVal) (This)->lpVtbl->get_CachedIsControlElement(This,retVal)
#define IUIAutomationElement3_get_CachedIsContentElement(This,retVal) (This)->lpVtbl->get_CachedIsContentElement(This,retVal)
#define IUIAutomationElement3_get_CachedIsPassword(This,retVal) (This)->lpVtbl->get_CachedIsPassword(This,retVal)
#define IUIAutomationElement3_get_CachedNativeWindowHandle(This,retVal) (This)->lpVtbl->get_CachedNativeWindowHandle(This,retVal)
#define IUIAutomationElement3_get_CachedItemType(This,retVal) (This)->lpVtbl->get_CachedItemType(This,retVal)
#define IUIAutomationElement3_get_CachedIsOffscreen(This,retVal) (This)->lpVtbl->get_CachedIsOffscreen(This,retVal)
#define IUIAutomationElement3_get_CachedOrientation(This,retVal) (This)->lpVtbl->get_CachedOrientation(This,retVal)
#define IUIAutomationElement3_get_CachedFrameworkId(This,retVal) (This)->lpVtbl->get_CachedFrameworkId(This,retVal)
#define IUIAutomationElement3_get_CachedIsRequiredForForm(This,retVal) (This)->lpVtbl->get_CachedIsRequiredForForm(This,retVal)
#define IUIAutomationElement3_get_CachedItemStatus(This,retVal) (This)->lpVtbl->get_CachedItemStatus(This,retVal)
#define IUIAutomationElement3_get_CachedBoundingRectangle(This,retVal) (This)->lpVtbl->get_CachedBoundingRectangle(This,retVal)
#define IUIAutomationElement3_get_CachedLabeledBy(This,retVal) (This)->lpVtbl->get_CachedLabeledBy(This,retVal)
#define IUIAutomationElement3_get_CachedAriaRole(This,retVal) (This)->lpVtbl->get_CachedAriaRole(This,retVal)
#define IUIAutomationElement3_get_CachedAriaProperties(This,retVal) (This)->lpVtbl->get_CachedAriaProperties(This,retVal)
#define IUIAutomationElement3_get_CachedIsDataValidForForm(This,retVal) (This)->lpVtbl->get_CachedIsDataValidForForm(This,retVal)
#define IUIAutomationElement3_get_CachedControllerFor(This,retVal) (This)->lpVtbl->get_CachedControllerFor(This,retVal)
#define IUIAutomationElement3_get_CachedDescribedBy(This,retVal) (This)->lpVtbl->get_CachedDescribedBy(This,retVal)
#define IUIAutomationElement3_get_CachedFlowsTo(This,retVal) (This)->lpVtbl->get_CachedFlowsTo(This,retVal)
#define IUIAutomationElement3_get_CachedProviderDescription(This,retVal) (This)->lpVtbl->get_CachedProviderDescription(This,retVal)
#define IUIAutomationElement3_GetClickablePoint(This,clickable,gotClickable) (This)->lpVtbl->GetClickablePoint(This,clickable,gotClickable)
/*** IUIAutomationElement2 methods ***/
#define IUIAutomationElement3_get_CurrentOptimizeForVisualContent(This,retVal) (This)->lpVtbl->get_CurrentOptimizeForVisualContent(This,retVal)
#define IUIAutomationElement3_get_CachedOptimizeForVisualContent(This,retVal) (This)->lpVtbl->get_CachedOptimizeForVisualContent(This,retVal)
#define IUIAutomationElement3_get_CurrentLiveSetting(This,retVal) (This)->lpVtbl->get_CurrentLiveSetting(This,retVal)
#define IUIAutomationElement3_get_CachedLiveSetting(This,retVal) (This)->lpVtbl->get_CachedLiveSetting(This,retVal)
#define IUIAutomationElement3_get_CurrentFlowsFrom(This,retVal) (This)->lpVtbl->get_CurrentFlowsFrom(This,retVal)
#define IUIAutomationElement3_get_CachedFlowsFrom(This,retVal) (This)->lpVtbl->get_CachedFlowsFrom(This,retVal)
/*** IUIAutomationElement3 methods ***/
#define IUIAutomationElement3_ShowContextMenu(This) (This)->lpVtbl->ShowContextMenu(This)
#define IUIAutomationElement3_get_CurrentIsPeripheral(This,retVal) (This)->lpVtbl->get_CurrentIsPeripheral(This,retVal)
#define IUIAutomationElement3_get_CachedIsPeripheral(This,retVal) (This)->lpVtbl->get_CachedIsPeripheral(This,retVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationElement3_QueryInterface(IUIAutomationElement3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationElement3_AddRef(IUIAutomationElement3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationElement3_Release(IUIAutomationElement3* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationElement methods ***/
static __WIDL_INLINE HRESULT IUIAutomationElement3_SetFocus(IUIAutomationElement3* This) {
    return This->lpVtbl->SetFocus(This);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_GetRuntimeId(IUIAutomationElement3* This,SAFEARRAY **runtimeId) {
    return This->lpVtbl->GetRuntimeId(This,runtimeId);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_FindFirst(IUIAutomationElement3* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationElement **found) {
    return This->lpVtbl->FindFirst(This,scope,condition,found);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_FindAll(IUIAutomationElement3* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationElementArray **found) {
    return This->lpVtbl->FindAll(This,scope,condition,found);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_FindFirstBuildCache(IUIAutomationElement3* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **found) {
    return This->lpVtbl->FindFirstBuildCache(This,scope,condition,cacheRequest,found);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_FindAllBuildCache(IUIAutomationElement3* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElementArray **found) {
    return This->lpVtbl->FindAllBuildCache(This,scope,condition,cacheRequest,found);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_BuildUpdatedCache(IUIAutomationElement3* This,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **updatedElement) {
    return This->lpVtbl->BuildUpdatedCache(This,cacheRequest,updatedElement);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_GetCurrentPropertyValue(IUIAutomationElement3* This,PROPERTYID propertyId,VARIANT *retVal) {
    return This->lpVtbl->GetCurrentPropertyValue(This,propertyId,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_GetCurrentPropertyValueEx(IUIAutomationElement3* This,PROPERTYID propertyId,WINBOOL ignoreDefaultValue,VARIANT *retVal) {
    return This->lpVtbl->GetCurrentPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_GetCachedPropertyValue(IUIAutomationElement3* This,PROPERTYID propertyId,VARIANT *retVal) {
    return This->lpVtbl->GetCachedPropertyValue(This,propertyId,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_GetCachedPropertyValueEx(IUIAutomationElement3* This,PROPERTYID propertyId,WINBOOL ignoreDefaultValue,VARIANT *retVal) {
    return This->lpVtbl->GetCachedPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_GetCurrentPatternAs(IUIAutomationElement3* This,PATTERNID patternId,REFIID riid,void **patternObject) {
    return This->lpVtbl->GetCurrentPatternAs(This,patternId,riid,patternObject);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_GetCachedPatternAs(IUIAutomationElement3* This,PATTERNID patternId,REFIID riid,void **patternObject) {
    return This->lpVtbl->GetCachedPatternAs(This,patternId,riid,patternObject);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_GetCurrentPattern(IUIAutomationElement3* This,PATTERNID patternId,IUnknown **patternObject) {
    return This->lpVtbl->GetCurrentPattern(This,patternId,patternObject);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_GetCachedPattern(IUIAutomationElement3* This,PATTERNID patternId,IUnknown **patternObject) {
    return This->lpVtbl->GetCachedPattern(This,patternId,patternObject);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_GetCachedParent(IUIAutomationElement3* This,IUIAutomationElement **parent) {
    return This->lpVtbl->GetCachedParent(This,parent);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_GetCachedChildren(IUIAutomationElement3* This,IUIAutomationElementArray **children) {
    return This->lpVtbl->GetCachedChildren(This,children);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CurrentProcessId(IUIAutomationElement3* This,int *retVal) {
    return This->lpVtbl->get_CurrentProcessId(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CurrentControlType(IUIAutomationElement3* This,CONTROLTYPEID *retVal) {
    return This->lpVtbl->get_CurrentControlType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CurrentLocalizedControlType(IUIAutomationElement3* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentLocalizedControlType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CurrentName(IUIAutomationElement3* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentName(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CurrentAcceleratorKey(IUIAutomationElement3* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAcceleratorKey(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CurrentAccessKey(IUIAutomationElement3* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAccessKey(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CurrentHasKeyboardFocus(IUIAutomationElement3* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentHasKeyboardFocus(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CurrentIsKeyboardFocusable(IUIAutomationElement3* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsKeyboardFocusable(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CurrentIsEnabled(IUIAutomationElement3* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsEnabled(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CurrentAutomationId(IUIAutomationElement3* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAutomationId(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CurrentClassName(IUIAutomationElement3* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentClassName(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CurrentHelpText(IUIAutomationElement3* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentHelpText(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CurrentCulture(IUIAutomationElement3* This,int *retVal) {
    return This->lpVtbl->get_CurrentCulture(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CurrentIsControlElement(IUIAutomationElement3* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsControlElement(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CurrentIsContentElement(IUIAutomationElement3* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsContentElement(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CurrentIsPassword(IUIAutomationElement3* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsPassword(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CurrentNativeWindowHandle(IUIAutomationElement3* This,UIA_HWND *retVal) {
    return This->lpVtbl->get_CurrentNativeWindowHandle(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CurrentItemType(IUIAutomationElement3* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentItemType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CurrentIsOffscreen(IUIAutomationElement3* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsOffscreen(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CurrentOrientation(IUIAutomationElement3* This,enum OrientationType *retVal) {
    return This->lpVtbl->get_CurrentOrientation(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CurrentFrameworkId(IUIAutomationElement3* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentFrameworkId(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CurrentIsRequiredForForm(IUIAutomationElement3* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsRequiredForForm(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CurrentItemStatus(IUIAutomationElement3* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentItemStatus(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CurrentBoundingRectangle(IUIAutomationElement3* This,RECT *retVal) {
    return This->lpVtbl->get_CurrentBoundingRectangle(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CurrentLabeledBy(IUIAutomationElement3* This,IUIAutomationElement **retVal) {
    return This->lpVtbl->get_CurrentLabeledBy(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CurrentAriaRole(IUIAutomationElement3* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAriaRole(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CurrentAriaProperties(IUIAutomationElement3* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAriaProperties(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CurrentIsDataValidForForm(IUIAutomationElement3* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsDataValidForForm(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CurrentControllerFor(IUIAutomationElement3* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentControllerFor(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CurrentDescribedBy(IUIAutomationElement3* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentDescribedBy(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CurrentFlowsTo(IUIAutomationElement3* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentFlowsTo(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CurrentProviderDescription(IUIAutomationElement3* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentProviderDescription(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CachedProcessId(IUIAutomationElement3* This,int *retVal) {
    return This->lpVtbl->get_CachedProcessId(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CachedControlType(IUIAutomationElement3* This,CONTROLTYPEID *retVal) {
    return This->lpVtbl->get_CachedControlType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CachedLocalizedControlType(IUIAutomationElement3* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedLocalizedControlType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CachedName(IUIAutomationElement3* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedName(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CachedAcceleratorKey(IUIAutomationElement3* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAcceleratorKey(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CachedAccessKey(IUIAutomationElement3* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAccessKey(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CachedHasKeyboardFocus(IUIAutomationElement3* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedHasKeyboardFocus(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CachedIsKeyboardFocusable(IUIAutomationElement3* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsKeyboardFocusable(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CachedIsEnabled(IUIAutomationElement3* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsEnabled(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CachedAutomationId(IUIAutomationElement3* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAutomationId(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CachedClassName(IUIAutomationElement3* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedClassName(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CachedHelpText(IUIAutomationElement3* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedHelpText(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CachedCulture(IUIAutomationElement3* This,int *retVal) {
    return This->lpVtbl->get_CachedCulture(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CachedIsControlElement(IUIAutomationElement3* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsControlElement(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CachedIsContentElement(IUIAutomationElement3* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsContentElement(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CachedIsPassword(IUIAutomationElement3* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsPassword(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CachedNativeWindowHandle(IUIAutomationElement3* This,UIA_HWND *retVal) {
    return This->lpVtbl->get_CachedNativeWindowHandle(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CachedItemType(IUIAutomationElement3* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedItemType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CachedIsOffscreen(IUIAutomationElement3* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsOffscreen(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CachedOrientation(IUIAutomationElement3* This,enum OrientationType *retVal) {
    return This->lpVtbl->get_CachedOrientation(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CachedFrameworkId(IUIAutomationElement3* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedFrameworkId(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CachedIsRequiredForForm(IUIAutomationElement3* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsRequiredForForm(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CachedItemStatus(IUIAutomationElement3* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedItemStatus(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CachedBoundingRectangle(IUIAutomationElement3* This,RECT *retVal) {
    return This->lpVtbl->get_CachedBoundingRectangle(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CachedLabeledBy(IUIAutomationElement3* This,IUIAutomationElement **retVal) {
    return This->lpVtbl->get_CachedLabeledBy(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CachedAriaRole(IUIAutomationElement3* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAriaRole(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CachedAriaProperties(IUIAutomationElement3* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAriaProperties(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CachedIsDataValidForForm(IUIAutomationElement3* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsDataValidForForm(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CachedControllerFor(IUIAutomationElement3* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedControllerFor(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CachedDescribedBy(IUIAutomationElement3* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedDescribedBy(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CachedFlowsTo(IUIAutomationElement3* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedFlowsTo(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CachedProviderDescription(IUIAutomationElement3* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedProviderDescription(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_GetClickablePoint(IUIAutomationElement3* This,POINT *clickable,WINBOOL *gotClickable) {
    return This->lpVtbl->GetClickablePoint(This,clickable,gotClickable);
}
/*** IUIAutomationElement2 methods ***/
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CurrentOptimizeForVisualContent(IUIAutomationElement3* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentOptimizeForVisualContent(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CachedOptimizeForVisualContent(IUIAutomationElement3* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedOptimizeForVisualContent(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CurrentLiveSetting(IUIAutomationElement3* This,enum LiveSetting *retVal) {
    return This->lpVtbl->get_CurrentLiveSetting(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CachedLiveSetting(IUIAutomationElement3* This,enum LiveSetting *retVal) {
    return This->lpVtbl->get_CachedLiveSetting(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CurrentFlowsFrom(IUIAutomationElement3* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentFlowsFrom(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CachedFlowsFrom(IUIAutomationElement3* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedFlowsFrom(This,retVal);
}
/*** IUIAutomationElement3 methods ***/
static __WIDL_INLINE HRESULT IUIAutomationElement3_ShowContextMenu(IUIAutomationElement3* This) {
    return This->lpVtbl->ShowContextMenu(This);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CurrentIsPeripheral(IUIAutomationElement3* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsPeripheral(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement3_get_CachedIsPeripheral(IUIAutomationElement3* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsPeripheral(This,retVal);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationElement3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationElement4 interface
 */
#ifndef __IUIAutomationElement4_INTERFACE_DEFINED__
#define __IUIAutomationElement4_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationElement4, 0x3b6e233c, 0x52fb, 0x4063, 0xa4,0xc9, 0x77,0xc0,0x75,0xc2,0xa0,0x6b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3b6e233c-52fb-4063-a4c9-77c075c2a06b")
IUIAutomationElement4 : public IUIAutomationElement3
{
    virtual HRESULT STDMETHODCALLTYPE get_CurrentPositionInSet(
        int *retVal) = 0;

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

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

    virtual HRESULT STDMETHODCALLTYPE get_CurrentAnnotationTypes(
        SAFEARRAY **retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CurrentAnnotationObjects(
        IUIAutomationElementArray **retVal) = 0;

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

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

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

    virtual HRESULT STDMETHODCALLTYPE get_CachedAnnotationTypes(
        SAFEARRAY **retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CachedAnnotationObjects(
        IUIAutomationElementArray **retVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationElement4, 0x3b6e233c, 0x52fb, 0x4063, 0xa4,0xc9, 0x77,0xc0,0x75,0xc2,0xa0,0x6b)
#endif
#else
typedef struct IUIAutomationElement4Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomationElement methods ***/
    HRESULT (STDMETHODCALLTYPE *SetFocus)(
        IUIAutomationElement4 *This);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeId)(
        IUIAutomationElement4 *This,
        SAFEARRAY **runtimeId);

    HRESULT (STDMETHODCALLTYPE *FindFirst)(
        IUIAutomationElement4 *This,
        enum TreeScope scope,
        IUIAutomationCondition *condition,
        IUIAutomationElement **found);

    HRESULT (STDMETHODCALLTYPE *FindAll)(
        IUIAutomationElement4 *This,
        enum TreeScope scope,
        IUIAutomationCondition *condition,
        IUIAutomationElementArray **found);

    HRESULT (STDMETHODCALLTYPE *FindFirstBuildCache)(
        IUIAutomationElement4 *This,
        enum TreeScope scope,
        IUIAutomationCondition *condition,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **found);

    HRESULT (STDMETHODCALLTYPE *FindAllBuildCache)(
        IUIAutomationElement4 *This,
        enum TreeScope scope,
        IUIAutomationCondition *condition,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElementArray **found);

    HRESULT (STDMETHODCALLTYPE *BuildUpdatedCache)(
        IUIAutomationElement4 *This,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **updatedElement);

    HRESULT (STDMETHODCALLTYPE *GetCurrentPropertyValue)(
        IUIAutomationElement4 *This,
        PROPERTYID propertyId,
        VARIANT *retVal);

    HRESULT (STDMETHODCALLTYPE *GetCurrentPropertyValueEx)(
        IUIAutomationElement4 *This,
        PROPERTYID propertyId,
        WINBOOL ignoreDefaultValue,
        VARIANT *retVal);

    HRESULT (STDMETHODCALLTYPE *GetCachedPropertyValue)(
        IUIAutomationElement4 *This,
        PROPERTYID propertyId,
        VARIANT *retVal);

    HRESULT (STDMETHODCALLTYPE *GetCachedPropertyValueEx)(
        IUIAutomationElement4 *This,
        PROPERTYID propertyId,
        WINBOOL ignoreDefaultValue,
        VARIANT *retVal);

    HRESULT (STDMETHODCALLTYPE *GetCurrentPatternAs)(
        IUIAutomationElement4 *This,
        PATTERNID patternId,
        REFIID riid,
        void **patternObject);

    HRESULT (STDMETHODCALLTYPE *GetCachedPatternAs)(
        IUIAutomationElement4 *This,
        PATTERNID patternId,
        REFIID riid,
        void **patternObject);

    HRESULT (STDMETHODCALLTYPE *GetCurrentPattern)(
        IUIAutomationElement4 *This,
        PATTERNID patternId,
        IUnknown **patternObject);

    HRESULT (STDMETHODCALLTYPE *GetCachedPattern)(
        IUIAutomationElement4 *This,
        PATTERNID patternId,
        IUnknown **patternObject);

    HRESULT (STDMETHODCALLTYPE *GetCachedParent)(
        IUIAutomationElement4 *This,
        IUIAutomationElement **parent);

    HRESULT (STDMETHODCALLTYPE *GetCachedChildren)(
        IUIAutomationElement4 *This,
        IUIAutomationElementArray **children);

    HRESULT (STDMETHODCALLTYPE *get_CurrentProcessId)(
        IUIAutomationElement4 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentControlType)(
        IUIAutomationElement4 *This,
        CONTROLTYPEID *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentLocalizedControlType)(
        IUIAutomationElement4 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentName)(
        IUIAutomationElement4 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAcceleratorKey)(
        IUIAutomationElement4 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAccessKey)(
        IUIAutomationElement4 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentHasKeyboardFocus)(
        IUIAutomationElement4 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsKeyboardFocusable)(
        IUIAutomationElement4 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsEnabled)(
        IUIAutomationElement4 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAutomationId)(
        IUIAutomationElement4 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentClassName)(
        IUIAutomationElement4 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentHelpText)(
        IUIAutomationElement4 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentCulture)(
        IUIAutomationElement4 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsControlElement)(
        IUIAutomationElement4 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsContentElement)(
        IUIAutomationElement4 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsPassword)(
        IUIAutomationElement4 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentNativeWindowHandle)(
        IUIAutomationElement4 *This,
        UIA_HWND *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentItemType)(
        IUIAutomationElement4 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsOffscreen)(
        IUIAutomationElement4 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentOrientation)(
        IUIAutomationElement4 *This,
        enum OrientationType *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentFrameworkId)(
        IUIAutomationElement4 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsRequiredForForm)(
        IUIAutomationElement4 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentItemStatus)(
        IUIAutomationElement4 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentBoundingRectangle)(
        IUIAutomationElement4 *This,
        RECT *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentLabeledBy)(
        IUIAutomationElement4 *This,
        IUIAutomationElement **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAriaRole)(
        IUIAutomationElement4 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAriaProperties)(
        IUIAutomationElement4 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsDataValidForForm)(
        IUIAutomationElement4 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentControllerFor)(
        IUIAutomationElement4 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentDescribedBy)(
        IUIAutomationElement4 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentFlowsTo)(
        IUIAutomationElement4 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentProviderDescription)(
        IUIAutomationElement4 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedProcessId)(
        IUIAutomationElement4 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedControlType)(
        IUIAutomationElement4 *This,
        CONTROLTYPEID *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedLocalizedControlType)(
        IUIAutomationElement4 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedName)(
        IUIAutomationElement4 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAcceleratorKey)(
        IUIAutomationElement4 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAccessKey)(
        IUIAutomationElement4 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedHasKeyboardFocus)(
        IUIAutomationElement4 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsKeyboardFocusable)(
        IUIAutomationElement4 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsEnabled)(
        IUIAutomationElement4 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAutomationId)(
        IUIAutomationElement4 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedClassName)(
        IUIAutomationElement4 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedHelpText)(
        IUIAutomationElement4 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedCulture)(
        IUIAutomationElement4 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsControlElement)(
        IUIAutomationElement4 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsContentElement)(
        IUIAutomationElement4 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsPassword)(
        IUIAutomationElement4 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedNativeWindowHandle)(
        IUIAutomationElement4 *This,
        UIA_HWND *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedItemType)(
        IUIAutomationElement4 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsOffscreen)(
        IUIAutomationElement4 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedOrientation)(
        IUIAutomationElement4 *This,
        enum OrientationType *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedFrameworkId)(
        IUIAutomationElement4 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsRequiredForForm)(
        IUIAutomationElement4 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedItemStatus)(
        IUIAutomationElement4 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedBoundingRectangle)(
        IUIAutomationElement4 *This,
        RECT *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedLabeledBy)(
        IUIAutomationElement4 *This,
        IUIAutomationElement **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAriaRole)(
        IUIAutomationElement4 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAriaProperties)(
        IUIAutomationElement4 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsDataValidForForm)(
        IUIAutomationElement4 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedControllerFor)(
        IUIAutomationElement4 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedDescribedBy)(
        IUIAutomationElement4 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedFlowsTo)(
        IUIAutomationElement4 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedProviderDescription)(
        IUIAutomationElement4 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *GetClickablePoint)(
        IUIAutomationElement4 *This,
        POINT *clickable,
        WINBOOL *gotClickable);

    /*** IUIAutomationElement2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CurrentOptimizeForVisualContent)(
        IUIAutomationElement4 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedOptimizeForVisualContent)(
        IUIAutomationElement4 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentLiveSetting)(
        IUIAutomationElement4 *This,
        enum LiveSetting *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedLiveSetting)(
        IUIAutomationElement4 *This,
        enum LiveSetting *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentFlowsFrom)(
        IUIAutomationElement4 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedFlowsFrom)(
        IUIAutomationElement4 *This,
        IUIAutomationElementArray **retVal);

    /*** IUIAutomationElement3 methods ***/
    HRESULT (STDMETHODCALLTYPE *ShowContextMenu)(
        IUIAutomationElement4 *This);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsPeripheral)(
        IUIAutomationElement4 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsPeripheral)(
        IUIAutomationElement4 *This,
        WINBOOL *retVal);

    /*** IUIAutomationElement4 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CurrentPositionInSet)(
        IUIAutomationElement4 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentSizeOfSet)(
        IUIAutomationElement4 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentLevel)(
        IUIAutomationElement4 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAnnotationTypes)(
        IUIAutomationElement4 *This,
        SAFEARRAY **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAnnotationObjects)(
        IUIAutomationElement4 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedPositionInSet)(
        IUIAutomationElement4 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedSizeOfSet)(
        IUIAutomationElement4 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedLevel)(
        IUIAutomationElement4 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAnnotationTypes)(
        IUIAutomationElement4 *This,
        SAFEARRAY **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAnnotationObjects)(
        IUIAutomationElement4 *This,
        IUIAutomationElementArray **retVal);

    END_INTERFACE
} IUIAutomationElement4Vtbl;

interface IUIAutomationElement4 {
    CONST_VTBL IUIAutomationElement4Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationElement4_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationElement4_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationElement4_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationElement methods ***/
#define IUIAutomationElement4_SetFocus(This) (This)->lpVtbl->SetFocus(This)
#define IUIAutomationElement4_GetRuntimeId(This,runtimeId) (This)->lpVtbl->GetRuntimeId(This,runtimeId)
#define IUIAutomationElement4_FindFirst(This,scope,condition,found) (This)->lpVtbl->FindFirst(This,scope,condition,found)
#define IUIAutomationElement4_FindAll(This,scope,condition,found) (This)->lpVtbl->FindAll(This,scope,condition,found)
#define IUIAutomationElement4_FindFirstBuildCache(This,scope,condition,cacheRequest,found) (This)->lpVtbl->FindFirstBuildCache(This,scope,condition,cacheRequest,found)
#define IUIAutomationElement4_FindAllBuildCache(This,scope,condition,cacheRequest,found) (This)->lpVtbl->FindAllBuildCache(This,scope,condition,cacheRequest,found)
#define IUIAutomationElement4_BuildUpdatedCache(This,cacheRequest,updatedElement) (This)->lpVtbl->BuildUpdatedCache(This,cacheRequest,updatedElement)
#define IUIAutomationElement4_GetCurrentPropertyValue(This,propertyId,retVal) (This)->lpVtbl->GetCurrentPropertyValue(This,propertyId,retVal)
#define IUIAutomationElement4_GetCurrentPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal) (This)->lpVtbl->GetCurrentPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal)
#define IUIAutomationElement4_GetCachedPropertyValue(This,propertyId,retVal) (This)->lpVtbl->GetCachedPropertyValue(This,propertyId,retVal)
#define IUIAutomationElement4_GetCachedPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal) (This)->lpVtbl->GetCachedPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal)
#define IUIAutomationElement4_GetCurrentPatternAs(This,patternId,riid,patternObject) (This)->lpVtbl->GetCurrentPatternAs(This,patternId,riid,patternObject)
#define IUIAutomationElement4_GetCachedPatternAs(This,patternId,riid,patternObject) (This)->lpVtbl->GetCachedPatternAs(This,patternId,riid,patternObject)
#define IUIAutomationElement4_GetCurrentPattern(This,patternId,patternObject) (This)->lpVtbl->GetCurrentPattern(This,patternId,patternObject)
#define IUIAutomationElement4_GetCachedPattern(This,patternId,patternObject) (This)->lpVtbl->GetCachedPattern(This,patternId,patternObject)
#define IUIAutomationElement4_GetCachedParent(This,parent) (This)->lpVtbl->GetCachedParent(This,parent)
#define IUIAutomationElement4_GetCachedChildren(This,children) (This)->lpVtbl->GetCachedChildren(This,children)
#define IUIAutomationElement4_get_CurrentProcessId(This,retVal) (This)->lpVtbl->get_CurrentProcessId(This,retVal)
#define IUIAutomationElement4_get_CurrentControlType(This,retVal) (This)->lpVtbl->get_CurrentControlType(This,retVal)
#define IUIAutomationElement4_get_CurrentLocalizedControlType(This,retVal) (This)->lpVtbl->get_CurrentLocalizedControlType(This,retVal)
#define IUIAutomationElement4_get_CurrentName(This,retVal) (This)->lpVtbl->get_CurrentName(This,retVal)
#define IUIAutomationElement4_get_CurrentAcceleratorKey(This,retVal) (This)->lpVtbl->get_CurrentAcceleratorKey(This,retVal)
#define IUIAutomationElement4_get_CurrentAccessKey(This,retVal) (This)->lpVtbl->get_CurrentAccessKey(This,retVal)
#define IUIAutomationElement4_get_CurrentHasKeyboardFocus(This,retVal) (This)->lpVtbl->get_CurrentHasKeyboardFocus(This,retVal)
#define IUIAutomationElement4_get_CurrentIsKeyboardFocusable(This,retVal) (This)->lpVtbl->get_CurrentIsKeyboardFocusable(This,retVal)
#define IUIAutomationElement4_get_CurrentIsEnabled(This,retVal) (This)->lpVtbl->get_CurrentIsEnabled(This,retVal)
#define IUIAutomationElement4_get_CurrentAutomationId(This,retVal) (This)->lpVtbl->get_CurrentAutomationId(This,retVal)
#define IUIAutomationElement4_get_CurrentClassName(This,retVal) (This)->lpVtbl->get_CurrentClassName(This,retVal)
#define IUIAutomationElement4_get_CurrentHelpText(This,retVal) (This)->lpVtbl->get_CurrentHelpText(This,retVal)
#define IUIAutomationElement4_get_CurrentCulture(This,retVal) (This)->lpVtbl->get_CurrentCulture(This,retVal)
#define IUIAutomationElement4_get_CurrentIsControlElement(This,retVal) (This)->lpVtbl->get_CurrentIsControlElement(This,retVal)
#define IUIAutomationElement4_get_CurrentIsContentElement(This,retVal) (This)->lpVtbl->get_CurrentIsContentElement(This,retVal)
#define IUIAutomationElement4_get_CurrentIsPassword(This,retVal) (This)->lpVtbl->get_CurrentIsPassword(This,retVal)
#define IUIAutomationElement4_get_CurrentNativeWindowHandle(This,retVal) (This)->lpVtbl->get_CurrentNativeWindowHandle(This,retVal)
#define IUIAutomationElement4_get_CurrentItemType(This,retVal) (This)->lpVtbl->get_CurrentItemType(This,retVal)
#define IUIAutomationElement4_get_CurrentIsOffscreen(This,retVal) (This)->lpVtbl->get_CurrentIsOffscreen(This,retVal)
#define IUIAutomationElement4_get_CurrentOrientation(This,retVal) (This)->lpVtbl->get_CurrentOrientation(This,retVal)
#define IUIAutomationElement4_get_CurrentFrameworkId(This,retVal) (This)->lpVtbl->get_CurrentFrameworkId(This,retVal)
#define IUIAutomationElement4_get_CurrentIsRequiredForForm(This,retVal) (This)->lpVtbl->get_CurrentIsRequiredForForm(This,retVal)
#define IUIAutomationElement4_get_CurrentItemStatus(This,retVal) (This)->lpVtbl->get_CurrentItemStatus(This,retVal)
#define IUIAutomationElement4_get_CurrentBoundingRectangle(This,retVal) (This)->lpVtbl->get_CurrentBoundingRectangle(This,retVal)
#define IUIAutomationElement4_get_CurrentLabeledBy(This,retVal) (This)->lpVtbl->get_CurrentLabeledBy(This,retVal)
#define IUIAutomationElement4_get_CurrentAriaRole(This,retVal) (This)->lpVtbl->get_CurrentAriaRole(This,retVal)
#define IUIAutomationElement4_get_CurrentAriaProperties(This,retVal) (This)->lpVtbl->get_CurrentAriaProperties(This,retVal)
#define IUIAutomationElement4_get_CurrentIsDataValidForForm(This,retVal) (This)->lpVtbl->get_CurrentIsDataValidForForm(This,retVal)
#define IUIAutomationElement4_get_CurrentControllerFor(This,retVal) (This)->lpVtbl->get_CurrentControllerFor(This,retVal)
#define IUIAutomationElement4_get_CurrentDescribedBy(This,retVal) (This)->lpVtbl->get_CurrentDescribedBy(This,retVal)
#define IUIAutomationElement4_get_CurrentFlowsTo(This,retVal) (This)->lpVtbl->get_CurrentFlowsTo(This,retVal)
#define IUIAutomationElement4_get_CurrentProviderDescription(This,retVal) (This)->lpVtbl->get_CurrentProviderDescription(This,retVal)
#define IUIAutomationElement4_get_CachedProcessId(This,retVal) (This)->lpVtbl->get_CachedProcessId(This,retVal)
#define IUIAutomationElement4_get_CachedControlType(This,retVal) (This)->lpVtbl->get_CachedControlType(This,retVal)
#define IUIAutomationElement4_get_CachedLocalizedControlType(This,retVal) (This)->lpVtbl->get_CachedLocalizedControlType(This,retVal)
#define IUIAutomationElement4_get_CachedName(This,retVal) (This)->lpVtbl->get_CachedName(This,retVal)
#define IUIAutomationElement4_get_CachedAcceleratorKey(This,retVal) (This)->lpVtbl->get_CachedAcceleratorKey(This,retVal)
#define IUIAutomationElement4_get_CachedAccessKey(This,retVal) (This)->lpVtbl->get_CachedAccessKey(This,retVal)
#define IUIAutomationElement4_get_CachedHasKeyboardFocus(This,retVal) (This)->lpVtbl->get_CachedHasKeyboardFocus(This,retVal)
#define IUIAutomationElement4_get_CachedIsKeyboardFocusable(This,retVal) (This)->lpVtbl->get_CachedIsKeyboardFocusable(This,retVal)
#define IUIAutomationElement4_get_CachedIsEnabled(This,retVal) (This)->lpVtbl->get_CachedIsEnabled(This,retVal)
#define IUIAutomationElement4_get_CachedAutomationId(This,retVal) (This)->lpVtbl->get_CachedAutomationId(This,retVal)
#define IUIAutomationElement4_get_CachedClassName(This,retVal) (This)->lpVtbl->get_CachedClassName(This,retVal)
#define IUIAutomationElement4_get_CachedHelpText(This,retVal) (This)->lpVtbl->get_CachedHelpText(This,retVal)
#define IUIAutomationElement4_get_CachedCulture(This,retVal) (This)->lpVtbl->get_CachedCulture(This,retVal)
#define IUIAutomationElement4_get_CachedIsControlElement(This,retVal) (This)->lpVtbl->get_CachedIsControlElement(This,retVal)
#define IUIAutomationElement4_get_CachedIsContentElement(This,retVal) (This)->lpVtbl->get_CachedIsContentElement(This,retVal)
#define IUIAutomationElement4_get_CachedIsPassword(This,retVal) (This)->lpVtbl->get_CachedIsPassword(This,retVal)
#define IUIAutomationElement4_get_CachedNativeWindowHandle(This,retVal) (This)->lpVtbl->get_CachedNativeWindowHandle(This,retVal)
#define IUIAutomationElement4_get_CachedItemType(This,retVal) (This)->lpVtbl->get_CachedItemType(This,retVal)
#define IUIAutomationElement4_get_CachedIsOffscreen(This,retVal) (This)->lpVtbl->get_CachedIsOffscreen(This,retVal)
#define IUIAutomationElement4_get_CachedOrientation(This,retVal) (This)->lpVtbl->get_CachedOrientation(This,retVal)
#define IUIAutomationElement4_get_CachedFrameworkId(This,retVal) (This)->lpVtbl->get_CachedFrameworkId(This,retVal)
#define IUIAutomationElement4_get_CachedIsRequiredForForm(This,retVal) (This)->lpVtbl->get_CachedIsRequiredForForm(This,retVal)
#define IUIAutomationElement4_get_CachedItemStatus(This,retVal) (This)->lpVtbl->get_CachedItemStatus(This,retVal)
#define IUIAutomationElement4_get_CachedBoundingRectangle(This,retVal) (This)->lpVtbl->get_CachedBoundingRectangle(This,retVal)
#define IUIAutomationElement4_get_CachedLabeledBy(This,retVal) (This)->lpVtbl->get_CachedLabeledBy(This,retVal)
#define IUIAutomationElement4_get_CachedAriaRole(This,retVal) (This)->lpVtbl->get_CachedAriaRole(This,retVal)
#define IUIAutomationElement4_get_CachedAriaProperties(This,retVal) (This)->lpVtbl->get_CachedAriaProperties(This,retVal)
#define IUIAutomationElement4_get_CachedIsDataValidForForm(This,retVal) (This)->lpVtbl->get_CachedIsDataValidForForm(This,retVal)
#define IUIAutomationElement4_get_CachedControllerFor(This,retVal) (This)->lpVtbl->get_CachedControllerFor(This,retVal)
#define IUIAutomationElement4_get_CachedDescribedBy(This,retVal) (This)->lpVtbl->get_CachedDescribedBy(This,retVal)
#define IUIAutomationElement4_get_CachedFlowsTo(This,retVal) (This)->lpVtbl->get_CachedFlowsTo(This,retVal)
#define IUIAutomationElement4_get_CachedProviderDescription(This,retVal) (This)->lpVtbl->get_CachedProviderDescription(This,retVal)
#define IUIAutomationElement4_GetClickablePoint(This,clickable,gotClickable) (This)->lpVtbl->GetClickablePoint(This,clickable,gotClickable)
/*** IUIAutomationElement2 methods ***/
#define IUIAutomationElement4_get_CurrentOptimizeForVisualContent(This,retVal) (This)->lpVtbl->get_CurrentOptimizeForVisualContent(This,retVal)
#define IUIAutomationElement4_get_CachedOptimizeForVisualContent(This,retVal) (This)->lpVtbl->get_CachedOptimizeForVisualContent(This,retVal)
#define IUIAutomationElement4_get_CurrentLiveSetting(This,retVal) (This)->lpVtbl->get_CurrentLiveSetting(This,retVal)
#define IUIAutomationElement4_get_CachedLiveSetting(This,retVal) (This)->lpVtbl->get_CachedLiveSetting(This,retVal)
#define IUIAutomationElement4_get_CurrentFlowsFrom(This,retVal) (This)->lpVtbl->get_CurrentFlowsFrom(This,retVal)
#define IUIAutomationElement4_get_CachedFlowsFrom(This,retVal) (This)->lpVtbl->get_CachedFlowsFrom(This,retVal)
/*** IUIAutomationElement3 methods ***/
#define IUIAutomationElement4_ShowContextMenu(This) (This)->lpVtbl->ShowContextMenu(This)
#define IUIAutomationElement4_get_CurrentIsPeripheral(This,retVal) (This)->lpVtbl->get_CurrentIsPeripheral(This,retVal)
#define IUIAutomationElement4_get_CachedIsPeripheral(This,retVal) (This)->lpVtbl->get_CachedIsPeripheral(This,retVal)
/*** IUIAutomationElement4 methods ***/
#define IUIAutomationElement4_get_CurrentPositionInSet(This,retVal) (This)->lpVtbl->get_CurrentPositionInSet(This,retVal)
#define IUIAutomationElement4_get_CurrentSizeOfSet(This,retVal) (This)->lpVtbl->get_CurrentSizeOfSet(This,retVal)
#define IUIAutomationElement4_get_CurrentLevel(This,retVal) (This)->lpVtbl->get_CurrentLevel(This,retVal)
#define IUIAutomationElement4_get_CurrentAnnotationTypes(This,retVal) (This)->lpVtbl->get_CurrentAnnotationTypes(This,retVal)
#define IUIAutomationElement4_get_CurrentAnnotationObjects(This,retVal) (This)->lpVtbl->get_CurrentAnnotationObjects(This,retVal)
#define IUIAutomationElement4_get_CachedPositionInSet(This,retVal) (This)->lpVtbl->get_CachedPositionInSet(This,retVal)
#define IUIAutomationElement4_get_CachedSizeOfSet(This,retVal) (This)->lpVtbl->get_CachedSizeOfSet(This,retVal)
#define IUIAutomationElement4_get_CachedLevel(This,retVal) (This)->lpVtbl->get_CachedLevel(This,retVal)
#define IUIAutomationElement4_get_CachedAnnotationTypes(This,retVal) (This)->lpVtbl->get_CachedAnnotationTypes(This,retVal)
#define IUIAutomationElement4_get_CachedAnnotationObjects(This,retVal) (This)->lpVtbl->get_CachedAnnotationObjects(This,retVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationElement4_QueryInterface(IUIAutomationElement4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationElement4_AddRef(IUIAutomationElement4* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationElement4_Release(IUIAutomationElement4* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationElement methods ***/
static __WIDL_INLINE HRESULT IUIAutomationElement4_SetFocus(IUIAutomationElement4* This) {
    return This->lpVtbl->SetFocus(This);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_GetRuntimeId(IUIAutomationElement4* This,SAFEARRAY **runtimeId) {
    return This->lpVtbl->GetRuntimeId(This,runtimeId);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_FindFirst(IUIAutomationElement4* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationElement **found) {
    return This->lpVtbl->FindFirst(This,scope,condition,found);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_FindAll(IUIAutomationElement4* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationElementArray **found) {
    return This->lpVtbl->FindAll(This,scope,condition,found);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_FindFirstBuildCache(IUIAutomationElement4* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **found) {
    return This->lpVtbl->FindFirstBuildCache(This,scope,condition,cacheRequest,found);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_FindAllBuildCache(IUIAutomationElement4* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElementArray **found) {
    return This->lpVtbl->FindAllBuildCache(This,scope,condition,cacheRequest,found);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_BuildUpdatedCache(IUIAutomationElement4* This,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **updatedElement) {
    return This->lpVtbl->BuildUpdatedCache(This,cacheRequest,updatedElement);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_GetCurrentPropertyValue(IUIAutomationElement4* This,PROPERTYID propertyId,VARIANT *retVal) {
    return This->lpVtbl->GetCurrentPropertyValue(This,propertyId,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_GetCurrentPropertyValueEx(IUIAutomationElement4* This,PROPERTYID propertyId,WINBOOL ignoreDefaultValue,VARIANT *retVal) {
    return This->lpVtbl->GetCurrentPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_GetCachedPropertyValue(IUIAutomationElement4* This,PROPERTYID propertyId,VARIANT *retVal) {
    return This->lpVtbl->GetCachedPropertyValue(This,propertyId,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_GetCachedPropertyValueEx(IUIAutomationElement4* This,PROPERTYID propertyId,WINBOOL ignoreDefaultValue,VARIANT *retVal) {
    return This->lpVtbl->GetCachedPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_GetCurrentPatternAs(IUIAutomationElement4* This,PATTERNID patternId,REFIID riid,void **patternObject) {
    return This->lpVtbl->GetCurrentPatternAs(This,patternId,riid,patternObject);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_GetCachedPatternAs(IUIAutomationElement4* This,PATTERNID patternId,REFIID riid,void **patternObject) {
    return This->lpVtbl->GetCachedPatternAs(This,patternId,riid,patternObject);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_GetCurrentPattern(IUIAutomationElement4* This,PATTERNID patternId,IUnknown **patternObject) {
    return This->lpVtbl->GetCurrentPattern(This,patternId,patternObject);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_GetCachedPattern(IUIAutomationElement4* This,PATTERNID patternId,IUnknown **patternObject) {
    return This->lpVtbl->GetCachedPattern(This,patternId,patternObject);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_GetCachedParent(IUIAutomationElement4* This,IUIAutomationElement **parent) {
    return This->lpVtbl->GetCachedParent(This,parent);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_GetCachedChildren(IUIAutomationElement4* This,IUIAutomationElementArray **children) {
    return This->lpVtbl->GetCachedChildren(This,children);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CurrentProcessId(IUIAutomationElement4* This,int *retVal) {
    return This->lpVtbl->get_CurrentProcessId(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CurrentControlType(IUIAutomationElement4* This,CONTROLTYPEID *retVal) {
    return This->lpVtbl->get_CurrentControlType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CurrentLocalizedControlType(IUIAutomationElement4* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentLocalizedControlType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CurrentName(IUIAutomationElement4* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentName(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CurrentAcceleratorKey(IUIAutomationElement4* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAcceleratorKey(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CurrentAccessKey(IUIAutomationElement4* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAccessKey(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CurrentHasKeyboardFocus(IUIAutomationElement4* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentHasKeyboardFocus(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CurrentIsKeyboardFocusable(IUIAutomationElement4* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsKeyboardFocusable(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CurrentIsEnabled(IUIAutomationElement4* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsEnabled(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CurrentAutomationId(IUIAutomationElement4* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAutomationId(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CurrentClassName(IUIAutomationElement4* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentClassName(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CurrentHelpText(IUIAutomationElement4* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentHelpText(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CurrentCulture(IUIAutomationElement4* This,int *retVal) {
    return This->lpVtbl->get_CurrentCulture(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CurrentIsControlElement(IUIAutomationElement4* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsControlElement(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CurrentIsContentElement(IUIAutomationElement4* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsContentElement(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CurrentIsPassword(IUIAutomationElement4* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsPassword(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CurrentNativeWindowHandle(IUIAutomationElement4* This,UIA_HWND *retVal) {
    return This->lpVtbl->get_CurrentNativeWindowHandle(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CurrentItemType(IUIAutomationElement4* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentItemType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CurrentIsOffscreen(IUIAutomationElement4* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsOffscreen(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CurrentOrientation(IUIAutomationElement4* This,enum OrientationType *retVal) {
    return This->lpVtbl->get_CurrentOrientation(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CurrentFrameworkId(IUIAutomationElement4* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentFrameworkId(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CurrentIsRequiredForForm(IUIAutomationElement4* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsRequiredForForm(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CurrentItemStatus(IUIAutomationElement4* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentItemStatus(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CurrentBoundingRectangle(IUIAutomationElement4* This,RECT *retVal) {
    return This->lpVtbl->get_CurrentBoundingRectangle(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CurrentLabeledBy(IUIAutomationElement4* This,IUIAutomationElement **retVal) {
    return This->lpVtbl->get_CurrentLabeledBy(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CurrentAriaRole(IUIAutomationElement4* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAriaRole(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CurrentAriaProperties(IUIAutomationElement4* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAriaProperties(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CurrentIsDataValidForForm(IUIAutomationElement4* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsDataValidForForm(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CurrentControllerFor(IUIAutomationElement4* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentControllerFor(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CurrentDescribedBy(IUIAutomationElement4* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentDescribedBy(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CurrentFlowsTo(IUIAutomationElement4* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentFlowsTo(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CurrentProviderDescription(IUIAutomationElement4* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentProviderDescription(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CachedProcessId(IUIAutomationElement4* This,int *retVal) {
    return This->lpVtbl->get_CachedProcessId(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CachedControlType(IUIAutomationElement4* This,CONTROLTYPEID *retVal) {
    return This->lpVtbl->get_CachedControlType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CachedLocalizedControlType(IUIAutomationElement4* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedLocalizedControlType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CachedName(IUIAutomationElement4* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedName(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CachedAcceleratorKey(IUIAutomationElement4* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAcceleratorKey(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CachedAccessKey(IUIAutomationElement4* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAccessKey(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CachedHasKeyboardFocus(IUIAutomationElement4* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedHasKeyboardFocus(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CachedIsKeyboardFocusable(IUIAutomationElement4* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsKeyboardFocusable(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CachedIsEnabled(IUIAutomationElement4* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsEnabled(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CachedAutomationId(IUIAutomationElement4* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAutomationId(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CachedClassName(IUIAutomationElement4* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedClassName(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CachedHelpText(IUIAutomationElement4* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedHelpText(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CachedCulture(IUIAutomationElement4* This,int *retVal) {
    return This->lpVtbl->get_CachedCulture(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CachedIsControlElement(IUIAutomationElement4* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsControlElement(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CachedIsContentElement(IUIAutomationElement4* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsContentElement(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CachedIsPassword(IUIAutomationElement4* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsPassword(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CachedNativeWindowHandle(IUIAutomationElement4* This,UIA_HWND *retVal) {
    return This->lpVtbl->get_CachedNativeWindowHandle(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CachedItemType(IUIAutomationElement4* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedItemType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CachedIsOffscreen(IUIAutomationElement4* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsOffscreen(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CachedOrientation(IUIAutomationElement4* This,enum OrientationType *retVal) {
    return This->lpVtbl->get_CachedOrientation(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CachedFrameworkId(IUIAutomationElement4* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedFrameworkId(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CachedIsRequiredForForm(IUIAutomationElement4* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsRequiredForForm(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CachedItemStatus(IUIAutomationElement4* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedItemStatus(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CachedBoundingRectangle(IUIAutomationElement4* This,RECT *retVal) {
    return This->lpVtbl->get_CachedBoundingRectangle(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CachedLabeledBy(IUIAutomationElement4* This,IUIAutomationElement **retVal) {
    return This->lpVtbl->get_CachedLabeledBy(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CachedAriaRole(IUIAutomationElement4* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAriaRole(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CachedAriaProperties(IUIAutomationElement4* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAriaProperties(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CachedIsDataValidForForm(IUIAutomationElement4* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsDataValidForForm(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CachedControllerFor(IUIAutomationElement4* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedControllerFor(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CachedDescribedBy(IUIAutomationElement4* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedDescribedBy(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CachedFlowsTo(IUIAutomationElement4* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedFlowsTo(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CachedProviderDescription(IUIAutomationElement4* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedProviderDescription(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_GetClickablePoint(IUIAutomationElement4* This,POINT *clickable,WINBOOL *gotClickable) {
    return This->lpVtbl->GetClickablePoint(This,clickable,gotClickable);
}
/*** IUIAutomationElement2 methods ***/
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CurrentOptimizeForVisualContent(IUIAutomationElement4* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentOptimizeForVisualContent(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CachedOptimizeForVisualContent(IUIAutomationElement4* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedOptimizeForVisualContent(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CurrentLiveSetting(IUIAutomationElement4* This,enum LiveSetting *retVal) {
    return This->lpVtbl->get_CurrentLiveSetting(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CachedLiveSetting(IUIAutomationElement4* This,enum LiveSetting *retVal) {
    return This->lpVtbl->get_CachedLiveSetting(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CurrentFlowsFrom(IUIAutomationElement4* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentFlowsFrom(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CachedFlowsFrom(IUIAutomationElement4* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedFlowsFrom(This,retVal);
}
/*** IUIAutomationElement3 methods ***/
static __WIDL_INLINE HRESULT IUIAutomationElement4_ShowContextMenu(IUIAutomationElement4* This) {
    return This->lpVtbl->ShowContextMenu(This);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CurrentIsPeripheral(IUIAutomationElement4* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsPeripheral(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CachedIsPeripheral(IUIAutomationElement4* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsPeripheral(This,retVal);
}
/*** IUIAutomationElement4 methods ***/
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CurrentPositionInSet(IUIAutomationElement4* This,int *retVal) {
    return This->lpVtbl->get_CurrentPositionInSet(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CurrentSizeOfSet(IUIAutomationElement4* This,int *retVal) {
    return This->lpVtbl->get_CurrentSizeOfSet(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CurrentLevel(IUIAutomationElement4* This,int *retVal) {
    return This->lpVtbl->get_CurrentLevel(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CurrentAnnotationTypes(IUIAutomationElement4* This,SAFEARRAY **retVal) {
    return This->lpVtbl->get_CurrentAnnotationTypes(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CurrentAnnotationObjects(IUIAutomationElement4* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentAnnotationObjects(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CachedPositionInSet(IUIAutomationElement4* This,int *retVal) {
    return This->lpVtbl->get_CachedPositionInSet(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CachedSizeOfSet(IUIAutomationElement4* This,int *retVal) {
    return This->lpVtbl->get_CachedSizeOfSet(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CachedLevel(IUIAutomationElement4* This,int *retVal) {
    return This->lpVtbl->get_CachedLevel(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CachedAnnotationTypes(IUIAutomationElement4* This,SAFEARRAY **retVal) {
    return This->lpVtbl->get_CachedAnnotationTypes(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement4_get_CachedAnnotationObjects(IUIAutomationElement4* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedAnnotationObjects(This,retVal);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationElement4_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationElement5 interface
 */
#ifndef __IUIAutomationElement5_INTERFACE_DEFINED__
#define __IUIAutomationElement5_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationElement5, 0x98141c1d, 0x0d0e, 0x4175, 0xbb,0xe2, 0x6b,0xff,0x45,0x58,0x42,0xa7);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("98141c1d-0d0e-4175-bbe2-6bff455842a7")
IUIAutomationElement5 : public IUIAutomationElement4
{
    virtual HRESULT STDMETHODCALLTYPE get_CurrentLandmarkType(
        LANDMARKTYPEID *retVal) = 0;

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

    virtual HRESULT STDMETHODCALLTYPE get_CachedLandmarkType(
        LANDMARKTYPEID *retVal) = 0;

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

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationElement5, 0x98141c1d, 0x0d0e, 0x4175, 0xbb,0xe2, 0x6b,0xff,0x45,0x58,0x42,0xa7)
#endif
#else
typedef struct IUIAutomationElement5Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomationElement methods ***/
    HRESULT (STDMETHODCALLTYPE *SetFocus)(
        IUIAutomationElement5 *This);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeId)(
        IUIAutomationElement5 *This,
        SAFEARRAY **runtimeId);

    HRESULT (STDMETHODCALLTYPE *FindFirst)(
        IUIAutomationElement5 *This,
        enum TreeScope scope,
        IUIAutomationCondition *condition,
        IUIAutomationElement **found);

    HRESULT (STDMETHODCALLTYPE *FindAll)(
        IUIAutomationElement5 *This,
        enum TreeScope scope,
        IUIAutomationCondition *condition,
        IUIAutomationElementArray **found);

    HRESULT (STDMETHODCALLTYPE *FindFirstBuildCache)(
        IUIAutomationElement5 *This,
        enum TreeScope scope,
        IUIAutomationCondition *condition,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **found);

    HRESULT (STDMETHODCALLTYPE *FindAllBuildCache)(
        IUIAutomationElement5 *This,
        enum TreeScope scope,
        IUIAutomationCondition *condition,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElementArray **found);

    HRESULT (STDMETHODCALLTYPE *BuildUpdatedCache)(
        IUIAutomationElement5 *This,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **updatedElement);

    HRESULT (STDMETHODCALLTYPE *GetCurrentPropertyValue)(
        IUIAutomationElement5 *This,
        PROPERTYID propertyId,
        VARIANT *retVal);

    HRESULT (STDMETHODCALLTYPE *GetCurrentPropertyValueEx)(
        IUIAutomationElement5 *This,
        PROPERTYID propertyId,
        WINBOOL ignoreDefaultValue,
        VARIANT *retVal);

    HRESULT (STDMETHODCALLTYPE *GetCachedPropertyValue)(
        IUIAutomationElement5 *This,
        PROPERTYID propertyId,
        VARIANT *retVal);

    HRESULT (STDMETHODCALLTYPE *GetCachedPropertyValueEx)(
        IUIAutomationElement5 *This,
        PROPERTYID propertyId,
        WINBOOL ignoreDefaultValue,
        VARIANT *retVal);

    HRESULT (STDMETHODCALLTYPE *GetCurrentPatternAs)(
        IUIAutomationElement5 *This,
        PATTERNID patternId,
        REFIID riid,
        void **patternObject);

    HRESULT (STDMETHODCALLTYPE *GetCachedPatternAs)(
        IUIAutomationElement5 *This,
        PATTERNID patternId,
        REFIID riid,
        void **patternObject);

    HRESULT (STDMETHODCALLTYPE *GetCurrentPattern)(
        IUIAutomationElement5 *This,
        PATTERNID patternId,
        IUnknown **patternObject);

    HRESULT (STDMETHODCALLTYPE *GetCachedPattern)(
        IUIAutomationElement5 *This,
        PATTERNID patternId,
        IUnknown **patternObject);

    HRESULT (STDMETHODCALLTYPE *GetCachedParent)(
        IUIAutomationElement5 *This,
        IUIAutomationElement **parent);

    HRESULT (STDMETHODCALLTYPE *GetCachedChildren)(
        IUIAutomationElement5 *This,
        IUIAutomationElementArray **children);

    HRESULT (STDMETHODCALLTYPE *get_CurrentProcessId)(
        IUIAutomationElement5 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentControlType)(
        IUIAutomationElement5 *This,
        CONTROLTYPEID *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentLocalizedControlType)(
        IUIAutomationElement5 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentName)(
        IUIAutomationElement5 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAcceleratorKey)(
        IUIAutomationElement5 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAccessKey)(
        IUIAutomationElement5 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentHasKeyboardFocus)(
        IUIAutomationElement5 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsKeyboardFocusable)(
        IUIAutomationElement5 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsEnabled)(
        IUIAutomationElement5 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAutomationId)(
        IUIAutomationElement5 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentClassName)(
        IUIAutomationElement5 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentHelpText)(
        IUIAutomationElement5 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentCulture)(
        IUIAutomationElement5 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsControlElement)(
        IUIAutomationElement5 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsContentElement)(
        IUIAutomationElement5 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsPassword)(
        IUIAutomationElement5 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentNativeWindowHandle)(
        IUIAutomationElement5 *This,
        UIA_HWND *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentItemType)(
        IUIAutomationElement5 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsOffscreen)(
        IUIAutomationElement5 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentOrientation)(
        IUIAutomationElement5 *This,
        enum OrientationType *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentFrameworkId)(
        IUIAutomationElement5 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsRequiredForForm)(
        IUIAutomationElement5 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentItemStatus)(
        IUIAutomationElement5 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentBoundingRectangle)(
        IUIAutomationElement5 *This,
        RECT *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentLabeledBy)(
        IUIAutomationElement5 *This,
        IUIAutomationElement **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAriaRole)(
        IUIAutomationElement5 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAriaProperties)(
        IUIAutomationElement5 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsDataValidForForm)(
        IUIAutomationElement5 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentControllerFor)(
        IUIAutomationElement5 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentDescribedBy)(
        IUIAutomationElement5 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentFlowsTo)(
        IUIAutomationElement5 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentProviderDescription)(
        IUIAutomationElement5 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedProcessId)(
        IUIAutomationElement5 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedControlType)(
        IUIAutomationElement5 *This,
        CONTROLTYPEID *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedLocalizedControlType)(
        IUIAutomationElement5 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedName)(
        IUIAutomationElement5 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAcceleratorKey)(
        IUIAutomationElement5 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAccessKey)(
        IUIAutomationElement5 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedHasKeyboardFocus)(
        IUIAutomationElement5 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsKeyboardFocusable)(
        IUIAutomationElement5 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsEnabled)(
        IUIAutomationElement5 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAutomationId)(
        IUIAutomationElement5 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedClassName)(
        IUIAutomationElement5 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedHelpText)(
        IUIAutomationElement5 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedCulture)(
        IUIAutomationElement5 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsControlElement)(
        IUIAutomationElement5 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsContentElement)(
        IUIAutomationElement5 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsPassword)(
        IUIAutomationElement5 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedNativeWindowHandle)(
        IUIAutomationElement5 *This,
        UIA_HWND *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedItemType)(
        IUIAutomationElement5 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsOffscreen)(
        IUIAutomationElement5 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedOrientation)(
        IUIAutomationElement5 *This,
        enum OrientationType *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedFrameworkId)(
        IUIAutomationElement5 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsRequiredForForm)(
        IUIAutomationElement5 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedItemStatus)(
        IUIAutomationElement5 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedBoundingRectangle)(
        IUIAutomationElement5 *This,
        RECT *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedLabeledBy)(
        IUIAutomationElement5 *This,
        IUIAutomationElement **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAriaRole)(
        IUIAutomationElement5 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAriaProperties)(
        IUIAutomationElement5 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsDataValidForForm)(
        IUIAutomationElement5 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedControllerFor)(
        IUIAutomationElement5 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedDescribedBy)(
        IUIAutomationElement5 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedFlowsTo)(
        IUIAutomationElement5 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedProviderDescription)(
        IUIAutomationElement5 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *GetClickablePoint)(
        IUIAutomationElement5 *This,
        POINT *clickable,
        WINBOOL *gotClickable);

    /*** IUIAutomationElement2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CurrentOptimizeForVisualContent)(
        IUIAutomationElement5 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedOptimizeForVisualContent)(
        IUIAutomationElement5 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentLiveSetting)(
        IUIAutomationElement5 *This,
        enum LiveSetting *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedLiveSetting)(
        IUIAutomationElement5 *This,
        enum LiveSetting *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentFlowsFrom)(
        IUIAutomationElement5 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedFlowsFrom)(
        IUIAutomationElement5 *This,
        IUIAutomationElementArray **retVal);

    /*** IUIAutomationElement3 methods ***/
    HRESULT (STDMETHODCALLTYPE *ShowContextMenu)(
        IUIAutomationElement5 *This);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsPeripheral)(
        IUIAutomationElement5 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsPeripheral)(
        IUIAutomationElement5 *This,
        WINBOOL *retVal);

    /*** IUIAutomationElement4 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CurrentPositionInSet)(
        IUIAutomationElement5 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentSizeOfSet)(
        IUIAutomationElement5 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentLevel)(
        IUIAutomationElement5 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAnnotationTypes)(
        IUIAutomationElement5 *This,
        SAFEARRAY **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAnnotationObjects)(
        IUIAutomationElement5 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedPositionInSet)(
        IUIAutomationElement5 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedSizeOfSet)(
        IUIAutomationElement5 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedLevel)(
        IUIAutomationElement5 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAnnotationTypes)(
        IUIAutomationElement5 *This,
        SAFEARRAY **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAnnotationObjects)(
        IUIAutomationElement5 *This,
        IUIAutomationElementArray **retVal);

    /*** IUIAutomationElement5 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CurrentLandmarkType)(
        IUIAutomationElement5 *This,
        LANDMARKTYPEID *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentLocalizedLandmarkType)(
        IUIAutomationElement5 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedLandmarkType)(
        IUIAutomationElement5 *This,
        LANDMARKTYPEID *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedLocalizedLandmarkType)(
        IUIAutomationElement5 *This,
        BSTR *retVal);

    END_INTERFACE
} IUIAutomationElement5Vtbl;

interface IUIAutomationElement5 {
    CONST_VTBL IUIAutomationElement5Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationElement5_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationElement5_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationElement5_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationElement methods ***/
#define IUIAutomationElement5_SetFocus(This) (This)->lpVtbl->SetFocus(This)
#define IUIAutomationElement5_GetRuntimeId(This,runtimeId) (This)->lpVtbl->GetRuntimeId(This,runtimeId)
#define IUIAutomationElement5_FindFirst(This,scope,condition,found) (This)->lpVtbl->FindFirst(This,scope,condition,found)
#define IUIAutomationElement5_FindAll(This,scope,condition,found) (This)->lpVtbl->FindAll(This,scope,condition,found)
#define IUIAutomationElement5_FindFirstBuildCache(This,scope,condition,cacheRequest,found) (This)->lpVtbl->FindFirstBuildCache(This,scope,condition,cacheRequest,found)
#define IUIAutomationElement5_FindAllBuildCache(This,scope,condition,cacheRequest,found) (This)->lpVtbl->FindAllBuildCache(This,scope,condition,cacheRequest,found)
#define IUIAutomationElement5_BuildUpdatedCache(This,cacheRequest,updatedElement) (This)->lpVtbl->BuildUpdatedCache(This,cacheRequest,updatedElement)
#define IUIAutomationElement5_GetCurrentPropertyValue(This,propertyId,retVal) (This)->lpVtbl->GetCurrentPropertyValue(This,propertyId,retVal)
#define IUIAutomationElement5_GetCurrentPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal) (This)->lpVtbl->GetCurrentPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal)
#define IUIAutomationElement5_GetCachedPropertyValue(This,propertyId,retVal) (This)->lpVtbl->GetCachedPropertyValue(This,propertyId,retVal)
#define IUIAutomationElement5_GetCachedPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal) (This)->lpVtbl->GetCachedPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal)
#define IUIAutomationElement5_GetCurrentPatternAs(This,patternId,riid,patternObject) (This)->lpVtbl->GetCurrentPatternAs(This,patternId,riid,patternObject)
#define IUIAutomationElement5_GetCachedPatternAs(This,patternId,riid,patternObject) (This)->lpVtbl->GetCachedPatternAs(This,patternId,riid,patternObject)
#define IUIAutomationElement5_GetCurrentPattern(This,patternId,patternObject) (This)->lpVtbl->GetCurrentPattern(This,patternId,patternObject)
#define IUIAutomationElement5_GetCachedPattern(This,patternId,patternObject) (This)->lpVtbl->GetCachedPattern(This,patternId,patternObject)
#define IUIAutomationElement5_GetCachedParent(This,parent) (This)->lpVtbl->GetCachedParent(This,parent)
#define IUIAutomationElement5_GetCachedChildren(This,children) (This)->lpVtbl->GetCachedChildren(This,children)
#define IUIAutomationElement5_get_CurrentProcessId(This,retVal) (This)->lpVtbl->get_CurrentProcessId(This,retVal)
#define IUIAutomationElement5_get_CurrentControlType(This,retVal) (This)->lpVtbl->get_CurrentControlType(This,retVal)
#define IUIAutomationElement5_get_CurrentLocalizedControlType(This,retVal) (This)->lpVtbl->get_CurrentLocalizedControlType(This,retVal)
#define IUIAutomationElement5_get_CurrentName(This,retVal) (This)->lpVtbl->get_CurrentName(This,retVal)
#define IUIAutomationElement5_get_CurrentAcceleratorKey(This,retVal) (This)->lpVtbl->get_CurrentAcceleratorKey(This,retVal)
#define IUIAutomationElement5_get_CurrentAccessKey(This,retVal) (This)->lpVtbl->get_CurrentAccessKey(This,retVal)
#define IUIAutomationElement5_get_CurrentHasKeyboardFocus(This,retVal) (This)->lpVtbl->get_CurrentHasKeyboardFocus(This,retVal)
#define IUIAutomationElement5_get_CurrentIsKeyboardFocusable(This,retVal) (This)->lpVtbl->get_CurrentIsKeyboardFocusable(This,retVal)
#define IUIAutomationElement5_get_CurrentIsEnabled(This,retVal) (This)->lpVtbl->get_CurrentIsEnabled(This,retVal)
#define IUIAutomationElement5_get_CurrentAutomationId(This,retVal) (This)->lpVtbl->get_CurrentAutomationId(This,retVal)
#define IUIAutomationElement5_get_CurrentClassName(This,retVal) (This)->lpVtbl->get_CurrentClassName(This,retVal)
#define IUIAutomationElement5_get_CurrentHelpText(This,retVal) (This)->lpVtbl->get_CurrentHelpText(This,retVal)
#define IUIAutomationElement5_get_CurrentCulture(This,retVal) (This)->lpVtbl->get_CurrentCulture(This,retVal)
#define IUIAutomationElement5_get_CurrentIsControlElement(This,retVal) (This)->lpVtbl->get_CurrentIsControlElement(This,retVal)
#define IUIAutomationElement5_get_CurrentIsContentElement(This,retVal) (This)->lpVtbl->get_CurrentIsContentElement(This,retVal)
#define IUIAutomationElement5_get_CurrentIsPassword(This,retVal) (This)->lpVtbl->get_CurrentIsPassword(This,retVal)
#define IUIAutomationElement5_get_CurrentNativeWindowHandle(This,retVal) (This)->lpVtbl->get_CurrentNativeWindowHandle(This,retVal)
#define IUIAutomationElement5_get_CurrentItemType(This,retVal) (This)->lpVtbl->get_CurrentItemType(This,retVal)
#define IUIAutomationElement5_get_CurrentIsOffscreen(This,retVal) (This)->lpVtbl->get_CurrentIsOffscreen(This,retVal)
#define IUIAutomationElement5_get_CurrentOrientation(This,retVal) (This)->lpVtbl->get_CurrentOrientation(This,retVal)
#define IUIAutomationElement5_get_CurrentFrameworkId(This,retVal) (This)->lpVtbl->get_CurrentFrameworkId(This,retVal)
#define IUIAutomationElement5_get_CurrentIsRequiredForForm(This,retVal) (This)->lpVtbl->get_CurrentIsRequiredForForm(This,retVal)
#define IUIAutomationElement5_get_CurrentItemStatus(This,retVal) (This)->lpVtbl->get_CurrentItemStatus(This,retVal)
#define IUIAutomationElement5_get_CurrentBoundingRectangle(This,retVal) (This)->lpVtbl->get_CurrentBoundingRectangle(This,retVal)
#define IUIAutomationElement5_get_CurrentLabeledBy(This,retVal) (This)->lpVtbl->get_CurrentLabeledBy(This,retVal)
#define IUIAutomationElement5_get_CurrentAriaRole(This,retVal) (This)->lpVtbl->get_CurrentAriaRole(This,retVal)
#define IUIAutomationElement5_get_CurrentAriaProperties(This,retVal) (This)->lpVtbl->get_CurrentAriaProperties(This,retVal)
#define IUIAutomationElement5_get_CurrentIsDataValidForForm(This,retVal) (This)->lpVtbl->get_CurrentIsDataValidForForm(This,retVal)
#define IUIAutomationElement5_get_CurrentControllerFor(This,retVal) (This)->lpVtbl->get_CurrentControllerFor(This,retVal)
#define IUIAutomationElement5_get_CurrentDescribedBy(This,retVal) (This)->lpVtbl->get_CurrentDescribedBy(This,retVal)
#define IUIAutomationElement5_get_CurrentFlowsTo(This,retVal) (This)->lpVtbl->get_CurrentFlowsTo(This,retVal)
#define IUIAutomationElement5_get_CurrentProviderDescription(This,retVal) (This)->lpVtbl->get_CurrentProviderDescription(This,retVal)
#define IUIAutomationElement5_get_CachedProcessId(This,retVal) (This)->lpVtbl->get_CachedProcessId(This,retVal)
#define IUIAutomationElement5_get_CachedControlType(This,retVal) (This)->lpVtbl->get_CachedControlType(This,retVal)
#define IUIAutomationElement5_get_CachedLocalizedControlType(This,retVal) (This)->lpVtbl->get_CachedLocalizedControlType(This,retVal)
#define IUIAutomationElement5_get_CachedName(This,retVal) (This)->lpVtbl->get_CachedName(This,retVal)
#define IUIAutomationElement5_get_CachedAcceleratorKey(This,retVal) (This)->lpVtbl->get_CachedAcceleratorKey(This,retVal)
#define IUIAutomationElement5_get_CachedAccessKey(This,retVal) (This)->lpVtbl->get_CachedAccessKey(This,retVal)
#define IUIAutomationElement5_get_CachedHasKeyboardFocus(This,retVal) (This)->lpVtbl->get_CachedHasKeyboardFocus(This,retVal)
#define IUIAutomationElement5_get_CachedIsKeyboardFocusable(This,retVal) (This)->lpVtbl->get_CachedIsKeyboardFocusable(This,retVal)
#define IUIAutomationElement5_get_CachedIsEnabled(This,retVal) (This)->lpVtbl->get_CachedIsEnabled(This,retVal)
#define IUIAutomationElement5_get_CachedAutomationId(This,retVal) (This)->lpVtbl->get_CachedAutomationId(This,retVal)
#define IUIAutomationElement5_get_CachedClassName(This,retVal) (This)->lpVtbl->get_CachedClassName(This,retVal)
#define IUIAutomationElement5_get_CachedHelpText(This,retVal) (This)->lpVtbl->get_CachedHelpText(This,retVal)
#define IUIAutomationElement5_get_CachedCulture(This,retVal) (This)->lpVtbl->get_CachedCulture(This,retVal)
#define IUIAutomationElement5_get_CachedIsControlElement(This,retVal) (This)->lpVtbl->get_CachedIsControlElement(This,retVal)
#define IUIAutomationElement5_get_CachedIsContentElement(This,retVal) (This)->lpVtbl->get_CachedIsContentElement(This,retVal)
#define IUIAutomationElement5_get_CachedIsPassword(This,retVal) (This)->lpVtbl->get_CachedIsPassword(This,retVal)
#define IUIAutomationElement5_get_CachedNativeWindowHandle(This,retVal) (This)->lpVtbl->get_CachedNativeWindowHandle(This,retVal)
#define IUIAutomationElement5_get_CachedItemType(This,retVal) (This)->lpVtbl->get_CachedItemType(This,retVal)
#define IUIAutomationElement5_get_CachedIsOffscreen(This,retVal) (This)->lpVtbl->get_CachedIsOffscreen(This,retVal)
#define IUIAutomationElement5_get_CachedOrientation(This,retVal) (This)->lpVtbl->get_CachedOrientation(This,retVal)
#define IUIAutomationElement5_get_CachedFrameworkId(This,retVal) (This)->lpVtbl->get_CachedFrameworkId(This,retVal)
#define IUIAutomationElement5_get_CachedIsRequiredForForm(This,retVal) (This)->lpVtbl->get_CachedIsRequiredForForm(This,retVal)
#define IUIAutomationElement5_get_CachedItemStatus(This,retVal) (This)->lpVtbl->get_CachedItemStatus(This,retVal)
#define IUIAutomationElement5_get_CachedBoundingRectangle(This,retVal) (This)->lpVtbl->get_CachedBoundingRectangle(This,retVal)
#define IUIAutomationElement5_get_CachedLabeledBy(This,retVal) (This)->lpVtbl->get_CachedLabeledBy(This,retVal)
#define IUIAutomationElement5_get_CachedAriaRole(This,retVal) (This)->lpVtbl->get_CachedAriaRole(This,retVal)
#define IUIAutomationElement5_get_CachedAriaProperties(This,retVal) (This)->lpVtbl->get_CachedAriaProperties(This,retVal)
#define IUIAutomationElement5_get_CachedIsDataValidForForm(This,retVal) (This)->lpVtbl->get_CachedIsDataValidForForm(This,retVal)
#define IUIAutomationElement5_get_CachedControllerFor(This,retVal) (This)->lpVtbl->get_CachedControllerFor(This,retVal)
#define IUIAutomationElement5_get_CachedDescribedBy(This,retVal) (This)->lpVtbl->get_CachedDescribedBy(This,retVal)
#define IUIAutomationElement5_get_CachedFlowsTo(This,retVal) (This)->lpVtbl->get_CachedFlowsTo(This,retVal)
#define IUIAutomationElement5_get_CachedProviderDescription(This,retVal) (This)->lpVtbl->get_CachedProviderDescription(This,retVal)
#define IUIAutomationElement5_GetClickablePoint(This,clickable,gotClickable) (This)->lpVtbl->GetClickablePoint(This,clickable,gotClickable)
/*** IUIAutomationElement2 methods ***/
#define IUIAutomationElement5_get_CurrentOptimizeForVisualContent(This,retVal) (This)->lpVtbl->get_CurrentOptimizeForVisualContent(This,retVal)
#define IUIAutomationElement5_get_CachedOptimizeForVisualContent(This,retVal) (This)->lpVtbl->get_CachedOptimizeForVisualContent(This,retVal)
#define IUIAutomationElement5_get_CurrentLiveSetting(This,retVal) (This)->lpVtbl->get_CurrentLiveSetting(This,retVal)
#define IUIAutomationElement5_get_CachedLiveSetting(This,retVal) (This)->lpVtbl->get_CachedLiveSetting(This,retVal)
#define IUIAutomationElement5_get_CurrentFlowsFrom(This,retVal) (This)->lpVtbl->get_CurrentFlowsFrom(This,retVal)
#define IUIAutomationElement5_get_CachedFlowsFrom(This,retVal) (This)->lpVtbl->get_CachedFlowsFrom(This,retVal)
/*** IUIAutomationElement3 methods ***/
#define IUIAutomationElement5_ShowContextMenu(This) (This)->lpVtbl->ShowContextMenu(This)
#define IUIAutomationElement5_get_CurrentIsPeripheral(This,retVal) (This)->lpVtbl->get_CurrentIsPeripheral(This,retVal)
#define IUIAutomationElement5_get_CachedIsPeripheral(This,retVal) (This)->lpVtbl->get_CachedIsPeripheral(This,retVal)
/*** IUIAutomationElement4 methods ***/
#define IUIAutomationElement5_get_CurrentPositionInSet(This,retVal) (This)->lpVtbl->get_CurrentPositionInSet(This,retVal)
#define IUIAutomationElement5_get_CurrentSizeOfSet(This,retVal) (This)->lpVtbl->get_CurrentSizeOfSet(This,retVal)
#define IUIAutomationElement5_get_CurrentLevel(This,retVal) (This)->lpVtbl->get_CurrentLevel(This,retVal)
#define IUIAutomationElement5_get_CurrentAnnotationTypes(This,retVal) (This)->lpVtbl->get_CurrentAnnotationTypes(This,retVal)
#define IUIAutomationElement5_get_CurrentAnnotationObjects(This,retVal) (This)->lpVtbl->get_CurrentAnnotationObjects(This,retVal)
#define IUIAutomationElement5_get_CachedPositionInSet(This,retVal) (This)->lpVtbl->get_CachedPositionInSet(This,retVal)
#define IUIAutomationElement5_get_CachedSizeOfSet(This,retVal) (This)->lpVtbl->get_CachedSizeOfSet(This,retVal)
#define IUIAutomationElement5_get_CachedLevel(This,retVal) (This)->lpVtbl->get_CachedLevel(This,retVal)
#define IUIAutomationElement5_get_CachedAnnotationTypes(This,retVal) (This)->lpVtbl->get_CachedAnnotationTypes(This,retVal)
#define IUIAutomationElement5_get_CachedAnnotationObjects(This,retVal) (This)->lpVtbl->get_CachedAnnotationObjects(This,retVal)
/*** IUIAutomationElement5 methods ***/
#define IUIAutomationElement5_get_CurrentLandmarkType(This,retVal) (This)->lpVtbl->get_CurrentLandmarkType(This,retVal)
#define IUIAutomationElement5_get_CurrentLocalizedLandmarkType(This,retVal) (This)->lpVtbl->get_CurrentLocalizedLandmarkType(This,retVal)
#define IUIAutomationElement5_get_CachedLandmarkType(This,retVal) (This)->lpVtbl->get_CachedLandmarkType(This,retVal)
#define IUIAutomationElement5_get_CachedLocalizedLandmarkType(This,retVal) (This)->lpVtbl->get_CachedLocalizedLandmarkType(This,retVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationElement5_QueryInterface(IUIAutomationElement5* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationElement5_AddRef(IUIAutomationElement5* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationElement5_Release(IUIAutomationElement5* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationElement methods ***/
static __WIDL_INLINE HRESULT IUIAutomationElement5_SetFocus(IUIAutomationElement5* This) {
    return This->lpVtbl->SetFocus(This);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_GetRuntimeId(IUIAutomationElement5* This,SAFEARRAY **runtimeId) {
    return This->lpVtbl->GetRuntimeId(This,runtimeId);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_FindFirst(IUIAutomationElement5* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationElement **found) {
    return This->lpVtbl->FindFirst(This,scope,condition,found);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_FindAll(IUIAutomationElement5* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationElementArray **found) {
    return This->lpVtbl->FindAll(This,scope,condition,found);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_FindFirstBuildCache(IUIAutomationElement5* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **found) {
    return This->lpVtbl->FindFirstBuildCache(This,scope,condition,cacheRequest,found);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_FindAllBuildCache(IUIAutomationElement5* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElementArray **found) {
    return This->lpVtbl->FindAllBuildCache(This,scope,condition,cacheRequest,found);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_BuildUpdatedCache(IUIAutomationElement5* This,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **updatedElement) {
    return This->lpVtbl->BuildUpdatedCache(This,cacheRequest,updatedElement);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_GetCurrentPropertyValue(IUIAutomationElement5* This,PROPERTYID propertyId,VARIANT *retVal) {
    return This->lpVtbl->GetCurrentPropertyValue(This,propertyId,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_GetCurrentPropertyValueEx(IUIAutomationElement5* This,PROPERTYID propertyId,WINBOOL ignoreDefaultValue,VARIANT *retVal) {
    return This->lpVtbl->GetCurrentPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_GetCachedPropertyValue(IUIAutomationElement5* This,PROPERTYID propertyId,VARIANT *retVal) {
    return This->lpVtbl->GetCachedPropertyValue(This,propertyId,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_GetCachedPropertyValueEx(IUIAutomationElement5* This,PROPERTYID propertyId,WINBOOL ignoreDefaultValue,VARIANT *retVal) {
    return This->lpVtbl->GetCachedPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_GetCurrentPatternAs(IUIAutomationElement5* This,PATTERNID patternId,REFIID riid,void **patternObject) {
    return This->lpVtbl->GetCurrentPatternAs(This,patternId,riid,patternObject);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_GetCachedPatternAs(IUIAutomationElement5* This,PATTERNID patternId,REFIID riid,void **patternObject) {
    return This->lpVtbl->GetCachedPatternAs(This,patternId,riid,patternObject);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_GetCurrentPattern(IUIAutomationElement5* This,PATTERNID patternId,IUnknown **patternObject) {
    return This->lpVtbl->GetCurrentPattern(This,patternId,patternObject);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_GetCachedPattern(IUIAutomationElement5* This,PATTERNID patternId,IUnknown **patternObject) {
    return This->lpVtbl->GetCachedPattern(This,patternId,patternObject);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_GetCachedParent(IUIAutomationElement5* This,IUIAutomationElement **parent) {
    return This->lpVtbl->GetCachedParent(This,parent);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_GetCachedChildren(IUIAutomationElement5* This,IUIAutomationElementArray **children) {
    return This->lpVtbl->GetCachedChildren(This,children);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CurrentProcessId(IUIAutomationElement5* This,int *retVal) {
    return This->lpVtbl->get_CurrentProcessId(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CurrentControlType(IUIAutomationElement5* This,CONTROLTYPEID *retVal) {
    return This->lpVtbl->get_CurrentControlType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CurrentLocalizedControlType(IUIAutomationElement5* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentLocalizedControlType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CurrentName(IUIAutomationElement5* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentName(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CurrentAcceleratorKey(IUIAutomationElement5* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAcceleratorKey(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CurrentAccessKey(IUIAutomationElement5* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAccessKey(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CurrentHasKeyboardFocus(IUIAutomationElement5* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentHasKeyboardFocus(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CurrentIsKeyboardFocusable(IUIAutomationElement5* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsKeyboardFocusable(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CurrentIsEnabled(IUIAutomationElement5* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsEnabled(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CurrentAutomationId(IUIAutomationElement5* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAutomationId(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CurrentClassName(IUIAutomationElement5* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentClassName(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CurrentHelpText(IUIAutomationElement5* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentHelpText(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CurrentCulture(IUIAutomationElement5* This,int *retVal) {
    return This->lpVtbl->get_CurrentCulture(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CurrentIsControlElement(IUIAutomationElement5* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsControlElement(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CurrentIsContentElement(IUIAutomationElement5* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsContentElement(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CurrentIsPassword(IUIAutomationElement5* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsPassword(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CurrentNativeWindowHandle(IUIAutomationElement5* This,UIA_HWND *retVal) {
    return This->lpVtbl->get_CurrentNativeWindowHandle(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CurrentItemType(IUIAutomationElement5* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentItemType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CurrentIsOffscreen(IUIAutomationElement5* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsOffscreen(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CurrentOrientation(IUIAutomationElement5* This,enum OrientationType *retVal) {
    return This->lpVtbl->get_CurrentOrientation(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CurrentFrameworkId(IUIAutomationElement5* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentFrameworkId(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CurrentIsRequiredForForm(IUIAutomationElement5* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsRequiredForForm(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CurrentItemStatus(IUIAutomationElement5* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentItemStatus(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CurrentBoundingRectangle(IUIAutomationElement5* This,RECT *retVal) {
    return This->lpVtbl->get_CurrentBoundingRectangle(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CurrentLabeledBy(IUIAutomationElement5* This,IUIAutomationElement **retVal) {
    return This->lpVtbl->get_CurrentLabeledBy(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CurrentAriaRole(IUIAutomationElement5* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAriaRole(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CurrentAriaProperties(IUIAutomationElement5* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAriaProperties(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CurrentIsDataValidForForm(IUIAutomationElement5* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsDataValidForForm(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CurrentControllerFor(IUIAutomationElement5* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentControllerFor(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CurrentDescribedBy(IUIAutomationElement5* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentDescribedBy(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CurrentFlowsTo(IUIAutomationElement5* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentFlowsTo(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CurrentProviderDescription(IUIAutomationElement5* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentProviderDescription(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CachedProcessId(IUIAutomationElement5* This,int *retVal) {
    return This->lpVtbl->get_CachedProcessId(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CachedControlType(IUIAutomationElement5* This,CONTROLTYPEID *retVal) {
    return This->lpVtbl->get_CachedControlType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CachedLocalizedControlType(IUIAutomationElement5* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedLocalizedControlType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CachedName(IUIAutomationElement5* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedName(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CachedAcceleratorKey(IUIAutomationElement5* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAcceleratorKey(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CachedAccessKey(IUIAutomationElement5* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAccessKey(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CachedHasKeyboardFocus(IUIAutomationElement5* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedHasKeyboardFocus(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CachedIsKeyboardFocusable(IUIAutomationElement5* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsKeyboardFocusable(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CachedIsEnabled(IUIAutomationElement5* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsEnabled(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CachedAutomationId(IUIAutomationElement5* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAutomationId(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CachedClassName(IUIAutomationElement5* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedClassName(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CachedHelpText(IUIAutomationElement5* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedHelpText(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CachedCulture(IUIAutomationElement5* This,int *retVal) {
    return This->lpVtbl->get_CachedCulture(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CachedIsControlElement(IUIAutomationElement5* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsControlElement(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CachedIsContentElement(IUIAutomationElement5* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsContentElement(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CachedIsPassword(IUIAutomationElement5* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsPassword(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CachedNativeWindowHandle(IUIAutomationElement5* This,UIA_HWND *retVal) {
    return This->lpVtbl->get_CachedNativeWindowHandle(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CachedItemType(IUIAutomationElement5* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedItemType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CachedIsOffscreen(IUIAutomationElement5* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsOffscreen(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CachedOrientation(IUIAutomationElement5* This,enum OrientationType *retVal) {
    return This->lpVtbl->get_CachedOrientation(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CachedFrameworkId(IUIAutomationElement5* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedFrameworkId(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CachedIsRequiredForForm(IUIAutomationElement5* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsRequiredForForm(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CachedItemStatus(IUIAutomationElement5* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedItemStatus(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CachedBoundingRectangle(IUIAutomationElement5* This,RECT *retVal) {
    return This->lpVtbl->get_CachedBoundingRectangle(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CachedLabeledBy(IUIAutomationElement5* This,IUIAutomationElement **retVal) {
    return This->lpVtbl->get_CachedLabeledBy(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CachedAriaRole(IUIAutomationElement5* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAriaRole(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CachedAriaProperties(IUIAutomationElement5* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAriaProperties(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CachedIsDataValidForForm(IUIAutomationElement5* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsDataValidForForm(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CachedControllerFor(IUIAutomationElement5* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedControllerFor(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CachedDescribedBy(IUIAutomationElement5* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedDescribedBy(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CachedFlowsTo(IUIAutomationElement5* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedFlowsTo(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CachedProviderDescription(IUIAutomationElement5* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedProviderDescription(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_GetClickablePoint(IUIAutomationElement5* This,POINT *clickable,WINBOOL *gotClickable) {
    return This->lpVtbl->GetClickablePoint(This,clickable,gotClickable);
}
/*** IUIAutomationElement2 methods ***/
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CurrentOptimizeForVisualContent(IUIAutomationElement5* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentOptimizeForVisualContent(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CachedOptimizeForVisualContent(IUIAutomationElement5* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedOptimizeForVisualContent(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CurrentLiveSetting(IUIAutomationElement5* This,enum LiveSetting *retVal) {
    return This->lpVtbl->get_CurrentLiveSetting(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CachedLiveSetting(IUIAutomationElement5* This,enum LiveSetting *retVal) {
    return This->lpVtbl->get_CachedLiveSetting(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CurrentFlowsFrom(IUIAutomationElement5* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentFlowsFrom(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CachedFlowsFrom(IUIAutomationElement5* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedFlowsFrom(This,retVal);
}
/*** IUIAutomationElement3 methods ***/
static __WIDL_INLINE HRESULT IUIAutomationElement5_ShowContextMenu(IUIAutomationElement5* This) {
    return This->lpVtbl->ShowContextMenu(This);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CurrentIsPeripheral(IUIAutomationElement5* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsPeripheral(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CachedIsPeripheral(IUIAutomationElement5* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsPeripheral(This,retVal);
}
/*** IUIAutomationElement4 methods ***/
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CurrentPositionInSet(IUIAutomationElement5* This,int *retVal) {
    return This->lpVtbl->get_CurrentPositionInSet(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CurrentSizeOfSet(IUIAutomationElement5* This,int *retVal) {
    return This->lpVtbl->get_CurrentSizeOfSet(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CurrentLevel(IUIAutomationElement5* This,int *retVal) {
    return This->lpVtbl->get_CurrentLevel(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CurrentAnnotationTypes(IUIAutomationElement5* This,SAFEARRAY **retVal) {
    return This->lpVtbl->get_CurrentAnnotationTypes(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CurrentAnnotationObjects(IUIAutomationElement5* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentAnnotationObjects(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CachedPositionInSet(IUIAutomationElement5* This,int *retVal) {
    return This->lpVtbl->get_CachedPositionInSet(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CachedSizeOfSet(IUIAutomationElement5* This,int *retVal) {
    return This->lpVtbl->get_CachedSizeOfSet(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CachedLevel(IUIAutomationElement5* This,int *retVal) {
    return This->lpVtbl->get_CachedLevel(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CachedAnnotationTypes(IUIAutomationElement5* This,SAFEARRAY **retVal) {
    return This->lpVtbl->get_CachedAnnotationTypes(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CachedAnnotationObjects(IUIAutomationElement5* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedAnnotationObjects(This,retVal);
}
/*** IUIAutomationElement5 methods ***/
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CurrentLandmarkType(IUIAutomationElement5* This,LANDMARKTYPEID *retVal) {
    return This->lpVtbl->get_CurrentLandmarkType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CurrentLocalizedLandmarkType(IUIAutomationElement5* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentLocalizedLandmarkType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CachedLandmarkType(IUIAutomationElement5* This,LANDMARKTYPEID *retVal) {
    return This->lpVtbl->get_CachedLandmarkType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement5_get_CachedLocalizedLandmarkType(IUIAutomationElement5* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedLocalizedLandmarkType(This,retVal);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationElement5_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationElement6 interface
 */
#ifndef __IUIAutomationElement6_INTERFACE_DEFINED__
#define __IUIAutomationElement6_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationElement6, 0x4780d450, 0x8bca, 0x4977, 0xaf,0xa5, 0xa4,0xa5,0x17,0xf5,0x55,0xe3);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("4780d450-8bca-4977-afa5-a4a517f555e3")
IUIAutomationElement6 : public IUIAutomationElement5
{
    virtual HRESULT STDMETHODCALLTYPE get_CurrentFullDescription(
        BSTR *retVal) = 0;

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

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationElement6, 0x4780d450, 0x8bca, 0x4977, 0xaf,0xa5, 0xa4,0xa5,0x17,0xf5,0x55,0xe3)
#endif
#else
typedef struct IUIAutomationElement6Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomationElement methods ***/
    HRESULT (STDMETHODCALLTYPE *SetFocus)(
        IUIAutomationElement6 *This);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeId)(
        IUIAutomationElement6 *This,
        SAFEARRAY **runtimeId);

    HRESULT (STDMETHODCALLTYPE *FindFirst)(
        IUIAutomationElement6 *This,
        enum TreeScope scope,
        IUIAutomationCondition *condition,
        IUIAutomationElement **found);

    HRESULT (STDMETHODCALLTYPE *FindAll)(
        IUIAutomationElement6 *This,
        enum TreeScope scope,
        IUIAutomationCondition *condition,
        IUIAutomationElementArray **found);

    HRESULT (STDMETHODCALLTYPE *FindFirstBuildCache)(
        IUIAutomationElement6 *This,
        enum TreeScope scope,
        IUIAutomationCondition *condition,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **found);

    HRESULT (STDMETHODCALLTYPE *FindAllBuildCache)(
        IUIAutomationElement6 *This,
        enum TreeScope scope,
        IUIAutomationCondition *condition,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElementArray **found);

    HRESULT (STDMETHODCALLTYPE *BuildUpdatedCache)(
        IUIAutomationElement6 *This,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **updatedElement);

    HRESULT (STDMETHODCALLTYPE *GetCurrentPropertyValue)(
        IUIAutomationElement6 *This,
        PROPERTYID propertyId,
        VARIANT *retVal);

    HRESULT (STDMETHODCALLTYPE *GetCurrentPropertyValueEx)(
        IUIAutomationElement6 *This,
        PROPERTYID propertyId,
        WINBOOL ignoreDefaultValue,
        VARIANT *retVal);

    HRESULT (STDMETHODCALLTYPE *GetCachedPropertyValue)(
        IUIAutomationElement6 *This,
        PROPERTYID propertyId,
        VARIANT *retVal);

    HRESULT (STDMETHODCALLTYPE *GetCachedPropertyValueEx)(
        IUIAutomationElement6 *This,
        PROPERTYID propertyId,
        WINBOOL ignoreDefaultValue,
        VARIANT *retVal);

    HRESULT (STDMETHODCALLTYPE *GetCurrentPatternAs)(
        IUIAutomationElement6 *This,
        PATTERNID patternId,
        REFIID riid,
        void **patternObject);

    HRESULT (STDMETHODCALLTYPE *GetCachedPatternAs)(
        IUIAutomationElement6 *This,
        PATTERNID patternId,
        REFIID riid,
        void **patternObject);

    HRESULT (STDMETHODCALLTYPE *GetCurrentPattern)(
        IUIAutomationElement6 *This,
        PATTERNID patternId,
        IUnknown **patternObject);

    HRESULT (STDMETHODCALLTYPE *GetCachedPattern)(
        IUIAutomationElement6 *This,
        PATTERNID patternId,
        IUnknown **patternObject);

    HRESULT (STDMETHODCALLTYPE *GetCachedParent)(
        IUIAutomationElement6 *This,
        IUIAutomationElement **parent);

    HRESULT (STDMETHODCALLTYPE *GetCachedChildren)(
        IUIAutomationElement6 *This,
        IUIAutomationElementArray **children);

    HRESULT (STDMETHODCALLTYPE *get_CurrentProcessId)(
        IUIAutomationElement6 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentControlType)(
        IUIAutomationElement6 *This,
        CONTROLTYPEID *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentLocalizedControlType)(
        IUIAutomationElement6 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentName)(
        IUIAutomationElement6 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAcceleratorKey)(
        IUIAutomationElement6 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAccessKey)(
        IUIAutomationElement6 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentHasKeyboardFocus)(
        IUIAutomationElement6 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsKeyboardFocusable)(
        IUIAutomationElement6 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsEnabled)(
        IUIAutomationElement6 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAutomationId)(
        IUIAutomationElement6 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentClassName)(
        IUIAutomationElement6 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentHelpText)(
        IUIAutomationElement6 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentCulture)(
        IUIAutomationElement6 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsControlElement)(
        IUIAutomationElement6 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsContentElement)(
        IUIAutomationElement6 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsPassword)(
        IUIAutomationElement6 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentNativeWindowHandle)(
        IUIAutomationElement6 *This,
        UIA_HWND *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentItemType)(
        IUIAutomationElement6 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsOffscreen)(
        IUIAutomationElement6 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentOrientation)(
        IUIAutomationElement6 *This,
        enum OrientationType *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentFrameworkId)(
        IUIAutomationElement6 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsRequiredForForm)(
        IUIAutomationElement6 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentItemStatus)(
        IUIAutomationElement6 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentBoundingRectangle)(
        IUIAutomationElement6 *This,
        RECT *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentLabeledBy)(
        IUIAutomationElement6 *This,
        IUIAutomationElement **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAriaRole)(
        IUIAutomationElement6 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAriaProperties)(
        IUIAutomationElement6 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsDataValidForForm)(
        IUIAutomationElement6 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentControllerFor)(
        IUIAutomationElement6 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentDescribedBy)(
        IUIAutomationElement6 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentFlowsTo)(
        IUIAutomationElement6 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentProviderDescription)(
        IUIAutomationElement6 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedProcessId)(
        IUIAutomationElement6 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedControlType)(
        IUIAutomationElement6 *This,
        CONTROLTYPEID *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedLocalizedControlType)(
        IUIAutomationElement6 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedName)(
        IUIAutomationElement6 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAcceleratorKey)(
        IUIAutomationElement6 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAccessKey)(
        IUIAutomationElement6 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedHasKeyboardFocus)(
        IUIAutomationElement6 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsKeyboardFocusable)(
        IUIAutomationElement6 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsEnabled)(
        IUIAutomationElement6 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAutomationId)(
        IUIAutomationElement6 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedClassName)(
        IUIAutomationElement6 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedHelpText)(
        IUIAutomationElement6 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedCulture)(
        IUIAutomationElement6 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsControlElement)(
        IUIAutomationElement6 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsContentElement)(
        IUIAutomationElement6 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsPassword)(
        IUIAutomationElement6 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedNativeWindowHandle)(
        IUIAutomationElement6 *This,
        UIA_HWND *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedItemType)(
        IUIAutomationElement6 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsOffscreen)(
        IUIAutomationElement6 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedOrientation)(
        IUIAutomationElement6 *This,
        enum OrientationType *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedFrameworkId)(
        IUIAutomationElement6 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsRequiredForForm)(
        IUIAutomationElement6 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedItemStatus)(
        IUIAutomationElement6 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedBoundingRectangle)(
        IUIAutomationElement6 *This,
        RECT *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedLabeledBy)(
        IUIAutomationElement6 *This,
        IUIAutomationElement **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAriaRole)(
        IUIAutomationElement6 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAriaProperties)(
        IUIAutomationElement6 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsDataValidForForm)(
        IUIAutomationElement6 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedControllerFor)(
        IUIAutomationElement6 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedDescribedBy)(
        IUIAutomationElement6 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedFlowsTo)(
        IUIAutomationElement6 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedProviderDescription)(
        IUIAutomationElement6 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *GetClickablePoint)(
        IUIAutomationElement6 *This,
        POINT *clickable,
        WINBOOL *gotClickable);

    /*** IUIAutomationElement2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CurrentOptimizeForVisualContent)(
        IUIAutomationElement6 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedOptimizeForVisualContent)(
        IUIAutomationElement6 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentLiveSetting)(
        IUIAutomationElement6 *This,
        enum LiveSetting *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedLiveSetting)(
        IUIAutomationElement6 *This,
        enum LiveSetting *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentFlowsFrom)(
        IUIAutomationElement6 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedFlowsFrom)(
        IUIAutomationElement6 *This,
        IUIAutomationElementArray **retVal);

    /*** IUIAutomationElement3 methods ***/
    HRESULT (STDMETHODCALLTYPE *ShowContextMenu)(
        IUIAutomationElement6 *This);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsPeripheral)(
        IUIAutomationElement6 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsPeripheral)(
        IUIAutomationElement6 *This,
        WINBOOL *retVal);

    /*** IUIAutomationElement4 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CurrentPositionInSet)(
        IUIAutomationElement6 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentSizeOfSet)(
        IUIAutomationElement6 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentLevel)(
        IUIAutomationElement6 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAnnotationTypes)(
        IUIAutomationElement6 *This,
        SAFEARRAY **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAnnotationObjects)(
        IUIAutomationElement6 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedPositionInSet)(
        IUIAutomationElement6 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedSizeOfSet)(
        IUIAutomationElement6 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedLevel)(
        IUIAutomationElement6 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAnnotationTypes)(
        IUIAutomationElement6 *This,
        SAFEARRAY **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAnnotationObjects)(
        IUIAutomationElement6 *This,
        IUIAutomationElementArray **retVal);

    /*** IUIAutomationElement5 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CurrentLandmarkType)(
        IUIAutomationElement6 *This,
        LANDMARKTYPEID *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentLocalizedLandmarkType)(
        IUIAutomationElement6 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedLandmarkType)(
        IUIAutomationElement6 *This,
        LANDMARKTYPEID *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedLocalizedLandmarkType)(
        IUIAutomationElement6 *This,
        BSTR *retVal);

    /*** IUIAutomationElement6 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CurrentFullDescription)(
        IUIAutomationElement6 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedFullDescription)(
        IUIAutomationElement6 *This,
        BSTR *retVal);

    END_INTERFACE
} IUIAutomationElement6Vtbl;

interface IUIAutomationElement6 {
    CONST_VTBL IUIAutomationElement6Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationElement6_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationElement6_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationElement6_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationElement methods ***/
#define IUIAutomationElement6_SetFocus(This) (This)->lpVtbl->SetFocus(This)
#define IUIAutomationElement6_GetRuntimeId(This,runtimeId) (This)->lpVtbl->GetRuntimeId(This,runtimeId)
#define IUIAutomationElement6_FindFirst(This,scope,condition,found) (This)->lpVtbl->FindFirst(This,scope,condition,found)
#define IUIAutomationElement6_FindAll(This,scope,condition,found) (This)->lpVtbl->FindAll(This,scope,condition,found)
#define IUIAutomationElement6_FindFirstBuildCache(This,scope,condition,cacheRequest,found) (This)->lpVtbl->FindFirstBuildCache(This,scope,condition,cacheRequest,found)
#define IUIAutomationElement6_FindAllBuildCache(This,scope,condition,cacheRequest,found) (This)->lpVtbl->FindAllBuildCache(This,scope,condition,cacheRequest,found)
#define IUIAutomationElement6_BuildUpdatedCache(This,cacheRequest,updatedElement) (This)->lpVtbl->BuildUpdatedCache(This,cacheRequest,updatedElement)
#define IUIAutomationElement6_GetCurrentPropertyValue(This,propertyId,retVal) (This)->lpVtbl->GetCurrentPropertyValue(This,propertyId,retVal)
#define IUIAutomationElement6_GetCurrentPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal) (This)->lpVtbl->GetCurrentPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal)
#define IUIAutomationElement6_GetCachedPropertyValue(This,propertyId,retVal) (This)->lpVtbl->GetCachedPropertyValue(This,propertyId,retVal)
#define IUIAutomationElement6_GetCachedPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal) (This)->lpVtbl->GetCachedPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal)
#define IUIAutomationElement6_GetCurrentPatternAs(This,patternId,riid,patternObject) (This)->lpVtbl->GetCurrentPatternAs(This,patternId,riid,patternObject)
#define IUIAutomationElement6_GetCachedPatternAs(This,patternId,riid,patternObject) (This)->lpVtbl->GetCachedPatternAs(This,patternId,riid,patternObject)
#define IUIAutomationElement6_GetCurrentPattern(This,patternId,patternObject) (This)->lpVtbl->GetCurrentPattern(This,patternId,patternObject)
#define IUIAutomationElement6_GetCachedPattern(This,patternId,patternObject) (This)->lpVtbl->GetCachedPattern(This,patternId,patternObject)
#define IUIAutomationElement6_GetCachedParent(This,parent) (This)->lpVtbl->GetCachedParent(This,parent)
#define IUIAutomationElement6_GetCachedChildren(This,children) (This)->lpVtbl->GetCachedChildren(This,children)
#define IUIAutomationElement6_get_CurrentProcessId(This,retVal) (This)->lpVtbl->get_CurrentProcessId(This,retVal)
#define IUIAutomationElement6_get_CurrentControlType(This,retVal) (This)->lpVtbl->get_CurrentControlType(This,retVal)
#define IUIAutomationElement6_get_CurrentLocalizedControlType(This,retVal) (This)->lpVtbl->get_CurrentLocalizedControlType(This,retVal)
#define IUIAutomationElement6_get_CurrentName(This,retVal) (This)->lpVtbl->get_CurrentName(This,retVal)
#define IUIAutomationElement6_get_CurrentAcceleratorKey(This,retVal) (This)->lpVtbl->get_CurrentAcceleratorKey(This,retVal)
#define IUIAutomationElement6_get_CurrentAccessKey(This,retVal) (This)->lpVtbl->get_CurrentAccessKey(This,retVal)
#define IUIAutomationElement6_get_CurrentHasKeyboardFocus(This,retVal) (This)->lpVtbl->get_CurrentHasKeyboardFocus(This,retVal)
#define IUIAutomationElement6_get_CurrentIsKeyboardFocusable(This,retVal) (This)->lpVtbl->get_CurrentIsKeyboardFocusable(This,retVal)
#define IUIAutomationElement6_get_CurrentIsEnabled(This,retVal) (This)->lpVtbl->get_CurrentIsEnabled(This,retVal)
#define IUIAutomationElement6_get_CurrentAutomationId(This,retVal) (This)->lpVtbl->get_CurrentAutomationId(This,retVal)
#define IUIAutomationElement6_get_CurrentClassName(This,retVal) (This)->lpVtbl->get_CurrentClassName(This,retVal)
#define IUIAutomationElement6_get_CurrentHelpText(This,retVal) (This)->lpVtbl->get_CurrentHelpText(This,retVal)
#define IUIAutomationElement6_get_CurrentCulture(This,retVal) (This)->lpVtbl->get_CurrentCulture(This,retVal)
#define IUIAutomationElement6_get_CurrentIsControlElement(This,retVal) (This)->lpVtbl->get_CurrentIsControlElement(This,retVal)
#define IUIAutomationElement6_get_CurrentIsContentElement(This,retVal) (This)->lpVtbl->get_CurrentIsContentElement(This,retVal)
#define IUIAutomationElement6_get_CurrentIsPassword(This,retVal) (This)->lpVtbl->get_CurrentIsPassword(This,retVal)
#define IUIAutomationElement6_get_CurrentNativeWindowHandle(This,retVal) (This)->lpVtbl->get_CurrentNativeWindowHandle(This,retVal)
#define IUIAutomationElement6_get_CurrentItemType(This,retVal) (This)->lpVtbl->get_CurrentItemType(This,retVal)
#define IUIAutomationElement6_get_CurrentIsOffscreen(This,retVal) (This)->lpVtbl->get_CurrentIsOffscreen(This,retVal)
#define IUIAutomationElement6_get_CurrentOrientation(This,retVal) (This)->lpVtbl->get_CurrentOrientation(This,retVal)
#define IUIAutomationElement6_get_CurrentFrameworkId(This,retVal) (This)->lpVtbl->get_CurrentFrameworkId(This,retVal)
#define IUIAutomationElement6_get_CurrentIsRequiredForForm(This,retVal) (This)->lpVtbl->get_CurrentIsRequiredForForm(This,retVal)
#define IUIAutomationElement6_get_CurrentItemStatus(This,retVal) (This)->lpVtbl->get_CurrentItemStatus(This,retVal)
#define IUIAutomationElement6_get_CurrentBoundingRectangle(This,retVal) (This)->lpVtbl->get_CurrentBoundingRectangle(This,retVal)
#define IUIAutomationElement6_get_CurrentLabeledBy(This,retVal) (This)->lpVtbl->get_CurrentLabeledBy(This,retVal)
#define IUIAutomationElement6_get_CurrentAriaRole(This,retVal) (This)->lpVtbl->get_CurrentAriaRole(This,retVal)
#define IUIAutomationElement6_get_CurrentAriaProperties(This,retVal) (This)->lpVtbl->get_CurrentAriaProperties(This,retVal)
#define IUIAutomationElement6_get_CurrentIsDataValidForForm(This,retVal) (This)->lpVtbl->get_CurrentIsDataValidForForm(This,retVal)
#define IUIAutomationElement6_get_CurrentControllerFor(This,retVal) (This)->lpVtbl->get_CurrentControllerFor(This,retVal)
#define IUIAutomationElement6_get_CurrentDescribedBy(This,retVal) (This)->lpVtbl->get_CurrentDescribedBy(This,retVal)
#define IUIAutomationElement6_get_CurrentFlowsTo(This,retVal) (This)->lpVtbl->get_CurrentFlowsTo(This,retVal)
#define IUIAutomationElement6_get_CurrentProviderDescription(This,retVal) (This)->lpVtbl->get_CurrentProviderDescription(This,retVal)
#define IUIAutomationElement6_get_CachedProcessId(This,retVal) (This)->lpVtbl->get_CachedProcessId(This,retVal)
#define IUIAutomationElement6_get_CachedControlType(This,retVal) (This)->lpVtbl->get_CachedControlType(This,retVal)
#define IUIAutomationElement6_get_CachedLocalizedControlType(This,retVal) (This)->lpVtbl->get_CachedLocalizedControlType(This,retVal)
#define IUIAutomationElement6_get_CachedName(This,retVal) (This)->lpVtbl->get_CachedName(This,retVal)
#define IUIAutomationElement6_get_CachedAcceleratorKey(This,retVal) (This)->lpVtbl->get_CachedAcceleratorKey(This,retVal)
#define IUIAutomationElement6_get_CachedAccessKey(This,retVal) (This)->lpVtbl->get_CachedAccessKey(This,retVal)
#define IUIAutomationElement6_get_CachedHasKeyboardFocus(This,retVal) (This)->lpVtbl->get_CachedHasKeyboardFocus(This,retVal)
#define IUIAutomationElement6_get_CachedIsKeyboardFocusable(This,retVal) (This)->lpVtbl->get_CachedIsKeyboardFocusable(This,retVal)
#define IUIAutomationElement6_get_CachedIsEnabled(This,retVal) (This)->lpVtbl->get_CachedIsEnabled(This,retVal)
#define IUIAutomationElement6_get_CachedAutomationId(This,retVal) (This)->lpVtbl->get_CachedAutomationId(This,retVal)
#define IUIAutomationElement6_get_CachedClassName(This,retVal) (This)->lpVtbl->get_CachedClassName(This,retVal)
#define IUIAutomationElement6_get_CachedHelpText(This,retVal) (This)->lpVtbl->get_CachedHelpText(This,retVal)
#define IUIAutomationElement6_get_CachedCulture(This,retVal) (This)->lpVtbl->get_CachedCulture(This,retVal)
#define IUIAutomationElement6_get_CachedIsControlElement(This,retVal) (This)->lpVtbl->get_CachedIsControlElement(This,retVal)
#define IUIAutomationElement6_get_CachedIsContentElement(This,retVal) (This)->lpVtbl->get_CachedIsContentElement(This,retVal)
#define IUIAutomationElement6_get_CachedIsPassword(This,retVal) (This)->lpVtbl->get_CachedIsPassword(This,retVal)
#define IUIAutomationElement6_get_CachedNativeWindowHandle(This,retVal) (This)->lpVtbl->get_CachedNativeWindowHandle(This,retVal)
#define IUIAutomationElement6_get_CachedItemType(This,retVal) (This)->lpVtbl->get_CachedItemType(This,retVal)
#define IUIAutomationElement6_get_CachedIsOffscreen(This,retVal) (This)->lpVtbl->get_CachedIsOffscreen(This,retVal)
#define IUIAutomationElement6_get_CachedOrientation(This,retVal) (This)->lpVtbl->get_CachedOrientation(This,retVal)
#define IUIAutomationElement6_get_CachedFrameworkId(This,retVal) (This)->lpVtbl->get_CachedFrameworkId(This,retVal)
#define IUIAutomationElement6_get_CachedIsRequiredForForm(This,retVal) (This)->lpVtbl->get_CachedIsRequiredForForm(This,retVal)
#define IUIAutomationElement6_get_CachedItemStatus(This,retVal) (This)->lpVtbl->get_CachedItemStatus(This,retVal)
#define IUIAutomationElement6_get_CachedBoundingRectangle(This,retVal) (This)->lpVtbl->get_CachedBoundingRectangle(This,retVal)
#define IUIAutomationElement6_get_CachedLabeledBy(This,retVal) (This)->lpVtbl->get_CachedLabeledBy(This,retVal)
#define IUIAutomationElement6_get_CachedAriaRole(This,retVal) (This)->lpVtbl->get_CachedAriaRole(This,retVal)
#define IUIAutomationElement6_get_CachedAriaProperties(This,retVal) (This)->lpVtbl->get_CachedAriaProperties(This,retVal)
#define IUIAutomationElement6_get_CachedIsDataValidForForm(This,retVal) (This)->lpVtbl->get_CachedIsDataValidForForm(This,retVal)
#define IUIAutomationElement6_get_CachedControllerFor(This,retVal) (This)->lpVtbl->get_CachedControllerFor(This,retVal)
#define IUIAutomationElement6_get_CachedDescribedBy(This,retVal) (This)->lpVtbl->get_CachedDescribedBy(This,retVal)
#define IUIAutomationElement6_get_CachedFlowsTo(This,retVal) (This)->lpVtbl->get_CachedFlowsTo(This,retVal)
#define IUIAutomationElement6_get_CachedProviderDescription(This,retVal) (This)->lpVtbl->get_CachedProviderDescription(This,retVal)
#define IUIAutomationElement6_GetClickablePoint(This,clickable,gotClickable) (This)->lpVtbl->GetClickablePoint(This,clickable,gotClickable)
/*** IUIAutomationElement2 methods ***/
#define IUIAutomationElement6_get_CurrentOptimizeForVisualContent(This,retVal) (This)->lpVtbl->get_CurrentOptimizeForVisualContent(This,retVal)
#define IUIAutomationElement6_get_CachedOptimizeForVisualContent(This,retVal) (This)->lpVtbl->get_CachedOptimizeForVisualContent(This,retVal)
#define IUIAutomationElement6_get_CurrentLiveSetting(This,retVal) (This)->lpVtbl->get_CurrentLiveSetting(This,retVal)
#define IUIAutomationElement6_get_CachedLiveSetting(This,retVal) (This)->lpVtbl->get_CachedLiveSetting(This,retVal)
#define IUIAutomationElement6_get_CurrentFlowsFrom(This,retVal) (This)->lpVtbl->get_CurrentFlowsFrom(This,retVal)
#define IUIAutomationElement6_get_CachedFlowsFrom(This,retVal) (This)->lpVtbl->get_CachedFlowsFrom(This,retVal)
/*** IUIAutomationElement3 methods ***/
#define IUIAutomationElement6_ShowContextMenu(This) (This)->lpVtbl->ShowContextMenu(This)
#define IUIAutomationElement6_get_CurrentIsPeripheral(This,retVal) (This)->lpVtbl->get_CurrentIsPeripheral(This,retVal)
#define IUIAutomationElement6_get_CachedIsPeripheral(This,retVal) (This)->lpVtbl->get_CachedIsPeripheral(This,retVal)
/*** IUIAutomationElement4 methods ***/
#define IUIAutomationElement6_get_CurrentPositionInSet(This,retVal) (This)->lpVtbl->get_CurrentPositionInSet(This,retVal)
#define IUIAutomationElement6_get_CurrentSizeOfSet(This,retVal) (This)->lpVtbl->get_CurrentSizeOfSet(This,retVal)
#define IUIAutomationElement6_get_CurrentLevel(This,retVal) (This)->lpVtbl->get_CurrentLevel(This,retVal)
#define IUIAutomationElement6_get_CurrentAnnotationTypes(This,retVal) (This)->lpVtbl->get_CurrentAnnotationTypes(This,retVal)
#define IUIAutomationElement6_get_CurrentAnnotationObjects(This,retVal) (This)->lpVtbl->get_CurrentAnnotationObjects(This,retVal)
#define IUIAutomationElement6_get_CachedPositionInSet(This,retVal) (This)->lpVtbl->get_CachedPositionInSet(This,retVal)
#define IUIAutomationElement6_get_CachedSizeOfSet(This,retVal) (This)->lpVtbl->get_CachedSizeOfSet(This,retVal)
#define IUIAutomationElement6_get_CachedLevel(This,retVal) (This)->lpVtbl->get_CachedLevel(This,retVal)
#define IUIAutomationElement6_get_CachedAnnotationTypes(This,retVal) (This)->lpVtbl->get_CachedAnnotationTypes(This,retVal)
#define IUIAutomationElement6_get_CachedAnnotationObjects(This,retVal) (This)->lpVtbl->get_CachedAnnotationObjects(This,retVal)
/*** IUIAutomationElement5 methods ***/
#define IUIAutomationElement6_get_CurrentLandmarkType(This,retVal) (This)->lpVtbl->get_CurrentLandmarkType(This,retVal)
#define IUIAutomationElement6_get_CurrentLocalizedLandmarkType(This,retVal) (This)->lpVtbl->get_CurrentLocalizedLandmarkType(This,retVal)
#define IUIAutomationElement6_get_CachedLandmarkType(This,retVal) (This)->lpVtbl->get_CachedLandmarkType(This,retVal)
#define IUIAutomationElement6_get_CachedLocalizedLandmarkType(This,retVal) (This)->lpVtbl->get_CachedLocalizedLandmarkType(This,retVal)
/*** IUIAutomationElement6 methods ***/
#define IUIAutomationElement6_get_CurrentFullDescription(This,retVal) (This)->lpVtbl->get_CurrentFullDescription(This,retVal)
#define IUIAutomationElement6_get_CachedFullDescription(This,retVal) (This)->lpVtbl->get_CachedFullDescription(This,retVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationElement6_QueryInterface(IUIAutomationElement6* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationElement6_AddRef(IUIAutomationElement6* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationElement6_Release(IUIAutomationElement6* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationElement methods ***/
static __WIDL_INLINE HRESULT IUIAutomationElement6_SetFocus(IUIAutomationElement6* This) {
    return This->lpVtbl->SetFocus(This);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_GetRuntimeId(IUIAutomationElement6* This,SAFEARRAY **runtimeId) {
    return This->lpVtbl->GetRuntimeId(This,runtimeId);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_FindFirst(IUIAutomationElement6* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationElement **found) {
    return This->lpVtbl->FindFirst(This,scope,condition,found);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_FindAll(IUIAutomationElement6* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationElementArray **found) {
    return This->lpVtbl->FindAll(This,scope,condition,found);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_FindFirstBuildCache(IUIAutomationElement6* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **found) {
    return This->lpVtbl->FindFirstBuildCache(This,scope,condition,cacheRequest,found);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_FindAllBuildCache(IUIAutomationElement6* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElementArray **found) {
    return This->lpVtbl->FindAllBuildCache(This,scope,condition,cacheRequest,found);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_BuildUpdatedCache(IUIAutomationElement6* This,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **updatedElement) {
    return This->lpVtbl->BuildUpdatedCache(This,cacheRequest,updatedElement);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_GetCurrentPropertyValue(IUIAutomationElement6* This,PROPERTYID propertyId,VARIANT *retVal) {
    return This->lpVtbl->GetCurrentPropertyValue(This,propertyId,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_GetCurrentPropertyValueEx(IUIAutomationElement6* This,PROPERTYID propertyId,WINBOOL ignoreDefaultValue,VARIANT *retVal) {
    return This->lpVtbl->GetCurrentPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_GetCachedPropertyValue(IUIAutomationElement6* This,PROPERTYID propertyId,VARIANT *retVal) {
    return This->lpVtbl->GetCachedPropertyValue(This,propertyId,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_GetCachedPropertyValueEx(IUIAutomationElement6* This,PROPERTYID propertyId,WINBOOL ignoreDefaultValue,VARIANT *retVal) {
    return This->lpVtbl->GetCachedPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_GetCurrentPatternAs(IUIAutomationElement6* This,PATTERNID patternId,REFIID riid,void **patternObject) {
    return This->lpVtbl->GetCurrentPatternAs(This,patternId,riid,patternObject);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_GetCachedPatternAs(IUIAutomationElement6* This,PATTERNID patternId,REFIID riid,void **patternObject) {
    return This->lpVtbl->GetCachedPatternAs(This,patternId,riid,patternObject);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_GetCurrentPattern(IUIAutomationElement6* This,PATTERNID patternId,IUnknown **patternObject) {
    return This->lpVtbl->GetCurrentPattern(This,patternId,patternObject);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_GetCachedPattern(IUIAutomationElement6* This,PATTERNID patternId,IUnknown **patternObject) {
    return This->lpVtbl->GetCachedPattern(This,patternId,patternObject);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_GetCachedParent(IUIAutomationElement6* This,IUIAutomationElement **parent) {
    return This->lpVtbl->GetCachedParent(This,parent);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_GetCachedChildren(IUIAutomationElement6* This,IUIAutomationElementArray **children) {
    return This->lpVtbl->GetCachedChildren(This,children);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CurrentProcessId(IUIAutomationElement6* This,int *retVal) {
    return This->lpVtbl->get_CurrentProcessId(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CurrentControlType(IUIAutomationElement6* This,CONTROLTYPEID *retVal) {
    return This->lpVtbl->get_CurrentControlType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CurrentLocalizedControlType(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentLocalizedControlType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CurrentName(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentName(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CurrentAcceleratorKey(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAcceleratorKey(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CurrentAccessKey(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAccessKey(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CurrentHasKeyboardFocus(IUIAutomationElement6* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentHasKeyboardFocus(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CurrentIsKeyboardFocusable(IUIAutomationElement6* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsKeyboardFocusable(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CurrentIsEnabled(IUIAutomationElement6* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsEnabled(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CurrentAutomationId(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAutomationId(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CurrentClassName(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentClassName(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CurrentHelpText(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentHelpText(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CurrentCulture(IUIAutomationElement6* This,int *retVal) {
    return This->lpVtbl->get_CurrentCulture(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CurrentIsControlElement(IUIAutomationElement6* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsControlElement(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CurrentIsContentElement(IUIAutomationElement6* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsContentElement(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CurrentIsPassword(IUIAutomationElement6* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsPassword(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CurrentNativeWindowHandle(IUIAutomationElement6* This,UIA_HWND *retVal) {
    return This->lpVtbl->get_CurrentNativeWindowHandle(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CurrentItemType(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentItemType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CurrentIsOffscreen(IUIAutomationElement6* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsOffscreen(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CurrentOrientation(IUIAutomationElement6* This,enum OrientationType *retVal) {
    return This->lpVtbl->get_CurrentOrientation(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CurrentFrameworkId(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentFrameworkId(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CurrentIsRequiredForForm(IUIAutomationElement6* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsRequiredForForm(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CurrentItemStatus(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentItemStatus(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CurrentBoundingRectangle(IUIAutomationElement6* This,RECT *retVal) {
    return This->lpVtbl->get_CurrentBoundingRectangle(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CurrentLabeledBy(IUIAutomationElement6* This,IUIAutomationElement **retVal) {
    return This->lpVtbl->get_CurrentLabeledBy(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CurrentAriaRole(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAriaRole(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CurrentAriaProperties(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAriaProperties(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CurrentIsDataValidForForm(IUIAutomationElement6* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsDataValidForForm(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CurrentControllerFor(IUIAutomationElement6* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentControllerFor(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CurrentDescribedBy(IUIAutomationElement6* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentDescribedBy(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CurrentFlowsTo(IUIAutomationElement6* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentFlowsTo(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CurrentProviderDescription(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentProviderDescription(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CachedProcessId(IUIAutomationElement6* This,int *retVal) {
    return This->lpVtbl->get_CachedProcessId(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CachedControlType(IUIAutomationElement6* This,CONTROLTYPEID *retVal) {
    return This->lpVtbl->get_CachedControlType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CachedLocalizedControlType(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedLocalizedControlType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CachedName(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedName(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CachedAcceleratorKey(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAcceleratorKey(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CachedAccessKey(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAccessKey(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CachedHasKeyboardFocus(IUIAutomationElement6* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedHasKeyboardFocus(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CachedIsKeyboardFocusable(IUIAutomationElement6* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsKeyboardFocusable(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CachedIsEnabled(IUIAutomationElement6* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsEnabled(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CachedAutomationId(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAutomationId(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CachedClassName(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedClassName(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CachedHelpText(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedHelpText(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CachedCulture(IUIAutomationElement6* This,int *retVal) {
    return This->lpVtbl->get_CachedCulture(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CachedIsControlElement(IUIAutomationElement6* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsControlElement(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CachedIsContentElement(IUIAutomationElement6* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsContentElement(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CachedIsPassword(IUIAutomationElement6* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsPassword(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CachedNativeWindowHandle(IUIAutomationElement6* This,UIA_HWND *retVal) {
    return This->lpVtbl->get_CachedNativeWindowHandle(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CachedItemType(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedItemType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CachedIsOffscreen(IUIAutomationElement6* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsOffscreen(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CachedOrientation(IUIAutomationElement6* This,enum OrientationType *retVal) {
    return This->lpVtbl->get_CachedOrientation(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CachedFrameworkId(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedFrameworkId(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CachedIsRequiredForForm(IUIAutomationElement6* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsRequiredForForm(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CachedItemStatus(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedItemStatus(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CachedBoundingRectangle(IUIAutomationElement6* This,RECT *retVal) {
    return This->lpVtbl->get_CachedBoundingRectangle(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CachedLabeledBy(IUIAutomationElement6* This,IUIAutomationElement **retVal) {
    return This->lpVtbl->get_CachedLabeledBy(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CachedAriaRole(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAriaRole(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CachedAriaProperties(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAriaProperties(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CachedIsDataValidForForm(IUIAutomationElement6* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsDataValidForForm(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CachedControllerFor(IUIAutomationElement6* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedControllerFor(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CachedDescribedBy(IUIAutomationElement6* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedDescribedBy(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CachedFlowsTo(IUIAutomationElement6* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedFlowsTo(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CachedProviderDescription(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedProviderDescription(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_GetClickablePoint(IUIAutomationElement6* This,POINT *clickable,WINBOOL *gotClickable) {
    return This->lpVtbl->GetClickablePoint(This,clickable,gotClickable);
}
/*** IUIAutomationElement2 methods ***/
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CurrentOptimizeForVisualContent(IUIAutomationElement6* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentOptimizeForVisualContent(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CachedOptimizeForVisualContent(IUIAutomationElement6* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedOptimizeForVisualContent(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CurrentLiveSetting(IUIAutomationElement6* This,enum LiveSetting *retVal) {
    return This->lpVtbl->get_CurrentLiveSetting(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CachedLiveSetting(IUIAutomationElement6* This,enum LiveSetting *retVal) {
    return This->lpVtbl->get_CachedLiveSetting(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CurrentFlowsFrom(IUIAutomationElement6* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentFlowsFrom(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CachedFlowsFrom(IUIAutomationElement6* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedFlowsFrom(This,retVal);
}
/*** IUIAutomationElement3 methods ***/
static __WIDL_INLINE HRESULT IUIAutomationElement6_ShowContextMenu(IUIAutomationElement6* This) {
    return This->lpVtbl->ShowContextMenu(This);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CurrentIsPeripheral(IUIAutomationElement6* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsPeripheral(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CachedIsPeripheral(IUIAutomationElement6* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsPeripheral(This,retVal);
}
/*** IUIAutomationElement4 methods ***/
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CurrentPositionInSet(IUIAutomationElement6* This,int *retVal) {
    return This->lpVtbl->get_CurrentPositionInSet(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CurrentSizeOfSet(IUIAutomationElement6* This,int *retVal) {
    return This->lpVtbl->get_CurrentSizeOfSet(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CurrentLevel(IUIAutomationElement6* This,int *retVal) {
    return This->lpVtbl->get_CurrentLevel(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CurrentAnnotationTypes(IUIAutomationElement6* This,SAFEARRAY **retVal) {
    return This->lpVtbl->get_CurrentAnnotationTypes(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CurrentAnnotationObjects(IUIAutomationElement6* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentAnnotationObjects(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CachedPositionInSet(IUIAutomationElement6* This,int *retVal) {
    return This->lpVtbl->get_CachedPositionInSet(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CachedSizeOfSet(IUIAutomationElement6* This,int *retVal) {
    return This->lpVtbl->get_CachedSizeOfSet(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CachedLevel(IUIAutomationElement6* This,int *retVal) {
    return This->lpVtbl->get_CachedLevel(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CachedAnnotationTypes(IUIAutomationElement6* This,SAFEARRAY **retVal) {
    return This->lpVtbl->get_CachedAnnotationTypes(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CachedAnnotationObjects(IUIAutomationElement6* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedAnnotationObjects(This,retVal);
}
/*** IUIAutomationElement5 methods ***/
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CurrentLandmarkType(IUIAutomationElement6* This,LANDMARKTYPEID *retVal) {
    return This->lpVtbl->get_CurrentLandmarkType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CurrentLocalizedLandmarkType(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentLocalizedLandmarkType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CachedLandmarkType(IUIAutomationElement6* This,LANDMARKTYPEID *retVal) {
    return This->lpVtbl->get_CachedLandmarkType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CachedLocalizedLandmarkType(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedLocalizedLandmarkType(This,retVal);
}
/*** IUIAutomationElement6 methods ***/
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CurrentFullDescription(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentFullDescription(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement6_get_CachedFullDescription(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedFullDescription(This,retVal);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationElement6_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationElement7 interface
 */
#ifndef __IUIAutomationElement7_INTERFACE_DEFINED__
#define __IUIAutomationElement7_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationElement7, 0x204e8572, 0xcfc3, 0x4c11, 0xb0,0xc8, 0x7d,0xa7,0x42,0x07,0x50,0xb7);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("204e8572-cfc3-4c11-b0c8-7da7420750b7")
IUIAutomationElement7 : public IUIAutomationElement6
{
    virtual HRESULT STDMETHODCALLTYPE FindFirstWithOptions(
        enum TreeScope scope,
        IUIAutomationCondition *condition,
        enum TreeTraversalOptions traversalOptions,
        IUIAutomationElement *root,
        IUIAutomationElement **found) = 0;

    virtual HRESULT STDMETHODCALLTYPE FindAllWithOptions(
        enum TreeScope scope,
        IUIAutomationCondition *condition,
        enum TreeTraversalOptions traversalOptions,
        IUIAutomationElement *root,
        IUIAutomationElementArray **found) = 0;

    virtual HRESULT STDMETHODCALLTYPE FindFirstWithOptionsBuildCache(
        enum TreeScope scope,
        IUIAutomationCondition *condition,
        IUIAutomationCacheRequest *cacheRequest,
        enum TreeTraversalOptions traversalOptions,
        IUIAutomationElement *root,
        IUIAutomationElement **found) = 0;

    virtual HRESULT STDMETHODCALLTYPE FindAllWithOptionsBuildCache(
        enum TreeScope scope,
        IUIAutomationCondition *condition,
        IUIAutomationCacheRequest *cacheRequest,
        enum TreeTraversalOptions traversalOptions,
        IUIAutomationElement *root,
        IUIAutomationElementArray **found) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrentMetadataValue(
        int targetId,
        METADATAID metadataId,
        VARIANT *returnVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationElement7, 0x204e8572, 0xcfc3, 0x4c11, 0xb0,0xc8, 0x7d,0xa7,0x42,0x07,0x50,0xb7)
#endif
#else
typedef struct IUIAutomationElement7Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomationElement methods ***/
    HRESULT (STDMETHODCALLTYPE *SetFocus)(
        IUIAutomationElement7 *This);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeId)(
        IUIAutomationElement7 *This,
        SAFEARRAY **runtimeId);

    HRESULT (STDMETHODCALLTYPE *FindFirst)(
        IUIAutomationElement7 *This,
        enum TreeScope scope,
        IUIAutomationCondition *condition,
        IUIAutomationElement **found);

    HRESULT (STDMETHODCALLTYPE *FindAll)(
        IUIAutomationElement7 *This,
        enum TreeScope scope,
        IUIAutomationCondition *condition,
        IUIAutomationElementArray **found);

    HRESULT (STDMETHODCALLTYPE *FindFirstBuildCache)(
        IUIAutomationElement7 *This,
        enum TreeScope scope,
        IUIAutomationCondition *condition,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **found);

    HRESULT (STDMETHODCALLTYPE *FindAllBuildCache)(
        IUIAutomationElement7 *This,
        enum TreeScope scope,
        IUIAutomationCondition *condition,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElementArray **found);

    HRESULT (STDMETHODCALLTYPE *BuildUpdatedCache)(
        IUIAutomationElement7 *This,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **updatedElement);

    HRESULT (STDMETHODCALLTYPE *GetCurrentPropertyValue)(
        IUIAutomationElement7 *This,
        PROPERTYID propertyId,
        VARIANT *retVal);

    HRESULT (STDMETHODCALLTYPE *GetCurrentPropertyValueEx)(
        IUIAutomationElement7 *This,
        PROPERTYID propertyId,
        WINBOOL ignoreDefaultValue,
        VARIANT *retVal);

    HRESULT (STDMETHODCALLTYPE *GetCachedPropertyValue)(
        IUIAutomationElement7 *This,
        PROPERTYID propertyId,
        VARIANT *retVal);

    HRESULT (STDMETHODCALLTYPE *GetCachedPropertyValueEx)(
        IUIAutomationElement7 *This,
        PROPERTYID propertyId,
        WINBOOL ignoreDefaultValue,
        VARIANT *retVal);

    HRESULT (STDMETHODCALLTYPE *GetCurrentPatternAs)(
        IUIAutomationElement7 *This,
        PATTERNID patternId,
        REFIID riid,
        void **patternObject);

    HRESULT (STDMETHODCALLTYPE *GetCachedPatternAs)(
        IUIAutomationElement7 *This,
        PATTERNID patternId,
        REFIID riid,
        void **patternObject);

    HRESULT (STDMETHODCALLTYPE *GetCurrentPattern)(
        IUIAutomationElement7 *This,
        PATTERNID patternId,
        IUnknown **patternObject);

    HRESULT (STDMETHODCALLTYPE *GetCachedPattern)(
        IUIAutomationElement7 *This,
        PATTERNID patternId,
        IUnknown **patternObject);

    HRESULT (STDMETHODCALLTYPE *GetCachedParent)(
        IUIAutomationElement7 *This,
        IUIAutomationElement **parent);

    HRESULT (STDMETHODCALLTYPE *GetCachedChildren)(
        IUIAutomationElement7 *This,
        IUIAutomationElementArray **children);

    HRESULT (STDMETHODCALLTYPE *get_CurrentProcessId)(
        IUIAutomationElement7 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentControlType)(
        IUIAutomationElement7 *This,
        CONTROLTYPEID *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentLocalizedControlType)(
        IUIAutomationElement7 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentName)(
        IUIAutomationElement7 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAcceleratorKey)(
        IUIAutomationElement7 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAccessKey)(
        IUIAutomationElement7 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentHasKeyboardFocus)(
        IUIAutomationElement7 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsKeyboardFocusable)(
        IUIAutomationElement7 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsEnabled)(
        IUIAutomationElement7 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAutomationId)(
        IUIAutomationElement7 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentClassName)(
        IUIAutomationElement7 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentHelpText)(
        IUIAutomationElement7 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentCulture)(
        IUIAutomationElement7 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsControlElement)(
        IUIAutomationElement7 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsContentElement)(
        IUIAutomationElement7 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsPassword)(
        IUIAutomationElement7 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentNativeWindowHandle)(
        IUIAutomationElement7 *This,
        UIA_HWND *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentItemType)(
        IUIAutomationElement7 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsOffscreen)(
        IUIAutomationElement7 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentOrientation)(
        IUIAutomationElement7 *This,
        enum OrientationType *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentFrameworkId)(
        IUIAutomationElement7 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsRequiredForForm)(
        IUIAutomationElement7 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentItemStatus)(
        IUIAutomationElement7 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentBoundingRectangle)(
        IUIAutomationElement7 *This,
        RECT *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentLabeledBy)(
        IUIAutomationElement7 *This,
        IUIAutomationElement **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAriaRole)(
        IUIAutomationElement7 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAriaProperties)(
        IUIAutomationElement7 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsDataValidForForm)(
        IUIAutomationElement7 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentControllerFor)(
        IUIAutomationElement7 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentDescribedBy)(
        IUIAutomationElement7 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentFlowsTo)(
        IUIAutomationElement7 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentProviderDescription)(
        IUIAutomationElement7 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedProcessId)(
        IUIAutomationElement7 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedControlType)(
        IUIAutomationElement7 *This,
        CONTROLTYPEID *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedLocalizedControlType)(
        IUIAutomationElement7 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedName)(
        IUIAutomationElement7 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAcceleratorKey)(
        IUIAutomationElement7 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAccessKey)(
        IUIAutomationElement7 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedHasKeyboardFocus)(
        IUIAutomationElement7 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsKeyboardFocusable)(
        IUIAutomationElement7 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsEnabled)(
        IUIAutomationElement7 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAutomationId)(
        IUIAutomationElement7 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedClassName)(
        IUIAutomationElement7 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedHelpText)(
        IUIAutomationElement7 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedCulture)(
        IUIAutomationElement7 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsControlElement)(
        IUIAutomationElement7 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsContentElement)(
        IUIAutomationElement7 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsPassword)(
        IUIAutomationElement7 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedNativeWindowHandle)(
        IUIAutomationElement7 *This,
        UIA_HWND *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedItemType)(
        IUIAutomationElement7 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsOffscreen)(
        IUIAutomationElement7 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedOrientation)(
        IUIAutomationElement7 *This,
        enum OrientationType *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedFrameworkId)(
        IUIAutomationElement7 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsRequiredForForm)(
        IUIAutomationElement7 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedItemStatus)(
        IUIAutomationElement7 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedBoundingRectangle)(
        IUIAutomationElement7 *This,
        RECT *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedLabeledBy)(
        IUIAutomationElement7 *This,
        IUIAutomationElement **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAriaRole)(
        IUIAutomationElement7 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAriaProperties)(
        IUIAutomationElement7 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsDataValidForForm)(
        IUIAutomationElement7 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedControllerFor)(
        IUIAutomationElement7 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedDescribedBy)(
        IUIAutomationElement7 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedFlowsTo)(
        IUIAutomationElement7 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedProviderDescription)(
        IUIAutomationElement7 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *GetClickablePoint)(
        IUIAutomationElement7 *This,
        POINT *clickable,
        WINBOOL *gotClickable);

    /*** IUIAutomationElement2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CurrentOptimizeForVisualContent)(
        IUIAutomationElement7 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedOptimizeForVisualContent)(
        IUIAutomationElement7 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentLiveSetting)(
        IUIAutomationElement7 *This,
        enum LiveSetting *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedLiveSetting)(
        IUIAutomationElement7 *This,
        enum LiveSetting *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentFlowsFrom)(
        IUIAutomationElement7 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedFlowsFrom)(
        IUIAutomationElement7 *This,
        IUIAutomationElementArray **retVal);

    /*** IUIAutomationElement3 methods ***/
    HRESULT (STDMETHODCALLTYPE *ShowContextMenu)(
        IUIAutomationElement7 *This);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsPeripheral)(
        IUIAutomationElement7 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsPeripheral)(
        IUIAutomationElement7 *This,
        WINBOOL *retVal);

    /*** IUIAutomationElement4 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CurrentPositionInSet)(
        IUIAutomationElement7 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentSizeOfSet)(
        IUIAutomationElement7 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentLevel)(
        IUIAutomationElement7 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAnnotationTypes)(
        IUIAutomationElement7 *This,
        SAFEARRAY **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAnnotationObjects)(
        IUIAutomationElement7 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedPositionInSet)(
        IUIAutomationElement7 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedSizeOfSet)(
        IUIAutomationElement7 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedLevel)(
        IUIAutomationElement7 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAnnotationTypes)(
        IUIAutomationElement7 *This,
        SAFEARRAY **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAnnotationObjects)(
        IUIAutomationElement7 *This,
        IUIAutomationElementArray **retVal);

    /*** IUIAutomationElement5 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CurrentLandmarkType)(
        IUIAutomationElement7 *This,
        LANDMARKTYPEID *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentLocalizedLandmarkType)(
        IUIAutomationElement7 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedLandmarkType)(
        IUIAutomationElement7 *This,
        LANDMARKTYPEID *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedLocalizedLandmarkType)(
        IUIAutomationElement7 *This,
        BSTR *retVal);

    /*** IUIAutomationElement6 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CurrentFullDescription)(
        IUIAutomationElement7 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedFullDescription)(
        IUIAutomationElement7 *This,
        BSTR *retVal);

    /*** IUIAutomationElement7 methods ***/
    HRESULT (STDMETHODCALLTYPE *FindFirstWithOptions)(
        IUIAutomationElement7 *This,
        enum TreeScope scope,
        IUIAutomationCondition *condition,
        enum TreeTraversalOptions traversalOptions,
        IUIAutomationElement *root,
        IUIAutomationElement **found);

    HRESULT (STDMETHODCALLTYPE *FindAllWithOptions)(
        IUIAutomationElement7 *This,
        enum TreeScope scope,
        IUIAutomationCondition *condition,
        enum TreeTraversalOptions traversalOptions,
        IUIAutomationElement *root,
        IUIAutomationElementArray **found);

    HRESULT (STDMETHODCALLTYPE *FindFirstWithOptionsBuildCache)(
        IUIAutomationElement7 *This,
        enum TreeScope scope,
        IUIAutomationCondition *condition,
        IUIAutomationCacheRequest *cacheRequest,
        enum TreeTraversalOptions traversalOptions,
        IUIAutomationElement *root,
        IUIAutomationElement **found);

    HRESULT (STDMETHODCALLTYPE *FindAllWithOptionsBuildCache)(
        IUIAutomationElement7 *This,
        enum TreeScope scope,
        IUIAutomationCondition *condition,
        IUIAutomationCacheRequest *cacheRequest,
        enum TreeTraversalOptions traversalOptions,
        IUIAutomationElement *root,
        IUIAutomationElementArray **found);

    HRESULT (STDMETHODCALLTYPE *GetCurrentMetadataValue)(
        IUIAutomationElement7 *This,
        int targetId,
        METADATAID metadataId,
        VARIANT *returnVal);

    END_INTERFACE
} IUIAutomationElement7Vtbl;

interface IUIAutomationElement7 {
    CONST_VTBL IUIAutomationElement7Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationElement7_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationElement7_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationElement7_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationElement methods ***/
#define IUIAutomationElement7_SetFocus(This) (This)->lpVtbl->SetFocus(This)
#define IUIAutomationElement7_GetRuntimeId(This,runtimeId) (This)->lpVtbl->GetRuntimeId(This,runtimeId)
#define IUIAutomationElement7_FindFirst(This,scope,condition,found) (This)->lpVtbl->FindFirst(This,scope,condition,found)
#define IUIAutomationElement7_FindAll(This,scope,condition,found) (This)->lpVtbl->FindAll(This,scope,condition,found)
#define IUIAutomationElement7_FindFirstBuildCache(This,scope,condition,cacheRequest,found) (This)->lpVtbl->FindFirstBuildCache(This,scope,condition,cacheRequest,found)
#define IUIAutomationElement7_FindAllBuildCache(This,scope,condition,cacheRequest,found) (This)->lpVtbl->FindAllBuildCache(This,scope,condition,cacheRequest,found)
#define IUIAutomationElement7_BuildUpdatedCache(This,cacheRequest,updatedElement) (This)->lpVtbl->BuildUpdatedCache(This,cacheRequest,updatedElement)
#define IUIAutomationElement7_GetCurrentPropertyValue(This,propertyId,retVal) (This)->lpVtbl->GetCurrentPropertyValue(This,propertyId,retVal)
#define IUIAutomationElement7_GetCurrentPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal) (This)->lpVtbl->GetCurrentPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal)
#define IUIAutomationElement7_GetCachedPropertyValue(This,propertyId,retVal) (This)->lpVtbl->GetCachedPropertyValue(This,propertyId,retVal)
#define IUIAutomationElement7_GetCachedPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal) (This)->lpVtbl->GetCachedPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal)
#define IUIAutomationElement7_GetCurrentPatternAs(This,patternId,riid,patternObject) (This)->lpVtbl->GetCurrentPatternAs(This,patternId,riid,patternObject)
#define IUIAutomationElement7_GetCachedPatternAs(This,patternId,riid,patternObject) (This)->lpVtbl->GetCachedPatternAs(This,patternId,riid,patternObject)
#define IUIAutomationElement7_GetCurrentPattern(This,patternId,patternObject) (This)->lpVtbl->GetCurrentPattern(This,patternId,patternObject)
#define IUIAutomationElement7_GetCachedPattern(This,patternId,patternObject) (This)->lpVtbl->GetCachedPattern(This,patternId,patternObject)
#define IUIAutomationElement7_GetCachedParent(This,parent) (This)->lpVtbl->GetCachedParent(This,parent)
#define IUIAutomationElement7_GetCachedChildren(This,children) (This)->lpVtbl->GetCachedChildren(This,children)
#define IUIAutomationElement7_get_CurrentProcessId(This,retVal) (This)->lpVtbl->get_CurrentProcessId(This,retVal)
#define IUIAutomationElement7_get_CurrentControlType(This,retVal) (This)->lpVtbl->get_CurrentControlType(This,retVal)
#define IUIAutomationElement7_get_CurrentLocalizedControlType(This,retVal) (This)->lpVtbl->get_CurrentLocalizedControlType(This,retVal)
#define IUIAutomationElement7_get_CurrentName(This,retVal) (This)->lpVtbl->get_CurrentName(This,retVal)
#define IUIAutomationElement7_get_CurrentAcceleratorKey(This,retVal) (This)->lpVtbl->get_CurrentAcceleratorKey(This,retVal)
#define IUIAutomationElement7_get_CurrentAccessKey(This,retVal) (This)->lpVtbl->get_CurrentAccessKey(This,retVal)
#define IUIAutomationElement7_get_CurrentHasKeyboardFocus(This,retVal) (This)->lpVtbl->get_CurrentHasKeyboardFocus(This,retVal)
#define IUIAutomationElement7_get_CurrentIsKeyboardFocusable(This,retVal) (This)->lpVtbl->get_CurrentIsKeyboardFocusable(This,retVal)
#define IUIAutomationElement7_get_CurrentIsEnabled(This,retVal) (This)->lpVtbl->get_CurrentIsEnabled(This,retVal)
#define IUIAutomationElement7_get_CurrentAutomationId(This,retVal) (This)->lpVtbl->get_CurrentAutomationId(This,retVal)
#define IUIAutomationElement7_get_CurrentClassName(This,retVal) (This)->lpVtbl->get_CurrentClassName(This,retVal)
#define IUIAutomationElement7_get_CurrentHelpText(This,retVal) (This)->lpVtbl->get_CurrentHelpText(This,retVal)
#define IUIAutomationElement7_get_CurrentCulture(This,retVal) (This)->lpVtbl->get_CurrentCulture(This,retVal)
#define IUIAutomationElement7_get_CurrentIsControlElement(This,retVal) (This)->lpVtbl->get_CurrentIsControlElement(This,retVal)
#define IUIAutomationElement7_get_CurrentIsContentElement(This,retVal) (This)->lpVtbl->get_CurrentIsContentElement(This,retVal)
#define IUIAutomationElement7_get_CurrentIsPassword(This,retVal) (This)->lpVtbl->get_CurrentIsPassword(This,retVal)
#define IUIAutomationElement7_get_CurrentNativeWindowHandle(This,retVal) (This)->lpVtbl->get_CurrentNativeWindowHandle(This,retVal)
#define IUIAutomationElement7_get_CurrentItemType(This,retVal) (This)->lpVtbl->get_CurrentItemType(This,retVal)
#define IUIAutomationElement7_get_CurrentIsOffscreen(This,retVal) (This)->lpVtbl->get_CurrentIsOffscreen(This,retVal)
#define IUIAutomationElement7_get_CurrentOrientation(This,retVal) (This)->lpVtbl->get_CurrentOrientation(This,retVal)
#define IUIAutomationElement7_get_CurrentFrameworkId(This,retVal) (This)->lpVtbl->get_CurrentFrameworkId(This,retVal)
#define IUIAutomationElement7_get_CurrentIsRequiredForForm(This,retVal) (This)->lpVtbl->get_CurrentIsRequiredForForm(This,retVal)
#define IUIAutomationElement7_get_CurrentItemStatus(This,retVal) (This)->lpVtbl->get_CurrentItemStatus(This,retVal)
#define IUIAutomationElement7_get_CurrentBoundingRectangle(This,retVal) (This)->lpVtbl->get_CurrentBoundingRectangle(This,retVal)
#define IUIAutomationElement7_get_CurrentLabeledBy(This,retVal) (This)->lpVtbl->get_CurrentLabeledBy(This,retVal)
#define IUIAutomationElement7_get_CurrentAriaRole(This,retVal) (This)->lpVtbl->get_CurrentAriaRole(This,retVal)
#define IUIAutomationElement7_get_CurrentAriaProperties(This,retVal) (This)->lpVtbl->get_CurrentAriaProperties(This,retVal)
#define IUIAutomationElement7_get_CurrentIsDataValidForForm(This,retVal) (This)->lpVtbl->get_CurrentIsDataValidForForm(This,retVal)
#define IUIAutomationElement7_get_CurrentControllerFor(This,retVal) (This)->lpVtbl->get_CurrentControllerFor(This,retVal)
#define IUIAutomationElement7_get_CurrentDescribedBy(This,retVal) (This)->lpVtbl->get_CurrentDescribedBy(This,retVal)
#define IUIAutomationElement7_get_CurrentFlowsTo(This,retVal) (This)->lpVtbl->get_CurrentFlowsTo(This,retVal)
#define IUIAutomationElement7_get_CurrentProviderDescription(This,retVal) (This)->lpVtbl->get_CurrentProviderDescription(This,retVal)
#define IUIAutomationElement7_get_CachedProcessId(This,retVal) (This)->lpVtbl->get_CachedProcessId(This,retVal)
#define IUIAutomationElement7_get_CachedControlType(This,retVal) (This)->lpVtbl->get_CachedControlType(This,retVal)
#define IUIAutomationElement7_get_CachedLocalizedControlType(This,retVal) (This)->lpVtbl->get_CachedLocalizedControlType(This,retVal)
#define IUIAutomationElement7_get_CachedName(This,retVal) (This)->lpVtbl->get_CachedName(This,retVal)
#define IUIAutomationElement7_get_CachedAcceleratorKey(This,retVal) (This)->lpVtbl->get_CachedAcceleratorKey(This,retVal)
#define IUIAutomationElement7_get_CachedAccessKey(This,retVal) (This)->lpVtbl->get_CachedAccessKey(This,retVal)
#define IUIAutomationElement7_get_CachedHasKeyboardFocus(This,retVal) (This)->lpVtbl->get_CachedHasKeyboardFocus(This,retVal)
#define IUIAutomationElement7_get_CachedIsKeyboardFocusable(This,retVal) (This)->lpVtbl->get_CachedIsKeyboardFocusable(This,retVal)
#define IUIAutomationElement7_get_CachedIsEnabled(This,retVal) (This)->lpVtbl->get_CachedIsEnabled(This,retVal)
#define IUIAutomationElement7_get_CachedAutomationId(This,retVal) (This)->lpVtbl->get_CachedAutomationId(This,retVal)
#define IUIAutomationElement7_get_CachedClassName(This,retVal) (This)->lpVtbl->get_CachedClassName(This,retVal)
#define IUIAutomationElement7_get_CachedHelpText(This,retVal) (This)->lpVtbl->get_CachedHelpText(This,retVal)
#define IUIAutomationElement7_get_CachedCulture(This,retVal) (This)->lpVtbl->get_CachedCulture(This,retVal)
#define IUIAutomationElement7_get_CachedIsControlElement(This,retVal) (This)->lpVtbl->get_CachedIsControlElement(This,retVal)
#define IUIAutomationElement7_get_CachedIsContentElement(This,retVal) (This)->lpVtbl->get_CachedIsContentElement(This,retVal)
#define IUIAutomationElement7_get_CachedIsPassword(This,retVal) (This)->lpVtbl->get_CachedIsPassword(This,retVal)
#define IUIAutomationElement7_get_CachedNativeWindowHandle(This,retVal) (This)->lpVtbl->get_CachedNativeWindowHandle(This,retVal)
#define IUIAutomationElement7_get_CachedItemType(This,retVal) (This)->lpVtbl->get_CachedItemType(This,retVal)
#define IUIAutomationElement7_get_CachedIsOffscreen(This,retVal) (This)->lpVtbl->get_CachedIsOffscreen(This,retVal)
#define IUIAutomationElement7_get_CachedOrientation(This,retVal) (This)->lpVtbl->get_CachedOrientation(This,retVal)
#define IUIAutomationElement7_get_CachedFrameworkId(This,retVal) (This)->lpVtbl->get_CachedFrameworkId(This,retVal)
#define IUIAutomationElement7_get_CachedIsRequiredForForm(This,retVal) (This)->lpVtbl->get_CachedIsRequiredForForm(This,retVal)
#define IUIAutomationElement7_get_CachedItemStatus(This,retVal) (This)->lpVtbl->get_CachedItemStatus(This,retVal)
#define IUIAutomationElement7_get_CachedBoundingRectangle(This,retVal) (This)->lpVtbl->get_CachedBoundingRectangle(This,retVal)
#define IUIAutomationElement7_get_CachedLabeledBy(This,retVal) (This)->lpVtbl->get_CachedLabeledBy(This,retVal)
#define IUIAutomationElement7_get_CachedAriaRole(This,retVal) (This)->lpVtbl->get_CachedAriaRole(This,retVal)
#define IUIAutomationElement7_get_CachedAriaProperties(This,retVal) (This)->lpVtbl->get_CachedAriaProperties(This,retVal)
#define IUIAutomationElement7_get_CachedIsDataValidForForm(This,retVal) (This)->lpVtbl->get_CachedIsDataValidForForm(This,retVal)
#define IUIAutomationElement7_get_CachedControllerFor(This,retVal) (This)->lpVtbl->get_CachedControllerFor(This,retVal)
#define IUIAutomationElement7_get_CachedDescribedBy(This,retVal) (This)->lpVtbl->get_CachedDescribedBy(This,retVal)
#define IUIAutomationElement7_get_CachedFlowsTo(This,retVal) (This)->lpVtbl->get_CachedFlowsTo(This,retVal)
#define IUIAutomationElement7_get_CachedProviderDescription(This,retVal) (This)->lpVtbl->get_CachedProviderDescription(This,retVal)
#define IUIAutomationElement7_GetClickablePoint(This,clickable,gotClickable) (This)->lpVtbl->GetClickablePoint(This,clickable,gotClickable)
/*** IUIAutomationElement2 methods ***/
#define IUIAutomationElement7_get_CurrentOptimizeForVisualContent(This,retVal) (This)->lpVtbl->get_CurrentOptimizeForVisualContent(This,retVal)
#define IUIAutomationElement7_get_CachedOptimizeForVisualContent(This,retVal) (This)->lpVtbl->get_CachedOptimizeForVisualContent(This,retVal)
#define IUIAutomationElement7_get_CurrentLiveSetting(This,retVal) (This)->lpVtbl->get_CurrentLiveSetting(This,retVal)
#define IUIAutomationElement7_get_CachedLiveSetting(This,retVal) (This)->lpVtbl->get_CachedLiveSetting(This,retVal)
#define IUIAutomationElement7_get_CurrentFlowsFrom(This,retVal) (This)->lpVtbl->get_CurrentFlowsFrom(This,retVal)
#define IUIAutomationElement7_get_CachedFlowsFrom(This,retVal) (This)->lpVtbl->get_CachedFlowsFrom(This,retVal)
/*** IUIAutomationElement3 methods ***/
#define IUIAutomationElement7_ShowContextMenu(This) (This)->lpVtbl->ShowContextMenu(This)
#define IUIAutomationElement7_get_CurrentIsPeripheral(This,retVal) (This)->lpVtbl->get_CurrentIsPeripheral(This,retVal)
#define IUIAutomationElement7_get_CachedIsPeripheral(This,retVal) (This)->lpVtbl->get_CachedIsPeripheral(This,retVal)
/*** IUIAutomationElement4 methods ***/
#define IUIAutomationElement7_get_CurrentPositionInSet(This,retVal) (This)->lpVtbl->get_CurrentPositionInSet(This,retVal)
#define IUIAutomationElement7_get_CurrentSizeOfSet(This,retVal) (This)->lpVtbl->get_CurrentSizeOfSet(This,retVal)
#define IUIAutomationElement7_get_CurrentLevel(This,retVal) (This)->lpVtbl->get_CurrentLevel(This,retVal)
#define IUIAutomationElement7_get_CurrentAnnotationTypes(This,retVal) (This)->lpVtbl->get_CurrentAnnotationTypes(This,retVal)
#define IUIAutomationElement7_get_CurrentAnnotationObjects(This,retVal) (This)->lpVtbl->get_CurrentAnnotationObjects(This,retVal)
#define IUIAutomationElement7_get_CachedPositionInSet(This,retVal) (This)->lpVtbl->get_CachedPositionInSet(This,retVal)
#define IUIAutomationElement7_get_CachedSizeOfSet(This,retVal) (This)->lpVtbl->get_CachedSizeOfSet(This,retVal)
#define IUIAutomationElement7_get_CachedLevel(This,retVal) (This)->lpVtbl->get_CachedLevel(This,retVal)
#define IUIAutomationElement7_get_CachedAnnotationTypes(This,retVal) (This)->lpVtbl->get_CachedAnnotationTypes(This,retVal)
#define IUIAutomationElement7_get_CachedAnnotationObjects(This,retVal) (This)->lpVtbl->get_CachedAnnotationObjects(This,retVal)
/*** IUIAutomationElement5 methods ***/
#define IUIAutomationElement7_get_CurrentLandmarkType(This,retVal) (This)->lpVtbl->get_CurrentLandmarkType(This,retVal)
#define IUIAutomationElement7_get_CurrentLocalizedLandmarkType(This,retVal) (This)->lpVtbl->get_CurrentLocalizedLandmarkType(This,retVal)
#define IUIAutomationElement7_get_CachedLandmarkType(This,retVal) (This)->lpVtbl->get_CachedLandmarkType(This,retVal)
#define IUIAutomationElement7_get_CachedLocalizedLandmarkType(This,retVal) (This)->lpVtbl->get_CachedLocalizedLandmarkType(This,retVal)
/*** IUIAutomationElement6 methods ***/
#define IUIAutomationElement7_get_CurrentFullDescription(This,retVal) (This)->lpVtbl->get_CurrentFullDescription(This,retVal)
#define IUIAutomationElement7_get_CachedFullDescription(This,retVal) (This)->lpVtbl->get_CachedFullDescription(This,retVal)
/*** IUIAutomationElement7 methods ***/
#define IUIAutomationElement7_FindFirstWithOptions(This,scope,condition,traversalOptions,root,found) (This)->lpVtbl->FindFirstWithOptions(This,scope,condition,traversalOptions,root,found)
#define IUIAutomationElement7_FindAllWithOptions(This,scope,condition,traversalOptions,root,found) (This)->lpVtbl->FindAllWithOptions(This,scope,condition,traversalOptions,root,found)
#define IUIAutomationElement7_FindFirstWithOptionsBuildCache(This,scope,condition,cacheRequest,traversalOptions,root,found) (This)->lpVtbl->FindFirstWithOptionsBuildCache(This,scope,condition,cacheRequest,traversalOptions,root,found)
#define IUIAutomationElement7_FindAllWithOptionsBuildCache(This,scope,condition,cacheRequest,traversalOptions,root,found) (This)->lpVtbl->FindAllWithOptionsBuildCache(This,scope,condition,cacheRequest,traversalOptions,root,found)
#define IUIAutomationElement7_GetCurrentMetadataValue(This,targetId,metadataId,returnVal) (This)->lpVtbl->GetCurrentMetadataValue(This,targetId,metadataId,returnVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationElement7_QueryInterface(IUIAutomationElement7* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationElement7_AddRef(IUIAutomationElement7* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationElement7_Release(IUIAutomationElement7* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationElement methods ***/
static __WIDL_INLINE HRESULT IUIAutomationElement7_SetFocus(IUIAutomationElement7* This) {
    return This->lpVtbl->SetFocus(This);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_GetRuntimeId(IUIAutomationElement7* This,SAFEARRAY **runtimeId) {
    return This->lpVtbl->GetRuntimeId(This,runtimeId);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_FindFirst(IUIAutomationElement7* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationElement **found) {
    return This->lpVtbl->FindFirst(This,scope,condition,found);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_FindAll(IUIAutomationElement7* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationElementArray **found) {
    return This->lpVtbl->FindAll(This,scope,condition,found);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_FindFirstBuildCache(IUIAutomationElement7* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **found) {
    return This->lpVtbl->FindFirstBuildCache(This,scope,condition,cacheRequest,found);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_FindAllBuildCache(IUIAutomationElement7* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElementArray **found) {
    return This->lpVtbl->FindAllBuildCache(This,scope,condition,cacheRequest,found);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_BuildUpdatedCache(IUIAutomationElement7* This,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **updatedElement) {
    return This->lpVtbl->BuildUpdatedCache(This,cacheRequest,updatedElement);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_GetCurrentPropertyValue(IUIAutomationElement7* This,PROPERTYID propertyId,VARIANT *retVal) {
    return This->lpVtbl->GetCurrentPropertyValue(This,propertyId,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_GetCurrentPropertyValueEx(IUIAutomationElement7* This,PROPERTYID propertyId,WINBOOL ignoreDefaultValue,VARIANT *retVal) {
    return This->lpVtbl->GetCurrentPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_GetCachedPropertyValue(IUIAutomationElement7* This,PROPERTYID propertyId,VARIANT *retVal) {
    return This->lpVtbl->GetCachedPropertyValue(This,propertyId,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_GetCachedPropertyValueEx(IUIAutomationElement7* This,PROPERTYID propertyId,WINBOOL ignoreDefaultValue,VARIANT *retVal) {
    return This->lpVtbl->GetCachedPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_GetCurrentPatternAs(IUIAutomationElement7* This,PATTERNID patternId,REFIID riid,void **patternObject) {
    return This->lpVtbl->GetCurrentPatternAs(This,patternId,riid,patternObject);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_GetCachedPatternAs(IUIAutomationElement7* This,PATTERNID patternId,REFIID riid,void **patternObject) {
    return This->lpVtbl->GetCachedPatternAs(This,patternId,riid,patternObject);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_GetCurrentPattern(IUIAutomationElement7* This,PATTERNID patternId,IUnknown **patternObject) {
    return This->lpVtbl->GetCurrentPattern(This,patternId,patternObject);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_GetCachedPattern(IUIAutomationElement7* This,PATTERNID patternId,IUnknown **patternObject) {
    return This->lpVtbl->GetCachedPattern(This,patternId,patternObject);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_GetCachedParent(IUIAutomationElement7* This,IUIAutomationElement **parent) {
    return This->lpVtbl->GetCachedParent(This,parent);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_GetCachedChildren(IUIAutomationElement7* This,IUIAutomationElementArray **children) {
    return This->lpVtbl->GetCachedChildren(This,children);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CurrentProcessId(IUIAutomationElement7* This,int *retVal) {
    return This->lpVtbl->get_CurrentProcessId(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CurrentControlType(IUIAutomationElement7* This,CONTROLTYPEID *retVal) {
    return This->lpVtbl->get_CurrentControlType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CurrentLocalizedControlType(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentLocalizedControlType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CurrentName(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentName(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CurrentAcceleratorKey(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAcceleratorKey(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CurrentAccessKey(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAccessKey(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CurrentHasKeyboardFocus(IUIAutomationElement7* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentHasKeyboardFocus(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CurrentIsKeyboardFocusable(IUIAutomationElement7* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsKeyboardFocusable(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CurrentIsEnabled(IUIAutomationElement7* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsEnabled(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CurrentAutomationId(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAutomationId(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CurrentClassName(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentClassName(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CurrentHelpText(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentHelpText(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CurrentCulture(IUIAutomationElement7* This,int *retVal) {
    return This->lpVtbl->get_CurrentCulture(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CurrentIsControlElement(IUIAutomationElement7* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsControlElement(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CurrentIsContentElement(IUIAutomationElement7* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsContentElement(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CurrentIsPassword(IUIAutomationElement7* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsPassword(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CurrentNativeWindowHandle(IUIAutomationElement7* This,UIA_HWND *retVal) {
    return This->lpVtbl->get_CurrentNativeWindowHandle(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CurrentItemType(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentItemType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CurrentIsOffscreen(IUIAutomationElement7* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsOffscreen(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CurrentOrientation(IUIAutomationElement7* This,enum OrientationType *retVal) {
    return This->lpVtbl->get_CurrentOrientation(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CurrentFrameworkId(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentFrameworkId(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CurrentIsRequiredForForm(IUIAutomationElement7* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsRequiredForForm(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CurrentItemStatus(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentItemStatus(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CurrentBoundingRectangle(IUIAutomationElement7* This,RECT *retVal) {
    return This->lpVtbl->get_CurrentBoundingRectangle(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CurrentLabeledBy(IUIAutomationElement7* This,IUIAutomationElement **retVal) {
    return This->lpVtbl->get_CurrentLabeledBy(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CurrentAriaRole(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAriaRole(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CurrentAriaProperties(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAriaProperties(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CurrentIsDataValidForForm(IUIAutomationElement7* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsDataValidForForm(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CurrentControllerFor(IUIAutomationElement7* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentControllerFor(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CurrentDescribedBy(IUIAutomationElement7* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentDescribedBy(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CurrentFlowsTo(IUIAutomationElement7* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentFlowsTo(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CurrentProviderDescription(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentProviderDescription(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CachedProcessId(IUIAutomationElement7* This,int *retVal) {
    return This->lpVtbl->get_CachedProcessId(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CachedControlType(IUIAutomationElement7* This,CONTROLTYPEID *retVal) {
    return This->lpVtbl->get_CachedControlType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CachedLocalizedControlType(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedLocalizedControlType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CachedName(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedName(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CachedAcceleratorKey(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAcceleratorKey(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CachedAccessKey(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAccessKey(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CachedHasKeyboardFocus(IUIAutomationElement7* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedHasKeyboardFocus(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CachedIsKeyboardFocusable(IUIAutomationElement7* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsKeyboardFocusable(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CachedIsEnabled(IUIAutomationElement7* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsEnabled(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CachedAutomationId(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAutomationId(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CachedClassName(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedClassName(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CachedHelpText(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedHelpText(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CachedCulture(IUIAutomationElement7* This,int *retVal) {
    return This->lpVtbl->get_CachedCulture(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CachedIsControlElement(IUIAutomationElement7* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsControlElement(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CachedIsContentElement(IUIAutomationElement7* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsContentElement(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CachedIsPassword(IUIAutomationElement7* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsPassword(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CachedNativeWindowHandle(IUIAutomationElement7* This,UIA_HWND *retVal) {
    return This->lpVtbl->get_CachedNativeWindowHandle(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CachedItemType(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedItemType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CachedIsOffscreen(IUIAutomationElement7* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsOffscreen(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CachedOrientation(IUIAutomationElement7* This,enum OrientationType *retVal) {
    return This->lpVtbl->get_CachedOrientation(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CachedFrameworkId(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedFrameworkId(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CachedIsRequiredForForm(IUIAutomationElement7* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsRequiredForForm(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CachedItemStatus(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedItemStatus(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CachedBoundingRectangle(IUIAutomationElement7* This,RECT *retVal) {
    return This->lpVtbl->get_CachedBoundingRectangle(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CachedLabeledBy(IUIAutomationElement7* This,IUIAutomationElement **retVal) {
    return This->lpVtbl->get_CachedLabeledBy(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CachedAriaRole(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAriaRole(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CachedAriaProperties(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAriaProperties(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CachedIsDataValidForForm(IUIAutomationElement7* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsDataValidForForm(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CachedControllerFor(IUIAutomationElement7* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedControllerFor(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CachedDescribedBy(IUIAutomationElement7* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedDescribedBy(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CachedFlowsTo(IUIAutomationElement7* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedFlowsTo(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CachedProviderDescription(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedProviderDescription(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_GetClickablePoint(IUIAutomationElement7* This,POINT *clickable,WINBOOL *gotClickable) {
    return This->lpVtbl->GetClickablePoint(This,clickable,gotClickable);
}
/*** IUIAutomationElement2 methods ***/
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CurrentOptimizeForVisualContent(IUIAutomationElement7* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentOptimizeForVisualContent(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CachedOptimizeForVisualContent(IUIAutomationElement7* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedOptimizeForVisualContent(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CurrentLiveSetting(IUIAutomationElement7* This,enum LiveSetting *retVal) {
    return This->lpVtbl->get_CurrentLiveSetting(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CachedLiveSetting(IUIAutomationElement7* This,enum LiveSetting *retVal) {
    return This->lpVtbl->get_CachedLiveSetting(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CurrentFlowsFrom(IUIAutomationElement7* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentFlowsFrom(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CachedFlowsFrom(IUIAutomationElement7* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedFlowsFrom(This,retVal);
}
/*** IUIAutomationElement3 methods ***/
static __WIDL_INLINE HRESULT IUIAutomationElement7_ShowContextMenu(IUIAutomationElement7* This) {
    return This->lpVtbl->ShowContextMenu(This);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CurrentIsPeripheral(IUIAutomationElement7* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsPeripheral(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CachedIsPeripheral(IUIAutomationElement7* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsPeripheral(This,retVal);
}
/*** IUIAutomationElement4 methods ***/
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CurrentPositionInSet(IUIAutomationElement7* This,int *retVal) {
    return This->lpVtbl->get_CurrentPositionInSet(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CurrentSizeOfSet(IUIAutomationElement7* This,int *retVal) {
    return This->lpVtbl->get_CurrentSizeOfSet(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CurrentLevel(IUIAutomationElement7* This,int *retVal) {
    return This->lpVtbl->get_CurrentLevel(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CurrentAnnotationTypes(IUIAutomationElement7* This,SAFEARRAY **retVal) {
    return This->lpVtbl->get_CurrentAnnotationTypes(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CurrentAnnotationObjects(IUIAutomationElement7* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentAnnotationObjects(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CachedPositionInSet(IUIAutomationElement7* This,int *retVal) {
    return This->lpVtbl->get_CachedPositionInSet(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CachedSizeOfSet(IUIAutomationElement7* This,int *retVal) {
    return This->lpVtbl->get_CachedSizeOfSet(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CachedLevel(IUIAutomationElement7* This,int *retVal) {
    return This->lpVtbl->get_CachedLevel(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CachedAnnotationTypes(IUIAutomationElement7* This,SAFEARRAY **retVal) {
    return This->lpVtbl->get_CachedAnnotationTypes(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CachedAnnotationObjects(IUIAutomationElement7* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedAnnotationObjects(This,retVal);
}
/*** IUIAutomationElement5 methods ***/
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CurrentLandmarkType(IUIAutomationElement7* This,LANDMARKTYPEID *retVal) {
    return This->lpVtbl->get_CurrentLandmarkType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CurrentLocalizedLandmarkType(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentLocalizedLandmarkType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CachedLandmarkType(IUIAutomationElement7* This,LANDMARKTYPEID *retVal) {
    return This->lpVtbl->get_CachedLandmarkType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CachedLocalizedLandmarkType(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedLocalizedLandmarkType(This,retVal);
}
/*** IUIAutomationElement6 methods ***/
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CurrentFullDescription(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentFullDescription(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_get_CachedFullDescription(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedFullDescription(This,retVal);
}
/*** IUIAutomationElement7 methods ***/
static __WIDL_INLINE HRESULT IUIAutomationElement7_FindFirstWithOptions(IUIAutomationElement7* This,enum TreeScope scope,IUIAutomationCondition *condition,enum TreeTraversalOptions traversalOptions,IUIAutomationElement *root,IUIAutomationElement **found) {
    return This->lpVtbl->FindFirstWithOptions(This,scope,condition,traversalOptions,root,found);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_FindAllWithOptions(IUIAutomationElement7* This,enum TreeScope scope,IUIAutomationCondition *condition,enum TreeTraversalOptions traversalOptions,IUIAutomationElement *root,IUIAutomationElementArray **found) {
    return This->lpVtbl->FindAllWithOptions(This,scope,condition,traversalOptions,root,found);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_FindFirstWithOptionsBuildCache(IUIAutomationElement7* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationCacheRequest *cacheRequest,enum TreeTraversalOptions traversalOptions,IUIAutomationElement *root,IUIAutomationElement **found) {
    return This->lpVtbl->FindFirstWithOptionsBuildCache(This,scope,condition,cacheRequest,traversalOptions,root,found);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_FindAllWithOptionsBuildCache(IUIAutomationElement7* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationCacheRequest *cacheRequest,enum TreeTraversalOptions traversalOptions,IUIAutomationElement *root,IUIAutomationElementArray **found) {
    return This->lpVtbl->FindAllWithOptionsBuildCache(This,scope,condition,cacheRequest,traversalOptions,root,found);
}
static __WIDL_INLINE HRESULT IUIAutomationElement7_GetCurrentMetadataValue(IUIAutomationElement7* This,int targetId,METADATAID metadataId,VARIANT *returnVal) {
    return This->lpVtbl->GetCurrentMetadataValue(This,targetId,metadataId,returnVal);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationElement7_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationElement8 interface
 */
#ifndef __IUIAutomationElement8_INTERFACE_DEFINED__
#define __IUIAutomationElement8_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationElement8, 0x8c60217d, 0x5411, 0x4cde, 0xbc,0xc0, 0x1c,0xed,0xa2,0x23,0x83,0x0c);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("8c60217d-5411-4cde-bcc0-1ceda223830c")
IUIAutomationElement8 : public IUIAutomationElement7
{
    virtual HRESULT STDMETHODCALLTYPE get_CurrentHeadingLevel(
        HEADINGLEVELID *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CachedHeadingLevel(
        HEADINGLEVELID *retVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationElement8, 0x8c60217d, 0x5411, 0x4cde, 0xbc,0xc0, 0x1c,0xed,0xa2,0x23,0x83,0x0c)
#endif
#else
typedef struct IUIAutomationElement8Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomationElement methods ***/
    HRESULT (STDMETHODCALLTYPE *SetFocus)(
        IUIAutomationElement8 *This);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeId)(
        IUIAutomationElement8 *This,
        SAFEARRAY **runtimeId);

    HRESULT (STDMETHODCALLTYPE *FindFirst)(
        IUIAutomationElement8 *This,
        enum TreeScope scope,
        IUIAutomationCondition *condition,
        IUIAutomationElement **found);

    HRESULT (STDMETHODCALLTYPE *FindAll)(
        IUIAutomationElement8 *This,
        enum TreeScope scope,
        IUIAutomationCondition *condition,
        IUIAutomationElementArray **found);

    HRESULT (STDMETHODCALLTYPE *FindFirstBuildCache)(
        IUIAutomationElement8 *This,
        enum TreeScope scope,
        IUIAutomationCondition *condition,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **found);

    HRESULT (STDMETHODCALLTYPE *FindAllBuildCache)(
        IUIAutomationElement8 *This,
        enum TreeScope scope,
        IUIAutomationCondition *condition,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElementArray **found);

    HRESULT (STDMETHODCALLTYPE *BuildUpdatedCache)(
        IUIAutomationElement8 *This,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **updatedElement);

    HRESULT (STDMETHODCALLTYPE *GetCurrentPropertyValue)(
        IUIAutomationElement8 *This,
        PROPERTYID propertyId,
        VARIANT *retVal);

    HRESULT (STDMETHODCALLTYPE *GetCurrentPropertyValueEx)(
        IUIAutomationElement8 *This,
        PROPERTYID propertyId,
        WINBOOL ignoreDefaultValue,
        VARIANT *retVal);

    HRESULT (STDMETHODCALLTYPE *GetCachedPropertyValue)(
        IUIAutomationElement8 *This,
        PROPERTYID propertyId,
        VARIANT *retVal);

    HRESULT (STDMETHODCALLTYPE *GetCachedPropertyValueEx)(
        IUIAutomationElement8 *This,
        PROPERTYID propertyId,
        WINBOOL ignoreDefaultValue,
        VARIANT *retVal);

    HRESULT (STDMETHODCALLTYPE *GetCurrentPatternAs)(
        IUIAutomationElement8 *This,
        PATTERNID patternId,
        REFIID riid,
        void **patternObject);

    HRESULT (STDMETHODCALLTYPE *GetCachedPatternAs)(
        IUIAutomationElement8 *This,
        PATTERNID patternId,
        REFIID riid,
        void **patternObject);

    HRESULT (STDMETHODCALLTYPE *GetCurrentPattern)(
        IUIAutomationElement8 *This,
        PATTERNID patternId,
        IUnknown **patternObject);

    HRESULT (STDMETHODCALLTYPE *GetCachedPattern)(
        IUIAutomationElement8 *This,
        PATTERNID patternId,
        IUnknown **patternObject);

    HRESULT (STDMETHODCALLTYPE *GetCachedParent)(
        IUIAutomationElement8 *This,
        IUIAutomationElement **parent);

    HRESULT (STDMETHODCALLTYPE *GetCachedChildren)(
        IUIAutomationElement8 *This,
        IUIAutomationElementArray **children);

    HRESULT (STDMETHODCALLTYPE *get_CurrentProcessId)(
        IUIAutomationElement8 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentControlType)(
        IUIAutomationElement8 *This,
        CONTROLTYPEID *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentLocalizedControlType)(
        IUIAutomationElement8 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentName)(
        IUIAutomationElement8 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAcceleratorKey)(
        IUIAutomationElement8 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAccessKey)(
        IUIAutomationElement8 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentHasKeyboardFocus)(
        IUIAutomationElement8 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsKeyboardFocusable)(
        IUIAutomationElement8 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsEnabled)(
        IUIAutomationElement8 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAutomationId)(
        IUIAutomationElement8 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentClassName)(
        IUIAutomationElement8 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentHelpText)(
        IUIAutomationElement8 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentCulture)(
        IUIAutomationElement8 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsControlElement)(
        IUIAutomationElement8 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsContentElement)(
        IUIAutomationElement8 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsPassword)(
        IUIAutomationElement8 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentNativeWindowHandle)(
        IUIAutomationElement8 *This,
        UIA_HWND *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentItemType)(
        IUIAutomationElement8 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsOffscreen)(
        IUIAutomationElement8 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentOrientation)(
        IUIAutomationElement8 *This,
        enum OrientationType *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentFrameworkId)(
        IUIAutomationElement8 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsRequiredForForm)(
        IUIAutomationElement8 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentItemStatus)(
        IUIAutomationElement8 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentBoundingRectangle)(
        IUIAutomationElement8 *This,
        RECT *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentLabeledBy)(
        IUIAutomationElement8 *This,
        IUIAutomationElement **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAriaRole)(
        IUIAutomationElement8 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAriaProperties)(
        IUIAutomationElement8 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsDataValidForForm)(
        IUIAutomationElement8 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentControllerFor)(
        IUIAutomationElement8 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentDescribedBy)(
        IUIAutomationElement8 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentFlowsTo)(
        IUIAutomationElement8 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentProviderDescription)(
        IUIAutomationElement8 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedProcessId)(
        IUIAutomationElement8 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedControlType)(
        IUIAutomationElement8 *This,
        CONTROLTYPEID *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedLocalizedControlType)(
        IUIAutomationElement8 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedName)(
        IUIAutomationElement8 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAcceleratorKey)(
        IUIAutomationElement8 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAccessKey)(
        IUIAutomationElement8 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedHasKeyboardFocus)(
        IUIAutomationElement8 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsKeyboardFocusable)(
        IUIAutomationElement8 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsEnabled)(
        IUIAutomationElement8 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAutomationId)(
        IUIAutomationElement8 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedClassName)(
        IUIAutomationElement8 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedHelpText)(
        IUIAutomationElement8 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedCulture)(
        IUIAutomationElement8 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsControlElement)(
        IUIAutomationElement8 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsContentElement)(
        IUIAutomationElement8 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsPassword)(
        IUIAutomationElement8 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedNativeWindowHandle)(
        IUIAutomationElement8 *This,
        UIA_HWND *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedItemType)(
        IUIAutomationElement8 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsOffscreen)(
        IUIAutomationElement8 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedOrientation)(
        IUIAutomationElement8 *This,
        enum OrientationType *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedFrameworkId)(
        IUIAutomationElement8 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsRequiredForForm)(
        IUIAutomationElement8 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedItemStatus)(
        IUIAutomationElement8 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedBoundingRectangle)(
        IUIAutomationElement8 *This,
        RECT *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedLabeledBy)(
        IUIAutomationElement8 *This,
        IUIAutomationElement **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAriaRole)(
        IUIAutomationElement8 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAriaProperties)(
        IUIAutomationElement8 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsDataValidForForm)(
        IUIAutomationElement8 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedControllerFor)(
        IUIAutomationElement8 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedDescribedBy)(
        IUIAutomationElement8 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedFlowsTo)(
        IUIAutomationElement8 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedProviderDescription)(
        IUIAutomationElement8 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *GetClickablePoint)(
        IUIAutomationElement8 *This,
        POINT *clickable,
        WINBOOL *gotClickable);

    /*** IUIAutomationElement2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CurrentOptimizeForVisualContent)(
        IUIAutomationElement8 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedOptimizeForVisualContent)(
        IUIAutomationElement8 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentLiveSetting)(
        IUIAutomationElement8 *This,
        enum LiveSetting *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedLiveSetting)(
        IUIAutomationElement8 *This,
        enum LiveSetting *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentFlowsFrom)(
        IUIAutomationElement8 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedFlowsFrom)(
        IUIAutomationElement8 *This,
        IUIAutomationElementArray **retVal);

    /*** IUIAutomationElement3 methods ***/
    HRESULT (STDMETHODCALLTYPE *ShowContextMenu)(
        IUIAutomationElement8 *This);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsPeripheral)(
        IUIAutomationElement8 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsPeripheral)(
        IUIAutomationElement8 *This,
        WINBOOL *retVal);

    /*** IUIAutomationElement4 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CurrentPositionInSet)(
        IUIAutomationElement8 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentSizeOfSet)(
        IUIAutomationElement8 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentLevel)(
        IUIAutomationElement8 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAnnotationTypes)(
        IUIAutomationElement8 *This,
        SAFEARRAY **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAnnotationObjects)(
        IUIAutomationElement8 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedPositionInSet)(
        IUIAutomationElement8 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedSizeOfSet)(
        IUIAutomationElement8 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedLevel)(
        IUIAutomationElement8 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAnnotationTypes)(
        IUIAutomationElement8 *This,
        SAFEARRAY **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAnnotationObjects)(
        IUIAutomationElement8 *This,
        IUIAutomationElementArray **retVal);

    /*** IUIAutomationElement5 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CurrentLandmarkType)(
        IUIAutomationElement8 *This,
        LANDMARKTYPEID *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentLocalizedLandmarkType)(
        IUIAutomationElement8 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedLandmarkType)(
        IUIAutomationElement8 *This,
        LANDMARKTYPEID *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedLocalizedLandmarkType)(
        IUIAutomationElement8 *This,
        BSTR *retVal);

    /*** IUIAutomationElement6 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CurrentFullDescription)(
        IUIAutomationElement8 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedFullDescription)(
        IUIAutomationElement8 *This,
        BSTR *retVal);

    /*** IUIAutomationElement7 methods ***/
    HRESULT (STDMETHODCALLTYPE *FindFirstWithOptions)(
        IUIAutomationElement8 *This,
        enum TreeScope scope,
        IUIAutomationCondition *condition,
        enum TreeTraversalOptions traversalOptions,
        IUIAutomationElement *root,
        IUIAutomationElement **found);

    HRESULT (STDMETHODCALLTYPE *FindAllWithOptions)(
        IUIAutomationElement8 *This,
        enum TreeScope scope,
        IUIAutomationCondition *condition,
        enum TreeTraversalOptions traversalOptions,
        IUIAutomationElement *root,
        IUIAutomationElementArray **found);

    HRESULT (STDMETHODCALLTYPE *FindFirstWithOptionsBuildCache)(
        IUIAutomationElement8 *This,
        enum TreeScope scope,
        IUIAutomationCondition *condition,
        IUIAutomationCacheRequest *cacheRequest,
        enum TreeTraversalOptions traversalOptions,
        IUIAutomationElement *root,
        IUIAutomationElement **found);

    HRESULT (STDMETHODCALLTYPE *FindAllWithOptionsBuildCache)(
        IUIAutomationElement8 *This,
        enum TreeScope scope,
        IUIAutomationCondition *condition,
        IUIAutomationCacheRequest *cacheRequest,
        enum TreeTraversalOptions traversalOptions,
        IUIAutomationElement *root,
        IUIAutomationElementArray **found);

    HRESULT (STDMETHODCALLTYPE *GetCurrentMetadataValue)(
        IUIAutomationElement8 *This,
        int targetId,
        METADATAID metadataId,
        VARIANT *returnVal);

    /*** IUIAutomationElement8 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CurrentHeadingLevel)(
        IUIAutomationElement8 *This,
        HEADINGLEVELID *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedHeadingLevel)(
        IUIAutomationElement8 *This,
        HEADINGLEVELID *retVal);

    END_INTERFACE
} IUIAutomationElement8Vtbl;

interface IUIAutomationElement8 {
    CONST_VTBL IUIAutomationElement8Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationElement8_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationElement8_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationElement8_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationElement methods ***/
#define IUIAutomationElement8_SetFocus(This) (This)->lpVtbl->SetFocus(This)
#define IUIAutomationElement8_GetRuntimeId(This,runtimeId) (This)->lpVtbl->GetRuntimeId(This,runtimeId)
#define IUIAutomationElement8_FindFirst(This,scope,condition,found) (This)->lpVtbl->FindFirst(This,scope,condition,found)
#define IUIAutomationElement8_FindAll(This,scope,condition,found) (This)->lpVtbl->FindAll(This,scope,condition,found)
#define IUIAutomationElement8_FindFirstBuildCache(This,scope,condition,cacheRequest,found) (This)->lpVtbl->FindFirstBuildCache(This,scope,condition,cacheRequest,found)
#define IUIAutomationElement8_FindAllBuildCache(This,scope,condition,cacheRequest,found) (This)->lpVtbl->FindAllBuildCache(This,scope,condition,cacheRequest,found)
#define IUIAutomationElement8_BuildUpdatedCache(This,cacheRequest,updatedElement) (This)->lpVtbl->BuildUpdatedCache(This,cacheRequest,updatedElement)
#define IUIAutomationElement8_GetCurrentPropertyValue(This,propertyId,retVal) (This)->lpVtbl->GetCurrentPropertyValue(This,propertyId,retVal)
#define IUIAutomationElement8_GetCurrentPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal) (This)->lpVtbl->GetCurrentPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal)
#define IUIAutomationElement8_GetCachedPropertyValue(This,propertyId,retVal) (This)->lpVtbl->GetCachedPropertyValue(This,propertyId,retVal)
#define IUIAutomationElement8_GetCachedPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal) (This)->lpVtbl->GetCachedPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal)
#define IUIAutomationElement8_GetCurrentPatternAs(This,patternId,riid,patternObject) (This)->lpVtbl->GetCurrentPatternAs(This,patternId,riid,patternObject)
#define IUIAutomationElement8_GetCachedPatternAs(This,patternId,riid,patternObject) (This)->lpVtbl->GetCachedPatternAs(This,patternId,riid,patternObject)
#define IUIAutomationElement8_GetCurrentPattern(This,patternId,patternObject) (This)->lpVtbl->GetCurrentPattern(This,patternId,patternObject)
#define IUIAutomationElement8_GetCachedPattern(This,patternId,patternObject) (This)->lpVtbl->GetCachedPattern(This,patternId,patternObject)
#define IUIAutomationElement8_GetCachedParent(This,parent) (This)->lpVtbl->GetCachedParent(This,parent)
#define IUIAutomationElement8_GetCachedChildren(This,children) (This)->lpVtbl->GetCachedChildren(This,children)
#define IUIAutomationElement8_get_CurrentProcessId(This,retVal) (This)->lpVtbl->get_CurrentProcessId(This,retVal)
#define IUIAutomationElement8_get_CurrentControlType(This,retVal) (This)->lpVtbl->get_CurrentControlType(This,retVal)
#define IUIAutomationElement8_get_CurrentLocalizedControlType(This,retVal) (This)->lpVtbl->get_CurrentLocalizedControlType(This,retVal)
#define IUIAutomationElement8_get_CurrentName(This,retVal) (This)->lpVtbl->get_CurrentName(This,retVal)
#define IUIAutomationElement8_get_CurrentAcceleratorKey(This,retVal) (This)->lpVtbl->get_CurrentAcceleratorKey(This,retVal)
#define IUIAutomationElement8_get_CurrentAccessKey(This,retVal) (This)->lpVtbl->get_CurrentAccessKey(This,retVal)
#define IUIAutomationElement8_get_CurrentHasKeyboardFocus(This,retVal) (This)->lpVtbl->get_CurrentHasKeyboardFocus(This,retVal)
#define IUIAutomationElement8_get_CurrentIsKeyboardFocusable(This,retVal) (This)->lpVtbl->get_CurrentIsKeyboardFocusable(This,retVal)
#define IUIAutomationElement8_get_CurrentIsEnabled(This,retVal) (This)->lpVtbl->get_CurrentIsEnabled(This,retVal)
#define IUIAutomationElement8_get_CurrentAutomationId(This,retVal) (This)->lpVtbl->get_CurrentAutomationId(This,retVal)
#define IUIAutomationElement8_get_CurrentClassName(This,retVal) (This)->lpVtbl->get_CurrentClassName(This,retVal)
#define IUIAutomationElement8_get_CurrentHelpText(This,retVal) (This)->lpVtbl->get_CurrentHelpText(This,retVal)
#define IUIAutomationElement8_get_CurrentCulture(This,retVal) (This)->lpVtbl->get_CurrentCulture(This,retVal)
#define IUIAutomationElement8_get_CurrentIsControlElement(This,retVal) (This)->lpVtbl->get_CurrentIsControlElement(This,retVal)
#define IUIAutomationElement8_get_CurrentIsContentElement(This,retVal) (This)->lpVtbl->get_CurrentIsContentElement(This,retVal)
#define IUIAutomationElement8_get_CurrentIsPassword(This,retVal) (This)->lpVtbl->get_CurrentIsPassword(This,retVal)
#define IUIAutomationElement8_get_CurrentNativeWindowHandle(This,retVal) (This)->lpVtbl->get_CurrentNativeWindowHandle(This,retVal)
#define IUIAutomationElement8_get_CurrentItemType(This,retVal) (This)->lpVtbl->get_CurrentItemType(This,retVal)
#define IUIAutomationElement8_get_CurrentIsOffscreen(This,retVal) (This)->lpVtbl->get_CurrentIsOffscreen(This,retVal)
#define IUIAutomationElement8_get_CurrentOrientation(This,retVal) (This)->lpVtbl->get_CurrentOrientation(This,retVal)
#define IUIAutomationElement8_get_CurrentFrameworkId(This,retVal) (This)->lpVtbl->get_CurrentFrameworkId(This,retVal)
#define IUIAutomationElement8_get_CurrentIsRequiredForForm(This,retVal) (This)->lpVtbl->get_CurrentIsRequiredForForm(This,retVal)
#define IUIAutomationElement8_get_CurrentItemStatus(This,retVal) (This)->lpVtbl->get_CurrentItemStatus(This,retVal)
#define IUIAutomationElement8_get_CurrentBoundingRectangle(This,retVal) (This)->lpVtbl->get_CurrentBoundingRectangle(This,retVal)
#define IUIAutomationElement8_get_CurrentLabeledBy(This,retVal) (This)->lpVtbl->get_CurrentLabeledBy(This,retVal)
#define IUIAutomationElement8_get_CurrentAriaRole(This,retVal) (This)->lpVtbl->get_CurrentAriaRole(This,retVal)
#define IUIAutomationElement8_get_CurrentAriaProperties(This,retVal) (This)->lpVtbl->get_CurrentAriaProperties(This,retVal)
#define IUIAutomationElement8_get_CurrentIsDataValidForForm(This,retVal) (This)->lpVtbl->get_CurrentIsDataValidForForm(This,retVal)
#define IUIAutomationElement8_get_CurrentControllerFor(This,retVal) (This)->lpVtbl->get_CurrentControllerFor(This,retVal)
#define IUIAutomationElement8_get_CurrentDescribedBy(This,retVal) (This)->lpVtbl->get_CurrentDescribedBy(This,retVal)
#define IUIAutomationElement8_get_CurrentFlowsTo(This,retVal) (This)->lpVtbl->get_CurrentFlowsTo(This,retVal)
#define IUIAutomationElement8_get_CurrentProviderDescription(This,retVal) (This)->lpVtbl->get_CurrentProviderDescription(This,retVal)
#define IUIAutomationElement8_get_CachedProcessId(This,retVal) (This)->lpVtbl->get_CachedProcessId(This,retVal)
#define IUIAutomationElement8_get_CachedControlType(This,retVal) (This)->lpVtbl->get_CachedControlType(This,retVal)
#define IUIAutomationElement8_get_CachedLocalizedControlType(This,retVal) (This)->lpVtbl->get_CachedLocalizedControlType(This,retVal)
#define IUIAutomationElement8_get_CachedName(This,retVal) (This)->lpVtbl->get_CachedName(This,retVal)
#define IUIAutomationElement8_get_CachedAcceleratorKey(This,retVal) (This)->lpVtbl->get_CachedAcceleratorKey(This,retVal)
#define IUIAutomationElement8_get_CachedAccessKey(This,retVal) (This)->lpVtbl->get_CachedAccessKey(This,retVal)
#define IUIAutomationElement8_get_CachedHasKeyboardFocus(This,retVal) (This)->lpVtbl->get_CachedHasKeyboardFocus(This,retVal)
#define IUIAutomationElement8_get_CachedIsKeyboardFocusable(This,retVal) (This)->lpVtbl->get_CachedIsKeyboardFocusable(This,retVal)
#define IUIAutomationElement8_get_CachedIsEnabled(This,retVal) (This)->lpVtbl->get_CachedIsEnabled(This,retVal)
#define IUIAutomationElement8_get_CachedAutomationId(This,retVal) (This)->lpVtbl->get_CachedAutomationId(This,retVal)
#define IUIAutomationElement8_get_CachedClassName(This,retVal) (This)->lpVtbl->get_CachedClassName(This,retVal)
#define IUIAutomationElement8_get_CachedHelpText(This,retVal) (This)->lpVtbl->get_CachedHelpText(This,retVal)
#define IUIAutomationElement8_get_CachedCulture(This,retVal) (This)->lpVtbl->get_CachedCulture(This,retVal)
#define IUIAutomationElement8_get_CachedIsControlElement(This,retVal) (This)->lpVtbl->get_CachedIsControlElement(This,retVal)
#define IUIAutomationElement8_get_CachedIsContentElement(This,retVal) (This)->lpVtbl->get_CachedIsContentElement(This,retVal)
#define IUIAutomationElement8_get_CachedIsPassword(This,retVal) (This)->lpVtbl->get_CachedIsPassword(This,retVal)
#define IUIAutomationElement8_get_CachedNativeWindowHandle(This,retVal) (This)->lpVtbl->get_CachedNativeWindowHandle(This,retVal)
#define IUIAutomationElement8_get_CachedItemType(This,retVal) (This)->lpVtbl->get_CachedItemType(This,retVal)
#define IUIAutomationElement8_get_CachedIsOffscreen(This,retVal) (This)->lpVtbl->get_CachedIsOffscreen(This,retVal)
#define IUIAutomationElement8_get_CachedOrientation(This,retVal) (This)->lpVtbl->get_CachedOrientation(This,retVal)
#define IUIAutomationElement8_get_CachedFrameworkId(This,retVal) (This)->lpVtbl->get_CachedFrameworkId(This,retVal)
#define IUIAutomationElement8_get_CachedIsRequiredForForm(This,retVal) (This)->lpVtbl->get_CachedIsRequiredForForm(This,retVal)
#define IUIAutomationElement8_get_CachedItemStatus(This,retVal) (This)->lpVtbl->get_CachedItemStatus(This,retVal)
#define IUIAutomationElement8_get_CachedBoundingRectangle(This,retVal) (This)->lpVtbl->get_CachedBoundingRectangle(This,retVal)
#define IUIAutomationElement8_get_CachedLabeledBy(This,retVal) (This)->lpVtbl->get_CachedLabeledBy(This,retVal)
#define IUIAutomationElement8_get_CachedAriaRole(This,retVal) (This)->lpVtbl->get_CachedAriaRole(This,retVal)
#define IUIAutomationElement8_get_CachedAriaProperties(This,retVal) (This)->lpVtbl->get_CachedAriaProperties(This,retVal)
#define IUIAutomationElement8_get_CachedIsDataValidForForm(This,retVal) (This)->lpVtbl->get_CachedIsDataValidForForm(This,retVal)
#define IUIAutomationElement8_get_CachedControllerFor(This,retVal) (This)->lpVtbl->get_CachedControllerFor(This,retVal)
#define IUIAutomationElement8_get_CachedDescribedBy(This,retVal) (This)->lpVtbl->get_CachedDescribedBy(This,retVal)
#define IUIAutomationElement8_get_CachedFlowsTo(This,retVal) (This)->lpVtbl->get_CachedFlowsTo(This,retVal)
#define IUIAutomationElement8_get_CachedProviderDescription(This,retVal) (This)->lpVtbl->get_CachedProviderDescription(This,retVal)
#define IUIAutomationElement8_GetClickablePoint(This,clickable,gotClickable) (This)->lpVtbl->GetClickablePoint(This,clickable,gotClickable)
/*** IUIAutomationElement2 methods ***/
#define IUIAutomationElement8_get_CurrentOptimizeForVisualContent(This,retVal) (This)->lpVtbl->get_CurrentOptimizeForVisualContent(This,retVal)
#define IUIAutomationElement8_get_CachedOptimizeForVisualContent(This,retVal) (This)->lpVtbl->get_CachedOptimizeForVisualContent(This,retVal)
#define IUIAutomationElement8_get_CurrentLiveSetting(This,retVal) (This)->lpVtbl->get_CurrentLiveSetting(This,retVal)
#define IUIAutomationElement8_get_CachedLiveSetting(This,retVal) (This)->lpVtbl->get_CachedLiveSetting(This,retVal)
#define IUIAutomationElement8_get_CurrentFlowsFrom(This,retVal) (This)->lpVtbl->get_CurrentFlowsFrom(This,retVal)
#define IUIAutomationElement8_get_CachedFlowsFrom(This,retVal) (This)->lpVtbl->get_CachedFlowsFrom(This,retVal)
/*** IUIAutomationElement3 methods ***/
#define IUIAutomationElement8_ShowContextMenu(This) (This)->lpVtbl->ShowContextMenu(This)
#define IUIAutomationElement8_get_CurrentIsPeripheral(This,retVal) (This)->lpVtbl->get_CurrentIsPeripheral(This,retVal)
#define IUIAutomationElement8_get_CachedIsPeripheral(This,retVal) (This)->lpVtbl->get_CachedIsPeripheral(This,retVal)
/*** IUIAutomationElement4 methods ***/
#define IUIAutomationElement8_get_CurrentPositionInSet(This,retVal) (This)->lpVtbl->get_CurrentPositionInSet(This,retVal)
#define IUIAutomationElement8_get_CurrentSizeOfSet(This,retVal) (This)->lpVtbl->get_CurrentSizeOfSet(This,retVal)
#define IUIAutomationElement8_get_CurrentLevel(This,retVal) (This)->lpVtbl->get_CurrentLevel(This,retVal)
#define IUIAutomationElement8_get_CurrentAnnotationTypes(This,retVal) (This)->lpVtbl->get_CurrentAnnotationTypes(This,retVal)
#define IUIAutomationElement8_get_CurrentAnnotationObjects(This,retVal) (This)->lpVtbl->get_CurrentAnnotationObjects(This,retVal)
#define IUIAutomationElement8_get_CachedPositionInSet(This,retVal) (This)->lpVtbl->get_CachedPositionInSet(This,retVal)
#define IUIAutomationElement8_get_CachedSizeOfSet(This,retVal) (This)->lpVtbl->get_CachedSizeOfSet(This,retVal)
#define IUIAutomationElement8_get_CachedLevel(This,retVal) (This)->lpVtbl->get_CachedLevel(This,retVal)
#define IUIAutomationElement8_get_CachedAnnotationTypes(This,retVal) (This)->lpVtbl->get_CachedAnnotationTypes(This,retVal)
#define IUIAutomationElement8_get_CachedAnnotationObjects(This,retVal) (This)->lpVtbl->get_CachedAnnotationObjects(This,retVal)
/*** IUIAutomationElement5 methods ***/
#define IUIAutomationElement8_get_CurrentLandmarkType(This,retVal) (This)->lpVtbl->get_CurrentLandmarkType(This,retVal)
#define IUIAutomationElement8_get_CurrentLocalizedLandmarkType(This,retVal) (This)->lpVtbl->get_CurrentLocalizedLandmarkType(This,retVal)
#define IUIAutomationElement8_get_CachedLandmarkType(This,retVal) (This)->lpVtbl->get_CachedLandmarkType(This,retVal)
#define IUIAutomationElement8_get_CachedLocalizedLandmarkType(This,retVal) (This)->lpVtbl->get_CachedLocalizedLandmarkType(This,retVal)
/*** IUIAutomationElement6 methods ***/
#define IUIAutomationElement8_get_CurrentFullDescription(This,retVal) (This)->lpVtbl->get_CurrentFullDescription(This,retVal)
#define IUIAutomationElement8_get_CachedFullDescription(This,retVal) (This)->lpVtbl->get_CachedFullDescription(This,retVal)
/*** IUIAutomationElement7 methods ***/
#define IUIAutomationElement8_FindFirstWithOptions(This,scope,condition,traversalOptions,root,found) (This)->lpVtbl->FindFirstWithOptions(This,scope,condition,traversalOptions,root,found)
#define IUIAutomationElement8_FindAllWithOptions(This,scope,condition,traversalOptions,root,found) (This)->lpVtbl->FindAllWithOptions(This,scope,condition,traversalOptions,root,found)
#define IUIAutomationElement8_FindFirstWithOptionsBuildCache(This,scope,condition,cacheRequest,traversalOptions,root,found) (This)->lpVtbl->FindFirstWithOptionsBuildCache(This,scope,condition,cacheRequest,traversalOptions,root,found)
#define IUIAutomationElement8_FindAllWithOptionsBuildCache(This,scope,condition,cacheRequest,traversalOptions,root,found) (This)->lpVtbl->FindAllWithOptionsBuildCache(This,scope,condition,cacheRequest,traversalOptions,root,found)
#define IUIAutomationElement8_GetCurrentMetadataValue(This,targetId,metadataId,returnVal) (This)->lpVtbl->GetCurrentMetadataValue(This,targetId,metadataId,returnVal)
/*** IUIAutomationElement8 methods ***/
#define IUIAutomationElement8_get_CurrentHeadingLevel(This,retVal) (This)->lpVtbl->get_CurrentHeadingLevel(This,retVal)
#define IUIAutomationElement8_get_CachedHeadingLevel(This,retVal) (This)->lpVtbl->get_CachedHeadingLevel(This,retVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationElement8_QueryInterface(IUIAutomationElement8* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationElement8_AddRef(IUIAutomationElement8* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationElement8_Release(IUIAutomationElement8* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationElement methods ***/
static __WIDL_INLINE HRESULT IUIAutomationElement8_SetFocus(IUIAutomationElement8* This) {
    return This->lpVtbl->SetFocus(This);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_GetRuntimeId(IUIAutomationElement8* This,SAFEARRAY **runtimeId) {
    return This->lpVtbl->GetRuntimeId(This,runtimeId);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_FindFirst(IUIAutomationElement8* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationElement **found) {
    return This->lpVtbl->FindFirst(This,scope,condition,found);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_FindAll(IUIAutomationElement8* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationElementArray **found) {
    return This->lpVtbl->FindAll(This,scope,condition,found);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_FindFirstBuildCache(IUIAutomationElement8* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **found) {
    return This->lpVtbl->FindFirstBuildCache(This,scope,condition,cacheRequest,found);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_FindAllBuildCache(IUIAutomationElement8* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElementArray **found) {
    return This->lpVtbl->FindAllBuildCache(This,scope,condition,cacheRequest,found);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_BuildUpdatedCache(IUIAutomationElement8* This,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **updatedElement) {
    return This->lpVtbl->BuildUpdatedCache(This,cacheRequest,updatedElement);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_GetCurrentPropertyValue(IUIAutomationElement8* This,PROPERTYID propertyId,VARIANT *retVal) {
    return This->lpVtbl->GetCurrentPropertyValue(This,propertyId,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_GetCurrentPropertyValueEx(IUIAutomationElement8* This,PROPERTYID propertyId,WINBOOL ignoreDefaultValue,VARIANT *retVal) {
    return This->lpVtbl->GetCurrentPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_GetCachedPropertyValue(IUIAutomationElement8* This,PROPERTYID propertyId,VARIANT *retVal) {
    return This->lpVtbl->GetCachedPropertyValue(This,propertyId,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_GetCachedPropertyValueEx(IUIAutomationElement8* This,PROPERTYID propertyId,WINBOOL ignoreDefaultValue,VARIANT *retVal) {
    return This->lpVtbl->GetCachedPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_GetCurrentPatternAs(IUIAutomationElement8* This,PATTERNID patternId,REFIID riid,void **patternObject) {
    return This->lpVtbl->GetCurrentPatternAs(This,patternId,riid,patternObject);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_GetCachedPatternAs(IUIAutomationElement8* This,PATTERNID patternId,REFIID riid,void **patternObject) {
    return This->lpVtbl->GetCachedPatternAs(This,patternId,riid,patternObject);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_GetCurrentPattern(IUIAutomationElement8* This,PATTERNID patternId,IUnknown **patternObject) {
    return This->lpVtbl->GetCurrentPattern(This,patternId,patternObject);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_GetCachedPattern(IUIAutomationElement8* This,PATTERNID patternId,IUnknown **patternObject) {
    return This->lpVtbl->GetCachedPattern(This,patternId,patternObject);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_GetCachedParent(IUIAutomationElement8* This,IUIAutomationElement **parent) {
    return This->lpVtbl->GetCachedParent(This,parent);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_GetCachedChildren(IUIAutomationElement8* This,IUIAutomationElementArray **children) {
    return This->lpVtbl->GetCachedChildren(This,children);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CurrentProcessId(IUIAutomationElement8* This,int *retVal) {
    return This->lpVtbl->get_CurrentProcessId(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CurrentControlType(IUIAutomationElement8* This,CONTROLTYPEID *retVal) {
    return This->lpVtbl->get_CurrentControlType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CurrentLocalizedControlType(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentLocalizedControlType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CurrentName(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentName(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CurrentAcceleratorKey(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAcceleratorKey(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CurrentAccessKey(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAccessKey(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CurrentHasKeyboardFocus(IUIAutomationElement8* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentHasKeyboardFocus(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CurrentIsKeyboardFocusable(IUIAutomationElement8* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsKeyboardFocusable(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CurrentIsEnabled(IUIAutomationElement8* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsEnabled(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CurrentAutomationId(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAutomationId(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CurrentClassName(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentClassName(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CurrentHelpText(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentHelpText(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CurrentCulture(IUIAutomationElement8* This,int *retVal) {
    return This->lpVtbl->get_CurrentCulture(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CurrentIsControlElement(IUIAutomationElement8* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsControlElement(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CurrentIsContentElement(IUIAutomationElement8* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsContentElement(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CurrentIsPassword(IUIAutomationElement8* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsPassword(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CurrentNativeWindowHandle(IUIAutomationElement8* This,UIA_HWND *retVal) {
    return This->lpVtbl->get_CurrentNativeWindowHandle(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CurrentItemType(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentItemType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CurrentIsOffscreen(IUIAutomationElement8* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsOffscreen(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CurrentOrientation(IUIAutomationElement8* This,enum OrientationType *retVal) {
    return This->lpVtbl->get_CurrentOrientation(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CurrentFrameworkId(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentFrameworkId(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CurrentIsRequiredForForm(IUIAutomationElement8* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsRequiredForForm(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CurrentItemStatus(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentItemStatus(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CurrentBoundingRectangle(IUIAutomationElement8* This,RECT *retVal) {
    return This->lpVtbl->get_CurrentBoundingRectangle(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CurrentLabeledBy(IUIAutomationElement8* This,IUIAutomationElement **retVal) {
    return This->lpVtbl->get_CurrentLabeledBy(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CurrentAriaRole(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAriaRole(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CurrentAriaProperties(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAriaProperties(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CurrentIsDataValidForForm(IUIAutomationElement8* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsDataValidForForm(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CurrentControllerFor(IUIAutomationElement8* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentControllerFor(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CurrentDescribedBy(IUIAutomationElement8* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentDescribedBy(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CurrentFlowsTo(IUIAutomationElement8* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentFlowsTo(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CurrentProviderDescription(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentProviderDescription(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CachedProcessId(IUIAutomationElement8* This,int *retVal) {
    return This->lpVtbl->get_CachedProcessId(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CachedControlType(IUIAutomationElement8* This,CONTROLTYPEID *retVal) {
    return This->lpVtbl->get_CachedControlType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CachedLocalizedControlType(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedLocalizedControlType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CachedName(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedName(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CachedAcceleratorKey(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAcceleratorKey(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CachedAccessKey(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAccessKey(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CachedHasKeyboardFocus(IUIAutomationElement8* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedHasKeyboardFocus(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CachedIsKeyboardFocusable(IUIAutomationElement8* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsKeyboardFocusable(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CachedIsEnabled(IUIAutomationElement8* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsEnabled(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CachedAutomationId(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAutomationId(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CachedClassName(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedClassName(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CachedHelpText(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedHelpText(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CachedCulture(IUIAutomationElement8* This,int *retVal) {
    return This->lpVtbl->get_CachedCulture(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CachedIsControlElement(IUIAutomationElement8* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsControlElement(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CachedIsContentElement(IUIAutomationElement8* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsContentElement(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CachedIsPassword(IUIAutomationElement8* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsPassword(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CachedNativeWindowHandle(IUIAutomationElement8* This,UIA_HWND *retVal) {
    return This->lpVtbl->get_CachedNativeWindowHandle(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CachedItemType(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedItemType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CachedIsOffscreen(IUIAutomationElement8* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsOffscreen(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CachedOrientation(IUIAutomationElement8* This,enum OrientationType *retVal) {
    return This->lpVtbl->get_CachedOrientation(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CachedFrameworkId(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedFrameworkId(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CachedIsRequiredForForm(IUIAutomationElement8* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsRequiredForForm(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CachedItemStatus(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedItemStatus(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CachedBoundingRectangle(IUIAutomationElement8* This,RECT *retVal) {
    return This->lpVtbl->get_CachedBoundingRectangle(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CachedLabeledBy(IUIAutomationElement8* This,IUIAutomationElement **retVal) {
    return This->lpVtbl->get_CachedLabeledBy(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CachedAriaRole(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAriaRole(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CachedAriaProperties(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAriaProperties(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CachedIsDataValidForForm(IUIAutomationElement8* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsDataValidForForm(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CachedControllerFor(IUIAutomationElement8* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedControllerFor(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CachedDescribedBy(IUIAutomationElement8* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedDescribedBy(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CachedFlowsTo(IUIAutomationElement8* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedFlowsTo(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CachedProviderDescription(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedProviderDescription(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_GetClickablePoint(IUIAutomationElement8* This,POINT *clickable,WINBOOL *gotClickable) {
    return This->lpVtbl->GetClickablePoint(This,clickable,gotClickable);
}
/*** IUIAutomationElement2 methods ***/
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CurrentOptimizeForVisualContent(IUIAutomationElement8* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentOptimizeForVisualContent(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CachedOptimizeForVisualContent(IUIAutomationElement8* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedOptimizeForVisualContent(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CurrentLiveSetting(IUIAutomationElement8* This,enum LiveSetting *retVal) {
    return This->lpVtbl->get_CurrentLiveSetting(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CachedLiveSetting(IUIAutomationElement8* This,enum LiveSetting *retVal) {
    return This->lpVtbl->get_CachedLiveSetting(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CurrentFlowsFrom(IUIAutomationElement8* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentFlowsFrom(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CachedFlowsFrom(IUIAutomationElement8* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedFlowsFrom(This,retVal);
}
/*** IUIAutomationElement3 methods ***/
static __WIDL_INLINE HRESULT IUIAutomationElement8_ShowContextMenu(IUIAutomationElement8* This) {
    return This->lpVtbl->ShowContextMenu(This);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CurrentIsPeripheral(IUIAutomationElement8* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsPeripheral(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CachedIsPeripheral(IUIAutomationElement8* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsPeripheral(This,retVal);
}
/*** IUIAutomationElement4 methods ***/
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CurrentPositionInSet(IUIAutomationElement8* This,int *retVal) {
    return This->lpVtbl->get_CurrentPositionInSet(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CurrentSizeOfSet(IUIAutomationElement8* This,int *retVal) {
    return This->lpVtbl->get_CurrentSizeOfSet(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CurrentLevel(IUIAutomationElement8* This,int *retVal) {
    return This->lpVtbl->get_CurrentLevel(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CurrentAnnotationTypes(IUIAutomationElement8* This,SAFEARRAY **retVal) {
    return This->lpVtbl->get_CurrentAnnotationTypes(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CurrentAnnotationObjects(IUIAutomationElement8* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentAnnotationObjects(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CachedPositionInSet(IUIAutomationElement8* This,int *retVal) {
    return This->lpVtbl->get_CachedPositionInSet(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CachedSizeOfSet(IUIAutomationElement8* This,int *retVal) {
    return This->lpVtbl->get_CachedSizeOfSet(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CachedLevel(IUIAutomationElement8* This,int *retVal) {
    return This->lpVtbl->get_CachedLevel(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CachedAnnotationTypes(IUIAutomationElement8* This,SAFEARRAY **retVal) {
    return This->lpVtbl->get_CachedAnnotationTypes(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CachedAnnotationObjects(IUIAutomationElement8* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedAnnotationObjects(This,retVal);
}
/*** IUIAutomationElement5 methods ***/
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CurrentLandmarkType(IUIAutomationElement8* This,LANDMARKTYPEID *retVal) {
    return This->lpVtbl->get_CurrentLandmarkType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CurrentLocalizedLandmarkType(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentLocalizedLandmarkType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CachedLandmarkType(IUIAutomationElement8* This,LANDMARKTYPEID *retVal) {
    return This->lpVtbl->get_CachedLandmarkType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CachedLocalizedLandmarkType(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedLocalizedLandmarkType(This,retVal);
}
/*** IUIAutomationElement6 methods ***/
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CurrentFullDescription(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentFullDescription(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CachedFullDescription(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedFullDescription(This,retVal);
}
/*** IUIAutomationElement7 methods ***/
static __WIDL_INLINE HRESULT IUIAutomationElement8_FindFirstWithOptions(IUIAutomationElement8* This,enum TreeScope scope,IUIAutomationCondition *condition,enum TreeTraversalOptions traversalOptions,IUIAutomationElement *root,IUIAutomationElement **found) {
    return This->lpVtbl->FindFirstWithOptions(This,scope,condition,traversalOptions,root,found);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_FindAllWithOptions(IUIAutomationElement8* This,enum TreeScope scope,IUIAutomationCondition *condition,enum TreeTraversalOptions traversalOptions,IUIAutomationElement *root,IUIAutomationElementArray **found) {
    return This->lpVtbl->FindAllWithOptions(This,scope,condition,traversalOptions,root,found);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_FindFirstWithOptionsBuildCache(IUIAutomationElement8* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationCacheRequest *cacheRequest,enum TreeTraversalOptions traversalOptions,IUIAutomationElement *root,IUIAutomationElement **found) {
    return This->lpVtbl->FindFirstWithOptionsBuildCache(This,scope,condition,cacheRequest,traversalOptions,root,found);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_FindAllWithOptionsBuildCache(IUIAutomationElement8* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationCacheRequest *cacheRequest,enum TreeTraversalOptions traversalOptions,IUIAutomationElement *root,IUIAutomationElementArray **found) {
    return This->lpVtbl->FindAllWithOptionsBuildCache(This,scope,condition,cacheRequest,traversalOptions,root,found);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_GetCurrentMetadataValue(IUIAutomationElement8* This,int targetId,METADATAID metadataId,VARIANT *returnVal) {
    return This->lpVtbl->GetCurrentMetadataValue(This,targetId,metadataId,returnVal);
}
/*** IUIAutomationElement8 methods ***/
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CurrentHeadingLevel(IUIAutomationElement8* This,HEADINGLEVELID *retVal) {
    return This->lpVtbl->get_CurrentHeadingLevel(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement8_get_CachedHeadingLevel(IUIAutomationElement8* This,HEADINGLEVELID *retVal) {
    return This->lpVtbl->get_CachedHeadingLevel(This,retVal);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationElement8_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationElement9 interface
 */
#ifndef __IUIAutomationElement9_INTERFACE_DEFINED__
#define __IUIAutomationElement9_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationElement9, 0x39325fac, 0x039d, 0x440e, 0xa3,0xa3, 0x5e,0xb8,0x1a,0x5c,0xec,0xc3);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("39325fac-039d-440e-a3a3-5eb81a5cecc3")
IUIAutomationElement9 : public IUIAutomationElement8
{
    virtual HRESULT STDMETHODCALLTYPE get_CurrentIsDialog(
        WINBOOL *retVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CachedIsDialog(
        WINBOOL *retVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationElement9, 0x39325fac, 0x039d, 0x440e, 0xa3,0xa3, 0x5e,0xb8,0x1a,0x5c,0xec,0xc3)
#endif
#else
typedef struct IUIAutomationElement9Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomationElement methods ***/
    HRESULT (STDMETHODCALLTYPE *SetFocus)(
        IUIAutomationElement9 *This);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeId)(
        IUIAutomationElement9 *This,
        SAFEARRAY **runtimeId);

    HRESULT (STDMETHODCALLTYPE *FindFirst)(
        IUIAutomationElement9 *This,
        enum TreeScope scope,
        IUIAutomationCondition *condition,
        IUIAutomationElement **found);

    HRESULT (STDMETHODCALLTYPE *FindAll)(
        IUIAutomationElement9 *This,
        enum TreeScope scope,
        IUIAutomationCondition *condition,
        IUIAutomationElementArray **found);

    HRESULT (STDMETHODCALLTYPE *FindFirstBuildCache)(
        IUIAutomationElement9 *This,
        enum TreeScope scope,
        IUIAutomationCondition *condition,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **found);

    HRESULT (STDMETHODCALLTYPE *FindAllBuildCache)(
        IUIAutomationElement9 *This,
        enum TreeScope scope,
        IUIAutomationCondition *condition,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElementArray **found);

    HRESULT (STDMETHODCALLTYPE *BuildUpdatedCache)(
        IUIAutomationElement9 *This,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **updatedElement);

    HRESULT (STDMETHODCALLTYPE *GetCurrentPropertyValue)(
        IUIAutomationElement9 *This,
        PROPERTYID propertyId,
        VARIANT *retVal);

    HRESULT (STDMETHODCALLTYPE *GetCurrentPropertyValueEx)(
        IUIAutomationElement9 *This,
        PROPERTYID propertyId,
        WINBOOL ignoreDefaultValue,
        VARIANT *retVal);

    HRESULT (STDMETHODCALLTYPE *GetCachedPropertyValue)(
        IUIAutomationElement9 *This,
        PROPERTYID propertyId,
        VARIANT *retVal);

    HRESULT (STDMETHODCALLTYPE *GetCachedPropertyValueEx)(
        IUIAutomationElement9 *This,
        PROPERTYID propertyId,
        WINBOOL ignoreDefaultValue,
        VARIANT *retVal);

    HRESULT (STDMETHODCALLTYPE *GetCurrentPatternAs)(
        IUIAutomationElement9 *This,
        PATTERNID patternId,
        REFIID riid,
        void **patternObject);

    HRESULT (STDMETHODCALLTYPE *GetCachedPatternAs)(
        IUIAutomationElement9 *This,
        PATTERNID patternId,
        REFIID riid,
        void **patternObject);

    HRESULT (STDMETHODCALLTYPE *GetCurrentPattern)(
        IUIAutomationElement9 *This,
        PATTERNID patternId,
        IUnknown **patternObject);

    HRESULT (STDMETHODCALLTYPE *GetCachedPattern)(
        IUIAutomationElement9 *This,
        PATTERNID patternId,
        IUnknown **patternObject);

    HRESULT (STDMETHODCALLTYPE *GetCachedParent)(
        IUIAutomationElement9 *This,
        IUIAutomationElement **parent);

    HRESULT (STDMETHODCALLTYPE *GetCachedChildren)(
        IUIAutomationElement9 *This,
        IUIAutomationElementArray **children);

    HRESULT (STDMETHODCALLTYPE *get_CurrentProcessId)(
        IUIAutomationElement9 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentControlType)(
        IUIAutomationElement9 *This,
        CONTROLTYPEID *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentLocalizedControlType)(
        IUIAutomationElement9 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentName)(
        IUIAutomationElement9 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAcceleratorKey)(
        IUIAutomationElement9 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAccessKey)(
        IUIAutomationElement9 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentHasKeyboardFocus)(
        IUIAutomationElement9 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsKeyboardFocusable)(
        IUIAutomationElement9 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsEnabled)(
        IUIAutomationElement9 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAutomationId)(
        IUIAutomationElement9 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentClassName)(
        IUIAutomationElement9 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentHelpText)(
        IUIAutomationElement9 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentCulture)(
        IUIAutomationElement9 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsControlElement)(
        IUIAutomationElement9 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsContentElement)(
        IUIAutomationElement9 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsPassword)(
        IUIAutomationElement9 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentNativeWindowHandle)(
        IUIAutomationElement9 *This,
        UIA_HWND *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentItemType)(
        IUIAutomationElement9 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsOffscreen)(
        IUIAutomationElement9 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentOrientation)(
        IUIAutomationElement9 *This,
        enum OrientationType *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentFrameworkId)(
        IUIAutomationElement9 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsRequiredForForm)(
        IUIAutomationElement9 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentItemStatus)(
        IUIAutomationElement9 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentBoundingRectangle)(
        IUIAutomationElement9 *This,
        RECT *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentLabeledBy)(
        IUIAutomationElement9 *This,
        IUIAutomationElement **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAriaRole)(
        IUIAutomationElement9 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAriaProperties)(
        IUIAutomationElement9 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsDataValidForForm)(
        IUIAutomationElement9 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentControllerFor)(
        IUIAutomationElement9 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentDescribedBy)(
        IUIAutomationElement9 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentFlowsTo)(
        IUIAutomationElement9 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentProviderDescription)(
        IUIAutomationElement9 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedProcessId)(
        IUIAutomationElement9 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedControlType)(
        IUIAutomationElement9 *This,
        CONTROLTYPEID *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedLocalizedControlType)(
        IUIAutomationElement9 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedName)(
        IUIAutomationElement9 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAcceleratorKey)(
        IUIAutomationElement9 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAccessKey)(
        IUIAutomationElement9 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedHasKeyboardFocus)(
        IUIAutomationElement9 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsKeyboardFocusable)(
        IUIAutomationElement9 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsEnabled)(
        IUIAutomationElement9 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAutomationId)(
        IUIAutomationElement9 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedClassName)(
        IUIAutomationElement9 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedHelpText)(
        IUIAutomationElement9 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedCulture)(
        IUIAutomationElement9 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsControlElement)(
        IUIAutomationElement9 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsContentElement)(
        IUIAutomationElement9 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsPassword)(
        IUIAutomationElement9 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedNativeWindowHandle)(
        IUIAutomationElement9 *This,
        UIA_HWND *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedItemType)(
        IUIAutomationElement9 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsOffscreen)(
        IUIAutomationElement9 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedOrientation)(
        IUIAutomationElement9 *This,
        enum OrientationType *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedFrameworkId)(
        IUIAutomationElement9 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsRequiredForForm)(
        IUIAutomationElement9 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedItemStatus)(
        IUIAutomationElement9 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedBoundingRectangle)(
        IUIAutomationElement9 *This,
        RECT *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedLabeledBy)(
        IUIAutomationElement9 *This,
        IUIAutomationElement **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAriaRole)(
        IUIAutomationElement9 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAriaProperties)(
        IUIAutomationElement9 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsDataValidForForm)(
        IUIAutomationElement9 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedControllerFor)(
        IUIAutomationElement9 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedDescribedBy)(
        IUIAutomationElement9 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedFlowsTo)(
        IUIAutomationElement9 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedProviderDescription)(
        IUIAutomationElement9 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *GetClickablePoint)(
        IUIAutomationElement9 *This,
        POINT *clickable,
        WINBOOL *gotClickable);

    /*** IUIAutomationElement2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CurrentOptimizeForVisualContent)(
        IUIAutomationElement9 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedOptimizeForVisualContent)(
        IUIAutomationElement9 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentLiveSetting)(
        IUIAutomationElement9 *This,
        enum LiveSetting *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedLiveSetting)(
        IUIAutomationElement9 *This,
        enum LiveSetting *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentFlowsFrom)(
        IUIAutomationElement9 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedFlowsFrom)(
        IUIAutomationElement9 *This,
        IUIAutomationElementArray **retVal);

    /*** IUIAutomationElement3 methods ***/
    HRESULT (STDMETHODCALLTYPE *ShowContextMenu)(
        IUIAutomationElement9 *This);

    HRESULT (STDMETHODCALLTYPE *get_CurrentIsPeripheral)(
        IUIAutomationElement9 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsPeripheral)(
        IUIAutomationElement9 *This,
        WINBOOL *retVal);

    /*** IUIAutomationElement4 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CurrentPositionInSet)(
        IUIAutomationElement9 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentSizeOfSet)(
        IUIAutomationElement9 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentLevel)(
        IUIAutomationElement9 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAnnotationTypes)(
        IUIAutomationElement9 *This,
        SAFEARRAY **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentAnnotationObjects)(
        IUIAutomationElement9 *This,
        IUIAutomationElementArray **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedPositionInSet)(
        IUIAutomationElement9 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedSizeOfSet)(
        IUIAutomationElement9 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedLevel)(
        IUIAutomationElement9 *This,
        int *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAnnotationTypes)(
        IUIAutomationElement9 *This,
        SAFEARRAY **retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedAnnotationObjects)(
        IUIAutomationElement9 *This,
        IUIAutomationElementArray **retVal);

    /*** IUIAutomationElement5 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CurrentLandmarkType)(
        IUIAutomationElement9 *This,
        LANDMARKTYPEID *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CurrentLocalizedLandmarkType)(
        IUIAutomationElement9 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedLandmarkType)(
        IUIAutomationElement9 *This,
        LANDMARKTYPEID *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedLocalizedLandmarkType)(
        IUIAutomationElement9 *This,
        BSTR *retVal);

    /*** IUIAutomationElement6 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CurrentFullDescription)(
        IUIAutomationElement9 *This,
        BSTR *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedFullDescription)(
        IUIAutomationElement9 *This,
        BSTR *retVal);

    /*** IUIAutomationElement7 methods ***/
    HRESULT (STDMETHODCALLTYPE *FindFirstWithOptions)(
        IUIAutomationElement9 *This,
        enum TreeScope scope,
        IUIAutomationCondition *condition,
        enum TreeTraversalOptions traversalOptions,
        IUIAutomationElement *root,
        IUIAutomationElement **found);

    HRESULT (STDMETHODCALLTYPE *FindAllWithOptions)(
        IUIAutomationElement9 *This,
        enum TreeScope scope,
        IUIAutomationCondition *condition,
        enum TreeTraversalOptions traversalOptions,
        IUIAutomationElement *root,
        IUIAutomationElementArray **found);

    HRESULT (STDMETHODCALLTYPE *FindFirstWithOptionsBuildCache)(
        IUIAutomationElement9 *This,
        enum TreeScope scope,
        IUIAutomationCondition *condition,
        IUIAutomationCacheRequest *cacheRequest,
        enum TreeTraversalOptions traversalOptions,
        IUIAutomationElement *root,
        IUIAutomationElement **found);

    HRESULT (STDMETHODCALLTYPE *FindAllWithOptionsBuildCache)(
        IUIAutomationElement9 *This,
        enum TreeScope scope,
        IUIAutomationCondition *condition,
        IUIAutomationCacheRequest *cacheRequest,
        enum TreeTraversalOptions traversalOptions,
        IUIAutomationElement *root,
        IUIAutomationElementArray **found);

    HRESULT (STDMETHODCALLTYPE *GetCurrentMetadataValue)(
        IUIAutomationElement9 *This,
        int targetId,
        METADATAID metadataId,
        VARIANT *returnVal);

    /*** IUIAutomationElement8 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CurrentHeadingLevel)(
        IUIAutomationElement9 *This,
        HEADINGLEVELID *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedHeadingLevel)(
        IUIAutomationElement9 *This,
        HEADINGLEVELID *retVal);

    /*** IUIAutomationElement9 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CurrentIsDialog)(
        IUIAutomationElement9 *This,
        WINBOOL *retVal);

    HRESULT (STDMETHODCALLTYPE *get_CachedIsDialog)(
        IUIAutomationElement9 *This,
        WINBOOL *retVal);

    END_INTERFACE
} IUIAutomationElement9Vtbl;

interface IUIAutomationElement9 {
    CONST_VTBL IUIAutomationElement9Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationElement9_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationElement9_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationElement9_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationElement methods ***/
#define IUIAutomationElement9_SetFocus(This) (This)->lpVtbl->SetFocus(This)
#define IUIAutomationElement9_GetRuntimeId(This,runtimeId) (This)->lpVtbl->GetRuntimeId(This,runtimeId)
#define IUIAutomationElement9_FindFirst(This,scope,condition,found) (This)->lpVtbl->FindFirst(This,scope,condition,found)
#define IUIAutomationElement9_FindAll(This,scope,condition,found) (This)->lpVtbl->FindAll(This,scope,condition,found)
#define IUIAutomationElement9_FindFirstBuildCache(This,scope,condition,cacheRequest,found) (This)->lpVtbl->FindFirstBuildCache(This,scope,condition,cacheRequest,found)
#define IUIAutomationElement9_FindAllBuildCache(This,scope,condition,cacheRequest,found) (This)->lpVtbl->FindAllBuildCache(This,scope,condition,cacheRequest,found)
#define IUIAutomationElement9_BuildUpdatedCache(This,cacheRequest,updatedElement) (This)->lpVtbl->BuildUpdatedCache(This,cacheRequest,updatedElement)
#define IUIAutomationElement9_GetCurrentPropertyValue(This,propertyId,retVal) (This)->lpVtbl->GetCurrentPropertyValue(This,propertyId,retVal)
#define IUIAutomationElement9_GetCurrentPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal) (This)->lpVtbl->GetCurrentPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal)
#define IUIAutomationElement9_GetCachedPropertyValue(This,propertyId,retVal) (This)->lpVtbl->GetCachedPropertyValue(This,propertyId,retVal)
#define IUIAutomationElement9_GetCachedPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal) (This)->lpVtbl->GetCachedPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal)
#define IUIAutomationElement9_GetCurrentPatternAs(This,patternId,riid,patternObject) (This)->lpVtbl->GetCurrentPatternAs(This,patternId,riid,patternObject)
#define IUIAutomationElement9_GetCachedPatternAs(This,patternId,riid,patternObject) (This)->lpVtbl->GetCachedPatternAs(This,patternId,riid,patternObject)
#define IUIAutomationElement9_GetCurrentPattern(This,patternId,patternObject) (This)->lpVtbl->GetCurrentPattern(This,patternId,patternObject)
#define IUIAutomationElement9_GetCachedPattern(This,patternId,patternObject) (This)->lpVtbl->GetCachedPattern(This,patternId,patternObject)
#define IUIAutomationElement9_GetCachedParent(This,parent) (This)->lpVtbl->GetCachedParent(This,parent)
#define IUIAutomationElement9_GetCachedChildren(This,children) (This)->lpVtbl->GetCachedChildren(This,children)
#define IUIAutomationElement9_get_CurrentProcessId(This,retVal) (This)->lpVtbl->get_CurrentProcessId(This,retVal)
#define IUIAutomationElement9_get_CurrentControlType(This,retVal) (This)->lpVtbl->get_CurrentControlType(This,retVal)
#define IUIAutomationElement9_get_CurrentLocalizedControlType(This,retVal) (This)->lpVtbl->get_CurrentLocalizedControlType(This,retVal)
#define IUIAutomationElement9_get_CurrentName(This,retVal) (This)->lpVtbl->get_CurrentName(This,retVal)
#define IUIAutomationElement9_get_CurrentAcceleratorKey(This,retVal) (This)->lpVtbl->get_CurrentAcceleratorKey(This,retVal)
#define IUIAutomationElement9_get_CurrentAccessKey(This,retVal) (This)->lpVtbl->get_CurrentAccessKey(This,retVal)
#define IUIAutomationElement9_get_CurrentHasKeyboardFocus(This,retVal) (This)->lpVtbl->get_CurrentHasKeyboardFocus(This,retVal)
#define IUIAutomationElement9_get_CurrentIsKeyboardFocusable(This,retVal) (This)->lpVtbl->get_CurrentIsKeyboardFocusable(This,retVal)
#define IUIAutomationElement9_get_CurrentIsEnabled(This,retVal) (This)->lpVtbl->get_CurrentIsEnabled(This,retVal)
#define IUIAutomationElement9_get_CurrentAutomationId(This,retVal) (This)->lpVtbl->get_CurrentAutomationId(This,retVal)
#define IUIAutomationElement9_get_CurrentClassName(This,retVal) (This)->lpVtbl->get_CurrentClassName(This,retVal)
#define IUIAutomationElement9_get_CurrentHelpText(This,retVal) (This)->lpVtbl->get_CurrentHelpText(This,retVal)
#define IUIAutomationElement9_get_CurrentCulture(This,retVal) (This)->lpVtbl->get_CurrentCulture(This,retVal)
#define IUIAutomationElement9_get_CurrentIsControlElement(This,retVal) (This)->lpVtbl->get_CurrentIsControlElement(This,retVal)
#define IUIAutomationElement9_get_CurrentIsContentElement(This,retVal) (This)->lpVtbl->get_CurrentIsContentElement(This,retVal)
#define IUIAutomationElement9_get_CurrentIsPassword(This,retVal) (This)->lpVtbl->get_CurrentIsPassword(This,retVal)
#define IUIAutomationElement9_get_CurrentNativeWindowHandle(This,retVal) (This)->lpVtbl->get_CurrentNativeWindowHandle(This,retVal)
#define IUIAutomationElement9_get_CurrentItemType(This,retVal) (This)->lpVtbl->get_CurrentItemType(This,retVal)
#define IUIAutomationElement9_get_CurrentIsOffscreen(This,retVal) (This)->lpVtbl->get_CurrentIsOffscreen(This,retVal)
#define IUIAutomationElement9_get_CurrentOrientation(This,retVal) (This)->lpVtbl->get_CurrentOrientation(This,retVal)
#define IUIAutomationElement9_get_CurrentFrameworkId(This,retVal) (This)->lpVtbl->get_CurrentFrameworkId(This,retVal)
#define IUIAutomationElement9_get_CurrentIsRequiredForForm(This,retVal) (This)->lpVtbl->get_CurrentIsRequiredForForm(This,retVal)
#define IUIAutomationElement9_get_CurrentItemStatus(This,retVal) (This)->lpVtbl->get_CurrentItemStatus(This,retVal)
#define IUIAutomationElement9_get_CurrentBoundingRectangle(This,retVal) (This)->lpVtbl->get_CurrentBoundingRectangle(This,retVal)
#define IUIAutomationElement9_get_CurrentLabeledBy(This,retVal) (This)->lpVtbl->get_CurrentLabeledBy(This,retVal)
#define IUIAutomationElement9_get_CurrentAriaRole(This,retVal) (This)->lpVtbl->get_CurrentAriaRole(This,retVal)
#define IUIAutomationElement9_get_CurrentAriaProperties(This,retVal) (This)->lpVtbl->get_CurrentAriaProperties(This,retVal)
#define IUIAutomationElement9_get_CurrentIsDataValidForForm(This,retVal) (This)->lpVtbl->get_CurrentIsDataValidForForm(This,retVal)
#define IUIAutomationElement9_get_CurrentControllerFor(This,retVal) (This)->lpVtbl->get_CurrentControllerFor(This,retVal)
#define IUIAutomationElement9_get_CurrentDescribedBy(This,retVal) (This)->lpVtbl->get_CurrentDescribedBy(This,retVal)
#define IUIAutomationElement9_get_CurrentFlowsTo(This,retVal) (This)->lpVtbl->get_CurrentFlowsTo(This,retVal)
#define IUIAutomationElement9_get_CurrentProviderDescription(This,retVal) (This)->lpVtbl->get_CurrentProviderDescription(This,retVal)
#define IUIAutomationElement9_get_CachedProcessId(This,retVal) (This)->lpVtbl->get_CachedProcessId(This,retVal)
#define IUIAutomationElement9_get_CachedControlType(This,retVal) (This)->lpVtbl->get_CachedControlType(This,retVal)
#define IUIAutomationElement9_get_CachedLocalizedControlType(This,retVal) (This)->lpVtbl->get_CachedLocalizedControlType(This,retVal)
#define IUIAutomationElement9_get_CachedName(This,retVal) (This)->lpVtbl->get_CachedName(This,retVal)
#define IUIAutomationElement9_get_CachedAcceleratorKey(This,retVal) (This)->lpVtbl->get_CachedAcceleratorKey(This,retVal)
#define IUIAutomationElement9_get_CachedAccessKey(This,retVal) (This)->lpVtbl->get_CachedAccessKey(This,retVal)
#define IUIAutomationElement9_get_CachedHasKeyboardFocus(This,retVal) (This)->lpVtbl->get_CachedHasKeyboardFocus(This,retVal)
#define IUIAutomationElement9_get_CachedIsKeyboardFocusable(This,retVal) (This)->lpVtbl->get_CachedIsKeyboardFocusable(This,retVal)
#define IUIAutomationElement9_get_CachedIsEnabled(This,retVal) (This)->lpVtbl->get_CachedIsEnabled(This,retVal)
#define IUIAutomationElement9_get_CachedAutomationId(This,retVal) (This)->lpVtbl->get_CachedAutomationId(This,retVal)
#define IUIAutomationElement9_get_CachedClassName(This,retVal) (This)->lpVtbl->get_CachedClassName(This,retVal)
#define IUIAutomationElement9_get_CachedHelpText(This,retVal) (This)->lpVtbl->get_CachedHelpText(This,retVal)
#define IUIAutomationElement9_get_CachedCulture(This,retVal) (This)->lpVtbl->get_CachedCulture(This,retVal)
#define IUIAutomationElement9_get_CachedIsControlElement(This,retVal) (This)->lpVtbl->get_CachedIsControlElement(This,retVal)
#define IUIAutomationElement9_get_CachedIsContentElement(This,retVal) (This)->lpVtbl->get_CachedIsContentElement(This,retVal)
#define IUIAutomationElement9_get_CachedIsPassword(This,retVal) (This)->lpVtbl->get_CachedIsPassword(This,retVal)
#define IUIAutomationElement9_get_CachedNativeWindowHandle(This,retVal) (This)->lpVtbl->get_CachedNativeWindowHandle(This,retVal)
#define IUIAutomationElement9_get_CachedItemType(This,retVal) (This)->lpVtbl->get_CachedItemType(This,retVal)
#define IUIAutomationElement9_get_CachedIsOffscreen(This,retVal) (This)->lpVtbl->get_CachedIsOffscreen(This,retVal)
#define IUIAutomationElement9_get_CachedOrientation(This,retVal) (This)->lpVtbl->get_CachedOrientation(This,retVal)
#define IUIAutomationElement9_get_CachedFrameworkId(This,retVal) (This)->lpVtbl->get_CachedFrameworkId(This,retVal)
#define IUIAutomationElement9_get_CachedIsRequiredForForm(This,retVal) (This)->lpVtbl->get_CachedIsRequiredForForm(This,retVal)
#define IUIAutomationElement9_get_CachedItemStatus(This,retVal) (This)->lpVtbl->get_CachedItemStatus(This,retVal)
#define IUIAutomationElement9_get_CachedBoundingRectangle(This,retVal) (This)->lpVtbl->get_CachedBoundingRectangle(This,retVal)
#define IUIAutomationElement9_get_CachedLabeledBy(This,retVal) (This)->lpVtbl->get_CachedLabeledBy(This,retVal)
#define IUIAutomationElement9_get_CachedAriaRole(This,retVal) (This)->lpVtbl->get_CachedAriaRole(This,retVal)
#define IUIAutomationElement9_get_CachedAriaProperties(This,retVal) (This)->lpVtbl->get_CachedAriaProperties(This,retVal)
#define IUIAutomationElement9_get_CachedIsDataValidForForm(This,retVal) (This)->lpVtbl->get_CachedIsDataValidForForm(This,retVal)
#define IUIAutomationElement9_get_CachedControllerFor(This,retVal) (This)->lpVtbl->get_CachedControllerFor(This,retVal)
#define IUIAutomationElement9_get_CachedDescribedBy(This,retVal) (This)->lpVtbl->get_CachedDescribedBy(This,retVal)
#define IUIAutomationElement9_get_CachedFlowsTo(This,retVal) (This)->lpVtbl->get_CachedFlowsTo(This,retVal)
#define IUIAutomationElement9_get_CachedProviderDescription(This,retVal) (This)->lpVtbl->get_CachedProviderDescription(This,retVal)
#define IUIAutomationElement9_GetClickablePoint(This,clickable,gotClickable) (This)->lpVtbl->GetClickablePoint(This,clickable,gotClickable)
/*** IUIAutomationElement2 methods ***/
#define IUIAutomationElement9_get_CurrentOptimizeForVisualContent(This,retVal) (This)->lpVtbl->get_CurrentOptimizeForVisualContent(This,retVal)
#define IUIAutomationElement9_get_CachedOptimizeForVisualContent(This,retVal) (This)->lpVtbl->get_CachedOptimizeForVisualContent(This,retVal)
#define IUIAutomationElement9_get_CurrentLiveSetting(This,retVal) (This)->lpVtbl->get_CurrentLiveSetting(This,retVal)
#define IUIAutomationElement9_get_CachedLiveSetting(This,retVal) (This)->lpVtbl->get_CachedLiveSetting(This,retVal)
#define IUIAutomationElement9_get_CurrentFlowsFrom(This,retVal) (This)->lpVtbl->get_CurrentFlowsFrom(This,retVal)
#define IUIAutomationElement9_get_CachedFlowsFrom(This,retVal) (This)->lpVtbl->get_CachedFlowsFrom(This,retVal)
/*** IUIAutomationElement3 methods ***/
#define IUIAutomationElement9_ShowContextMenu(This) (This)->lpVtbl->ShowContextMenu(This)
#define IUIAutomationElement9_get_CurrentIsPeripheral(This,retVal) (This)->lpVtbl->get_CurrentIsPeripheral(This,retVal)
#define IUIAutomationElement9_get_CachedIsPeripheral(This,retVal) (This)->lpVtbl->get_CachedIsPeripheral(This,retVal)
/*** IUIAutomationElement4 methods ***/
#define IUIAutomationElement9_get_CurrentPositionInSet(This,retVal) (This)->lpVtbl->get_CurrentPositionInSet(This,retVal)
#define IUIAutomationElement9_get_CurrentSizeOfSet(This,retVal) (This)->lpVtbl->get_CurrentSizeOfSet(This,retVal)
#define IUIAutomationElement9_get_CurrentLevel(This,retVal) (This)->lpVtbl->get_CurrentLevel(This,retVal)
#define IUIAutomationElement9_get_CurrentAnnotationTypes(This,retVal) (This)->lpVtbl->get_CurrentAnnotationTypes(This,retVal)
#define IUIAutomationElement9_get_CurrentAnnotationObjects(This,retVal) (This)->lpVtbl->get_CurrentAnnotationObjects(This,retVal)
#define IUIAutomationElement9_get_CachedPositionInSet(This,retVal) (This)->lpVtbl->get_CachedPositionInSet(This,retVal)
#define IUIAutomationElement9_get_CachedSizeOfSet(This,retVal) (This)->lpVtbl->get_CachedSizeOfSet(This,retVal)
#define IUIAutomationElement9_get_CachedLevel(This,retVal) (This)->lpVtbl->get_CachedLevel(This,retVal)
#define IUIAutomationElement9_get_CachedAnnotationTypes(This,retVal) (This)->lpVtbl->get_CachedAnnotationTypes(This,retVal)
#define IUIAutomationElement9_get_CachedAnnotationObjects(This,retVal) (This)->lpVtbl->get_CachedAnnotationObjects(This,retVal)
/*** IUIAutomationElement5 methods ***/
#define IUIAutomationElement9_get_CurrentLandmarkType(This,retVal) (This)->lpVtbl->get_CurrentLandmarkType(This,retVal)
#define IUIAutomationElement9_get_CurrentLocalizedLandmarkType(This,retVal) (This)->lpVtbl->get_CurrentLocalizedLandmarkType(This,retVal)
#define IUIAutomationElement9_get_CachedLandmarkType(This,retVal) (This)->lpVtbl->get_CachedLandmarkType(This,retVal)
#define IUIAutomationElement9_get_CachedLocalizedLandmarkType(This,retVal) (This)->lpVtbl->get_CachedLocalizedLandmarkType(This,retVal)
/*** IUIAutomationElement6 methods ***/
#define IUIAutomationElement9_get_CurrentFullDescription(This,retVal) (This)->lpVtbl->get_CurrentFullDescription(This,retVal)
#define IUIAutomationElement9_get_CachedFullDescription(This,retVal) (This)->lpVtbl->get_CachedFullDescription(This,retVal)
/*** IUIAutomationElement7 methods ***/
#define IUIAutomationElement9_FindFirstWithOptions(This,scope,condition,traversalOptions,root,found) (This)->lpVtbl->FindFirstWithOptions(This,scope,condition,traversalOptions,root,found)
#define IUIAutomationElement9_FindAllWithOptions(This,scope,condition,traversalOptions,root,found) (This)->lpVtbl->FindAllWithOptions(This,scope,condition,traversalOptions,root,found)
#define IUIAutomationElement9_FindFirstWithOptionsBuildCache(This,scope,condition,cacheRequest,traversalOptions,root,found) (This)->lpVtbl->FindFirstWithOptionsBuildCache(This,scope,condition,cacheRequest,traversalOptions,root,found)
#define IUIAutomationElement9_FindAllWithOptionsBuildCache(This,scope,condition,cacheRequest,traversalOptions,root,found) (This)->lpVtbl->FindAllWithOptionsBuildCache(This,scope,condition,cacheRequest,traversalOptions,root,found)
#define IUIAutomationElement9_GetCurrentMetadataValue(This,targetId,metadataId,returnVal) (This)->lpVtbl->GetCurrentMetadataValue(This,targetId,metadataId,returnVal)
/*** IUIAutomationElement8 methods ***/
#define IUIAutomationElement9_get_CurrentHeadingLevel(This,retVal) (This)->lpVtbl->get_CurrentHeadingLevel(This,retVal)
#define IUIAutomationElement9_get_CachedHeadingLevel(This,retVal) (This)->lpVtbl->get_CachedHeadingLevel(This,retVal)
/*** IUIAutomationElement9 methods ***/
#define IUIAutomationElement9_get_CurrentIsDialog(This,retVal) (This)->lpVtbl->get_CurrentIsDialog(This,retVal)
#define IUIAutomationElement9_get_CachedIsDialog(This,retVal) (This)->lpVtbl->get_CachedIsDialog(This,retVal)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationElement9_QueryInterface(IUIAutomationElement9* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationElement9_AddRef(IUIAutomationElement9* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationElement9_Release(IUIAutomationElement9* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationElement methods ***/
static __WIDL_INLINE HRESULT IUIAutomationElement9_SetFocus(IUIAutomationElement9* This) {
    return This->lpVtbl->SetFocus(This);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_GetRuntimeId(IUIAutomationElement9* This,SAFEARRAY **runtimeId) {
    return This->lpVtbl->GetRuntimeId(This,runtimeId);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_FindFirst(IUIAutomationElement9* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationElement **found) {
    return This->lpVtbl->FindFirst(This,scope,condition,found);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_FindAll(IUIAutomationElement9* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationElementArray **found) {
    return This->lpVtbl->FindAll(This,scope,condition,found);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_FindFirstBuildCache(IUIAutomationElement9* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **found) {
    return This->lpVtbl->FindFirstBuildCache(This,scope,condition,cacheRequest,found);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_FindAllBuildCache(IUIAutomationElement9* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElementArray **found) {
    return This->lpVtbl->FindAllBuildCache(This,scope,condition,cacheRequest,found);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_BuildUpdatedCache(IUIAutomationElement9* This,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **updatedElement) {
    return This->lpVtbl->BuildUpdatedCache(This,cacheRequest,updatedElement);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_GetCurrentPropertyValue(IUIAutomationElement9* This,PROPERTYID propertyId,VARIANT *retVal) {
    return This->lpVtbl->GetCurrentPropertyValue(This,propertyId,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_GetCurrentPropertyValueEx(IUIAutomationElement9* This,PROPERTYID propertyId,WINBOOL ignoreDefaultValue,VARIANT *retVal) {
    return This->lpVtbl->GetCurrentPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_GetCachedPropertyValue(IUIAutomationElement9* This,PROPERTYID propertyId,VARIANT *retVal) {
    return This->lpVtbl->GetCachedPropertyValue(This,propertyId,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_GetCachedPropertyValueEx(IUIAutomationElement9* This,PROPERTYID propertyId,WINBOOL ignoreDefaultValue,VARIANT *retVal) {
    return This->lpVtbl->GetCachedPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_GetCurrentPatternAs(IUIAutomationElement9* This,PATTERNID patternId,REFIID riid,void **patternObject) {
    return This->lpVtbl->GetCurrentPatternAs(This,patternId,riid,patternObject);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_GetCachedPatternAs(IUIAutomationElement9* This,PATTERNID patternId,REFIID riid,void **patternObject) {
    return This->lpVtbl->GetCachedPatternAs(This,patternId,riid,patternObject);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_GetCurrentPattern(IUIAutomationElement9* This,PATTERNID patternId,IUnknown **patternObject) {
    return This->lpVtbl->GetCurrentPattern(This,patternId,patternObject);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_GetCachedPattern(IUIAutomationElement9* This,PATTERNID patternId,IUnknown **patternObject) {
    return This->lpVtbl->GetCachedPattern(This,patternId,patternObject);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_GetCachedParent(IUIAutomationElement9* This,IUIAutomationElement **parent) {
    return This->lpVtbl->GetCachedParent(This,parent);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_GetCachedChildren(IUIAutomationElement9* This,IUIAutomationElementArray **children) {
    return This->lpVtbl->GetCachedChildren(This,children);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CurrentProcessId(IUIAutomationElement9* This,int *retVal) {
    return This->lpVtbl->get_CurrentProcessId(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CurrentControlType(IUIAutomationElement9* This,CONTROLTYPEID *retVal) {
    return This->lpVtbl->get_CurrentControlType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CurrentLocalizedControlType(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentLocalizedControlType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CurrentName(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentName(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CurrentAcceleratorKey(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAcceleratorKey(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CurrentAccessKey(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAccessKey(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CurrentHasKeyboardFocus(IUIAutomationElement9* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentHasKeyboardFocus(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CurrentIsKeyboardFocusable(IUIAutomationElement9* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsKeyboardFocusable(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CurrentIsEnabled(IUIAutomationElement9* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsEnabled(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CurrentAutomationId(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAutomationId(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CurrentClassName(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentClassName(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CurrentHelpText(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentHelpText(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CurrentCulture(IUIAutomationElement9* This,int *retVal) {
    return This->lpVtbl->get_CurrentCulture(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CurrentIsControlElement(IUIAutomationElement9* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsControlElement(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CurrentIsContentElement(IUIAutomationElement9* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsContentElement(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CurrentIsPassword(IUIAutomationElement9* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsPassword(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CurrentNativeWindowHandle(IUIAutomationElement9* This,UIA_HWND *retVal) {
    return This->lpVtbl->get_CurrentNativeWindowHandle(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CurrentItemType(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentItemType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CurrentIsOffscreen(IUIAutomationElement9* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsOffscreen(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CurrentOrientation(IUIAutomationElement9* This,enum OrientationType *retVal) {
    return This->lpVtbl->get_CurrentOrientation(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CurrentFrameworkId(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentFrameworkId(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CurrentIsRequiredForForm(IUIAutomationElement9* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsRequiredForForm(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CurrentItemStatus(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentItemStatus(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CurrentBoundingRectangle(IUIAutomationElement9* This,RECT *retVal) {
    return This->lpVtbl->get_CurrentBoundingRectangle(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CurrentLabeledBy(IUIAutomationElement9* This,IUIAutomationElement **retVal) {
    return This->lpVtbl->get_CurrentLabeledBy(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CurrentAriaRole(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAriaRole(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CurrentAriaProperties(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAriaProperties(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CurrentIsDataValidForForm(IUIAutomationElement9* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsDataValidForForm(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CurrentControllerFor(IUIAutomationElement9* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentControllerFor(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CurrentDescribedBy(IUIAutomationElement9* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentDescribedBy(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CurrentFlowsTo(IUIAutomationElement9* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentFlowsTo(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CurrentProviderDescription(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentProviderDescription(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CachedProcessId(IUIAutomationElement9* This,int *retVal) {
    return This->lpVtbl->get_CachedProcessId(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CachedControlType(IUIAutomationElement9* This,CONTROLTYPEID *retVal) {
    return This->lpVtbl->get_CachedControlType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CachedLocalizedControlType(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedLocalizedControlType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CachedName(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedName(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CachedAcceleratorKey(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAcceleratorKey(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CachedAccessKey(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAccessKey(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CachedHasKeyboardFocus(IUIAutomationElement9* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedHasKeyboardFocus(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CachedIsKeyboardFocusable(IUIAutomationElement9* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsKeyboardFocusable(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CachedIsEnabled(IUIAutomationElement9* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsEnabled(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CachedAutomationId(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAutomationId(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CachedClassName(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedClassName(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CachedHelpText(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedHelpText(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CachedCulture(IUIAutomationElement9* This,int *retVal) {
    return This->lpVtbl->get_CachedCulture(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CachedIsControlElement(IUIAutomationElement9* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsControlElement(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CachedIsContentElement(IUIAutomationElement9* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsContentElement(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CachedIsPassword(IUIAutomationElement9* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsPassword(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CachedNativeWindowHandle(IUIAutomationElement9* This,UIA_HWND *retVal) {
    return This->lpVtbl->get_CachedNativeWindowHandle(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CachedItemType(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedItemType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CachedIsOffscreen(IUIAutomationElement9* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsOffscreen(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CachedOrientation(IUIAutomationElement9* This,enum OrientationType *retVal) {
    return This->lpVtbl->get_CachedOrientation(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CachedFrameworkId(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedFrameworkId(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CachedIsRequiredForForm(IUIAutomationElement9* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsRequiredForForm(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CachedItemStatus(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedItemStatus(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CachedBoundingRectangle(IUIAutomationElement9* This,RECT *retVal) {
    return This->lpVtbl->get_CachedBoundingRectangle(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CachedLabeledBy(IUIAutomationElement9* This,IUIAutomationElement **retVal) {
    return This->lpVtbl->get_CachedLabeledBy(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CachedAriaRole(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAriaRole(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CachedAriaProperties(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAriaProperties(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CachedIsDataValidForForm(IUIAutomationElement9* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsDataValidForForm(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CachedControllerFor(IUIAutomationElement9* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedControllerFor(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CachedDescribedBy(IUIAutomationElement9* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedDescribedBy(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CachedFlowsTo(IUIAutomationElement9* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedFlowsTo(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CachedProviderDescription(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedProviderDescription(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_GetClickablePoint(IUIAutomationElement9* This,POINT *clickable,WINBOOL *gotClickable) {
    return This->lpVtbl->GetClickablePoint(This,clickable,gotClickable);
}
/*** IUIAutomationElement2 methods ***/
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CurrentOptimizeForVisualContent(IUIAutomationElement9* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentOptimizeForVisualContent(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CachedOptimizeForVisualContent(IUIAutomationElement9* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedOptimizeForVisualContent(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CurrentLiveSetting(IUIAutomationElement9* This,enum LiveSetting *retVal) {
    return This->lpVtbl->get_CurrentLiveSetting(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CachedLiveSetting(IUIAutomationElement9* This,enum LiveSetting *retVal) {
    return This->lpVtbl->get_CachedLiveSetting(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CurrentFlowsFrom(IUIAutomationElement9* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentFlowsFrom(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CachedFlowsFrom(IUIAutomationElement9* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedFlowsFrom(This,retVal);
}
/*** IUIAutomationElement3 methods ***/
static __WIDL_INLINE HRESULT IUIAutomationElement9_ShowContextMenu(IUIAutomationElement9* This) {
    return This->lpVtbl->ShowContextMenu(This);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CurrentIsPeripheral(IUIAutomationElement9* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsPeripheral(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CachedIsPeripheral(IUIAutomationElement9* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsPeripheral(This,retVal);
}
/*** IUIAutomationElement4 methods ***/
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CurrentPositionInSet(IUIAutomationElement9* This,int *retVal) {
    return This->lpVtbl->get_CurrentPositionInSet(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CurrentSizeOfSet(IUIAutomationElement9* This,int *retVal) {
    return This->lpVtbl->get_CurrentSizeOfSet(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CurrentLevel(IUIAutomationElement9* This,int *retVal) {
    return This->lpVtbl->get_CurrentLevel(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CurrentAnnotationTypes(IUIAutomationElement9* This,SAFEARRAY **retVal) {
    return This->lpVtbl->get_CurrentAnnotationTypes(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CurrentAnnotationObjects(IUIAutomationElement9* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentAnnotationObjects(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CachedPositionInSet(IUIAutomationElement9* This,int *retVal) {
    return This->lpVtbl->get_CachedPositionInSet(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CachedSizeOfSet(IUIAutomationElement9* This,int *retVal) {
    return This->lpVtbl->get_CachedSizeOfSet(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CachedLevel(IUIAutomationElement9* This,int *retVal) {
    return This->lpVtbl->get_CachedLevel(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CachedAnnotationTypes(IUIAutomationElement9* This,SAFEARRAY **retVal) {
    return This->lpVtbl->get_CachedAnnotationTypes(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CachedAnnotationObjects(IUIAutomationElement9* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedAnnotationObjects(This,retVal);
}
/*** IUIAutomationElement5 methods ***/
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CurrentLandmarkType(IUIAutomationElement9* This,LANDMARKTYPEID *retVal) {
    return This->lpVtbl->get_CurrentLandmarkType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CurrentLocalizedLandmarkType(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentLocalizedLandmarkType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CachedLandmarkType(IUIAutomationElement9* This,LANDMARKTYPEID *retVal) {
    return This->lpVtbl->get_CachedLandmarkType(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CachedLocalizedLandmarkType(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedLocalizedLandmarkType(This,retVal);
}
/*** IUIAutomationElement6 methods ***/
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CurrentFullDescription(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentFullDescription(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CachedFullDescription(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedFullDescription(This,retVal);
}
/*** IUIAutomationElement7 methods ***/
static __WIDL_INLINE HRESULT IUIAutomationElement9_FindFirstWithOptions(IUIAutomationElement9* This,enum TreeScope scope,IUIAutomationCondition *condition,enum TreeTraversalOptions traversalOptions,IUIAutomationElement *root,IUIAutomationElement **found) {
    return This->lpVtbl->FindFirstWithOptions(This,scope,condition,traversalOptions,root,found);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_FindAllWithOptions(IUIAutomationElement9* This,enum TreeScope scope,IUIAutomationCondition *condition,enum TreeTraversalOptions traversalOptions,IUIAutomationElement *root,IUIAutomationElementArray **found) {
    return This->lpVtbl->FindAllWithOptions(This,scope,condition,traversalOptions,root,found);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_FindFirstWithOptionsBuildCache(IUIAutomationElement9* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationCacheRequest *cacheRequest,enum TreeTraversalOptions traversalOptions,IUIAutomationElement *root,IUIAutomationElement **found) {
    return This->lpVtbl->FindFirstWithOptionsBuildCache(This,scope,condition,cacheRequest,traversalOptions,root,found);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_FindAllWithOptionsBuildCache(IUIAutomationElement9* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationCacheRequest *cacheRequest,enum TreeTraversalOptions traversalOptions,IUIAutomationElement *root,IUIAutomationElementArray **found) {
    return This->lpVtbl->FindAllWithOptionsBuildCache(This,scope,condition,cacheRequest,traversalOptions,root,found);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_GetCurrentMetadataValue(IUIAutomationElement9* This,int targetId,METADATAID metadataId,VARIANT *returnVal) {
    return This->lpVtbl->GetCurrentMetadataValue(This,targetId,metadataId,returnVal);
}
/*** IUIAutomationElement8 methods ***/
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CurrentHeadingLevel(IUIAutomationElement9* This,HEADINGLEVELID *retVal) {
    return This->lpVtbl->get_CurrentHeadingLevel(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CachedHeadingLevel(IUIAutomationElement9* This,HEADINGLEVELID *retVal) {
    return This->lpVtbl->get_CachedHeadingLevel(This,retVal);
}
/*** IUIAutomationElement9 methods ***/
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CurrentIsDialog(IUIAutomationElement9* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsDialog(This,retVal);
}
static __WIDL_INLINE HRESULT IUIAutomationElement9_get_CachedIsDialog(IUIAutomationElement9* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsDialog(This,retVal);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationElement9_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationElementArray interface
 */
#ifndef __IUIAutomationElementArray_INTERFACE_DEFINED__
#define __IUIAutomationElementArray_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationElementArray, 0x14314595, 0xb4bc, 0x4055, 0x95,0xf2, 0x58,0xf2,0xe4,0x2c,0x98,0x55);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("14314595-b4bc-4055-95f2-58f2e42c9855")
IUIAutomationElementArray : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE get_Length(
        int *length) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetElement(
        int index,
        IUIAutomationElement **element) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationElementArray, 0x14314595, 0xb4bc, 0x4055, 0x95,0xf2, 0x58,0xf2,0xe4,0x2c,0x98,0x55)
#endif
#else
typedef struct IUIAutomationElementArrayVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomationElementArray methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Length)(
        IUIAutomationElementArray *This,
        int *length);

    HRESULT (STDMETHODCALLTYPE *GetElement)(
        IUIAutomationElementArray *This,
        int index,
        IUIAutomationElement **element);

    END_INTERFACE
} IUIAutomationElementArrayVtbl;

interface IUIAutomationElementArray {
    CONST_VTBL IUIAutomationElementArrayVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationElementArray_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationElementArray_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationElementArray_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationElementArray methods ***/
#define IUIAutomationElementArray_get_Length(This,length) (This)->lpVtbl->get_Length(This,length)
#define IUIAutomationElementArray_GetElement(This,index,element) (This)->lpVtbl->GetElement(This,index,element)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationElementArray_QueryInterface(IUIAutomationElementArray* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationElementArray_AddRef(IUIAutomationElementArray* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationElementArray_Release(IUIAutomationElementArray* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationElementArray methods ***/
static __WIDL_INLINE HRESULT IUIAutomationElementArray_get_Length(IUIAutomationElementArray* This,int *length) {
    return This->lpVtbl->get_Length(This,length);
}
static __WIDL_INLINE HRESULT IUIAutomationElementArray_GetElement(IUIAutomationElementArray* This,int index,IUIAutomationElement **element) {
    return This->lpVtbl->GetElement(This,index,element);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationElementArray_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationProxyFactory interface
 */
#ifndef __IUIAutomationProxyFactory_INTERFACE_DEFINED__
#define __IUIAutomationProxyFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationProxyFactory, 0x85b94ecd, 0x849d, 0x42b6, 0xb9,0x4d, 0xd6,0xdb,0x23,0xfd,0xf5,0xa4);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("85b94ecd-849d-42b6-b94d-d6db23fdf5a4")
IUIAutomationProxyFactory : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE CreateProvider(
        UIA_HWND hwnd,
        LONG idObject,
        LONG idChild,
        IRawElementProviderSimple **provider) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ProxyFactoryId(
        BSTR *factoryId) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationProxyFactory, 0x85b94ecd, 0x849d, 0x42b6, 0xb9,0x4d, 0xd6,0xdb,0x23,0xfd,0xf5,0xa4)
#endif
#else
typedef struct IUIAutomationProxyFactoryVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomationProxyFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateProvider)(
        IUIAutomationProxyFactory *This,
        UIA_HWND hwnd,
        LONG idObject,
        LONG idChild,
        IRawElementProviderSimple **provider);

    HRESULT (STDMETHODCALLTYPE *get_ProxyFactoryId)(
        IUIAutomationProxyFactory *This,
        BSTR *factoryId);

    END_INTERFACE
} IUIAutomationProxyFactoryVtbl;

interface IUIAutomationProxyFactory {
    CONST_VTBL IUIAutomationProxyFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationProxyFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationProxyFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationProxyFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationProxyFactory methods ***/
#define IUIAutomationProxyFactory_CreateProvider(This,hwnd,idObject,idChild,provider) (This)->lpVtbl->CreateProvider(This,hwnd,idObject,idChild,provider)
#define IUIAutomationProxyFactory_get_ProxyFactoryId(This,factoryId) (This)->lpVtbl->get_ProxyFactoryId(This,factoryId)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationProxyFactory_QueryInterface(IUIAutomationProxyFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationProxyFactory_AddRef(IUIAutomationProxyFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationProxyFactory_Release(IUIAutomationProxyFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationProxyFactory methods ***/
static __WIDL_INLINE HRESULT IUIAutomationProxyFactory_CreateProvider(IUIAutomationProxyFactory* This,UIA_HWND hwnd,LONG idObject,LONG idChild,IRawElementProviderSimple **provider) {
    return This->lpVtbl->CreateProvider(This,hwnd,idObject,idChild,provider);
}
static __WIDL_INLINE HRESULT IUIAutomationProxyFactory_get_ProxyFactoryId(IUIAutomationProxyFactory* This,BSTR *factoryId) {
    return This->lpVtbl->get_ProxyFactoryId(This,factoryId);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationProxyFactory_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationProxyFactoryEntry interface
 */
#ifndef __IUIAutomationProxyFactoryEntry_INTERFACE_DEFINED__
#define __IUIAutomationProxyFactoryEntry_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationProxyFactoryEntry, 0xd50e472e, 0xb64b, 0x490c, 0xbc,0xa1, 0xd3,0x06,0x96,0xf9,0xf2,0x89);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d50e472e-b64b-490c-bca1-d30696f9f289")
IUIAutomationProxyFactoryEntry : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE get_ProxyFactory(
        IUIAutomationProxyFactory **factory) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ClassName(
        BSTR *className) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ImageName(
        BSTR *imageName) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_AllowSubstringMatch(
        WINBOOL *allowSubstringMatch) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CanCheckBaseClass(
        WINBOOL *canCheckBaseClass) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_NeedsAdviseEvents(
        WINBOOL *adviseEvents) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ClassName(
        LPCWSTR className) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ImageName(
        LPCWSTR imageName) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_AllowSubstringMatch(
        WINBOOL allowSubstringMatch) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_CanCheckBaseClass(
        WINBOOL canCheckBaseClass) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_NeedsAdviseEvents(
        WINBOOL adviseEvents) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetWinEventsForAutomationEvent(
        EVENTID eventId,
        PROPERTYID propertyId,
        SAFEARRAY *winEvents) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetWinEventsForAutomationEvent(
        EVENTID eventId,
        PROPERTYID propertyId,
        SAFEARRAY **winEvents) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationProxyFactoryEntry, 0xd50e472e, 0xb64b, 0x490c, 0xbc,0xa1, 0xd3,0x06,0x96,0xf9,0xf2,0x89)
#endif
#else
typedef struct IUIAutomationProxyFactoryEntryVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomationProxyFactoryEntry methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ProxyFactory)(
        IUIAutomationProxyFactoryEntry *This,
        IUIAutomationProxyFactory **factory);

    HRESULT (STDMETHODCALLTYPE *get_ClassName)(
        IUIAutomationProxyFactoryEntry *This,
        BSTR *className);

    HRESULT (STDMETHODCALLTYPE *get_ImageName)(
        IUIAutomationProxyFactoryEntry *This,
        BSTR *imageName);

    HRESULT (STDMETHODCALLTYPE *get_AllowSubstringMatch)(
        IUIAutomationProxyFactoryEntry *This,
        WINBOOL *allowSubstringMatch);

    HRESULT (STDMETHODCALLTYPE *get_CanCheckBaseClass)(
        IUIAutomationProxyFactoryEntry *This,
        WINBOOL *canCheckBaseClass);

    HRESULT (STDMETHODCALLTYPE *get_NeedsAdviseEvents)(
        IUIAutomationProxyFactoryEntry *This,
        WINBOOL *adviseEvents);

    HRESULT (STDMETHODCALLTYPE *put_ClassName)(
        IUIAutomationProxyFactoryEntry *This,
        LPCWSTR className);

    HRESULT (STDMETHODCALLTYPE *put_ImageName)(
        IUIAutomationProxyFactoryEntry *This,
        LPCWSTR imageName);

    HRESULT (STDMETHODCALLTYPE *put_AllowSubstringMatch)(
        IUIAutomationProxyFactoryEntry *This,
        WINBOOL allowSubstringMatch);

    HRESULT (STDMETHODCALLTYPE *put_CanCheckBaseClass)(
        IUIAutomationProxyFactoryEntry *This,
        WINBOOL canCheckBaseClass);

    HRESULT (STDMETHODCALLTYPE *put_NeedsAdviseEvents)(
        IUIAutomationProxyFactoryEntry *This,
        WINBOOL adviseEvents);

    HRESULT (STDMETHODCALLTYPE *SetWinEventsForAutomationEvent)(
        IUIAutomationProxyFactoryEntry *This,
        EVENTID eventId,
        PROPERTYID propertyId,
        SAFEARRAY *winEvents);

    HRESULT (STDMETHODCALLTYPE *GetWinEventsForAutomationEvent)(
        IUIAutomationProxyFactoryEntry *This,
        EVENTID eventId,
        PROPERTYID propertyId,
        SAFEARRAY **winEvents);

    END_INTERFACE
} IUIAutomationProxyFactoryEntryVtbl;

interface IUIAutomationProxyFactoryEntry {
    CONST_VTBL IUIAutomationProxyFactoryEntryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationProxyFactoryEntry_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationProxyFactoryEntry_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationProxyFactoryEntry_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationProxyFactoryEntry methods ***/
#define IUIAutomationProxyFactoryEntry_get_ProxyFactory(This,factory) (This)->lpVtbl->get_ProxyFactory(This,factory)
#define IUIAutomationProxyFactoryEntry_get_ClassName(This,className) (This)->lpVtbl->get_ClassName(This,className)
#define IUIAutomationProxyFactoryEntry_get_ImageName(This,imageName) (This)->lpVtbl->get_ImageName(This,imageName)
#define IUIAutomationProxyFactoryEntry_get_AllowSubstringMatch(This,allowSubstringMatch) (This)->lpVtbl->get_AllowSubstringMatch(This,allowSubstringMatch)
#define IUIAutomationProxyFactoryEntry_get_CanCheckBaseClass(This,canCheckBaseClass) (This)->lpVtbl->get_CanCheckBaseClass(This,canCheckBaseClass)
#define IUIAutomationProxyFactoryEntry_get_NeedsAdviseEvents(This,adviseEvents) (This)->lpVtbl->get_NeedsAdviseEvents(This,adviseEvents)
#define IUIAutomationProxyFactoryEntry_put_ClassName(This,className) (This)->lpVtbl->put_ClassName(This,className)
#define IUIAutomationProxyFactoryEntry_put_ImageName(This,imageName) (This)->lpVtbl->put_ImageName(This,imageName)
#define IUIAutomationProxyFactoryEntry_put_AllowSubstringMatch(This,allowSubstringMatch) (This)->lpVtbl->put_AllowSubstringMatch(This,allowSubstringMatch)
#define IUIAutomationProxyFactoryEntry_put_CanCheckBaseClass(This,canCheckBaseClass) (This)->lpVtbl->put_CanCheckBaseClass(This,canCheckBaseClass)
#define IUIAutomationProxyFactoryEntry_put_NeedsAdviseEvents(This,adviseEvents) (This)->lpVtbl->put_NeedsAdviseEvents(This,adviseEvents)
#define IUIAutomationProxyFactoryEntry_SetWinEventsForAutomationEvent(This,eventId,propertyId,winEvents) (This)->lpVtbl->SetWinEventsForAutomationEvent(This,eventId,propertyId,winEvents)
#define IUIAutomationProxyFactoryEntry_GetWinEventsForAutomationEvent(This,eventId,propertyId,winEvents) (This)->lpVtbl->GetWinEventsForAutomationEvent(This,eventId,propertyId,winEvents)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationProxyFactoryEntry_QueryInterface(IUIAutomationProxyFactoryEntry* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationProxyFactoryEntry_AddRef(IUIAutomationProxyFactoryEntry* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationProxyFactoryEntry_Release(IUIAutomationProxyFactoryEntry* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationProxyFactoryEntry methods ***/
static __WIDL_INLINE HRESULT IUIAutomationProxyFactoryEntry_get_ProxyFactory(IUIAutomationProxyFactoryEntry* This,IUIAutomationProxyFactory **factory) {
    return This->lpVtbl->get_ProxyFactory(This,factory);
}
static __WIDL_INLINE HRESULT IUIAutomationProxyFactoryEntry_get_ClassName(IUIAutomationProxyFactoryEntry* This,BSTR *className) {
    return This->lpVtbl->get_ClassName(This,className);
}
static __WIDL_INLINE HRESULT IUIAutomationProxyFactoryEntry_get_ImageName(IUIAutomationProxyFactoryEntry* This,BSTR *imageName) {
    return This->lpVtbl->get_ImageName(This,imageName);
}
static __WIDL_INLINE HRESULT IUIAutomationProxyFactoryEntry_get_AllowSubstringMatch(IUIAutomationProxyFactoryEntry* This,WINBOOL *allowSubstringMatch) {
    return This->lpVtbl->get_AllowSubstringMatch(This,allowSubstringMatch);
}
static __WIDL_INLINE HRESULT IUIAutomationProxyFactoryEntry_get_CanCheckBaseClass(IUIAutomationProxyFactoryEntry* This,WINBOOL *canCheckBaseClass) {
    return This->lpVtbl->get_CanCheckBaseClass(This,canCheckBaseClass);
}
static __WIDL_INLINE HRESULT IUIAutomationProxyFactoryEntry_get_NeedsAdviseEvents(IUIAutomationProxyFactoryEntry* This,WINBOOL *adviseEvents) {
    return This->lpVtbl->get_NeedsAdviseEvents(This,adviseEvents);
}
static __WIDL_INLINE HRESULT IUIAutomationProxyFactoryEntry_put_ClassName(IUIAutomationProxyFactoryEntry* This,LPCWSTR className) {
    return This->lpVtbl->put_ClassName(This,className);
}
static __WIDL_INLINE HRESULT IUIAutomationProxyFactoryEntry_put_ImageName(IUIAutomationProxyFactoryEntry* This,LPCWSTR imageName) {
    return This->lpVtbl->put_ImageName(This,imageName);
}
static __WIDL_INLINE HRESULT IUIAutomationProxyFactoryEntry_put_AllowSubstringMatch(IUIAutomationProxyFactoryEntry* This,WINBOOL allowSubstringMatch) {
    return This->lpVtbl->put_AllowSubstringMatch(This,allowSubstringMatch);
}
static __WIDL_INLINE HRESULT IUIAutomationProxyFactoryEntry_put_CanCheckBaseClass(IUIAutomationProxyFactoryEntry* This,WINBOOL canCheckBaseClass) {
    return This->lpVtbl->put_CanCheckBaseClass(This,canCheckBaseClass);
}
static __WIDL_INLINE HRESULT IUIAutomationProxyFactoryEntry_put_NeedsAdviseEvents(IUIAutomationProxyFactoryEntry* This,WINBOOL adviseEvents) {
    return This->lpVtbl->put_NeedsAdviseEvents(This,adviseEvents);
}
static __WIDL_INLINE HRESULT IUIAutomationProxyFactoryEntry_SetWinEventsForAutomationEvent(IUIAutomationProxyFactoryEntry* This,EVENTID eventId,PROPERTYID propertyId,SAFEARRAY *winEvents) {
    return This->lpVtbl->SetWinEventsForAutomationEvent(This,eventId,propertyId,winEvents);
}
static __WIDL_INLINE HRESULT IUIAutomationProxyFactoryEntry_GetWinEventsForAutomationEvent(IUIAutomationProxyFactoryEntry* This,EVENTID eventId,PROPERTYID propertyId,SAFEARRAY **winEvents) {
    return This->lpVtbl->GetWinEventsForAutomationEvent(This,eventId,propertyId,winEvents);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationProxyFactoryEntry_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationProxyFactoryMapping interface
 */
#ifndef __IUIAutomationProxyFactoryMapping_INTERFACE_DEFINED__
#define __IUIAutomationProxyFactoryMapping_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationProxyFactoryMapping, 0x09e31e18, 0x872d, 0x4873, 0x93,0xd1, 0x1e,0x54,0x1e,0xc1,0x33,0xfd);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("09e31e18-872d-4873-93d1-1e541ec133fd")
IUIAutomationProxyFactoryMapping : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE get_Count(
        UINT *count) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTable(
        SAFEARRAY **table) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetEntry(
        UINT index,
        IUIAutomationProxyFactoryEntry **entry) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetTable(
        SAFEARRAY *factoryList) = 0;

    virtual HRESULT STDMETHODCALLTYPE InsertEntries(
        UINT before,
        SAFEARRAY *factoryList) = 0;

    virtual HRESULT STDMETHODCALLTYPE InsertEntry(
        UINT before,
        IUIAutomationProxyFactoryEntry *factory) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveEntry(
        UINT index) = 0;

    virtual HRESULT STDMETHODCALLTYPE ClearTable(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE RestoreDefaultTable(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationProxyFactoryMapping, 0x09e31e18, 0x872d, 0x4873, 0x93,0xd1, 0x1e,0x54,0x1e,0xc1,0x33,0xfd)
#endif
#else
typedef struct IUIAutomationProxyFactoryMappingVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomationProxyFactoryMapping methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Count)(
        IUIAutomationProxyFactoryMapping *This,
        UINT *count);

    HRESULT (STDMETHODCALLTYPE *GetTable)(
        IUIAutomationProxyFactoryMapping *This,
        SAFEARRAY **table);

    HRESULT (STDMETHODCALLTYPE *GetEntry)(
        IUIAutomationProxyFactoryMapping *This,
        UINT index,
        IUIAutomationProxyFactoryEntry **entry);

    HRESULT (STDMETHODCALLTYPE *SetTable)(
        IUIAutomationProxyFactoryMapping *This,
        SAFEARRAY *factoryList);

    HRESULT (STDMETHODCALLTYPE *InsertEntries)(
        IUIAutomationProxyFactoryMapping *This,
        UINT before,
        SAFEARRAY *factoryList);

    HRESULT (STDMETHODCALLTYPE *InsertEntry)(
        IUIAutomationProxyFactoryMapping *This,
        UINT before,
        IUIAutomationProxyFactoryEntry *factory);

    HRESULT (STDMETHODCALLTYPE *RemoveEntry)(
        IUIAutomationProxyFactoryMapping *This,
        UINT index);

    HRESULT (STDMETHODCALLTYPE *ClearTable)(
        IUIAutomationProxyFactoryMapping *This);

    HRESULT (STDMETHODCALLTYPE *RestoreDefaultTable)(
        IUIAutomationProxyFactoryMapping *This);

    END_INTERFACE
} IUIAutomationProxyFactoryMappingVtbl;

interface IUIAutomationProxyFactoryMapping {
    CONST_VTBL IUIAutomationProxyFactoryMappingVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationProxyFactoryMapping_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationProxyFactoryMapping_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationProxyFactoryMapping_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationProxyFactoryMapping methods ***/
#define IUIAutomationProxyFactoryMapping_get_Count(This,count) (This)->lpVtbl->get_Count(This,count)
#define IUIAutomationProxyFactoryMapping_GetTable(This,table) (This)->lpVtbl->GetTable(This,table)
#define IUIAutomationProxyFactoryMapping_GetEntry(This,index,entry) (This)->lpVtbl->GetEntry(This,index,entry)
#define IUIAutomationProxyFactoryMapping_SetTable(This,factoryList) (This)->lpVtbl->SetTable(This,factoryList)
#define IUIAutomationProxyFactoryMapping_InsertEntries(This,before,factoryList) (This)->lpVtbl->InsertEntries(This,before,factoryList)
#define IUIAutomationProxyFactoryMapping_InsertEntry(This,before,factory) (This)->lpVtbl->InsertEntry(This,before,factory)
#define IUIAutomationProxyFactoryMapping_RemoveEntry(This,index) (This)->lpVtbl->RemoveEntry(This,index)
#define IUIAutomationProxyFactoryMapping_ClearTable(This) (This)->lpVtbl->ClearTable(This)
#define IUIAutomationProxyFactoryMapping_RestoreDefaultTable(This) (This)->lpVtbl->RestoreDefaultTable(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationProxyFactoryMapping_QueryInterface(IUIAutomationProxyFactoryMapping* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationProxyFactoryMapping_AddRef(IUIAutomationProxyFactoryMapping* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationProxyFactoryMapping_Release(IUIAutomationProxyFactoryMapping* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationProxyFactoryMapping methods ***/
static __WIDL_INLINE HRESULT IUIAutomationProxyFactoryMapping_get_Count(IUIAutomationProxyFactoryMapping* This,UINT *count) {
    return This->lpVtbl->get_Count(This,count);
}
static __WIDL_INLINE HRESULT IUIAutomationProxyFactoryMapping_GetTable(IUIAutomationProxyFactoryMapping* This,SAFEARRAY **table) {
    return This->lpVtbl->GetTable(This,table);
}
static __WIDL_INLINE HRESULT IUIAutomationProxyFactoryMapping_GetEntry(IUIAutomationProxyFactoryMapping* This,UINT index,IUIAutomationProxyFactoryEntry **entry) {
    return This->lpVtbl->GetEntry(This,index,entry);
}
static __WIDL_INLINE HRESULT IUIAutomationProxyFactoryMapping_SetTable(IUIAutomationProxyFactoryMapping* This,SAFEARRAY *factoryList) {
    return This->lpVtbl->SetTable(This,factoryList);
}
static __WIDL_INLINE HRESULT IUIAutomationProxyFactoryMapping_InsertEntries(IUIAutomationProxyFactoryMapping* This,UINT before,SAFEARRAY *factoryList) {
    return This->lpVtbl->InsertEntries(This,before,factoryList);
}
static __WIDL_INLINE HRESULT IUIAutomationProxyFactoryMapping_InsertEntry(IUIAutomationProxyFactoryMapping* This,UINT before,IUIAutomationProxyFactoryEntry *factory) {
    return This->lpVtbl->InsertEntry(This,before,factory);
}
static __WIDL_INLINE HRESULT IUIAutomationProxyFactoryMapping_RemoveEntry(IUIAutomationProxyFactoryMapping* This,UINT index) {
    return This->lpVtbl->RemoveEntry(This,index);
}
static __WIDL_INLINE HRESULT IUIAutomationProxyFactoryMapping_ClearTable(IUIAutomationProxyFactoryMapping* This) {
    return This->lpVtbl->ClearTable(This);
}
static __WIDL_INLINE HRESULT IUIAutomationProxyFactoryMapping_RestoreDefaultTable(IUIAutomationProxyFactoryMapping* This) {
    return This->lpVtbl->RestoreDefaultTable(This);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationProxyFactoryMapping_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomationEventHandlerGroup interface
 */
#ifndef __IUIAutomationEventHandlerGroup_INTERFACE_DEFINED__
#define __IUIAutomationEventHandlerGroup_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomationEventHandlerGroup, 0xc9ee12f2, 0xc13b, 0x4408, 0x99,0x7c, 0x63,0x99,0x14,0x37,0x7f,0x4e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c9ee12f2-c13b-4408-997c-639914377f4e")
IUIAutomationEventHandlerGroup : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE AddActiveTextPositionChangedEventHandler(
        enum TreeScope scope,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationActiveTextPositionChangedEventHandler *handler) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddAutomationEventHandler(
        EVENTID eventId,
        enum TreeScope scope,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationEventHandler *handler) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddChangesEventHandler(
        enum TreeScope scope,
        int *changeTypes,
        int changesCount,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationChangesEventHandler *handler) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddNotificationEventHandler(
        enum TreeScope scope,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationNotificationEventHandler *handler) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddPropertyChangedEventHandler(
        enum TreeScope scope,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationPropertyChangedEventHandler *handler,
        PROPERTYID *propertyArray,
        int propertyCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddStructureChangedEventHandler(
        enum TreeScope scope,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationStructureChangedEventHandler *handler) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddTextEditTextChangedEventHandler(
        enum TreeScope scope,
        enum TextEditChangeType textEditChangeType,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationTextEditTextChangedEventHandler *handler) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomationEventHandlerGroup, 0xc9ee12f2, 0xc13b, 0x4408, 0x99,0x7c, 0x63,0x99,0x14,0x37,0x7f,0x4e)
#endif
#else
typedef struct IUIAutomationEventHandlerGroupVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomationEventHandlerGroup methods ***/
    HRESULT (STDMETHODCALLTYPE *AddActiveTextPositionChangedEventHandler)(
        IUIAutomationEventHandlerGroup *This,
        enum TreeScope scope,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationActiveTextPositionChangedEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *AddAutomationEventHandler)(
        IUIAutomationEventHandlerGroup *This,
        EVENTID eventId,
        enum TreeScope scope,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *AddChangesEventHandler)(
        IUIAutomationEventHandlerGroup *This,
        enum TreeScope scope,
        int *changeTypes,
        int changesCount,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationChangesEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *AddNotificationEventHandler)(
        IUIAutomationEventHandlerGroup *This,
        enum TreeScope scope,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationNotificationEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *AddPropertyChangedEventHandler)(
        IUIAutomationEventHandlerGroup *This,
        enum TreeScope scope,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationPropertyChangedEventHandler *handler,
        PROPERTYID *propertyArray,
        int propertyCount);

    HRESULT (STDMETHODCALLTYPE *AddStructureChangedEventHandler)(
        IUIAutomationEventHandlerGroup *This,
        enum TreeScope scope,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationStructureChangedEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *AddTextEditTextChangedEventHandler)(
        IUIAutomationEventHandlerGroup *This,
        enum TreeScope scope,
        enum TextEditChangeType textEditChangeType,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationTextEditTextChangedEventHandler *handler);

    END_INTERFACE
} IUIAutomationEventHandlerGroupVtbl;

interface IUIAutomationEventHandlerGroup {
    CONST_VTBL IUIAutomationEventHandlerGroupVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomationEventHandlerGroup_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomationEventHandlerGroup_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomationEventHandlerGroup_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomationEventHandlerGroup methods ***/
#define IUIAutomationEventHandlerGroup_AddActiveTextPositionChangedEventHandler(This,scope,cacheRequest,handler) (This)->lpVtbl->AddActiveTextPositionChangedEventHandler(This,scope,cacheRequest,handler)
#define IUIAutomationEventHandlerGroup_AddAutomationEventHandler(This,eventId,scope,cacheRequest,handler) (This)->lpVtbl->AddAutomationEventHandler(This,eventId,scope,cacheRequest,handler)
#define IUIAutomationEventHandlerGroup_AddChangesEventHandler(This,scope,changeTypes,changesCount,cacheRequest,handler) (This)->lpVtbl->AddChangesEventHandler(This,scope,changeTypes,changesCount,cacheRequest,handler)
#define IUIAutomationEventHandlerGroup_AddNotificationEventHandler(This,scope,cacheRequest,handler) (This)->lpVtbl->AddNotificationEventHandler(This,scope,cacheRequest,handler)
#define IUIAutomationEventHandlerGroup_AddPropertyChangedEventHandler(This,scope,cacheRequest,handler,propertyArray,propertyCount) (This)->lpVtbl->AddPropertyChangedEventHandler(This,scope,cacheRequest,handler,propertyArray,propertyCount)
#define IUIAutomationEventHandlerGroup_AddStructureChangedEventHandler(This,scope,cacheRequest,handler) (This)->lpVtbl->AddStructureChangedEventHandler(This,scope,cacheRequest,handler)
#define IUIAutomationEventHandlerGroup_AddTextEditTextChangedEventHandler(This,scope,textEditChangeType,cacheRequest,handler) (This)->lpVtbl->AddTextEditTextChangedEventHandler(This,scope,textEditChangeType,cacheRequest,handler)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomationEventHandlerGroup_QueryInterface(IUIAutomationEventHandlerGroup* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomationEventHandlerGroup_AddRef(IUIAutomationEventHandlerGroup* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomationEventHandlerGroup_Release(IUIAutomationEventHandlerGroup* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationEventHandlerGroup methods ***/
static __WIDL_INLINE HRESULT IUIAutomationEventHandlerGroup_AddActiveTextPositionChangedEventHandler(IUIAutomationEventHandlerGroup* This,enum TreeScope scope,IUIAutomationCacheRequest *cacheRequest,IUIAutomationActiveTextPositionChangedEventHandler *handler) {
    return This->lpVtbl->AddActiveTextPositionChangedEventHandler(This,scope,cacheRequest,handler);
}
static __WIDL_INLINE HRESULT IUIAutomationEventHandlerGroup_AddAutomationEventHandler(IUIAutomationEventHandlerGroup* This,EVENTID eventId,enum TreeScope scope,IUIAutomationCacheRequest *cacheRequest,IUIAutomationEventHandler *handler) {
    return This->lpVtbl->AddAutomationEventHandler(This,eventId,scope,cacheRequest,handler);
}
static __WIDL_INLINE HRESULT IUIAutomationEventHandlerGroup_AddChangesEventHandler(IUIAutomationEventHandlerGroup* This,enum TreeScope scope,int *changeTypes,int changesCount,IUIAutomationCacheRequest *cacheRequest,IUIAutomationChangesEventHandler *handler) {
    return This->lpVtbl->AddChangesEventHandler(This,scope,changeTypes,changesCount,cacheRequest,handler);
}
static __WIDL_INLINE HRESULT IUIAutomationEventHandlerGroup_AddNotificationEventHandler(IUIAutomationEventHandlerGroup* This,enum TreeScope scope,IUIAutomationCacheRequest *cacheRequest,IUIAutomationNotificationEventHandler *handler) {
    return This->lpVtbl->AddNotificationEventHandler(This,scope,cacheRequest,handler);
}
static __WIDL_INLINE HRESULT IUIAutomationEventHandlerGroup_AddPropertyChangedEventHandler(IUIAutomationEventHandlerGroup* This,enum TreeScope scope,IUIAutomationCacheRequest *cacheRequest,IUIAutomationPropertyChangedEventHandler *handler,PROPERTYID *propertyArray,int propertyCount) {
    return This->lpVtbl->AddPropertyChangedEventHandler(This,scope,cacheRequest,handler,propertyArray,propertyCount);
}
static __WIDL_INLINE HRESULT IUIAutomationEventHandlerGroup_AddStructureChangedEventHandler(IUIAutomationEventHandlerGroup* This,enum TreeScope scope,IUIAutomationCacheRequest *cacheRequest,IUIAutomationStructureChangedEventHandler *handler) {
    return This->lpVtbl->AddStructureChangedEventHandler(This,scope,cacheRequest,handler);
}
static __WIDL_INLINE HRESULT IUIAutomationEventHandlerGroup_AddTextEditTextChangedEventHandler(IUIAutomationEventHandlerGroup* This,enum TreeScope scope,enum TextEditChangeType textEditChangeType,IUIAutomationCacheRequest *cacheRequest,IUIAutomationTextEditTextChangedEventHandler *handler) {
    return This->lpVtbl->AddTextEditTextChangedEventHandler(This,scope,textEditChangeType,cacheRequest,handler);
}
#endif
#endif

#endif


#endif  /* __IUIAutomationEventHandlerGroup_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomation interface
 */
#ifndef __IUIAutomation_INTERFACE_DEFINED__
#define __IUIAutomation_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomation, 0x30cbe57d, 0xd9d0, 0x452a, 0xab,0x13, 0x7a,0xc5,0xac,0x48,0x25,0xee);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("30cbe57d-d9d0-452a-ab13-7ac5ac4825ee")
IUIAutomation : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE CompareElements(
        IUIAutomationElement *el1,
        IUIAutomationElement *el2,
        WINBOOL *areSame) = 0;

    virtual HRESULT STDMETHODCALLTYPE CompareRuntimeIds(
        SAFEARRAY *runtimeId1,
        SAFEARRAY *runtimeId2,
        WINBOOL *areSame) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRootElement(
        IUIAutomationElement **root) = 0;

    virtual HRESULT STDMETHODCALLTYPE ElementFromHandle(
        UIA_HWND hwnd,
        IUIAutomationElement **element) = 0;

    virtual HRESULT STDMETHODCALLTYPE ElementFromPoint(
        POINT pt,
        IUIAutomationElement **element) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFocusedElement(
        IUIAutomationElement **element) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRootElementBuildCache(
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **root) = 0;

    virtual HRESULT STDMETHODCALLTYPE ElementFromHandleBuildCache(
        UIA_HWND hwnd,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **element) = 0;

    virtual HRESULT STDMETHODCALLTYPE ElementFromPointBuildCache(
        POINT pt,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **element) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFocusedElementBuildCache(
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **element) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateTreeWalker(
        IUIAutomationCondition *pCondition,
        IUIAutomationTreeWalker **walker) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ControlViewWalker(
        IUIAutomationTreeWalker **walker) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ContentViewWalker(
        IUIAutomationTreeWalker **walker) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_RawViewWalker(
        IUIAutomationTreeWalker **walker) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_RawViewCondition(
        IUIAutomationCondition **condition) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ControlViewCondition(
        IUIAutomationCondition **condition) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ContentViewCondition(
        IUIAutomationCondition **condition) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateCacheRequest(
        IUIAutomationCacheRequest **cacheRequest) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateTrueCondition(
        IUIAutomationCondition **newCondition) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateFalseCondition(
        IUIAutomationCondition **newCondition) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreatePropertyCondition(
        PROPERTYID propertyId,
        VARIANT value,
        IUIAutomationCondition **newCondition) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreatePropertyConditionEx(
        PROPERTYID propertyId,
        VARIANT value,
        enum PropertyConditionFlags flags,
        IUIAutomationCondition **newCondition) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateAndCondition(
        IUIAutomationCondition *condition1,
        IUIAutomationCondition *condition2,
        IUIAutomationCondition **newCondition) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateAndConditionFromArray(
        SAFEARRAY *conditions,
        IUIAutomationCondition **newCondition) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateAndConditionFromNativeArray(
        IUIAutomationCondition **conditions,
        int conditionCount,
        IUIAutomationCondition **newCondition) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateOrCondition(
        IUIAutomationCondition *condition1,
        IUIAutomationCondition *condition2,
        IUIAutomationCondition **newCondition) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateOrConditionFromArray(
        SAFEARRAY *conditions,
        IUIAutomationCondition **newCondition) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateOrConditionFromNativeArray(
        IUIAutomationCondition **conditions,
        int conditionCount,
        IUIAutomationCondition **newCondition) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateNotCondition(
        IUIAutomationCondition *condition,
        IUIAutomationCondition **newCondition) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddAutomationEventHandler(
        EVENTID eventId,
        IUIAutomationElement *element,
        enum TreeScope scope,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationEventHandler *handler) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveAutomationEventHandler(
        EVENTID eventId,
        IUIAutomationElement *element,
        IUIAutomationEventHandler *handler) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddPropertyChangedEventHandlerNativeArray(
        IUIAutomationElement *element,
        enum TreeScope scope,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationPropertyChangedEventHandler *handler,
        PROPERTYID *propertyArray,
        int propertyCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddPropertyChangedEventHandler(
        IUIAutomationElement *element,
        enum TreeScope scope,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationPropertyChangedEventHandler *handler,
        SAFEARRAY *propertyArray) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemovePropertyChangedEventHandler(
        IUIAutomationElement *element,
        IUIAutomationPropertyChangedEventHandler *handler) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddStructureChangedEventHandler(
        IUIAutomationElement *element,
        enum TreeScope scope,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationStructureChangedEventHandler *handler) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveStructureChangedEventHandler(
        IUIAutomationElement *element,
        IUIAutomationStructureChangedEventHandler *handler) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddFocusChangedEventHandler(
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationFocusChangedEventHandler *handler) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveFocusChangedEventHandler(
        IUIAutomationFocusChangedEventHandler *handler) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveAllEventHandlers(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE IntNativeArrayToSafeArray(
        int *array,
        int arrayCount,
        SAFEARRAY **safeArray) = 0;

    virtual HRESULT STDMETHODCALLTYPE IntSafeArrayToNativeArray(
        SAFEARRAY *intArray,
        int **array,
        int *arrayCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE RectToVariant(
        RECT rc,
        VARIANT *var) = 0;

    virtual HRESULT STDMETHODCALLTYPE VariantToRect(
        VARIANT var,
        RECT *rc) = 0;

    virtual HRESULT STDMETHODCALLTYPE SafeArrayToRectNativeArray(
        SAFEARRAY *rects,
        RECT **rectArray,
        int *rectArrayCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateProxyFactoryEntry(
        IUIAutomationProxyFactory *factory,
        IUIAutomationProxyFactoryEntry **factoryEntry) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ProxyFactoryMapping(
        IUIAutomationProxyFactoryMapping **factoryMapping) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPropertyProgrammaticName(
        PROPERTYID property,
        BSTR *name) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPatternProgrammaticName(
        PATTERNID pattern,
        BSTR *name) = 0;

    virtual HRESULT STDMETHODCALLTYPE PollForPotentialSupportedPatterns(
        IUIAutomationElement *pElement,
        SAFEARRAY **patternIds,
        SAFEARRAY **patternNames) = 0;

    virtual HRESULT STDMETHODCALLTYPE PollForPotentialSupportedProperties(
        IUIAutomationElement *pElement,
        SAFEARRAY **propertyIds,
        SAFEARRAY **propertyNames) = 0;

    virtual HRESULT STDMETHODCALLTYPE CheckNotSupported(
        VARIANT value,
        WINBOOL *isNotSupported) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ReservedNotSupportedValue(
        IUnknown **notSupportedValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ReservedMixedAttributeValue(
        IUnknown **mixedAttributeValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE ElementFromIAccessible(
        IAccessible *accessible,
        int childId,
        IUIAutomationElement **element) = 0;

    virtual HRESULT STDMETHODCALLTYPE ElementFromIAccessibleBuildCache(
        IAccessible *accessible,
        int childId,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **element) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomation, 0x30cbe57d, 0xd9d0, 0x452a, 0xab,0x13, 0x7a,0xc5,0xac,0x48,0x25,0xee)
#endif
#else
typedef struct IUIAutomationVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomation methods ***/
    HRESULT (STDMETHODCALLTYPE *CompareElements)(
        IUIAutomation *This,
        IUIAutomationElement *el1,
        IUIAutomationElement *el2,
        WINBOOL *areSame);

    HRESULT (STDMETHODCALLTYPE *CompareRuntimeIds)(
        IUIAutomation *This,
        SAFEARRAY *runtimeId1,
        SAFEARRAY *runtimeId2,
        WINBOOL *areSame);

    HRESULT (STDMETHODCALLTYPE *GetRootElement)(
        IUIAutomation *This,
        IUIAutomationElement **root);

    HRESULT (STDMETHODCALLTYPE *ElementFromHandle)(
        IUIAutomation *This,
        UIA_HWND hwnd,
        IUIAutomationElement **element);

    HRESULT (STDMETHODCALLTYPE *ElementFromPoint)(
        IUIAutomation *This,
        POINT pt,
        IUIAutomationElement **element);

    HRESULT (STDMETHODCALLTYPE *GetFocusedElement)(
        IUIAutomation *This,
        IUIAutomationElement **element);

    HRESULT (STDMETHODCALLTYPE *GetRootElementBuildCache)(
        IUIAutomation *This,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **root);

    HRESULT (STDMETHODCALLTYPE *ElementFromHandleBuildCache)(
        IUIAutomation *This,
        UIA_HWND hwnd,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **element);

    HRESULT (STDMETHODCALLTYPE *ElementFromPointBuildCache)(
        IUIAutomation *This,
        POINT pt,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **element);

    HRESULT (STDMETHODCALLTYPE *GetFocusedElementBuildCache)(
        IUIAutomation *This,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **element);

    HRESULT (STDMETHODCALLTYPE *CreateTreeWalker)(
        IUIAutomation *This,
        IUIAutomationCondition *pCondition,
        IUIAutomationTreeWalker **walker);

    HRESULT (STDMETHODCALLTYPE *get_ControlViewWalker)(
        IUIAutomation *This,
        IUIAutomationTreeWalker **walker);

    HRESULT (STDMETHODCALLTYPE *get_ContentViewWalker)(
        IUIAutomation *This,
        IUIAutomationTreeWalker **walker);

    HRESULT (STDMETHODCALLTYPE *get_RawViewWalker)(
        IUIAutomation *This,
        IUIAutomationTreeWalker **walker);

    HRESULT (STDMETHODCALLTYPE *get_RawViewCondition)(
        IUIAutomation *This,
        IUIAutomationCondition **condition);

    HRESULT (STDMETHODCALLTYPE *get_ControlViewCondition)(
        IUIAutomation *This,
        IUIAutomationCondition **condition);

    HRESULT (STDMETHODCALLTYPE *get_ContentViewCondition)(
        IUIAutomation *This,
        IUIAutomationCondition **condition);

    HRESULT (STDMETHODCALLTYPE *CreateCacheRequest)(
        IUIAutomation *This,
        IUIAutomationCacheRequest **cacheRequest);

    HRESULT (STDMETHODCALLTYPE *CreateTrueCondition)(
        IUIAutomation *This,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreateFalseCondition)(
        IUIAutomation *This,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreatePropertyCondition)(
        IUIAutomation *This,
        PROPERTYID propertyId,
        VARIANT value,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreatePropertyConditionEx)(
        IUIAutomation *This,
        PROPERTYID propertyId,
        VARIANT value,
        enum PropertyConditionFlags flags,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreateAndCondition)(
        IUIAutomation *This,
        IUIAutomationCondition *condition1,
        IUIAutomationCondition *condition2,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreateAndConditionFromArray)(
        IUIAutomation *This,
        SAFEARRAY *conditions,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreateAndConditionFromNativeArray)(
        IUIAutomation *This,
        IUIAutomationCondition **conditions,
        int conditionCount,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreateOrCondition)(
        IUIAutomation *This,
        IUIAutomationCondition *condition1,
        IUIAutomationCondition *condition2,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreateOrConditionFromArray)(
        IUIAutomation *This,
        SAFEARRAY *conditions,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreateOrConditionFromNativeArray)(
        IUIAutomation *This,
        IUIAutomationCondition **conditions,
        int conditionCount,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreateNotCondition)(
        IUIAutomation *This,
        IUIAutomationCondition *condition,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *AddAutomationEventHandler)(
        IUIAutomation *This,
        EVENTID eventId,
        IUIAutomationElement *element,
        enum TreeScope scope,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *RemoveAutomationEventHandler)(
        IUIAutomation *This,
        EVENTID eventId,
        IUIAutomationElement *element,
        IUIAutomationEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *AddPropertyChangedEventHandlerNativeArray)(
        IUIAutomation *This,
        IUIAutomationElement *element,
        enum TreeScope scope,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationPropertyChangedEventHandler *handler,
        PROPERTYID *propertyArray,
        int propertyCount);

    HRESULT (STDMETHODCALLTYPE *AddPropertyChangedEventHandler)(
        IUIAutomation *This,
        IUIAutomationElement *element,
        enum TreeScope scope,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationPropertyChangedEventHandler *handler,
        SAFEARRAY *propertyArray);

    HRESULT (STDMETHODCALLTYPE *RemovePropertyChangedEventHandler)(
        IUIAutomation *This,
        IUIAutomationElement *element,
        IUIAutomationPropertyChangedEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *AddStructureChangedEventHandler)(
        IUIAutomation *This,
        IUIAutomationElement *element,
        enum TreeScope scope,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationStructureChangedEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *RemoveStructureChangedEventHandler)(
        IUIAutomation *This,
        IUIAutomationElement *element,
        IUIAutomationStructureChangedEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *AddFocusChangedEventHandler)(
        IUIAutomation *This,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationFocusChangedEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *RemoveFocusChangedEventHandler)(
        IUIAutomation *This,
        IUIAutomationFocusChangedEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *RemoveAllEventHandlers)(
        IUIAutomation *This);

    HRESULT (STDMETHODCALLTYPE *IntNativeArrayToSafeArray)(
        IUIAutomation *This,
        int *array,
        int arrayCount,
        SAFEARRAY **safeArray);

    HRESULT (STDMETHODCALLTYPE *IntSafeArrayToNativeArray)(
        IUIAutomation *This,
        SAFEARRAY *intArray,
        int **array,
        int *arrayCount);

    HRESULT (STDMETHODCALLTYPE *RectToVariant)(
        IUIAutomation *This,
        RECT rc,
        VARIANT *var);

    HRESULT (STDMETHODCALLTYPE *VariantToRect)(
        IUIAutomation *This,
        VARIANT var,
        RECT *rc);

    HRESULT (STDMETHODCALLTYPE *SafeArrayToRectNativeArray)(
        IUIAutomation *This,
        SAFEARRAY *rects,
        RECT **rectArray,
        int *rectArrayCount);

    HRESULT (STDMETHODCALLTYPE *CreateProxyFactoryEntry)(
        IUIAutomation *This,
        IUIAutomationProxyFactory *factory,
        IUIAutomationProxyFactoryEntry **factoryEntry);

    HRESULT (STDMETHODCALLTYPE *get_ProxyFactoryMapping)(
        IUIAutomation *This,
        IUIAutomationProxyFactoryMapping **factoryMapping);

    HRESULT (STDMETHODCALLTYPE *GetPropertyProgrammaticName)(
        IUIAutomation *This,
        PROPERTYID property,
        BSTR *name);

    HRESULT (STDMETHODCALLTYPE *GetPatternProgrammaticName)(
        IUIAutomation *This,
        PATTERNID pattern,
        BSTR *name);

    HRESULT (STDMETHODCALLTYPE *PollForPotentialSupportedPatterns)(
        IUIAutomation *This,
        IUIAutomationElement *pElement,
        SAFEARRAY **patternIds,
        SAFEARRAY **patternNames);

    HRESULT (STDMETHODCALLTYPE *PollForPotentialSupportedProperties)(
        IUIAutomation *This,
        IUIAutomationElement *pElement,
        SAFEARRAY **propertyIds,
        SAFEARRAY **propertyNames);

    HRESULT (STDMETHODCALLTYPE *CheckNotSupported)(
        IUIAutomation *This,
        VARIANT value,
        WINBOOL *isNotSupported);

    HRESULT (STDMETHODCALLTYPE *get_ReservedNotSupportedValue)(
        IUIAutomation *This,
        IUnknown **notSupportedValue);

    HRESULT (STDMETHODCALLTYPE *get_ReservedMixedAttributeValue)(
        IUIAutomation *This,
        IUnknown **mixedAttributeValue);

    HRESULT (STDMETHODCALLTYPE *ElementFromIAccessible)(
        IUIAutomation *This,
        IAccessible *accessible,
        int childId,
        IUIAutomationElement **element);

    HRESULT (STDMETHODCALLTYPE *ElementFromIAccessibleBuildCache)(
        IUIAutomation *This,
        IAccessible *accessible,
        int childId,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **element);

    END_INTERFACE
} IUIAutomationVtbl;

interface IUIAutomation {
    CONST_VTBL IUIAutomationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomation_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomation_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomation methods ***/
#define IUIAutomation_CompareElements(This,el1,el2,areSame) (This)->lpVtbl->CompareElements(This,el1,el2,areSame)
#define IUIAutomation_CompareRuntimeIds(This,runtimeId1,runtimeId2,areSame) (This)->lpVtbl->CompareRuntimeIds(This,runtimeId1,runtimeId2,areSame)
#define IUIAutomation_GetRootElement(This,root) (This)->lpVtbl->GetRootElement(This,root)
#define IUIAutomation_ElementFromHandle(This,hwnd,element) (This)->lpVtbl->ElementFromHandle(This,hwnd,element)
#define IUIAutomation_ElementFromPoint(This,pt,element) (This)->lpVtbl->ElementFromPoint(This,pt,element)
#define IUIAutomation_GetFocusedElement(This,element) (This)->lpVtbl->GetFocusedElement(This,element)
#define IUIAutomation_GetRootElementBuildCache(This,cacheRequest,root) (This)->lpVtbl->GetRootElementBuildCache(This,cacheRequest,root)
#define IUIAutomation_ElementFromHandleBuildCache(This,hwnd,cacheRequest,element) (This)->lpVtbl->ElementFromHandleBuildCache(This,hwnd,cacheRequest,element)
#define IUIAutomation_ElementFromPointBuildCache(This,pt,cacheRequest,element) (This)->lpVtbl->ElementFromPointBuildCache(This,pt,cacheRequest,element)
#define IUIAutomation_GetFocusedElementBuildCache(This,cacheRequest,element) (This)->lpVtbl->GetFocusedElementBuildCache(This,cacheRequest,element)
#define IUIAutomation_CreateTreeWalker(This,pCondition,walker) (This)->lpVtbl->CreateTreeWalker(This,pCondition,walker)
#define IUIAutomation_get_ControlViewWalker(This,walker) (This)->lpVtbl->get_ControlViewWalker(This,walker)
#define IUIAutomation_get_ContentViewWalker(This,walker) (This)->lpVtbl->get_ContentViewWalker(This,walker)
#define IUIAutomation_get_RawViewWalker(This,walker) (This)->lpVtbl->get_RawViewWalker(This,walker)
#define IUIAutomation_get_RawViewCondition(This,condition) (This)->lpVtbl->get_RawViewCondition(This,condition)
#define IUIAutomation_get_ControlViewCondition(This,condition) (This)->lpVtbl->get_ControlViewCondition(This,condition)
#define IUIAutomation_get_ContentViewCondition(This,condition) (This)->lpVtbl->get_ContentViewCondition(This,condition)
#define IUIAutomation_CreateCacheRequest(This,cacheRequest) (This)->lpVtbl->CreateCacheRequest(This,cacheRequest)
#define IUIAutomation_CreateTrueCondition(This,newCondition) (This)->lpVtbl->CreateTrueCondition(This,newCondition)
#define IUIAutomation_CreateFalseCondition(This,newCondition) (This)->lpVtbl->CreateFalseCondition(This,newCondition)
#define IUIAutomation_CreatePropertyCondition(This,propertyId,value,newCondition) (This)->lpVtbl->CreatePropertyCondition(This,propertyId,value,newCondition)
#define IUIAutomation_CreatePropertyConditionEx(This,propertyId,value,flags,newCondition) (This)->lpVtbl->CreatePropertyConditionEx(This,propertyId,value,flags,newCondition)
#define IUIAutomation_CreateAndCondition(This,condition1,condition2,newCondition) (This)->lpVtbl->CreateAndCondition(This,condition1,condition2,newCondition)
#define IUIAutomation_CreateAndConditionFromArray(This,conditions,newCondition) (This)->lpVtbl->CreateAndConditionFromArray(This,conditions,newCondition)
#define IUIAutomation_CreateAndConditionFromNativeArray(This,conditions,conditionCount,newCondition) (This)->lpVtbl->CreateAndConditionFromNativeArray(This,conditions,conditionCount,newCondition)
#define IUIAutomation_CreateOrCondition(This,condition1,condition2,newCondition) (This)->lpVtbl->CreateOrCondition(This,condition1,condition2,newCondition)
#define IUIAutomation_CreateOrConditionFromArray(This,conditions,newCondition) (This)->lpVtbl->CreateOrConditionFromArray(This,conditions,newCondition)
#define IUIAutomation_CreateOrConditionFromNativeArray(This,conditions,conditionCount,newCondition) (This)->lpVtbl->CreateOrConditionFromNativeArray(This,conditions,conditionCount,newCondition)
#define IUIAutomation_CreateNotCondition(This,condition,newCondition) (This)->lpVtbl->CreateNotCondition(This,condition,newCondition)
#define IUIAutomation_AddAutomationEventHandler(This,eventId,element,scope,cacheRequest,handler) (This)->lpVtbl->AddAutomationEventHandler(This,eventId,element,scope,cacheRequest,handler)
#define IUIAutomation_RemoveAutomationEventHandler(This,eventId,element,handler) (This)->lpVtbl->RemoveAutomationEventHandler(This,eventId,element,handler)
#define IUIAutomation_AddPropertyChangedEventHandlerNativeArray(This,element,scope,cacheRequest,handler,propertyArray,propertyCount) (This)->lpVtbl->AddPropertyChangedEventHandlerNativeArray(This,element,scope,cacheRequest,handler,propertyArray,propertyCount)
#define IUIAutomation_AddPropertyChangedEventHandler(This,element,scope,cacheRequest,handler,propertyArray) (This)->lpVtbl->AddPropertyChangedEventHandler(This,element,scope,cacheRequest,handler,propertyArray)
#define IUIAutomation_RemovePropertyChangedEventHandler(This,element,handler) (This)->lpVtbl->RemovePropertyChangedEventHandler(This,element,handler)
#define IUIAutomation_AddStructureChangedEventHandler(This,element,scope,cacheRequest,handler) (This)->lpVtbl->AddStructureChangedEventHandler(This,element,scope,cacheRequest,handler)
#define IUIAutomation_RemoveStructureChangedEventHandler(This,element,handler) (This)->lpVtbl->RemoveStructureChangedEventHandler(This,element,handler)
#define IUIAutomation_AddFocusChangedEventHandler(This,cacheRequest,handler) (This)->lpVtbl->AddFocusChangedEventHandler(This,cacheRequest,handler)
#define IUIAutomation_RemoveFocusChangedEventHandler(This,handler) (This)->lpVtbl->RemoveFocusChangedEventHandler(This,handler)
#define IUIAutomation_RemoveAllEventHandlers(This) (This)->lpVtbl->RemoveAllEventHandlers(This)
#define IUIAutomation_IntNativeArrayToSafeArray(This,array,arrayCount,safeArray) (This)->lpVtbl->IntNativeArrayToSafeArray(This,array,arrayCount,safeArray)
#define IUIAutomation_IntSafeArrayToNativeArray(This,intArray,array,arrayCount) (This)->lpVtbl->IntSafeArrayToNativeArray(This,intArray,array,arrayCount)
#define IUIAutomation_RectToVariant(This,rc,var) (This)->lpVtbl->RectToVariant(This,rc,var)
#define IUIAutomation_VariantToRect(This,var,rc) (This)->lpVtbl->VariantToRect(This,var,rc)
#define IUIAutomation_SafeArrayToRectNativeArray(This,rects,rectArray,rectArrayCount) (This)->lpVtbl->SafeArrayToRectNativeArray(This,rects,rectArray,rectArrayCount)
#define IUIAutomation_CreateProxyFactoryEntry(This,factory,factoryEntry) (This)->lpVtbl->CreateProxyFactoryEntry(This,factory,factoryEntry)
#define IUIAutomation_get_ProxyFactoryMapping(This,factoryMapping) (This)->lpVtbl->get_ProxyFactoryMapping(This,factoryMapping)
#define IUIAutomation_GetPropertyProgrammaticName(This,property,name) (This)->lpVtbl->GetPropertyProgrammaticName(This,property,name)
#define IUIAutomation_GetPatternProgrammaticName(This,pattern,name) (This)->lpVtbl->GetPatternProgrammaticName(This,pattern,name)
#define IUIAutomation_PollForPotentialSupportedPatterns(This,pElement,patternIds,patternNames) (This)->lpVtbl->PollForPotentialSupportedPatterns(This,pElement,patternIds,patternNames)
#define IUIAutomation_PollForPotentialSupportedProperties(This,pElement,propertyIds,propertyNames) (This)->lpVtbl->PollForPotentialSupportedProperties(This,pElement,propertyIds,propertyNames)
#define IUIAutomation_CheckNotSupported(This,value,isNotSupported) (This)->lpVtbl->CheckNotSupported(This,value,isNotSupported)
#define IUIAutomation_get_ReservedNotSupportedValue(This,notSupportedValue) (This)->lpVtbl->get_ReservedNotSupportedValue(This,notSupportedValue)
#define IUIAutomation_get_ReservedMixedAttributeValue(This,mixedAttributeValue) (This)->lpVtbl->get_ReservedMixedAttributeValue(This,mixedAttributeValue)
#define IUIAutomation_ElementFromIAccessible(This,accessible,childId,element) (This)->lpVtbl->ElementFromIAccessible(This,accessible,childId,element)
#define IUIAutomation_ElementFromIAccessibleBuildCache(This,accessible,childId,cacheRequest,element) (This)->lpVtbl->ElementFromIAccessibleBuildCache(This,accessible,childId,cacheRequest,element)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomation_QueryInterface(IUIAutomation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomation_AddRef(IUIAutomation* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomation_Release(IUIAutomation* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomation methods ***/
static __WIDL_INLINE HRESULT IUIAutomation_CompareElements(IUIAutomation* This,IUIAutomationElement *el1,IUIAutomationElement *el2,WINBOOL *areSame) {
    return This->lpVtbl->CompareElements(This,el1,el2,areSame);
}
static __WIDL_INLINE HRESULT IUIAutomation_CompareRuntimeIds(IUIAutomation* This,SAFEARRAY *runtimeId1,SAFEARRAY *runtimeId2,WINBOOL *areSame) {
    return This->lpVtbl->CompareRuntimeIds(This,runtimeId1,runtimeId2,areSame);
}
static __WIDL_INLINE HRESULT IUIAutomation_GetRootElement(IUIAutomation* This,IUIAutomationElement **root) {
    return This->lpVtbl->GetRootElement(This,root);
}
static __WIDL_INLINE HRESULT IUIAutomation_ElementFromHandle(IUIAutomation* This,UIA_HWND hwnd,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromHandle(This,hwnd,element);
}
static __WIDL_INLINE HRESULT IUIAutomation_ElementFromPoint(IUIAutomation* This,POINT pt,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromPoint(This,pt,element);
}
static __WIDL_INLINE HRESULT IUIAutomation_GetFocusedElement(IUIAutomation* This,IUIAutomationElement **element) {
    return This->lpVtbl->GetFocusedElement(This,element);
}
static __WIDL_INLINE HRESULT IUIAutomation_GetRootElementBuildCache(IUIAutomation* This,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **root) {
    return This->lpVtbl->GetRootElementBuildCache(This,cacheRequest,root);
}
static __WIDL_INLINE HRESULT IUIAutomation_ElementFromHandleBuildCache(IUIAutomation* This,UIA_HWND hwnd,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromHandleBuildCache(This,hwnd,cacheRequest,element);
}
static __WIDL_INLINE HRESULT IUIAutomation_ElementFromPointBuildCache(IUIAutomation* This,POINT pt,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromPointBuildCache(This,pt,cacheRequest,element);
}
static __WIDL_INLINE HRESULT IUIAutomation_GetFocusedElementBuildCache(IUIAutomation* This,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **element) {
    return This->lpVtbl->GetFocusedElementBuildCache(This,cacheRequest,element);
}
static __WIDL_INLINE HRESULT IUIAutomation_CreateTreeWalker(IUIAutomation* This,IUIAutomationCondition *pCondition,IUIAutomationTreeWalker **walker) {
    return This->lpVtbl->CreateTreeWalker(This,pCondition,walker);
}
static __WIDL_INLINE HRESULT IUIAutomation_get_ControlViewWalker(IUIAutomation* This,IUIAutomationTreeWalker **walker) {
    return This->lpVtbl->get_ControlViewWalker(This,walker);
}
static __WIDL_INLINE HRESULT IUIAutomation_get_ContentViewWalker(IUIAutomation* This,IUIAutomationTreeWalker **walker) {
    return This->lpVtbl->get_ContentViewWalker(This,walker);
}
static __WIDL_INLINE HRESULT IUIAutomation_get_RawViewWalker(IUIAutomation* This,IUIAutomationTreeWalker **walker) {
    return This->lpVtbl->get_RawViewWalker(This,walker);
}
static __WIDL_INLINE HRESULT IUIAutomation_get_RawViewCondition(IUIAutomation* This,IUIAutomationCondition **condition) {
    return This->lpVtbl->get_RawViewCondition(This,condition);
}
static __WIDL_INLINE HRESULT IUIAutomation_get_ControlViewCondition(IUIAutomation* This,IUIAutomationCondition **condition) {
    return This->lpVtbl->get_ControlViewCondition(This,condition);
}
static __WIDL_INLINE HRESULT IUIAutomation_get_ContentViewCondition(IUIAutomation* This,IUIAutomationCondition **condition) {
    return This->lpVtbl->get_ContentViewCondition(This,condition);
}
static __WIDL_INLINE HRESULT IUIAutomation_CreateCacheRequest(IUIAutomation* This,IUIAutomationCacheRequest **cacheRequest) {
    return This->lpVtbl->CreateCacheRequest(This,cacheRequest);
}
static __WIDL_INLINE HRESULT IUIAutomation_CreateTrueCondition(IUIAutomation* This,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateTrueCondition(This,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation_CreateFalseCondition(IUIAutomation* This,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateFalseCondition(This,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation_CreatePropertyCondition(IUIAutomation* This,PROPERTYID propertyId,VARIANT value,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreatePropertyCondition(This,propertyId,value,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation_CreatePropertyConditionEx(IUIAutomation* This,PROPERTYID propertyId,VARIANT value,enum PropertyConditionFlags flags,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreatePropertyConditionEx(This,propertyId,value,flags,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation_CreateAndCondition(IUIAutomation* This,IUIAutomationCondition *condition1,IUIAutomationCondition *condition2,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateAndCondition(This,condition1,condition2,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation_CreateAndConditionFromArray(IUIAutomation* This,SAFEARRAY *conditions,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateAndConditionFromArray(This,conditions,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation_CreateAndConditionFromNativeArray(IUIAutomation* This,IUIAutomationCondition **conditions,int conditionCount,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateAndConditionFromNativeArray(This,conditions,conditionCount,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation_CreateOrCondition(IUIAutomation* This,IUIAutomationCondition *condition1,IUIAutomationCondition *condition2,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateOrCondition(This,condition1,condition2,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation_CreateOrConditionFromArray(IUIAutomation* This,SAFEARRAY *conditions,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateOrConditionFromArray(This,conditions,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation_CreateOrConditionFromNativeArray(IUIAutomation* This,IUIAutomationCondition **conditions,int conditionCount,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateOrConditionFromNativeArray(This,conditions,conditionCount,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation_CreateNotCondition(IUIAutomation* This,IUIAutomationCondition *condition,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateNotCondition(This,condition,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation_AddAutomationEventHandler(IUIAutomation* This,EVENTID eventId,IUIAutomationElement *element,enum TreeScope scope,IUIAutomationCacheRequest *cacheRequest,IUIAutomationEventHandler *handler) {
    return This->lpVtbl->AddAutomationEventHandler(This,eventId,element,scope,cacheRequest,handler);
}
static __WIDL_INLINE HRESULT IUIAutomation_RemoveAutomationEventHandler(IUIAutomation* This,EVENTID eventId,IUIAutomationElement *element,IUIAutomationEventHandler *handler) {
    return This->lpVtbl->RemoveAutomationEventHandler(This,eventId,element,handler);
}
static __WIDL_INLINE HRESULT IUIAutomation_AddPropertyChangedEventHandlerNativeArray(IUIAutomation* This,IUIAutomationElement *element,enum TreeScope scope,IUIAutomationCacheRequest *cacheRequest,IUIAutomationPropertyChangedEventHandler *handler,PROPERTYID *propertyArray,int propertyCount) {
    return This->lpVtbl->AddPropertyChangedEventHandlerNativeArray(This,element,scope,cacheRequest,handler,propertyArray,propertyCount);
}
static __WIDL_INLINE HRESULT IUIAutomation_AddPropertyChangedEventHandler(IUIAutomation* This,IUIAutomationElement *element,enum TreeScope scope,IUIAutomationCacheRequest *cacheRequest,IUIAutomationPropertyChangedEventHandler *handler,SAFEARRAY *propertyArray) {
    return This->lpVtbl->AddPropertyChangedEventHandler(This,element,scope,cacheRequest,handler,propertyArray);
}
static __WIDL_INLINE HRESULT IUIAutomation_RemovePropertyChangedEventHandler(IUIAutomation* This,IUIAutomationElement *element,IUIAutomationPropertyChangedEventHandler *handler) {
    return This->lpVtbl->RemovePropertyChangedEventHandler(This,element,handler);
}
static __WIDL_INLINE HRESULT IUIAutomation_AddStructureChangedEventHandler(IUIAutomation* This,IUIAutomationElement *element,enum TreeScope scope,IUIAutomationCacheRequest *cacheRequest,IUIAutomationStructureChangedEventHandler *handler) {
    return This->lpVtbl->AddStructureChangedEventHandler(This,element,scope,cacheRequest,handler);
}
static __WIDL_INLINE HRESULT IUIAutomation_RemoveStructureChangedEventHandler(IUIAutomation* This,IUIAutomationElement *element,IUIAutomationStructureChangedEventHandler *handler) {
    return This->lpVtbl->RemoveStructureChangedEventHandler(This,element,handler);
}
static __WIDL_INLINE HRESULT IUIAutomation_AddFocusChangedEventHandler(IUIAutomation* This,IUIAutomationCacheRequest *cacheRequest,IUIAutomationFocusChangedEventHandler *handler) {
    return This->lpVtbl->AddFocusChangedEventHandler(This,cacheRequest,handler);
}
static __WIDL_INLINE HRESULT IUIAutomation_RemoveFocusChangedEventHandler(IUIAutomation* This,IUIAutomationFocusChangedEventHandler *handler) {
    return This->lpVtbl->RemoveFocusChangedEventHandler(This,handler);
}
static __WIDL_INLINE HRESULT IUIAutomation_RemoveAllEventHandlers(IUIAutomation* This) {
    return This->lpVtbl->RemoveAllEventHandlers(This);
}
static __WIDL_INLINE HRESULT IUIAutomation_IntNativeArrayToSafeArray(IUIAutomation* This,int *array,int arrayCount,SAFEARRAY **safeArray) {
    return This->lpVtbl->IntNativeArrayToSafeArray(This,array,arrayCount,safeArray);
}
static __WIDL_INLINE HRESULT IUIAutomation_IntSafeArrayToNativeArray(IUIAutomation* This,SAFEARRAY *intArray,int **array,int *arrayCount) {
    return This->lpVtbl->IntSafeArrayToNativeArray(This,intArray,array,arrayCount);
}
static __WIDL_INLINE HRESULT IUIAutomation_RectToVariant(IUIAutomation* This,RECT rc,VARIANT *var) {
    return This->lpVtbl->RectToVariant(This,rc,var);
}
static __WIDL_INLINE HRESULT IUIAutomation_VariantToRect(IUIAutomation* This,VARIANT var,RECT *rc) {
    return This->lpVtbl->VariantToRect(This,var,rc);
}
static __WIDL_INLINE HRESULT IUIAutomation_SafeArrayToRectNativeArray(IUIAutomation* This,SAFEARRAY *rects,RECT **rectArray,int *rectArrayCount) {
    return This->lpVtbl->SafeArrayToRectNativeArray(This,rects,rectArray,rectArrayCount);
}
static __WIDL_INLINE HRESULT IUIAutomation_CreateProxyFactoryEntry(IUIAutomation* This,IUIAutomationProxyFactory *factory,IUIAutomationProxyFactoryEntry **factoryEntry) {
    return This->lpVtbl->CreateProxyFactoryEntry(This,factory,factoryEntry);
}
static __WIDL_INLINE HRESULT IUIAutomation_get_ProxyFactoryMapping(IUIAutomation* This,IUIAutomationProxyFactoryMapping **factoryMapping) {
    return This->lpVtbl->get_ProxyFactoryMapping(This,factoryMapping);
}
static __WIDL_INLINE HRESULT IUIAutomation_GetPropertyProgrammaticName(IUIAutomation* This,PROPERTYID property,BSTR *name) {
    return This->lpVtbl->GetPropertyProgrammaticName(This,property,name);
}
static __WIDL_INLINE HRESULT IUIAutomation_GetPatternProgrammaticName(IUIAutomation* This,PATTERNID pattern,BSTR *name) {
    return This->lpVtbl->GetPatternProgrammaticName(This,pattern,name);
}
static __WIDL_INLINE HRESULT IUIAutomation_PollForPotentialSupportedPatterns(IUIAutomation* This,IUIAutomationElement *pElement,SAFEARRAY **patternIds,SAFEARRAY **patternNames) {
    return This->lpVtbl->PollForPotentialSupportedPatterns(This,pElement,patternIds,patternNames);
}
static __WIDL_INLINE HRESULT IUIAutomation_PollForPotentialSupportedProperties(IUIAutomation* This,IUIAutomationElement *pElement,SAFEARRAY **propertyIds,SAFEARRAY **propertyNames) {
    return This->lpVtbl->PollForPotentialSupportedProperties(This,pElement,propertyIds,propertyNames);
}
static __WIDL_INLINE HRESULT IUIAutomation_CheckNotSupported(IUIAutomation* This,VARIANT value,WINBOOL *isNotSupported) {
    return This->lpVtbl->CheckNotSupported(This,value,isNotSupported);
}
static __WIDL_INLINE HRESULT IUIAutomation_get_ReservedNotSupportedValue(IUIAutomation* This,IUnknown **notSupportedValue) {
    return This->lpVtbl->get_ReservedNotSupportedValue(This,notSupportedValue);
}
static __WIDL_INLINE HRESULT IUIAutomation_get_ReservedMixedAttributeValue(IUIAutomation* This,IUnknown **mixedAttributeValue) {
    return This->lpVtbl->get_ReservedMixedAttributeValue(This,mixedAttributeValue);
}
static __WIDL_INLINE HRESULT IUIAutomation_ElementFromIAccessible(IUIAutomation* This,IAccessible *accessible,int childId,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromIAccessible(This,accessible,childId,element);
}
static __WIDL_INLINE HRESULT IUIAutomation_ElementFromIAccessibleBuildCache(IUIAutomation* This,IAccessible *accessible,int childId,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromIAccessibleBuildCache(This,accessible,childId,cacheRequest,element);
}
#endif
#endif

#endif


#endif  /* __IUIAutomation_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomation2 interface
 */
#ifndef __IUIAutomation2_INTERFACE_DEFINED__
#define __IUIAutomation2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomation2, 0x34723aff, 0x0c9d, 0x49d0, 0x98,0x96, 0x7a,0xb5,0x2d,0xf8,0xcd,0x8a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("34723aff-0c9d-49d0-9896-7ab52df8cd8a")
IUIAutomation2 : public IUIAutomation
{
    virtual HRESULT STDMETHODCALLTYPE get_AutoSetFocus(
        WINBOOL *autoSetFocus) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_AutoSetFocus(
        WINBOOL autoSetFocus) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ConnectionTimeout(
        DWORD *timeout) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ConnectionTimeout(
        DWORD timeout) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_TransactionTimeout(
        DWORD *timeout) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_TransactionTimeout(
        DWORD timeout) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomation2, 0x34723aff, 0x0c9d, 0x49d0, 0x98,0x96, 0x7a,0xb5,0x2d,0xf8,0xcd,0x8a)
#endif
#else
typedef struct IUIAutomation2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomation methods ***/
    HRESULT (STDMETHODCALLTYPE *CompareElements)(
        IUIAutomation2 *This,
        IUIAutomationElement *el1,
        IUIAutomationElement *el2,
        WINBOOL *areSame);

    HRESULT (STDMETHODCALLTYPE *CompareRuntimeIds)(
        IUIAutomation2 *This,
        SAFEARRAY *runtimeId1,
        SAFEARRAY *runtimeId2,
        WINBOOL *areSame);

    HRESULT (STDMETHODCALLTYPE *GetRootElement)(
        IUIAutomation2 *This,
        IUIAutomationElement **root);

    HRESULT (STDMETHODCALLTYPE *ElementFromHandle)(
        IUIAutomation2 *This,
        UIA_HWND hwnd,
        IUIAutomationElement **element);

    HRESULT (STDMETHODCALLTYPE *ElementFromPoint)(
        IUIAutomation2 *This,
        POINT pt,
        IUIAutomationElement **element);

    HRESULT (STDMETHODCALLTYPE *GetFocusedElement)(
        IUIAutomation2 *This,
        IUIAutomationElement **element);

    HRESULT (STDMETHODCALLTYPE *GetRootElementBuildCache)(
        IUIAutomation2 *This,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **root);

    HRESULT (STDMETHODCALLTYPE *ElementFromHandleBuildCache)(
        IUIAutomation2 *This,
        UIA_HWND hwnd,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **element);

    HRESULT (STDMETHODCALLTYPE *ElementFromPointBuildCache)(
        IUIAutomation2 *This,
        POINT pt,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **element);

    HRESULT (STDMETHODCALLTYPE *GetFocusedElementBuildCache)(
        IUIAutomation2 *This,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **element);

    HRESULT (STDMETHODCALLTYPE *CreateTreeWalker)(
        IUIAutomation2 *This,
        IUIAutomationCondition *pCondition,
        IUIAutomationTreeWalker **walker);

    HRESULT (STDMETHODCALLTYPE *get_ControlViewWalker)(
        IUIAutomation2 *This,
        IUIAutomationTreeWalker **walker);

    HRESULT (STDMETHODCALLTYPE *get_ContentViewWalker)(
        IUIAutomation2 *This,
        IUIAutomationTreeWalker **walker);

    HRESULT (STDMETHODCALLTYPE *get_RawViewWalker)(
        IUIAutomation2 *This,
        IUIAutomationTreeWalker **walker);

    HRESULT (STDMETHODCALLTYPE *get_RawViewCondition)(
        IUIAutomation2 *This,
        IUIAutomationCondition **condition);

    HRESULT (STDMETHODCALLTYPE *get_ControlViewCondition)(
        IUIAutomation2 *This,
        IUIAutomationCondition **condition);

    HRESULT (STDMETHODCALLTYPE *get_ContentViewCondition)(
        IUIAutomation2 *This,
        IUIAutomationCondition **condition);

    HRESULT (STDMETHODCALLTYPE *CreateCacheRequest)(
        IUIAutomation2 *This,
        IUIAutomationCacheRequest **cacheRequest);

    HRESULT (STDMETHODCALLTYPE *CreateTrueCondition)(
        IUIAutomation2 *This,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreateFalseCondition)(
        IUIAutomation2 *This,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreatePropertyCondition)(
        IUIAutomation2 *This,
        PROPERTYID propertyId,
        VARIANT value,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreatePropertyConditionEx)(
        IUIAutomation2 *This,
        PROPERTYID propertyId,
        VARIANT value,
        enum PropertyConditionFlags flags,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreateAndCondition)(
        IUIAutomation2 *This,
        IUIAutomationCondition *condition1,
        IUIAutomationCondition *condition2,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreateAndConditionFromArray)(
        IUIAutomation2 *This,
        SAFEARRAY *conditions,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreateAndConditionFromNativeArray)(
        IUIAutomation2 *This,
        IUIAutomationCondition **conditions,
        int conditionCount,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreateOrCondition)(
        IUIAutomation2 *This,
        IUIAutomationCondition *condition1,
        IUIAutomationCondition *condition2,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreateOrConditionFromArray)(
        IUIAutomation2 *This,
        SAFEARRAY *conditions,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreateOrConditionFromNativeArray)(
        IUIAutomation2 *This,
        IUIAutomationCondition **conditions,
        int conditionCount,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreateNotCondition)(
        IUIAutomation2 *This,
        IUIAutomationCondition *condition,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *AddAutomationEventHandler)(
        IUIAutomation2 *This,
        EVENTID eventId,
        IUIAutomationElement *element,
        enum TreeScope scope,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *RemoveAutomationEventHandler)(
        IUIAutomation2 *This,
        EVENTID eventId,
        IUIAutomationElement *element,
        IUIAutomationEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *AddPropertyChangedEventHandlerNativeArray)(
        IUIAutomation2 *This,
        IUIAutomationElement *element,
        enum TreeScope scope,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationPropertyChangedEventHandler *handler,
        PROPERTYID *propertyArray,
        int propertyCount);

    HRESULT (STDMETHODCALLTYPE *AddPropertyChangedEventHandler)(
        IUIAutomation2 *This,
        IUIAutomationElement *element,
        enum TreeScope scope,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationPropertyChangedEventHandler *handler,
        SAFEARRAY *propertyArray);

    HRESULT (STDMETHODCALLTYPE *RemovePropertyChangedEventHandler)(
        IUIAutomation2 *This,
        IUIAutomationElement *element,
        IUIAutomationPropertyChangedEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *AddStructureChangedEventHandler)(
        IUIAutomation2 *This,
        IUIAutomationElement *element,
        enum TreeScope scope,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationStructureChangedEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *RemoveStructureChangedEventHandler)(
        IUIAutomation2 *This,
        IUIAutomationElement *element,
        IUIAutomationStructureChangedEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *AddFocusChangedEventHandler)(
        IUIAutomation2 *This,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationFocusChangedEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *RemoveFocusChangedEventHandler)(
        IUIAutomation2 *This,
        IUIAutomationFocusChangedEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *RemoveAllEventHandlers)(
        IUIAutomation2 *This);

    HRESULT (STDMETHODCALLTYPE *IntNativeArrayToSafeArray)(
        IUIAutomation2 *This,
        int *array,
        int arrayCount,
        SAFEARRAY **safeArray);

    HRESULT (STDMETHODCALLTYPE *IntSafeArrayToNativeArray)(
        IUIAutomation2 *This,
        SAFEARRAY *intArray,
        int **array,
        int *arrayCount);

    HRESULT (STDMETHODCALLTYPE *RectToVariant)(
        IUIAutomation2 *This,
        RECT rc,
        VARIANT *var);

    HRESULT (STDMETHODCALLTYPE *VariantToRect)(
        IUIAutomation2 *This,
        VARIANT var,
        RECT *rc);

    HRESULT (STDMETHODCALLTYPE *SafeArrayToRectNativeArray)(
        IUIAutomation2 *This,
        SAFEARRAY *rects,
        RECT **rectArray,
        int *rectArrayCount);

    HRESULT (STDMETHODCALLTYPE *CreateProxyFactoryEntry)(
        IUIAutomation2 *This,
        IUIAutomationProxyFactory *factory,
        IUIAutomationProxyFactoryEntry **factoryEntry);

    HRESULT (STDMETHODCALLTYPE *get_ProxyFactoryMapping)(
        IUIAutomation2 *This,
        IUIAutomationProxyFactoryMapping **factoryMapping);

    HRESULT (STDMETHODCALLTYPE *GetPropertyProgrammaticName)(
        IUIAutomation2 *This,
        PROPERTYID property,
        BSTR *name);

    HRESULT (STDMETHODCALLTYPE *GetPatternProgrammaticName)(
        IUIAutomation2 *This,
        PATTERNID pattern,
        BSTR *name);

    HRESULT (STDMETHODCALLTYPE *PollForPotentialSupportedPatterns)(
        IUIAutomation2 *This,
        IUIAutomationElement *pElement,
        SAFEARRAY **patternIds,
        SAFEARRAY **patternNames);

    HRESULT (STDMETHODCALLTYPE *PollForPotentialSupportedProperties)(
        IUIAutomation2 *This,
        IUIAutomationElement *pElement,
        SAFEARRAY **propertyIds,
        SAFEARRAY **propertyNames);

    HRESULT (STDMETHODCALLTYPE *CheckNotSupported)(
        IUIAutomation2 *This,
        VARIANT value,
        WINBOOL *isNotSupported);

    HRESULT (STDMETHODCALLTYPE *get_ReservedNotSupportedValue)(
        IUIAutomation2 *This,
        IUnknown **notSupportedValue);

    HRESULT (STDMETHODCALLTYPE *get_ReservedMixedAttributeValue)(
        IUIAutomation2 *This,
        IUnknown **mixedAttributeValue);

    HRESULT (STDMETHODCALLTYPE *ElementFromIAccessible)(
        IUIAutomation2 *This,
        IAccessible *accessible,
        int childId,
        IUIAutomationElement **element);

    HRESULT (STDMETHODCALLTYPE *ElementFromIAccessibleBuildCache)(
        IUIAutomation2 *This,
        IAccessible *accessible,
        int childId,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **element);

    /*** IUIAutomation2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_AutoSetFocus)(
        IUIAutomation2 *This,
        WINBOOL *autoSetFocus);

    HRESULT (STDMETHODCALLTYPE *put_AutoSetFocus)(
        IUIAutomation2 *This,
        WINBOOL autoSetFocus);

    HRESULT (STDMETHODCALLTYPE *get_ConnectionTimeout)(
        IUIAutomation2 *This,
        DWORD *timeout);

    HRESULT (STDMETHODCALLTYPE *put_ConnectionTimeout)(
        IUIAutomation2 *This,
        DWORD timeout);

    HRESULT (STDMETHODCALLTYPE *get_TransactionTimeout)(
        IUIAutomation2 *This,
        DWORD *timeout);

    HRESULT (STDMETHODCALLTYPE *put_TransactionTimeout)(
        IUIAutomation2 *This,
        DWORD timeout);

    END_INTERFACE
} IUIAutomation2Vtbl;

interface IUIAutomation2 {
    CONST_VTBL IUIAutomation2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomation2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomation2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomation2_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomation methods ***/
#define IUIAutomation2_CompareElements(This,el1,el2,areSame) (This)->lpVtbl->CompareElements(This,el1,el2,areSame)
#define IUIAutomation2_CompareRuntimeIds(This,runtimeId1,runtimeId2,areSame) (This)->lpVtbl->CompareRuntimeIds(This,runtimeId1,runtimeId2,areSame)
#define IUIAutomation2_GetRootElement(This,root) (This)->lpVtbl->GetRootElement(This,root)
#define IUIAutomation2_ElementFromHandle(This,hwnd,element) (This)->lpVtbl->ElementFromHandle(This,hwnd,element)
#define IUIAutomation2_ElementFromPoint(This,pt,element) (This)->lpVtbl->ElementFromPoint(This,pt,element)
#define IUIAutomation2_GetFocusedElement(This,element) (This)->lpVtbl->GetFocusedElement(This,element)
#define IUIAutomation2_GetRootElementBuildCache(This,cacheRequest,root) (This)->lpVtbl->GetRootElementBuildCache(This,cacheRequest,root)
#define IUIAutomation2_ElementFromHandleBuildCache(This,hwnd,cacheRequest,element) (This)->lpVtbl->ElementFromHandleBuildCache(This,hwnd,cacheRequest,element)
#define IUIAutomation2_ElementFromPointBuildCache(This,pt,cacheRequest,element) (This)->lpVtbl->ElementFromPointBuildCache(This,pt,cacheRequest,element)
#define IUIAutomation2_GetFocusedElementBuildCache(This,cacheRequest,element) (This)->lpVtbl->GetFocusedElementBuildCache(This,cacheRequest,element)
#define IUIAutomation2_CreateTreeWalker(This,pCondition,walker) (This)->lpVtbl->CreateTreeWalker(This,pCondition,walker)
#define IUIAutomation2_get_ControlViewWalker(This,walker) (This)->lpVtbl->get_ControlViewWalker(This,walker)
#define IUIAutomation2_get_ContentViewWalker(This,walker) (This)->lpVtbl->get_ContentViewWalker(This,walker)
#define IUIAutomation2_get_RawViewWalker(This,walker) (This)->lpVtbl->get_RawViewWalker(This,walker)
#define IUIAutomation2_get_RawViewCondition(This,condition) (This)->lpVtbl->get_RawViewCondition(This,condition)
#define IUIAutomation2_get_ControlViewCondition(This,condition) (This)->lpVtbl->get_ControlViewCondition(This,condition)
#define IUIAutomation2_get_ContentViewCondition(This,condition) (This)->lpVtbl->get_ContentViewCondition(This,condition)
#define IUIAutomation2_CreateCacheRequest(This,cacheRequest) (This)->lpVtbl->CreateCacheRequest(This,cacheRequest)
#define IUIAutomation2_CreateTrueCondition(This,newCondition) (This)->lpVtbl->CreateTrueCondition(This,newCondition)
#define IUIAutomation2_CreateFalseCondition(This,newCondition) (This)->lpVtbl->CreateFalseCondition(This,newCondition)
#define IUIAutomation2_CreatePropertyCondition(This,propertyId,value,newCondition) (This)->lpVtbl->CreatePropertyCondition(This,propertyId,value,newCondition)
#define IUIAutomation2_CreatePropertyConditionEx(This,propertyId,value,flags,newCondition) (This)->lpVtbl->CreatePropertyConditionEx(This,propertyId,value,flags,newCondition)
#define IUIAutomation2_CreateAndCondition(This,condition1,condition2,newCondition) (This)->lpVtbl->CreateAndCondition(This,condition1,condition2,newCondition)
#define IUIAutomation2_CreateAndConditionFromArray(This,conditions,newCondition) (This)->lpVtbl->CreateAndConditionFromArray(This,conditions,newCondition)
#define IUIAutomation2_CreateAndConditionFromNativeArray(This,conditions,conditionCount,newCondition) (This)->lpVtbl->CreateAndConditionFromNativeArray(This,conditions,conditionCount,newCondition)
#define IUIAutomation2_CreateOrCondition(This,condition1,condition2,newCondition) (This)->lpVtbl->CreateOrCondition(This,condition1,condition2,newCondition)
#define IUIAutomation2_CreateOrConditionFromArray(This,conditions,newCondition) (This)->lpVtbl->CreateOrConditionFromArray(This,conditions,newCondition)
#define IUIAutomation2_CreateOrConditionFromNativeArray(This,conditions,conditionCount,newCondition) (This)->lpVtbl->CreateOrConditionFromNativeArray(This,conditions,conditionCount,newCondition)
#define IUIAutomation2_CreateNotCondition(This,condition,newCondition) (This)->lpVtbl->CreateNotCondition(This,condition,newCondition)
#define IUIAutomation2_AddAutomationEventHandler(This,eventId,element,scope,cacheRequest,handler) (This)->lpVtbl->AddAutomationEventHandler(This,eventId,element,scope,cacheRequest,handler)
#define IUIAutomation2_RemoveAutomationEventHandler(This,eventId,element,handler) (This)->lpVtbl->RemoveAutomationEventHandler(This,eventId,element,handler)
#define IUIAutomation2_AddPropertyChangedEventHandlerNativeArray(This,element,scope,cacheRequest,handler,propertyArray,propertyCount) (This)->lpVtbl->AddPropertyChangedEventHandlerNativeArray(This,element,scope,cacheRequest,handler,propertyArray,propertyCount)
#define IUIAutomation2_AddPropertyChangedEventHandler(This,element,scope,cacheRequest,handler,propertyArray) (This)->lpVtbl->AddPropertyChangedEventHandler(This,element,scope,cacheRequest,handler,propertyArray)
#define IUIAutomation2_RemovePropertyChangedEventHandler(This,element,handler) (This)->lpVtbl->RemovePropertyChangedEventHandler(This,element,handler)
#define IUIAutomation2_AddStructureChangedEventHandler(This,element,scope,cacheRequest,handler) (This)->lpVtbl->AddStructureChangedEventHandler(This,element,scope,cacheRequest,handler)
#define IUIAutomation2_RemoveStructureChangedEventHandler(This,element,handler) (This)->lpVtbl->RemoveStructureChangedEventHandler(This,element,handler)
#define IUIAutomation2_AddFocusChangedEventHandler(This,cacheRequest,handler) (This)->lpVtbl->AddFocusChangedEventHandler(This,cacheRequest,handler)
#define IUIAutomation2_RemoveFocusChangedEventHandler(This,handler) (This)->lpVtbl->RemoveFocusChangedEventHandler(This,handler)
#define IUIAutomation2_RemoveAllEventHandlers(This) (This)->lpVtbl->RemoveAllEventHandlers(This)
#define IUIAutomation2_IntNativeArrayToSafeArray(This,array,arrayCount,safeArray) (This)->lpVtbl->IntNativeArrayToSafeArray(This,array,arrayCount,safeArray)
#define IUIAutomation2_IntSafeArrayToNativeArray(This,intArray,array,arrayCount) (This)->lpVtbl->IntSafeArrayToNativeArray(This,intArray,array,arrayCount)
#define IUIAutomation2_RectToVariant(This,rc,var) (This)->lpVtbl->RectToVariant(This,rc,var)
#define IUIAutomation2_VariantToRect(This,var,rc) (This)->lpVtbl->VariantToRect(This,var,rc)
#define IUIAutomation2_SafeArrayToRectNativeArray(This,rects,rectArray,rectArrayCount) (This)->lpVtbl->SafeArrayToRectNativeArray(This,rects,rectArray,rectArrayCount)
#define IUIAutomation2_CreateProxyFactoryEntry(This,factory,factoryEntry) (This)->lpVtbl->CreateProxyFactoryEntry(This,factory,factoryEntry)
#define IUIAutomation2_get_ProxyFactoryMapping(This,factoryMapping) (This)->lpVtbl->get_ProxyFactoryMapping(This,factoryMapping)
#define IUIAutomation2_GetPropertyProgrammaticName(This,property,name) (This)->lpVtbl->GetPropertyProgrammaticName(This,property,name)
#define IUIAutomation2_GetPatternProgrammaticName(This,pattern,name) (This)->lpVtbl->GetPatternProgrammaticName(This,pattern,name)
#define IUIAutomation2_PollForPotentialSupportedPatterns(This,pElement,patternIds,patternNames) (This)->lpVtbl->PollForPotentialSupportedPatterns(This,pElement,patternIds,patternNames)
#define IUIAutomation2_PollForPotentialSupportedProperties(This,pElement,propertyIds,propertyNames) (This)->lpVtbl->PollForPotentialSupportedProperties(This,pElement,propertyIds,propertyNames)
#define IUIAutomation2_CheckNotSupported(This,value,isNotSupported) (This)->lpVtbl->CheckNotSupported(This,value,isNotSupported)
#define IUIAutomation2_get_ReservedNotSupportedValue(This,notSupportedValue) (This)->lpVtbl->get_ReservedNotSupportedValue(This,notSupportedValue)
#define IUIAutomation2_get_ReservedMixedAttributeValue(This,mixedAttributeValue) (This)->lpVtbl->get_ReservedMixedAttributeValue(This,mixedAttributeValue)
#define IUIAutomation2_ElementFromIAccessible(This,accessible,childId,element) (This)->lpVtbl->ElementFromIAccessible(This,accessible,childId,element)
#define IUIAutomation2_ElementFromIAccessibleBuildCache(This,accessible,childId,cacheRequest,element) (This)->lpVtbl->ElementFromIAccessibleBuildCache(This,accessible,childId,cacheRequest,element)
/*** IUIAutomation2 methods ***/
#define IUIAutomation2_get_AutoSetFocus(This,autoSetFocus) (This)->lpVtbl->get_AutoSetFocus(This,autoSetFocus)
#define IUIAutomation2_put_AutoSetFocus(This,autoSetFocus) (This)->lpVtbl->put_AutoSetFocus(This,autoSetFocus)
#define IUIAutomation2_get_ConnectionTimeout(This,timeout) (This)->lpVtbl->get_ConnectionTimeout(This,timeout)
#define IUIAutomation2_put_ConnectionTimeout(This,timeout) (This)->lpVtbl->put_ConnectionTimeout(This,timeout)
#define IUIAutomation2_get_TransactionTimeout(This,timeout) (This)->lpVtbl->get_TransactionTimeout(This,timeout)
#define IUIAutomation2_put_TransactionTimeout(This,timeout) (This)->lpVtbl->put_TransactionTimeout(This,timeout)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomation2_QueryInterface(IUIAutomation2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomation2_AddRef(IUIAutomation2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomation2_Release(IUIAutomation2* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomation methods ***/
static __WIDL_INLINE HRESULT IUIAutomation2_CompareElements(IUIAutomation2* This,IUIAutomationElement *el1,IUIAutomationElement *el2,WINBOOL *areSame) {
    return This->lpVtbl->CompareElements(This,el1,el2,areSame);
}
static __WIDL_INLINE HRESULT IUIAutomation2_CompareRuntimeIds(IUIAutomation2* This,SAFEARRAY *runtimeId1,SAFEARRAY *runtimeId2,WINBOOL *areSame) {
    return This->lpVtbl->CompareRuntimeIds(This,runtimeId1,runtimeId2,areSame);
}
static __WIDL_INLINE HRESULT IUIAutomation2_GetRootElement(IUIAutomation2* This,IUIAutomationElement **root) {
    return This->lpVtbl->GetRootElement(This,root);
}
static __WIDL_INLINE HRESULT IUIAutomation2_ElementFromHandle(IUIAutomation2* This,UIA_HWND hwnd,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromHandle(This,hwnd,element);
}
static __WIDL_INLINE HRESULT IUIAutomation2_ElementFromPoint(IUIAutomation2* This,POINT pt,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromPoint(This,pt,element);
}
static __WIDL_INLINE HRESULT IUIAutomation2_GetFocusedElement(IUIAutomation2* This,IUIAutomationElement **element) {
    return This->lpVtbl->GetFocusedElement(This,element);
}
static __WIDL_INLINE HRESULT IUIAutomation2_GetRootElementBuildCache(IUIAutomation2* This,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **root) {
    return This->lpVtbl->GetRootElementBuildCache(This,cacheRequest,root);
}
static __WIDL_INLINE HRESULT IUIAutomation2_ElementFromHandleBuildCache(IUIAutomation2* This,UIA_HWND hwnd,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromHandleBuildCache(This,hwnd,cacheRequest,element);
}
static __WIDL_INLINE HRESULT IUIAutomation2_ElementFromPointBuildCache(IUIAutomation2* This,POINT pt,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromPointBuildCache(This,pt,cacheRequest,element);
}
static __WIDL_INLINE HRESULT IUIAutomation2_GetFocusedElementBuildCache(IUIAutomation2* This,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **element) {
    return This->lpVtbl->GetFocusedElementBuildCache(This,cacheRequest,element);
}
static __WIDL_INLINE HRESULT IUIAutomation2_CreateTreeWalker(IUIAutomation2* This,IUIAutomationCondition *pCondition,IUIAutomationTreeWalker **walker) {
    return This->lpVtbl->CreateTreeWalker(This,pCondition,walker);
}
static __WIDL_INLINE HRESULT IUIAutomation2_get_ControlViewWalker(IUIAutomation2* This,IUIAutomationTreeWalker **walker) {
    return This->lpVtbl->get_ControlViewWalker(This,walker);
}
static __WIDL_INLINE HRESULT IUIAutomation2_get_ContentViewWalker(IUIAutomation2* This,IUIAutomationTreeWalker **walker) {
    return This->lpVtbl->get_ContentViewWalker(This,walker);
}
static __WIDL_INLINE HRESULT IUIAutomation2_get_RawViewWalker(IUIAutomation2* This,IUIAutomationTreeWalker **walker) {
    return This->lpVtbl->get_RawViewWalker(This,walker);
}
static __WIDL_INLINE HRESULT IUIAutomation2_get_RawViewCondition(IUIAutomation2* This,IUIAutomationCondition **condition) {
    return This->lpVtbl->get_RawViewCondition(This,condition);
}
static __WIDL_INLINE HRESULT IUIAutomation2_get_ControlViewCondition(IUIAutomation2* This,IUIAutomationCondition **condition) {
    return This->lpVtbl->get_ControlViewCondition(This,condition);
}
static __WIDL_INLINE HRESULT IUIAutomation2_get_ContentViewCondition(IUIAutomation2* This,IUIAutomationCondition **condition) {
    return This->lpVtbl->get_ContentViewCondition(This,condition);
}
static __WIDL_INLINE HRESULT IUIAutomation2_CreateCacheRequest(IUIAutomation2* This,IUIAutomationCacheRequest **cacheRequest) {
    return This->lpVtbl->CreateCacheRequest(This,cacheRequest);
}
static __WIDL_INLINE HRESULT IUIAutomation2_CreateTrueCondition(IUIAutomation2* This,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateTrueCondition(This,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation2_CreateFalseCondition(IUIAutomation2* This,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateFalseCondition(This,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation2_CreatePropertyCondition(IUIAutomation2* This,PROPERTYID propertyId,VARIANT value,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreatePropertyCondition(This,propertyId,value,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation2_CreatePropertyConditionEx(IUIAutomation2* This,PROPERTYID propertyId,VARIANT value,enum PropertyConditionFlags flags,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreatePropertyConditionEx(This,propertyId,value,flags,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation2_CreateAndCondition(IUIAutomation2* This,IUIAutomationCondition *condition1,IUIAutomationCondition *condition2,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateAndCondition(This,condition1,condition2,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation2_CreateAndConditionFromArray(IUIAutomation2* This,SAFEARRAY *conditions,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateAndConditionFromArray(This,conditions,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation2_CreateAndConditionFromNativeArray(IUIAutomation2* This,IUIAutomationCondition **conditions,int conditionCount,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateAndConditionFromNativeArray(This,conditions,conditionCount,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation2_CreateOrCondition(IUIAutomation2* This,IUIAutomationCondition *condition1,IUIAutomationCondition *condition2,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateOrCondition(This,condition1,condition2,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation2_CreateOrConditionFromArray(IUIAutomation2* This,SAFEARRAY *conditions,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateOrConditionFromArray(This,conditions,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation2_CreateOrConditionFromNativeArray(IUIAutomation2* This,IUIAutomationCondition **conditions,int conditionCount,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateOrConditionFromNativeArray(This,conditions,conditionCount,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation2_CreateNotCondition(IUIAutomation2* This,IUIAutomationCondition *condition,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateNotCondition(This,condition,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation2_AddAutomationEventHandler(IUIAutomation2* This,EVENTID eventId,IUIAutomationElement *element,enum TreeScope scope,IUIAutomationCacheRequest *cacheRequest,IUIAutomationEventHandler *handler) {
    return This->lpVtbl->AddAutomationEventHandler(This,eventId,element,scope,cacheRequest,handler);
}
static __WIDL_INLINE HRESULT IUIAutomation2_RemoveAutomationEventHandler(IUIAutomation2* This,EVENTID eventId,IUIAutomationElement *element,IUIAutomationEventHandler *handler) {
    return This->lpVtbl->RemoveAutomationEventHandler(This,eventId,element,handler);
}
static __WIDL_INLINE HRESULT IUIAutomation2_AddPropertyChangedEventHandlerNativeArray(IUIAutomation2* This,IUIAutomationElement *element,enum TreeScope scope,IUIAutomationCacheRequest *cacheRequest,IUIAutomationPropertyChangedEventHandler *handler,PROPERTYID *propertyArray,int propertyCount) {
    return This->lpVtbl->AddPropertyChangedEventHandlerNativeArray(This,element,scope,cacheRequest,handler,propertyArray,propertyCount);
}
static __WIDL_INLINE HRESULT IUIAutomation2_AddPropertyChangedEventHandler(IUIAutomation2* This,IUIAutomationElement *element,enum TreeScope scope,IUIAutomationCacheRequest *cacheRequest,IUIAutomationPropertyChangedEventHandler *handler,SAFEARRAY *propertyArray) {
    return This->lpVtbl->AddPropertyChangedEventHandler(This,element,scope,cacheRequest,handler,propertyArray);
}
static __WIDL_INLINE HRESULT IUIAutomation2_RemovePropertyChangedEventHandler(IUIAutomation2* This,IUIAutomationElement *element,IUIAutomationPropertyChangedEventHandler *handler) {
    return This->lpVtbl->RemovePropertyChangedEventHandler(This,element,handler);
}
static __WIDL_INLINE HRESULT IUIAutomation2_AddStructureChangedEventHandler(IUIAutomation2* This,IUIAutomationElement *element,enum TreeScope scope,IUIAutomationCacheRequest *cacheRequest,IUIAutomationStructureChangedEventHandler *handler) {
    return This->lpVtbl->AddStructureChangedEventHandler(This,element,scope,cacheRequest,handler);
}
static __WIDL_INLINE HRESULT IUIAutomation2_RemoveStructureChangedEventHandler(IUIAutomation2* This,IUIAutomationElement *element,IUIAutomationStructureChangedEventHandler *handler) {
    return This->lpVtbl->RemoveStructureChangedEventHandler(This,element,handler);
}
static __WIDL_INLINE HRESULT IUIAutomation2_AddFocusChangedEventHandler(IUIAutomation2* This,IUIAutomationCacheRequest *cacheRequest,IUIAutomationFocusChangedEventHandler *handler) {
    return This->lpVtbl->AddFocusChangedEventHandler(This,cacheRequest,handler);
}
static __WIDL_INLINE HRESULT IUIAutomation2_RemoveFocusChangedEventHandler(IUIAutomation2* This,IUIAutomationFocusChangedEventHandler *handler) {
    return This->lpVtbl->RemoveFocusChangedEventHandler(This,handler);
}
static __WIDL_INLINE HRESULT IUIAutomation2_RemoveAllEventHandlers(IUIAutomation2* This) {
    return This->lpVtbl->RemoveAllEventHandlers(This);
}
static __WIDL_INLINE HRESULT IUIAutomation2_IntNativeArrayToSafeArray(IUIAutomation2* This,int *array,int arrayCount,SAFEARRAY **safeArray) {
    return This->lpVtbl->IntNativeArrayToSafeArray(This,array,arrayCount,safeArray);
}
static __WIDL_INLINE HRESULT IUIAutomation2_IntSafeArrayToNativeArray(IUIAutomation2* This,SAFEARRAY *intArray,int **array,int *arrayCount) {
    return This->lpVtbl->IntSafeArrayToNativeArray(This,intArray,array,arrayCount);
}
static __WIDL_INLINE HRESULT IUIAutomation2_RectToVariant(IUIAutomation2* This,RECT rc,VARIANT *var) {
    return This->lpVtbl->RectToVariant(This,rc,var);
}
static __WIDL_INLINE HRESULT IUIAutomation2_VariantToRect(IUIAutomation2* This,VARIANT var,RECT *rc) {
    return This->lpVtbl->VariantToRect(This,var,rc);
}
static __WIDL_INLINE HRESULT IUIAutomation2_SafeArrayToRectNativeArray(IUIAutomation2* This,SAFEARRAY *rects,RECT **rectArray,int *rectArrayCount) {
    return This->lpVtbl->SafeArrayToRectNativeArray(This,rects,rectArray,rectArrayCount);
}
static __WIDL_INLINE HRESULT IUIAutomation2_CreateProxyFactoryEntry(IUIAutomation2* This,IUIAutomationProxyFactory *factory,IUIAutomationProxyFactoryEntry **factoryEntry) {
    return This->lpVtbl->CreateProxyFactoryEntry(This,factory,factoryEntry);
}
static __WIDL_INLINE HRESULT IUIAutomation2_get_ProxyFactoryMapping(IUIAutomation2* This,IUIAutomationProxyFactoryMapping **factoryMapping) {
    return This->lpVtbl->get_ProxyFactoryMapping(This,factoryMapping);
}
static __WIDL_INLINE HRESULT IUIAutomation2_GetPropertyProgrammaticName(IUIAutomation2* This,PROPERTYID property,BSTR *name) {
    return This->lpVtbl->GetPropertyProgrammaticName(This,property,name);
}
static __WIDL_INLINE HRESULT IUIAutomation2_GetPatternProgrammaticName(IUIAutomation2* This,PATTERNID pattern,BSTR *name) {
    return This->lpVtbl->GetPatternProgrammaticName(This,pattern,name);
}
static __WIDL_INLINE HRESULT IUIAutomation2_PollForPotentialSupportedPatterns(IUIAutomation2* This,IUIAutomationElement *pElement,SAFEARRAY **patternIds,SAFEARRAY **patternNames) {
    return This->lpVtbl->PollForPotentialSupportedPatterns(This,pElement,patternIds,patternNames);
}
static __WIDL_INLINE HRESULT IUIAutomation2_PollForPotentialSupportedProperties(IUIAutomation2* This,IUIAutomationElement *pElement,SAFEARRAY **propertyIds,SAFEARRAY **propertyNames) {
    return This->lpVtbl->PollForPotentialSupportedProperties(This,pElement,propertyIds,propertyNames);
}
static __WIDL_INLINE HRESULT IUIAutomation2_CheckNotSupported(IUIAutomation2* This,VARIANT value,WINBOOL *isNotSupported) {
    return This->lpVtbl->CheckNotSupported(This,value,isNotSupported);
}
static __WIDL_INLINE HRESULT IUIAutomation2_get_ReservedNotSupportedValue(IUIAutomation2* This,IUnknown **notSupportedValue) {
    return This->lpVtbl->get_ReservedNotSupportedValue(This,notSupportedValue);
}
static __WIDL_INLINE HRESULT IUIAutomation2_get_ReservedMixedAttributeValue(IUIAutomation2* This,IUnknown **mixedAttributeValue) {
    return This->lpVtbl->get_ReservedMixedAttributeValue(This,mixedAttributeValue);
}
static __WIDL_INLINE HRESULT IUIAutomation2_ElementFromIAccessible(IUIAutomation2* This,IAccessible *accessible,int childId,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromIAccessible(This,accessible,childId,element);
}
static __WIDL_INLINE HRESULT IUIAutomation2_ElementFromIAccessibleBuildCache(IUIAutomation2* This,IAccessible *accessible,int childId,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromIAccessibleBuildCache(This,accessible,childId,cacheRequest,element);
}
/*** IUIAutomation2 methods ***/
static __WIDL_INLINE HRESULT IUIAutomation2_get_AutoSetFocus(IUIAutomation2* This,WINBOOL *autoSetFocus) {
    return This->lpVtbl->get_AutoSetFocus(This,autoSetFocus);
}
static __WIDL_INLINE HRESULT IUIAutomation2_put_AutoSetFocus(IUIAutomation2* This,WINBOOL autoSetFocus) {
    return This->lpVtbl->put_AutoSetFocus(This,autoSetFocus);
}
static __WIDL_INLINE HRESULT IUIAutomation2_get_ConnectionTimeout(IUIAutomation2* This,DWORD *timeout) {
    return This->lpVtbl->get_ConnectionTimeout(This,timeout);
}
static __WIDL_INLINE HRESULT IUIAutomation2_put_ConnectionTimeout(IUIAutomation2* This,DWORD timeout) {
    return This->lpVtbl->put_ConnectionTimeout(This,timeout);
}
static __WIDL_INLINE HRESULT IUIAutomation2_get_TransactionTimeout(IUIAutomation2* This,DWORD *timeout) {
    return This->lpVtbl->get_TransactionTimeout(This,timeout);
}
static __WIDL_INLINE HRESULT IUIAutomation2_put_TransactionTimeout(IUIAutomation2* This,DWORD timeout) {
    return This->lpVtbl->put_TransactionTimeout(This,timeout);
}
#endif
#endif

#endif


#endif  /* __IUIAutomation2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomation3 interface
 */
#ifndef __IUIAutomation3_INTERFACE_DEFINED__
#define __IUIAutomation3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomation3, 0x73d768da, 0x9b51, 0x4b89, 0x93,0x6e, 0xc2,0x09,0x29,0x09,0x73,0xe7);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("73d768da-9b51-4b89-936e-c209290973e7")
IUIAutomation3 : public IUIAutomation2
{
    virtual HRESULT STDMETHODCALLTYPE AddTextEditTextChangedEventHandler(
        IUIAutomationElement *element,
        enum TreeScope scope,
        enum TextEditChangeType textEditChangeType,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationTextEditTextChangedEventHandler *handler) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveTextEditTextChangedEventHandler(
        IUIAutomationElement *element,
        IUIAutomationTextEditTextChangedEventHandler *handler) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomation3, 0x73d768da, 0x9b51, 0x4b89, 0x93,0x6e, 0xc2,0x09,0x29,0x09,0x73,0xe7)
#endif
#else
typedef struct IUIAutomation3Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomation methods ***/
    HRESULT (STDMETHODCALLTYPE *CompareElements)(
        IUIAutomation3 *This,
        IUIAutomationElement *el1,
        IUIAutomationElement *el2,
        WINBOOL *areSame);

    HRESULT (STDMETHODCALLTYPE *CompareRuntimeIds)(
        IUIAutomation3 *This,
        SAFEARRAY *runtimeId1,
        SAFEARRAY *runtimeId2,
        WINBOOL *areSame);

    HRESULT (STDMETHODCALLTYPE *GetRootElement)(
        IUIAutomation3 *This,
        IUIAutomationElement **root);

    HRESULT (STDMETHODCALLTYPE *ElementFromHandle)(
        IUIAutomation3 *This,
        UIA_HWND hwnd,
        IUIAutomationElement **element);

    HRESULT (STDMETHODCALLTYPE *ElementFromPoint)(
        IUIAutomation3 *This,
        POINT pt,
        IUIAutomationElement **element);

    HRESULT (STDMETHODCALLTYPE *GetFocusedElement)(
        IUIAutomation3 *This,
        IUIAutomationElement **element);

    HRESULT (STDMETHODCALLTYPE *GetRootElementBuildCache)(
        IUIAutomation3 *This,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **root);

    HRESULT (STDMETHODCALLTYPE *ElementFromHandleBuildCache)(
        IUIAutomation3 *This,
        UIA_HWND hwnd,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **element);

    HRESULT (STDMETHODCALLTYPE *ElementFromPointBuildCache)(
        IUIAutomation3 *This,
        POINT pt,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **element);

    HRESULT (STDMETHODCALLTYPE *GetFocusedElementBuildCache)(
        IUIAutomation3 *This,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **element);

    HRESULT (STDMETHODCALLTYPE *CreateTreeWalker)(
        IUIAutomation3 *This,
        IUIAutomationCondition *pCondition,
        IUIAutomationTreeWalker **walker);

    HRESULT (STDMETHODCALLTYPE *get_ControlViewWalker)(
        IUIAutomation3 *This,
        IUIAutomationTreeWalker **walker);

    HRESULT (STDMETHODCALLTYPE *get_ContentViewWalker)(
        IUIAutomation3 *This,
        IUIAutomationTreeWalker **walker);

    HRESULT (STDMETHODCALLTYPE *get_RawViewWalker)(
        IUIAutomation3 *This,
        IUIAutomationTreeWalker **walker);

    HRESULT (STDMETHODCALLTYPE *get_RawViewCondition)(
        IUIAutomation3 *This,
        IUIAutomationCondition **condition);

    HRESULT (STDMETHODCALLTYPE *get_ControlViewCondition)(
        IUIAutomation3 *This,
        IUIAutomationCondition **condition);

    HRESULT (STDMETHODCALLTYPE *get_ContentViewCondition)(
        IUIAutomation3 *This,
        IUIAutomationCondition **condition);

    HRESULT (STDMETHODCALLTYPE *CreateCacheRequest)(
        IUIAutomation3 *This,
        IUIAutomationCacheRequest **cacheRequest);

    HRESULT (STDMETHODCALLTYPE *CreateTrueCondition)(
        IUIAutomation3 *This,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreateFalseCondition)(
        IUIAutomation3 *This,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreatePropertyCondition)(
        IUIAutomation3 *This,
        PROPERTYID propertyId,
        VARIANT value,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreatePropertyConditionEx)(
        IUIAutomation3 *This,
        PROPERTYID propertyId,
        VARIANT value,
        enum PropertyConditionFlags flags,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreateAndCondition)(
        IUIAutomation3 *This,
        IUIAutomationCondition *condition1,
        IUIAutomationCondition *condition2,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreateAndConditionFromArray)(
        IUIAutomation3 *This,
        SAFEARRAY *conditions,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreateAndConditionFromNativeArray)(
        IUIAutomation3 *This,
        IUIAutomationCondition **conditions,
        int conditionCount,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreateOrCondition)(
        IUIAutomation3 *This,
        IUIAutomationCondition *condition1,
        IUIAutomationCondition *condition2,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreateOrConditionFromArray)(
        IUIAutomation3 *This,
        SAFEARRAY *conditions,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreateOrConditionFromNativeArray)(
        IUIAutomation3 *This,
        IUIAutomationCondition **conditions,
        int conditionCount,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreateNotCondition)(
        IUIAutomation3 *This,
        IUIAutomationCondition *condition,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *AddAutomationEventHandler)(
        IUIAutomation3 *This,
        EVENTID eventId,
        IUIAutomationElement *element,
        enum TreeScope scope,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *RemoveAutomationEventHandler)(
        IUIAutomation3 *This,
        EVENTID eventId,
        IUIAutomationElement *element,
        IUIAutomationEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *AddPropertyChangedEventHandlerNativeArray)(
        IUIAutomation3 *This,
        IUIAutomationElement *element,
        enum TreeScope scope,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationPropertyChangedEventHandler *handler,
        PROPERTYID *propertyArray,
        int propertyCount);

    HRESULT (STDMETHODCALLTYPE *AddPropertyChangedEventHandler)(
        IUIAutomation3 *This,
        IUIAutomationElement *element,
        enum TreeScope scope,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationPropertyChangedEventHandler *handler,
        SAFEARRAY *propertyArray);

    HRESULT (STDMETHODCALLTYPE *RemovePropertyChangedEventHandler)(
        IUIAutomation3 *This,
        IUIAutomationElement *element,
        IUIAutomationPropertyChangedEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *AddStructureChangedEventHandler)(
        IUIAutomation3 *This,
        IUIAutomationElement *element,
        enum TreeScope scope,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationStructureChangedEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *RemoveStructureChangedEventHandler)(
        IUIAutomation3 *This,
        IUIAutomationElement *element,
        IUIAutomationStructureChangedEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *AddFocusChangedEventHandler)(
        IUIAutomation3 *This,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationFocusChangedEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *RemoveFocusChangedEventHandler)(
        IUIAutomation3 *This,
        IUIAutomationFocusChangedEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *RemoveAllEventHandlers)(
        IUIAutomation3 *This);

    HRESULT (STDMETHODCALLTYPE *IntNativeArrayToSafeArray)(
        IUIAutomation3 *This,
        int *array,
        int arrayCount,
        SAFEARRAY **safeArray);

    HRESULT (STDMETHODCALLTYPE *IntSafeArrayToNativeArray)(
        IUIAutomation3 *This,
        SAFEARRAY *intArray,
        int **array,
        int *arrayCount);

    HRESULT (STDMETHODCALLTYPE *RectToVariant)(
        IUIAutomation3 *This,
        RECT rc,
        VARIANT *var);

    HRESULT (STDMETHODCALLTYPE *VariantToRect)(
        IUIAutomation3 *This,
        VARIANT var,
        RECT *rc);

    HRESULT (STDMETHODCALLTYPE *SafeArrayToRectNativeArray)(
        IUIAutomation3 *This,
        SAFEARRAY *rects,
        RECT **rectArray,
        int *rectArrayCount);

    HRESULT (STDMETHODCALLTYPE *CreateProxyFactoryEntry)(
        IUIAutomation3 *This,
        IUIAutomationProxyFactory *factory,
        IUIAutomationProxyFactoryEntry **factoryEntry);

    HRESULT (STDMETHODCALLTYPE *get_ProxyFactoryMapping)(
        IUIAutomation3 *This,
        IUIAutomationProxyFactoryMapping **factoryMapping);

    HRESULT (STDMETHODCALLTYPE *GetPropertyProgrammaticName)(
        IUIAutomation3 *This,
        PROPERTYID property,
        BSTR *name);

    HRESULT (STDMETHODCALLTYPE *GetPatternProgrammaticName)(
        IUIAutomation3 *This,
        PATTERNID pattern,
        BSTR *name);

    HRESULT (STDMETHODCALLTYPE *PollForPotentialSupportedPatterns)(
        IUIAutomation3 *This,
        IUIAutomationElement *pElement,
        SAFEARRAY **patternIds,
        SAFEARRAY **patternNames);

    HRESULT (STDMETHODCALLTYPE *PollForPotentialSupportedProperties)(
        IUIAutomation3 *This,
        IUIAutomationElement *pElement,
        SAFEARRAY **propertyIds,
        SAFEARRAY **propertyNames);

    HRESULT (STDMETHODCALLTYPE *CheckNotSupported)(
        IUIAutomation3 *This,
        VARIANT value,
        WINBOOL *isNotSupported);

    HRESULT (STDMETHODCALLTYPE *get_ReservedNotSupportedValue)(
        IUIAutomation3 *This,
        IUnknown **notSupportedValue);

    HRESULT (STDMETHODCALLTYPE *get_ReservedMixedAttributeValue)(
        IUIAutomation3 *This,
        IUnknown **mixedAttributeValue);

    HRESULT (STDMETHODCALLTYPE *ElementFromIAccessible)(
        IUIAutomation3 *This,
        IAccessible *accessible,
        int childId,
        IUIAutomationElement **element);

    HRESULT (STDMETHODCALLTYPE *ElementFromIAccessibleBuildCache)(
        IUIAutomation3 *This,
        IAccessible *accessible,
        int childId,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **element);

    /*** IUIAutomation2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_AutoSetFocus)(
        IUIAutomation3 *This,
        WINBOOL *autoSetFocus);

    HRESULT (STDMETHODCALLTYPE *put_AutoSetFocus)(
        IUIAutomation3 *This,
        WINBOOL autoSetFocus);

    HRESULT (STDMETHODCALLTYPE *get_ConnectionTimeout)(
        IUIAutomation3 *This,
        DWORD *timeout);

    HRESULT (STDMETHODCALLTYPE *put_ConnectionTimeout)(
        IUIAutomation3 *This,
        DWORD timeout);

    HRESULT (STDMETHODCALLTYPE *get_TransactionTimeout)(
        IUIAutomation3 *This,
        DWORD *timeout);

    HRESULT (STDMETHODCALLTYPE *put_TransactionTimeout)(
        IUIAutomation3 *This,
        DWORD timeout);

    /*** IUIAutomation3 methods ***/
    HRESULT (STDMETHODCALLTYPE *AddTextEditTextChangedEventHandler)(
        IUIAutomation3 *This,
        IUIAutomationElement *element,
        enum TreeScope scope,
        enum TextEditChangeType textEditChangeType,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationTextEditTextChangedEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *RemoveTextEditTextChangedEventHandler)(
        IUIAutomation3 *This,
        IUIAutomationElement *element,
        IUIAutomationTextEditTextChangedEventHandler *handler);

    END_INTERFACE
} IUIAutomation3Vtbl;

interface IUIAutomation3 {
    CONST_VTBL IUIAutomation3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomation3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomation3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomation3_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomation methods ***/
#define IUIAutomation3_CompareElements(This,el1,el2,areSame) (This)->lpVtbl->CompareElements(This,el1,el2,areSame)
#define IUIAutomation3_CompareRuntimeIds(This,runtimeId1,runtimeId2,areSame) (This)->lpVtbl->CompareRuntimeIds(This,runtimeId1,runtimeId2,areSame)
#define IUIAutomation3_GetRootElement(This,root) (This)->lpVtbl->GetRootElement(This,root)
#define IUIAutomation3_ElementFromHandle(This,hwnd,element) (This)->lpVtbl->ElementFromHandle(This,hwnd,element)
#define IUIAutomation3_ElementFromPoint(This,pt,element) (This)->lpVtbl->ElementFromPoint(This,pt,element)
#define IUIAutomation3_GetFocusedElement(This,element) (This)->lpVtbl->GetFocusedElement(This,element)
#define IUIAutomation3_GetRootElementBuildCache(This,cacheRequest,root) (This)->lpVtbl->GetRootElementBuildCache(This,cacheRequest,root)
#define IUIAutomation3_ElementFromHandleBuildCache(This,hwnd,cacheRequest,element) (This)->lpVtbl->ElementFromHandleBuildCache(This,hwnd,cacheRequest,element)
#define IUIAutomation3_ElementFromPointBuildCache(This,pt,cacheRequest,element) (This)->lpVtbl->ElementFromPointBuildCache(This,pt,cacheRequest,element)
#define IUIAutomation3_GetFocusedElementBuildCache(This,cacheRequest,element) (This)->lpVtbl->GetFocusedElementBuildCache(This,cacheRequest,element)
#define IUIAutomation3_CreateTreeWalker(This,pCondition,walker) (This)->lpVtbl->CreateTreeWalker(This,pCondition,walker)
#define IUIAutomation3_get_ControlViewWalker(This,walker) (This)->lpVtbl->get_ControlViewWalker(This,walker)
#define IUIAutomation3_get_ContentViewWalker(This,walker) (This)->lpVtbl->get_ContentViewWalker(This,walker)
#define IUIAutomation3_get_RawViewWalker(This,walker) (This)->lpVtbl->get_RawViewWalker(This,walker)
#define IUIAutomation3_get_RawViewCondition(This,condition) (This)->lpVtbl->get_RawViewCondition(This,condition)
#define IUIAutomation3_get_ControlViewCondition(This,condition) (This)->lpVtbl->get_ControlViewCondition(This,condition)
#define IUIAutomation3_get_ContentViewCondition(This,condition) (This)->lpVtbl->get_ContentViewCondition(This,condition)
#define IUIAutomation3_CreateCacheRequest(This,cacheRequest) (This)->lpVtbl->CreateCacheRequest(This,cacheRequest)
#define IUIAutomation3_CreateTrueCondition(This,newCondition) (This)->lpVtbl->CreateTrueCondition(This,newCondition)
#define IUIAutomation3_CreateFalseCondition(This,newCondition) (This)->lpVtbl->CreateFalseCondition(This,newCondition)
#define IUIAutomation3_CreatePropertyCondition(This,propertyId,value,newCondition) (This)->lpVtbl->CreatePropertyCondition(This,propertyId,value,newCondition)
#define IUIAutomation3_CreatePropertyConditionEx(This,propertyId,value,flags,newCondition) (This)->lpVtbl->CreatePropertyConditionEx(This,propertyId,value,flags,newCondition)
#define IUIAutomation3_CreateAndCondition(This,condition1,condition2,newCondition) (This)->lpVtbl->CreateAndCondition(This,condition1,condition2,newCondition)
#define IUIAutomation3_CreateAndConditionFromArray(This,conditions,newCondition) (This)->lpVtbl->CreateAndConditionFromArray(This,conditions,newCondition)
#define IUIAutomation3_CreateAndConditionFromNativeArray(This,conditions,conditionCount,newCondition) (This)->lpVtbl->CreateAndConditionFromNativeArray(This,conditions,conditionCount,newCondition)
#define IUIAutomation3_CreateOrCondition(This,condition1,condition2,newCondition) (This)->lpVtbl->CreateOrCondition(This,condition1,condition2,newCondition)
#define IUIAutomation3_CreateOrConditionFromArray(This,conditions,newCondition) (This)->lpVtbl->CreateOrConditionFromArray(This,conditions,newCondition)
#define IUIAutomation3_CreateOrConditionFromNativeArray(This,conditions,conditionCount,newCondition) (This)->lpVtbl->CreateOrConditionFromNativeArray(This,conditions,conditionCount,newCondition)
#define IUIAutomation3_CreateNotCondition(This,condition,newCondition) (This)->lpVtbl->CreateNotCondition(This,condition,newCondition)
#define IUIAutomation3_AddAutomationEventHandler(This,eventId,element,scope,cacheRequest,handler) (This)->lpVtbl->AddAutomationEventHandler(This,eventId,element,scope,cacheRequest,handler)
#define IUIAutomation3_RemoveAutomationEventHandler(This,eventId,element,handler) (This)->lpVtbl->RemoveAutomationEventHandler(This,eventId,element,handler)
#define IUIAutomation3_AddPropertyChangedEventHandlerNativeArray(This,element,scope,cacheRequest,handler,propertyArray,propertyCount) (This)->lpVtbl->AddPropertyChangedEventHandlerNativeArray(This,element,scope,cacheRequest,handler,propertyArray,propertyCount)
#define IUIAutomation3_AddPropertyChangedEventHandler(This,element,scope,cacheRequest,handler,propertyArray) (This)->lpVtbl->AddPropertyChangedEventHandler(This,element,scope,cacheRequest,handler,propertyArray)
#define IUIAutomation3_RemovePropertyChangedEventHandler(This,element,handler) (This)->lpVtbl->RemovePropertyChangedEventHandler(This,element,handler)
#define IUIAutomation3_AddStructureChangedEventHandler(This,element,scope,cacheRequest,handler) (This)->lpVtbl->AddStructureChangedEventHandler(This,element,scope,cacheRequest,handler)
#define IUIAutomation3_RemoveStructureChangedEventHandler(This,element,handler) (This)->lpVtbl->RemoveStructureChangedEventHandler(This,element,handler)
#define IUIAutomation3_AddFocusChangedEventHandler(This,cacheRequest,handler) (This)->lpVtbl->AddFocusChangedEventHandler(This,cacheRequest,handler)
#define IUIAutomation3_RemoveFocusChangedEventHandler(This,handler) (This)->lpVtbl->RemoveFocusChangedEventHandler(This,handler)
#define IUIAutomation3_RemoveAllEventHandlers(This) (This)->lpVtbl->RemoveAllEventHandlers(This)
#define IUIAutomation3_IntNativeArrayToSafeArray(This,array,arrayCount,safeArray) (This)->lpVtbl->IntNativeArrayToSafeArray(This,array,arrayCount,safeArray)
#define IUIAutomation3_IntSafeArrayToNativeArray(This,intArray,array,arrayCount) (This)->lpVtbl->IntSafeArrayToNativeArray(This,intArray,array,arrayCount)
#define IUIAutomation3_RectToVariant(This,rc,var) (This)->lpVtbl->RectToVariant(This,rc,var)
#define IUIAutomation3_VariantToRect(This,var,rc) (This)->lpVtbl->VariantToRect(This,var,rc)
#define IUIAutomation3_SafeArrayToRectNativeArray(This,rects,rectArray,rectArrayCount) (This)->lpVtbl->SafeArrayToRectNativeArray(This,rects,rectArray,rectArrayCount)
#define IUIAutomation3_CreateProxyFactoryEntry(This,factory,factoryEntry) (This)->lpVtbl->CreateProxyFactoryEntry(This,factory,factoryEntry)
#define IUIAutomation3_get_ProxyFactoryMapping(This,factoryMapping) (This)->lpVtbl->get_ProxyFactoryMapping(This,factoryMapping)
#define IUIAutomation3_GetPropertyProgrammaticName(This,property,name) (This)->lpVtbl->GetPropertyProgrammaticName(This,property,name)
#define IUIAutomation3_GetPatternProgrammaticName(This,pattern,name) (This)->lpVtbl->GetPatternProgrammaticName(This,pattern,name)
#define IUIAutomation3_PollForPotentialSupportedPatterns(This,pElement,patternIds,patternNames) (This)->lpVtbl->PollForPotentialSupportedPatterns(This,pElement,patternIds,patternNames)
#define IUIAutomation3_PollForPotentialSupportedProperties(This,pElement,propertyIds,propertyNames) (This)->lpVtbl->PollForPotentialSupportedProperties(This,pElement,propertyIds,propertyNames)
#define IUIAutomation3_CheckNotSupported(This,value,isNotSupported) (This)->lpVtbl->CheckNotSupported(This,value,isNotSupported)
#define IUIAutomation3_get_ReservedNotSupportedValue(This,notSupportedValue) (This)->lpVtbl->get_ReservedNotSupportedValue(This,notSupportedValue)
#define IUIAutomation3_get_ReservedMixedAttributeValue(This,mixedAttributeValue) (This)->lpVtbl->get_ReservedMixedAttributeValue(This,mixedAttributeValue)
#define IUIAutomation3_ElementFromIAccessible(This,accessible,childId,element) (This)->lpVtbl->ElementFromIAccessible(This,accessible,childId,element)
#define IUIAutomation3_ElementFromIAccessibleBuildCache(This,accessible,childId,cacheRequest,element) (This)->lpVtbl->ElementFromIAccessibleBuildCache(This,accessible,childId,cacheRequest,element)
/*** IUIAutomation2 methods ***/
#define IUIAutomation3_get_AutoSetFocus(This,autoSetFocus) (This)->lpVtbl->get_AutoSetFocus(This,autoSetFocus)
#define IUIAutomation3_put_AutoSetFocus(This,autoSetFocus) (This)->lpVtbl->put_AutoSetFocus(This,autoSetFocus)
#define IUIAutomation3_get_ConnectionTimeout(This,timeout) (This)->lpVtbl->get_ConnectionTimeout(This,timeout)
#define IUIAutomation3_put_ConnectionTimeout(This,timeout) (This)->lpVtbl->put_ConnectionTimeout(This,timeout)
#define IUIAutomation3_get_TransactionTimeout(This,timeout) (This)->lpVtbl->get_TransactionTimeout(This,timeout)
#define IUIAutomation3_put_TransactionTimeout(This,timeout) (This)->lpVtbl->put_TransactionTimeout(This,timeout)
/*** IUIAutomation3 methods ***/
#define IUIAutomation3_AddTextEditTextChangedEventHandler(This,element,scope,textEditChangeType,cacheRequest,handler) (This)->lpVtbl->AddTextEditTextChangedEventHandler(This,element,scope,textEditChangeType,cacheRequest,handler)
#define IUIAutomation3_RemoveTextEditTextChangedEventHandler(This,element,handler) (This)->lpVtbl->RemoveTextEditTextChangedEventHandler(This,element,handler)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomation3_QueryInterface(IUIAutomation3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomation3_AddRef(IUIAutomation3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomation3_Release(IUIAutomation3* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomation methods ***/
static __WIDL_INLINE HRESULT IUIAutomation3_CompareElements(IUIAutomation3* This,IUIAutomationElement *el1,IUIAutomationElement *el2,WINBOOL *areSame) {
    return This->lpVtbl->CompareElements(This,el1,el2,areSame);
}
static __WIDL_INLINE HRESULT IUIAutomation3_CompareRuntimeIds(IUIAutomation3* This,SAFEARRAY *runtimeId1,SAFEARRAY *runtimeId2,WINBOOL *areSame) {
    return This->lpVtbl->CompareRuntimeIds(This,runtimeId1,runtimeId2,areSame);
}
static __WIDL_INLINE HRESULT IUIAutomation3_GetRootElement(IUIAutomation3* This,IUIAutomationElement **root) {
    return This->lpVtbl->GetRootElement(This,root);
}
static __WIDL_INLINE HRESULT IUIAutomation3_ElementFromHandle(IUIAutomation3* This,UIA_HWND hwnd,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromHandle(This,hwnd,element);
}
static __WIDL_INLINE HRESULT IUIAutomation3_ElementFromPoint(IUIAutomation3* This,POINT pt,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromPoint(This,pt,element);
}
static __WIDL_INLINE HRESULT IUIAutomation3_GetFocusedElement(IUIAutomation3* This,IUIAutomationElement **element) {
    return This->lpVtbl->GetFocusedElement(This,element);
}
static __WIDL_INLINE HRESULT IUIAutomation3_GetRootElementBuildCache(IUIAutomation3* This,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **root) {
    return This->lpVtbl->GetRootElementBuildCache(This,cacheRequest,root);
}
static __WIDL_INLINE HRESULT IUIAutomation3_ElementFromHandleBuildCache(IUIAutomation3* This,UIA_HWND hwnd,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromHandleBuildCache(This,hwnd,cacheRequest,element);
}
static __WIDL_INLINE HRESULT IUIAutomation3_ElementFromPointBuildCache(IUIAutomation3* This,POINT pt,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromPointBuildCache(This,pt,cacheRequest,element);
}
static __WIDL_INLINE HRESULT IUIAutomation3_GetFocusedElementBuildCache(IUIAutomation3* This,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **element) {
    return This->lpVtbl->GetFocusedElementBuildCache(This,cacheRequest,element);
}
static __WIDL_INLINE HRESULT IUIAutomation3_CreateTreeWalker(IUIAutomation3* This,IUIAutomationCondition *pCondition,IUIAutomationTreeWalker **walker) {
    return This->lpVtbl->CreateTreeWalker(This,pCondition,walker);
}
static __WIDL_INLINE HRESULT IUIAutomation3_get_ControlViewWalker(IUIAutomation3* This,IUIAutomationTreeWalker **walker) {
    return This->lpVtbl->get_ControlViewWalker(This,walker);
}
static __WIDL_INLINE HRESULT IUIAutomation3_get_ContentViewWalker(IUIAutomation3* This,IUIAutomationTreeWalker **walker) {
    return This->lpVtbl->get_ContentViewWalker(This,walker);
}
static __WIDL_INLINE HRESULT IUIAutomation3_get_RawViewWalker(IUIAutomation3* This,IUIAutomationTreeWalker **walker) {
    return This->lpVtbl->get_RawViewWalker(This,walker);
}
static __WIDL_INLINE HRESULT IUIAutomation3_get_RawViewCondition(IUIAutomation3* This,IUIAutomationCondition **condition) {
    return This->lpVtbl->get_RawViewCondition(This,condition);
}
static __WIDL_INLINE HRESULT IUIAutomation3_get_ControlViewCondition(IUIAutomation3* This,IUIAutomationCondition **condition) {
    return This->lpVtbl->get_ControlViewCondition(This,condition);
}
static __WIDL_INLINE HRESULT IUIAutomation3_get_ContentViewCondition(IUIAutomation3* This,IUIAutomationCondition **condition) {
    return This->lpVtbl->get_ContentViewCondition(This,condition);
}
static __WIDL_INLINE HRESULT IUIAutomation3_CreateCacheRequest(IUIAutomation3* This,IUIAutomationCacheRequest **cacheRequest) {
    return This->lpVtbl->CreateCacheRequest(This,cacheRequest);
}
static __WIDL_INLINE HRESULT IUIAutomation3_CreateTrueCondition(IUIAutomation3* This,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateTrueCondition(This,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation3_CreateFalseCondition(IUIAutomation3* This,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateFalseCondition(This,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation3_CreatePropertyCondition(IUIAutomation3* This,PROPERTYID propertyId,VARIANT value,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreatePropertyCondition(This,propertyId,value,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation3_CreatePropertyConditionEx(IUIAutomation3* This,PROPERTYID propertyId,VARIANT value,enum PropertyConditionFlags flags,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreatePropertyConditionEx(This,propertyId,value,flags,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation3_CreateAndCondition(IUIAutomation3* This,IUIAutomationCondition *condition1,IUIAutomationCondition *condition2,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateAndCondition(This,condition1,condition2,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation3_CreateAndConditionFromArray(IUIAutomation3* This,SAFEARRAY *conditions,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateAndConditionFromArray(This,conditions,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation3_CreateAndConditionFromNativeArray(IUIAutomation3* This,IUIAutomationCondition **conditions,int conditionCount,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateAndConditionFromNativeArray(This,conditions,conditionCount,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation3_CreateOrCondition(IUIAutomation3* This,IUIAutomationCondition *condition1,IUIAutomationCondition *condition2,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateOrCondition(This,condition1,condition2,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation3_CreateOrConditionFromArray(IUIAutomation3* This,SAFEARRAY *conditions,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateOrConditionFromArray(This,conditions,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation3_CreateOrConditionFromNativeArray(IUIAutomation3* This,IUIAutomationCondition **conditions,int conditionCount,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateOrConditionFromNativeArray(This,conditions,conditionCount,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation3_CreateNotCondition(IUIAutomation3* This,IUIAutomationCondition *condition,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateNotCondition(This,condition,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation3_AddAutomationEventHandler(IUIAutomation3* This,EVENTID eventId,IUIAutomationElement *element,enum TreeScope scope,IUIAutomationCacheRequest *cacheRequest,IUIAutomationEventHandler *handler) {
    return This->lpVtbl->AddAutomationEventHandler(This,eventId,element,scope,cacheRequest,handler);
}
static __WIDL_INLINE HRESULT IUIAutomation3_RemoveAutomationEventHandler(IUIAutomation3* This,EVENTID eventId,IUIAutomationElement *element,IUIAutomationEventHandler *handler) {
    return This->lpVtbl->RemoveAutomationEventHandler(This,eventId,element,handler);
}
static __WIDL_INLINE HRESULT IUIAutomation3_AddPropertyChangedEventHandlerNativeArray(IUIAutomation3* This,IUIAutomationElement *element,enum TreeScope scope,IUIAutomationCacheRequest *cacheRequest,IUIAutomationPropertyChangedEventHandler *handler,PROPERTYID *propertyArray,int propertyCount) {
    return This->lpVtbl->AddPropertyChangedEventHandlerNativeArray(This,element,scope,cacheRequest,handler,propertyArray,propertyCount);
}
static __WIDL_INLINE HRESULT IUIAutomation3_AddPropertyChangedEventHandler(IUIAutomation3* This,IUIAutomationElement *element,enum TreeScope scope,IUIAutomationCacheRequest *cacheRequest,IUIAutomationPropertyChangedEventHandler *handler,SAFEARRAY *propertyArray) {
    return This->lpVtbl->AddPropertyChangedEventHandler(This,element,scope,cacheRequest,handler,propertyArray);
}
static __WIDL_INLINE HRESULT IUIAutomation3_RemovePropertyChangedEventHandler(IUIAutomation3* This,IUIAutomationElement *element,IUIAutomationPropertyChangedEventHandler *handler) {
    return This->lpVtbl->RemovePropertyChangedEventHandler(This,element,handler);
}
static __WIDL_INLINE HRESULT IUIAutomation3_AddStructureChangedEventHandler(IUIAutomation3* This,IUIAutomationElement *element,enum TreeScope scope,IUIAutomationCacheRequest *cacheRequest,IUIAutomationStructureChangedEventHandler *handler) {
    return This->lpVtbl->AddStructureChangedEventHandler(This,element,scope,cacheRequest,handler);
}
static __WIDL_INLINE HRESULT IUIAutomation3_RemoveStructureChangedEventHandler(IUIAutomation3* This,IUIAutomationElement *element,IUIAutomationStructureChangedEventHandler *handler) {
    return This->lpVtbl->RemoveStructureChangedEventHandler(This,element,handler);
}
static __WIDL_INLINE HRESULT IUIAutomation3_AddFocusChangedEventHandler(IUIAutomation3* This,IUIAutomationCacheRequest *cacheRequest,IUIAutomationFocusChangedEventHandler *handler) {
    return This->lpVtbl->AddFocusChangedEventHandler(This,cacheRequest,handler);
}
static __WIDL_INLINE HRESULT IUIAutomation3_RemoveFocusChangedEventHandler(IUIAutomation3* This,IUIAutomationFocusChangedEventHandler *handler) {
    return This->lpVtbl->RemoveFocusChangedEventHandler(This,handler);
}
static __WIDL_INLINE HRESULT IUIAutomation3_RemoveAllEventHandlers(IUIAutomation3* This) {
    return This->lpVtbl->RemoveAllEventHandlers(This);
}
static __WIDL_INLINE HRESULT IUIAutomation3_IntNativeArrayToSafeArray(IUIAutomation3* This,int *array,int arrayCount,SAFEARRAY **safeArray) {
    return This->lpVtbl->IntNativeArrayToSafeArray(This,array,arrayCount,safeArray);
}
static __WIDL_INLINE HRESULT IUIAutomation3_IntSafeArrayToNativeArray(IUIAutomation3* This,SAFEARRAY *intArray,int **array,int *arrayCount) {
    return This->lpVtbl->IntSafeArrayToNativeArray(This,intArray,array,arrayCount);
}
static __WIDL_INLINE HRESULT IUIAutomation3_RectToVariant(IUIAutomation3* This,RECT rc,VARIANT *var) {
    return This->lpVtbl->RectToVariant(This,rc,var);
}
static __WIDL_INLINE HRESULT IUIAutomation3_VariantToRect(IUIAutomation3* This,VARIANT var,RECT *rc) {
    return This->lpVtbl->VariantToRect(This,var,rc);
}
static __WIDL_INLINE HRESULT IUIAutomation3_SafeArrayToRectNativeArray(IUIAutomation3* This,SAFEARRAY *rects,RECT **rectArray,int *rectArrayCount) {
    return This->lpVtbl->SafeArrayToRectNativeArray(This,rects,rectArray,rectArrayCount);
}
static __WIDL_INLINE HRESULT IUIAutomation3_CreateProxyFactoryEntry(IUIAutomation3* This,IUIAutomationProxyFactory *factory,IUIAutomationProxyFactoryEntry **factoryEntry) {
    return This->lpVtbl->CreateProxyFactoryEntry(This,factory,factoryEntry);
}
static __WIDL_INLINE HRESULT IUIAutomation3_get_ProxyFactoryMapping(IUIAutomation3* This,IUIAutomationProxyFactoryMapping **factoryMapping) {
    return This->lpVtbl->get_ProxyFactoryMapping(This,factoryMapping);
}
static __WIDL_INLINE HRESULT IUIAutomation3_GetPropertyProgrammaticName(IUIAutomation3* This,PROPERTYID property,BSTR *name) {
    return This->lpVtbl->GetPropertyProgrammaticName(This,property,name);
}
static __WIDL_INLINE HRESULT IUIAutomation3_GetPatternProgrammaticName(IUIAutomation3* This,PATTERNID pattern,BSTR *name) {
    return This->lpVtbl->GetPatternProgrammaticName(This,pattern,name);
}
static __WIDL_INLINE HRESULT IUIAutomation3_PollForPotentialSupportedPatterns(IUIAutomation3* This,IUIAutomationElement *pElement,SAFEARRAY **patternIds,SAFEARRAY **patternNames) {
    return This->lpVtbl->PollForPotentialSupportedPatterns(This,pElement,patternIds,patternNames);
}
static __WIDL_INLINE HRESULT IUIAutomation3_PollForPotentialSupportedProperties(IUIAutomation3* This,IUIAutomationElement *pElement,SAFEARRAY **propertyIds,SAFEARRAY **propertyNames) {
    return This->lpVtbl->PollForPotentialSupportedProperties(This,pElement,propertyIds,propertyNames);
}
static __WIDL_INLINE HRESULT IUIAutomation3_CheckNotSupported(IUIAutomation3* This,VARIANT value,WINBOOL *isNotSupported) {
    return This->lpVtbl->CheckNotSupported(This,value,isNotSupported);
}
static __WIDL_INLINE HRESULT IUIAutomation3_get_ReservedNotSupportedValue(IUIAutomation3* This,IUnknown **notSupportedValue) {
    return This->lpVtbl->get_ReservedNotSupportedValue(This,notSupportedValue);
}
static __WIDL_INLINE HRESULT IUIAutomation3_get_ReservedMixedAttributeValue(IUIAutomation3* This,IUnknown **mixedAttributeValue) {
    return This->lpVtbl->get_ReservedMixedAttributeValue(This,mixedAttributeValue);
}
static __WIDL_INLINE HRESULT IUIAutomation3_ElementFromIAccessible(IUIAutomation3* This,IAccessible *accessible,int childId,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromIAccessible(This,accessible,childId,element);
}
static __WIDL_INLINE HRESULT IUIAutomation3_ElementFromIAccessibleBuildCache(IUIAutomation3* This,IAccessible *accessible,int childId,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromIAccessibleBuildCache(This,accessible,childId,cacheRequest,element);
}
/*** IUIAutomation2 methods ***/
static __WIDL_INLINE HRESULT IUIAutomation3_get_AutoSetFocus(IUIAutomation3* This,WINBOOL *autoSetFocus) {
    return This->lpVtbl->get_AutoSetFocus(This,autoSetFocus);
}
static __WIDL_INLINE HRESULT IUIAutomation3_put_AutoSetFocus(IUIAutomation3* This,WINBOOL autoSetFocus) {
    return This->lpVtbl->put_AutoSetFocus(This,autoSetFocus);
}
static __WIDL_INLINE HRESULT IUIAutomation3_get_ConnectionTimeout(IUIAutomation3* This,DWORD *timeout) {
    return This->lpVtbl->get_ConnectionTimeout(This,timeout);
}
static __WIDL_INLINE HRESULT IUIAutomation3_put_ConnectionTimeout(IUIAutomation3* This,DWORD timeout) {
    return This->lpVtbl->put_ConnectionTimeout(This,timeout);
}
static __WIDL_INLINE HRESULT IUIAutomation3_get_TransactionTimeout(IUIAutomation3* This,DWORD *timeout) {
    return This->lpVtbl->get_TransactionTimeout(This,timeout);
}
static __WIDL_INLINE HRESULT IUIAutomation3_put_TransactionTimeout(IUIAutomation3* This,DWORD timeout) {
    return This->lpVtbl->put_TransactionTimeout(This,timeout);
}
/*** IUIAutomation3 methods ***/
static __WIDL_INLINE HRESULT IUIAutomation3_AddTextEditTextChangedEventHandler(IUIAutomation3* This,IUIAutomationElement *element,enum TreeScope scope,enum TextEditChangeType textEditChangeType,IUIAutomationCacheRequest *cacheRequest,IUIAutomationTextEditTextChangedEventHandler *handler) {
    return This->lpVtbl->AddTextEditTextChangedEventHandler(This,element,scope,textEditChangeType,cacheRequest,handler);
}
static __WIDL_INLINE HRESULT IUIAutomation3_RemoveTextEditTextChangedEventHandler(IUIAutomation3* This,IUIAutomationElement *element,IUIAutomationTextEditTextChangedEventHandler *handler) {
    return This->lpVtbl->RemoveTextEditTextChangedEventHandler(This,element,handler);
}
#endif
#endif

#endif


#endif  /* __IUIAutomation3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomation4 interface
 */
#ifndef __IUIAutomation4_INTERFACE_DEFINED__
#define __IUIAutomation4_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomation4, 0x1189c02a, 0x05f8, 0x4319, 0x8e,0x21, 0xe8,0x17,0xe3,0xdb,0x28,0x60);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("1189c02a-05f8-4319-8e21-e817e3db2860")
IUIAutomation4 : public IUIAutomation3
{
    virtual HRESULT STDMETHODCALLTYPE AddChangesEventHandler(
        IUIAutomationElement *element,
        enum TreeScope scope,
        int *changeTypes,
        int changesCount,
        IUIAutomationCacheRequest *pCacheRequest,
        IUIAutomationChangesEventHandler *handler) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveChangesEventHandler(
        IUIAutomationElement *element,
        IUIAutomationChangesEventHandler *handler) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomation4, 0x1189c02a, 0x05f8, 0x4319, 0x8e,0x21, 0xe8,0x17,0xe3,0xdb,0x28,0x60)
#endif
#else
typedef struct IUIAutomation4Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomation methods ***/
    HRESULT (STDMETHODCALLTYPE *CompareElements)(
        IUIAutomation4 *This,
        IUIAutomationElement *el1,
        IUIAutomationElement *el2,
        WINBOOL *areSame);

    HRESULT (STDMETHODCALLTYPE *CompareRuntimeIds)(
        IUIAutomation4 *This,
        SAFEARRAY *runtimeId1,
        SAFEARRAY *runtimeId2,
        WINBOOL *areSame);

    HRESULT (STDMETHODCALLTYPE *GetRootElement)(
        IUIAutomation4 *This,
        IUIAutomationElement **root);

    HRESULT (STDMETHODCALLTYPE *ElementFromHandle)(
        IUIAutomation4 *This,
        UIA_HWND hwnd,
        IUIAutomationElement **element);

    HRESULT (STDMETHODCALLTYPE *ElementFromPoint)(
        IUIAutomation4 *This,
        POINT pt,
        IUIAutomationElement **element);

    HRESULT (STDMETHODCALLTYPE *GetFocusedElement)(
        IUIAutomation4 *This,
        IUIAutomationElement **element);

    HRESULT (STDMETHODCALLTYPE *GetRootElementBuildCache)(
        IUIAutomation4 *This,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **root);

    HRESULT (STDMETHODCALLTYPE *ElementFromHandleBuildCache)(
        IUIAutomation4 *This,
        UIA_HWND hwnd,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **element);

    HRESULT (STDMETHODCALLTYPE *ElementFromPointBuildCache)(
        IUIAutomation4 *This,
        POINT pt,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **element);

    HRESULT (STDMETHODCALLTYPE *GetFocusedElementBuildCache)(
        IUIAutomation4 *This,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **element);

    HRESULT (STDMETHODCALLTYPE *CreateTreeWalker)(
        IUIAutomation4 *This,
        IUIAutomationCondition *pCondition,
        IUIAutomationTreeWalker **walker);

    HRESULT (STDMETHODCALLTYPE *get_ControlViewWalker)(
        IUIAutomation4 *This,
        IUIAutomationTreeWalker **walker);

    HRESULT (STDMETHODCALLTYPE *get_ContentViewWalker)(
        IUIAutomation4 *This,
        IUIAutomationTreeWalker **walker);

    HRESULT (STDMETHODCALLTYPE *get_RawViewWalker)(
        IUIAutomation4 *This,
        IUIAutomationTreeWalker **walker);

    HRESULT (STDMETHODCALLTYPE *get_RawViewCondition)(
        IUIAutomation4 *This,
        IUIAutomationCondition **condition);

    HRESULT (STDMETHODCALLTYPE *get_ControlViewCondition)(
        IUIAutomation4 *This,
        IUIAutomationCondition **condition);

    HRESULT (STDMETHODCALLTYPE *get_ContentViewCondition)(
        IUIAutomation4 *This,
        IUIAutomationCondition **condition);

    HRESULT (STDMETHODCALLTYPE *CreateCacheRequest)(
        IUIAutomation4 *This,
        IUIAutomationCacheRequest **cacheRequest);

    HRESULT (STDMETHODCALLTYPE *CreateTrueCondition)(
        IUIAutomation4 *This,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreateFalseCondition)(
        IUIAutomation4 *This,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreatePropertyCondition)(
        IUIAutomation4 *This,
        PROPERTYID propertyId,
        VARIANT value,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreatePropertyConditionEx)(
        IUIAutomation4 *This,
        PROPERTYID propertyId,
        VARIANT value,
        enum PropertyConditionFlags flags,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreateAndCondition)(
        IUIAutomation4 *This,
        IUIAutomationCondition *condition1,
        IUIAutomationCondition *condition2,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreateAndConditionFromArray)(
        IUIAutomation4 *This,
        SAFEARRAY *conditions,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreateAndConditionFromNativeArray)(
        IUIAutomation4 *This,
        IUIAutomationCondition **conditions,
        int conditionCount,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreateOrCondition)(
        IUIAutomation4 *This,
        IUIAutomationCondition *condition1,
        IUIAutomationCondition *condition2,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreateOrConditionFromArray)(
        IUIAutomation4 *This,
        SAFEARRAY *conditions,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreateOrConditionFromNativeArray)(
        IUIAutomation4 *This,
        IUIAutomationCondition **conditions,
        int conditionCount,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreateNotCondition)(
        IUIAutomation4 *This,
        IUIAutomationCondition *condition,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *AddAutomationEventHandler)(
        IUIAutomation4 *This,
        EVENTID eventId,
        IUIAutomationElement *element,
        enum TreeScope scope,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *RemoveAutomationEventHandler)(
        IUIAutomation4 *This,
        EVENTID eventId,
        IUIAutomationElement *element,
        IUIAutomationEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *AddPropertyChangedEventHandlerNativeArray)(
        IUIAutomation4 *This,
        IUIAutomationElement *element,
        enum TreeScope scope,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationPropertyChangedEventHandler *handler,
        PROPERTYID *propertyArray,
        int propertyCount);

    HRESULT (STDMETHODCALLTYPE *AddPropertyChangedEventHandler)(
        IUIAutomation4 *This,
        IUIAutomationElement *element,
        enum TreeScope scope,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationPropertyChangedEventHandler *handler,
        SAFEARRAY *propertyArray);

    HRESULT (STDMETHODCALLTYPE *RemovePropertyChangedEventHandler)(
        IUIAutomation4 *This,
        IUIAutomationElement *element,
        IUIAutomationPropertyChangedEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *AddStructureChangedEventHandler)(
        IUIAutomation4 *This,
        IUIAutomationElement *element,
        enum TreeScope scope,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationStructureChangedEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *RemoveStructureChangedEventHandler)(
        IUIAutomation4 *This,
        IUIAutomationElement *element,
        IUIAutomationStructureChangedEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *AddFocusChangedEventHandler)(
        IUIAutomation4 *This,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationFocusChangedEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *RemoveFocusChangedEventHandler)(
        IUIAutomation4 *This,
        IUIAutomationFocusChangedEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *RemoveAllEventHandlers)(
        IUIAutomation4 *This);

    HRESULT (STDMETHODCALLTYPE *IntNativeArrayToSafeArray)(
        IUIAutomation4 *This,
        int *array,
        int arrayCount,
        SAFEARRAY **safeArray);

    HRESULT (STDMETHODCALLTYPE *IntSafeArrayToNativeArray)(
        IUIAutomation4 *This,
        SAFEARRAY *intArray,
        int **array,
        int *arrayCount);

    HRESULT (STDMETHODCALLTYPE *RectToVariant)(
        IUIAutomation4 *This,
        RECT rc,
        VARIANT *var);

    HRESULT (STDMETHODCALLTYPE *VariantToRect)(
        IUIAutomation4 *This,
        VARIANT var,
        RECT *rc);

    HRESULT (STDMETHODCALLTYPE *SafeArrayToRectNativeArray)(
        IUIAutomation4 *This,
        SAFEARRAY *rects,
        RECT **rectArray,
        int *rectArrayCount);

    HRESULT (STDMETHODCALLTYPE *CreateProxyFactoryEntry)(
        IUIAutomation4 *This,
        IUIAutomationProxyFactory *factory,
        IUIAutomationProxyFactoryEntry **factoryEntry);

    HRESULT (STDMETHODCALLTYPE *get_ProxyFactoryMapping)(
        IUIAutomation4 *This,
        IUIAutomationProxyFactoryMapping **factoryMapping);

    HRESULT (STDMETHODCALLTYPE *GetPropertyProgrammaticName)(
        IUIAutomation4 *This,
        PROPERTYID property,
        BSTR *name);

    HRESULT (STDMETHODCALLTYPE *GetPatternProgrammaticName)(
        IUIAutomation4 *This,
        PATTERNID pattern,
        BSTR *name);

    HRESULT (STDMETHODCALLTYPE *PollForPotentialSupportedPatterns)(
        IUIAutomation4 *This,
        IUIAutomationElement *pElement,
        SAFEARRAY **patternIds,
        SAFEARRAY **patternNames);

    HRESULT (STDMETHODCALLTYPE *PollForPotentialSupportedProperties)(
        IUIAutomation4 *This,
        IUIAutomationElement *pElement,
        SAFEARRAY **propertyIds,
        SAFEARRAY **propertyNames);

    HRESULT (STDMETHODCALLTYPE *CheckNotSupported)(
        IUIAutomation4 *This,
        VARIANT value,
        WINBOOL *isNotSupported);

    HRESULT (STDMETHODCALLTYPE *get_ReservedNotSupportedValue)(
        IUIAutomation4 *This,
        IUnknown **notSupportedValue);

    HRESULT (STDMETHODCALLTYPE *get_ReservedMixedAttributeValue)(
        IUIAutomation4 *This,
        IUnknown **mixedAttributeValue);

    HRESULT (STDMETHODCALLTYPE *ElementFromIAccessible)(
        IUIAutomation4 *This,
        IAccessible *accessible,
        int childId,
        IUIAutomationElement **element);

    HRESULT (STDMETHODCALLTYPE *ElementFromIAccessibleBuildCache)(
        IUIAutomation4 *This,
        IAccessible *accessible,
        int childId,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **element);

    /*** IUIAutomation2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_AutoSetFocus)(
        IUIAutomation4 *This,
        WINBOOL *autoSetFocus);

    HRESULT (STDMETHODCALLTYPE *put_AutoSetFocus)(
        IUIAutomation4 *This,
        WINBOOL autoSetFocus);

    HRESULT (STDMETHODCALLTYPE *get_ConnectionTimeout)(
        IUIAutomation4 *This,
        DWORD *timeout);

    HRESULT (STDMETHODCALLTYPE *put_ConnectionTimeout)(
        IUIAutomation4 *This,
        DWORD timeout);

    HRESULT (STDMETHODCALLTYPE *get_TransactionTimeout)(
        IUIAutomation4 *This,
        DWORD *timeout);

    HRESULT (STDMETHODCALLTYPE *put_TransactionTimeout)(
        IUIAutomation4 *This,
        DWORD timeout);

    /*** IUIAutomation3 methods ***/
    HRESULT (STDMETHODCALLTYPE *AddTextEditTextChangedEventHandler)(
        IUIAutomation4 *This,
        IUIAutomationElement *element,
        enum TreeScope scope,
        enum TextEditChangeType textEditChangeType,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationTextEditTextChangedEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *RemoveTextEditTextChangedEventHandler)(
        IUIAutomation4 *This,
        IUIAutomationElement *element,
        IUIAutomationTextEditTextChangedEventHandler *handler);

    /*** IUIAutomation4 methods ***/
    HRESULT (STDMETHODCALLTYPE *AddChangesEventHandler)(
        IUIAutomation4 *This,
        IUIAutomationElement *element,
        enum TreeScope scope,
        int *changeTypes,
        int changesCount,
        IUIAutomationCacheRequest *pCacheRequest,
        IUIAutomationChangesEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *RemoveChangesEventHandler)(
        IUIAutomation4 *This,
        IUIAutomationElement *element,
        IUIAutomationChangesEventHandler *handler);

    END_INTERFACE
} IUIAutomation4Vtbl;

interface IUIAutomation4 {
    CONST_VTBL IUIAutomation4Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomation4_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomation4_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomation4_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomation methods ***/
#define IUIAutomation4_CompareElements(This,el1,el2,areSame) (This)->lpVtbl->CompareElements(This,el1,el2,areSame)
#define IUIAutomation4_CompareRuntimeIds(This,runtimeId1,runtimeId2,areSame) (This)->lpVtbl->CompareRuntimeIds(This,runtimeId1,runtimeId2,areSame)
#define IUIAutomation4_GetRootElement(This,root) (This)->lpVtbl->GetRootElement(This,root)
#define IUIAutomation4_ElementFromHandle(This,hwnd,element) (This)->lpVtbl->ElementFromHandle(This,hwnd,element)
#define IUIAutomation4_ElementFromPoint(This,pt,element) (This)->lpVtbl->ElementFromPoint(This,pt,element)
#define IUIAutomation4_GetFocusedElement(This,element) (This)->lpVtbl->GetFocusedElement(This,element)
#define IUIAutomation4_GetRootElementBuildCache(This,cacheRequest,root) (This)->lpVtbl->GetRootElementBuildCache(This,cacheRequest,root)
#define IUIAutomation4_ElementFromHandleBuildCache(This,hwnd,cacheRequest,element) (This)->lpVtbl->ElementFromHandleBuildCache(This,hwnd,cacheRequest,element)
#define IUIAutomation4_ElementFromPointBuildCache(This,pt,cacheRequest,element) (This)->lpVtbl->ElementFromPointBuildCache(This,pt,cacheRequest,element)
#define IUIAutomation4_GetFocusedElementBuildCache(This,cacheRequest,element) (This)->lpVtbl->GetFocusedElementBuildCache(This,cacheRequest,element)
#define IUIAutomation4_CreateTreeWalker(This,pCondition,walker) (This)->lpVtbl->CreateTreeWalker(This,pCondition,walker)
#define IUIAutomation4_get_ControlViewWalker(This,walker) (This)->lpVtbl->get_ControlViewWalker(This,walker)
#define IUIAutomation4_get_ContentViewWalker(This,walker) (This)->lpVtbl->get_ContentViewWalker(This,walker)
#define IUIAutomation4_get_RawViewWalker(This,walker) (This)->lpVtbl->get_RawViewWalker(This,walker)
#define IUIAutomation4_get_RawViewCondition(This,condition) (This)->lpVtbl->get_RawViewCondition(This,condition)
#define IUIAutomation4_get_ControlViewCondition(This,condition) (This)->lpVtbl->get_ControlViewCondition(This,condition)
#define IUIAutomation4_get_ContentViewCondition(This,condition) (This)->lpVtbl->get_ContentViewCondition(This,condition)
#define IUIAutomation4_CreateCacheRequest(This,cacheRequest) (This)->lpVtbl->CreateCacheRequest(This,cacheRequest)
#define IUIAutomation4_CreateTrueCondition(This,newCondition) (This)->lpVtbl->CreateTrueCondition(This,newCondition)
#define IUIAutomation4_CreateFalseCondition(This,newCondition) (This)->lpVtbl->CreateFalseCondition(This,newCondition)
#define IUIAutomation4_CreatePropertyCondition(This,propertyId,value,newCondition) (This)->lpVtbl->CreatePropertyCondition(This,propertyId,value,newCondition)
#define IUIAutomation4_CreatePropertyConditionEx(This,propertyId,value,flags,newCondition) (This)->lpVtbl->CreatePropertyConditionEx(This,propertyId,value,flags,newCondition)
#define IUIAutomation4_CreateAndCondition(This,condition1,condition2,newCondition) (This)->lpVtbl->CreateAndCondition(This,condition1,condition2,newCondition)
#define IUIAutomation4_CreateAndConditionFromArray(This,conditions,newCondition) (This)->lpVtbl->CreateAndConditionFromArray(This,conditions,newCondition)
#define IUIAutomation4_CreateAndConditionFromNativeArray(This,conditions,conditionCount,newCondition) (This)->lpVtbl->CreateAndConditionFromNativeArray(This,conditions,conditionCount,newCondition)
#define IUIAutomation4_CreateOrCondition(This,condition1,condition2,newCondition) (This)->lpVtbl->CreateOrCondition(This,condition1,condition2,newCondition)
#define IUIAutomation4_CreateOrConditionFromArray(This,conditions,newCondition) (This)->lpVtbl->CreateOrConditionFromArray(This,conditions,newCondition)
#define IUIAutomation4_CreateOrConditionFromNativeArray(This,conditions,conditionCount,newCondition) (This)->lpVtbl->CreateOrConditionFromNativeArray(This,conditions,conditionCount,newCondition)
#define IUIAutomation4_CreateNotCondition(This,condition,newCondition) (This)->lpVtbl->CreateNotCondition(This,condition,newCondition)
#define IUIAutomation4_AddAutomationEventHandler(This,eventId,element,scope,cacheRequest,handler) (This)->lpVtbl->AddAutomationEventHandler(This,eventId,element,scope,cacheRequest,handler)
#define IUIAutomation4_RemoveAutomationEventHandler(This,eventId,element,handler) (This)->lpVtbl->RemoveAutomationEventHandler(This,eventId,element,handler)
#define IUIAutomation4_AddPropertyChangedEventHandlerNativeArray(This,element,scope,cacheRequest,handler,propertyArray,propertyCount) (This)->lpVtbl->AddPropertyChangedEventHandlerNativeArray(This,element,scope,cacheRequest,handler,propertyArray,propertyCount)
#define IUIAutomation4_AddPropertyChangedEventHandler(This,element,scope,cacheRequest,handler,propertyArray) (This)->lpVtbl->AddPropertyChangedEventHandler(This,element,scope,cacheRequest,handler,propertyArray)
#define IUIAutomation4_RemovePropertyChangedEventHandler(This,element,handler) (This)->lpVtbl->RemovePropertyChangedEventHandler(This,element,handler)
#define IUIAutomation4_AddStructureChangedEventHandler(This,element,scope,cacheRequest,handler) (This)->lpVtbl->AddStructureChangedEventHandler(This,element,scope,cacheRequest,handler)
#define IUIAutomation4_RemoveStructureChangedEventHandler(This,element,handler) (This)->lpVtbl->RemoveStructureChangedEventHandler(This,element,handler)
#define IUIAutomation4_AddFocusChangedEventHandler(This,cacheRequest,handler) (This)->lpVtbl->AddFocusChangedEventHandler(This,cacheRequest,handler)
#define IUIAutomation4_RemoveFocusChangedEventHandler(This,handler) (This)->lpVtbl->RemoveFocusChangedEventHandler(This,handler)
#define IUIAutomation4_RemoveAllEventHandlers(This) (This)->lpVtbl->RemoveAllEventHandlers(This)
#define IUIAutomation4_IntNativeArrayToSafeArray(This,array,arrayCount,safeArray) (This)->lpVtbl->IntNativeArrayToSafeArray(This,array,arrayCount,safeArray)
#define IUIAutomation4_IntSafeArrayToNativeArray(This,intArray,array,arrayCount) (This)->lpVtbl->IntSafeArrayToNativeArray(This,intArray,array,arrayCount)
#define IUIAutomation4_RectToVariant(This,rc,var) (This)->lpVtbl->RectToVariant(This,rc,var)
#define IUIAutomation4_VariantToRect(This,var,rc) (This)->lpVtbl->VariantToRect(This,var,rc)
#define IUIAutomation4_SafeArrayToRectNativeArray(This,rects,rectArray,rectArrayCount) (This)->lpVtbl->SafeArrayToRectNativeArray(This,rects,rectArray,rectArrayCount)
#define IUIAutomation4_CreateProxyFactoryEntry(This,factory,factoryEntry) (This)->lpVtbl->CreateProxyFactoryEntry(This,factory,factoryEntry)
#define IUIAutomation4_get_ProxyFactoryMapping(This,factoryMapping) (This)->lpVtbl->get_ProxyFactoryMapping(This,factoryMapping)
#define IUIAutomation4_GetPropertyProgrammaticName(This,property,name) (This)->lpVtbl->GetPropertyProgrammaticName(This,property,name)
#define IUIAutomation4_GetPatternProgrammaticName(This,pattern,name) (This)->lpVtbl->GetPatternProgrammaticName(This,pattern,name)
#define IUIAutomation4_PollForPotentialSupportedPatterns(This,pElement,patternIds,patternNames) (This)->lpVtbl->PollForPotentialSupportedPatterns(This,pElement,patternIds,patternNames)
#define IUIAutomation4_PollForPotentialSupportedProperties(This,pElement,propertyIds,propertyNames) (This)->lpVtbl->PollForPotentialSupportedProperties(This,pElement,propertyIds,propertyNames)
#define IUIAutomation4_CheckNotSupported(This,value,isNotSupported) (This)->lpVtbl->CheckNotSupported(This,value,isNotSupported)
#define IUIAutomation4_get_ReservedNotSupportedValue(This,notSupportedValue) (This)->lpVtbl->get_ReservedNotSupportedValue(This,notSupportedValue)
#define IUIAutomation4_get_ReservedMixedAttributeValue(This,mixedAttributeValue) (This)->lpVtbl->get_ReservedMixedAttributeValue(This,mixedAttributeValue)
#define IUIAutomation4_ElementFromIAccessible(This,accessible,childId,element) (This)->lpVtbl->ElementFromIAccessible(This,accessible,childId,element)
#define IUIAutomation4_ElementFromIAccessibleBuildCache(This,accessible,childId,cacheRequest,element) (This)->lpVtbl->ElementFromIAccessibleBuildCache(This,accessible,childId,cacheRequest,element)
/*** IUIAutomation2 methods ***/
#define IUIAutomation4_get_AutoSetFocus(This,autoSetFocus) (This)->lpVtbl->get_AutoSetFocus(This,autoSetFocus)
#define IUIAutomation4_put_AutoSetFocus(This,autoSetFocus) (This)->lpVtbl->put_AutoSetFocus(This,autoSetFocus)
#define IUIAutomation4_get_ConnectionTimeout(This,timeout) (This)->lpVtbl->get_ConnectionTimeout(This,timeout)
#define IUIAutomation4_put_ConnectionTimeout(This,timeout) (This)->lpVtbl->put_ConnectionTimeout(This,timeout)
#define IUIAutomation4_get_TransactionTimeout(This,timeout) (This)->lpVtbl->get_TransactionTimeout(This,timeout)
#define IUIAutomation4_put_TransactionTimeout(This,timeout) (This)->lpVtbl->put_TransactionTimeout(This,timeout)
/*** IUIAutomation3 methods ***/
#define IUIAutomation4_AddTextEditTextChangedEventHandler(This,element,scope,textEditChangeType,cacheRequest,handler) (This)->lpVtbl->AddTextEditTextChangedEventHandler(This,element,scope,textEditChangeType,cacheRequest,handler)
#define IUIAutomation4_RemoveTextEditTextChangedEventHandler(This,element,handler) (This)->lpVtbl->RemoveTextEditTextChangedEventHandler(This,element,handler)
/*** IUIAutomation4 methods ***/
#define IUIAutomation4_AddChangesEventHandler(This,element,scope,changeTypes,changesCount,pCacheRequest,handler) (This)->lpVtbl->AddChangesEventHandler(This,element,scope,changeTypes,changesCount,pCacheRequest,handler)
#define IUIAutomation4_RemoveChangesEventHandler(This,element,handler) (This)->lpVtbl->RemoveChangesEventHandler(This,element,handler)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomation4_QueryInterface(IUIAutomation4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomation4_AddRef(IUIAutomation4* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomation4_Release(IUIAutomation4* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomation methods ***/
static __WIDL_INLINE HRESULT IUIAutomation4_CompareElements(IUIAutomation4* This,IUIAutomationElement *el1,IUIAutomationElement *el2,WINBOOL *areSame) {
    return This->lpVtbl->CompareElements(This,el1,el2,areSame);
}
static __WIDL_INLINE HRESULT IUIAutomation4_CompareRuntimeIds(IUIAutomation4* This,SAFEARRAY *runtimeId1,SAFEARRAY *runtimeId2,WINBOOL *areSame) {
    return This->lpVtbl->CompareRuntimeIds(This,runtimeId1,runtimeId2,areSame);
}
static __WIDL_INLINE HRESULT IUIAutomation4_GetRootElement(IUIAutomation4* This,IUIAutomationElement **root) {
    return This->lpVtbl->GetRootElement(This,root);
}
static __WIDL_INLINE HRESULT IUIAutomation4_ElementFromHandle(IUIAutomation4* This,UIA_HWND hwnd,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromHandle(This,hwnd,element);
}
static __WIDL_INLINE HRESULT IUIAutomation4_ElementFromPoint(IUIAutomation4* This,POINT pt,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromPoint(This,pt,element);
}
static __WIDL_INLINE HRESULT IUIAutomation4_GetFocusedElement(IUIAutomation4* This,IUIAutomationElement **element) {
    return This->lpVtbl->GetFocusedElement(This,element);
}
static __WIDL_INLINE HRESULT IUIAutomation4_GetRootElementBuildCache(IUIAutomation4* This,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **root) {
    return This->lpVtbl->GetRootElementBuildCache(This,cacheRequest,root);
}
static __WIDL_INLINE HRESULT IUIAutomation4_ElementFromHandleBuildCache(IUIAutomation4* This,UIA_HWND hwnd,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromHandleBuildCache(This,hwnd,cacheRequest,element);
}
static __WIDL_INLINE HRESULT IUIAutomation4_ElementFromPointBuildCache(IUIAutomation4* This,POINT pt,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromPointBuildCache(This,pt,cacheRequest,element);
}
static __WIDL_INLINE HRESULT IUIAutomation4_GetFocusedElementBuildCache(IUIAutomation4* This,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **element) {
    return This->lpVtbl->GetFocusedElementBuildCache(This,cacheRequest,element);
}
static __WIDL_INLINE HRESULT IUIAutomation4_CreateTreeWalker(IUIAutomation4* This,IUIAutomationCondition *pCondition,IUIAutomationTreeWalker **walker) {
    return This->lpVtbl->CreateTreeWalker(This,pCondition,walker);
}
static __WIDL_INLINE HRESULT IUIAutomation4_get_ControlViewWalker(IUIAutomation4* This,IUIAutomationTreeWalker **walker) {
    return This->lpVtbl->get_ControlViewWalker(This,walker);
}
static __WIDL_INLINE HRESULT IUIAutomation4_get_ContentViewWalker(IUIAutomation4* This,IUIAutomationTreeWalker **walker) {
    return This->lpVtbl->get_ContentViewWalker(This,walker);
}
static __WIDL_INLINE HRESULT IUIAutomation4_get_RawViewWalker(IUIAutomation4* This,IUIAutomationTreeWalker **walker) {
    return This->lpVtbl->get_RawViewWalker(This,walker);
}
static __WIDL_INLINE HRESULT IUIAutomation4_get_RawViewCondition(IUIAutomation4* This,IUIAutomationCondition **condition) {
    return This->lpVtbl->get_RawViewCondition(This,condition);
}
static __WIDL_INLINE HRESULT IUIAutomation4_get_ControlViewCondition(IUIAutomation4* This,IUIAutomationCondition **condition) {
    return This->lpVtbl->get_ControlViewCondition(This,condition);
}
static __WIDL_INLINE HRESULT IUIAutomation4_get_ContentViewCondition(IUIAutomation4* This,IUIAutomationCondition **condition) {
    return This->lpVtbl->get_ContentViewCondition(This,condition);
}
static __WIDL_INLINE HRESULT IUIAutomation4_CreateCacheRequest(IUIAutomation4* This,IUIAutomationCacheRequest **cacheRequest) {
    return This->lpVtbl->CreateCacheRequest(This,cacheRequest);
}
static __WIDL_INLINE HRESULT IUIAutomation4_CreateTrueCondition(IUIAutomation4* This,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateTrueCondition(This,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation4_CreateFalseCondition(IUIAutomation4* This,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateFalseCondition(This,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation4_CreatePropertyCondition(IUIAutomation4* This,PROPERTYID propertyId,VARIANT value,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreatePropertyCondition(This,propertyId,value,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation4_CreatePropertyConditionEx(IUIAutomation4* This,PROPERTYID propertyId,VARIANT value,enum PropertyConditionFlags flags,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreatePropertyConditionEx(This,propertyId,value,flags,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation4_CreateAndCondition(IUIAutomation4* This,IUIAutomationCondition *condition1,IUIAutomationCondition *condition2,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateAndCondition(This,condition1,condition2,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation4_CreateAndConditionFromArray(IUIAutomation4* This,SAFEARRAY *conditions,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateAndConditionFromArray(This,conditions,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation4_CreateAndConditionFromNativeArray(IUIAutomation4* This,IUIAutomationCondition **conditions,int conditionCount,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateAndConditionFromNativeArray(This,conditions,conditionCount,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation4_CreateOrCondition(IUIAutomation4* This,IUIAutomationCondition *condition1,IUIAutomationCondition *condition2,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateOrCondition(This,condition1,condition2,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation4_CreateOrConditionFromArray(IUIAutomation4* This,SAFEARRAY *conditions,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateOrConditionFromArray(This,conditions,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation4_CreateOrConditionFromNativeArray(IUIAutomation4* This,IUIAutomationCondition **conditions,int conditionCount,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateOrConditionFromNativeArray(This,conditions,conditionCount,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation4_CreateNotCondition(IUIAutomation4* This,IUIAutomationCondition *condition,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateNotCondition(This,condition,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation4_AddAutomationEventHandler(IUIAutomation4* This,EVENTID eventId,IUIAutomationElement *element,enum TreeScope scope,IUIAutomationCacheRequest *cacheRequest,IUIAutomationEventHandler *handler) {
    return This->lpVtbl->AddAutomationEventHandler(This,eventId,element,scope,cacheRequest,handler);
}
static __WIDL_INLINE HRESULT IUIAutomation4_RemoveAutomationEventHandler(IUIAutomation4* This,EVENTID eventId,IUIAutomationElement *element,IUIAutomationEventHandler *handler) {
    return This->lpVtbl->RemoveAutomationEventHandler(This,eventId,element,handler);
}
static __WIDL_INLINE HRESULT IUIAutomation4_AddPropertyChangedEventHandlerNativeArray(IUIAutomation4* This,IUIAutomationElement *element,enum TreeScope scope,IUIAutomationCacheRequest *cacheRequest,IUIAutomationPropertyChangedEventHandler *handler,PROPERTYID *propertyArray,int propertyCount) {
    return This->lpVtbl->AddPropertyChangedEventHandlerNativeArray(This,element,scope,cacheRequest,handler,propertyArray,propertyCount);
}
static __WIDL_INLINE HRESULT IUIAutomation4_AddPropertyChangedEventHandler(IUIAutomation4* This,IUIAutomationElement *element,enum TreeScope scope,IUIAutomationCacheRequest *cacheRequest,IUIAutomationPropertyChangedEventHandler *handler,SAFEARRAY *propertyArray) {
    return This->lpVtbl->AddPropertyChangedEventHandler(This,element,scope,cacheRequest,handler,propertyArray);
}
static __WIDL_INLINE HRESULT IUIAutomation4_RemovePropertyChangedEventHandler(IUIAutomation4* This,IUIAutomationElement *element,IUIAutomationPropertyChangedEventHandler *handler) {
    return This->lpVtbl->RemovePropertyChangedEventHandler(This,element,handler);
}
static __WIDL_INLINE HRESULT IUIAutomation4_AddStructureChangedEventHandler(IUIAutomation4* This,IUIAutomationElement *element,enum TreeScope scope,IUIAutomationCacheRequest *cacheRequest,IUIAutomationStructureChangedEventHandler *handler) {
    return This->lpVtbl->AddStructureChangedEventHandler(This,element,scope,cacheRequest,handler);
}
static __WIDL_INLINE HRESULT IUIAutomation4_RemoveStructureChangedEventHandler(IUIAutomation4* This,IUIAutomationElement *element,IUIAutomationStructureChangedEventHandler *handler) {
    return This->lpVtbl->RemoveStructureChangedEventHandler(This,element,handler);
}
static __WIDL_INLINE HRESULT IUIAutomation4_AddFocusChangedEventHandler(IUIAutomation4* This,IUIAutomationCacheRequest *cacheRequest,IUIAutomationFocusChangedEventHandler *handler) {
    return This->lpVtbl->AddFocusChangedEventHandler(This,cacheRequest,handler);
}
static __WIDL_INLINE HRESULT IUIAutomation4_RemoveFocusChangedEventHandler(IUIAutomation4* This,IUIAutomationFocusChangedEventHandler *handler) {
    return This->lpVtbl->RemoveFocusChangedEventHandler(This,handler);
}
static __WIDL_INLINE HRESULT IUIAutomation4_RemoveAllEventHandlers(IUIAutomation4* This) {
    return This->lpVtbl->RemoveAllEventHandlers(This);
}
static __WIDL_INLINE HRESULT IUIAutomation4_IntNativeArrayToSafeArray(IUIAutomation4* This,int *array,int arrayCount,SAFEARRAY **safeArray) {
    return This->lpVtbl->IntNativeArrayToSafeArray(This,array,arrayCount,safeArray);
}
static __WIDL_INLINE HRESULT IUIAutomation4_IntSafeArrayToNativeArray(IUIAutomation4* This,SAFEARRAY *intArray,int **array,int *arrayCount) {
    return This->lpVtbl->IntSafeArrayToNativeArray(This,intArray,array,arrayCount);
}
static __WIDL_INLINE HRESULT IUIAutomation4_RectToVariant(IUIAutomation4* This,RECT rc,VARIANT *var) {
    return This->lpVtbl->RectToVariant(This,rc,var);
}
static __WIDL_INLINE HRESULT IUIAutomation4_VariantToRect(IUIAutomation4* This,VARIANT var,RECT *rc) {
    return This->lpVtbl->VariantToRect(This,var,rc);
}
static __WIDL_INLINE HRESULT IUIAutomation4_SafeArrayToRectNativeArray(IUIAutomation4* This,SAFEARRAY *rects,RECT **rectArray,int *rectArrayCount) {
    return This->lpVtbl->SafeArrayToRectNativeArray(This,rects,rectArray,rectArrayCount);
}
static __WIDL_INLINE HRESULT IUIAutomation4_CreateProxyFactoryEntry(IUIAutomation4* This,IUIAutomationProxyFactory *factory,IUIAutomationProxyFactoryEntry **factoryEntry) {
    return This->lpVtbl->CreateProxyFactoryEntry(This,factory,factoryEntry);
}
static __WIDL_INLINE HRESULT IUIAutomation4_get_ProxyFactoryMapping(IUIAutomation4* This,IUIAutomationProxyFactoryMapping **factoryMapping) {
    return This->lpVtbl->get_ProxyFactoryMapping(This,factoryMapping);
}
static __WIDL_INLINE HRESULT IUIAutomation4_GetPropertyProgrammaticName(IUIAutomation4* This,PROPERTYID property,BSTR *name) {
    return This->lpVtbl->GetPropertyProgrammaticName(This,property,name);
}
static __WIDL_INLINE HRESULT IUIAutomation4_GetPatternProgrammaticName(IUIAutomation4* This,PATTERNID pattern,BSTR *name) {
    return This->lpVtbl->GetPatternProgrammaticName(This,pattern,name);
}
static __WIDL_INLINE HRESULT IUIAutomation4_PollForPotentialSupportedPatterns(IUIAutomation4* This,IUIAutomationElement *pElement,SAFEARRAY **patternIds,SAFEARRAY **patternNames) {
    return This->lpVtbl->PollForPotentialSupportedPatterns(This,pElement,patternIds,patternNames);
}
static __WIDL_INLINE HRESULT IUIAutomation4_PollForPotentialSupportedProperties(IUIAutomation4* This,IUIAutomationElement *pElement,SAFEARRAY **propertyIds,SAFEARRAY **propertyNames) {
    return This->lpVtbl->PollForPotentialSupportedProperties(This,pElement,propertyIds,propertyNames);
}
static __WIDL_INLINE HRESULT IUIAutomation4_CheckNotSupported(IUIAutomation4* This,VARIANT value,WINBOOL *isNotSupported) {
    return This->lpVtbl->CheckNotSupported(This,value,isNotSupported);
}
static __WIDL_INLINE HRESULT IUIAutomation4_get_ReservedNotSupportedValue(IUIAutomation4* This,IUnknown **notSupportedValue) {
    return This->lpVtbl->get_ReservedNotSupportedValue(This,notSupportedValue);
}
static __WIDL_INLINE HRESULT IUIAutomation4_get_ReservedMixedAttributeValue(IUIAutomation4* This,IUnknown **mixedAttributeValue) {
    return This->lpVtbl->get_ReservedMixedAttributeValue(This,mixedAttributeValue);
}
static __WIDL_INLINE HRESULT IUIAutomation4_ElementFromIAccessible(IUIAutomation4* This,IAccessible *accessible,int childId,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromIAccessible(This,accessible,childId,element);
}
static __WIDL_INLINE HRESULT IUIAutomation4_ElementFromIAccessibleBuildCache(IUIAutomation4* This,IAccessible *accessible,int childId,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromIAccessibleBuildCache(This,accessible,childId,cacheRequest,element);
}
/*** IUIAutomation2 methods ***/
static __WIDL_INLINE HRESULT IUIAutomation4_get_AutoSetFocus(IUIAutomation4* This,WINBOOL *autoSetFocus) {
    return This->lpVtbl->get_AutoSetFocus(This,autoSetFocus);
}
static __WIDL_INLINE HRESULT IUIAutomation4_put_AutoSetFocus(IUIAutomation4* This,WINBOOL autoSetFocus) {
    return This->lpVtbl->put_AutoSetFocus(This,autoSetFocus);
}
static __WIDL_INLINE HRESULT IUIAutomation4_get_ConnectionTimeout(IUIAutomation4* This,DWORD *timeout) {
    return This->lpVtbl->get_ConnectionTimeout(This,timeout);
}
static __WIDL_INLINE HRESULT IUIAutomation4_put_ConnectionTimeout(IUIAutomation4* This,DWORD timeout) {
    return This->lpVtbl->put_ConnectionTimeout(This,timeout);
}
static __WIDL_INLINE HRESULT IUIAutomation4_get_TransactionTimeout(IUIAutomation4* This,DWORD *timeout) {
    return This->lpVtbl->get_TransactionTimeout(This,timeout);
}
static __WIDL_INLINE HRESULT IUIAutomation4_put_TransactionTimeout(IUIAutomation4* This,DWORD timeout) {
    return This->lpVtbl->put_TransactionTimeout(This,timeout);
}
/*** IUIAutomation3 methods ***/
static __WIDL_INLINE HRESULT IUIAutomation4_AddTextEditTextChangedEventHandler(IUIAutomation4* This,IUIAutomationElement *element,enum TreeScope scope,enum TextEditChangeType textEditChangeType,IUIAutomationCacheRequest *cacheRequest,IUIAutomationTextEditTextChangedEventHandler *handler) {
    return This->lpVtbl->AddTextEditTextChangedEventHandler(This,element,scope,textEditChangeType,cacheRequest,handler);
}
static __WIDL_INLINE HRESULT IUIAutomation4_RemoveTextEditTextChangedEventHandler(IUIAutomation4* This,IUIAutomationElement *element,IUIAutomationTextEditTextChangedEventHandler *handler) {
    return This->lpVtbl->RemoveTextEditTextChangedEventHandler(This,element,handler);
}
/*** IUIAutomation4 methods ***/
static __WIDL_INLINE HRESULT IUIAutomation4_AddChangesEventHandler(IUIAutomation4* This,IUIAutomationElement *element,enum TreeScope scope,int *changeTypes,int changesCount,IUIAutomationCacheRequest *pCacheRequest,IUIAutomationChangesEventHandler *handler) {
    return This->lpVtbl->AddChangesEventHandler(This,element,scope,changeTypes,changesCount,pCacheRequest,handler);
}
static __WIDL_INLINE HRESULT IUIAutomation4_RemoveChangesEventHandler(IUIAutomation4* This,IUIAutomationElement *element,IUIAutomationChangesEventHandler *handler) {
    return This->lpVtbl->RemoveChangesEventHandler(This,element,handler);
}
#endif
#endif

#endif


#endif  /* __IUIAutomation4_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomation5 interface
 */
#ifndef __IUIAutomation5_INTERFACE_DEFINED__
#define __IUIAutomation5_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomation5, 0x25f700c8, 0xd816, 0x4057, 0xa9,0xdc, 0x3c,0xbd,0xee,0x77,0xe2,0x56);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("25f700c8-d816-4057-a9dc-3cbdee77e256")
IUIAutomation5 : public IUIAutomation4
{
    virtual HRESULT STDMETHODCALLTYPE AddNotificationEventHandler(
        IUIAutomationElement *element,
        enum TreeScope scope,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationNotificationEventHandler *handler) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveNotificationEventHandler(
        IUIAutomationElement *element,
        IUIAutomationNotificationEventHandler *handler) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomation5, 0x25f700c8, 0xd816, 0x4057, 0xa9,0xdc, 0x3c,0xbd,0xee,0x77,0xe2,0x56)
#endif
#else
typedef struct IUIAutomation5Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomation methods ***/
    HRESULT (STDMETHODCALLTYPE *CompareElements)(
        IUIAutomation5 *This,
        IUIAutomationElement *el1,
        IUIAutomationElement *el2,
        WINBOOL *areSame);

    HRESULT (STDMETHODCALLTYPE *CompareRuntimeIds)(
        IUIAutomation5 *This,
        SAFEARRAY *runtimeId1,
        SAFEARRAY *runtimeId2,
        WINBOOL *areSame);

    HRESULT (STDMETHODCALLTYPE *GetRootElement)(
        IUIAutomation5 *This,
        IUIAutomationElement **root);

    HRESULT (STDMETHODCALLTYPE *ElementFromHandle)(
        IUIAutomation5 *This,
        UIA_HWND hwnd,
        IUIAutomationElement **element);

    HRESULT (STDMETHODCALLTYPE *ElementFromPoint)(
        IUIAutomation5 *This,
        POINT pt,
        IUIAutomationElement **element);

    HRESULT (STDMETHODCALLTYPE *GetFocusedElement)(
        IUIAutomation5 *This,
        IUIAutomationElement **element);

    HRESULT (STDMETHODCALLTYPE *GetRootElementBuildCache)(
        IUIAutomation5 *This,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **root);

    HRESULT (STDMETHODCALLTYPE *ElementFromHandleBuildCache)(
        IUIAutomation5 *This,
        UIA_HWND hwnd,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **element);

    HRESULT (STDMETHODCALLTYPE *ElementFromPointBuildCache)(
        IUIAutomation5 *This,
        POINT pt,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **element);

    HRESULT (STDMETHODCALLTYPE *GetFocusedElementBuildCache)(
        IUIAutomation5 *This,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **element);

    HRESULT (STDMETHODCALLTYPE *CreateTreeWalker)(
        IUIAutomation5 *This,
        IUIAutomationCondition *pCondition,
        IUIAutomationTreeWalker **walker);

    HRESULT (STDMETHODCALLTYPE *get_ControlViewWalker)(
        IUIAutomation5 *This,
        IUIAutomationTreeWalker **walker);

    HRESULT (STDMETHODCALLTYPE *get_ContentViewWalker)(
        IUIAutomation5 *This,
        IUIAutomationTreeWalker **walker);

    HRESULT (STDMETHODCALLTYPE *get_RawViewWalker)(
        IUIAutomation5 *This,
        IUIAutomationTreeWalker **walker);

    HRESULT (STDMETHODCALLTYPE *get_RawViewCondition)(
        IUIAutomation5 *This,
        IUIAutomationCondition **condition);

    HRESULT (STDMETHODCALLTYPE *get_ControlViewCondition)(
        IUIAutomation5 *This,
        IUIAutomationCondition **condition);

    HRESULT (STDMETHODCALLTYPE *get_ContentViewCondition)(
        IUIAutomation5 *This,
        IUIAutomationCondition **condition);

    HRESULT (STDMETHODCALLTYPE *CreateCacheRequest)(
        IUIAutomation5 *This,
        IUIAutomationCacheRequest **cacheRequest);

    HRESULT (STDMETHODCALLTYPE *CreateTrueCondition)(
        IUIAutomation5 *This,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreateFalseCondition)(
        IUIAutomation5 *This,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreatePropertyCondition)(
        IUIAutomation5 *This,
        PROPERTYID propertyId,
        VARIANT value,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreatePropertyConditionEx)(
        IUIAutomation5 *This,
        PROPERTYID propertyId,
        VARIANT value,
        enum PropertyConditionFlags flags,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreateAndCondition)(
        IUIAutomation5 *This,
        IUIAutomationCondition *condition1,
        IUIAutomationCondition *condition2,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreateAndConditionFromArray)(
        IUIAutomation5 *This,
        SAFEARRAY *conditions,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreateAndConditionFromNativeArray)(
        IUIAutomation5 *This,
        IUIAutomationCondition **conditions,
        int conditionCount,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreateOrCondition)(
        IUIAutomation5 *This,
        IUIAutomationCondition *condition1,
        IUIAutomationCondition *condition2,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreateOrConditionFromArray)(
        IUIAutomation5 *This,
        SAFEARRAY *conditions,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreateOrConditionFromNativeArray)(
        IUIAutomation5 *This,
        IUIAutomationCondition **conditions,
        int conditionCount,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreateNotCondition)(
        IUIAutomation5 *This,
        IUIAutomationCondition *condition,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *AddAutomationEventHandler)(
        IUIAutomation5 *This,
        EVENTID eventId,
        IUIAutomationElement *element,
        enum TreeScope scope,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *RemoveAutomationEventHandler)(
        IUIAutomation5 *This,
        EVENTID eventId,
        IUIAutomationElement *element,
        IUIAutomationEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *AddPropertyChangedEventHandlerNativeArray)(
        IUIAutomation5 *This,
        IUIAutomationElement *element,
        enum TreeScope scope,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationPropertyChangedEventHandler *handler,
        PROPERTYID *propertyArray,
        int propertyCount);

    HRESULT (STDMETHODCALLTYPE *AddPropertyChangedEventHandler)(
        IUIAutomation5 *This,
        IUIAutomationElement *element,
        enum TreeScope scope,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationPropertyChangedEventHandler *handler,
        SAFEARRAY *propertyArray);

    HRESULT (STDMETHODCALLTYPE *RemovePropertyChangedEventHandler)(
        IUIAutomation5 *This,
        IUIAutomationElement *element,
        IUIAutomationPropertyChangedEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *AddStructureChangedEventHandler)(
        IUIAutomation5 *This,
        IUIAutomationElement *element,
        enum TreeScope scope,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationStructureChangedEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *RemoveStructureChangedEventHandler)(
        IUIAutomation5 *This,
        IUIAutomationElement *element,
        IUIAutomationStructureChangedEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *AddFocusChangedEventHandler)(
        IUIAutomation5 *This,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationFocusChangedEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *RemoveFocusChangedEventHandler)(
        IUIAutomation5 *This,
        IUIAutomationFocusChangedEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *RemoveAllEventHandlers)(
        IUIAutomation5 *This);

    HRESULT (STDMETHODCALLTYPE *IntNativeArrayToSafeArray)(
        IUIAutomation5 *This,
        int *array,
        int arrayCount,
        SAFEARRAY **safeArray);

    HRESULT (STDMETHODCALLTYPE *IntSafeArrayToNativeArray)(
        IUIAutomation5 *This,
        SAFEARRAY *intArray,
        int **array,
        int *arrayCount);

    HRESULT (STDMETHODCALLTYPE *RectToVariant)(
        IUIAutomation5 *This,
        RECT rc,
        VARIANT *var);

    HRESULT (STDMETHODCALLTYPE *VariantToRect)(
        IUIAutomation5 *This,
        VARIANT var,
        RECT *rc);

    HRESULT (STDMETHODCALLTYPE *SafeArrayToRectNativeArray)(
        IUIAutomation5 *This,
        SAFEARRAY *rects,
        RECT **rectArray,
        int *rectArrayCount);

    HRESULT (STDMETHODCALLTYPE *CreateProxyFactoryEntry)(
        IUIAutomation5 *This,
        IUIAutomationProxyFactory *factory,
        IUIAutomationProxyFactoryEntry **factoryEntry);

    HRESULT (STDMETHODCALLTYPE *get_ProxyFactoryMapping)(
        IUIAutomation5 *This,
        IUIAutomationProxyFactoryMapping **factoryMapping);

    HRESULT (STDMETHODCALLTYPE *GetPropertyProgrammaticName)(
        IUIAutomation5 *This,
        PROPERTYID property,
        BSTR *name);

    HRESULT (STDMETHODCALLTYPE *GetPatternProgrammaticName)(
        IUIAutomation5 *This,
        PATTERNID pattern,
        BSTR *name);

    HRESULT (STDMETHODCALLTYPE *PollForPotentialSupportedPatterns)(
        IUIAutomation5 *This,
        IUIAutomationElement *pElement,
        SAFEARRAY **patternIds,
        SAFEARRAY **patternNames);

    HRESULT (STDMETHODCALLTYPE *PollForPotentialSupportedProperties)(
        IUIAutomation5 *This,
        IUIAutomationElement *pElement,
        SAFEARRAY **propertyIds,
        SAFEARRAY **propertyNames);

    HRESULT (STDMETHODCALLTYPE *CheckNotSupported)(
        IUIAutomation5 *This,
        VARIANT value,
        WINBOOL *isNotSupported);

    HRESULT (STDMETHODCALLTYPE *get_ReservedNotSupportedValue)(
        IUIAutomation5 *This,
        IUnknown **notSupportedValue);

    HRESULT (STDMETHODCALLTYPE *get_ReservedMixedAttributeValue)(
        IUIAutomation5 *This,
        IUnknown **mixedAttributeValue);

    HRESULT (STDMETHODCALLTYPE *ElementFromIAccessible)(
        IUIAutomation5 *This,
        IAccessible *accessible,
        int childId,
        IUIAutomationElement **element);

    HRESULT (STDMETHODCALLTYPE *ElementFromIAccessibleBuildCache)(
        IUIAutomation5 *This,
        IAccessible *accessible,
        int childId,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **element);

    /*** IUIAutomation2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_AutoSetFocus)(
        IUIAutomation5 *This,
        WINBOOL *autoSetFocus);

    HRESULT (STDMETHODCALLTYPE *put_AutoSetFocus)(
        IUIAutomation5 *This,
        WINBOOL autoSetFocus);

    HRESULT (STDMETHODCALLTYPE *get_ConnectionTimeout)(
        IUIAutomation5 *This,
        DWORD *timeout);

    HRESULT (STDMETHODCALLTYPE *put_ConnectionTimeout)(
        IUIAutomation5 *This,
        DWORD timeout);

    HRESULT (STDMETHODCALLTYPE *get_TransactionTimeout)(
        IUIAutomation5 *This,
        DWORD *timeout);

    HRESULT (STDMETHODCALLTYPE *put_TransactionTimeout)(
        IUIAutomation5 *This,
        DWORD timeout);

    /*** IUIAutomation3 methods ***/
    HRESULT (STDMETHODCALLTYPE *AddTextEditTextChangedEventHandler)(
        IUIAutomation5 *This,
        IUIAutomationElement *element,
        enum TreeScope scope,
        enum TextEditChangeType textEditChangeType,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationTextEditTextChangedEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *RemoveTextEditTextChangedEventHandler)(
        IUIAutomation5 *This,
        IUIAutomationElement *element,
        IUIAutomationTextEditTextChangedEventHandler *handler);

    /*** IUIAutomation4 methods ***/
    HRESULT (STDMETHODCALLTYPE *AddChangesEventHandler)(
        IUIAutomation5 *This,
        IUIAutomationElement *element,
        enum TreeScope scope,
        int *changeTypes,
        int changesCount,
        IUIAutomationCacheRequest *pCacheRequest,
        IUIAutomationChangesEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *RemoveChangesEventHandler)(
        IUIAutomation5 *This,
        IUIAutomationElement *element,
        IUIAutomationChangesEventHandler *handler);

    /*** IUIAutomation5 methods ***/
    HRESULT (STDMETHODCALLTYPE *AddNotificationEventHandler)(
        IUIAutomation5 *This,
        IUIAutomationElement *element,
        enum TreeScope scope,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationNotificationEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *RemoveNotificationEventHandler)(
        IUIAutomation5 *This,
        IUIAutomationElement *element,
        IUIAutomationNotificationEventHandler *handler);

    END_INTERFACE
} IUIAutomation5Vtbl;

interface IUIAutomation5 {
    CONST_VTBL IUIAutomation5Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomation5_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomation5_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomation5_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomation methods ***/
#define IUIAutomation5_CompareElements(This,el1,el2,areSame) (This)->lpVtbl->CompareElements(This,el1,el2,areSame)
#define IUIAutomation5_CompareRuntimeIds(This,runtimeId1,runtimeId2,areSame) (This)->lpVtbl->CompareRuntimeIds(This,runtimeId1,runtimeId2,areSame)
#define IUIAutomation5_GetRootElement(This,root) (This)->lpVtbl->GetRootElement(This,root)
#define IUIAutomation5_ElementFromHandle(This,hwnd,element) (This)->lpVtbl->ElementFromHandle(This,hwnd,element)
#define IUIAutomation5_ElementFromPoint(This,pt,element) (This)->lpVtbl->ElementFromPoint(This,pt,element)
#define IUIAutomation5_GetFocusedElement(This,element) (This)->lpVtbl->GetFocusedElement(This,element)
#define IUIAutomation5_GetRootElementBuildCache(This,cacheRequest,root) (This)->lpVtbl->GetRootElementBuildCache(This,cacheRequest,root)
#define IUIAutomation5_ElementFromHandleBuildCache(This,hwnd,cacheRequest,element) (This)->lpVtbl->ElementFromHandleBuildCache(This,hwnd,cacheRequest,element)
#define IUIAutomation5_ElementFromPointBuildCache(This,pt,cacheRequest,element) (This)->lpVtbl->ElementFromPointBuildCache(This,pt,cacheRequest,element)
#define IUIAutomation5_GetFocusedElementBuildCache(This,cacheRequest,element) (This)->lpVtbl->GetFocusedElementBuildCache(This,cacheRequest,element)
#define IUIAutomation5_CreateTreeWalker(This,pCondition,walker) (This)->lpVtbl->CreateTreeWalker(This,pCondition,walker)
#define IUIAutomation5_get_ControlViewWalker(This,walker) (This)->lpVtbl->get_ControlViewWalker(This,walker)
#define IUIAutomation5_get_ContentViewWalker(This,walker) (This)->lpVtbl->get_ContentViewWalker(This,walker)
#define IUIAutomation5_get_RawViewWalker(This,walker) (This)->lpVtbl->get_RawViewWalker(This,walker)
#define IUIAutomation5_get_RawViewCondition(This,condition) (This)->lpVtbl->get_RawViewCondition(This,condition)
#define IUIAutomation5_get_ControlViewCondition(This,condition) (This)->lpVtbl->get_ControlViewCondition(This,condition)
#define IUIAutomation5_get_ContentViewCondition(This,condition) (This)->lpVtbl->get_ContentViewCondition(This,condition)
#define IUIAutomation5_CreateCacheRequest(This,cacheRequest) (This)->lpVtbl->CreateCacheRequest(This,cacheRequest)
#define IUIAutomation5_CreateTrueCondition(This,newCondition) (This)->lpVtbl->CreateTrueCondition(This,newCondition)
#define IUIAutomation5_CreateFalseCondition(This,newCondition) (This)->lpVtbl->CreateFalseCondition(This,newCondition)
#define IUIAutomation5_CreatePropertyCondition(This,propertyId,value,newCondition) (This)->lpVtbl->CreatePropertyCondition(This,propertyId,value,newCondition)
#define IUIAutomation5_CreatePropertyConditionEx(This,propertyId,value,flags,newCondition) (This)->lpVtbl->CreatePropertyConditionEx(This,propertyId,value,flags,newCondition)
#define IUIAutomation5_CreateAndCondition(This,condition1,condition2,newCondition) (This)->lpVtbl->CreateAndCondition(This,condition1,condition2,newCondition)
#define IUIAutomation5_CreateAndConditionFromArray(This,conditions,newCondition) (This)->lpVtbl->CreateAndConditionFromArray(This,conditions,newCondition)
#define IUIAutomation5_CreateAndConditionFromNativeArray(This,conditions,conditionCount,newCondition) (This)->lpVtbl->CreateAndConditionFromNativeArray(This,conditions,conditionCount,newCondition)
#define IUIAutomation5_CreateOrCondition(This,condition1,condition2,newCondition) (This)->lpVtbl->CreateOrCondition(This,condition1,condition2,newCondition)
#define IUIAutomation5_CreateOrConditionFromArray(This,conditions,newCondition) (This)->lpVtbl->CreateOrConditionFromArray(This,conditions,newCondition)
#define IUIAutomation5_CreateOrConditionFromNativeArray(This,conditions,conditionCount,newCondition) (This)->lpVtbl->CreateOrConditionFromNativeArray(This,conditions,conditionCount,newCondition)
#define IUIAutomation5_CreateNotCondition(This,condition,newCondition) (This)->lpVtbl->CreateNotCondition(This,condition,newCondition)
#define IUIAutomation5_AddAutomationEventHandler(This,eventId,element,scope,cacheRequest,handler) (This)->lpVtbl->AddAutomationEventHandler(This,eventId,element,scope,cacheRequest,handler)
#define IUIAutomation5_RemoveAutomationEventHandler(This,eventId,element,handler) (This)->lpVtbl->RemoveAutomationEventHandler(This,eventId,element,handler)
#define IUIAutomation5_AddPropertyChangedEventHandlerNativeArray(This,element,scope,cacheRequest,handler,propertyArray,propertyCount) (This)->lpVtbl->AddPropertyChangedEventHandlerNativeArray(This,element,scope,cacheRequest,handler,propertyArray,propertyCount)
#define IUIAutomation5_AddPropertyChangedEventHandler(This,element,scope,cacheRequest,handler,propertyArray) (This)->lpVtbl->AddPropertyChangedEventHandler(This,element,scope,cacheRequest,handler,propertyArray)
#define IUIAutomation5_RemovePropertyChangedEventHandler(This,element,handler) (This)->lpVtbl->RemovePropertyChangedEventHandler(This,element,handler)
#define IUIAutomation5_AddStructureChangedEventHandler(This,element,scope,cacheRequest,handler) (This)->lpVtbl->AddStructureChangedEventHandler(This,element,scope,cacheRequest,handler)
#define IUIAutomation5_RemoveStructureChangedEventHandler(This,element,handler) (This)->lpVtbl->RemoveStructureChangedEventHandler(This,element,handler)
#define IUIAutomation5_AddFocusChangedEventHandler(This,cacheRequest,handler) (This)->lpVtbl->AddFocusChangedEventHandler(This,cacheRequest,handler)
#define IUIAutomation5_RemoveFocusChangedEventHandler(This,handler) (This)->lpVtbl->RemoveFocusChangedEventHandler(This,handler)
#define IUIAutomation5_RemoveAllEventHandlers(This) (This)->lpVtbl->RemoveAllEventHandlers(This)
#define IUIAutomation5_IntNativeArrayToSafeArray(This,array,arrayCount,safeArray) (This)->lpVtbl->IntNativeArrayToSafeArray(This,array,arrayCount,safeArray)
#define IUIAutomation5_IntSafeArrayToNativeArray(This,intArray,array,arrayCount) (This)->lpVtbl->IntSafeArrayToNativeArray(This,intArray,array,arrayCount)
#define IUIAutomation5_RectToVariant(This,rc,var) (This)->lpVtbl->RectToVariant(This,rc,var)
#define IUIAutomation5_VariantToRect(This,var,rc) (This)->lpVtbl->VariantToRect(This,var,rc)
#define IUIAutomation5_SafeArrayToRectNativeArray(This,rects,rectArray,rectArrayCount) (This)->lpVtbl->SafeArrayToRectNativeArray(This,rects,rectArray,rectArrayCount)
#define IUIAutomation5_CreateProxyFactoryEntry(This,factory,factoryEntry) (This)->lpVtbl->CreateProxyFactoryEntry(This,factory,factoryEntry)
#define IUIAutomation5_get_ProxyFactoryMapping(This,factoryMapping) (This)->lpVtbl->get_ProxyFactoryMapping(This,factoryMapping)
#define IUIAutomation5_GetPropertyProgrammaticName(This,property,name) (This)->lpVtbl->GetPropertyProgrammaticName(This,property,name)
#define IUIAutomation5_GetPatternProgrammaticName(This,pattern,name) (This)->lpVtbl->GetPatternProgrammaticName(This,pattern,name)
#define IUIAutomation5_PollForPotentialSupportedPatterns(This,pElement,patternIds,patternNames) (This)->lpVtbl->PollForPotentialSupportedPatterns(This,pElement,patternIds,patternNames)
#define IUIAutomation5_PollForPotentialSupportedProperties(This,pElement,propertyIds,propertyNames) (This)->lpVtbl->PollForPotentialSupportedProperties(This,pElement,propertyIds,propertyNames)
#define IUIAutomation5_CheckNotSupported(This,value,isNotSupported) (This)->lpVtbl->CheckNotSupported(This,value,isNotSupported)
#define IUIAutomation5_get_ReservedNotSupportedValue(This,notSupportedValue) (This)->lpVtbl->get_ReservedNotSupportedValue(This,notSupportedValue)
#define IUIAutomation5_get_ReservedMixedAttributeValue(This,mixedAttributeValue) (This)->lpVtbl->get_ReservedMixedAttributeValue(This,mixedAttributeValue)
#define IUIAutomation5_ElementFromIAccessible(This,accessible,childId,element) (This)->lpVtbl->ElementFromIAccessible(This,accessible,childId,element)
#define IUIAutomation5_ElementFromIAccessibleBuildCache(This,accessible,childId,cacheRequest,element) (This)->lpVtbl->ElementFromIAccessibleBuildCache(This,accessible,childId,cacheRequest,element)
/*** IUIAutomation2 methods ***/
#define IUIAutomation5_get_AutoSetFocus(This,autoSetFocus) (This)->lpVtbl->get_AutoSetFocus(This,autoSetFocus)
#define IUIAutomation5_put_AutoSetFocus(This,autoSetFocus) (This)->lpVtbl->put_AutoSetFocus(This,autoSetFocus)
#define IUIAutomation5_get_ConnectionTimeout(This,timeout) (This)->lpVtbl->get_ConnectionTimeout(This,timeout)
#define IUIAutomation5_put_ConnectionTimeout(This,timeout) (This)->lpVtbl->put_ConnectionTimeout(This,timeout)
#define IUIAutomation5_get_TransactionTimeout(This,timeout) (This)->lpVtbl->get_TransactionTimeout(This,timeout)
#define IUIAutomation5_put_TransactionTimeout(This,timeout) (This)->lpVtbl->put_TransactionTimeout(This,timeout)
/*** IUIAutomation3 methods ***/
#define IUIAutomation5_AddTextEditTextChangedEventHandler(This,element,scope,textEditChangeType,cacheRequest,handler) (This)->lpVtbl->AddTextEditTextChangedEventHandler(This,element,scope,textEditChangeType,cacheRequest,handler)
#define IUIAutomation5_RemoveTextEditTextChangedEventHandler(This,element,handler) (This)->lpVtbl->RemoveTextEditTextChangedEventHandler(This,element,handler)
/*** IUIAutomation4 methods ***/
#define IUIAutomation5_AddChangesEventHandler(This,element,scope,changeTypes,changesCount,pCacheRequest,handler) (This)->lpVtbl->AddChangesEventHandler(This,element,scope,changeTypes,changesCount,pCacheRequest,handler)
#define IUIAutomation5_RemoveChangesEventHandler(This,element,handler) (This)->lpVtbl->RemoveChangesEventHandler(This,element,handler)
/*** IUIAutomation5 methods ***/
#define IUIAutomation5_AddNotificationEventHandler(This,element,scope,cacheRequest,handler) (This)->lpVtbl->AddNotificationEventHandler(This,element,scope,cacheRequest,handler)
#define IUIAutomation5_RemoveNotificationEventHandler(This,element,handler) (This)->lpVtbl->RemoveNotificationEventHandler(This,element,handler)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomation5_QueryInterface(IUIAutomation5* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomation5_AddRef(IUIAutomation5* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomation5_Release(IUIAutomation5* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomation methods ***/
static __WIDL_INLINE HRESULT IUIAutomation5_CompareElements(IUIAutomation5* This,IUIAutomationElement *el1,IUIAutomationElement *el2,WINBOOL *areSame) {
    return This->lpVtbl->CompareElements(This,el1,el2,areSame);
}
static __WIDL_INLINE HRESULT IUIAutomation5_CompareRuntimeIds(IUIAutomation5* This,SAFEARRAY *runtimeId1,SAFEARRAY *runtimeId2,WINBOOL *areSame) {
    return This->lpVtbl->CompareRuntimeIds(This,runtimeId1,runtimeId2,areSame);
}
static __WIDL_INLINE HRESULT IUIAutomation5_GetRootElement(IUIAutomation5* This,IUIAutomationElement **root) {
    return This->lpVtbl->GetRootElement(This,root);
}
static __WIDL_INLINE HRESULT IUIAutomation5_ElementFromHandle(IUIAutomation5* This,UIA_HWND hwnd,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromHandle(This,hwnd,element);
}
static __WIDL_INLINE HRESULT IUIAutomation5_ElementFromPoint(IUIAutomation5* This,POINT pt,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromPoint(This,pt,element);
}
static __WIDL_INLINE HRESULT IUIAutomation5_GetFocusedElement(IUIAutomation5* This,IUIAutomationElement **element) {
    return This->lpVtbl->GetFocusedElement(This,element);
}
static __WIDL_INLINE HRESULT IUIAutomation5_GetRootElementBuildCache(IUIAutomation5* This,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **root) {
    return This->lpVtbl->GetRootElementBuildCache(This,cacheRequest,root);
}
static __WIDL_INLINE HRESULT IUIAutomation5_ElementFromHandleBuildCache(IUIAutomation5* This,UIA_HWND hwnd,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromHandleBuildCache(This,hwnd,cacheRequest,element);
}
static __WIDL_INLINE HRESULT IUIAutomation5_ElementFromPointBuildCache(IUIAutomation5* This,POINT pt,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromPointBuildCache(This,pt,cacheRequest,element);
}
static __WIDL_INLINE HRESULT IUIAutomation5_GetFocusedElementBuildCache(IUIAutomation5* This,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **element) {
    return This->lpVtbl->GetFocusedElementBuildCache(This,cacheRequest,element);
}
static __WIDL_INLINE HRESULT IUIAutomation5_CreateTreeWalker(IUIAutomation5* This,IUIAutomationCondition *pCondition,IUIAutomationTreeWalker **walker) {
    return This->lpVtbl->CreateTreeWalker(This,pCondition,walker);
}
static __WIDL_INLINE HRESULT IUIAutomation5_get_ControlViewWalker(IUIAutomation5* This,IUIAutomationTreeWalker **walker) {
    return This->lpVtbl->get_ControlViewWalker(This,walker);
}
static __WIDL_INLINE HRESULT IUIAutomation5_get_ContentViewWalker(IUIAutomation5* This,IUIAutomationTreeWalker **walker) {
    return This->lpVtbl->get_ContentViewWalker(This,walker);
}
static __WIDL_INLINE HRESULT IUIAutomation5_get_RawViewWalker(IUIAutomation5* This,IUIAutomationTreeWalker **walker) {
    return This->lpVtbl->get_RawViewWalker(This,walker);
}
static __WIDL_INLINE HRESULT IUIAutomation5_get_RawViewCondition(IUIAutomation5* This,IUIAutomationCondition **condition) {
    return This->lpVtbl->get_RawViewCondition(This,condition);
}
static __WIDL_INLINE HRESULT IUIAutomation5_get_ControlViewCondition(IUIAutomation5* This,IUIAutomationCondition **condition) {
    return This->lpVtbl->get_ControlViewCondition(This,condition);
}
static __WIDL_INLINE HRESULT IUIAutomation5_get_ContentViewCondition(IUIAutomation5* This,IUIAutomationCondition **condition) {
    return This->lpVtbl->get_ContentViewCondition(This,condition);
}
static __WIDL_INLINE HRESULT IUIAutomation5_CreateCacheRequest(IUIAutomation5* This,IUIAutomationCacheRequest **cacheRequest) {
    return This->lpVtbl->CreateCacheRequest(This,cacheRequest);
}
static __WIDL_INLINE HRESULT IUIAutomation5_CreateTrueCondition(IUIAutomation5* This,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateTrueCondition(This,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation5_CreateFalseCondition(IUIAutomation5* This,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateFalseCondition(This,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation5_CreatePropertyCondition(IUIAutomation5* This,PROPERTYID propertyId,VARIANT value,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreatePropertyCondition(This,propertyId,value,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation5_CreatePropertyConditionEx(IUIAutomation5* This,PROPERTYID propertyId,VARIANT value,enum PropertyConditionFlags flags,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreatePropertyConditionEx(This,propertyId,value,flags,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation5_CreateAndCondition(IUIAutomation5* This,IUIAutomationCondition *condition1,IUIAutomationCondition *condition2,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateAndCondition(This,condition1,condition2,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation5_CreateAndConditionFromArray(IUIAutomation5* This,SAFEARRAY *conditions,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateAndConditionFromArray(This,conditions,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation5_CreateAndConditionFromNativeArray(IUIAutomation5* This,IUIAutomationCondition **conditions,int conditionCount,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateAndConditionFromNativeArray(This,conditions,conditionCount,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation5_CreateOrCondition(IUIAutomation5* This,IUIAutomationCondition *condition1,IUIAutomationCondition *condition2,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateOrCondition(This,condition1,condition2,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation5_CreateOrConditionFromArray(IUIAutomation5* This,SAFEARRAY *conditions,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateOrConditionFromArray(This,conditions,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation5_CreateOrConditionFromNativeArray(IUIAutomation5* This,IUIAutomationCondition **conditions,int conditionCount,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateOrConditionFromNativeArray(This,conditions,conditionCount,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation5_CreateNotCondition(IUIAutomation5* This,IUIAutomationCondition *condition,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateNotCondition(This,condition,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation5_AddAutomationEventHandler(IUIAutomation5* This,EVENTID eventId,IUIAutomationElement *element,enum TreeScope scope,IUIAutomationCacheRequest *cacheRequest,IUIAutomationEventHandler *handler) {
    return This->lpVtbl->AddAutomationEventHandler(This,eventId,element,scope,cacheRequest,handler);
}
static __WIDL_INLINE HRESULT IUIAutomation5_RemoveAutomationEventHandler(IUIAutomation5* This,EVENTID eventId,IUIAutomationElement *element,IUIAutomationEventHandler *handler) {
    return This->lpVtbl->RemoveAutomationEventHandler(This,eventId,element,handler);
}
static __WIDL_INLINE HRESULT IUIAutomation5_AddPropertyChangedEventHandlerNativeArray(IUIAutomation5* This,IUIAutomationElement *element,enum TreeScope scope,IUIAutomationCacheRequest *cacheRequest,IUIAutomationPropertyChangedEventHandler *handler,PROPERTYID *propertyArray,int propertyCount) {
    return This->lpVtbl->AddPropertyChangedEventHandlerNativeArray(This,element,scope,cacheRequest,handler,propertyArray,propertyCount);
}
static __WIDL_INLINE HRESULT IUIAutomation5_AddPropertyChangedEventHandler(IUIAutomation5* This,IUIAutomationElement *element,enum TreeScope scope,IUIAutomationCacheRequest *cacheRequest,IUIAutomationPropertyChangedEventHandler *handler,SAFEARRAY *propertyArray) {
    return This->lpVtbl->AddPropertyChangedEventHandler(This,element,scope,cacheRequest,handler,propertyArray);
}
static __WIDL_INLINE HRESULT IUIAutomation5_RemovePropertyChangedEventHandler(IUIAutomation5* This,IUIAutomationElement *element,IUIAutomationPropertyChangedEventHandler *handler) {
    return This->lpVtbl->RemovePropertyChangedEventHandler(This,element,handler);
}
static __WIDL_INLINE HRESULT IUIAutomation5_AddStructureChangedEventHandler(IUIAutomation5* This,IUIAutomationElement *element,enum TreeScope scope,IUIAutomationCacheRequest *cacheRequest,IUIAutomationStructureChangedEventHandler *handler) {
    return This->lpVtbl->AddStructureChangedEventHandler(This,element,scope,cacheRequest,handler);
}
static __WIDL_INLINE HRESULT IUIAutomation5_RemoveStructureChangedEventHandler(IUIAutomation5* This,IUIAutomationElement *element,IUIAutomationStructureChangedEventHandler *handler) {
    return This->lpVtbl->RemoveStructureChangedEventHandler(This,element,handler);
}
static __WIDL_INLINE HRESULT IUIAutomation5_AddFocusChangedEventHandler(IUIAutomation5* This,IUIAutomationCacheRequest *cacheRequest,IUIAutomationFocusChangedEventHandler *handler) {
    return This->lpVtbl->AddFocusChangedEventHandler(This,cacheRequest,handler);
}
static __WIDL_INLINE HRESULT IUIAutomation5_RemoveFocusChangedEventHandler(IUIAutomation5* This,IUIAutomationFocusChangedEventHandler *handler) {
    return This->lpVtbl->RemoveFocusChangedEventHandler(This,handler);
}
static __WIDL_INLINE HRESULT IUIAutomation5_RemoveAllEventHandlers(IUIAutomation5* This) {
    return This->lpVtbl->RemoveAllEventHandlers(This);
}
static __WIDL_INLINE HRESULT IUIAutomation5_IntNativeArrayToSafeArray(IUIAutomation5* This,int *array,int arrayCount,SAFEARRAY **safeArray) {
    return This->lpVtbl->IntNativeArrayToSafeArray(This,array,arrayCount,safeArray);
}
static __WIDL_INLINE HRESULT IUIAutomation5_IntSafeArrayToNativeArray(IUIAutomation5* This,SAFEARRAY *intArray,int **array,int *arrayCount) {
    return This->lpVtbl->IntSafeArrayToNativeArray(This,intArray,array,arrayCount);
}
static __WIDL_INLINE HRESULT IUIAutomation5_RectToVariant(IUIAutomation5* This,RECT rc,VARIANT *var) {
    return This->lpVtbl->RectToVariant(This,rc,var);
}
static __WIDL_INLINE HRESULT IUIAutomation5_VariantToRect(IUIAutomation5* This,VARIANT var,RECT *rc) {
    return This->lpVtbl->VariantToRect(This,var,rc);
}
static __WIDL_INLINE HRESULT IUIAutomation5_SafeArrayToRectNativeArray(IUIAutomation5* This,SAFEARRAY *rects,RECT **rectArray,int *rectArrayCount) {
    return This->lpVtbl->SafeArrayToRectNativeArray(This,rects,rectArray,rectArrayCount);
}
static __WIDL_INLINE HRESULT IUIAutomation5_CreateProxyFactoryEntry(IUIAutomation5* This,IUIAutomationProxyFactory *factory,IUIAutomationProxyFactoryEntry **factoryEntry) {
    return This->lpVtbl->CreateProxyFactoryEntry(This,factory,factoryEntry);
}
static __WIDL_INLINE HRESULT IUIAutomation5_get_ProxyFactoryMapping(IUIAutomation5* This,IUIAutomationProxyFactoryMapping **factoryMapping) {
    return This->lpVtbl->get_ProxyFactoryMapping(This,factoryMapping);
}
static __WIDL_INLINE HRESULT IUIAutomation5_GetPropertyProgrammaticName(IUIAutomation5* This,PROPERTYID property,BSTR *name) {
    return This->lpVtbl->GetPropertyProgrammaticName(This,property,name);
}
static __WIDL_INLINE HRESULT IUIAutomation5_GetPatternProgrammaticName(IUIAutomation5* This,PATTERNID pattern,BSTR *name) {
    return This->lpVtbl->GetPatternProgrammaticName(This,pattern,name);
}
static __WIDL_INLINE HRESULT IUIAutomation5_PollForPotentialSupportedPatterns(IUIAutomation5* This,IUIAutomationElement *pElement,SAFEARRAY **patternIds,SAFEARRAY **patternNames) {
    return This->lpVtbl->PollForPotentialSupportedPatterns(This,pElement,patternIds,patternNames);
}
static __WIDL_INLINE HRESULT IUIAutomation5_PollForPotentialSupportedProperties(IUIAutomation5* This,IUIAutomationElement *pElement,SAFEARRAY **propertyIds,SAFEARRAY **propertyNames) {
    return This->lpVtbl->PollForPotentialSupportedProperties(This,pElement,propertyIds,propertyNames);
}
static __WIDL_INLINE HRESULT IUIAutomation5_CheckNotSupported(IUIAutomation5* This,VARIANT value,WINBOOL *isNotSupported) {
    return This->lpVtbl->CheckNotSupported(This,value,isNotSupported);
}
static __WIDL_INLINE HRESULT IUIAutomation5_get_ReservedNotSupportedValue(IUIAutomation5* This,IUnknown **notSupportedValue) {
    return This->lpVtbl->get_ReservedNotSupportedValue(This,notSupportedValue);
}
static __WIDL_INLINE HRESULT IUIAutomation5_get_ReservedMixedAttributeValue(IUIAutomation5* This,IUnknown **mixedAttributeValue) {
    return This->lpVtbl->get_ReservedMixedAttributeValue(This,mixedAttributeValue);
}
static __WIDL_INLINE HRESULT IUIAutomation5_ElementFromIAccessible(IUIAutomation5* This,IAccessible *accessible,int childId,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromIAccessible(This,accessible,childId,element);
}
static __WIDL_INLINE HRESULT IUIAutomation5_ElementFromIAccessibleBuildCache(IUIAutomation5* This,IAccessible *accessible,int childId,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromIAccessibleBuildCache(This,accessible,childId,cacheRequest,element);
}
/*** IUIAutomation2 methods ***/
static __WIDL_INLINE HRESULT IUIAutomation5_get_AutoSetFocus(IUIAutomation5* This,WINBOOL *autoSetFocus) {
    return This->lpVtbl->get_AutoSetFocus(This,autoSetFocus);
}
static __WIDL_INLINE HRESULT IUIAutomation5_put_AutoSetFocus(IUIAutomation5* This,WINBOOL autoSetFocus) {
    return This->lpVtbl->put_AutoSetFocus(This,autoSetFocus);
}
static __WIDL_INLINE HRESULT IUIAutomation5_get_ConnectionTimeout(IUIAutomation5* This,DWORD *timeout) {
    return This->lpVtbl->get_ConnectionTimeout(This,timeout);
}
static __WIDL_INLINE HRESULT IUIAutomation5_put_ConnectionTimeout(IUIAutomation5* This,DWORD timeout) {
    return This->lpVtbl->put_ConnectionTimeout(This,timeout);
}
static __WIDL_INLINE HRESULT IUIAutomation5_get_TransactionTimeout(IUIAutomation5* This,DWORD *timeout) {
    return This->lpVtbl->get_TransactionTimeout(This,timeout);
}
static __WIDL_INLINE HRESULT IUIAutomation5_put_TransactionTimeout(IUIAutomation5* This,DWORD timeout) {
    return This->lpVtbl->put_TransactionTimeout(This,timeout);
}
/*** IUIAutomation3 methods ***/
static __WIDL_INLINE HRESULT IUIAutomation5_AddTextEditTextChangedEventHandler(IUIAutomation5* This,IUIAutomationElement *element,enum TreeScope scope,enum TextEditChangeType textEditChangeType,IUIAutomationCacheRequest *cacheRequest,IUIAutomationTextEditTextChangedEventHandler *handler) {
    return This->lpVtbl->AddTextEditTextChangedEventHandler(This,element,scope,textEditChangeType,cacheRequest,handler);
}
static __WIDL_INLINE HRESULT IUIAutomation5_RemoveTextEditTextChangedEventHandler(IUIAutomation5* This,IUIAutomationElement *element,IUIAutomationTextEditTextChangedEventHandler *handler) {
    return This->lpVtbl->RemoveTextEditTextChangedEventHandler(This,element,handler);
}
/*** IUIAutomation4 methods ***/
static __WIDL_INLINE HRESULT IUIAutomation5_AddChangesEventHandler(IUIAutomation5* This,IUIAutomationElement *element,enum TreeScope scope,int *changeTypes,int changesCount,IUIAutomationCacheRequest *pCacheRequest,IUIAutomationChangesEventHandler *handler) {
    return This->lpVtbl->AddChangesEventHandler(This,element,scope,changeTypes,changesCount,pCacheRequest,handler);
}
static __WIDL_INLINE HRESULT IUIAutomation5_RemoveChangesEventHandler(IUIAutomation5* This,IUIAutomationElement *element,IUIAutomationChangesEventHandler *handler) {
    return This->lpVtbl->RemoveChangesEventHandler(This,element,handler);
}
/*** IUIAutomation5 methods ***/
static __WIDL_INLINE HRESULT IUIAutomation5_AddNotificationEventHandler(IUIAutomation5* This,IUIAutomationElement *element,enum TreeScope scope,IUIAutomationCacheRequest *cacheRequest,IUIAutomationNotificationEventHandler *handler) {
    return This->lpVtbl->AddNotificationEventHandler(This,element,scope,cacheRequest,handler);
}
static __WIDL_INLINE HRESULT IUIAutomation5_RemoveNotificationEventHandler(IUIAutomation5* This,IUIAutomationElement *element,IUIAutomationNotificationEventHandler *handler) {
    return This->lpVtbl->RemoveNotificationEventHandler(This,element,handler);
}
#endif
#endif

#endif


#endif  /* __IUIAutomation5_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAutomation6 interface
 */
#ifndef __IUIAutomation6_INTERFACE_DEFINED__
#define __IUIAutomation6_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAutomation6, 0xaae072da, 0x29e3, 0x413d, 0x87,0xa7, 0x19,0x2d,0xbf,0x81,0xed,0x10);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("aae072da-29e3-413d-87a7-192dbf81ed10")
IUIAutomation6 : public IUIAutomation5
{
    virtual HRESULT STDMETHODCALLTYPE CreateEventHandlerGroup(
        IUIAutomationEventHandlerGroup **handlerGroup) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddEventHandlerGroup(
        IUIAutomationElement *element,
        IUIAutomationEventHandlerGroup *handlerGroup) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveEventHandlerGroup(
        IUIAutomationElement *element,
        IUIAutomationEventHandlerGroup *handlerGroup) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ConnectionRecoveryBehavior(
        enum ConnectionRecoveryBehaviorOptions *connectionRecoveryBehaviorOptions) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ConnectionRecoveryBehavior(
        enum ConnectionRecoveryBehaviorOptions connectionRecoveryBehaviorOptions) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CoalesceEvents(
        enum CoalesceEventsOptions *coalesceEventsOptions) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_CoalesceEvents(
        enum CoalesceEventsOptions coalesceEventsOptions) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddActiveTextPositionChangedEventHandler(
        IUIAutomationElement *element,
        enum TreeScope scope,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationActiveTextPositionChangedEventHandler *handler) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveActiveTextPositionChangedEventHandler(
        IUIAutomationElement *element,
        IUIAutomationActiveTextPositionChangedEventHandler *handler) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAutomation6, 0xaae072da, 0x29e3, 0x413d, 0x87,0xa7, 0x19,0x2d,0xbf,0x81,0xed,0x10)
#endif
#else
typedef struct IUIAutomation6Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IUIAutomation methods ***/
    HRESULT (STDMETHODCALLTYPE *CompareElements)(
        IUIAutomation6 *This,
        IUIAutomationElement *el1,
        IUIAutomationElement *el2,
        WINBOOL *areSame);

    HRESULT (STDMETHODCALLTYPE *CompareRuntimeIds)(
        IUIAutomation6 *This,
        SAFEARRAY *runtimeId1,
        SAFEARRAY *runtimeId2,
        WINBOOL *areSame);

    HRESULT (STDMETHODCALLTYPE *GetRootElement)(
        IUIAutomation6 *This,
        IUIAutomationElement **root);

    HRESULT (STDMETHODCALLTYPE *ElementFromHandle)(
        IUIAutomation6 *This,
        UIA_HWND hwnd,
        IUIAutomationElement **element);

    HRESULT (STDMETHODCALLTYPE *ElementFromPoint)(
        IUIAutomation6 *This,
        POINT pt,
        IUIAutomationElement **element);

    HRESULT (STDMETHODCALLTYPE *GetFocusedElement)(
        IUIAutomation6 *This,
        IUIAutomationElement **element);

    HRESULT (STDMETHODCALLTYPE *GetRootElementBuildCache)(
        IUIAutomation6 *This,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **root);

    HRESULT (STDMETHODCALLTYPE *ElementFromHandleBuildCache)(
        IUIAutomation6 *This,
        UIA_HWND hwnd,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **element);

    HRESULT (STDMETHODCALLTYPE *ElementFromPointBuildCache)(
        IUIAutomation6 *This,
        POINT pt,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **element);

    HRESULT (STDMETHODCALLTYPE *GetFocusedElementBuildCache)(
        IUIAutomation6 *This,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **element);

    HRESULT (STDMETHODCALLTYPE *CreateTreeWalker)(
        IUIAutomation6 *This,
        IUIAutomationCondition *pCondition,
        IUIAutomationTreeWalker **walker);

    HRESULT (STDMETHODCALLTYPE *get_ControlViewWalker)(
        IUIAutomation6 *This,
        IUIAutomationTreeWalker **walker);

    HRESULT (STDMETHODCALLTYPE *get_ContentViewWalker)(
        IUIAutomation6 *This,
        IUIAutomationTreeWalker **walker);

    HRESULT (STDMETHODCALLTYPE *get_RawViewWalker)(
        IUIAutomation6 *This,
        IUIAutomationTreeWalker **walker);

    HRESULT (STDMETHODCALLTYPE *get_RawViewCondition)(
        IUIAutomation6 *This,
        IUIAutomationCondition **condition);

    HRESULT (STDMETHODCALLTYPE *get_ControlViewCondition)(
        IUIAutomation6 *This,
        IUIAutomationCondition **condition);

    HRESULT (STDMETHODCALLTYPE *get_ContentViewCondition)(
        IUIAutomation6 *This,
        IUIAutomationCondition **condition);

    HRESULT (STDMETHODCALLTYPE *CreateCacheRequest)(
        IUIAutomation6 *This,
        IUIAutomationCacheRequest **cacheRequest);

    HRESULT (STDMETHODCALLTYPE *CreateTrueCondition)(
        IUIAutomation6 *This,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreateFalseCondition)(
        IUIAutomation6 *This,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreatePropertyCondition)(
        IUIAutomation6 *This,
        PROPERTYID propertyId,
        VARIANT value,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreatePropertyConditionEx)(
        IUIAutomation6 *This,
        PROPERTYID propertyId,
        VARIANT value,
        enum PropertyConditionFlags flags,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreateAndCondition)(
        IUIAutomation6 *This,
        IUIAutomationCondition *condition1,
        IUIAutomationCondition *condition2,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreateAndConditionFromArray)(
        IUIAutomation6 *This,
        SAFEARRAY *conditions,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreateAndConditionFromNativeArray)(
        IUIAutomation6 *This,
        IUIAutomationCondition **conditions,
        int conditionCount,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreateOrCondition)(
        IUIAutomation6 *This,
        IUIAutomationCondition *condition1,
        IUIAutomationCondition *condition2,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreateOrConditionFromArray)(
        IUIAutomation6 *This,
        SAFEARRAY *conditions,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreateOrConditionFromNativeArray)(
        IUIAutomation6 *This,
        IUIAutomationCondition **conditions,
        int conditionCount,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *CreateNotCondition)(
        IUIAutomation6 *This,
        IUIAutomationCondition *condition,
        IUIAutomationCondition **newCondition);

    HRESULT (STDMETHODCALLTYPE *AddAutomationEventHandler)(
        IUIAutomation6 *This,
        EVENTID eventId,
        IUIAutomationElement *element,
        enum TreeScope scope,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *RemoveAutomationEventHandler)(
        IUIAutomation6 *This,
        EVENTID eventId,
        IUIAutomationElement *element,
        IUIAutomationEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *AddPropertyChangedEventHandlerNativeArray)(
        IUIAutomation6 *This,
        IUIAutomationElement *element,
        enum TreeScope scope,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationPropertyChangedEventHandler *handler,
        PROPERTYID *propertyArray,
        int propertyCount);

    HRESULT (STDMETHODCALLTYPE *AddPropertyChangedEventHandler)(
        IUIAutomation6 *This,
        IUIAutomationElement *element,
        enum TreeScope scope,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationPropertyChangedEventHandler *handler,
        SAFEARRAY *propertyArray);

    HRESULT (STDMETHODCALLTYPE *RemovePropertyChangedEventHandler)(
        IUIAutomation6 *This,
        IUIAutomationElement *element,
        IUIAutomationPropertyChangedEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *AddStructureChangedEventHandler)(
        IUIAutomation6 *This,
        IUIAutomationElement *element,
        enum TreeScope scope,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationStructureChangedEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *RemoveStructureChangedEventHandler)(
        IUIAutomation6 *This,
        IUIAutomationElement *element,
        IUIAutomationStructureChangedEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *AddFocusChangedEventHandler)(
        IUIAutomation6 *This,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationFocusChangedEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *RemoveFocusChangedEventHandler)(
        IUIAutomation6 *This,
        IUIAutomationFocusChangedEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *RemoveAllEventHandlers)(
        IUIAutomation6 *This);

    HRESULT (STDMETHODCALLTYPE *IntNativeArrayToSafeArray)(
        IUIAutomation6 *This,
        int *array,
        int arrayCount,
        SAFEARRAY **safeArray);

    HRESULT (STDMETHODCALLTYPE *IntSafeArrayToNativeArray)(
        IUIAutomation6 *This,
        SAFEARRAY *intArray,
        int **array,
        int *arrayCount);

    HRESULT (STDMETHODCALLTYPE *RectToVariant)(
        IUIAutomation6 *This,
        RECT rc,
        VARIANT *var);

    HRESULT (STDMETHODCALLTYPE *VariantToRect)(
        IUIAutomation6 *This,
        VARIANT var,
        RECT *rc);

    HRESULT (STDMETHODCALLTYPE *SafeArrayToRectNativeArray)(
        IUIAutomation6 *This,
        SAFEARRAY *rects,
        RECT **rectArray,
        int *rectArrayCount);

    HRESULT (STDMETHODCALLTYPE *CreateProxyFactoryEntry)(
        IUIAutomation6 *This,
        IUIAutomationProxyFactory *factory,
        IUIAutomationProxyFactoryEntry **factoryEntry);

    HRESULT (STDMETHODCALLTYPE *get_ProxyFactoryMapping)(
        IUIAutomation6 *This,
        IUIAutomationProxyFactoryMapping **factoryMapping);

    HRESULT (STDMETHODCALLTYPE *GetPropertyProgrammaticName)(
        IUIAutomation6 *This,
        PROPERTYID property,
        BSTR *name);

    HRESULT (STDMETHODCALLTYPE *GetPatternProgrammaticName)(
        IUIAutomation6 *This,
        PATTERNID pattern,
        BSTR *name);

    HRESULT (STDMETHODCALLTYPE *PollForPotentialSupportedPatterns)(
        IUIAutomation6 *This,
        IUIAutomationElement *pElement,
        SAFEARRAY **patternIds,
        SAFEARRAY **patternNames);

    HRESULT (STDMETHODCALLTYPE *PollForPotentialSupportedProperties)(
        IUIAutomation6 *This,
        IUIAutomationElement *pElement,
        SAFEARRAY **propertyIds,
        SAFEARRAY **propertyNames);

    HRESULT (STDMETHODCALLTYPE *CheckNotSupported)(
        IUIAutomation6 *This,
        VARIANT value,
        WINBOOL *isNotSupported);

    HRESULT (STDMETHODCALLTYPE *get_ReservedNotSupportedValue)(
        IUIAutomation6 *This,
        IUnknown **notSupportedValue);

    HRESULT (STDMETHODCALLTYPE *get_ReservedMixedAttributeValue)(
        IUIAutomation6 *This,
        IUnknown **mixedAttributeValue);

    HRESULT (STDMETHODCALLTYPE *ElementFromIAccessible)(
        IUIAutomation6 *This,
        IAccessible *accessible,
        int childId,
        IUIAutomationElement **element);

    HRESULT (STDMETHODCALLTYPE *ElementFromIAccessibleBuildCache)(
        IUIAutomation6 *This,
        IAccessible *accessible,
        int childId,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationElement **element);

    /*** IUIAutomation2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_AutoSetFocus)(
        IUIAutomation6 *This,
        WINBOOL *autoSetFocus);

    HRESULT (STDMETHODCALLTYPE *put_AutoSetFocus)(
        IUIAutomation6 *This,
        WINBOOL autoSetFocus);

    HRESULT (STDMETHODCALLTYPE *get_ConnectionTimeout)(
        IUIAutomation6 *This,
        DWORD *timeout);

    HRESULT (STDMETHODCALLTYPE *put_ConnectionTimeout)(
        IUIAutomation6 *This,
        DWORD timeout);

    HRESULT (STDMETHODCALLTYPE *get_TransactionTimeout)(
        IUIAutomation6 *This,
        DWORD *timeout);

    HRESULT (STDMETHODCALLTYPE *put_TransactionTimeout)(
        IUIAutomation6 *This,
        DWORD timeout);

    /*** IUIAutomation3 methods ***/
    HRESULT (STDMETHODCALLTYPE *AddTextEditTextChangedEventHandler)(
        IUIAutomation6 *This,
        IUIAutomationElement *element,
        enum TreeScope scope,
        enum TextEditChangeType textEditChangeType,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationTextEditTextChangedEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *RemoveTextEditTextChangedEventHandler)(
        IUIAutomation6 *This,
        IUIAutomationElement *element,
        IUIAutomationTextEditTextChangedEventHandler *handler);

    /*** IUIAutomation4 methods ***/
    HRESULT (STDMETHODCALLTYPE *AddChangesEventHandler)(
        IUIAutomation6 *This,
        IUIAutomationElement *element,
        enum TreeScope scope,
        int *changeTypes,
        int changesCount,
        IUIAutomationCacheRequest *pCacheRequest,
        IUIAutomationChangesEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *RemoveChangesEventHandler)(
        IUIAutomation6 *This,
        IUIAutomationElement *element,
        IUIAutomationChangesEventHandler *handler);

    /*** IUIAutomation5 methods ***/
    HRESULT (STDMETHODCALLTYPE *AddNotificationEventHandler)(
        IUIAutomation6 *This,
        IUIAutomationElement *element,
        enum TreeScope scope,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationNotificationEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *RemoveNotificationEventHandler)(
        IUIAutomation6 *This,
        IUIAutomationElement *element,
        IUIAutomationNotificationEventHandler *handler);

    /*** IUIAutomation6 methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateEventHandlerGroup)(
        IUIAutomation6 *This,
        IUIAutomationEventHandlerGroup **handlerGroup);

    HRESULT (STDMETHODCALLTYPE *AddEventHandlerGroup)(
        IUIAutomation6 *This,
        IUIAutomationElement *element,
        IUIAutomationEventHandlerGroup *handlerGroup);

    HRESULT (STDMETHODCALLTYPE *RemoveEventHandlerGroup)(
        IUIAutomation6 *This,
        IUIAutomationElement *element,
        IUIAutomationEventHandlerGroup *handlerGroup);

    HRESULT (STDMETHODCALLTYPE *get_ConnectionRecoveryBehavior)(
        IUIAutomation6 *This,
        enum ConnectionRecoveryBehaviorOptions *connectionRecoveryBehaviorOptions);

    HRESULT (STDMETHODCALLTYPE *put_ConnectionRecoveryBehavior)(
        IUIAutomation6 *This,
        enum ConnectionRecoveryBehaviorOptions connectionRecoveryBehaviorOptions);

    HRESULT (STDMETHODCALLTYPE *get_CoalesceEvents)(
        IUIAutomation6 *This,
        enum CoalesceEventsOptions *coalesceEventsOptions);

    HRESULT (STDMETHODCALLTYPE *put_CoalesceEvents)(
        IUIAutomation6 *This,
        enum CoalesceEventsOptions coalesceEventsOptions);

    HRESULT (STDMETHODCALLTYPE *AddActiveTextPositionChangedEventHandler)(
        IUIAutomation6 *This,
        IUIAutomationElement *element,
        enum TreeScope scope,
        IUIAutomationCacheRequest *cacheRequest,
        IUIAutomationActiveTextPositionChangedEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *RemoveActiveTextPositionChangedEventHandler)(
        IUIAutomation6 *This,
        IUIAutomationElement *element,
        IUIAutomationActiveTextPositionChangedEventHandler *handler);

    END_INTERFACE
} IUIAutomation6Vtbl;

interface IUIAutomation6 {
    CONST_VTBL IUIAutomation6Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAutomation6_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAutomation6_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAutomation6_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAutomation methods ***/
#define IUIAutomation6_CompareElements(This,el1,el2,areSame) (This)->lpVtbl->CompareElements(This,el1,el2,areSame)
#define IUIAutomation6_CompareRuntimeIds(This,runtimeId1,runtimeId2,areSame) (This)->lpVtbl->CompareRuntimeIds(This,runtimeId1,runtimeId2,areSame)
#define IUIAutomation6_GetRootElement(This,root) (This)->lpVtbl->GetRootElement(This,root)
#define IUIAutomation6_ElementFromHandle(This,hwnd,element) (This)->lpVtbl->ElementFromHandle(This,hwnd,element)
#define IUIAutomation6_ElementFromPoint(This,pt,element) (This)->lpVtbl->ElementFromPoint(This,pt,element)
#define IUIAutomation6_GetFocusedElement(This,element) (This)->lpVtbl->GetFocusedElement(This,element)
#define IUIAutomation6_GetRootElementBuildCache(This,cacheRequest,root) (This)->lpVtbl->GetRootElementBuildCache(This,cacheRequest,root)
#define IUIAutomation6_ElementFromHandleBuildCache(This,hwnd,cacheRequest,element) (This)->lpVtbl->ElementFromHandleBuildCache(This,hwnd,cacheRequest,element)
#define IUIAutomation6_ElementFromPointBuildCache(This,pt,cacheRequest,element) (This)->lpVtbl->ElementFromPointBuildCache(This,pt,cacheRequest,element)
#define IUIAutomation6_GetFocusedElementBuildCache(This,cacheRequest,element) (This)->lpVtbl->GetFocusedElementBuildCache(This,cacheRequest,element)
#define IUIAutomation6_CreateTreeWalker(This,pCondition,walker) (This)->lpVtbl->CreateTreeWalker(This,pCondition,walker)
#define IUIAutomation6_get_ControlViewWalker(This,walker) (This)->lpVtbl->get_ControlViewWalker(This,walker)
#define IUIAutomation6_get_ContentViewWalker(This,walker) (This)->lpVtbl->get_ContentViewWalker(This,walker)
#define IUIAutomation6_get_RawViewWalker(This,walker) (This)->lpVtbl->get_RawViewWalker(This,walker)
#define IUIAutomation6_get_RawViewCondition(This,condition) (This)->lpVtbl->get_RawViewCondition(This,condition)
#define IUIAutomation6_get_ControlViewCondition(This,condition) (This)->lpVtbl->get_ControlViewCondition(This,condition)
#define IUIAutomation6_get_ContentViewCondition(This,condition) (This)->lpVtbl->get_ContentViewCondition(This,condition)
#define IUIAutomation6_CreateCacheRequest(This,cacheRequest) (This)->lpVtbl->CreateCacheRequest(This,cacheRequest)
#define IUIAutomation6_CreateTrueCondition(This,newCondition) (This)->lpVtbl->CreateTrueCondition(This,newCondition)
#define IUIAutomation6_CreateFalseCondition(This,newCondition) (This)->lpVtbl->CreateFalseCondition(This,newCondition)
#define IUIAutomation6_CreatePropertyCondition(This,propertyId,value,newCondition) (This)->lpVtbl->CreatePropertyCondition(This,propertyId,value,newCondition)
#define IUIAutomation6_CreatePropertyConditionEx(This,propertyId,value,flags,newCondition) (This)->lpVtbl->CreatePropertyConditionEx(This,propertyId,value,flags,newCondition)
#define IUIAutomation6_CreateAndCondition(This,condition1,condition2,newCondition) (This)->lpVtbl->CreateAndCondition(This,condition1,condition2,newCondition)
#define IUIAutomation6_CreateAndConditionFromArray(This,conditions,newCondition) (This)->lpVtbl->CreateAndConditionFromArray(This,conditions,newCondition)
#define IUIAutomation6_CreateAndConditionFromNativeArray(This,conditions,conditionCount,newCondition) (This)->lpVtbl->CreateAndConditionFromNativeArray(This,conditions,conditionCount,newCondition)
#define IUIAutomation6_CreateOrCondition(This,condition1,condition2,newCondition) (This)->lpVtbl->CreateOrCondition(This,condition1,condition2,newCondition)
#define IUIAutomation6_CreateOrConditionFromArray(This,conditions,newCondition) (This)->lpVtbl->CreateOrConditionFromArray(This,conditions,newCondition)
#define IUIAutomation6_CreateOrConditionFromNativeArray(This,conditions,conditionCount,newCondition) (This)->lpVtbl->CreateOrConditionFromNativeArray(This,conditions,conditionCount,newCondition)
#define IUIAutomation6_CreateNotCondition(This,condition,newCondition) (This)->lpVtbl->CreateNotCondition(This,condition,newCondition)
#define IUIAutomation6_AddAutomationEventHandler(This,eventId,element,scope,cacheRequest,handler) (This)->lpVtbl->AddAutomationEventHandler(This,eventId,element,scope,cacheRequest,handler)
#define IUIAutomation6_RemoveAutomationEventHandler(This,eventId,element,handler) (This)->lpVtbl->RemoveAutomationEventHandler(This,eventId,element,handler)
#define IUIAutomation6_AddPropertyChangedEventHandlerNativeArray(This,element,scope,cacheRequest,handler,propertyArray,propertyCount) (This)->lpVtbl->AddPropertyChangedEventHandlerNativeArray(This,element,scope,cacheRequest,handler,propertyArray,propertyCount)
#define IUIAutomation6_AddPropertyChangedEventHandler(This,element,scope,cacheRequest,handler,propertyArray) (This)->lpVtbl->AddPropertyChangedEventHandler(This,element,scope,cacheRequest,handler,propertyArray)
#define IUIAutomation6_RemovePropertyChangedEventHandler(This,element,handler) (This)->lpVtbl->RemovePropertyChangedEventHandler(This,element,handler)
#define IUIAutomation6_AddStructureChangedEventHandler(This,element,scope,cacheRequest,handler) (This)->lpVtbl->AddStructureChangedEventHandler(This,element,scope,cacheRequest,handler)
#define IUIAutomation6_RemoveStructureChangedEventHandler(This,element,handler) (This)->lpVtbl->RemoveStructureChangedEventHandler(This,element,handler)
#define IUIAutomation6_AddFocusChangedEventHandler(This,cacheRequest,handler) (This)->lpVtbl->AddFocusChangedEventHandler(This,cacheRequest,handler)
#define IUIAutomation6_RemoveFocusChangedEventHandler(This,handler) (This)->lpVtbl->RemoveFocusChangedEventHandler(This,handler)
#define IUIAutomation6_RemoveAllEventHandlers(This) (This)->lpVtbl->RemoveAllEventHandlers(This)
#define IUIAutomation6_IntNativeArrayToSafeArray(This,array,arrayCount,safeArray) (This)->lpVtbl->IntNativeArrayToSafeArray(This,array,arrayCount,safeArray)
#define IUIAutomation6_IntSafeArrayToNativeArray(This,intArray,array,arrayCount) (This)->lpVtbl->IntSafeArrayToNativeArray(This,intArray,array,arrayCount)
#define IUIAutomation6_RectToVariant(This,rc,var) (This)->lpVtbl->RectToVariant(This,rc,var)
#define IUIAutomation6_VariantToRect(This,var,rc) (This)->lpVtbl->VariantToRect(This,var,rc)
#define IUIAutomation6_SafeArrayToRectNativeArray(This,rects,rectArray,rectArrayCount) (This)->lpVtbl->SafeArrayToRectNativeArray(This,rects,rectArray,rectArrayCount)
#define IUIAutomation6_CreateProxyFactoryEntry(This,factory,factoryEntry) (This)->lpVtbl->CreateProxyFactoryEntry(This,factory,factoryEntry)
#define IUIAutomation6_get_ProxyFactoryMapping(This,factoryMapping) (This)->lpVtbl->get_ProxyFactoryMapping(This,factoryMapping)
#define IUIAutomation6_GetPropertyProgrammaticName(This,property,name) (This)->lpVtbl->GetPropertyProgrammaticName(This,property,name)
#define IUIAutomation6_GetPatternProgrammaticName(This,pattern,name) (This)->lpVtbl->GetPatternProgrammaticName(This,pattern,name)
#define IUIAutomation6_PollForPotentialSupportedPatterns(This,pElement,patternIds,patternNames) (This)->lpVtbl->PollForPotentialSupportedPatterns(This,pElement,patternIds,patternNames)
#define IUIAutomation6_PollForPotentialSupportedProperties(This,pElement,propertyIds,propertyNames) (This)->lpVtbl->PollForPotentialSupportedProperties(This,pElement,propertyIds,propertyNames)
#define IUIAutomation6_CheckNotSupported(This,value,isNotSupported) (This)->lpVtbl->CheckNotSupported(This,value,isNotSupported)
#define IUIAutomation6_get_ReservedNotSupportedValue(This,notSupportedValue) (This)->lpVtbl->get_ReservedNotSupportedValue(This,notSupportedValue)
#define IUIAutomation6_get_ReservedMixedAttributeValue(This,mixedAttributeValue) (This)->lpVtbl->get_ReservedMixedAttributeValue(This,mixedAttributeValue)
#define IUIAutomation6_ElementFromIAccessible(This,accessible,childId,element) (This)->lpVtbl->ElementFromIAccessible(This,accessible,childId,element)
#define IUIAutomation6_ElementFromIAccessibleBuildCache(This,accessible,childId,cacheRequest,element) (This)->lpVtbl->ElementFromIAccessibleBuildCache(This,accessible,childId,cacheRequest,element)
/*** IUIAutomation2 methods ***/
#define IUIAutomation6_get_AutoSetFocus(This,autoSetFocus) (This)->lpVtbl->get_AutoSetFocus(This,autoSetFocus)
#define IUIAutomation6_put_AutoSetFocus(This,autoSetFocus) (This)->lpVtbl->put_AutoSetFocus(This,autoSetFocus)
#define IUIAutomation6_get_ConnectionTimeout(This,timeout) (This)->lpVtbl->get_ConnectionTimeout(This,timeout)
#define IUIAutomation6_put_ConnectionTimeout(This,timeout) (This)->lpVtbl->put_ConnectionTimeout(This,timeout)
#define IUIAutomation6_get_TransactionTimeout(This,timeout) (This)->lpVtbl->get_TransactionTimeout(This,timeout)
#define IUIAutomation6_put_TransactionTimeout(This,timeout) (This)->lpVtbl->put_TransactionTimeout(This,timeout)
/*** IUIAutomation3 methods ***/
#define IUIAutomation6_AddTextEditTextChangedEventHandler(This,element,scope,textEditChangeType,cacheRequest,handler) (This)->lpVtbl->AddTextEditTextChangedEventHandler(This,element,scope,textEditChangeType,cacheRequest,handler)
#define IUIAutomation6_RemoveTextEditTextChangedEventHandler(This,element,handler) (This)->lpVtbl->RemoveTextEditTextChangedEventHandler(This,element,handler)
/*** IUIAutomation4 methods ***/
#define IUIAutomation6_AddChangesEventHandler(This,element,scope,changeTypes,changesCount,pCacheRequest,handler) (This)->lpVtbl->AddChangesEventHandler(This,element,scope,changeTypes,changesCount,pCacheRequest,handler)
#define IUIAutomation6_RemoveChangesEventHandler(This,element,handler) (This)->lpVtbl->RemoveChangesEventHandler(This,element,handler)
/*** IUIAutomation5 methods ***/
#define IUIAutomation6_AddNotificationEventHandler(This,element,scope,cacheRequest,handler) (This)->lpVtbl->AddNotificationEventHandler(This,element,scope,cacheRequest,handler)
#define IUIAutomation6_RemoveNotificationEventHandler(This,element,handler) (This)->lpVtbl->RemoveNotificationEventHandler(This,element,handler)
/*** IUIAutomation6 methods ***/
#define IUIAutomation6_CreateEventHandlerGroup(This,handlerGroup) (This)->lpVtbl->CreateEventHandlerGroup(This,handlerGroup)
#define IUIAutomation6_AddEventHandlerGroup(This,element,handlerGroup) (This)->lpVtbl->AddEventHandlerGroup(This,element,handlerGroup)
#define IUIAutomation6_RemoveEventHandlerGroup(This,element,handlerGroup) (This)->lpVtbl->RemoveEventHandlerGroup(This,element,handlerGroup)
#define IUIAutomation6_get_ConnectionRecoveryBehavior(This,connectionRecoveryBehaviorOptions) (This)->lpVtbl->get_ConnectionRecoveryBehavior(This,connectionRecoveryBehaviorOptions)
#define IUIAutomation6_put_ConnectionRecoveryBehavior(This,connectionRecoveryBehaviorOptions) (This)->lpVtbl->put_ConnectionRecoveryBehavior(This,connectionRecoveryBehaviorOptions)
#define IUIAutomation6_get_CoalesceEvents(This,coalesceEventsOptions) (This)->lpVtbl->get_CoalesceEvents(This,coalesceEventsOptions)
#define IUIAutomation6_put_CoalesceEvents(This,coalesceEventsOptions) (This)->lpVtbl->put_CoalesceEvents(This,coalesceEventsOptions)
#define IUIAutomation6_AddActiveTextPositionChangedEventHandler(This,element,scope,cacheRequest,handler) (This)->lpVtbl->AddActiveTextPositionChangedEventHandler(This,element,scope,cacheRequest,handler)
#define IUIAutomation6_RemoveActiveTextPositionChangedEventHandler(This,element,handler) (This)->lpVtbl->RemoveActiveTextPositionChangedEventHandler(This,element,handler)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IUIAutomation6_QueryInterface(IUIAutomation6* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IUIAutomation6_AddRef(IUIAutomation6* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IUIAutomation6_Release(IUIAutomation6* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomation methods ***/
static __WIDL_INLINE HRESULT IUIAutomation6_CompareElements(IUIAutomation6* This,IUIAutomationElement *el1,IUIAutomationElement *el2,WINBOOL *areSame) {
    return This->lpVtbl->CompareElements(This,el1,el2,areSame);
}
static __WIDL_INLINE HRESULT IUIAutomation6_CompareRuntimeIds(IUIAutomation6* This,SAFEARRAY *runtimeId1,SAFEARRAY *runtimeId2,WINBOOL *areSame) {
    return This->lpVtbl->CompareRuntimeIds(This,runtimeId1,runtimeId2,areSame);
}
static __WIDL_INLINE HRESULT IUIAutomation6_GetRootElement(IUIAutomation6* This,IUIAutomationElement **root) {
    return This->lpVtbl->GetRootElement(This,root);
}
static __WIDL_INLINE HRESULT IUIAutomation6_ElementFromHandle(IUIAutomation6* This,UIA_HWND hwnd,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromHandle(This,hwnd,element);
}
static __WIDL_INLINE HRESULT IUIAutomation6_ElementFromPoint(IUIAutomation6* This,POINT pt,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromPoint(This,pt,element);
}
static __WIDL_INLINE HRESULT IUIAutomation6_GetFocusedElement(IUIAutomation6* This,IUIAutomationElement **element) {
    return This->lpVtbl->GetFocusedElement(This,element);
}
static __WIDL_INLINE HRESULT IUIAutomation6_GetRootElementBuildCache(IUIAutomation6* This,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **root) {
    return This->lpVtbl->GetRootElementBuildCache(This,cacheRequest,root);
}
static __WIDL_INLINE HRESULT IUIAutomation6_ElementFromHandleBuildCache(IUIAutomation6* This,UIA_HWND hwnd,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromHandleBuildCache(This,hwnd,cacheRequest,element);
}
static __WIDL_INLINE HRESULT IUIAutomation6_ElementFromPointBuildCache(IUIAutomation6* This,POINT pt,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromPointBuildCache(This,pt,cacheRequest,element);
}
static __WIDL_INLINE HRESULT IUIAutomation6_GetFocusedElementBuildCache(IUIAutomation6* This,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **element) {
    return This->lpVtbl->GetFocusedElementBuildCache(This,cacheRequest,element);
}
static __WIDL_INLINE HRESULT IUIAutomation6_CreateTreeWalker(IUIAutomation6* This,IUIAutomationCondition *pCondition,IUIAutomationTreeWalker **walker) {
    return This->lpVtbl->CreateTreeWalker(This,pCondition,walker);
}
static __WIDL_INLINE HRESULT IUIAutomation6_get_ControlViewWalker(IUIAutomation6* This,IUIAutomationTreeWalker **walker) {
    return This->lpVtbl->get_ControlViewWalker(This,walker);
}
static __WIDL_INLINE HRESULT IUIAutomation6_get_ContentViewWalker(IUIAutomation6* This,IUIAutomationTreeWalker **walker) {
    return This->lpVtbl->get_ContentViewWalker(This,walker);
}
static __WIDL_INLINE HRESULT IUIAutomation6_get_RawViewWalker(IUIAutomation6* This,IUIAutomationTreeWalker **walker) {
    return This->lpVtbl->get_RawViewWalker(This,walker);
}
static __WIDL_INLINE HRESULT IUIAutomation6_get_RawViewCondition(IUIAutomation6* This,IUIAutomationCondition **condition) {
    return This->lpVtbl->get_RawViewCondition(This,condition);
}
static __WIDL_INLINE HRESULT IUIAutomation6_get_ControlViewCondition(IUIAutomation6* This,IUIAutomationCondition **condition) {
    return This->lpVtbl->get_ControlViewCondition(This,condition);
}
static __WIDL_INLINE HRESULT IUIAutomation6_get_ContentViewCondition(IUIAutomation6* This,IUIAutomationCondition **condition) {
    return This->lpVtbl->get_ContentViewCondition(This,condition);
}
static __WIDL_INLINE HRESULT IUIAutomation6_CreateCacheRequest(IUIAutomation6* This,IUIAutomationCacheRequest **cacheRequest) {
    return This->lpVtbl->CreateCacheRequest(This,cacheRequest);
}
static __WIDL_INLINE HRESULT IUIAutomation6_CreateTrueCondition(IUIAutomation6* This,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateTrueCondition(This,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation6_CreateFalseCondition(IUIAutomation6* This,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateFalseCondition(This,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation6_CreatePropertyCondition(IUIAutomation6* This,PROPERTYID propertyId,VARIANT value,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreatePropertyCondition(This,propertyId,value,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation6_CreatePropertyConditionEx(IUIAutomation6* This,PROPERTYID propertyId,VARIANT value,enum PropertyConditionFlags flags,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreatePropertyConditionEx(This,propertyId,value,flags,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation6_CreateAndCondition(IUIAutomation6* This,IUIAutomationCondition *condition1,IUIAutomationCondition *condition2,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateAndCondition(This,condition1,condition2,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation6_CreateAndConditionFromArray(IUIAutomation6* This,SAFEARRAY *conditions,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateAndConditionFromArray(This,conditions,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation6_CreateAndConditionFromNativeArray(IUIAutomation6* This,IUIAutomationCondition **conditions,int conditionCount,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateAndConditionFromNativeArray(This,conditions,conditionCount,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation6_CreateOrCondition(IUIAutomation6* This,IUIAutomationCondition *condition1,IUIAutomationCondition *condition2,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateOrCondition(This,condition1,condition2,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation6_CreateOrConditionFromArray(IUIAutomation6* This,SAFEARRAY *conditions,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateOrConditionFromArray(This,conditions,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation6_CreateOrConditionFromNativeArray(IUIAutomation6* This,IUIAutomationCondition **conditions,int conditionCount,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateOrConditionFromNativeArray(This,conditions,conditionCount,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation6_CreateNotCondition(IUIAutomation6* This,IUIAutomationCondition *condition,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateNotCondition(This,condition,newCondition);
}
static __WIDL_INLINE HRESULT IUIAutomation6_AddAutomationEventHandler(IUIAutomation6* This,EVENTID eventId,IUIAutomationElement *element,enum TreeScope scope,IUIAutomationCacheRequest *cacheRequest,IUIAutomationEventHandler *handler) {
    return This->lpVtbl->AddAutomationEventHandler(This,eventId,element,scope,cacheRequest,handler);
}
static __WIDL_INLINE HRESULT IUIAutomation6_RemoveAutomationEventHandler(IUIAutomation6* This,EVENTID eventId,IUIAutomationElement *element,IUIAutomationEventHandler *handler) {
    return This->lpVtbl->RemoveAutomationEventHandler(This,eventId,element,handler);
}
static __WIDL_INLINE HRESULT IUIAutomation6_AddPropertyChangedEventHandlerNativeArray(IUIAutomation6* This,IUIAutomationElement *element,enum TreeScope scope,IUIAutomationCacheRequest *cacheRequest,IUIAutomationPropertyChangedEventHandler *handler,PROPERTYID *propertyArray,int propertyCount) {
    return This->lpVtbl->AddPropertyChangedEventHandlerNativeArray(This,element,scope,cacheRequest,handler,propertyArray,propertyCount);
}
static __WIDL_INLINE HRESULT IUIAutomation6_AddPropertyChangedEventHandler(IUIAutomation6* This,IUIAutomationElement *element,enum TreeScope scope,IUIAutomationCacheRequest *cacheRequest,IUIAutomationPropertyChangedEventHandler *handler,SAFEARRAY *propertyArray) {
    return This->lpVtbl->AddPropertyChangedEventHandler(This,element,scope,cacheRequest,handler,propertyArray);
}
static __WIDL_INLINE HRESULT IUIAutomation6_RemovePropertyChangedEventHandler(IUIAutomation6* This,IUIAutomationElement *element,IUIAutomationPropertyChangedEventHandler *handler) {
    return This->lpVtbl->RemovePropertyChangedEventHandler(This,element,handler);
}
static __WIDL_INLINE HRESULT IUIAutomation6_AddStructureChangedEventHandler(IUIAutomation6* This,IUIAutomationElement *element,enum TreeScope scope,IUIAutomationCacheRequest *cacheRequest,IUIAutomationStructureChangedEventHandler *handler) {
    return This->lpVtbl->AddStructureChangedEventHandler(This,element,scope,cacheRequest,handler);
}
static __WIDL_INLINE HRESULT IUIAutomation6_RemoveStructureChangedEventHandler(IUIAutomation6* This,IUIAutomationElement *element,IUIAutomationStructureChangedEventHandler *handler) {
    return This->lpVtbl->RemoveStructureChangedEventHandler(This,element,handler);
}
static __WIDL_INLINE HRESULT IUIAutomation6_AddFocusChangedEventHandler(IUIAutomation6* This,IUIAutomationCacheRequest *cacheRequest,IUIAutomationFocusChangedEventHandler *handler) {
    return This->lpVtbl->AddFocusChangedEventHandler(This,cacheRequest,handler);
}
static __WIDL_INLINE HRESULT IUIAutomation6_RemoveFocusChangedEventHandler(IUIAutomation6* This,IUIAutomationFocusChangedEventHandler *handler) {
    return This->lpVtbl->RemoveFocusChangedEventHandler(This,handler);
}
static __WIDL_INLINE HRESULT IUIAutomation6_RemoveAllEventHandlers(IUIAutomation6* This) {
    return This->lpVtbl->RemoveAllEventHandlers(This);
}
static __WIDL_INLINE HRESULT IUIAutomation6_IntNativeArrayToSafeArray(IUIAutomation6* This,int *array,int arrayCount,SAFEARRAY **safeArray) {
    return This->lpVtbl->IntNativeArrayToSafeArray(This,array,arrayCount,safeArray);
}
static __WIDL_INLINE HRESULT IUIAutomation6_IntSafeArrayToNativeArray(IUIAutomation6* This,SAFEARRAY *intArray,int **array,int *arrayCount) {
    return This->lpVtbl->IntSafeArrayToNativeArray(This,intArray,array,arrayCount);
}
static __WIDL_INLINE HRESULT IUIAutomation6_RectToVariant(IUIAutomation6* This,RECT rc,VARIANT *var) {
    return This->lpVtbl->RectToVariant(This,rc,var);
}
static __WIDL_INLINE HRESULT IUIAutomation6_VariantToRect(IUIAutomation6* This,VARIANT var,RECT *rc) {
    return This->lpVtbl->VariantToRect(This,var,rc);
}
static __WIDL_INLINE HRESULT IUIAutomation6_SafeArrayToRectNativeArray(IUIAutomation6* This,SAFEARRAY *rects,RECT **rectArray,int *rectArrayCount) {
    return This->lpVtbl->SafeArrayToRectNativeArray(This,rects,rectArray,rectArrayCount);
}
static __WIDL_INLINE HRESULT IUIAutomation6_CreateProxyFactoryEntry(IUIAutomation6* This,IUIAutomationProxyFactory *factory,IUIAutomationProxyFactoryEntry **factoryEntry) {
    return This->lpVtbl->CreateProxyFactoryEntry(This,factory,factoryEntry);
}
static __WIDL_INLINE HRESULT IUIAutomation6_get_ProxyFactoryMapping(IUIAutomation6* This,IUIAutomationProxyFactoryMapping **factoryMapping) {
    return This->lpVtbl->get_ProxyFactoryMapping(This,factoryMapping);
}
static __WIDL_INLINE HRESULT IUIAutomation6_GetPropertyProgrammaticName(IUIAutomation6* This,PROPERTYID property,BSTR *name) {
    return This->lpVtbl->GetPropertyProgrammaticName(This,property,name);
}
static __WIDL_INLINE HRESULT IUIAutomation6_GetPatternProgrammaticName(IUIAutomation6* This,PATTERNID pattern,BSTR *name) {
    return This->lpVtbl->GetPatternProgrammaticName(This,pattern,name);
}
static __WIDL_INLINE HRESULT IUIAutomation6_PollForPotentialSupportedPatterns(IUIAutomation6* This,IUIAutomationElement *pElement,SAFEARRAY **patternIds,SAFEARRAY **patternNames) {
    return This->lpVtbl->PollForPotentialSupportedPatterns(This,pElement,patternIds,patternNames);
}
static __WIDL_INLINE HRESULT IUIAutomation6_PollForPotentialSupportedProperties(IUIAutomation6* This,IUIAutomationElement *pElement,SAFEARRAY **propertyIds,SAFEARRAY **propertyNames) {
    return This->lpVtbl->PollForPotentialSupportedProperties(This,pElement,propertyIds,propertyNames);
}
static __WIDL_INLINE HRESULT IUIAutomation6_CheckNotSupported(IUIAutomation6* This,VARIANT value,WINBOOL *isNotSupported) {
    return This->lpVtbl->CheckNotSupported(This,value,isNotSupported);
}
static __WIDL_INLINE HRESULT IUIAutomation6_get_ReservedNotSupportedValue(IUIAutomation6* This,IUnknown **notSupportedValue) {
    return This->lpVtbl->get_ReservedNotSupportedValue(This,notSupportedValue);
}
static __WIDL_INLINE HRESULT IUIAutomation6_get_ReservedMixedAttributeValue(IUIAutomation6* This,IUnknown **mixedAttributeValue) {
    return This->lpVtbl->get_ReservedMixedAttributeValue(This,mixedAttributeValue);
}
static __WIDL_INLINE HRESULT IUIAutomation6_ElementFromIAccessible(IUIAutomation6* This,IAccessible *accessible,int childId,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromIAccessible(This,accessible,childId,element);
}
static __WIDL_INLINE HRESULT IUIAutomation6_ElementFromIAccessibleBuildCache(IUIAutomation6* This,IAccessible *accessible,int childId,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromIAccessibleBuildCache(This,accessible,childId,cacheRequest,element);
}
/*** IUIAutomation2 methods ***/
static __WIDL_INLINE HRESULT IUIAutomation6_get_AutoSetFocus(IUIAutomation6* This,WINBOOL *autoSetFocus) {
    return This->lpVtbl->get_AutoSetFocus(This,autoSetFocus);
}
static __WIDL_INLINE HRESULT IUIAutomation6_put_AutoSetFocus(IUIAutomation6* This,WINBOOL autoSetFocus) {
    return This->lpVtbl->put_AutoSetFocus(This,autoSetFocus);
}
static __WIDL_INLINE HRESULT IUIAutomation6_get_ConnectionTimeout(IUIAutomation6* This,DWORD *timeout) {
    return This->lpVtbl->get_ConnectionTimeout(This,timeout);
}
static __WIDL_INLINE HRESULT IUIAutomation6_put_ConnectionTimeout(IUIAutomation6* This,DWORD timeout) {
    return This->lpVtbl->put_ConnectionTimeout(This,timeout);
}
static __WIDL_INLINE HRESULT IUIAutomation6_get_TransactionTimeout(IUIAutomation6* This,DWORD *timeout) {
    return This->lpVtbl->get_TransactionTimeout(This,timeout);
}
static __WIDL_INLINE HRESULT IUIAutomation6_put_TransactionTimeout(IUIAutomation6* This,DWORD timeout) {
    return This->lpVtbl->put_TransactionTimeout(This,timeout);
}
/*** IUIAutomation3 methods ***/
static __WIDL_INLINE HRESULT IUIAutomation6_AddTextEditTextChangedEventHandler(IUIAutomation6* This,IUIAutomationElement *element,enum TreeScope scope,enum TextEditChangeType textEditChangeType,IUIAutomationCacheRequest *cacheRequest,IUIAutomationTextEditTextChangedEventHandler *handler) {
    return This->lpVtbl->AddTextEditTextChangedEventHandler(This,element,scope,textEditChangeType,cacheRequest,handler);
}
static __WIDL_INLINE HRESULT IUIAutomation6_RemoveTextEditTextChangedEventHandler(IUIAutomation6* This,IUIAutomationElement *element,IUIAutomationTextEditTextChangedEventHandler *handler) {
    return This->lpVtbl->RemoveTextEditTextChangedEventHandler(This,element,handler);
}
/*** IUIAutomation4 methods ***/
static __WIDL_INLINE HRESULT IUIAutomation6_AddChangesEventHandler(IUIAutomation6* This,IUIAutomationElement *element,enum TreeScope scope,int *changeTypes,int changesCount,IUIAutomationCacheRequest *pCacheRequest,IUIAutomationChangesEventHandler *handler) {
    return This->lpVtbl->AddChangesEventHandler(This,element,scope,changeTypes,changesCount,pCacheRequest,handler);
}
static __WIDL_INLINE HRESULT IUIAutomation6_RemoveChangesEventHandler(IUIAutomation6* This,IUIAutomationElement *element,IUIAutomationChangesEventHandler *handler) {
    return This->lpVtbl->RemoveChangesEventHandler(This,element,handler);
}
/*** IUIAutomation5 methods ***/
static __WIDL_INLINE HRESULT IUIAutomation6_AddNotificationEventHandler(IUIAutomation6* This,IUIAutomationElement *element,enum TreeScope scope,IUIAutomationCacheRequest *cacheRequest,IUIAutomationNotificationEventHandler *handler) {
    return This->lpVtbl->AddNotificationEventHandler(This,element,scope,cacheRequest,handler);
}
static __WIDL_INLINE HRESULT IUIAutomation6_RemoveNotificationEventHandler(IUIAutomation6* This,IUIAutomationElement *element,IUIAutomationNotificationEventHandler *handler) {
    return This->lpVtbl->RemoveNotificationEventHandler(This,element,handler);
}
/*** IUIAutomation6 methods ***/
static __WIDL_INLINE HRESULT IUIAutomation6_CreateEventHandlerGroup(IUIAutomation6* This,IUIAutomationEventHandlerGroup **handlerGroup) {
    return This->lpVtbl->CreateEventHandlerGroup(This,handlerGroup);
}
static __WIDL_INLINE HRESULT IUIAutomation6_AddEventHandlerGroup(IUIAutomation6* This,IUIAutomationElement *element,IUIAutomationEventHandlerGroup *handlerGroup) {
    return This->lpVtbl->AddEventHandlerGroup(This,element,handlerGroup);
}
static __WIDL_INLINE HRESULT IUIAutomation6_RemoveEventHandlerGroup(IUIAutomation6* This,IUIAutomationElement *element,IUIAutomationEventHandlerGroup *handlerGroup) {
    return This->lpVtbl->RemoveEventHandlerGroup(This,element,handlerGroup);
}
static __WIDL_INLINE HRESULT IUIAutomation6_get_ConnectionRecoveryBehavior(IUIAutomation6* This,enum ConnectionRecoveryBehaviorOptions *connectionRecoveryBehaviorOptions) {
    return This->lpVtbl->get_ConnectionRecoveryBehavior(This,connectionRecoveryBehaviorOptions);
}
static __WIDL_INLINE HRESULT IUIAutomation6_put_ConnectionRecoveryBehavior(IUIAutomation6* This,enum ConnectionRecoveryBehaviorOptions connectionRecoveryBehaviorOptions) {
    return This->lpVtbl->put_ConnectionRecoveryBehavior(This,connectionRecoveryBehaviorOptions);
}
static __WIDL_INLINE HRESULT IUIAutomation6_get_CoalesceEvents(IUIAutomation6* This,enum CoalesceEventsOptions *coalesceEventsOptions) {
    return This->lpVtbl->get_CoalesceEvents(This,coalesceEventsOptions);
}
static __WIDL_INLINE HRESULT IUIAutomation6_put_CoalesceEvents(IUIAutomation6* This,enum CoalesceEventsOptions coalesceEventsOptions) {
    return This->lpVtbl->put_CoalesceEvents(This,coalesceEventsOptions);
}
static __WIDL_INLINE HRESULT IUIAutomation6_AddActiveTextPositionChangedEventHandler(IUIAutomation6* This,IUIAutomationElement *element,enum TreeScope scope,IUIAutomationCacheRequest *cacheRequest,IUIAutomationActiveTextPositionChangedEventHandler *handler) {
    return This->lpVtbl->AddActiveTextPositionChangedEventHandler(This,element,scope,cacheRequest,handler);
}
static __WIDL_INLINE HRESULT IUIAutomation6_RemoveActiveTextPositionChangedEventHandler(IUIAutomation6* This,IUIAutomationElement *element,IUIAutomationActiveTextPositionChangedEventHandler *handler) {
    return This->lpVtbl->RemoveActiveTextPositionChangedEventHandler(This,element,handler);
}
#endif
#endif

#endif


#endif  /* __IUIAutomation6_INTERFACE_DEFINED__ */

/*****************************************************************************
 * CUIAutomation coclass
 */

DEFINE_GUID(CLSID_CUIAutomation, 0xff48dba4, 0x60ef, 0x4201, 0xaa,0x87, 0x54,0x10,0x3e,0xef,0x59,0x4e);

#ifdef __cplusplus
class DECLSPEC_UUID("ff48dba4-60ef-4201-aa87-54103eef594e") CUIAutomation;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(CUIAutomation, 0xff48dba4, 0x60ef, 0x4201, 0xaa,0x87, 0x54,0x10,0x3e,0xef,0x59,0x4e)
#endif
#endif

/*****************************************************************************
 * CUIAutomation8 coclass
 */

DEFINE_GUID(CLSID_CUIAutomation8, 0xe22ad333, 0xb25f, 0x460c, 0x83,0xd0, 0x05,0x81,0x10,0x73,0x95,0xc9);

#ifdef __cplusplus
class DECLSPEC_UUID("e22ad333-b25f-460c-83d0-0581107395c9") CUIAutomation8;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(CUIAutomation8, 0xe22ad333, 0xb25f, 0x460c, 0x83,0xd0, 0x05,0x81,0x10,0x73,0x95,0xc9)
#endif
#endif

#endif /* __UIAutomationClient_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 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 /* __uiautomationclient_h__ */
