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