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

/* 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);

#ifndef __UIA_PatternIds_MODULE_DEFINED__
#define __UIA_PatternIds_MODULE_DEFINED__
#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)

#endif /* __UIA_PatternIds_MODULE_DEFINED__ */
#ifndef __UIA_EventIds_MODULE_DEFINED__
#define __UIA_EventIds_MODULE_DEFINED__
#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)

#endif /* __UIA_EventIds_MODULE_DEFINED__ */
#ifndef __UIA_PropertyIds_MODULE_DEFINED__
#define __UIA_PropertyIds_MODULE_DEFINED__
#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)

#endif /* __UIA_PropertyIds_MODULE_DEFINED__ */
#ifndef __UIA_TextAttributeIds_MODULE_DEFINED__
#define __UIA_TextAttributeIds_MODULE_DEFINED__
#define UIA_AnimationStyleAttributeId (40000)

#define UIA_BackgroundColorAttributeId (40001)

#define UIA_BulletStyleAttributeId (40002)

#define UIA_CapStyleAttributeId (40003)

#define UIA_CultureAttributeId (40004)

#define UIA_FontNameAttributeId (40005)

#define UIA_FontSizeAttributeId (40006)

#define UIA_FontWeightAttributeId (40007)

#define UIA_ForegroundColorAttributeId (40008)

#define UIA_HorizontalTextAlignmentAttributeId (40009)

#define UIA_IndentationFirstLineAttributeId (40010)

#define UIA_IndentationLeadingAttributeId (40011)

#define UIA_IndentationTrailingAttributeId (40012)

#define UIA_IsHiddenAttributeId (40013)

#define UIA_IsItalicAttributeId (40014)

#define UIA_IsReadOnlyAttributeId (40015)

#define UIA_IsSubscriptAttributeId (40016)

#define UIA_IsSuperscriptAttributeId (40017)

#define UIA_MarginBottomAttributeId (40018)

#define UIA_MarginLeadingAttributeId (40019)

#define UIA_MarginTopAttributeId (40020)

#define UIA_MarginTrailingAttributeId (40021)

#define UIA_OutlineStylesAttributeId (40022)

#define UIA_OverlineColorAttributeId (40023)

#define UIA_OverlineStyleAttributeId (40024)

#define UIA_StrikethroughColorAttributeId (40025)

#define UIA_StrikethroughStyleAttributeId (40026)

#define UIA_TabsAttributeId (40027)

#define UIA_TextFlowDirectionsAttributeId (40028)

#define UIA_UnderlineColorAttributeId (40029)

#define UIA_UnderlineStyleAttributeId (40030)

#define UIA_AnnotationTypesAttributeId (40031)

#define UIA_AnnotationObjectsAttributeId (40032)

#define UIA_StyleNameAttributeId (40033)

#define UIA_StyleIdAttributeId (40034)

#define UIA_LinkAttributeId (40035)

#define UIA_IsActiveAttributeId (40036)

#define UIA_SelectionActiveEndAttributeId (40037)

#define UIA_CaretPositionAttributeId (40038)

#define UIA_CaretBidiModeAttributeId (40039)

#define UIA_LineSpacingAttributeId (40040)

#define UIA_BeforeParagraphSpacingAttributeId (40041)

#define UIA_AfterParagraphSpacingAttributeId (40042)

#define UIA_SayAsInterpretAsAttributeId (40043)

#endif /* __UIA_TextAttributeIds_MODULE_DEFINED__ */
#ifndef __UIA_ControlTypeIds_MODULE_DEFINED__
#define __UIA_ControlTypeIds_MODULE_DEFINED__
#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)

#endif /* __UIA_ControlTypeIds_MODULE_DEFINED__ */
#ifndef __UIA_AnnotationTypes_MODULE_DEFINED__
#define __UIA_AnnotationTypes_MODULE_DEFINED__
#define AnnotationType_Unknown (60000)

#define AnnotationType_SpellingError (60001)

#define AnnotationType_GrammarError (60002)

#define AnnotationType_Comment (60003)

#define AnnotationType_FormulaError (60004)

#define AnnotationType_TrackChanges (60005)

#define AnnotationType_Header (60006)

#define AnnotationType_Footer (60007)

#define AnnotationType_Highlighted (60008)

#define AnnotationType_Endnote (60009)

#define AnnotationType_Footnote (60010)

#define AnnotationType_InsertionChange (60011)

#define AnnotationType_DeletionChange (60012)

#define AnnotationType_MoveChange (60013)

#define AnnotationType_FormatChange (60014)

#define AnnotationType_UnsyncedChange (60015)

#define AnnotationType_EditingLockedChange (60016)

#define AnnotationType_ExternalChange (60017)

#define AnnotationType_ConflictingChange (60018)

#define AnnotationType_Author (60019)

#define AnnotationType_AdvancedProofingIssue (60020)

#define AnnotationType_DataValidationError (60021)

#define AnnotationType_CircularReferenceError (60022)

#define AnnotationType_Mathematics (60023)

#define AnnotationType_Sensitive (60024)

#endif /* __UIA_AnnotationTypes_MODULE_DEFINED__ */
#ifndef __UIA_StyleIds_MODULE_DEFINED__
#define __UIA_StyleIds_MODULE_DEFINED__
#define StyleId_Custom (70000)

#define StyleId_Heading1 (70001)

#define StyleId_Heading2 (70002)

#define StyleId_Heading3 (70003)

#define StyleId_Heading4 (70004)

#define StyleId_Heading5 (70005)

#define StyleId_Heading6 (70006)

#define StyleId_Heading7 (70007)

#define StyleId_Heading8 (70008)

#define StyleId_Heading9 (70009)

#define StyleId_Title (70010)

#define StyleId_Subtitle (70011)

#define StyleId_Normal (70012)

#define StyleId_Emphasis (70013)

#define StyleId_Quote (70014)

#define StyleId_BulletedList (70015)

#define StyleId_NumberedList (70016)

#endif /* __UIA_StyleIds_MODULE_DEFINED__ */
#ifndef __UIA_LandmarkTypeIds_MODULE_DEFINED__
#define __UIA_LandmarkTypeIds_MODULE_DEFINED__
#define UIA_CustomLandmarkTypeId (80000)

#define UIA_FormLandmarkTypeId (80001)

#define UIA_MainLandmarkTypeId (80002)

#define UIA_NavigationLandmarkTypeId (80003)

#define UIA_SearchLandmarkTypeId (80004)

#endif /* __UIA_LandmarkTypeIds_MODULE_DEFINED__ */
#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 inline HRESULT IUIAutomationCondition_QueryInterface(IUIAutomationCondition* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationCondition_AddRef(IUIAutomationCondition* This) {
    return This->lpVtbl->AddRef(This);
}
static 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 inline HRESULT IUIAutomationBoolCondition_QueryInterface(IUIAutomationBoolCondition* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationBoolCondition_AddRef(IUIAutomationBoolCondition* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationBoolCondition_Release(IUIAutomationBoolCondition* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationBoolCondition methods ***/
static 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 inline HRESULT IUIAutomationPropertyCondition_QueryInterface(IUIAutomationPropertyCondition* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationPropertyCondition_AddRef(IUIAutomationPropertyCondition* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationPropertyCondition_Release(IUIAutomationPropertyCondition* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationPropertyCondition methods ***/
static inline HRESULT IUIAutomationPropertyCondition_get_PropertyId(IUIAutomationPropertyCondition* This,PROPERTYID *propertyId) {
    return This->lpVtbl->get_PropertyId(This,propertyId);
}
static inline HRESULT IUIAutomationPropertyCondition_get_PropertyValue(IUIAutomationPropertyCondition* This,VARIANT *propertyValue) {
    return This->lpVtbl->get_PropertyValue(This,propertyValue);
}
static 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 inline HRESULT IUIAutomationAndCondition_QueryInterface(IUIAutomationAndCondition* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationAndCondition_AddRef(IUIAutomationAndCondition* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationAndCondition_Release(IUIAutomationAndCondition* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationAndCondition methods ***/
static inline HRESULT IUIAutomationAndCondition_get_ChildCount(IUIAutomationAndCondition* This,int *childCount) {
    return This->lpVtbl->get_ChildCount(This,childCount);
}
static inline HRESULT IUIAutomationAndCondition_GetChildrenAsNativeArray(IUIAutomationAndCondition* This,IUIAutomationCondition ***childArray,int *childArrayCount) {
    return This->lpVtbl->GetChildrenAsNativeArray(This,childArray,childArrayCount);
}
static 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 inline HRESULT IUIAutomationOrCondition_QueryInterface(IUIAutomationOrCondition* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationOrCondition_AddRef(IUIAutomationOrCondition* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationOrCondition_Release(IUIAutomationOrCondition* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationOrCondition methods ***/
static inline HRESULT IUIAutomationOrCondition_get_ChildCount(IUIAutomationOrCondition* This,int *childCount) {
    return This->lpVtbl->get_ChildCount(This,childCount);
}
static inline HRESULT IUIAutomationOrCondition_GetChildrenAsNativeArray(IUIAutomationOrCondition* This,IUIAutomationCondition ***childArray,int *childArrayCount) {
    return This->lpVtbl->GetChildrenAsNativeArray(This,childArray,childArrayCount);
}
static 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 inline HRESULT IUIAutomationNotCondition_QueryInterface(IUIAutomationNotCondition* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationNotCondition_AddRef(IUIAutomationNotCondition* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationNotCondition_Release(IUIAutomationNotCondition* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationNotCondition methods ***/
static 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 inline HRESULT IUIAutomationCacheRequest_QueryInterface(IUIAutomationCacheRequest* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationCacheRequest_AddRef(IUIAutomationCacheRequest* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationCacheRequest_Release(IUIAutomationCacheRequest* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationCacheRequest methods ***/
static inline HRESULT IUIAutomationCacheRequest_AddProperty(IUIAutomationCacheRequest* This,PROPERTYID propertyId) {
    return This->lpVtbl->AddProperty(This,propertyId);
}
static inline HRESULT IUIAutomationCacheRequest_AddPattern(IUIAutomationCacheRequest* This,PATTERNID patternId) {
    return This->lpVtbl->AddPattern(This,patternId);
}
static inline HRESULT IUIAutomationCacheRequest_Clone(IUIAutomationCacheRequest* This,IUIAutomationCacheRequest **clonedRequest) {
    return This->lpVtbl->Clone(This,clonedRequest);
}
static inline HRESULT IUIAutomationCacheRequest_get_TreeScope(IUIAutomationCacheRequest* This,enum TreeScope *scope) {
    return This->lpVtbl->get_TreeScope(This,scope);
}
static inline HRESULT IUIAutomationCacheRequest_put_TreeScope(IUIAutomationCacheRequest* This,enum TreeScope scope) {
    return This->lpVtbl->put_TreeScope(This,scope);
}
static inline HRESULT IUIAutomationCacheRequest_get_TreeFilter(IUIAutomationCacheRequest* This,IUIAutomationCondition **filter) {
    return This->lpVtbl->get_TreeFilter(This,filter);
}
static inline HRESULT IUIAutomationCacheRequest_put_TreeFilter(IUIAutomationCacheRequest* This,IUIAutomationCondition *filter) {
    return This->lpVtbl->put_TreeFilter(This,filter);
}
static inline HRESULT IUIAutomationCacheRequest_get_AutomationElementMode(IUIAutomationCacheRequest* This,enum AutomationElementMode *mode) {
    return This->lpVtbl->get_AutomationElementMode(This,mode);
}
static 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 inline HRESULT IUIAutomationTreeWalker_QueryInterface(IUIAutomationTreeWalker* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationTreeWalker_AddRef(IUIAutomationTreeWalker* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationTreeWalker_Release(IUIAutomationTreeWalker* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationTreeWalker methods ***/
static inline HRESULT IUIAutomationTreeWalker_GetParentElement(IUIAutomationTreeWalker* This,IUIAutomationElement *element,IUIAutomationElement **parent) {
    return This->lpVtbl->GetParentElement(This,element,parent);
}
static inline HRESULT IUIAutomationTreeWalker_GetFirstChildElement(IUIAutomationTreeWalker* This,IUIAutomationElement *element,IUIAutomationElement **first) {
    return This->lpVtbl->GetFirstChildElement(This,element,first);
}
static inline HRESULT IUIAutomationTreeWalker_GetLastChildElement(IUIAutomationTreeWalker* This,IUIAutomationElement *element,IUIAutomationElement **last) {
    return This->lpVtbl->GetLastChildElement(This,element,last);
}
static inline HRESULT IUIAutomationTreeWalker_GetNextSiblingElement(IUIAutomationTreeWalker* This,IUIAutomationElement *element,IUIAutomationElement **next) {
    return This->lpVtbl->GetNextSiblingElement(This,element,next);
}
static inline HRESULT IUIAutomationTreeWalker_GetPreviousSiblingElement(IUIAutomationTreeWalker* This,IUIAutomationElement *element,IUIAutomationElement **previous) {
    return This->lpVtbl->GetPreviousSiblingElement(This,element,previous);
}
static inline HRESULT IUIAutomationTreeWalker_NormalizeElement(IUIAutomationTreeWalker* This,IUIAutomationElement *element,IUIAutomationElement **normalized) {
    return This->lpVtbl->NormalizeElement(This,element,normalized);
}
static inline HRESULT IUIAutomationTreeWalker_GetParentElementBuildCache(IUIAutomationTreeWalker* This,IUIAutomationElement *element,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **parent) {
    return This->lpVtbl->GetParentElementBuildCache(This,element,cacheRequest,parent);
}
static inline HRESULT IUIAutomationTreeWalker_GetFirstChildElementBuildCache(IUIAutomationTreeWalker* This,IUIAutomationElement *element,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **first) {
    return This->lpVtbl->GetFirstChildElementBuildCache(This,element,cacheRequest,first);
}
static inline HRESULT IUIAutomationTreeWalker_GetLastChildElementBuildCache(IUIAutomationTreeWalker* This,IUIAutomationElement *element,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **last) {
    return This->lpVtbl->GetLastChildElementBuildCache(This,element,cacheRequest,last);
}
static inline HRESULT IUIAutomationTreeWalker_GetNextSiblingElementBuildCache(IUIAutomationTreeWalker* This,IUIAutomationElement *element,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **next) {
    return This->lpVtbl->GetNextSiblingElementBuildCache(This,element,cacheRequest,next);
}
static inline HRESULT IUIAutomationTreeWalker_GetPreviousSiblingElementBuildCache(IUIAutomationTreeWalker* This,IUIAutomationElement *element,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **previous) {
    return This->lpVtbl->GetPreviousSiblingElementBuildCache(This,element,cacheRequest,previous);
}
static inline HRESULT IUIAutomationTreeWalker_NormalizeElementBuildCache(IUIAutomationTreeWalker* This,IUIAutomationElement *element,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **normalized) {
    return This->lpVtbl->NormalizeElementBuildCache(This,element,cacheRequest,normalized);
}
static 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 inline HRESULT IUIAutomationEventHandler_QueryInterface(IUIAutomationEventHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationEventHandler_AddRef(IUIAutomationEventHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationEventHandler_Release(IUIAutomationEventHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationEventHandler methods ***/
static 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 inline HRESULT IUIAutomationPropertyChangedEventHandler_QueryInterface(IUIAutomationPropertyChangedEventHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationPropertyChangedEventHandler_AddRef(IUIAutomationPropertyChangedEventHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationPropertyChangedEventHandler_Release(IUIAutomationPropertyChangedEventHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationPropertyChangedEventHandler methods ***/
static 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 inline HRESULT IUIAutomationStructureChangedEventHandler_QueryInterface(IUIAutomationStructureChangedEventHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationStructureChangedEventHandler_AddRef(IUIAutomationStructureChangedEventHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationStructureChangedEventHandler_Release(IUIAutomationStructureChangedEventHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationStructureChangedEventHandler methods ***/
static 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 inline HRESULT IUIAutomationFocusChangedEventHandler_QueryInterface(IUIAutomationFocusChangedEventHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationFocusChangedEventHandler_AddRef(IUIAutomationFocusChangedEventHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationFocusChangedEventHandler_Release(IUIAutomationFocusChangedEventHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationFocusChangedEventHandler methods ***/
static 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 inline HRESULT IUIAutomationTextEditTextChangedEventHandler_QueryInterface(IUIAutomationTextEditTextChangedEventHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationTextEditTextChangedEventHandler_AddRef(IUIAutomationTextEditTextChangedEventHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationTextEditTextChangedEventHandler_Release(IUIAutomationTextEditTextChangedEventHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationTextEditTextChangedEventHandler methods ***/
static 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 inline HRESULT IUIAutomationChangesEventHandler_QueryInterface(IUIAutomationChangesEventHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationChangesEventHandler_AddRef(IUIAutomationChangesEventHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationChangesEventHandler_Release(IUIAutomationChangesEventHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationChangesEventHandler methods ***/
static 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 inline HRESULT IUIAutomationNotificationEventHandler_QueryInterface(IUIAutomationNotificationEventHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationNotificationEventHandler_AddRef(IUIAutomationNotificationEventHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationNotificationEventHandler_Release(IUIAutomationNotificationEventHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationNotificationEventHandler methods ***/
static 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 inline HRESULT IUIAutomationInvokePattern_QueryInterface(IUIAutomationInvokePattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationInvokePattern_AddRef(IUIAutomationInvokePattern* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationInvokePattern_Release(IUIAutomationInvokePattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationInvokePattern methods ***/
static 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 inline HRESULT IUIAutomationDockPattern_QueryInterface(IUIAutomationDockPattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationDockPattern_AddRef(IUIAutomationDockPattern* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationDockPattern_Release(IUIAutomationDockPattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationDockPattern methods ***/
static inline HRESULT IUIAutomationDockPattern_SetDockPosition(IUIAutomationDockPattern* This,enum DockPosition dockPos) {
    return This->lpVtbl->SetDockPosition(This,dockPos);
}
static inline HRESULT IUIAutomationDockPattern_get_CurrentDockPosition(IUIAutomationDockPattern* This,enum DockPosition *retVal) {
    return This->lpVtbl->get_CurrentDockPosition(This,retVal);
}
static 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 inline HRESULT IUIAutomationExpandCollapsePattern_QueryInterface(IUIAutomationExpandCollapsePattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationExpandCollapsePattern_AddRef(IUIAutomationExpandCollapsePattern* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationExpandCollapsePattern_Release(IUIAutomationExpandCollapsePattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationExpandCollapsePattern methods ***/
static inline HRESULT IUIAutomationExpandCollapsePattern_Expand(IUIAutomationExpandCollapsePattern* This) {
    return This->lpVtbl->Expand(This);
}
static inline HRESULT IUIAutomationExpandCollapsePattern_Collapse(IUIAutomationExpandCollapsePattern* This) {
    return This->lpVtbl->Collapse(This);
}
static inline HRESULT IUIAutomationExpandCollapsePattern_get_CurrentExpandCollapseState(IUIAutomationExpandCollapsePattern* This,enum ExpandCollapseState *retVal) {
    return This->lpVtbl->get_CurrentExpandCollapseState(This,retVal);
}
static 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 inline HRESULT IUIAutomationGridPattern_QueryInterface(IUIAutomationGridPattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationGridPattern_AddRef(IUIAutomationGridPattern* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationGridPattern_Release(IUIAutomationGridPattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationGridPattern methods ***/
static inline HRESULT IUIAutomationGridPattern_GetItem(IUIAutomationGridPattern* This,int row,int column,IUIAutomationElement **element) {
    return This->lpVtbl->GetItem(This,row,column,element);
}
static inline HRESULT IUIAutomationGridPattern_get_CurrentRowCount(IUIAutomationGridPattern* This,int *retVal) {
    return This->lpVtbl->get_CurrentRowCount(This,retVal);
}
static inline HRESULT IUIAutomationGridPattern_get_CurrentColumnCount(IUIAutomationGridPattern* This,int *retVal) {
    return This->lpVtbl->get_CurrentColumnCount(This,retVal);
}
static inline HRESULT IUIAutomationGridPattern_get_CachedRowCount(IUIAutomationGridPattern* This,int *retVal) {
    return This->lpVtbl->get_CachedRowCount(This,retVal);
}
static 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 inline HRESULT IUIAutomationGridItemPattern_QueryInterface(IUIAutomationGridItemPattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationGridItemPattern_AddRef(IUIAutomationGridItemPattern* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationGridItemPattern_Release(IUIAutomationGridItemPattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationGridItemPattern methods ***/
static inline HRESULT IUIAutomationGridItemPattern_get_CurrentContainingGrid(IUIAutomationGridItemPattern* This,IUIAutomationElement **retVal) {
    return This->lpVtbl->get_CurrentContainingGrid(This,retVal);
}
static inline HRESULT IUIAutomationGridItemPattern_get_CurrentRow(IUIAutomationGridItemPattern* This,int *retVal) {
    return This->lpVtbl->get_CurrentRow(This,retVal);
}
static inline HRESULT IUIAutomationGridItemPattern_get_CurrentColumn(IUIAutomationGridItemPattern* This,int *retVal) {
    return This->lpVtbl->get_CurrentColumn(This,retVal);
}
static inline HRESULT IUIAutomationGridItemPattern_get_CurrentRowSpan(IUIAutomationGridItemPattern* This,int *retVal) {
    return This->lpVtbl->get_CurrentRowSpan(This,retVal);
}
static inline HRESULT IUIAutomationGridItemPattern_get_CurrentColumnSpan(IUIAutomationGridItemPattern* This,int *retVal) {
    return This->lpVtbl->get_CurrentColumnSpan(This,retVal);
}
static inline HRESULT IUIAutomationGridItemPattern_get_CachedContainingGrid(IUIAutomationGridItemPattern* This,IUIAutomationElement **retVal) {
    return This->lpVtbl->get_CachedContainingGrid(This,retVal);
}
static inline HRESULT IUIAutomationGridItemPattern_get_CachedRow(IUIAutomationGridItemPattern* This,int *retVal) {
    return This->lpVtbl->get_CachedRow(This,retVal);
}
static inline HRESULT IUIAutomationGridItemPattern_get_CachedColumn(IUIAutomationGridItemPattern* This,int *retVal) {
    return This->lpVtbl->get_CachedColumn(This,retVal);
}
static inline HRESULT IUIAutomationGridItemPattern_get_CachedRowSpan(IUIAutomationGridItemPattern* This,int *retVal) {
    return This->lpVtbl->get_CachedRowSpan(This,retVal);
}
static 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 inline HRESULT IUIAutomationMultipleViewPattern_QueryInterface(IUIAutomationMultipleViewPattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationMultipleViewPattern_AddRef(IUIAutomationMultipleViewPattern* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationMultipleViewPattern_Release(IUIAutomationMultipleViewPattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationMultipleViewPattern methods ***/
static inline HRESULT IUIAutomationMultipleViewPattern_GetViewName(IUIAutomationMultipleViewPattern* This,int view,BSTR *name) {
    return This->lpVtbl->GetViewName(This,view,name);
}
static inline HRESULT IUIAutomationMultipleViewPattern_SetCurrentView(IUIAutomationMultipleViewPattern* This,int view) {
    return This->lpVtbl->SetCurrentView(This,view);
}
static inline HRESULT IUIAutomationMultipleViewPattern_get_CurrentCurrentView(IUIAutomationMultipleViewPattern* This,int *retVal) {
    return This->lpVtbl->get_CurrentCurrentView(This,retVal);
}
static inline HRESULT IUIAutomationMultipleViewPattern_GetCurrentSupportedViews(IUIAutomationMultipleViewPattern* This,SAFEARRAY **retVal) {
    return This->lpVtbl->GetCurrentSupportedViews(This,retVal);
}
static inline HRESULT IUIAutomationMultipleViewPattern_get_CachedCurrentView(IUIAutomationMultipleViewPattern* This,int *retVal) {
    return This->lpVtbl->get_CachedCurrentView(This,retVal);
}
static 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 inline HRESULT IUIAutomationObjectModelPattern_QueryInterface(IUIAutomationObjectModelPattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationObjectModelPattern_AddRef(IUIAutomationObjectModelPattern* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationObjectModelPattern_Release(IUIAutomationObjectModelPattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationObjectModelPattern methods ***/
static 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 inline HRESULT IUIAutomationRangeValuePattern_QueryInterface(IUIAutomationRangeValuePattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationRangeValuePattern_AddRef(IUIAutomationRangeValuePattern* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationRangeValuePattern_Release(IUIAutomationRangeValuePattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationRangeValuePattern methods ***/
static inline HRESULT IUIAutomationRangeValuePattern_SetValue(IUIAutomationRangeValuePattern* This,double val) {
    return This->lpVtbl->SetValue(This,val);
}
static inline HRESULT IUIAutomationRangeValuePattern_get_CurrentValue(IUIAutomationRangeValuePattern* This,double *retVal) {
    return This->lpVtbl->get_CurrentValue(This,retVal);
}
static inline HRESULT IUIAutomationRangeValuePattern_get_CurrentIsReadOnly(IUIAutomationRangeValuePattern* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsReadOnly(This,retVal);
}
static inline HRESULT IUIAutomationRangeValuePattern_get_CurrentMaximum(IUIAutomationRangeValuePattern* This,double *retVal) {
    return This->lpVtbl->get_CurrentMaximum(This,retVal);
}
static inline HRESULT IUIAutomationRangeValuePattern_get_CurrentMinimum(IUIAutomationRangeValuePattern* This,double *retVal) {
    return This->lpVtbl->get_CurrentMinimum(This,retVal);
}
static inline HRESULT IUIAutomationRangeValuePattern_get_CurrentLargeChange(IUIAutomationRangeValuePattern* This,double *retVal) {
    return This->lpVtbl->get_CurrentLargeChange(This,retVal);
}
static inline HRESULT IUIAutomationRangeValuePattern_get_CurrentSmallChange(IUIAutomationRangeValuePattern* This,double *retVal) {
    return This->lpVtbl->get_CurrentSmallChange(This,retVal);
}
static inline HRESULT IUIAutomationRangeValuePattern_get_CachedValue(IUIAutomationRangeValuePattern* This,double *retVal) {
    return This->lpVtbl->get_CachedValue(This,retVal);
}
static inline HRESULT IUIAutomationRangeValuePattern_get_CachedIsReadOnly(IUIAutomationRangeValuePattern* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsReadOnly(This,retVal);
}
static inline HRESULT IUIAutomationRangeValuePattern_get_CachedMaximum(IUIAutomationRangeValuePattern* This,double *retVal) {
    return This->lpVtbl->get_CachedMaximum(This,retVal);
}
static inline HRESULT IUIAutomationRangeValuePattern_get_CachedMinimum(IUIAutomationRangeValuePattern* This,double *retVal) {
    return This->lpVtbl->get_CachedMinimum(This,retVal);
}
static inline HRESULT IUIAutomationRangeValuePattern_get_CachedLargeChange(IUIAutomationRangeValuePattern* This,double *retVal) {
    return This->lpVtbl->get_CachedLargeChange(This,retVal);
}
static 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 inline HRESULT IUIAutomationScrollPattern_QueryInterface(IUIAutomationScrollPattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationScrollPattern_AddRef(IUIAutomationScrollPattern* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationScrollPattern_Release(IUIAutomationScrollPattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationScrollPattern methods ***/
static inline HRESULT IUIAutomationScrollPattern_Scroll(IUIAutomationScrollPattern* This,enum ScrollAmount horizontalAmount,enum ScrollAmount verticalAmount) {
    return This->lpVtbl->Scroll(This,horizontalAmount,verticalAmount);
}
static inline HRESULT IUIAutomationScrollPattern_SetScrollPercent(IUIAutomationScrollPattern* This,double horizontalPercent,double verticalPercent) {
    return This->lpVtbl->SetScrollPercent(This,horizontalPercent,verticalPercent);
}
static inline HRESULT IUIAutomationScrollPattern_get_CurrentHorizontalScrollPercent(IUIAutomationScrollPattern* This,double *retVal) {
    return This->lpVtbl->get_CurrentHorizontalScrollPercent(This,retVal);
}
static inline HRESULT IUIAutomationScrollPattern_get_CurrentVerticalScrollPercent(IUIAutomationScrollPattern* This,double *retVal) {
    return This->lpVtbl->get_CurrentVerticalScrollPercent(This,retVal);
}
static inline HRESULT IUIAutomationScrollPattern_get_CurrentHorizontalViewSize(IUIAutomationScrollPattern* This,double *retVal) {
    return This->lpVtbl->get_CurrentHorizontalViewSize(This,retVal);
}
static inline HRESULT IUIAutomationScrollPattern_get_CurrentVerticalViewSize(IUIAutomationScrollPattern* This,double *retVal) {
    return This->lpVtbl->get_CurrentVerticalViewSize(This,retVal);
}
static inline HRESULT IUIAutomationScrollPattern_get_CurrentHorizontallyScrollable(IUIAutomationScrollPattern* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentHorizontallyScrollable(This,retVal);
}
static inline HRESULT IUIAutomationScrollPattern_get_CurrentVerticallyScrollable(IUIAutomationScrollPattern* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentVerticallyScrollable(This,retVal);
}
static inline HRESULT IUIAutomationScrollPattern_get_CachedHorizontalScrollPercent(IUIAutomationScrollPattern* This,double *retVal) {
    return This->lpVtbl->get_CachedHorizontalScrollPercent(This,retVal);
}
static inline HRESULT IUIAutomationScrollPattern_get_CachedVerticalScrollPercent(IUIAutomationScrollPattern* This,double *retVal) {
    return This->lpVtbl->get_CachedVerticalScrollPercent(This,retVal);
}
static inline HRESULT IUIAutomationScrollPattern_get_CachedHorizontalViewSize(IUIAutomationScrollPattern* This,double *retVal) {
    return This->lpVtbl->get_CachedHorizontalViewSize(This,retVal);
}
static inline HRESULT IUIAutomationScrollPattern_get_CachedVerticalViewSize(IUIAutomationScrollPattern* This,double *retVal) {
    return This->lpVtbl->get_CachedVerticalViewSize(This,retVal);
}
static inline HRESULT IUIAutomationScrollPattern_get_CachedHorizontallyScrollable(IUIAutomationScrollPattern* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedHorizontallyScrollable(This,retVal);
}
static 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 inline HRESULT IUIAutomationScrollItemPattern_QueryInterface(IUIAutomationScrollItemPattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationScrollItemPattern_AddRef(IUIAutomationScrollItemPattern* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationScrollItemPattern_Release(IUIAutomationScrollItemPattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationScrollItemPattern methods ***/
static 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 inline HRESULT IUIAutomationSelectionPattern_QueryInterface(IUIAutomationSelectionPattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationSelectionPattern_AddRef(IUIAutomationSelectionPattern* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationSelectionPattern_Release(IUIAutomationSelectionPattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationSelectionPattern methods ***/
static inline HRESULT IUIAutomationSelectionPattern_GetCurrentSelection(IUIAutomationSelectionPattern* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->GetCurrentSelection(This,retVal);
}
static inline HRESULT IUIAutomationSelectionPattern_get_CurrentCanSelectMultiple(IUIAutomationSelectionPattern* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentCanSelectMultiple(This,retVal);
}
static inline HRESULT IUIAutomationSelectionPattern_get_CurrentIsSelectionRequired(IUIAutomationSelectionPattern* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsSelectionRequired(This,retVal);
}
static inline HRESULT IUIAutomationSelectionPattern_GetCachedSelection(IUIAutomationSelectionPattern* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->GetCachedSelection(This,retVal);
}
static inline HRESULT IUIAutomationSelectionPattern_get_CachedCanSelectMultiple(IUIAutomationSelectionPattern* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedCanSelectMultiple(This,retVal);
}
static 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 inline HRESULT IUIAutomationSelectionItemPattern_QueryInterface(IUIAutomationSelectionItemPattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationSelectionItemPattern_AddRef(IUIAutomationSelectionItemPattern* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationSelectionItemPattern_Release(IUIAutomationSelectionItemPattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationSelectionItemPattern methods ***/
static inline HRESULT IUIAutomationSelectionItemPattern_Select(IUIAutomationSelectionItemPattern* This) {
    return This->lpVtbl->Select(This);
}
static inline HRESULT IUIAutomationSelectionItemPattern_AddToSelection(IUIAutomationSelectionItemPattern* This) {
    return This->lpVtbl->AddToSelection(This);
}
static inline HRESULT IUIAutomationSelectionItemPattern_RemoveFromSelection(IUIAutomationSelectionItemPattern* This) {
    return This->lpVtbl->RemoveFromSelection(This);
}
static inline HRESULT IUIAutomationSelectionItemPattern_get_CurrentIsSelected(IUIAutomationSelectionItemPattern* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsSelected(This,retVal);
}
static inline HRESULT IUIAutomationSelectionItemPattern_get_CurrentSelectionContainer(IUIAutomationSelectionItemPattern* This,IUIAutomationElement **retVal) {
    return This->lpVtbl->get_CurrentSelectionContainer(This,retVal);
}
static inline HRESULT IUIAutomationSelectionItemPattern_get_CachedIsSelected(IUIAutomationSelectionItemPattern* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsSelected(This,retVal);
}
static 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 inline HRESULT IUIAutomationSynchronizedInputPattern_QueryInterface(IUIAutomationSynchronizedInputPattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationSynchronizedInputPattern_AddRef(IUIAutomationSynchronizedInputPattern* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationSynchronizedInputPattern_Release(IUIAutomationSynchronizedInputPattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationSynchronizedInputPattern methods ***/
static inline HRESULT IUIAutomationSynchronizedInputPattern_StartListening(IUIAutomationSynchronizedInputPattern* This,enum SynchronizedInputType inputType) {
    return This->lpVtbl->StartListening(This,inputType);
}
static 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 inline HRESULT IUIAutomationTablePattern_QueryInterface(IUIAutomationTablePattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationTablePattern_AddRef(IUIAutomationTablePattern* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationTablePattern_Release(IUIAutomationTablePattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationTablePattern methods ***/
static inline HRESULT IUIAutomationTablePattern_GetCurrentRowHeaders(IUIAutomationTablePattern* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->GetCurrentRowHeaders(This,retVal);
}
static inline HRESULT IUIAutomationTablePattern_GetCurrentColumnHeaders(IUIAutomationTablePattern* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->GetCurrentColumnHeaders(This,retVal);
}
static inline HRESULT IUIAutomationTablePattern_get_CurrentRowOrColumnMajor(IUIAutomationTablePattern* This,enum RowOrColumnMajor *retVal) {
    return This->lpVtbl->get_CurrentRowOrColumnMajor(This,retVal);
}
static inline HRESULT IUIAutomationTablePattern_GetCachedRowHeaders(IUIAutomationTablePattern* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->GetCachedRowHeaders(This,retVal);
}
static inline HRESULT IUIAutomationTablePattern_GetCachedColumnHeaders(IUIAutomationTablePattern* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->GetCachedColumnHeaders(This,retVal);
}
static 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 inline HRESULT IUIAutomationTableItemPattern_QueryInterface(IUIAutomationTableItemPattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationTableItemPattern_AddRef(IUIAutomationTableItemPattern* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationTableItemPattern_Release(IUIAutomationTableItemPattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationTableItemPattern methods ***/
static inline HRESULT IUIAutomationTableItemPattern_GetCurrentRowHeaderItems(IUIAutomationTableItemPattern* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->GetCurrentRowHeaderItems(This,retVal);
}
static inline HRESULT IUIAutomationTableItemPattern_GetCurrentColumnHeaderItems(IUIAutomationTableItemPattern* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->GetCurrentColumnHeaderItems(This,retVal);
}
static inline HRESULT IUIAutomationTableItemPattern_GetCachedRowHeaderItems(IUIAutomationTableItemPattern* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->GetCachedRowHeaderItems(This,retVal);
}
static 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 inline HRESULT IUIAutomationTogglePattern_QueryInterface(IUIAutomationTogglePattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationTogglePattern_AddRef(IUIAutomationTogglePattern* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationTogglePattern_Release(IUIAutomationTogglePattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationTogglePattern methods ***/
static inline HRESULT IUIAutomationTogglePattern_Toggle(IUIAutomationTogglePattern* This) {
    return This->lpVtbl->Toggle(This);
}
static inline HRESULT IUIAutomationTogglePattern_get_CurrentToggleState(IUIAutomationTogglePattern* This,enum ToggleState *retVal) {
    return This->lpVtbl->get_CurrentToggleState(This,retVal);
}
static 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 inline HRESULT IUIAutomationTransformPattern_QueryInterface(IUIAutomationTransformPattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationTransformPattern_AddRef(IUIAutomationTransformPattern* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationTransformPattern_Release(IUIAutomationTransformPattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationTransformPattern methods ***/
static inline HRESULT IUIAutomationTransformPattern_Move(IUIAutomationTransformPattern* This,double x,double y) {
    return This->lpVtbl->Move(This,x,y);
}
static inline HRESULT IUIAutomationTransformPattern_Resize(IUIAutomationTransformPattern* This,double width,double height) {
    return This->lpVtbl->Resize(This,width,height);
}
static inline HRESULT IUIAutomationTransformPattern_Rotate(IUIAutomationTransformPattern* This,double degrees) {
    return This->lpVtbl->Rotate(This,degrees);
}
static inline HRESULT IUIAutomationTransformPattern_get_CurrentCanMove(IUIAutomationTransformPattern* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentCanMove(This,retVal);
}
static inline HRESULT IUIAutomationTransformPattern_get_CurrentCanResize(IUIAutomationTransformPattern* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentCanResize(This,retVal);
}
static inline HRESULT IUIAutomationTransformPattern_get_CurrentCanRotate(IUIAutomationTransformPattern* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentCanRotate(This,retVal);
}
static inline HRESULT IUIAutomationTransformPattern_get_CachedCanMove(IUIAutomationTransformPattern* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedCanMove(This,retVal);
}
static inline HRESULT IUIAutomationTransformPattern_get_CachedCanResize(IUIAutomationTransformPattern* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedCanResize(This,retVal);
}
static 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 inline HRESULT IUIAutomationValuePattern_QueryInterface(IUIAutomationValuePattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationValuePattern_AddRef(IUIAutomationValuePattern* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationValuePattern_Release(IUIAutomationValuePattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationValuePattern methods ***/
static inline HRESULT IUIAutomationValuePattern_SetValue(IUIAutomationValuePattern* This,BSTR val) {
    return This->lpVtbl->SetValue(This,val);
}
static inline HRESULT IUIAutomationValuePattern_get_CurrentValue(IUIAutomationValuePattern* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentValue(This,retVal);
}
static inline HRESULT IUIAutomationValuePattern_get_CurrentIsReadOnly(IUIAutomationValuePattern* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsReadOnly(This,retVal);
}
static inline HRESULT IUIAutomationValuePattern_get_CachedValue(IUIAutomationValuePattern* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedValue(This,retVal);
}
static 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 inline HRESULT IUIAutomationWindowPattern_QueryInterface(IUIAutomationWindowPattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationWindowPattern_AddRef(IUIAutomationWindowPattern* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationWindowPattern_Release(IUIAutomationWindowPattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationWindowPattern methods ***/
static inline HRESULT IUIAutomationWindowPattern_Close(IUIAutomationWindowPattern* This) {
    return This->lpVtbl->Close(This);
}
static inline HRESULT IUIAutomationWindowPattern_WaitForInputIdle(IUIAutomationWindowPattern* This,int milliseconds,WINBOOL *success) {
    return This->lpVtbl->WaitForInputIdle(This,milliseconds,success);
}
static inline HRESULT IUIAutomationWindowPattern_SetWindowVisualState(IUIAutomationWindowPattern* This,enum WindowVisualState state) {
    return This->lpVtbl->SetWindowVisualState(This,state);
}
static inline HRESULT IUIAutomationWindowPattern_get_CurrentCanMaximize(IUIAutomationWindowPattern* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentCanMaximize(This,retVal);
}
static inline HRESULT IUIAutomationWindowPattern_get_CurrentCanMinimize(IUIAutomationWindowPattern* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentCanMinimize(This,retVal);
}
static inline HRESULT IUIAutomationWindowPattern_get_CurrentIsModal(IUIAutomationWindowPattern* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsModal(This,retVal);
}
static inline HRESULT IUIAutomationWindowPattern_get_CurrentIsTopmost(IUIAutomationWindowPattern* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsTopmost(This,retVal);
}
static inline HRESULT IUIAutomationWindowPattern_get_CurrentWindowVisualState(IUIAutomationWindowPattern* This,enum WindowVisualState *retVal) {
    return This->lpVtbl->get_CurrentWindowVisualState(This,retVal);
}
static inline HRESULT IUIAutomationWindowPattern_get_CurrentWindowInteractionState(IUIAutomationWindowPattern* This,enum WindowInteractionState *retVal) {
    return This->lpVtbl->get_CurrentWindowInteractionState(This,retVal);
}
static inline HRESULT IUIAutomationWindowPattern_get_CachedCanMaximize(IUIAutomationWindowPattern* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedCanMaximize(This,retVal);
}
static inline HRESULT IUIAutomationWindowPattern_get_CachedCanMinimize(IUIAutomationWindowPattern* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedCanMinimize(This,retVal);
}
static inline HRESULT IUIAutomationWindowPattern_get_CachedIsModal(IUIAutomationWindowPattern* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsModal(This,retVal);
}
static inline HRESULT IUIAutomationWindowPattern_get_CachedIsTopmost(IUIAutomationWindowPattern* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsTopmost(This,retVal);
}
static inline HRESULT IUIAutomationWindowPattern_get_CachedWindowVisualState(IUIAutomationWindowPattern* This,enum WindowVisualState *retVal) {
    return This->lpVtbl->get_CachedWindowVisualState(This,retVal);
}
static 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 inline HRESULT IUIAutomationTextRange_QueryInterface(IUIAutomationTextRange* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationTextRange_AddRef(IUIAutomationTextRange* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationTextRange_Release(IUIAutomationTextRange* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationTextRange methods ***/
static inline HRESULT IUIAutomationTextRange_Clone(IUIAutomationTextRange* This,IUIAutomationTextRange **clonedRange) {
    return This->lpVtbl->Clone(This,clonedRange);
}
static inline HRESULT IUIAutomationTextRange_Compare(IUIAutomationTextRange* This,IUIAutomationTextRange *range,WINBOOL *areSame) {
    return This->lpVtbl->Compare(This,range,areSame);
}
static 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 inline HRESULT IUIAutomationTextRange_ExpandToEnclosingUnit(IUIAutomationTextRange* This,enum TextUnit textUnit) {
    return This->lpVtbl->ExpandToEnclosingUnit(This,textUnit);
}
static inline HRESULT IUIAutomationTextRange_FindAttribute(IUIAutomationTextRange* This,TEXTATTRIBUTEID attr,VARIANT val,WINBOOL backward,IUIAutomationTextRange **found) {
    return This->lpVtbl->FindAttribute(This,attr,val,backward,found);
}
static inline HRESULT IUIAutomationTextRange_FindText(IUIAutomationTextRange* This,BSTR text,WINBOOL backward,WINBOOL ignoreCase,IUIAutomationTextRange **found) {
    return This->lpVtbl->FindText(This,text,backward,ignoreCase,found);
}
static inline HRESULT IUIAutomationTextRange_GetAttributeValue(IUIAutomationTextRange* This,TEXTATTRIBUTEID attr,VARIANT *value) {
    return This->lpVtbl->GetAttributeValue(This,attr,value);
}
static inline HRESULT IUIAutomationTextRange_GetBoundingRectangles(IUIAutomationTextRange* This,SAFEARRAY **boundingRects) {
    return This->lpVtbl->GetBoundingRectangles(This,boundingRects);
}
static inline HRESULT IUIAutomationTextRange_GetEnclosingElement(IUIAutomationTextRange* This,IUIAutomationElement **enclosingElement) {
    return This->lpVtbl->GetEnclosingElement(This,enclosingElement);
}
static inline HRESULT IUIAutomationTextRange_GetText(IUIAutomationTextRange* This,int maxLength,BSTR *text) {
    return This->lpVtbl->GetText(This,maxLength,text);
}
static inline HRESULT IUIAutomationTextRange_Move(IUIAutomationTextRange* This,enum TextUnit unit,int count,int *moved) {
    return This->lpVtbl->Move(This,unit,count,moved);
}
static 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 inline HRESULT IUIAutomationTextRange_MoveEndpointByRange(IUIAutomationTextRange* This,enum TextPatternRangeEndpoint srcEndPoint,IUIAutomationTextRange *range,enum TextPatternRangeEndpoint targetEndPoint) {
    return This->lpVtbl->MoveEndpointByRange(This,srcEndPoint,range,targetEndPoint);
}
static inline HRESULT IUIAutomationTextRange_Select(IUIAutomationTextRange* This) {
    return This->lpVtbl->Select(This);
}
static inline HRESULT IUIAutomationTextRange_AddToSelection(IUIAutomationTextRange* This) {
    return This->lpVtbl->AddToSelection(This);
}
static inline HRESULT IUIAutomationTextRange_RemoveFromSelection(IUIAutomationTextRange* This) {
    return This->lpVtbl->RemoveFromSelection(This);
}
static inline HRESULT IUIAutomationTextRange_ScrollIntoView(IUIAutomationTextRange* This,WINBOOL alignToTop) {
    return This->lpVtbl->ScrollIntoView(This,alignToTop);
}
static 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 inline HRESULT IUIAutomationTextRange2_QueryInterface(IUIAutomationTextRange2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationTextRange2_AddRef(IUIAutomationTextRange2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationTextRange2_Release(IUIAutomationTextRange2* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationTextRange methods ***/
static inline HRESULT IUIAutomationTextRange2_Clone(IUIAutomationTextRange2* This,IUIAutomationTextRange **clonedRange) {
    return This->lpVtbl->Clone(This,clonedRange);
}
static inline HRESULT IUIAutomationTextRange2_Compare(IUIAutomationTextRange2* This,IUIAutomationTextRange *range,WINBOOL *areSame) {
    return This->lpVtbl->Compare(This,range,areSame);
}
static 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 inline HRESULT IUIAutomationTextRange2_ExpandToEnclosingUnit(IUIAutomationTextRange2* This,enum TextUnit textUnit) {
    return This->lpVtbl->ExpandToEnclosingUnit(This,textUnit);
}
static inline HRESULT IUIAutomationTextRange2_FindAttribute(IUIAutomationTextRange2* This,TEXTATTRIBUTEID attr,VARIANT val,WINBOOL backward,IUIAutomationTextRange **found) {
    return This->lpVtbl->FindAttribute(This,attr,val,backward,found);
}
static inline HRESULT IUIAutomationTextRange2_FindText(IUIAutomationTextRange2* This,BSTR text,WINBOOL backward,WINBOOL ignoreCase,IUIAutomationTextRange **found) {
    return This->lpVtbl->FindText(This,text,backward,ignoreCase,found);
}
static inline HRESULT IUIAutomationTextRange2_GetAttributeValue(IUIAutomationTextRange2* This,TEXTATTRIBUTEID attr,VARIANT *value) {
    return This->lpVtbl->GetAttributeValue(This,attr,value);
}
static inline HRESULT IUIAutomationTextRange2_GetBoundingRectangles(IUIAutomationTextRange2* This,SAFEARRAY **boundingRects) {
    return This->lpVtbl->GetBoundingRectangles(This,boundingRects);
}
static inline HRESULT IUIAutomationTextRange2_GetEnclosingElement(IUIAutomationTextRange2* This,IUIAutomationElement **enclosingElement) {
    return This->lpVtbl->GetEnclosingElement(This,enclosingElement);
}
static inline HRESULT IUIAutomationTextRange2_GetText(IUIAutomationTextRange2* This,int maxLength,BSTR *text) {
    return This->lpVtbl->GetText(This,maxLength,text);
}
static inline HRESULT IUIAutomationTextRange2_Move(IUIAutomationTextRange2* This,enum TextUnit unit,int count,int *moved) {
    return This->lpVtbl->Move(This,unit,count,moved);
}
static 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 inline HRESULT IUIAutomationTextRange2_MoveEndpointByRange(IUIAutomationTextRange2* This,enum TextPatternRangeEndpoint srcEndPoint,IUIAutomationTextRange *range,enum TextPatternRangeEndpoint targetEndPoint) {
    return This->lpVtbl->MoveEndpointByRange(This,srcEndPoint,range,targetEndPoint);
}
static inline HRESULT IUIAutomationTextRange2_Select(IUIAutomationTextRange2* This) {
    return This->lpVtbl->Select(This);
}
static inline HRESULT IUIAutomationTextRange2_AddToSelection(IUIAutomationTextRange2* This) {
    return This->lpVtbl->AddToSelection(This);
}
static inline HRESULT IUIAutomationTextRange2_RemoveFromSelection(IUIAutomationTextRange2* This) {
    return This->lpVtbl->RemoveFromSelection(This);
}
static inline HRESULT IUIAutomationTextRange2_ScrollIntoView(IUIAutomationTextRange2* This,WINBOOL alignToTop) {
    return This->lpVtbl->ScrollIntoView(This,alignToTop);
}
static inline HRESULT IUIAutomationTextRange2_GetChildren(IUIAutomationTextRange2* This,IUIAutomationElementArray **children) {
    return This->lpVtbl->GetChildren(This,children);
}
/*** IUIAutomationTextRange2 methods ***/
static 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 inline HRESULT IUIAutomationTextRangeArray_QueryInterface(IUIAutomationTextRangeArray* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationTextRangeArray_AddRef(IUIAutomationTextRangeArray* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationTextRangeArray_Release(IUIAutomationTextRangeArray* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationTextRangeArray methods ***/
static inline HRESULT IUIAutomationTextRangeArray_get_Length(IUIAutomationTextRangeArray* This,int *length) {
    return This->lpVtbl->get_Length(This,length);
}
static 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 inline HRESULT IUIAutomationTextPattern_QueryInterface(IUIAutomationTextPattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationTextPattern_AddRef(IUIAutomationTextPattern* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationTextPattern_Release(IUIAutomationTextPattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationTextPattern methods ***/
static inline HRESULT IUIAutomationTextPattern_RangeFromPoint(IUIAutomationTextPattern* This,POINT pt,IUIAutomationTextRange **range) {
    return This->lpVtbl->RangeFromPoint(This,pt,range);
}
static inline HRESULT IUIAutomationTextPattern_RangeFromChild(IUIAutomationTextPattern* This,IUIAutomationElement *child,IUIAutomationTextRange **range) {
    return This->lpVtbl->RangeFromChild(This,child,range);
}
static inline HRESULT IUIAutomationTextPattern_GetSelection(IUIAutomationTextPattern* This,IUIAutomationTextRangeArray **ranges) {
    return This->lpVtbl->GetSelection(This,ranges);
}
static inline HRESULT IUIAutomationTextPattern_GetVisibleRanges(IUIAutomationTextPattern* This,IUIAutomationTextRangeArray **ranges) {
    return This->lpVtbl->GetVisibleRanges(This,ranges);
}
static inline HRESULT IUIAutomationTextPattern_get_DocumentRange(IUIAutomationTextPattern* This,IUIAutomationTextRange **range) {
    return This->lpVtbl->get_DocumentRange(This,range);
}
static 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 inline HRESULT IUIAutomationTextPattern2_QueryInterface(IUIAutomationTextPattern2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationTextPattern2_AddRef(IUIAutomationTextPattern2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationTextPattern2_Release(IUIAutomationTextPattern2* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationTextPattern methods ***/
static inline HRESULT IUIAutomationTextPattern2_RangeFromPoint(IUIAutomationTextPattern2* This,POINT pt,IUIAutomationTextRange **range) {
    return This->lpVtbl->RangeFromPoint(This,pt,range);
}
static inline HRESULT IUIAutomationTextPattern2_RangeFromChild(IUIAutomationTextPattern2* This,IUIAutomationElement *child,IUIAutomationTextRange **range) {
    return This->lpVtbl->RangeFromChild(This,child,range);
}
static inline HRESULT IUIAutomationTextPattern2_GetSelection(IUIAutomationTextPattern2* This,IUIAutomationTextRangeArray **ranges) {
    return This->lpVtbl->GetSelection(This,ranges);
}
static inline HRESULT IUIAutomationTextPattern2_GetVisibleRanges(IUIAutomationTextPattern2* This,IUIAutomationTextRangeArray **ranges) {
    return This->lpVtbl->GetVisibleRanges(This,ranges);
}
static inline HRESULT IUIAutomationTextPattern2_get_DocumentRange(IUIAutomationTextPattern2* This,IUIAutomationTextRange **range) {
    return This->lpVtbl->get_DocumentRange(This,range);
}
static inline HRESULT IUIAutomationTextPattern2_get_SupportedTextSelection(IUIAutomationTextPattern2* This,enum SupportedTextSelection *supportedTextSelection) {
    return This->lpVtbl->get_SupportedTextSelection(This,supportedTextSelection);
}
/*** IUIAutomationTextPattern2 methods ***/
static inline HRESULT IUIAutomationTextPattern2_RangeFromAnnotation(IUIAutomationTextPattern2* This,IUIAutomationElement *annotation,IUIAutomationTextRange **range) {
    return This->lpVtbl->RangeFromAnnotation(This,annotation,range);
}
static 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 inline HRESULT IUIAutomationTextEditPattern_QueryInterface(IUIAutomationTextEditPattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationTextEditPattern_AddRef(IUIAutomationTextEditPattern* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationTextEditPattern_Release(IUIAutomationTextEditPattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationTextPattern methods ***/
static inline HRESULT IUIAutomationTextEditPattern_RangeFromPoint(IUIAutomationTextEditPattern* This,POINT pt,IUIAutomationTextRange **range) {
    return This->lpVtbl->RangeFromPoint(This,pt,range);
}
static inline HRESULT IUIAutomationTextEditPattern_RangeFromChild(IUIAutomationTextEditPattern* This,IUIAutomationElement *child,IUIAutomationTextRange **range) {
    return This->lpVtbl->RangeFromChild(This,child,range);
}
static inline HRESULT IUIAutomationTextEditPattern_GetSelection(IUIAutomationTextEditPattern* This,IUIAutomationTextRangeArray **ranges) {
    return This->lpVtbl->GetSelection(This,ranges);
}
static inline HRESULT IUIAutomationTextEditPattern_GetVisibleRanges(IUIAutomationTextEditPattern* This,IUIAutomationTextRangeArray **ranges) {
    return This->lpVtbl->GetVisibleRanges(This,ranges);
}
static inline HRESULT IUIAutomationTextEditPattern_get_DocumentRange(IUIAutomationTextEditPattern* This,IUIAutomationTextRange **range) {
    return This->lpVtbl->get_DocumentRange(This,range);
}
static inline HRESULT IUIAutomationTextEditPattern_get_SupportedTextSelection(IUIAutomationTextEditPattern* This,enum SupportedTextSelection *supportedTextSelection) {
    return This->lpVtbl->get_SupportedTextSelection(This,supportedTextSelection);
}
/*** IUIAutomationTextEditPattern methods ***/
static inline HRESULT IUIAutomationTextEditPattern_GetActiveComposition(IUIAutomationTextEditPattern* This,IUIAutomationTextRange **range) {
    return This->lpVtbl->GetActiveComposition(This,range);
}
static 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 inline HRESULT IUIAutomationCustomNavigationPattern_QueryInterface(IUIAutomationCustomNavigationPattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationCustomNavigationPattern_AddRef(IUIAutomationCustomNavigationPattern* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationCustomNavigationPattern_Release(IUIAutomationCustomNavigationPattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationCustomNavigationPattern methods ***/
static 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 inline HRESULT IUIAutomationActiveTextPositionChangedEventHandler_QueryInterface(IUIAutomationActiveTextPositionChangedEventHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationActiveTextPositionChangedEventHandler_AddRef(IUIAutomationActiveTextPositionChangedEventHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationActiveTextPositionChangedEventHandler_Release(IUIAutomationActiveTextPositionChangedEventHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationActiveTextPositionChangedEventHandler methods ***/
static 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 inline HRESULT IUIAutomationLegacyIAccessiblePattern_QueryInterface(IUIAutomationLegacyIAccessiblePattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationLegacyIAccessiblePattern_AddRef(IUIAutomationLegacyIAccessiblePattern* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationLegacyIAccessiblePattern_Release(IUIAutomationLegacyIAccessiblePattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationLegacyIAccessiblePattern methods ***/
static inline HRESULT IUIAutomationLegacyIAccessiblePattern_Select(IUIAutomationLegacyIAccessiblePattern* This,LONG flagsSelect) {
    return This->lpVtbl->Select(This,flagsSelect);
}
static inline HRESULT IUIAutomationLegacyIAccessiblePattern_DoDefaultAction(IUIAutomationLegacyIAccessiblePattern* This) {
    return This->lpVtbl->DoDefaultAction(This);
}
static inline HRESULT IUIAutomationLegacyIAccessiblePattern_SetValue(IUIAutomationLegacyIAccessiblePattern* This,LPCWSTR szValue) {
    return This->lpVtbl->SetValue(This,szValue);
}
static inline HRESULT IUIAutomationLegacyIAccessiblePattern_get_CurrentChildId(IUIAutomationLegacyIAccessiblePattern* This,int *pRetVal) {
    return This->lpVtbl->get_CurrentChildId(This,pRetVal);
}
static inline HRESULT IUIAutomationLegacyIAccessiblePattern_get_CurrentName(IUIAutomationLegacyIAccessiblePattern* This,BSTR *pszName) {
    return This->lpVtbl->get_CurrentName(This,pszName);
}
static inline HRESULT IUIAutomationLegacyIAccessiblePattern_get_CurrentValue(IUIAutomationLegacyIAccessiblePattern* This,BSTR *pszValue) {
    return This->lpVtbl->get_CurrentValue(This,pszValue);
}
static inline HRESULT IUIAutomationLegacyIAccessiblePattern_get_CurrentDescription(IUIAutomationLegacyIAccessiblePattern* This,BSTR *pszDescription) {
    return This->lpVtbl->get_CurrentDescription(This,pszDescription);
}
static inline HRESULT IUIAutomationLegacyIAccessiblePattern_get_CurrentRole(IUIAutomationLegacyIAccessiblePattern* This,DWORD *pdwRole) {
    return This->lpVtbl->get_CurrentRole(This,pdwRole);
}
static inline HRESULT IUIAutomationLegacyIAccessiblePattern_get_CurrentState(IUIAutomationLegacyIAccessiblePattern* This,DWORD *pdwState) {
    return This->lpVtbl->get_CurrentState(This,pdwState);
}
static inline HRESULT IUIAutomationLegacyIAccessiblePattern_get_CurrentHelp(IUIAutomationLegacyIAccessiblePattern* This,BSTR *pszHelp) {
    return This->lpVtbl->get_CurrentHelp(This,pszHelp);
}
static inline HRESULT IUIAutomationLegacyIAccessiblePattern_get_CurrentKeyboardShortcut(IUIAutomationLegacyIAccessiblePattern* This,BSTR *pszKeyboardShortcut) {
    return This->lpVtbl->get_CurrentKeyboardShortcut(This,pszKeyboardShortcut);
}
static inline HRESULT IUIAutomationLegacyIAccessiblePattern_GetCurrentSelection(IUIAutomationLegacyIAccessiblePattern* This,IUIAutomationElementArray **pvarSelectedChildren) {
    return This->lpVtbl->GetCurrentSelection(This,pvarSelectedChildren);
}
static inline HRESULT IUIAutomationLegacyIAccessiblePattern_get_CurrentDefaultAction(IUIAutomationLegacyIAccessiblePattern* This,BSTR *pszDefaultAction) {
    return This->lpVtbl->get_CurrentDefaultAction(This,pszDefaultAction);
}
static inline HRESULT IUIAutomationLegacyIAccessiblePattern_get_CachedChildId(IUIAutomationLegacyIAccessiblePattern* This,int *pRetVal) {
    return This->lpVtbl->get_CachedChildId(This,pRetVal);
}
static inline HRESULT IUIAutomationLegacyIAccessiblePattern_get_CachedName(IUIAutomationLegacyIAccessiblePattern* This,BSTR *pszName) {
    return This->lpVtbl->get_CachedName(This,pszName);
}
static inline HRESULT IUIAutomationLegacyIAccessiblePattern_get_CachedValue(IUIAutomationLegacyIAccessiblePattern* This,BSTR *pszValue) {
    return This->lpVtbl->get_CachedValue(This,pszValue);
}
static inline HRESULT IUIAutomationLegacyIAccessiblePattern_get_CachedDescription(IUIAutomationLegacyIAccessiblePattern* This,BSTR *pszDescription) {
    return This->lpVtbl->get_CachedDescription(This,pszDescription);
}
static inline HRESULT IUIAutomationLegacyIAccessiblePattern_get_CachedRole(IUIAutomationLegacyIAccessiblePattern* This,DWORD *pdwRole) {
    return This->lpVtbl->get_CachedRole(This,pdwRole);
}
static inline HRESULT IUIAutomationLegacyIAccessiblePattern_get_CachedState(IUIAutomationLegacyIAccessiblePattern* This,DWORD *pdwState) {
    return This->lpVtbl->get_CachedState(This,pdwState);
}
static inline HRESULT IUIAutomationLegacyIAccessiblePattern_get_CachedHelp(IUIAutomationLegacyIAccessiblePattern* This,BSTR *pszHelp) {
    return This->lpVtbl->get_CachedHelp(This,pszHelp);
}
static inline HRESULT IUIAutomationLegacyIAccessiblePattern_get_CachedKeyboardShortcut(IUIAutomationLegacyIAccessiblePattern* This,BSTR *pszKeyboardShortcut) {
    return This->lpVtbl->get_CachedKeyboardShortcut(This,pszKeyboardShortcut);
}
static inline HRESULT IUIAutomationLegacyIAccessiblePattern_GetCachedSelection(IUIAutomationLegacyIAccessiblePattern* This,IUIAutomationElementArray **pvarSelectedChildren) {
    return This->lpVtbl->GetCachedSelection(This,pvarSelectedChildren);
}
static inline HRESULT IUIAutomationLegacyIAccessiblePattern_get_CachedDefaultAction(IUIAutomationLegacyIAccessiblePattern* This,BSTR *pszDefaultAction) {
    return This->lpVtbl->get_CachedDefaultAction(This,pszDefaultAction);
}
static 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 inline HRESULT IUIAutomationItemContainerPattern_QueryInterface(IUIAutomationItemContainerPattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationItemContainerPattern_AddRef(IUIAutomationItemContainerPattern* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationItemContainerPattern_Release(IUIAutomationItemContainerPattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationItemContainerPattern methods ***/
static 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 inline HRESULT IUIAutomationVirtualizedItemPattern_QueryInterface(IUIAutomationVirtualizedItemPattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationVirtualizedItemPattern_AddRef(IUIAutomationVirtualizedItemPattern* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationVirtualizedItemPattern_Release(IUIAutomationVirtualizedItemPattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationVirtualizedItemPattern methods ***/
static 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 inline HRESULT IUIAutomationAnnotationPattern_QueryInterface(IUIAutomationAnnotationPattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationAnnotationPattern_AddRef(IUIAutomationAnnotationPattern* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationAnnotationPattern_Release(IUIAutomationAnnotationPattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationAnnotationPattern methods ***/
static inline HRESULT IUIAutomationAnnotationPattern_get_CurrentAnnotationTypeId(IUIAutomationAnnotationPattern* This,int *retVal) {
    return This->lpVtbl->get_CurrentAnnotationTypeId(This,retVal);
}
static inline HRESULT IUIAutomationAnnotationPattern_get_CurrentAnnotationTypeName(IUIAutomationAnnotationPattern* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAnnotationTypeName(This,retVal);
}
static inline HRESULT IUIAutomationAnnotationPattern_get_CurrentAuthor(IUIAutomationAnnotationPattern* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAuthor(This,retVal);
}
static inline HRESULT IUIAutomationAnnotationPattern_get_CurrentDateTime(IUIAutomationAnnotationPattern* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentDateTime(This,retVal);
}
static inline HRESULT IUIAutomationAnnotationPattern_get_CurrentTarget(IUIAutomationAnnotationPattern* This,IUIAutomationElement **retVal) {
    return This->lpVtbl->get_CurrentTarget(This,retVal);
}
static inline HRESULT IUIAutomationAnnotationPattern_get_CachedAnnotationTypeId(IUIAutomationAnnotationPattern* This,int *retVal) {
    return This->lpVtbl->get_CachedAnnotationTypeId(This,retVal);
}
static inline HRESULT IUIAutomationAnnotationPattern_get_CachedAnnotationTypeName(IUIAutomationAnnotationPattern* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAnnotationTypeName(This,retVal);
}
static inline HRESULT IUIAutomationAnnotationPattern_get_CachedAuthor(IUIAutomationAnnotationPattern* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAuthor(This,retVal);
}
static inline HRESULT IUIAutomationAnnotationPattern_get_CachedDateTime(IUIAutomationAnnotationPattern* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedDateTime(This,retVal);
}
static 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 inline HRESULT IUIAutomationStylesPattern_QueryInterface(IUIAutomationStylesPattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationStylesPattern_AddRef(IUIAutomationStylesPattern* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationStylesPattern_Release(IUIAutomationStylesPattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationStylesPattern methods ***/
static inline HRESULT IUIAutomationStylesPattern_get_CurrentStyleId(IUIAutomationStylesPattern* This,int *retVal) {
    return This->lpVtbl->get_CurrentStyleId(This,retVal);
}
static inline HRESULT IUIAutomationStylesPattern_get_CurrentStyleName(IUIAutomationStylesPattern* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentStyleName(This,retVal);
}
static inline HRESULT IUIAutomationStylesPattern_get_CurrentFillColor(IUIAutomationStylesPattern* This,int *retVal) {
    return This->lpVtbl->get_CurrentFillColor(This,retVal);
}
static inline HRESULT IUIAutomationStylesPattern_get_CurrentFillPatternStyle(IUIAutomationStylesPattern* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentFillPatternStyle(This,retVal);
}
static inline HRESULT IUIAutomationStylesPattern_get_CurrentShape(IUIAutomationStylesPattern* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentShape(This,retVal);
}
static inline HRESULT IUIAutomationStylesPattern_get_CurrentFillPatternColor(IUIAutomationStylesPattern* This,int *retVal) {
    return This->lpVtbl->get_CurrentFillPatternColor(This,retVal);
}
static inline HRESULT IUIAutomationStylesPattern_get_CurrentExtendedProperties(IUIAutomationStylesPattern* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentExtendedProperties(This,retVal);
}
static inline HRESULT IUIAutomationStylesPattern_GetCurrentExtendedPropertiesAsArray(IUIAutomationStylesPattern* This,struct ExtendedProperty **propertyArray,int *propertyCount) {
    return This->lpVtbl->GetCurrentExtendedPropertiesAsArray(This,propertyArray,propertyCount);
}
static inline HRESULT IUIAutomationStylesPattern_get_CachedStyleId(IUIAutomationStylesPattern* This,int *retVal) {
    return This->lpVtbl->get_CachedStyleId(This,retVal);
}
static inline HRESULT IUIAutomationStylesPattern_get_CachedStyleName(IUIAutomationStylesPattern* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedStyleName(This,retVal);
}
static inline HRESULT IUIAutomationStylesPattern_get_CachedFillColor(IUIAutomationStylesPattern* This,int *retVal) {
    return This->lpVtbl->get_CachedFillColor(This,retVal);
}
static inline HRESULT IUIAutomationStylesPattern_get_CachedFillPatternStyle(IUIAutomationStylesPattern* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedFillPatternStyle(This,retVal);
}
static inline HRESULT IUIAutomationStylesPattern_get_CachedShape(IUIAutomationStylesPattern* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedShape(This,retVal);
}
static inline HRESULT IUIAutomationStylesPattern_get_CachedFillPatternColor(IUIAutomationStylesPattern* This,int *retVal) {
    return This->lpVtbl->get_CachedFillPatternColor(This,retVal);
}
static inline HRESULT IUIAutomationStylesPattern_get_CachedExtendedProperties(IUIAutomationStylesPattern* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedExtendedProperties(This,retVal);
}
static 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 inline HRESULT IUIAutomationSpreadsheetPattern_QueryInterface(IUIAutomationSpreadsheetPattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationSpreadsheetPattern_AddRef(IUIAutomationSpreadsheetPattern* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationSpreadsheetPattern_Release(IUIAutomationSpreadsheetPattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationSpreadsheetPattern methods ***/
static 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 inline HRESULT IUIAutomationSpreadsheetItemPattern_QueryInterface(IUIAutomationSpreadsheetItemPattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationSpreadsheetItemPattern_AddRef(IUIAutomationSpreadsheetItemPattern* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationSpreadsheetItemPattern_Release(IUIAutomationSpreadsheetItemPattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationSpreadsheetItemPattern methods ***/
static inline HRESULT IUIAutomationSpreadsheetItemPattern_get_CurrentFormula(IUIAutomationSpreadsheetItemPattern* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentFormula(This,retVal);
}
static inline HRESULT IUIAutomationSpreadsheetItemPattern_GetCurrentAnnotationObjects(IUIAutomationSpreadsheetItemPattern* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->GetCurrentAnnotationObjects(This,retVal);
}
static inline HRESULT IUIAutomationSpreadsheetItemPattern_GetCurrentAnnotationTypes(IUIAutomationSpreadsheetItemPattern* This,SAFEARRAY **retVal) {
    return This->lpVtbl->GetCurrentAnnotationTypes(This,retVal);
}
static inline HRESULT IUIAutomationSpreadsheetItemPattern_get_CachedFormula(IUIAutomationSpreadsheetItemPattern* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedFormula(This,retVal);
}
static inline HRESULT IUIAutomationSpreadsheetItemPattern_GetCachedAnnotationObjects(IUIAutomationSpreadsheetItemPattern* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->GetCachedAnnotationObjects(This,retVal);
}
static 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 inline HRESULT IUIAutomationTransformPattern2_QueryInterface(IUIAutomationTransformPattern2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationTransformPattern2_AddRef(IUIAutomationTransformPattern2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationTransformPattern2_Release(IUIAutomationTransformPattern2* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationTransformPattern methods ***/
static inline HRESULT IUIAutomationTransformPattern2_Move(IUIAutomationTransformPattern2* This,double x,double y) {
    return This->lpVtbl->Move(This,x,y);
}
static inline HRESULT IUIAutomationTransformPattern2_Resize(IUIAutomationTransformPattern2* This,double width,double height) {
    return This->lpVtbl->Resize(This,width,height);
}
static inline HRESULT IUIAutomationTransformPattern2_Rotate(IUIAutomationTransformPattern2* This,double degrees) {
    return This->lpVtbl->Rotate(This,degrees);
}
static inline HRESULT IUIAutomationTransformPattern2_get_CurrentCanMove(IUIAutomationTransformPattern2* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentCanMove(This,retVal);
}
static inline HRESULT IUIAutomationTransformPattern2_get_CurrentCanResize(IUIAutomationTransformPattern2* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentCanResize(This,retVal);
}
static inline HRESULT IUIAutomationTransformPattern2_get_CurrentCanRotate(IUIAutomationTransformPattern2* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentCanRotate(This,retVal);
}
static inline HRESULT IUIAutomationTransformPattern2_get_CachedCanMove(IUIAutomationTransformPattern2* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedCanMove(This,retVal);
}
static inline HRESULT IUIAutomationTransformPattern2_get_CachedCanResize(IUIAutomationTransformPattern2* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedCanResize(This,retVal);
}
static inline HRESULT IUIAutomationTransformPattern2_get_CachedCanRotate(IUIAutomationTransformPattern2* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedCanRotate(This,retVal);
}
/*** IUIAutomationTransformPattern2 methods ***/
static inline HRESULT IUIAutomationTransformPattern2_Zoom(IUIAutomationTransformPattern2* This,double zoomValue) {
    return This->lpVtbl->Zoom(This,zoomValue);
}
static inline HRESULT IUIAutomationTransformPattern2_ZoomByUnit(IUIAutomationTransformPattern2* This,enum ZoomUnit zoomUnit) {
    return This->lpVtbl->ZoomByUnit(This,zoomUnit);
}
static inline HRESULT IUIAutomationTransformPattern2_get_CurrentCanZoom(IUIAutomationTransformPattern2* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentCanZoom(This,retVal);
}
static inline HRESULT IUIAutomationTransformPattern2_get_CachedCanZoom(IUIAutomationTransformPattern2* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedCanZoom(This,retVal);
}
static inline HRESULT IUIAutomationTransformPattern2_get_CurrentZoomLevel(IUIAutomationTransformPattern2* This,double *retVal) {
    return This->lpVtbl->get_CurrentZoomLevel(This,retVal);
}
static inline HRESULT IUIAutomationTransformPattern2_get_CachedZoomLevel(IUIAutomationTransformPattern2* This,double *retVal) {
    return This->lpVtbl->get_CachedZoomLevel(This,retVal);
}
static inline HRESULT IUIAutomationTransformPattern2_get_CurrentZoomMinimum(IUIAutomationTransformPattern2* This,double *retVal) {
    return This->lpVtbl->get_CurrentZoomMinimum(This,retVal);
}
static inline HRESULT IUIAutomationTransformPattern2_get_CachedZoomMinimum(IUIAutomationTransformPattern2* This,double *retVal) {
    return This->lpVtbl->get_CachedZoomMinimum(This,retVal);
}
static inline HRESULT IUIAutomationTransformPattern2_get_CurrentZoomMaximum(IUIAutomationTransformPattern2* This,double *retVal) {
    return This->lpVtbl->get_CurrentZoomMaximum(This,retVal);
}
static 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 inline HRESULT IUIAutomationTextChildPattern_QueryInterface(IUIAutomationTextChildPattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationTextChildPattern_AddRef(IUIAutomationTextChildPattern* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationTextChildPattern_Release(IUIAutomationTextChildPattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationTextChildPattern methods ***/
static inline HRESULT IUIAutomationTextChildPattern_get_TextContainer(IUIAutomationTextChildPattern* This,IUIAutomationElement **container) {
    return This->lpVtbl->get_TextContainer(This,container);
}
static 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 inline HRESULT IUIAutomationDragPattern_QueryInterface(IUIAutomationDragPattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationDragPattern_AddRef(IUIAutomationDragPattern* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationDragPattern_Release(IUIAutomationDragPattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationDragPattern methods ***/
static inline HRESULT IUIAutomationDragPattern_get_CurrentIsGrabbed(IUIAutomationDragPattern* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsGrabbed(This,retVal);
}
static inline HRESULT IUIAutomationDragPattern_get_CachedIsGrabbed(IUIAutomationDragPattern* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsGrabbed(This,retVal);
}
static inline HRESULT IUIAutomationDragPattern_get_CurrentDropEffect(IUIAutomationDragPattern* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentDropEffect(This,retVal);
}
static inline HRESULT IUIAutomationDragPattern_get_CachedDropEffect(IUIAutomationDragPattern* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedDropEffect(This,retVal);
}
static inline HRESULT IUIAutomationDragPattern_get_CurrentDropEffects(IUIAutomationDragPattern* This,SAFEARRAY **retVal) {
    return This->lpVtbl->get_CurrentDropEffects(This,retVal);
}
static inline HRESULT IUIAutomationDragPattern_get_CachedDropEffects(IUIAutomationDragPattern* This,SAFEARRAY **retVal) {
    return This->lpVtbl->get_CachedDropEffects(This,retVal);
}
static inline HRESULT IUIAutomationDragPattern_GetCurrentGrabbedItems(IUIAutomationDragPattern* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->GetCurrentGrabbedItems(This,retVal);
}
static 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 inline HRESULT IUIAutomationDropTargetPattern_QueryInterface(IUIAutomationDropTargetPattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationDropTargetPattern_AddRef(IUIAutomationDropTargetPattern* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationDropTargetPattern_Release(IUIAutomationDropTargetPattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationDropTargetPattern methods ***/
static inline HRESULT IUIAutomationDropTargetPattern_get_CurrentDropTargetEffect(IUIAutomationDropTargetPattern* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentDropTargetEffect(This,retVal);
}
static inline HRESULT IUIAutomationDropTargetPattern_get_CachedDropTargetEffect(IUIAutomationDropTargetPattern* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedDropTargetEffect(This,retVal);
}
static inline HRESULT IUIAutomationDropTargetPattern_get_CurrentDropTargetEffects(IUIAutomationDropTargetPattern* This,SAFEARRAY **retVal) {
    return This->lpVtbl->get_CurrentDropTargetEffects(This,retVal);
}
static 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 inline HRESULT IUIAutomationElement_QueryInterface(IUIAutomationElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationElement_AddRef(IUIAutomationElement* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationElement_Release(IUIAutomationElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationElement methods ***/
static inline HRESULT IUIAutomationElement_SetFocus(IUIAutomationElement* This) {
    return This->lpVtbl->SetFocus(This);
}
static inline HRESULT IUIAutomationElement_GetRuntimeId(IUIAutomationElement* This,SAFEARRAY **runtimeId) {
    return This->lpVtbl->GetRuntimeId(This,runtimeId);
}
static inline HRESULT IUIAutomationElement_FindFirst(IUIAutomationElement* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationElement **found) {
    return This->lpVtbl->FindFirst(This,scope,condition,found);
}
static inline HRESULT IUIAutomationElement_FindAll(IUIAutomationElement* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationElementArray **found) {
    return This->lpVtbl->FindAll(This,scope,condition,found);
}
static 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 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 inline HRESULT IUIAutomationElement_BuildUpdatedCache(IUIAutomationElement* This,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **updatedElement) {
    return This->lpVtbl->BuildUpdatedCache(This,cacheRequest,updatedElement);
}
static inline HRESULT IUIAutomationElement_GetCurrentPropertyValue(IUIAutomationElement* This,PROPERTYID propertyId,VARIANT *retVal) {
    return This->lpVtbl->GetCurrentPropertyValue(This,propertyId,retVal);
}
static inline HRESULT IUIAutomationElement_GetCurrentPropertyValueEx(IUIAutomationElement* This,PROPERTYID propertyId,WINBOOL ignoreDefaultValue,VARIANT *retVal) {
    return This->lpVtbl->GetCurrentPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal);
}
static inline HRESULT IUIAutomationElement_GetCachedPropertyValue(IUIAutomationElement* This,PROPERTYID propertyId,VARIANT *retVal) {
    return This->lpVtbl->GetCachedPropertyValue(This,propertyId,retVal);
}
static inline HRESULT IUIAutomationElement_GetCachedPropertyValueEx(IUIAutomationElement* This,PROPERTYID propertyId,WINBOOL ignoreDefaultValue,VARIANT *retVal) {
    return This->lpVtbl->GetCachedPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal);
}
static inline HRESULT IUIAutomationElement_GetCurrentPatternAs(IUIAutomationElement* This,PATTERNID patternId,REFIID riid,void **patternObject) {
    return This->lpVtbl->GetCurrentPatternAs(This,patternId,riid,patternObject);
}
static inline HRESULT IUIAutomationElement_GetCachedPatternAs(IUIAutomationElement* This,PATTERNID patternId,REFIID riid,void **patternObject) {
    return This->lpVtbl->GetCachedPatternAs(This,patternId,riid,patternObject);
}
static inline HRESULT IUIAutomationElement_GetCurrentPattern(IUIAutomationElement* This,PATTERNID patternId,IUnknown **patternObject) {
    return This->lpVtbl->GetCurrentPattern(This,patternId,patternObject);
}
static inline HRESULT IUIAutomationElement_GetCachedPattern(IUIAutomationElement* This,PATTERNID patternId,IUnknown **patternObject) {
    return This->lpVtbl->GetCachedPattern(This,patternId,patternObject);
}
static inline HRESULT IUIAutomationElement_GetCachedParent(IUIAutomationElement* This,IUIAutomationElement **parent) {
    return This->lpVtbl->GetCachedParent(This,parent);
}
static inline HRESULT IUIAutomationElement_GetCachedChildren(IUIAutomationElement* This,IUIAutomationElementArray **children) {
    return This->lpVtbl->GetCachedChildren(This,children);
}
static inline HRESULT IUIAutomationElement_get_CurrentProcessId(IUIAutomationElement* This,int *retVal) {
    return This->lpVtbl->get_CurrentProcessId(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CurrentControlType(IUIAutomationElement* This,CONTROLTYPEID *retVal) {
    return This->lpVtbl->get_CurrentControlType(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CurrentLocalizedControlType(IUIAutomationElement* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentLocalizedControlType(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CurrentName(IUIAutomationElement* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentName(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CurrentAcceleratorKey(IUIAutomationElement* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAcceleratorKey(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CurrentAccessKey(IUIAutomationElement* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAccessKey(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CurrentHasKeyboardFocus(IUIAutomationElement* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentHasKeyboardFocus(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CurrentIsKeyboardFocusable(IUIAutomationElement* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsKeyboardFocusable(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CurrentIsEnabled(IUIAutomationElement* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsEnabled(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CurrentAutomationId(IUIAutomationElement* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAutomationId(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CurrentClassName(IUIAutomationElement* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentClassName(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CurrentHelpText(IUIAutomationElement* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentHelpText(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CurrentCulture(IUIAutomationElement* This,int *retVal) {
    return This->lpVtbl->get_CurrentCulture(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CurrentIsControlElement(IUIAutomationElement* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsControlElement(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CurrentIsContentElement(IUIAutomationElement* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsContentElement(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CurrentIsPassword(IUIAutomationElement* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsPassword(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CurrentNativeWindowHandle(IUIAutomationElement* This,UIA_HWND *retVal) {
    return This->lpVtbl->get_CurrentNativeWindowHandle(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CurrentItemType(IUIAutomationElement* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentItemType(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CurrentIsOffscreen(IUIAutomationElement* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsOffscreen(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CurrentOrientation(IUIAutomationElement* This,enum OrientationType *retVal) {
    return This->lpVtbl->get_CurrentOrientation(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CurrentFrameworkId(IUIAutomationElement* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentFrameworkId(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CurrentIsRequiredForForm(IUIAutomationElement* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsRequiredForForm(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CurrentItemStatus(IUIAutomationElement* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentItemStatus(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CurrentBoundingRectangle(IUIAutomationElement* This,RECT *retVal) {
    return This->lpVtbl->get_CurrentBoundingRectangle(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CurrentLabeledBy(IUIAutomationElement* This,IUIAutomationElement **retVal) {
    return This->lpVtbl->get_CurrentLabeledBy(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CurrentAriaRole(IUIAutomationElement* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAriaRole(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CurrentAriaProperties(IUIAutomationElement* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAriaProperties(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CurrentIsDataValidForForm(IUIAutomationElement* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsDataValidForForm(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CurrentControllerFor(IUIAutomationElement* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentControllerFor(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CurrentDescribedBy(IUIAutomationElement* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentDescribedBy(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CurrentFlowsTo(IUIAutomationElement* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentFlowsTo(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CurrentProviderDescription(IUIAutomationElement* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentProviderDescription(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CachedProcessId(IUIAutomationElement* This,int *retVal) {
    return This->lpVtbl->get_CachedProcessId(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CachedControlType(IUIAutomationElement* This,CONTROLTYPEID *retVal) {
    return This->lpVtbl->get_CachedControlType(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CachedLocalizedControlType(IUIAutomationElement* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedLocalizedControlType(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CachedName(IUIAutomationElement* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedName(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CachedAcceleratorKey(IUIAutomationElement* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAcceleratorKey(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CachedAccessKey(IUIAutomationElement* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAccessKey(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CachedHasKeyboardFocus(IUIAutomationElement* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedHasKeyboardFocus(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CachedIsKeyboardFocusable(IUIAutomationElement* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsKeyboardFocusable(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CachedIsEnabled(IUIAutomationElement* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsEnabled(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CachedAutomationId(IUIAutomationElement* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAutomationId(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CachedClassName(IUIAutomationElement* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedClassName(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CachedHelpText(IUIAutomationElement* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedHelpText(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CachedCulture(IUIAutomationElement* This,int *retVal) {
    return This->lpVtbl->get_CachedCulture(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CachedIsControlElement(IUIAutomationElement* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsControlElement(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CachedIsContentElement(IUIAutomationElement* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsContentElement(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CachedIsPassword(IUIAutomationElement* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsPassword(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CachedNativeWindowHandle(IUIAutomationElement* This,UIA_HWND *retVal) {
    return This->lpVtbl->get_CachedNativeWindowHandle(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CachedItemType(IUIAutomationElement* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedItemType(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CachedIsOffscreen(IUIAutomationElement* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsOffscreen(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CachedOrientation(IUIAutomationElement* This,enum OrientationType *retVal) {
    return This->lpVtbl->get_CachedOrientation(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CachedFrameworkId(IUIAutomationElement* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedFrameworkId(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CachedIsRequiredForForm(IUIAutomationElement* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsRequiredForForm(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CachedItemStatus(IUIAutomationElement* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedItemStatus(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CachedBoundingRectangle(IUIAutomationElement* This,RECT *retVal) {
    return This->lpVtbl->get_CachedBoundingRectangle(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CachedLabeledBy(IUIAutomationElement* This,IUIAutomationElement **retVal) {
    return This->lpVtbl->get_CachedLabeledBy(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CachedAriaRole(IUIAutomationElement* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAriaRole(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CachedAriaProperties(IUIAutomationElement* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAriaProperties(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CachedIsDataValidForForm(IUIAutomationElement* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsDataValidForForm(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CachedControllerFor(IUIAutomationElement* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedControllerFor(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CachedDescribedBy(IUIAutomationElement* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedDescribedBy(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CachedFlowsTo(IUIAutomationElement* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedFlowsTo(This,retVal);
}
static inline HRESULT IUIAutomationElement_get_CachedProviderDescription(IUIAutomationElement* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedProviderDescription(This,retVal);
}
static 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 inline HRESULT IUIAutomationElement2_QueryInterface(IUIAutomationElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationElement2_AddRef(IUIAutomationElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationElement2_Release(IUIAutomationElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationElement methods ***/
static inline HRESULT IUIAutomationElement2_SetFocus(IUIAutomationElement2* This) {
    return This->lpVtbl->SetFocus(This);
}
static inline HRESULT IUIAutomationElement2_GetRuntimeId(IUIAutomationElement2* This,SAFEARRAY **runtimeId) {
    return This->lpVtbl->GetRuntimeId(This,runtimeId);
}
static inline HRESULT IUIAutomationElement2_FindFirst(IUIAutomationElement2* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationElement **found) {
    return This->lpVtbl->FindFirst(This,scope,condition,found);
}
static inline HRESULT IUIAutomationElement2_FindAll(IUIAutomationElement2* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationElementArray **found) {
    return This->lpVtbl->FindAll(This,scope,condition,found);
}
static 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 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 inline HRESULT IUIAutomationElement2_BuildUpdatedCache(IUIAutomationElement2* This,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **updatedElement) {
    return This->lpVtbl->BuildUpdatedCache(This,cacheRequest,updatedElement);
}
static inline HRESULT IUIAutomationElement2_GetCurrentPropertyValue(IUIAutomationElement2* This,PROPERTYID propertyId,VARIANT *retVal) {
    return This->lpVtbl->GetCurrentPropertyValue(This,propertyId,retVal);
}
static inline HRESULT IUIAutomationElement2_GetCurrentPropertyValueEx(IUIAutomationElement2* This,PROPERTYID propertyId,WINBOOL ignoreDefaultValue,VARIANT *retVal) {
    return This->lpVtbl->GetCurrentPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal);
}
static inline HRESULT IUIAutomationElement2_GetCachedPropertyValue(IUIAutomationElement2* This,PROPERTYID propertyId,VARIANT *retVal) {
    return This->lpVtbl->GetCachedPropertyValue(This,propertyId,retVal);
}
static inline HRESULT IUIAutomationElement2_GetCachedPropertyValueEx(IUIAutomationElement2* This,PROPERTYID propertyId,WINBOOL ignoreDefaultValue,VARIANT *retVal) {
    return This->lpVtbl->GetCachedPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal);
}
static inline HRESULT IUIAutomationElement2_GetCurrentPatternAs(IUIAutomationElement2* This,PATTERNID patternId,REFIID riid,void **patternObject) {
    return This->lpVtbl->GetCurrentPatternAs(This,patternId,riid,patternObject);
}
static inline HRESULT IUIAutomationElement2_GetCachedPatternAs(IUIAutomationElement2* This,PATTERNID patternId,REFIID riid,void **patternObject) {
    return This->lpVtbl->GetCachedPatternAs(This,patternId,riid,patternObject);
}
static inline HRESULT IUIAutomationElement2_GetCurrentPattern(IUIAutomationElement2* This,PATTERNID patternId,IUnknown **patternObject) {
    return This->lpVtbl->GetCurrentPattern(This,patternId,patternObject);
}
static inline HRESULT IUIAutomationElement2_GetCachedPattern(IUIAutomationElement2* This,PATTERNID patternId,IUnknown **patternObject) {
    return This->lpVtbl->GetCachedPattern(This,patternId,patternObject);
}
static inline HRESULT IUIAutomationElement2_GetCachedParent(IUIAutomationElement2* This,IUIAutomationElement **parent) {
    return This->lpVtbl->GetCachedParent(This,parent);
}
static inline HRESULT IUIAutomationElement2_GetCachedChildren(IUIAutomationElement2* This,IUIAutomationElementArray **children) {
    return This->lpVtbl->GetCachedChildren(This,children);
}
static inline HRESULT IUIAutomationElement2_get_CurrentProcessId(IUIAutomationElement2* This,int *retVal) {
    return This->lpVtbl->get_CurrentProcessId(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CurrentControlType(IUIAutomationElement2* This,CONTROLTYPEID *retVal) {
    return This->lpVtbl->get_CurrentControlType(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CurrentLocalizedControlType(IUIAutomationElement2* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentLocalizedControlType(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CurrentName(IUIAutomationElement2* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentName(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CurrentAcceleratorKey(IUIAutomationElement2* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAcceleratorKey(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CurrentAccessKey(IUIAutomationElement2* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAccessKey(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CurrentHasKeyboardFocus(IUIAutomationElement2* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentHasKeyboardFocus(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CurrentIsKeyboardFocusable(IUIAutomationElement2* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsKeyboardFocusable(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CurrentIsEnabled(IUIAutomationElement2* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsEnabled(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CurrentAutomationId(IUIAutomationElement2* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAutomationId(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CurrentClassName(IUIAutomationElement2* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentClassName(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CurrentHelpText(IUIAutomationElement2* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentHelpText(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CurrentCulture(IUIAutomationElement2* This,int *retVal) {
    return This->lpVtbl->get_CurrentCulture(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CurrentIsControlElement(IUIAutomationElement2* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsControlElement(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CurrentIsContentElement(IUIAutomationElement2* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsContentElement(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CurrentIsPassword(IUIAutomationElement2* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsPassword(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CurrentNativeWindowHandle(IUIAutomationElement2* This,UIA_HWND *retVal) {
    return This->lpVtbl->get_CurrentNativeWindowHandle(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CurrentItemType(IUIAutomationElement2* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentItemType(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CurrentIsOffscreen(IUIAutomationElement2* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsOffscreen(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CurrentOrientation(IUIAutomationElement2* This,enum OrientationType *retVal) {
    return This->lpVtbl->get_CurrentOrientation(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CurrentFrameworkId(IUIAutomationElement2* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentFrameworkId(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CurrentIsRequiredForForm(IUIAutomationElement2* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsRequiredForForm(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CurrentItemStatus(IUIAutomationElement2* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentItemStatus(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CurrentBoundingRectangle(IUIAutomationElement2* This,RECT *retVal) {
    return This->lpVtbl->get_CurrentBoundingRectangle(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CurrentLabeledBy(IUIAutomationElement2* This,IUIAutomationElement **retVal) {
    return This->lpVtbl->get_CurrentLabeledBy(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CurrentAriaRole(IUIAutomationElement2* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAriaRole(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CurrentAriaProperties(IUIAutomationElement2* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAriaProperties(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CurrentIsDataValidForForm(IUIAutomationElement2* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsDataValidForForm(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CurrentControllerFor(IUIAutomationElement2* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentControllerFor(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CurrentDescribedBy(IUIAutomationElement2* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentDescribedBy(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CurrentFlowsTo(IUIAutomationElement2* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentFlowsTo(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CurrentProviderDescription(IUIAutomationElement2* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentProviderDescription(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CachedProcessId(IUIAutomationElement2* This,int *retVal) {
    return This->lpVtbl->get_CachedProcessId(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CachedControlType(IUIAutomationElement2* This,CONTROLTYPEID *retVal) {
    return This->lpVtbl->get_CachedControlType(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CachedLocalizedControlType(IUIAutomationElement2* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedLocalizedControlType(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CachedName(IUIAutomationElement2* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedName(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CachedAcceleratorKey(IUIAutomationElement2* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAcceleratorKey(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CachedAccessKey(IUIAutomationElement2* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAccessKey(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CachedHasKeyboardFocus(IUIAutomationElement2* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedHasKeyboardFocus(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CachedIsKeyboardFocusable(IUIAutomationElement2* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsKeyboardFocusable(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CachedIsEnabled(IUIAutomationElement2* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsEnabled(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CachedAutomationId(IUIAutomationElement2* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAutomationId(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CachedClassName(IUIAutomationElement2* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedClassName(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CachedHelpText(IUIAutomationElement2* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedHelpText(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CachedCulture(IUIAutomationElement2* This,int *retVal) {
    return This->lpVtbl->get_CachedCulture(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CachedIsControlElement(IUIAutomationElement2* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsControlElement(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CachedIsContentElement(IUIAutomationElement2* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsContentElement(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CachedIsPassword(IUIAutomationElement2* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsPassword(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CachedNativeWindowHandle(IUIAutomationElement2* This,UIA_HWND *retVal) {
    return This->lpVtbl->get_CachedNativeWindowHandle(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CachedItemType(IUIAutomationElement2* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedItemType(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CachedIsOffscreen(IUIAutomationElement2* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsOffscreen(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CachedOrientation(IUIAutomationElement2* This,enum OrientationType *retVal) {
    return This->lpVtbl->get_CachedOrientation(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CachedFrameworkId(IUIAutomationElement2* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedFrameworkId(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CachedIsRequiredForForm(IUIAutomationElement2* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsRequiredForForm(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CachedItemStatus(IUIAutomationElement2* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedItemStatus(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CachedBoundingRectangle(IUIAutomationElement2* This,RECT *retVal) {
    return This->lpVtbl->get_CachedBoundingRectangle(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CachedLabeledBy(IUIAutomationElement2* This,IUIAutomationElement **retVal) {
    return This->lpVtbl->get_CachedLabeledBy(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CachedAriaRole(IUIAutomationElement2* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAriaRole(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CachedAriaProperties(IUIAutomationElement2* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAriaProperties(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CachedIsDataValidForForm(IUIAutomationElement2* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsDataValidForForm(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CachedControllerFor(IUIAutomationElement2* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedControllerFor(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CachedDescribedBy(IUIAutomationElement2* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedDescribedBy(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CachedFlowsTo(IUIAutomationElement2* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedFlowsTo(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CachedProviderDescription(IUIAutomationElement2* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedProviderDescription(This,retVal);
}
static inline HRESULT IUIAutomationElement2_GetClickablePoint(IUIAutomationElement2* This,POINT *clickable,WINBOOL *gotClickable) {
    return This->lpVtbl->GetClickablePoint(This,clickable,gotClickable);
}
/*** IUIAutomationElement2 methods ***/
static inline HRESULT IUIAutomationElement2_get_CurrentOptimizeForVisualContent(IUIAutomationElement2* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentOptimizeForVisualContent(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CachedOptimizeForVisualContent(IUIAutomationElement2* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedOptimizeForVisualContent(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CurrentLiveSetting(IUIAutomationElement2* This,enum LiveSetting *retVal) {
    return This->lpVtbl->get_CurrentLiveSetting(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CachedLiveSetting(IUIAutomationElement2* This,enum LiveSetting *retVal) {
    return This->lpVtbl->get_CachedLiveSetting(This,retVal);
}
static inline HRESULT IUIAutomationElement2_get_CurrentFlowsFrom(IUIAutomationElement2* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentFlowsFrom(This,retVal);
}
static 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 inline HRESULT IUIAutomationElement3_QueryInterface(IUIAutomationElement3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationElement3_AddRef(IUIAutomationElement3* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationElement3_Release(IUIAutomationElement3* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationElement methods ***/
static inline HRESULT IUIAutomationElement3_SetFocus(IUIAutomationElement3* This) {
    return This->lpVtbl->SetFocus(This);
}
static inline HRESULT IUIAutomationElement3_GetRuntimeId(IUIAutomationElement3* This,SAFEARRAY **runtimeId) {
    return This->lpVtbl->GetRuntimeId(This,runtimeId);
}
static inline HRESULT IUIAutomationElement3_FindFirst(IUIAutomationElement3* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationElement **found) {
    return This->lpVtbl->FindFirst(This,scope,condition,found);
}
static inline HRESULT IUIAutomationElement3_FindAll(IUIAutomationElement3* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationElementArray **found) {
    return This->lpVtbl->FindAll(This,scope,condition,found);
}
static 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 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 inline HRESULT IUIAutomationElement3_BuildUpdatedCache(IUIAutomationElement3* This,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **updatedElement) {
    return This->lpVtbl->BuildUpdatedCache(This,cacheRequest,updatedElement);
}
static inline HRESULT IUIAutomationElement3_GetCurrentPropertyValue(IUIAutomationElement3* This,PROPERTYID propertyId,VARIANT *retVal) {
    return This->lpVtbl->GetCurrentPropertyValue(This,propertyId,retVal);
}
static inline HRESULT IUIAutomationElement3_GetCurrentPropertyValueEx(IUIAutomationElement3* This,PROPERTYID propertyId,WINBOOL ignoreDefaultValue,VARIANT *retVal) {
    return This->lpVtbl->GetCurrentPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal);
}
static inline HRESULT IUIAutomationElement3_GetCachedPropertyValue(IUIAutomationElement3* This,PROPERTYID propertyId,VARIANT *retVal) {
    return This->lpVtbl->GetCachedPropertyValue(This,propertyId,retVal);
}
static inline HRESULT IUIAutomationElement3_GetCachedPropertyValueEx(IUIAutomationElement3* This,PROPERTYID propertyId,WINBOOL ignoreDefaultValue,VARIANT *retVal) {
    return This->lpVtbl->GetCachedPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal);
}
static inline HRESULT IUIAutomationElement3_GetCurrentPatternAs(IUIAutomationElement3* This,PATTERNID patternId,REFIID riid,void **patternObject) {
    return This->lpVtbl->GetCurrentPatternAs(This,patternId,riid,patternObject);
}
static inline HRESULT IUIAutomationElement3_GetCachedPatternAs(IUIAutomationElement3* This,PATTERNID patternId,REFIID riid,void **patternObject) {
    return This->lpVtbl->GetCachedPatternAs(This,patternId,riid,patternObject);
}
static inline HRESULT IUIAutomationElement3_GetCurrentPattern(IUIAutomationElement3* This,PATTERNID patternId,IUnknown **patternObject) {
    return This->lpVtbl->GetCurrentPattern(This,patternId,patternObject);
}
static inline HRESULT IUIAutomationElement3_GetCachedPattern(IUIAutomationElement3* This,PATTERNID patternId,IUnknown **patternObject) {
    return This->lpVtbl->GetCachedPattern(This,patternId,patternObject);
}
static inline HRESULT IUIAutomationElement3_GetCachedParent(IUIAutomationElement3* This,IUIAutomationElement **parent) {
    return This->lpVtbl->GetCachedParent(This,parent);
}
static inline HRESULT IUIAutomationElement3_GetCachedChildren(IUIAutomationElement3* This,IUIAutomationElementArray **children) {
    return This->lpVtbl->GetCachedChildren(This,children);
}
static inline HRESULT IUIAutomationElement3_get_CurrentProcessId(IUIAutomationElement3* This,int *retVal) {
    return This->lpVtbl->get_CurrentProcessId(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CurrentControlType(IUIAutomationElement3* This,CONTROLTYPEID *retVal) {
    return This->lpVtbl->get_CurrentControlType(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CurrentLocalizedControlType(IUIAutomationElement3* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentLocalizedControlType(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CurrentName(IUIAutomationElement3* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentName(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CurrentAcceleratorKey(IUIAutomationElement3* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAcceleratorKey(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CurrentAccessKey(IUIAutomationElement3* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAccessKey(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CurrentHasKeyboardFocus(IUIAutomationElement3* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentHasKeyboardFocus(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CurrentIsKeyboardFocusable(IUIAutomationElement3* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsKeyboardFocusable(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CurrentIsEnabled(IUIAutomationElement3* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsEnabled(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CurrentAutomationId(IUIAutomationElement3* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAutomationId(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CurrentClassName(IUIAutomationElement3* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentClassName(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CurrentHelpText(IUIAutomationElement3* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentHelpText(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CurrentCulture(IUIAutomationElement3* This,int *retVal) {
    return This->lpVtbl->get_CurrentCulture(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CurrentIsControlElement(IUIAutomationElement3* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsControlElement(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CurrentIsContentElement(IUIAutomationElement3* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsContentElement(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CurrentIsPassword(IUIAutomationElement3* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsPassword(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CurrentNativeWindowHandle(IUIAutomationElement3* This,UIA_HWND *retVal) {
    return This->lpVtbl->get_CurrentNativeWindowHandle(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CurrentItemType(IUIAutomationElement3* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentItemType(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CurrentIsOffscreen(IUIAutomationElement3* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsOffscreen(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CurrentOrientation(IUIAutomationElement3* This,enum OrientationType *retVal) {
    return This->lpVtbl->get_CurrentOrientation(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CurrentFrameworkId(IUIAutomationElement3* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentFrameworkId(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CurrentIsRequiredForForm(IUIAutomationElement3* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsRequiredForForm(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CurrentItemStatus(IUIAutomationElement3* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentItemStatus(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CurrentBoundingRectangle(IUIAutomationElement3* This,RECT *retVal) {
    return This->lpVtbl->get_CurrentBoundingRectangle(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CurrentLabeledBy(IUIAutomationElement3* This,IUIAutomationElement **retVal) {
    return This->lpVtbl->get_CurrentLabeledBy(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CurrentAriaRole(IUIAutomationElement3* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAriaRole(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CurrentAriaProperties(IUIAutomationElement3* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAriaProperties(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CurrentIsDataValidForForm(IUIAutomationElement3* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsDataValidForForm(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CurrentControllerFor(IUIAutomationElement3* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentControllerFor(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CurrentDescribedBy(IUIAutomationElement3* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentDescribedBy(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CurrentFlowsTo(IUIAutomationElement3* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentFlowsTo(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CurrentProviderDescription(IUIAutomationElement3* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentProviderDescription(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CachedProcessId(IUIAutomationElement3* This,int *retVal) {
    return This->lpVtbl->get_CachedProcessId(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CachedControlType(IUIAutomationElement3* This,CONTROLTYPEID *retVal) {
    return This->lpVtbl->get_CachedControlType(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CachedLocalizedControlType(IUIAutomationElement3* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedLocalizedControlType(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CachedName(IUIAutomationElement3* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedName(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CachedAcceleratorKey(IUIAutomationElement3* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAcceleratorKey(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CachedAccessKey(IUIAutomationElement3* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAccessKey(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CachedHasKeyboardFocus(IUIAutomationElement3* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedHasKeyboardFocus(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CachedIsKeyboardFocusable(IUIAutomationElement3* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsKeyboardFocusable(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CachedIsEnabled(IUIAutomationElement3* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsEnabled(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CachedAutomationId(IUIAutomationElement3* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAutomationId(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CachedClassName(IUIAutomationElement3* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedClassName(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CachedHelpText(IUIAutomationElement3* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedHelpText(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CachedCulture(IUIAutomationElement3* This,int *retVal) {
    return This->lpVtbl->get_CachedCulture(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CachedIsControlElement(IUIAutomationElement3* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsControlElement(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CachedIsContentElement(IUIAutomationElement3* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsContentElement(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CachedIsPassword(IUIAutomationElement3* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsPassword(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CachedNativeWindowHandle(IUIAutomationElement3* This,UIA_HWND *retVal) {
    return This->lpVtbl->get_CachedNativeWindowHandle(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CachedItemType(IUIAutomationElement3* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedItemType(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CachedIsOffscreen(IUIAutomationElement3* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsOffscreen(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CachedOrientation(IUIAutomationElement3* This,enum OrientationType *retVal) {
    return This->lpVtbl->get_CachedOrientation(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CachedFrameworkId(IUIAutomationElement3* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedFrameworkId(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CachedIsRequiredForForm(IUIAutomationElement3* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsRequiredForForm(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CachedItemStatus(IUIAutomationElement3* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedItemStatus(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CachedBoundingRectangle(IUIAutomationElement3* This,RECT *retVal) {
    return This->lpVtbl->get_CachedBoundingRectangle(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CachedLabeledBy(IUIAutomationElement3* This,IUIAutomationElement **retVal) {
    return This->lpVtbl->get_CachedLabeledBy(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CachedAriaRole(IUIAutomationElement3* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAriaRole(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CachedAriaProperties(IUIAutomationElement3* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAriaProperties(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CachedIsDataValidForForm(IUIAutomationElement3* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsDataValidForForm(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CachedControllerFor(IUIAutomationElement3* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedControllerFor(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CachedDescribedBy(IUIAutomationElement3* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedDescribedBy(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CachedFlowsTo(IUIAutomationElement3* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedFlowsTo(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CachedProviderDescription(IUIAutomationElement3* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedProviderDescription(This,retVal);
}
static inline HRESULT IUIAutomationElement3_GetClickablePoint(IUIAutomationElement3* This,POINT *clickable,WINBOOL *gotClickable) {
    return This->lpVtbl->GetClickablePoint(This,clickable,gotClickable);
}
/*** IUIAutomationElement2 methods ***/
static inline HRESULT IUIAutomationElement3_get_CurrentOptimizeForVisualContent(IUIAutomationElement3* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentOptimizeForVisualContent(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CachedOptimizeForVisualContent(IUIAutomationElement3* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedOptimizeForVisualContent(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CurrentLiveSetting(IUIAutomationElement3* This,enum LiveSetting *retVal) {
    return This->lpVtbl->get_CurrentLiveSetting(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CachedLiveSetting(IUIAutomationElement3* This,enum LiveSetting *retVal) {
    return This->lpVtbl->get_CachedLiveSetting(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CurrentFlowsFrom(IUIAutomationElement3* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentFlowsFrom(This,retVal);
}
static inline HRESULT IUIAutomationElement3_get_CachedFlowsFrom(IUIAutomationElement3* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedFlowsFrom(This,retVal);
}
/*** IUIAutomationElement3 methods ***/
static inline HRESULT IUIAutomationElement3_ShowContextMenu(IUIAutomationElement3* This) {
    return This->lpVtbl->ShowContextMenu(This);
}
static inline HRESULT IUIAutomationElement3_get_CurrentIsPeripheral(IUIAutomationElement3* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsPeripheral(This,retVal);
}
static 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 inline HRESULT IUIAutomationElement4_QueryInterface(IUIAutomationElement4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationElement4_AddRef(IUIAutomationElement4* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationElement4_Release(IUIAutomationElement4* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationElement methods ***/
static inline HRESULT IUIAutomationElement4_SetFocus(IUIAutomationElement4* This) {
    return This->lpVtbl->SetFocus(This);
}
static inline HRESULT IUIAutomationElement4_GetRuntimeId(IUIAutomationElement4* This,SAFEARRAY **runtimeId) {
    return This->lpVtbl->GetRuntimeId(This,runtimeId);
}
static inline HRESULT IUIAutomationElement4_FindFirst(IUIAutomationElement4* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationElement **found) {
    return This->lpVtbl->FindFirst(This,scope,condition,found);
}
static inline HRESULT IUIAutomationElement4_FindAll(IUIAutomationElement4* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationElementArray **found) {
    return This->lpVtbl->FindAll(This,scope,condition,found);
}
static 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 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 inline HRESULT IUIAutomationElement4_BuildUpdatedCache(IUIAutomationElement4* This,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **updatedElement) {
    return This->lpVtbl->BuildUpdatedCache(This,cacheRequest,updatedElement);
}
static inline HRESULT IUIAutomationElement4_GetCurrentPropertyValue(IUIAutomationElement4* This,PROPERTYID propertyId,VARIANT *retVal) {
    return This->lpVtbl->GetCurrentPropertyValue(This,propertyId,retVal);
}
static inline HRESULT IUIAutomationElement4_GetCurrentPropertyValueEx(IUIAutomationElement4* This,PROPERTYID propertyId,WINBOOL ignoreDefaultValue,VARIANT *retVal) {
    return This->lpVtbl->GetCurrentPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal);
}
static inline HRESULT IUIAutomationElement4_GetCachedPropertyValue(IUIAutomationElement4* This,PROPERTYID propertyId,VARIANT *retVal) {
    return This->lpVtbl->GetCachedPropertyValue(This,propertyId,retVal);
}
static inline HRESULT IUIAutomationElement4_GetCachedPropertyValueEx(IUIAutomationElement4* This,PROPERTYID propertyId,WINBOOL ignoreDefaultValue,VARIANT *retVal) {
    return This->lpVtbl->GetCachedPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal);
}
static inline HRESULT IUIAutomationElement4_GetCurrentPatternAs(IUIAutomationElement4* This,PATTERNID patternId,REFIID riid,void **patternObject) {
    return This->lpVtbl->GetCurrentPatternAs(This,patternId,riid,patternObject);
}
static inline HRESULT IUIAutomationElement4_GetCachedPatternAs(IUIAutomationElement4* This,PATTERNID patternId,REFIID riid,void **patternObject) {
    return This->lpVtbl->GetCachedPatternAs(This,patternId,riid,patternObject);
}
static inline HRESULT IUIAutomationElement4_GetCurrentPattern(IUIAutomationElement4* This,PATTERNID patternId,IUnknown **patternObject) {
    return This->lpVtbl->GetCurrentPattern(This,patternId,patternObject);
}
static inline HRESULT IUIAutomationElement4_GetCachedPattern(IUIAutomationElement4* This,PATTERNID patternId,IUnknown **patternObject) {
    return This->lpVtbl->GetCachedPattern(This,patternId,patternObject);
}
static inline HRESULT IUIAutomationElement4_GetCachedParent(IUIAutomationElement4* This,IUIAutomationElement **parent) {
    return This->lpVtbl->GetCachedParent(This,parent);
}
static inline HRESULT IUIAutomationElement4_GetCachedChildren(IUIAutomationElement4* This,IUIAutomationElementArray **children) {
    return This->lpVtbl->GetCachedChildren(This,children);
}
static inline HRESULT IUIAutomationElement4_get_CurrentProcessId(IUIAutomationElement4* This,int *retVal) {
    return This->lpVtbl->get_CurrentProcessId(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CurrentControlType(IUIAutomationElement4* This,CONTROLTYPEID *retVal) {
    return This->lpVtbl->get_CurrentControlType(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CurrentLocalizedControlType(IUIAutomationElement4* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentLocalizedControlType(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CurrentName(IUIAutomationElement4* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentName(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CurrentAcceleratorKey(IUIAutomationElement4* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAcceleratorKey(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CurrentAccessKey(IUIAutomationElement4* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAccessKey(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CurrentHasKeyboardFocus(IUIAutomationElement4* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentHasKeyboardFocus(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CurrentIsKeyboardFocusable(IUIAutomationElement4* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsKeyboardFocusable(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CurrentIsEnabled(IUIAutomationElement4* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsEnabled(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CurrentAutomationId(IUIAutomationElement4* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAutomationId(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CurrentClassName(IUIAutomationElement4* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentClassName(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CurrentHelpText(IUIAutomationElement4* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentHelpText(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CurrentCulture(IUIAutomationElement4* This,int *retVal) {
    return This->lpVtbl->get_CurrentCulture(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CurrentIsControlElement(IUIAutomationElement4* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsControlElement(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CurrentIsContentElement(IUIAutomationElement4* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsContentElement(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CurrentIsPassword(IUIAutomationElement4* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsPassword(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CurrentNativeWindowHandle(IUIAutomationElement4* This,UIA_HWND *retVal) {
    return This->lpVtbl->get_CurrentNativeWindowHandle(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CurrentItemType(IUIAutomationElement4* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentItemType(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CurrentIsOffscreen(IUIAutomationElement4* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsOffscreen(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CurrentOrientation(IUIAutomationElement4* This,enum OrientationType *retVal) {
    return This->lpVtbl->get_CurrentOrientation(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CurrentFrameworkId(IUIAutomationElement4* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentFrameworkId(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CurrentIsRequiredForForm(IUIAutomationElement4* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsRequiredForForm(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CurrentItemStatus(IUIAutomationElement4* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentItemStatus(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CurrentBoundingRectangle(IUIAutomationElement4* This,RECT *retVal) {
    return This->lpVtbl->get_CurrentBoundingRectangle(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CurrentLabeledBy(IUIAutomationElement4* This,IUIAutomationElement **retVal) {
    return This->lpVtbl->get_CurrentLabeledBy(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CurrentAriaRole(IUIAutomationElement4* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAriaRole(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CurrentAriaProperties(IUIAutomationElement4* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAriaProperties(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CurrentIsDataValidForForm(IUIAutomationElement4* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsDataValidForForm(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CurrentControllerFor(IUIAutomationElement4* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentControllerFor(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CurrentDescribedBy(IUIAutomationElement4* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentDescribedBy(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CurrentFlowsTo(IUIAutomationElement4* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentFlowsTo(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CurrentProviderDescription(IUIAutomationElement4* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentProviderDescription(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CachedProcessId(IUIAutomationElement4* This,int *retVal) {
    return This->lpVtbl->get_CachedProcessId(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CachedControlType(IUIAutomationElement4* This,CONTROLTYPEID *retVal) {
    return This->lpVtbl->get_CachedControlType(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CachedLocalizedControlType(IUIAutomationElement4* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedLocalizedControlType(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CachedName(IUIAutomationElement4* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedName(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CachedAcceleratorKey(IUIAutomationElement4* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAcceleratorKey(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CachedAccessKey(IUIAutomationElement4* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAccessKey(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CachedHasKeyboardFocus(IUIAutomationElement4* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedHasKeyboardFocus(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CachedIsKeyboardFocusable(IUIAutomationElement4* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsKeyboardFocusable(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CachedIsEnabled(IUIAutomationElement4* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsEnabled(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CachedAutomationId(IUIAutomationElement4* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAutomationId(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CachedClassName(IUIAutomationElement4* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedClassName(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CachedHelpText(IUIAutomationElement4* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedHelpText(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CachedCulture(IUIAutomationElement4* This,int *retVal) {
    return This->lpVtbl->get_CachedCulture(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CachedIsControlElement(IUIAutomationElement4* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsControlElement(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CachedIsContentElement(IUIAutomationElement4* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsContentElement(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CachedIsPassword(IUIAutomationElement4* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsPassword(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CachedNativeWindowHandle(IUIAutomationElement4* This,UIA_HWND *retVal) {
    return This->lpVtbl->get_CachedNativeWindowHandle(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CachedItemType(IUIAutomationElement4* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedItemType(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CachedIsOffscreen(IUIAutomationElement4* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsOffscreen(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CachedOrientation(IUIAutomationElement4* This,enum OrientationType *retVal) {
    return This->lpVtbl->get_CachedOrientation(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CachedFrameworkId(IUIAutomationElement4* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedFrameworkId(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CachedIsRequiredForForm(IUIAutomationElement4* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsRequiredForForm(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CachedItemStatus(IUIAutomationElement4* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedItemStatus(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CachedBoundingRectangle(IUIAutomationElement4* This,RECT *retVal) {
    return This->lpVtbl->get_CachedBoundingRectangle(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CachedLabeledBy(IUIAutomationElement4* This,IUIAutomationElement **retVal) {
    return This->lpVtbl->get_CachedLabeledBy(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CachedAriaRole(IUIAutomationElement4* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAriaRole(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CachedAriaProperties(IUIAutomationElement4* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAriaProperties(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CachedIsDataValidForForm(IUIAutomationElement4* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsDataValidForForm(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CachedControllerFor(IUIAutomationElement4* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedControllerFor(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CachedDescribedBy(IUIAutomationElement4* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedDescribedBy(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CachedFlowsTo(IUIAutomationElement4* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedFlowsTo(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CachedProviderDescription(IUIAutomationElement4* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedProviderDescription(This,retVal);
}
static inline HRESULT IUIAutomationElement4_GetClickablePoint(IUIAutomationElement4* This,POINT *clickable,WINBOOL *gotClickable) {
    return This->lpVtbl->GetClickablePoint(This,clickable,gotClickable);
}
/*** IUIAutomationElement2 methods ***/
static inline HRESULT IUIAutomationElement4_get_CurrentOptimizeForVisualContent(IUIAutomationElement4* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentOptimizeForVisualContent(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CachedOptimizeForVisualContent(IUIAutomationElement4* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedOptimizeForVisualContent(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CurrentLiveSetting(IUIAutomationElement4* This,enum LiveSetting *retVal) {
    return This->lpVtbl->get_CurrentLiveSetting(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CachedLiveSetting(IUIAutomationElement4* This,enum LiveSetting *retVal) {
    return This->lpVtbl->get_CachedLiveSetting(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CurrentFlowsFrom(IUIAutomationElement4* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentFlowsFrom(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CachedFlowsFrom(IUIAutomationElement4* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedFlowsFrom(This,retVal);
}
/*** IUIAutomationElement3 methods ***/
static inline HRESULT IUIAutomationElement4_ShowContextMenu(IUIAutomationElement4* This) {
    return This->lpVtbl->ShowContextMenu(This);
}
static inline HRESULT IUIAutomationElement4_get_CurrentIsPeripheral(IUIAutomationElement4* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsPeripheral(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CachedIsPeripheral(IUIAutomationElement4* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsPeripheral(This,retVal);
}
/*** IUIAutomationElement4 methods ***/
static inline HRESULT IUIAutomationElement4_get_CurrentPositionInSet(IUIAutomationElement4* This,int *retVal) {
    return This->lpVtbl->get_CurrentPositionInSet(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CurrentSizeOfSet(IUIAutomationElement4* This,int *retVal) {
    return This->lpVtbl->get_CurrentSizeOfSet(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CurrentLevel(IUIAutomationElement4* This,int *retVal) {
    return This->lpVtbl->get_CurrentLevel(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CurrentAnnotationTypes(IUIAutomationElement4* This,SAFEARRAY **retVal) {
    return This->lpVtbl->get_CurrentAnnotationTypes(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CurrentAnnotationObjects(IUIAutomationElement4* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentAnnotationObjects(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CachedPositionInSet(IUIAutomationElement4* This,int *retVal) {
    return This->lpVtbl->get_CachedPositionInSet(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CachedSizeOfSet(IUIAutomationElement4* This,int *retVal) {
    return This->lpVtbl->get_CachedSizeOfSet(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CachedLevel(IUIAutomationElement4* This,int *retVal) {
    return This->lpVtbl->get_CachedLevel(This,retVal);
}
static inline HRESULT IUIAutomationElement4_get_CachedAnnotationTypes(IUIAutomationElement4* This,SAFEARRAY **retVal) {
    return This->lpVtbl->get_CachedAnnotationTypes(This,retVal);
}
static 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 inline HRESULT IUIAutomationElement5_QueryInterface(IUIAutomationElement5* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationElement5_AddRef(IUIAutomationElement5* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationElement5_Release(IUIAutomationElement5* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationElement methods ***/
static inline HRESULT IUIAutomationElement5_SetFocus(IUIAutomationElement5* This) {
    return This->lpVtbl->SetFocus(This);
}
static inline HRESULT IUIAutomationElement5_GetRuntimeId(IUIAutomationElement5* This,SAFEARRAY **runtimeId) {
    return This->lpVtbl->GetRuntimeId(This,runtimeId);
}
static inline HRESULT IUIAutomationElement5_FindFirst(IUIAutomationElement5* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationElement **found) {
    return This->lpVtbl->FindFirst(This,scope,condition,found);
}
static inline HRESULT IUIAutomationElement5_FindAll(IUIAutomationElement5* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationElementArray **found) {
    return This->lpVtbl->FindAll(This,scope,condition,found);
}
static 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 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 inline HRESULT IUIAutomationElement5_BuildUpdatedCache(IUIAutomationElement5* This,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **updatedElement) {
    return This->lpVtbl->BuildUpdatedCache(This,cacheRequest,updatedElement);
}
static inline HRESULT IUIAutomationElement5_GetCurrentPropertyValue(IUIAutomationElement5* This,PROPERTYID propertyId,VARIANT *retVal) {
    return This->lpVtbl->GetCurrentPropertyValue(This,propertyId,retVal);
}
static inline HRESULT IUIAutomationElement5_GetCurrentPropertyValueEx(IUIAutomationElement5* This,PROPERTYID propertyId,WINBOOL ignoreDefaultValue,VARIANT *retVal) {
    return This->lpVtbl->GetCurrentPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal);
}
static inline HRESULT IUIAutomationElement5_GetCachedPropertyValue(IUIAutomationElement5* This,PROPERTYID propertyId,VARIANT *retVal) {
    return This->lpVtbl->GetCachedPropertyValue(This,propertyId,retVal);
}
static inline HRESULT IUIAutomationElement5_GetCachedPropertyValueEx(IUIAutomationElement5* This,PROPERTYID propertyId,WINBOOL ignoreDefaultValue,VARIANT *retVal) {
    return This->lpVtbl->GetCachedPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal);
}
static inline HRESULT IUIAutomationElement5_GetCurrentPatternAs(IUIAutomationElement5* This,PATTERNID patternId,REFIID riid,void **patternObject) {
    return This->lpVtbl->GetCurrentPatternAs(This,patternId,riid,patternObject);
}
static inline HRESULT IUIAutomationElement5_GetCachedPatternAs(IUIAutomationElement5* This,PATTERNID patternId,REFIID riid,void **patternObject) {
    return This->lpVtbl->GetCachedPatternAs(This,patternId,riid,patternObject);
}
static inline HRESULT IUIAutomationElement5_GetCurrentPattern(IUIAutomationElement5* This,PATTERNID patternId,IUnknown **patternObject) {
    return This->lpVtbl->GetCurrentPattern(This,patternId,patternObject);
}
static inline HRESULT IUIAutomationElement5_GetCachedPattern(IUIAutomationElement5* This,PATTERNID patternId,IUnknown **patternObject) {
    return This->lpVtbl->GetCachedPattern(This,patternId,patternObject);
}
static inline HRESULT IUIAutomationElement5_GetCachedParent(IUIAutomationElement5* This,IUIAutomationElement **parent) {
    return This->lpVtbl->GetCachedParent(This,parent);
}
static inline HRESULT IUIAutomationElement5_GetCachedChildren(IUIAutomationElement5* This,IUIAutomationElementArray **children) {
    return This->lpVtbl->GetCachedChildren(This,children);
}
static inline HRESULT IUIAutomationElement5_get_CurrentProcessId(IUIAutomationElement5* This,int *retVal) {
    return This->lpVtbl->get_CurrentProcessId(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CurrentControlType(IUIAutomationElement5* This,CONTROLTYPEID *retVal) {
    return This->lpVtbl->get_CurrentControlType(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CurrentLocalizedControlType(IUIAutomationElement5* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentLocalizedControlType(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CurrentName(IUIAutomationElement5* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentName(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CurrentAcceleratorKey(IUIAutomationElement5* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAcceleratorKey(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CurrentAccessKey(IUIAutomationElement5* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAccessKey(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CurrentHasKeyboardFocus(IUIAutomationElement5* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentHasKeyboardFocus(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CurrentIsKeyboardFocusable(IUIAutomationElement5* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsKeyboardFocusable(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CurrentIsEnabled(IUIAutomationElement5* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsEnabled(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CurrentAutomationId(IUIAutomationElement5* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAutomationId(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CurrentClassName(IUIAutomationElement5* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentClassName(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CurrentHelpText(IUIAutomationElement5* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentHelpText(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CurrentCulture(IUIAutomationElement5* This,int *retVal) {
    return This->lpVtbl->get_CurrentCulture(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CurrentIsControlElement(IUIAutomationElement5* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsControlElement(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CurrentIsContentElement(IUIAutomationElement5* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsContentElement(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CurrentIsPassword(IUIAutomationElement5* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsPassword(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CurrentNativeWindowHandle(IUIAutomationElement5* This,UIA_HWND *retVal) {
    return This->lpVtbl->get_CurrentNativeWindowHandle(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CurrentItemType(IUIAutomationElement5* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentItemType(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CurrentIsOffscreen(IUIAutomationElement5* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsOffscreen(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CurrentOrientation(IUIAutomationElement5* This,enum OrientationType *retVal) {
    return This->lpVtbl->get_CurrentOrientation(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CurrentFrameworkId(IUIAutomationElement5* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentFrameworkId(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CurrentIsRequiredForForm(IUIAutomationElement5* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsRequiredForForm(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CurrentItemStatus(IUIAutomationElement5* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentItemStatus(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CurrentBoundingRectangle(IUIAutomationElement5* This,RECT *retVal) {
    return This->lpVtbl->get_CurrentBoundingRectangle(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CurrentLabeledBy(IUIAutomationElement5* This,IUIAutomationElement **retVal) {
    return This->lpVtbl->get_CurrentLabeledBy(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CurrentAriaRole(IUIAutomationElement5* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAriaRole(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CurrentAriaProperties(IUIAutomationElement5* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAriaProperties(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CurrentIsDataValidForForm(IUIAutomationElement5* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsDataValidForForm(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CurrentControllerFor(IUIAutomationElement5* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentControllerFor(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CurrentDescribedBy(IUIAutomationElement5* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentDescribedBy(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CurrentFlowsTo(IUIAutomationElement5* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentFlowsTo(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CurrentProviderDescription(IUIAutomationElement5* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentProviderDescription(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CachedProcessId(IUIAutomationElement5* This,int *retVal) {
    return This->lpVtbl->get_CachedProcessId(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CachedControlType(IUIAutomationElement5* This,CONTROLTYPEID *retVal) {
    return This->lpVtbl->get_CachedControlType(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CachedLocalizedControlType(IUIAutomationElement5* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedLocalizedControlType(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CachedName(IUIAutomationElement5* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedName(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CachedAcceleratorKey(IUIAutomationElement5* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAcceleratorKey(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CachedAccessKey(IUIAutomationElement5* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAccessKey(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CachedHasKeyboardFocus(IUIAutomationElement5* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedHasKeyboardFocus(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CachedIsKeyboardFocusable(IUIAutomationElement5* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsKeyboardFocusable(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CachedIsEnabled(IUIAutomationElement5* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsEnabled(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CachedAutomationId(IUIAutomationElement5* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAutomationId(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CachedClassName(IUIAutomationElement5* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedClassName(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CachedHelpText(IUIAutomationElement5* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedHelpText(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CachedCulture(IUIAutomationElement5* This,int *retVal) {
    return This->lpVtbl->get_CachedCulture(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CachedIsControlElement(IUIAutomationElement5* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsControlElement(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CachedIsContentElement(IUIAutomationElement5* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsContentElement(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CachedIsPassword(IUIAutomationElement5* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsPassword(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CachedNativeWindowHandle(IUIAutomationElement5* This,UIA_HWND *retVal) {
    return This->lpVtbl->get_CachedNativeWindowHandle(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CachedItemType(IUIAutomationElement5* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedItemType(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CachedIsOffscreen(IUIAutomationElement5* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsOffscreen(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CachedOrientation(IUIAutomationElement5* This,enum OrientationType *retVal) {
    return This->lpVtbl->get_CachedOrientation(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CachedFrameworkId(IUIAutomationElement5* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedFrameworkId(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CachedIsRequiredForForm(IUIAutomationElement5* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsRequiredForForm(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CachedItemStatus(IUIAutomationElement5* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedItemStatus(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CachedBoundingRectangle(IUIAutomationElement5* This,RECT *retVal) {
    return This->lpVtbl->get_CachedBoundingRectangle(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CachedLabeledBy(IUIAutomationElement5* This,IUIAutomationElement **retVal) {
    return This->lpVtbl->get_CachedLabeledBy(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CachedAriaRole(IUIAutomationElement5* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAriaRole(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CachedAriaProperties(IUIAutomationElement5* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAriaProperties(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CachedIsDataValidForForm(IUIAutomationElement5* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsDataValidForForm(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CachedControllerFor(IUIAutomationElement5* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedControllerFor(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CachedDescribedBy(IUIAutomationElement5* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedDescribedBy(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CachedFlowsTo(IUIAutomationElement5* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedFlowsTo(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CachedProviderDescription(IUIAutomationElement5* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedProviderDescription(This,retVal);
}
static inline HRESULT IUIAutomationElement5_GetClickablePoint(IUIAutomationElement5* This,POINT *clickable,WINBOOL *gotClickable) {
    return This->lpVtbl->GetClickablePoint(This,clickable,gotClickable);
}
/*** IUIAutomationElement2 methods ***/
static inline HRESULT IUIAutomationElement5_get_CurrentOptimizeForVisualContent(IUIAutomationElement5* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentOptimizeForVisualContent(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CachedOptimizeForVisualContent(IUIAutomationElement5* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedOptimizeForVisualContent(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CurrentLiveSetting(IUIAutomationElement5* This,enum LiveSetting *retVal) {
    return This->lpVtbl->get_CurrentLiveSetting(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CachedLiveSetting(IUIAutomationElement5* This,enum LiveSetting *retVal) {
    return This->lpVtbl->get_CachedLiveSetting(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CurrentFlowsFrom(IUIAutomationElement5* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentFlowsFrom(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CachedFlowsFrom(IUIAutomationElement5* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedFlowsFrom(This,retVal);
}
/*** IUIAutomationElement3 methods ***/
static inline HRESULT IUIAutomationElement5_ShowContextMenu(IUIAutomationElement5* This) {
    return This->lpVtbl->ShowContextMenu(This);
}
static inline HRESULT IUIAutomationElement5_get_CurrentIsPeripheral(IUIAutomationElement5* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsPeripheral(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CachedIsPeripheral(IUIAutomationElement5* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsPeripheral(This,retVal);
}
/*** IUIAutomationElement4 methods ***/
static inline HRESULT IUIAutomationElement5_get_CurrentPositionInSet(IUIAutomationElement5* This,int *retVal) {
    return This->lpVtbl->get_CurrentPositionInSet(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CurrentSizeOfSet(IUIAutomationElement5* This,int *retVal) {
    return This->lpVtbl->get_CurrentSizeOfSet(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CurrentLevel(IUIAutomationElement5* This,int *retVal) {
    return This->lpVtbl->get_CurrentLevel(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CurrentAnnotationTypes(IUIAutomationElement5* This,SAFEARRAY **retVal) {
    return This->lpVtbl->get_CurrentAnnotationTypes(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CurrentAnnotationObjects(IUIAutomationElement5* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentAnnotationObjects(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CachedPositionInSet(IUIAutomationElement5* This,int *retVal) {
    return This->lpVtbl->get_CachedPositionInSet(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CachedSizeOfSet(IUIAutomationElement5* This,int *retVal) {
    return This->lpVtbl->get_CachedSizeOfSet(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CachedLevel(IUIAutomationElement5* This,int *retVal) {
    return This->lpVtbl->get_CachedLevel(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CachedAnnotationTypes(IUIAutomationElement5* This,SAFEARRAY **retVal) {
    return This->lpVtbl->get_CachedAnnotationTypes(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CachedAnnotationObjects(IUIAutomationElement5* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedAnnotationObjects(This,retVal);
}
/*** IUIAutomationElement5 methods ***/
static inline HRESULT IUIAutomationElement5_get_CurrentLandmarkType(IUIAutomationElement5* This,LANDMARKTYPEID *retVal) {
    return This->lpVtbl->get_CurrentLandmarkType(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CurrentLocalizedLandmarkType(IUIAutomationElement5* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentLocalizedLandmarkType(This,retVal);
}
static inline HRESULT IUIAutomationElement5_get_CachedLandmarkType(IUIAutomationElement5* This,LANDMARKTYPEID *retVal) {
    return This->lpVtbl->get_CachedLandmarkType(This,retVal);
}
static 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 inline HRESULT IUIAutomationElement6_QueryInterface(IUIAutomationElement6* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationElement6_AddRef(IUIAutomationElement6* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationElement6_Release(IUIAutomationElement6* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationElement methods ***/
static inline HRESULT IUIAutomationElement6_SetFocus(IUIAutomationElement6* This) {
    return This->lpVtbl->SetFocus(This);
}
static inline HRESULT IUIAutomationElement6_GetRuntimeId(IUIAutomationElement6* This,SAFEARRAY **runtimeId) {
    return This->lpVtbl->GetRuntimeId(This,runtimeId);
}
static inline HRESULT IUIAutomationElement6_FindFirst(IUIAutomationElement6* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationElement **found) {
    return This->lpVtbl->FindFirst(This,scope,condition,found);
}
static inline HRESULT IUIAutomationElement6_FindAll(IUIAutomationElement6* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationElementArray **found) {
    return This->lpVtbl->FindAll(This,scope,condition,found);
}
static 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 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 inline HRESULT IUIAutomationElement6_BuildUpdatedCache(IUIAutomationElement6* This,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **updatedElement) {
    return This->lpVtbl->BuildUpdatedCache(This,cacheRequest,updatedElement);
}
static inline HRESULT IUIAutomationElement6_GetCurrentPropertyValue(IUIAutomationElement6* This,PROPERTYID propertyId,VARIANT *retVal) {
    return This->lpVtbl->GetCurrentPropertyValue(This,propertyId,retVal);
}
static inline HRESULT IUIAutomationElement6_GetCurrentPropertyValueEx(IUIAutomationElement6* This,PROPERTYID propertyId,WINBOOL ignoreDefaultValue,VARIANT *retVal) {
    return This->lpVtbl->GetCurrentPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal);
}
static inline HRESULT IUIAutomationElement6_GetCachedPropertyValue(IUIAutomationElement6* This,PROPERTYID propertyId,VARIANT *retVal) {
    return This->lpVtbl->GetCachedPropertyValue(This,propertyId,retVal);
}
static inline HRESULT IUIAutomationElement6_GetCachedPropertyValueEx(IUIAutomationElement6* This,PROPERTYID propertyId,WINBOOL ignoreDefaultValue,VARIANT *retVal) {
    return This->lpVtbl->GetCachedPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal);
}
static inline HRESULT IUIAutomationElement6_GetCurrentPatternAs(IUIAutomationElement6* This,PATTERNID patternId,REFIID riid,void **patternObject) {
    return This->lpVtbl->GetCurrentPatternAs(This,patternId,riid,patternObject);
}
static inline HRESULT IUIAutomationElement6_GetCachedPatternAs(IUIAutomationElement6* This,PATTERNID patternId,REFIID riid,void **patternObject) {
    return This->lpVtbl->GetCachedPatternAs(This,patternId,riid,patternObject);
}
static inline HRESULT IUIAutomationElement6_GetCurrentPattern(IUIAutomationElement6* This,PATTERNID patternId,IUnknown **patternObject) {
    return This->lpVtbl->GetCurrentPattern(This,patternId,patternObject);
}
static inline HRESULT IUIAutomationElement6_GetCachedPattern(IUIAutomationElement6* This,PATTERNID patternId,IUnknown **patternObject) {
    return This->lpVtbl->GetCachedPattern(This,patternId,patternObject);
}
static inline HRESULT IUIAutomationElement6_GetCachedParent(IUIAutomationElement6* This,IUIAutomationElement **parent) {
    return This->lpVtbl->GetCachedParent(This,parent);
}
static inline HRESULT IUIAutomationElement6_GetCachedChildren(IUIAutomationElement6* This,IUIAutomationElementArray **children) {
    return This->lpVtbl->GetCachedChildren(This,children);
}
static inline HRESULT IUIAutomationElement6_get_CurrentProcessId(IUIAutomationElement6* This,int *retVal) {
    return This->lpVtbl->get_CurrentProcessId(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CurrentControlType(IUIAutomationElement6* This,CONTROLTYPEID *retVal) {
    return This->lpVtbl->get_CurrentControlType(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CurrentLocalizedControlType(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentLocalizedControlType(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CurrentName(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentName(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CurrentAcceleratorKey(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAcceleratorKey(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CurrentAccessKey(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAccessKey(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CurrentHasKeyboardFocus(IUIAutomationElement6* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentHasKeyboardFocus(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CurrentIsKeyboardFocusable(IUIAutomationElement6* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsKeyboardFocusable(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CurrentIsEnabled(IUIAutomationElement6* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsEnabled(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CurrentAutomationId(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAutomationId(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CurrentClassName(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentClassName(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CurrentHelpText(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentHelpText(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CurrentCulture(IUIAutomationElement6* This,int *retVal) {
    return This->lpVtbl->get_CurrentCulture(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CurrentIsControlElement(IUIAutomationElement6* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsControlElement(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CurrentIsContentElement(IUIAutomationElement6* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsContentElement(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CurrentIsPassword(IUIAutomationElement6* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsPassword(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CurrentNativeWindowHandle(IUIAutomationElement6* This,UIA_HWND *retVal) {
    return This->lpVtbl->get_CurrentNativeWindowHandle(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CurrentItemType(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentItemType(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CurrentIsOffscreen(IUIAutomationElement6* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsOffscreen(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CurrentOrientation(IUIAutomationElement6* This,enum OrientationType *retVal) {
    return This->lpVtbl->get_CurrentOrientation(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CurrentFrameworkId(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentFrameworkId(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CurrentIsRequiredForForm(IUIAutomationElement6* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsRequiredForForm(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CurrentItemStatus(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentItemStatus(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CurrentBoundingRectangle(IUIAutomationElement6* This,RECT *retVal) {
    return This->lpVtbl->get_CurrentBoundingRectangle(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CurrentLabeledBy(IUIAutomationElement6* This,IUIAutomationElement **retVal) {
    return This->lpVtbl->get_CurrentLabeledBy(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CurrentAriaRole(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAriaRole(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CurrentAriaProperties(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAriaProperties(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CurrentIsDataValidForForm(IUIAutomationElement6* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsDataValidForForm(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CurrentControllerFor(IUIAutomationElement6* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentControllerFor(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CurrentDescribedBy(IUIAutomationElement6* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentDescribedBy(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CurrentFlowsTo(IUIAutomationElement6* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentFlowsTo(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CurrentProviderDescription(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentProviderDescription(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CachedProcessId(IUIAutomationElement6* This,int *retVal) {
    return This->lpVtbl->get_CachedProcessId(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CachedControlType(IUIAutomationElement6* This,CONTROLTYPEID *retVal) {
    return This->lpVtbl->get_CachedControlType(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CachedLocalizedControlType(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedLocalizedControlType(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CachedName(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedName(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CachedAcceleratorKey(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAcceleratorKey(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CachedAccessKey(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAccessKey(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CachedHasKeyboardFocus(IUIAutomationElement6* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedHasKeyboardFocus(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CachedIsKeyboardFocusable(IUIAutomationElement6* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsKeyboardFocusable(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CachedIsEnabled(IUIAutomationElement6* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsEnabled(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CachedAutomationId(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAutomationId(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CachedClassName(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedClassName(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CachedHelpText(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedHelpText(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CachedCulture(IUIAutomationElement6* This,int *retVal) {
    return This->lpVtbl->get_CachedCulture(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CachedIsControlElement(IUIAutomationElement6* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsControlElement(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CachedIsContentElement(IUIAutomationElement6* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsContentElement(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CachedIsPassword(IUIAutomationElement6* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsPassword(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CachedNativeWindowHandle(IUIAutomationElement6* This,UIA_HWND *retVal) {
    return This->lpVtbl->get_CachedNativeWindowHandle(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CachedItemType(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedItemType(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CachedIsOffscreen(IUIAutomationElement6* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsOffscreen(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CachedOrientation(IUIAutomationElement6* This,enum OrientationType *retVal) {
    return This->lpVtbl->get_CachedOrientation(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CachedFrameworkId(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedFrameworkId(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CachedIsRequiredForForm(IUIAutomationElement6* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsRequiredForForm(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CachedItemStatus(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedItemStatus(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CachedBoundingRectangle(IUIAutomationElement6* This,RECT *retVal) {
    return This->lpVtbl->get_CachedBoundingRectangle(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CachedLabeledBy(IUIAutomationElement6* This,IUIAutomationElement **retVal) {
    return This->lpVtbl->get_CachedLabeledBy(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CachedAriaRole(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAriaRole(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CachedAriaProperties(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAriaProperties(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CachedIsDataValidForForm(IUIAutomationElement6* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsDataValidForForm(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CachedControllerFor(IUIAutomationElement6* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedControllerFor(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CachedDescribedBy(IUIAutomationElement6* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedDescribedBy(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CachedFlowsTo(IUIAutomationElement6* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedFlowsTo(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CachedProviderDescription(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedProviderDescription(This,retVal);
}
static inline HRESULT IUIAutomationElement6_GetClickablePoint(IUIAutomationElement6* This,POINT *clickable,WINBOOL *gotClickable) {
    return This->lpVtbl->GetClickablePoint(This,clickable,gotClickable);
}
/*** IUIAutomationElement2 methods ***/
static inline HRESULT IUIAutomationElement6_get_CurrentOptimizeForVisualContent(IUIAutomationElement6* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentOptimizeForVisualContent(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CachedOptimizeForVisualContent(IUIAutomationElement6* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedOptimizeForVisualContent(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CurrentLiveSetting(IUIAutomationElement6* This,enum LiveSetting *retVal) {
    return This->lpVtbl->get_CurrentLiveSetting(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CachedLiveSetting(IUIAutomationElement6* This,enum LiveSetting *retVal) {
    return This->lpVtbl->get_CachedLiveSetting(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CurrentFlowsFrom(IUIAutomationElement6* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentFlowsFrom(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CachedFlowsFrom(IUIAutomationElement6* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedFlowsFrom(This,retVal);
}
/*** IUIAutomationElement3 methods ***/
static inline HRESULT IUIAutomationElement6_ShowContextMenu(IUIAutomationElement6* This) {
    return This->lpVtbl->ShowContextMenu(This);
}
static inline HRESULT IUIAutomationElement6_get_CurrentIsPeripheral(IUIAutomationElement6* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsPeripheral(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CachedIsPeripheral(IUIAutomationElement6* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsPeripheral(This,retVal);
}
/*** IUIAutomationElement4 methods ***/
static inline HRESULT IUIAutomationElement6_get_CurrentPositionInSet(IUIAutomationElement6* This,int *retVal) {
    return This->lpVtbl->get_CurrentPositionInSet(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CurrentSizeOfSet(IUIAutomationElement6* This,int *retVal) {
    return This->lpVtbl->get_CurrentSizeOfSet(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CurrentLevel(IUIAutomationElement6* This,int *retVal) {
    return This->lpVtbl->get_CurrentLevel(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CurrentAnnotationTypes(IUIAutomationElement6* This,SAFEARRAY **retVal) {
    return This->lpVtbl->get_CurrentAnnotationTypes(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CurrentAnnotationObjects(IUIAutomationElement6* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentAnnotationObjects(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CachedPositionInSet(IUIAutomationElement6* This,int *retVal) {
    return This->lpVtbl->get_CachedPositionInSet(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CachedSizeOfSet(IUIAutomationElement6* This,int *retVal) {
    return This->lpVtbl->get_CachedSizeOfSet(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CachedLevel(IUIAutomationElement6* This,int *retVal) {
    return This->lpVtbl->get_CachedLevel(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CachedAnnotationTypes(IUIAutomationElement6* This,SAFEARRAY **retVal) {
    return This->lpVtbl->get_CachedAnnotationTypes(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CachedAnnotationObjects(IUIAutomationElement6* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedAnnotationObjects(This,retVal);
}
/*** IUIAutomationElement5 methods ***/
static inline HRESULT IUIAutomationElement6_get_CurrentLandmarkType(IUIAutomationElement6* This,LANDMARKTYPEID *retVal) {
    return This->lpVtbl->get_CurrentLandmarkType(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CurrentLocalizedLandmarkType(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentLocalizedLandmarkType(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CachedLandmarkType(IUIAutomationElement6* This,LANDMARKTYPEID *retVal) {
    return This->lpVtbl->get_CachedLandmarkType(This,retVal);
}
static inline HRESULT IUIAutomationElement6_get_CachedLocalizedLandmarkType(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedLocalizedLandmarkType(This,retVal);
}
/*** IUIAutomationElement6 methods ***/
static inline HRESULT IUIAutomationElement6_get_CurrentFullDescription(IUIAutomationElement6* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentFullDescription(This,retVal);
}
static 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 inline HRESULT IUIAutomationElement7_QueryInterface(IUIAutomationElement7* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationElement7_AddRef(IUIAutomationElement7* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationElement7_Release(IUIAutomationElement7* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationElement methods ***/
static inline HRESULT IUIAutomationElement7_SetFocus(IUIAutomationElement7* This) {
    return This->lpVtbl->SetFocus(This);
}
static inline HRESULT IUIAutomationElement7_GetRuntimeId(IUIAutomationElement7* This,SAFEARRAY **runtimeId) {
    return This->lpVtbl->GetRuntimeId(This,runtimeId);
}
static inline HRESULT IUIAutomationElement7_FindFirst(IUIAutomationElement7* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationElement **found) {
    return This->lpVtbl->FindFirst(This,scope,condition,found);
}
static inline HRESULT IUIAutomationElement7_FindAll(IUIAutomationElement7* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationElementArray **found) {
    return This->lpVtbl->FindAll(This,scope,condition,found);
}
static 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 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 inline HRESULT IUIAutomationElement7_BuildUpdatedCache(IUIAutomationElement7* This,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **updatedElement) {
    return This->lpVtbl->BuildUpdatedCache(This,cacheRequest,updatedElement);
}
static inline HRESULT IUIAutomationElement7_GetCurrentPropertyValue(IUIAutomationElement7* This,PROPERTYID propertyId,VARIANT *retVal) {
    return This->lpVtbl->GetCurrentPropertyValue(This,propertyId,retVal);
}
static inline HRESULT IUIAutomationElement7_GetCurrentPropertyValueEx(IUIAutomationElement7* This,PROPERTYID propertyId,WINBOOL ignoreDefaultValue,VARIANT *retVal) {
    return This->lpVtbl->GetCurrentPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal);
}
static inline HRESULT IUIAutomationElement7_GetCachedPropertyValue(IUIAutomationElement7* This,PROPERTYID propertyId,VARIANT *retVal) {
    return This->lpVtbl->GetCachedPropertyValue(This,propertyId,retVal);
}
static inline HRESULT IUIAutomationElement7_GetCachedPropertyValueEx(IUIAutomationElement7* This,PROPERTYID propertyId,WINBOOL ignoreDefaultValue,VARIANT *retVal) {
    return This->lpVtbl->GetCachedPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal);
}
static inline HRESULT IUIAutomationElement7_GetCurrentPatternAs(IUIAutomationElement7* This,PATTERNID patternId,REFIID riid,void **patternObject) {
    return This->lpVtbl->GetCurrentPatternAs(This,patternId,riid,patternObject);
}
static inline HRESULT IUIAutomationElement7_GetCachedPatternAs(IUIAutomationElement7* This,PATTERNID patternId,REFIID riid,void **patternObject) {
    return This->lpVtbl->GetCachedPatternAs(This,patternId,riid,patternObject);
}
static inline HRESULT IUIAutomationElement7_GetCurrentPattern(IUIAutomationElement7* This,PATTERNID patternId,IUnknown **patternObject) {
    return This->lpVtbl->GetCurrentPattern(This,patternId,patternObject);
}
static inline HRESULT IUIAutomationElement7_GetCachedPattern(IUIAutomationElement7* This,PATTERNID patternId,IUnknown **patternObject) {
    return This->lpVtbl->GetCachedPattern(This,patternId,patternObject);
}
static inline HRESULT IUIAutomationElement7_GetCachedParent(IUIAutomationElement7* This,IUIAutomationElement **parent) {
    return This->lpVtbl->GetCachedParent(This,parent);
}
static inline HRESULT IUIAutomationElement7_GetCachedChildren(IUIAutomationElement7* This,IUIAutomationElementArray **children) {
    return This->lpVtbl->GetCachedChildren(This,children);
}
static inline HRESULT IUIAutomationElement7_get_CurrentProcessId(IUIAutomationElement7* This,int *retVal) {
    return This->lpVtbl->get_CurrentProcessId(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CurrentControlType(IUIAutomationElement7* This,CONTROLTYPEID *retVal) {
    return This->lpVtbl->get_CurrentControlType(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CurrentLocalizedControlType(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentLocalizedControlType(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CurrentName(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentName(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CurrentAcceleratorKey(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAcceleratorKey(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CurrentAccessKey(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAccessKey(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CurrentHasKeyboardFocus(IUIAutomationElement7* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentHasKeyboardFocus(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CurrentIsKeyboardFocusable(IUIAutomationElement7* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsKeyboardFocusable(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CurrentIsEnabled(IUIAutomationElement7* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsEnabled(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CurrentAutomationId(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAutomationId(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CurrentClassName(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentClassName(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CurrentHelpText(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentHelpText(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CurrentCulture(IUIAutomationElement7* This,int *retVal) {
    return This->lpVtbl->get_CurrentCulture(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CurrentIsControlElement(IUIAutomationElement7* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsControlElement(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CurrentIsContentElement(IUIAutomationElement7* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsContentElement(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CurrentIsPassword(IUIAutomationElement7* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsPassword(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CurrentNativeWindowHandle(IUIAutomationElement7* This,UIA_HWND *retVal) {
    return This->lpVtbl->get_CurrentNativeWindowHandle(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CurrentItemType(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentItemType(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CurrentIsOffscreen(IUIAutomationElement7* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsOffscreen(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CurrentOrientation(IUIAutomationElement7* This,enum OrientationType *retVal) {
    return This->lpVtbl->get_CurrentOrientation(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CurrentFrameworkId(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentFrameworkId(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CurrentIsRequiredForForm(IUIAutomationElement7* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsRequiredForForm(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CurrentItemStatus(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentItemStatus(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CurrentBoundingRectangle(IUIAutomationElement7* This,RECT *retVal) {
    return This->lpVtbl->get_CurrentBoundingRectangle(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CurrentLabeledBy(IUIAutomationElement7* This,IUIAutomationElement **retVal) {
    return This->lpVtbl->get_CurrentLabeledBy(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CurrentAriaRole(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAriaRole(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CurrentAriaProperties(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAriaProperties(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CurrentIsDataValidForForm(IUIAutomationElement7* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsDataValidForForm(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CurrentControllerFor(IUIAutomationElement7* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentControllerFor(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CurrentDescribedBy(IUIAutomationElement7* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentDescribedBy(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CurrentFlowsTo(IUIAutomationElement7* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentFlowsTo(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CurrentProviderDescription(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentProviderDescription(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CachedProcessId(IUIAutomationElement7* This,int *retVal) {
    return This->lpVtbl->get_CachedProcessId(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CachedControlType(IUIAutomationElement7* This,CONTROLTYPEID *retVal) {
    return This->lpVtbl->get_CachedControlType(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CachedLocalizedControlType(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedLocalizedControlType(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CachedName(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedName(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CachedAcceleratorKey(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAcceleratorKey(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CachedAccessKey(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAccessKey(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CachedHasKeyboardFocus(IUIAutomationElement7* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedHasKeyboardFocus(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CachedIsKeyboardFocusable(IUIAutomationElement7* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsKeyboardFocusable(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CachedIsEnabled(IUIAutomationElement7* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsEnabled(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CachedAutomationId(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAutomationId(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CachedClassName(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedClassName(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CachedHelpText(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedHelpText(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CachedCulture(IUIAutomationElement7* This,int *retVal) {
    return This->lpVtbl->get_CachedCulture(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CachedIsControlElement(IUIAutomationElement7* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsControlElement(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CachedIsContentElement(IUIAutomationElement7* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsContentElement(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CachedIsPassword(IUIAutomationElement7* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsPassword(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CachedNativeWindowHandle(IUIAutomationElement7* This,UIA_HWND *retVal) {
    return This->lpVtbl->get_CachedNativeWindowHandle(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CachedItemType(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedItemType(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CachedIsOffscreen(IUIAutomationElement7* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsOffscreen(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CachedOrientation(IUIAutomationElement7* This,enum OrientationType *retVal) {
    return This->lpVtbl->get_CachedOrientation(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CachedFrameworkId(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedFrameworkId(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CachedIsRequiredForForm(IUIAutomationElement7* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsRequiredForForm(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CachedItemStatus(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedItemStatus(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CachedBoundingRectangle(IUIAutomationElement7* This,RECT *retVal) {
    return This->lpVtbl->get_CachedBoundingRectangle(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CachedLabeledBy(IUIAutomationElement7* This,IUIAutomationElement **retVal) {
    return This->lpVtbl->get_CachedLabeledBy(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CachedAriaRole(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAriaRole(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CachedAriaProperties(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAriaProperties(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CachedIsDataValidForForm(IUIAutomationElement7* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsDataValidForForm(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CachedControllerFor(IUIAutomationElement7* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedControllerFor(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CachedDescribedBy(IUIAutomationElement7* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedDescribedBy(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CachedFlowsTo(IUIAutomationElement7* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedFlowsTo(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CachedProviderDescription(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedProviderDescription(This,retVal);
}
static inline HRESULT IUIAutomationElement7_GetClickablePoint(IUIAutomationElement7* This,POINT *clickable,WINBOOL *gotClickable) {
    return This->lpVtbl->GetClickablePoint(This,clickable,gotClickable);
}
/*** IUIAutomationElement2 methods ***/
static inline HRESULT IUIAutomationElement7_get_CurrentOptimizeForVisualContent(IUIAutomationElement7* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentOptimizeForVisualContent(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CachedOptimizeForVisualContent(IUIAutomationElement7* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedOptimizeForVisualContent(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CurrentLiveSetting(IUIAutomationElement7* This,enum LiveSetting *retVal) {
    return This->lpVtbl->get_CurrentLiveSetting(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CachedLiveSetting(IUIAutomationElement7* This,enum LiveSetting *retVal) {
    return This->lpVtbl->get_CachedLiveSetting(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CurrentFlowsFrom(IUIAutomationElement7* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentFlowsFrom(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CachedFlowsFrom(IUIAutomationElement7* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedFlowsFrom(This,retVal);
}
/*** IUIAutomationElement3 methods ***/
static inline HRESULT IUIAutomationElement7_ShowContextMenu(IUIAutomationElement7* This) {
    return This->lpVtbl->ShowContextMenu(This);
}
static inline HRESULT IUIAutomationElement7_get_CurrentIsPeripheral(IUIAutomationElement7* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsPeripheral(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CachedIsPeripheral(IUIAutomationElement7* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsPeripheral(This,retVal);
}
/*** IUIAutomationElement4 methods ***/
static inline HRESULT IUIAutomationElement7_get_CurrentPositionInSet(IUIAutomationElement7* This,int *retVal) {
    return This->lpVtbl->get_CurrentPositionInSet(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CurrentSizeOfSet(IUIAutomationElement7* This,int *retVal) {
    return This->lpVtbl->get_CurrentSizeOfSet(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CurrentLevel(IUIAutomationElement7* This,int *retVal) {
    return This->lpVtbl->get_CurrentLevel(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CurrentAnnotationTypes(IUIAutomationElement7* This,SAFEARRAY **retVal) {
    return This->lpVtbl->get_CurrentAnnotationTypes(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CurrentAnnotationObjects(IUIAutomationElement7* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentAnnotationObjects(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CachedPositionInSet(IUIAutomationElement7* This,int *retVal) {
    return This->lpVtbl->get_CachedPositionInSet(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CachedSizeOfSet(IUIAutomationElement7* This,int *retVal) {
    return This->lpVtbl->get_CachedSizeOfSet(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CachedLevel(IUIAutomationElement7* This,int *retVal) {
    return This->lpVtbl->get_CachedLevel(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CachedAnnotationTypes(IUIAutomationElement7* This,SAFEARRAY **retVal) {
    return This->lpVtbl->get_CachedAnnotationTypes(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CachedAnnotationObjects(IUIAutomationElement7* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedAnnotationObjects(This,retVal);
}
/*** IUIAutomationElement5 methods ***/
static inline HRESULT IUIAutomationElement7_get_CurrentLandmarkType(IUIAutomationElement7* This,LANDMARKTYPEID *retVal) {
    return This->lpVtbl->get_CurrentLandmarkType(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CurrentLocalizedLandmarkType(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentLocalizedLandmarkType(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CachedLandmarkType(IUIAutomationElement7* This,LANDMARKTYPEID *retVal) {
    return This->lpVtbl->get_CachedLandmarkType(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CachedLocalizedLandmarkType(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedLocalizedLandmarkType(This,retVal);
}
/*** IUIAutomationElement6 methods ***/
static inline HRESULT IUIAutomationElement7_get_CurrentFullDescription(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentFullDescription(This,retVal);
}
static inline HRESULT IUIAutomationElement7_get_CachedFullDescription(IUIAutomationElement7* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedFullDescription(This,retVal);
}
/*** IUIAutomationElement7 methods ***/
static 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 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 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 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 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 inline HRESULT IUIAutomationElement8_QueryInterface(IUIAutomationElement8* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationElement8_AddRef(IUIAutomationElement8* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationElement8_Release(IUIAutomationElement8* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationElement methods ***/
static inline HRESULT IUIAutomationElement8_SetFocus(IUIAutomationElement8* This) {
    return This->lpVtbl->SetFocus(This);
}
static inline HRESULT IUIAutomationElement8_GetRuntimeId(IUIAutomationElement8* This,SAFEARRAY **runtimeId) {
    return This->lpVtbl->GetRuntimeId(This,runtimeId);
}
static inline HRESULT IUIAutomationElement8_FindFirst(IUIAutomationElement8* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationElement **found) {
    return This->lpVtbl->FindFirst(This,scope,condition,found);
}
static inline HRESULT IUIAutomationElement8_FindAll(IUIAutomationElement8* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationElementArray **found) {
    return This->lpVtbl->FindAll(This,scope,condition,found);
}
static 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 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 inline HRESULT IUIAutomationElement8_BuildUpdatedCache(IUIAutomationElement8* This,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **updatedElement) {
    return This->lpVtbl->BuildUpdatedCache(This,cacheRequest,updatedElement);
}
static inline HRESULT IUIAutomationElement8_GetCurrentPropertyValue(IUIAutomationElement8* This,PROPERTYID propertyId,VARIANT *retVal) {
    return This->lpVtbl->GetCurrentPropertyValue(This,propertyId,retVal);
}
static inline HRESULT IUIAutomationElement8_GetCurrentPropertyValueEx(IUIAutomationElement8* This,PROPERTYID propertyId,WINBOOL ignoreDefaultValue,VARIANT *retVal) {
    return This->lpVtbl->GetCurrentPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal);
}
static inline HRESULT IUIAutomationElement8_GetCachedPropertyValue(IUIAutomationElement8* This,PROPERTYID propertyId,VARIANT *retVal) {
    return This->lpVtbl->GetCachedPropertyValue(This,propertyId,retVal);
}
static inline HRESULT IUIAutomationElement8_GetCachedPropertyValueEx(IUIAutomationElement8* This,PROPERTYID propertyId,WINBOOL ignoreDefaultValue,VARIANT *retVal) {
    return This->lpVtbl->GetCachedPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal);
}
static inline HRESULT IUIAutomationElement8_GetCurrentPatternAs(IUIAutomationElement8* This,PATTERNID patternId,REFIID riid,void **patternObject) {
    return This->lpVtbl->GetCurrentPatternAs(This,patternId,riid,patternObject);
}
static inline HRESULT IUIAutomationElement8_GetCachedPatternAs(IUIAutomationElement8* This,PATTERNID patternId,REFIID riid,void **patternObject) {
    return This->lpVtbl->GetCachedPatternAs(This,patternId,riid,patternObject);
}
static inline HRESULT IUIAutomationElement8_GetCurrentPattern(IUIAutomationElement8* This,PATTERNID patternId,IUnknown **patternObject) {
    return This->lpVtbl->GetCurrentPattern(This,patternId,patternObject);
}
static inline HRESULT IUIAutomationElement8_GetCachedPattern(IUIAutomationElement8* This,PATTERNID patternId,IUnknown **patternObject) {
    return This->lpVtbl->GetCachedPattern(This,patternId,patternObject);
}
static inline HRESULT IUIAutomationElement8_GetCachedParent(IUIAutomationElement8* This,IUIAutomationElement **parent) {
    return This->lpVtbl->GetCachedParent(This,parent);
}
static inline HRESULT IUIAutomationElement8_GetCachedChildren(IUIAutomationElement8* This,IUIAutomationElementArray **children) {
    return This->lpVtbl->GetCachedChildren(This,children);
}
static inline HRESULT IUIAutomationElement8_get_CurrentProcessId(IUIAutomationElement8* This,int *retVal) {
    return This->lpVtbl->get_CurrentProcessId(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CurrentControlType(IUIAutomationElement8* This,CONTROLTYPEID *retVal) {
    return This->lpVtbl->get_CurrentControlType(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CurrentLocalizedControlType(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentLocalizedControlType(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CurrentName(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentName(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CurrentAcceleratorKey(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAcceleratorKey(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CurrentAccessKey(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAccessKey(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CurrentHasKeyboardFocus(IUIAutomationElement8* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentHasKeyboardFocus(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CurrentIsKeyboardFocusable(IUIAutomationElement8* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsKeyboardFocusable(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CurrentIsEnabled(IUIAutomationElement8* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsEnabled(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CurrentAutomationId(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAutomationId(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CurrentClassName(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentClassName(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CurrentHelpText(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentHelpText(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CurrentCulture(IUIAutomationElement8* This,int *retVal) {
    return This->lpVtbl->get_CurrentCulture(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CurrentIsControlElement(IUIAutomationElement8* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsControlElement(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CurrentIsContentElement(IUIAutomationElement8* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsContentElement(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CurrentIsPassword(IUIAutomationElement8* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsPassword(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CurrentNativeWindowHandle(IUIAutomationElement8* This,UIA_HWND *retVal) {
    return This->lpVtbl->get_CurrentNativeWindowHandle(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CurrentItemType(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentItemType(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CurrentIsOffscreen(IUIAutomationElement8* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsOffscreen(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CurrentOrientation(IUIAutomationElement8* This,enum OrientationType *retVal) {
    return This->lpVtbl->get_CurrentOrientation(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CurrentFrameworkId(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentFrameworkId(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CurrentIsRequiredForForm(IUIAutomationElement8* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsRequiredForForm(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CurrentItemStatus(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentItemStatus(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CurrentBoundingRectangle(IUIAutomationElement8* This,RECT *retVal) {
    return This->lpVtbl->get_CurrentBoundingRectangle(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CurrentLabeledBy(IUIAutomationElement8* This,IUIAutomationElement **retVal) {
    return This->lpVtbl->get_CurrentLabeledBy(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CurrentAriaRole(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAriaRole(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CurrentAriaProperties(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAriaProperties(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CurrentIsDataValidForForm(IUIAutomationElement8* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsDataValidForForm(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CurrentControllerFor(IUIAutomationElement8* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentControllerFor(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CurrentDescribedBy(IUIAutomationElement8* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentDescribedBy(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CurrentFlowsTo(IUIAutomationElement8* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentFlowsTo(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CurrentProviderDescription(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentProviderDescription(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CachedProcessId(IUIAutomationElement8* This,int *retVal) {
    return This->lpVtbl->get_CachedProcessId(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CachedControlType(IUIAutomationElement8* This,CONTROLTYPEID *retVal) {
    return This->lpVtbl->get_CachedControlType(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CachedLocalizedControlType(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedLocalizedControlType(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CachedName(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedName(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CachedAcceleratorKey(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAcceleratorKey(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CachedAccessKey(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAccessKey(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CachedHasKeyboardFocus(IUIAutomationElement8* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedHasKeyboardFocus(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CachedIsKeyboardFocusable(IUIAutomationElement8* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsKeyboardFocusable(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CachedIsEnabled(IUIAutomationElement8* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsEnabled(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CachedAutomationId(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAutomationId(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CachedClassName(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedClassName(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CachedHelpText(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedHelpText(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CachedCulture(IUIAutomationElement8* This,int *retVal) {
    return This->lpVtbl->get_CachedCulture(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CachedIsControlElement(IUIAutomationElement8* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsControlElement(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CachedIsContentElement(IUIAutomationElement8* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsContentElement(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CachedIsPassword(IUIAutomationElement8* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsPassword(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CachedNativeWindowHandle(IUIAutomationElement8* This,UIA_HWND *retVal) {
    return This->lpVtbl->get_CachedNativeWindowHandle(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CachedItemType(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedItemType(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CachedIsOffscreen(IUIAutomationElement8* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsOffscreen(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CachedOrientation(IUIAutomationElement8* This,enum OrientationType *retVal) {
    return This->lpVtbl->get_CachedOrientation(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CachedFrameworkId(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedFrameworkId(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CachedIsRequiredForForm(IUIAutomationElement8* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsRequiredForForm(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CachedItemStatus(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedItemStatus(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CachedBoundingRectangle(IUIAutomationElement8* This,RECT *retVal) {
    return This->lpVtbl->get_CachedBoundingRectangle(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CachedLabeledBy(IUIAutomationElement8* This,IUIAutomationElement **retVal) {
    return This->lpVtbl->get_CachedLabeledBy(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CachedAriaRole(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAriaRole(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CachedAriaProperties(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAriaProperties(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CachedIsDataValidForForm(IUIAutomationElement8* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsDataValidForForm(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CachedControllerFor(IUIAutomationElement8* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedControllerFor(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CachedDescribedBy(IUIAutomationElement8* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedDescribedBy(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CachedFlowsTo(IUIAutomationElement8* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedFlowsTo(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CachedProviderDescription(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedProviderDescription(This,retVal);
}
static inline HRESULT IUIAutomationElement8_GetClickablePoint(IUIAutomationElement8* This,POINT *clickable,WINBOOL *gotClickable) {
    return This->lpVtbl->GetClickablePoint(This,clickable,gotClickable);
}
/*** IUIAutomationElement2 methods ***/
static inline HRESULT IUIAutomationElement8_get_CurrentOptimizeForVisualContent(IUIAutomationElement8* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentOptimizeForVisualContent(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CachedOptimizeForVisualContent(IUIAutomationElement8* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedOptimizeForVisualContent(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CurrentLiveSetting(IUIAutomationElement8* This,enum LiveSetting *retVal) {
    return This->lpVtbl->get_CurrentLiveSetting(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CachedLiveSetting(IUIAutomationElement8* This,enum LiveSetting *retVal) {
    return This->lpVtbl->get_CachedLiveSetting(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CurrentFlowsFrom(IUIAutomationElement8* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentFlowsFrom(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CachedFlowsFrom(IUIAutomationElement8* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedFlowsFrom(This,retVal);
}
/*** IUIAutomationElement3 methods ***/
static inline HRESULT IUIAutomationElement8_ShowContextMenu(IUIAutomationElement8* This) {
    return This->lpVtbl->ShowContextMenu(This);
}
static inline HRESULT IUIAutomationElement8_get_CurrentIsPeripheral(IUIAutomationElement8* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsPeripheral(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CachedIsPeripheral(IUIAutomationElement8* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsPeripheral(This,retVal);
}
/*** IUIAutomationElement4 methods ***/
static inline HRESULT IUIAutomationElement8_get_CurrentPositionInSet(IUIAutomationElement8* This,int *retVal) {
    return This->lpVtbl->get_CurrentPositionInSet(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CurrentSizeOfSet(IUIAutomationElement8* This,int *retVal) {
    return This->lpVtbl->get_CurrentSizeOfSet(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CurrentLevel(IUIAutomationElement8* This,int *retVal) {
    return This->lpVtbl->get_CurrentLevel(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CurrentAnnotationTypes(IUIAutomationElement8* This,SAFEARRAY **retVal) {
    return This->lpVtbl->get_CurrentAnnotationTypes(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CurrentAnnotationObjects(IUIAutomationElement8* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentAnnotationObjects(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CachedPositionInSet(IUIAutomationElement8* This,int *retVal) {
    return This->lpVtbl->get_CachedPositionInSet(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CachedSizeOfSet(IUIAutomationElement8* This,int *retVal) {
    return This->lpVtbl->get_CachedSizeOfSet(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CachedLevel(IUIAutomationElement8* This,int *retVal) {
    return This->lpVtbl->get_CachedLevel(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CachedAnnotationTypes(IUIAutomationElement8* This,SAFEARRAY **retVal) {
    return This->lpVtbl->get_CachedAnnotationTypes(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CachedAnnotationObjects(IUIAutomationElement8* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedAnnotationObjects(This,retVal);
}
/*** IUIAutomationElement5 methods ***/
static inline HRESULT IUIAutomationElement8_get_CurrentLandmarkType(IUIAutomationElement8* This,LANDMARKTYPEID *retVal) {
    return This->lpVtbl->get_CurrentLandmarkType(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CurrentLocalizedLandmarkType(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentLocalizedLandmarkType(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CachedLandmarkType(IUIAutomationElement8* This,LANDMARKTYPEID *retVal) {
    return This->lpVtbl->get_CachedLandmarkType(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CachedLocalizedLandmarkType(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedLocalizedLandmarkType(This,retVal);
}
/*** IUIAutomationElement6 methods ***/
static inline HRESULT IUIAutomationElement8_get_CurrentFullDescription(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentFullDescription(This,retVal);
}
static inline HRESULT IUIAutomationElement8_get_CachedFullDescription(IUIAutomationElement8* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedFullDescription(This,retVal);
}
/*** IUIAutomationElement7 methods ***/
static 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 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 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 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 inline HRESULT IUIAutomationElement8_GetCurrentMetadataValue(IUIAutomationElement8* This,int targetId,METADATAID metadataId,VARIANT *returnVal) {
    return This->lpVtbl->GetCurrentMetadataValue(This,targetId,metadataId,returnVal);
}
/*** IUIAutomationElement8 methods ***/
static inline HRESULT IUIAutomationElement8_get_CurrentHeadingLevel(IUIAutomationElement8* This,HEADINGLEVELID *retVal) {
    return This->lpVtbl->get_CurrentHeadingLevel(This,retVal);
}
static 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 inline HRESULT IUIAutomationElement9_QueryInterface(IUIAutomationElement9* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationElement9_AddRef(IUIAutomationElement9* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationElement9_Release(IUIAutomationElement9* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationElement methods ***/
static inline HRESULT IUIAutomationElement9_SetFocus(IUIAutomationElement9* This) {
    return This->lpVtbl->SetFocus(This);
}
static inline HRESULT IUIAutomationElement9_GetRuntimeId(IUIAutomationElement9* This,SAFEARRAY **runtimeId) {
    return This->lpVtbl->GetRuntimeId(This,runtimeId);
}
static inline HRESULT IUIAutomationElement9_FindFirst(IUIAutomationElement9* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationElement **found) {
    return This->lpVtbl->FindFirst(This,scope,condition,found);
}
static inline HRESULT IUIAutomationElement9_FindAll(IUIAutomationElement9* This,enum TreeScope scope,IUIAutomationCondition *condition,IUIAutomationElementArray **found) {
    return This->lpVtbl->FindAll(This,scope,condition,found);
}
static 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 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 inline HRESULT IUIAutomationElement9_BuildUpdatedCache(IUIAutomationElement9* This,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **updatedElement) {
    return This->lpVtbl->BuildUpdatedCache(This,cacheRequest,updatedElement);
}
static inline HRESULT IUIAutomationElement9_GetCurrentPropertyValue(IUIAutomationElement9* This,PROPERTYID propertyId,VARIANT *retVal) {
    return This->lpVtbl->GetCurrentPropertyValue(This,propertyId,retVal);
}
static inline HRESULT IUIAutomationElement9_GetCurrentPropertyValueEx(IUIAutomationElement9* This,PROPERTYID propertyId,WINBOOL ignoreDefaultValue,VARIANT *retVal) {
    return This->lpVtbl->GetCurrentPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal);
}
static inline HRESULT IUIAutomationElement9_GetCachedPropertyValue(IUIAutomationElement9* This,PROPERTYID propertyId,VARIANT *retVal) {
    return This->lpVtbl->GetCachedPropertyValue(This,propertyId,retVal);
}
static inline HRESULT IUIAutomationElement9_GetCachedPropertyValueEx(IUIAutomationElement9* This,PROPERTYID propertyId,WINBOOL ignoreDefaultValue,VARIANT *retVal) {
    return This->lpVtbl->GetCachedPropertyValueEx(This,propertyId,ignoreDefaultValue,retVal);
}
static inline HRESULT IUIAutomationElement9_GetCurrentPatternAs(IUIAutomationElement9* This,PATTERNID patternId,REFIID riid,void **patternObject) {
    return This->lpVtbl->GetCurrentPatternAs(This,patternId,riid,patternObject);
}
static inline HRESULT IUIAutomationElement9_GetCachedPatternAs(IUIAutomationElement9* This,PATTERNID patternId,REFIID riid,void **patternObject) {
    return This->lpVtbl->GetCachedPatternAs(This,patternId,riid,patternObject);
}
static inline HRESULT IUIAutomationElement9_GetCurrentPattern(IUIAutomationElement9* This,PATTERNID patternId,IUnknown **patternObject) {
    return This->lpVtbl->GetCurrentPattern(This,patternId,patternObject);
}
static inline HRESULT IUIAutomationElement9_GetCachedPattern(IUIAutomationElement9* This,PATTERNID patternId,IUnknown **patternObject) {
    return This->lpVtbl->GetCachedPattern(This,patternId,patternObject);
}
static inline HRESULT IUIAutomationElement9_GetCachedParent(IUIAutomationElement9* This,IUIAutomationElement **parent) {
    return This->lpVtbl->GetCachedParent(This,parent);
}
static inline HRESULT IUIAutomationElement9_GetCachedChildren(IUIAutomationElement9* This,IUIAutomationElementArray **children) {
    return This->lpVtbl->GetCachedChildren(This,children);
}
static inline HRESULT IUIAutomationElement9_get_CurrentProcessId(IUIAutomationElement9* This,int *retVal) {
    return This->lpVtbl->get_CurrentProcessId(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CurrentControlType(IUIAutomationElement9* This,CONTROLTYPEID *retVal) {
    return This->lpVtbl->get_CurrentControlType(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CurrentLocalizedControlType(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentLocalizedControlType(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CurrentName(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentName(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CurrentAcceleratorKey(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAcceleratorKey(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CurrentAccessKey(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAccessKey(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CurrentHasKeyboardFocus(IUIAutomationElement9* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentHasKeyboardFocus(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CurrentIsKeyboardFocusable(IUIAutomationElement9* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsKeyboardFocusable(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CurrentIsEnabled(IUIAutomationElement9* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsEnabled(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CurrentAutomationId(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAutomationId(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CurrentClassName(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentClassName(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CurrentHelpText(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentHelpText(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CurrentCulture(IUIAutomationElement9* This,int *retVal) {
    return This->lpVtbl->get_CurrentCulture(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CurrentIsControlElement(IUIAutomationElement9* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsControlElement(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CurrentIsContentElement(IUIAutomationElement9* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsContentElement(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CurrentIsPassword(IUIAutomationElement9* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsPassword(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CurrentNativeWindowHandle(IUIAutomationElement9* This,UIA_HWND *retVal) {
    return This->lpVtbl->get_CurrentNativeWindowHandle(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CurrentItemType(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentItemType(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CurrentIsOffscreen(IUIAutomationElement9* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsOffscreen(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CurrentOrientation(IUIAutomationElement9* This,enum OrientationType *retVal) {
    return This->lpVtbl->get_CurrentOrientation(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CurrentFrameworkId(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentFrameworkId(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CurrentIsRequiredForForm(IUIAutomationElement9* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsRequiredForForm(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CurrentItemStatus(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentItemStatus(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CurrentBoundingRectangle(IUIAutomationElement9* This,RECT *retVal) {
    return This->lpVtbl->get_CurrentBoundingRectangle(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CurrentLabeledBy(IUIAutomationElement9* This,IUIAutomationElement **retVal) {
    return This->lpVtbl->get_CurrentLabeledBy(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CurrentAriaRole(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAriaRole(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CurrentAriaProperties(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentAriaProperties(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CurrentIsDataValidForForm(IUIAutomationElement9* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsDataValidForForm(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CurrentControllerFor(IUIAutomationElement9* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentControllerFor(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CurrentDescribedBy(IUIAutomationElement9* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentDescribedBy(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CurrentFlowsTo(IUIAutomationElement9* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentFlowsTo(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CurrentProviderDescription(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentProviderDescription(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CachedProcessId(IUIAutomationElement9* This,int *retVal) {
    return This->lpVtbl->get_CachedProcessId(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CachedControlType(IUIAutomationElement9* This,CONTROLTYPEID *retVal) {
    return This->lpVtbl->get_CachedControlType(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CachedLocalizedControlType(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedLocalizedControlType(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CachedName(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedName(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CachedAcceleratorKey(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAcceleratorKey(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CachedAccessKey(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAccessKey(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CachedHasKeyboardFocus(IUIAutomationElement9* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedHasKeyboardFocus(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CachedIsKeyboardFocusable(IUIAutomationElement9* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsKeyboardFocusable(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CachedIsEnabled(IUIAutomationElement9* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsEnabled(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CachedAutomationId(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAutomationId(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CachedClassName(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedClassName(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CachedHelpText(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedHelpText(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CachedCulture(IUIAutomationElement9* This,int *retVal) {
    return This->lpVtbl->get_CachedCulture(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CachedIsControlElement(IUIAutomationElement9* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsControlElement(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CachedIsContentElement(IUIAutomationElement9* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsContentElement(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CachedIsPassword(IUIAutomationElement9* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsPassword(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CachedNativeWindowHandle(IUIAutomationElement9* This,UIA_HWND *retVal) {
    return This->lpVtbl->get_CachedNativeWindowHandle(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CachedItemType(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedItemType(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CachedIsOffscreen(IUIAutomationElement9* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsOffscreen(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CachedOrientation(IUIAutomationElement9* This,enum OrientationType *retVal) {
    return This->lpVtbl->get_CachedOrientation(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CachedFrameworkId(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedFrameworkId(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CachedIsRequiredForForm(IUIAutomationElement9* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsRequiredForForm(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CachedItemStatus(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedItemStatus(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CachedBoundingRectangle(IUIAutomationElement9* This,RECT *retVal) {
    return This->lpVtbl->get_CachedBoundingRectangle(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CachedLabeledBy(IUIAutomationElement9* This,IUIAutomationElement **retVal) {
    return This->lpVtbl->get_CachedLabeledBy(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CachedAriaRole(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAriaRole(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CachedAriaProperties(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedAriaProperties(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CachedIsDataValidForForm(IUIAutomationElement9* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsDataValidForForm(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CachedControllerFor(IUIAutomationElement9* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedControllerFor(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CachedDescribedBy(IUIAutomationElement9* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedDescribedBy(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CachedFlowsTo(IUIAutomationElement9* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedFlowsTo(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CachedProviderDescription(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedProviderDescription(This,retVal);
}
static inline HRESULT IUIAutomationElement9_GetClickablePoint(IUIAutomationElement9* This,POINT *clickable,WINBOOL *gotClickable) {
    return This->lpVtbl->GetClickablePoint(This,clickable,gotClickable);
}
/*** IUIAutomationElement2 methods ***/
static inline HRESULT IUIAutomationElement9_get_CurrentOptimizeForVisualContent(IUIAutomationElement9* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentOptimizeForVisualContent(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CachedOptimizeForVisualContent(IUIAutomationElement9* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedOptimizeForVisualContent(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CurrentLiveSetting(IUIAutomationElement9* This,enum LiveSetting *retVal) {
    return This->lpVtbl->get_CurrentLiveSetting(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CachedLiveSetting(IUIAutomationElement9* This,enum LiveSetting *retVal) {
    return This->lpVtbl->get_CachedLiveSetting(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CurrentFlowsFrom(IUIAutomationElement9* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentFlowsFrom(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CachedFlowsFrom(IUIAutomationElement9* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedFlowsFrom(This,retVal);
}
/*** IUIAutomationElement3 methods ***/
static inline HRESULT IUIAutomationElement9_ShowContextMenu(IUIAutomationElement9* This) {
    return This->lpVtbl->ShowContextMenu(This);
}
static inline HRESULT IUIAutomationElement9_get_CurrentIsPeripheral(IUIAutomationElement9* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsPeripheral(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CachedIsPeripheral(IUIAutomationElement9* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CachedIsPeripheral(This,retVal);
}
/*** IUIAutomationElement4 methods ***/
static inline HRESULT IUIAutomationElement9_get_CurrentPositionInSet(IUIAutomationElement9* This,int *retVal) {
    return This->lpVtbl->get_CurrentPositionInSet(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CurrentSizeOfSet(IUIAutomationElement9* This,int *retVal) {
    return This->lpVtbl->get_CurrentSizeOfSet(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CurrentLevel(IUIAutomationElement9* This,int *retVal) {
    return This->lpVtbl->get_CurrentLevel(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CurrentAnnotationTypes(IUIAutomationElement9* This,SAFEARRAY **retVal) {
    return This->lpVtbl->get_CurrentAnnotationTypes(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CurrentAnnotationObjects(IUIAutomationElement9* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CurrentAnnotationObjects(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CachedPositionInSet(IUIAutomationElement9* This,int *retVal) {
    return This->lpVtbl->get_CachedPositionInSet(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CachedSizeOfSet(IUIAutomationElement9* This,int *retVal) {
    return This->lpVtbl->get_CachedSizeOfSet(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CachedLevel(IUIAutomationElement9* This,int *retVal) {
    return This->lpVtbl->get_CachedLevel(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CachedAnnotationTypes(IUIAutomationElement9* This,SAFEARRAY **retVal) {
    return This->lpVtbl->get_CachedAnnotationTypes(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CachedAnnotationObjects(IUIAutomationElement9* This,IUIAutomationElementArray **retVal) {
    return This->lpVtbl->get_CachedAnnotationObjects(This,retVal);
}
/*** IUIAutomationElement5 methods ***/
static inline HRESULT IUIAutomationElement9_get_CurrentLandmarkType(IUIAutomationElement9* This,LANDMARKTYPEID *retVal) {
    return This->lpVtbl->get_CurrentLandmarkType(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CurrentLocalizedLandmarkType(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentLocalizedLandmarkType(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CachedLandmarkType(IUIAutomationElement9* This,LANDMARKTYPEID *retVal) {
    return This->lpVtbl->get_CachedLandmarkType(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CachedLocalizedLandmarkType(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedLocalizedLandmarkType(This,retVal);
}
/*** IUIAutomationElement6 methods ***/
static inline HRESULT IUIAutomationElement9_get_CurrentFullDescription(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CurrentFullDescription(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CachedFullDescription(IUIAutomationElement9* This,BSTR *retVal) {
    return This->lpVtbl->get_CachedFullDescription(This,retVal);
}
/*** IUIAutomationElement7 methods ***/
static 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 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 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 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 inline HRESULT IUIAutomationElement9_GetCurrentMetadataValue(IUIAutomationElement9* This,int targetId,METADATAID metadataId,VARIANT *returnVal) {
    return This->lpVtbl->GetCurrentMetadataValue(This,targetId,metadataId,returnVal);
}
/*** IUIAutomationElement8 methods ***/
static inline HRESULT IUIAutomationElement9_get_CurrentHeadingLevel(IUIAutomationElement9* This,HEADINGLEVELID *retVal) {
    return This->lpVtbl->get_CurrentHeadingLevel(This,retVal);
}
static inline HRESULT IUIAutomationElement9_get_CachedHeadingLevel(IUIAutomationElement9* This,HEADINGLEVELID *retVal) {
    return This->lpVtbl->get_CachedHeadingLevel(This,retVal);
}
/*** IUIAutomationElement9 methods ***/
static inline HRESULT IUIAutomationElement9_get_CurrentIsDialog(IUIAutomationElement9* This,WINBOOL *retVal) {
    return This->lpVtbl->get_CurrentIsDialog(This,retVal);
}
static 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 inline HRESULT IUIAutomationElementArray_QueryInterface(IUIAutomationElementArray* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationElementArray_AddRef(IUIAutomationElementArray* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationElementArray_Release(IUIAutomationElementArray* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationElementArray methods ***/
static inline HRESULT IUIAutomationElementArray_get_Length(IUIAutomationElementArray* This,int *length) {
    return This->lpVtbl->get_Length(This,length);
}
static 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 inline HRESULT IUIAutomationProxyFactory_QueryInterface(IUIAutomationProxyFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationProxyFactory_AddRef(IUIAutomationProxyFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationProxyFactory_Release(IUIAutomationProxyFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationProxyFactory methods ***/
static 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 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 inline HRESULT IUIAutomationProxyFactoryEntry_QueryInterface(IUIAutomationProxyFactoryEntry* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationProxyFactoryEntry_AddRef(IUIAutomationProxyFactoryEntry* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationProxyFactoryEntry_Release(IUIAutomationProxyFactoryEntry* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationProxyFactoryEntry methods ***/
static inline HRESULT IUIAutomationProxyFactoryEntry_get_ProxyFactory(IUIAutomationProxyFactoryEntry* This,IUIAutomationProxyFactory **factory) {
    return This->lpVtbl->get_ProxyFactory(This,factory);
}
static inline HRESULT IUIAutomationProxyFactoryEntry_get_ClassName(IUIAutomationProxyFactoryEntry* This,BSTR *className) {
    return This->lpVtbl->get_ClassName(This,className);
}
static inline HRESULT IUIAutomationProxyFactoryEntry_get_ImageName(IUIAutomationProxyFactoryEntry* This,BSTR *imageName) {
    return This->lpVtbl->get_ImageName(This,imageName);
}
static inline HRESULT IUIAutomationProxyFactoryEntry_get_AllowSubstringMatch(IUIAutomationProxyFactoryEntry* This,WINBOOL *allowSubstringMatch) {
    return This->lpVtbl->get_AllowSubstringMatch(This,allowSubstringMatch);
}
static inline HRESULT IUIAutomationProxyFactoryEntry_get_CanCheckBaseClass(IUIAutomationProxyFactoryEntry* This,WINBOOL *canCheckBaseClass) {
    return This->lpVtbl->get_CanCheckBaseClass(This,canCheckBaseClass);
}
static inline HRESULT IUIAutomationProxyFactoryEntry_get_NeedsAdviseEvents(IUIAutomationProxyFactoryEntry* This,WINBOOL *adviseEvents) {
    return This->lpVtbl->get_NeedsAdviseEvents(This,adviseEvents);
}
static inline HRESULT IUIAutomationProxyFactoryEntry_put_ClassName(IUIAutomationProxyFactoryEntry* This,LPCWSTR className) {
    return This->lpVtbl->put_ClassName(This,className);
}
static inline HRESULT IUIAutomationProxyFactoryEntry_put_ImageName(IUIAutomationProxyFactoryEntry* This,LPCWSTR imageName) {
    return This->lpVtbl->put_ImageName(This,imageName);
}
static inline HRESULT IUIAutomationProxyFactoryEntry_put_AllowSubstringMatch(IUIAutomationProxyFactoryEntry* This,WINBOOL allowSubstringMatch) {
    return This->lpVtbl->put_AllowSubstringMatch(This,allowSubstringMatch);
}
static inline HRESULT IUIAutomationProxyFactoryEntry_put_CanCheckBaseClass(IUIAutomationProxyFactoryEntry* This,WINBOOL canCheckBaseClass) {
    return This->lpVtbl->put_CanCheckBaseClass(This,canCheckBaseClass);
}
static inline HRESULT IUIAutomationProxyFactoryEntry_put_NeedsAdviseEvents(IUIAutomationProxyFactoryEntry* This,WINBOOL adviseEvents) {
    return This->lpVtbl->put_NeedsAdviseEvents(This,adviseEvents);
}
static inline HRESULT IUIAutomationProxyFactoryEntry_SetWinEventsForAutomationEvent(IUIAutomationProxyFactoryEntry* This,EVENTID eventId,PROPERTYID propertyId,SAFEARRAY *winEvents) {
    return This->lpVtbl->SetWinEventsForAutomationEvent(This,eventId,propertyId,winEvents);
}
static 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 inline HRESULT IUIAutomationProxyFactoryMapping_QueryInterface(IUIAutomationProxyFactoryMapping* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationProxyFactoryMapping_AddRef(IUIAutomationProxyFactoryMapping* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationProxyFactoryMapping_Release(IUIAutomationProxyFactoryMapping* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationProxyFactoryMapping methods ***/
static inline HRESULT IUIAutomationProxyFactoryMapping_get_Count(IUIAutomationProxyFactoryMapping* This,UINT *count) {
    return This->lpVtbl->get_Count(This,count);
}
static inline HRESULT IUIAutomationProxyFactoryMapping_GetTable(IUIAutomationProxyFactoryMapping* This,SAFEARRAY **table) {
    return This->lpVtbl->GetTable(This,table);
}
static inline HRESULT IUIAutomationProxyFactoryMapping_GetEntry(IUIAutomationProxyFactoryMapping* This,UINT index,IUIAutomationProxyFactoryEntry **entry) {
    return This->lpVtbl->GetEntry(This,index,entry);
}
static inline HRESULT IUIAutomationProxyFactoryMapping_SetTable(IUIAutomationProxyFactoryMapping* This,SAFEARRAY *factoryList) {
    return This->lpVtbl->SetTable(This,factoryList);
}
static inline HRESULT IUIAutomationProxyFactoryMapping_InsertEntries(IUIAutomationProxyFactoryMapping* This,UINT before,SAFEARRAY *factoryList) {
    return This->lpVtbl->InsertEntries(This,before,factoryList);
}
static inline HRESULT IUIAutomationProxyFactoryMapping_InsertEntry(IUIAutomationProxyFactoryMapping* This,UINT before,IUIAutomationProxyFactoryEntry *factory) {
    return This->lpVtbl->InsertEntry(This,before,factory);
}
static inline HRESULT IUIAutomationProxyFactoryMapping_RemoveEntry(IUIAutomationProxyFactoryMapping* This,UINT index) {
    return This->lpVtbl->RemoveEntry(This,index);
}
static inline HRESULT IUIAutomationProxyFactoryMapping_ClearTable(IUIAutomationProxyFactoryMapping* This) {
    return This->lpVtbl->ClearTable(This);
}
static 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 inline HRESULT IUIAutomationEventHandlerGroup_QueryInterface(IUIAutomationEventHandlerGroup* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomationEventHandlerGroup_AddRef(IUIAutomationEventHandlerGroup* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomationEventHandlerGroup_Release(IUIAutomationEventHandlerGroup* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomationEventHandlerGroup methods ***/
static inline HRESULT IUIAutomationEventHandlerGroup_AddActiveTextPositionChangedEventHandler(IUIAutomationEventHandlerGroup* This,enum TreeScope scope,IUIAutomationCacheRequest *cacheRequest,IUIAutomationActiveTextPositionChangedEventHandler *handler) {
    return This->lpVtbl->AddActiveTextPositionChangedEventHandler(This,scope,cacheRequest,handler);
}
static 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 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 inline HRESULT IUIAutomationEventHandlerGroup_AddNotificationEventHandler(IUIAutomationEventHandlerGroup* This,enum TreeScope scope,IUIAutomationCacheRequest *cacheRequest,IUIAutomationNotificationEventHandler *handler) {
    return This->lpVtbl->AddNotificationEventHandler(This,scope,cacheRequest,handler);
}
static 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 inline HRESULT IUIAutomationEventHandlerGroup_AddStructureChangedEventHandler(IUIAutomationEventHandlerGroup* This,enum TreeScope scope,IUIAutomationCacheRequest *cacheRequest,IUIAutomationStructureChangedEventHandler *handler) {
    return This->lpVtbl->AddStructureChangedEventHandler(This,scope,cacheRequest,handler);
}
static 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 inline HRESULT IUIAutomation_QueryInterface(IUIAutomation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomation_AddRef(IUIAutomation* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomation_Release(IUIAutomation* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomation methods ***/
static inline HRESULT IUIAutomation_CompareElements(IUIAutomation* This,IUIAutomationElement *el1,IUIAutomationElement *el2,WINBOOL *areSame) {
    return This->lpVtbl->CompareElements(This,el1,el2,areSame);
}
static inline HRESULT IUIAutomation_CompareRuntimeIds(IUIAutomation* This,SAFEARRAY *runtimeId1,SAFEARRAY *runtimeId2,WINBOOL *areSame) {
    return This->lpVtbl->CompareRuntimeIds(This,runtimeId1,runtimeId2,areSame);
}
static inline HRESULT IUIAutomation_GetRootElement(IUIAutomation* This,IUIAutomationElement **root) {
    return This->lpVtbl->GetRootElement(This,root);
}
static inline HRESULT IUIAutomation_ElementFromHandle(IUIAutomation* This,UIA_HWND hwnd,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromHandle(This,hwnd,element);
}
static inline HRESULT IUIAutomation_ElementFromPoint(IUIAutomation* This,POINT pt,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromPoint(This,pt,element);
}
static inline HRESULT IUIAutomation_GetFocusedElement(IUIAutomation* This,IUIAutomationElement **element) {
    return This->lpVtbl->GetFocusedElement(This,element);
}
static inline HRESULT IUIAutomation_GetRootElementBuildCache(IUIAutomation* This,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **root) {
    return This->lpVtbl->GetRootElementBuildCache(This,cacheRequest,root);
}
static inline HRESULT IUIAutomation_ElementFromHandleBuildCache(IUIAutomation* This,UIA_HWND hwnd,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromHandleBuildCache(This,hwnd,cacheRequest,element);
}
static inline HRESULT IUIAutomation_ElementFromPointBuildCache(IUIAutomation* This,POINT pt,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromPointBuildCache(This,pt,cacheRequest,element);
}
static inline HRESULT IUIAutomation_GetFocusedElementBuildCache(IUIAutomation* This,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **element) {
    return This->lpVtbl->GetFocusedElementBuildCache(This,cacheRequest,element);
}
static inline HRESULT IUIAutomation_CreateTreeWalker(IUIAutomation* This,IUIAutomationCondition *pCondition,IUIAutomationTreeWalker **walker) {
    return This->lpVtbl->CreateTreeWalker(This,pCondition,walker);
}
static inline HRESULT IUIAutomation_get_ControlViewWalker(IUIAutomation* This,IUIAutomationTreeWalker **walker) {
    return This->lpVtbl->get_ControlViewWalker(This,walker);
}
static inline HRESULT IUIAutomation_get_ContentViewWalker(IUIAutomation* This,IUIAutomationTreeWalker **walker) {
    return This->lpVtbl->get_ContentViewWalker(This,walker);
}
static inline HRESULT IUIAutomation_get_RawViewWalker(IUIAutomation* This,IUIAutomationTreeWalker **walker) {
    return This->lpVtbl->get_RawViewWalker(This,walker);
}
static inline HRESULT IUIAutomation_get_RawViewCondition(IUIAutomation* This,IUIAutomationCondition **condition) {
    return This->lpVtbl->get_RawViewCondition(This,condition);
}
static inline HRESULT IUIAutomation_get_ControlViewCondition(IUIAutomation* This,IUIAutomationCondition **condition) {
    return This->lpVtbl->get_ControlViewCondition(This,condition);
}
static inline HRESULT IUIAutomation_get_ContentViewCondition(IUIAutomation* This,IUIAutomationCondition **condition) {
    return This->lpVtbl->get_ContentViewCondition(This,condition);
}
static inline HRESULT IUIAutomation_CreateCacheRequest(IUIAutomation* This,IUIAutomationCacheRequest **cacheRequest) {
    return This->lpVtbl->CreateCacheRequest(This,cacheRequest);
}
static inline HRESULT IUIAutomation_CreateTrueCondition(IUIAutomation* This,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateTrueCondition(This,newCondition);
}
static inline HRESULT IUIAutomation_CreateFalseCondition(IUIAutomation* This,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateFalseCondition(This,newCondition);
}
static inline HRESULT IUIAutomation_CreatePropertyCondition(IUIAutomation* This,PROPERTYID propertyId,VARIANT value,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreatePropertyCondition(This,propertyId,value,newCondition);
}
static 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 inline HRESULT IUIAutomation_CreateAndCondition(IUIAutomation* This,IUIAutomationCondition *condition1,IUIAutomationCondition *condition2,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateAndCondition(This,condition1,condition2,newCondition);
}
static inline HRESULT IUIAutomation_CreateAndConditionFromArray(IUIAutomation* This,SAFEARRAY *conditions,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateAndConditionFromArray(This,conditions,newCondition);
}
static inline HRESULT IUIAutomation_CreateAndConditionFromNativeArray(IUIAutomation* This,IUIAutomationCondition **conditions,int conditionCount,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateAndConditionFromNativeArray(This,conditions,conditionCount,newCondition);
}
static inline HRESULT IUIAutomation_CreateOrCondition(IUIAutomation* This,IUIAutomationCondition *condition1,IUIAutomationCondition *condition2,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateOrCondition(This,condition1,condition2,newCondition);
}
static inline HRESULT IUIAutomation_CreateOrConditionFromArray(IUIAutomation* This,SAFEARRAY *conditions,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateOrConditionFromArray(This,conditions,newCondition);
}
static inline HRESULT IUIAutomation_CreateOrConditionFromNativeArray(IUIAutomation* This,IUIAutomationCondition **conditions,int conditionCount,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateOrConditionFromNativeArray(This,conditions,conditionCount,newCondition);
}
static inline HRESULT IUIAutomation_CreateNotCondition(IUIAutomation* This,IUIAutomationCondition *condition,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateNotCondition(This,condition,newCondition);
}
static 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 inline HRESULT IUIAutomation_RemoveAutomationEventHandler(IUIAutomation* This,EVENTID eventId,IUIAutomationElement *element,IUIAutomationEventHandler *handler) {
    return This->lpVtbl->RemoveAutomationEventHandler(This,eventId,element,handler);
}
static 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 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 inline HRESULT IUIAutomation_RemovePropertyChangedEventHandler(IUIAutomation* This,IUIAutomationElement *element,IUIAutomationPropertyChangedEventHandler *handler) {
    return This->lpVtbl->RemovePropertyChangedEventHandler(This,element,handler);
}
static 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 inline HRESULT IUIAutomation_RemoveStructureChangedEventHandler(IUIAutomation* This,IUIAutomationElement *element,IUIAutomationStructureChangedEventHandler *handler) {
    return This->lpVtbl->RemoveStructureChangedEventHandler(This,element,handler);
}
static inline HRESULT IUIAutomation_AddFocusChangedEventHandler(IUIAutomation* This,IUIAutomationCacheRequest *cacheRequest,IUIAutomationFocusChangedEventHandler *handler) {
    return This->lpVtbl->AddFocusChangedEventHandler(This,cacheRequest,handler);
}
static inline HRESULT IUIAutomation_RemoveFocusChangedEventHandler(IUIAutomation* This,IUIAutomationFocusChangedEventHandler *handler) {
    return This->lpVtbl->RemoveFocusChangedEventHandler(This,handler);
}
static inline HRESULT IUIAutomation_RemoveAllEventHandlers(IUIAutomation* This) {
    return This->lpVtbl->RemoveAllEventHandlers(This);
}
static inline HRESULT IUIAutomation_IntNativeArrayToSafeArray(IUIAutomation* This,int *array,int arrayCount,SAFEARRAY **safeArray) {
    return This->lpVtbl->IntNativeArrayToSafeArray(This,array,arrayCount,safeArray);
}
static inline HRESULT IUIAutomation_IntSafeArrayToNativeArray(IUIAutomation* This,SAFEARRAY *intArray,int **array,int *arrayCount) {
    return This->lpVtbl->IntSafeArrayToNativeArray(This,intArray,array,arrayCount);
}
static inline HRESULT IUIAutomation_RectToVariant(IUIAutomation* This,RECT rc,VARIANT *var) {
    return This->lpVtbl->RectToVariant(This,rc,var);
}
static inline HRESULT IUIAutomation_VariantToRect(IUIAutomation* This,VARIANT var,RECT *rc) {
    return This->lpVtbl->VariantToRect(This,var,rc);
}
static inline HRESULT IUIAutomation_SafeArrayToRectNativeArray(IUIAutomation* This,SAFEARRAY *rects,RECT **rectArray,int *rectArrayCount) {
    return This->lpVtbl->SafeArrayToRectNativeArray(This,rects,rectArray,rectArrayCount);
}
static inline HRESULT IUIAutomation_CreateProxyFactoryEntry(IUIAutomation* This,IUIAutomationProxyFactory *factory,IUIAutomationProxyFactoryEntry **factoryEntry) {
    return This->lpVtbl->CreateProxyFactoryEntry(This,factory,factoryEntry);
}
static inline HRESULT IUIAutomation_get_ProxyFactoryMapping(IUIAutomation* This,IUIAutomationProxyFactoryMapping **factoryMapping) {
    return This->lpVtbl->get_ProxyFactoryMapping(This,factoryMapping);
}
static inline HRESULT IUIAutomation_GetPropertyProgrammaticName(IUIAutomation* This,PROPERTYID property,BSTR *name) {
    return This->lpVtbl->GetPropertyProgrammaticName(This,property,name);
}
static inline HRESULT IUIAutomation_GetPatternProgrammaticName(IUIAutomation* This,PATTERNID pattern,BSTR *name) {
    return This->lpVtbl->GetPatternProgrammaticName(This,pattern,name);
}
static inline HRESULT IUIAutomation_PollForPotentialSupportedPatterns(IUIAutomation* This,IUIAutomationElement *pElement,SAFEARRAY **patternIds,SAFEARRAY **patternNames) {
    return This->lpVtbl->PollForPotentialSupportedPatterns(This,pElement,patternIds,patternNames);
}
static inline HRESULT IUIAutomation_PollForPotentialSupportedProperties(IUIAutomation* This,IUIAutomationElement *pElement,SAFEARRAY **propertyIds,SAFEARRAY **propertyNames) {
    return This->lpVtbl->PollForPotentialSupportedProperties(This,pElement,propertyIds,propertyNames);
}
static inline HRESULT IUIAutomation_CheckNotSupported(IUIAutomation* This,VARIANT value,WINBOOL *isNotSupported) {
    return This->lpVtbl->CheckNotSupported(This,value,isNotSupported);
}
static inline HRESULT IUIAutomation_get_ReservedNotSupportedValue(IUIAutomation* This,IUnknown **notSupportedValue) {
    return This->lpVtbl->get_ReservedNotSupportedValue(This,notSupportedValue);
}
static inline HRESULT IUIAutomation_get_ReservedMixedAttributeValue(IUIAutomation* This,IUnknown **mixedAttributeValue) {
    return This->lpVtbl->get_ReservedMixedAttributeValue(This,mixedAttributeValue);
}
static inline HRESULT IUIAutomation_ElementFromIAccessible(IUIAutomation* This,IAccessible *accessible,int childId,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromIAccessible(This,accessible,childId,element);
}
static 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 inline HRESULT IUIAutomation2_QueryInterface(IUIAutomation2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomation2_AddRef(IUIAutomation2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomation2_Release(IUIAutomation2* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomation methods ***/
static inline HRESULT IUIAutomation2_CompareElements(IUIAutomation2* This,IUIAutomationElement *el1,IUIAutomationElement *el2,WINBOOL *areSame) {
    return This->lpVtbl->CompareElements(This,el1,el2,areSame);
}
static inline HRESULT IUIAutomation2_CompareRuntimeIds(IUIAutomation2* This,SAFEARRAY *runtimeId1,SAFEARRAY *runtimeId2,WINBOOL *areSame) {
    return This->lpVtbl->CompareRuntimeIds(This,runtimeId1,runtimeId2,areSame);
}
static inline HRESULT IUIAutomation2_GetRootElement(IUIAutomation2* This,IUIAutomationElement **root) {
    return This->lpVtbl->GetRootElement(This,root);
}
static inline HRESULT IUIAutomation2_ElementFromHandle(IUIAutomation2* This,UIA_HWND hwnd,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromHandle(This,hwnd,element);
}
static inline HRESULT IUIAutomation2_ElementFromPoint(IUIAutomation2* This,POINT pt,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromPoint(This,pt,element);
}
static inline HRESULT IUIAutomation2_GetFocusedElement(IUIAutomation2* This,IUIAutomationElement **element) {
    return This->lpVtbl->GetFocusedElement(This,element);
}
static inline HRESULT IUIAutomation2_GetRootElementBuildCache(IUIAutomation2* This,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **root) {
    return This->lpVtbl->GetRootElementBuildCache(This,cacheRequest,root);
}
static inline HRESULT IUIAutomation2_ElementFromHandleBuildCache(IUIAutomation2* This,UIA_HWND hwnd,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromHandleBuildCache(This,hwnd,cacheRequest,element);
}
static inline HRESULT IUIAutomation2_ElementFromPointBuildCache(IUIAutomation2* This,POINT pt,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromPointBuildCache(This,pt,cacheRequest,element);
}
static inline HRESULT IUIAutomation2_GetFocusedElementBuildCache(IUIAutomation2* This,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **element) {
    return This->lpVtbl->GetFocusedElementBuildCache(This,cacheRequest,element);
}
static inline HRESULT IUIAutomation2_CreateTreeWalker(IUIAutomation2* This,IUIAutomationCondition *pCondition,IUIAutomationTreeWalker **walker) {
    return This->lpVtbl->CreateTreeWalker(This,pCondition,walker);
}
static inline HRESULT IUIAutomation2_get_ControlViewWalker(IUIAutomation2* This,IUIAutomationTreeWalker **walker) {
    return This->lpVtbl->get_ControlViewWalker(This,walker);
}
static inline HRESULT IUIAutomation2_get_ContentViewWalker(IUIAutomation2* This,IUIAutomationTreeWalker **walker) {
    return This->lpVtbl->get_ContentViewWalker(This,walker);
}
static inline HRESULT IUIAutomation2_get_RawViewWalker(IUIAutomation2* This,IUIAutomationTreeWalker **walker) {
    return This->lpVtbl->get_RawViewWalker(This,walker);
}
static inline HRESULT IUIAutomation2_get_RawViewCondition(IUIAutomation2* This,IUIAutomationCondition **condition) {
    return This->lpVtbl->get_RawViewCondition(This,condition);
}
static inline HRESULT IUIAutomation2_get_ControlViewCondition(IUIAutomation2* This,IUIAutomationCondition **condition) {
    return This->lpVtbl->get_ControlViewCondition(This,condition);
}
static inline HRESULT IUIAutomation2_get_ContentViewCondition(IUIAutomation2* This,IUIAutomationCondition **condition) {
    return This->lpVtbl->get_ContentViewCondition(This,condition);
}
static inline HRESULT IUIAutomation2_CreateCacheRequest(IUIAutomation2* This,IUIAutomationCacheRequest **cacheRequest) {
    return This->lpVtbl->CreateCacheRequest(This,cacheRequest);
}
static inline HRESULT IUIAutomation2_CreateTrueCondition(IUIAutomation2* This,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateTrueCondition(This,newCondition);
}
static inline HRESULT IUIAutomation2_CreateFalseCondition(IUIAutomation2* This,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateFalseCondition(This,newCondition);
}
static inline HRESULT IUIAutomation2_CreatePropertyCondition(IUIAutomation2* This,PROPERTYID propertyId,VARIANT value,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreatePropertyCondition(This,propertyId,value,newCondition);
}
static 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 inline HRESULT IUIAutomation2_CreateAndCondition(IUIAutomation2* This,IUIAutomationCondition *condition1,IUIAutomationCondition *condition2,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateAndCondition(This,condition1,condition2,newCondition);
}
static inline HRESULT IUIAutomation2_CreateAndConditionFromArray(IUIAutomation2* This,SAFEARRAY *conditions,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateAndConditionFromArray(This,conditions,newCondition);
}
static inline HRESULT IUIAutomation2_CreateAndConditionFromNativeArray(IUIAutomation2* This,IUIAutomationCondition **conditions,int conditionCount,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateAndConditionFromNativeArray(This,conditions,conditionCount,newCondition);
}
static inline HRESULT IUIAutomation2_CreateOrCondition(IUIAutomation2* This,IUIAutomationCondition *condition1,IUIAutomationCondition *condition2,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateOrCondition(This,condition1,condition2,newCondition);
}
static inline HRESULT IUIAutomation2_CreateOrConditionFromArray(IUIAutomation2* This,SAFEARRAY *conditions,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateOrConditionFromArray(This,conditions,newCondition);
}
static inline HRESULT IUIAutomation2_CreateOrConditionFromNativeArray(IUIAutomation2* This,IUIAutomationCondition **conditions,int conditionCount,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateOrConditionFromNativeArray(This,conditions,conditionCount,newCondition);
}
static inline HRESULT IUIAutomation2_CreateNotCondition(IUIAutomation2* This,IUIAutomationCondition *condition,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateNotCondition(This,condition,newCondition);
}
static 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 inline HRESULT IUIAutomation2_RemoveAutomationEventHandler(IUIAutomation2* This,EVENTID eventId,IUIAutomationElement *element,IUIAutomationEventHandler *handler) {
    return This->lpVtbl->RemoveAutomationEventHandler(This,eventId,element,handler);
}
static 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 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 inline HRESULT IUIAutomation2_RemovePropertyChangedEventHandler(IUIAutomation2* This,IUIAutomationElement *element,IUIAutomationPropertyChangedEventHandler *handler) {
    return This->lpVtbl->RemovePropertyChangedEventHandler(This,element,handler);
}
static 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 inline HRESULT IUIAutomation2_RemoveStructureChangedEventHandler(IUIAutomation2* This,IUIAutomationElement *element,IUIAutomationStructureChangedEventHandler *handler) {
    return This->lpVtbl->RemoveStructureChangedEventHandler(This,element,handler);
}
static inline HRESULT IUIAutomation2_AddFocusChangedEventHandler(IUIAutomation2* This,IUIAutomationCacheRequest *cacheRequest,IUIAutomationFocusChangedEventHandler *handler) {
    return This->lpVtbl->AddFocusChangedEventHandler(This,cacheRequest,handler);
}
static inline HRESULT IUIAutomation2_RemoveFocusChangedEventHandler(IUIAutomation2* This,IUIAutomationFocusChangedEventHandler *handler) {
    return This->lpVtbl->RemoveFocusChangedEventHandler(This,handler);
}
static inline HRESULT IUIAutomation2_RemoveAllEventHandlers(IUIAutomation2* This) {
    return This->lpVtbl->RemoveAllEventHandlers(This);
}
static inline HRESULT IUIAutomation2_IntNativeArrayToSafeArray(IUIAutomation2* This,int *array,int arrayCount,SAFEARRAY **safeArray) {
    return This->lpVtbl->IntNativeArrayToSafeArray(This,array,arrayCount,safeArray);
}
static inline HRESULT IUIAutomation2_IntSafeArrayToNativeArray(IUIAutomation2* This,SAFEARRAY *intArray,int **array,int *arrayCount) {
    return This->lpVtbl->IntSafeArrayToNativeArray(This,intArray,array,arrayCount);
}
static inline HRESULT IUIAutomation2_RectToVariant(IUIAutomation2* This,RECT rc,VARIANT *var) {
    return This->lpVtbl->RectToVariant(This,rc,var);
}
static inline HRESULT IUIAutomation2_VariantToRect(IUIAutomation2* This,VARIANT var,RECT *rc) {
    return This->lpVtbl->VariantToRect(This,var,rc);
}
static inline HRESULT IUIAutomation2_SafeArrayToRectNativeArray(IUIAutomation2* This,SAFEARRAY *rects,RECT **rectArray,int *rectArrayCount) {
    return This->lpVtbl->SafeArrayToRectNativeArray(This,rects,rectArray,rectArrayCount);
}
static inline HRESULT IUIAutomation2_CreateProxyFactoryEntry(IUIAutomation2* This,IUIAutomationProxyFactory *factory,IUIAutomationProxyFactoryEntry **factoryEntry) {
    return This->lpVtbl->CreateProxyFactoryEntry(This,factory,factoryEntry);
}
static inline HRESULT IUIAutomation2_get_ProxyFactoryMapping(IUIAutomation2* This,IUIAutomationProxyFactoryMapping **factoryMapping) {
    return This->lpVtbl->get_ProxyFactoryMapping(This,factoryMapping);
}
static inline HRESULT IUIAutomation2_GetPropertyProgrammaticName(IUIAutomation2* This,PROPERTYID property,BSTR *name) {
    return This->lpVtbl->GetPropertyProgrammaticName(This,property,name);
}
static inline HRESULT IUIAutomation2_GetPatternProgrammaticName(IUIAutomation2* This,PATTERNID pattern,BSTR *name) {
    return This->lpVtbl->GetPatternProgrammaticName(This,pattern,name);
}
static inline HRESULT IUIAutomation2_PollForPotentialSupportedPatterns(IUIAutomation2* This,IUIAutomationElement *pElement,SAFEARRAY **patternIds,SAFEARRAY **patternNames) {
    return This->lpVtbl->PollForPotentialSupportedPatterns(This,pElement,patternIds,patternNames);
}
static inline HRESULT IUIAutomation2_PollForPotentialSupportedProperties(IUIAutomation2* This,IUIAutomationElement *pElement,SAFEARRAY **propertyIds,SAFEARRAY **propertyNames) {
    return This->lpVtbl->PollForPotentialSupportedProperties(This,pElement,propertyIds,propertyNames);
}
static inline HRESULT IUIAutomation2_CheckNotSupported(IUIAutomation2* This,VARIANT value,WINBOOL *isNotSupported) {
    return This->lpVtbl->CheckNotSupported(This,value,isNotSupported);
}
static inline HRESULT IUIAutomation2_get_ReservedNotSupportedValue(IUIAutomation2* This,IUnknown **notSupportedValue) {
    return This->lpVtbl->get_ReservedNotSupportedValue(This,notSupportedValue);
}
static inline HRESULT IUIAutomation2_get_ReservedMixedAttributeValue(IUIAutomation2* This,IUnknown **mixedAttributeValue) {
    return This->lpVtbl->get_ReservedMixedAttributeValue(This,mixedAttributeValue);
}
static inline HRESULT IUIAutomation2_ElementFromIAccessible(IUIAutomation2* This,IAccessible *accessible,int childId,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromIAccessible(This,accessible,childId,element);
}
static 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 inline HRESULT IUIAutomation2_get_AutoSetFocus(IUIAutomation2* This,WINBOOL *autoSetFocus) {
    return This->lpVtbl->get_AutoSetFocus(This,autoSetFocus);
}
static inline HRESULT IUIAutomation2_put_AutoSetFocus(IUIAutomation2* This,WINBOOL autoSetFocus) {
    return This->lpVtbl->put_AutoSetFocus(This,autoSetFocus);
}
static inline HRESULT IUIAutomation2_get_ConnectionTimeout(IUIAutomation2* This,DWORD *timeout) {
    return This->lpVtbl->get_ConnectionTimeout(This,timeout);
}
static inline HRESULT IUIAutomation2_put_ConnectionTimeout(IUIAutomation2* This,DWORD timeout) {
    return This->lpVtbl->put_ConnectionTimeout(This,timeout);
}
static inline HRESULT IUIAutomation2_get_TransactionTimeout(IUIAutomation2* This,DWORD *timeout) {
    return This->lpVtbl->get_TransactionTimeout(This,timeout);
}
static 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 inline HRESULT IUIAutomation3_QueryInterface(IUIAutomation3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomation3_AddRef(IUIAutomation3* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomation3_Release(IUIAutomation3* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomation methods ***/
static inline HRESULT IUIAutomation3_CompareElements(IUIAutomation3* This,IUIAutomationElement *el1,IUIAutomationElement *el2,WINBOOL *areSame) {
    return This->lpVtbl->CompareElements(This,el1,el2,areSame);
}
static inline HRESULT IUIAutomation3_CompareRuntimeIds(IUIAutomation3* This,SAFEARRAY *runtimeId1,SAFEARRAY *runtimeId2,WINBOOL *areSame) {
    return This->lpVtbl->CompareRuntimeIds(This,runtimeId1,runtimeId2,areSame);
}
static inline HRESULT IUIAutomation3_GetRootElement(IUIAutomation3* This,IUIAutomationElement **root) {
    return This->lpVtbl->GetRootElement(This,root);
}
static inline HRESULT IUIAutomation3_ElementFromHandle(IUIAutomation3* This,UIA_HWND hwnd,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromHandle(This,hwnd,element);
}
static inline HRESULT IUIAutomation3_ElementFromPoint(IUIAutomation3* This,POINT pt,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromPoint(This,pt,element);
}
static inline HRESULT IUIAutomation3_GetFocusedElement(IUIAutomation3* This,IUIAutomationElement **element) {
    return This->lpVtbl->GetFocusedElement(This,element);
}
static inline HRESULT IUIAutomation3_GetRootElementBuildCache(IUIAutomation3* This,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **root) {
    return This->lpVtbl->GetRootElementBuildCache(This,cacheRequest,root);
}
static inline HRESULT IUIAutomation3_ElementFromHandleBuildCache(IUIAutomation3* This,UIA_HWND hwnd,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromHandleBuildCache(This,hwnd,cacheRequest,element);
}
static inline HRESULT IUIAutomation3_ElementFromPointBuildCache(IUIAutomation3* This,POINT pt,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromPointBuildCache(This,pt,cacheRequest,element);
}
static inline HRESULT IUIAutomation3_GetFocusedElementBuildCache(IUIAutomation3* This,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **element) {
    return This->lpVtbl->GetFocusedElementBuildCache(This,cacheRequest,element);
}
static inline HRESULT IUIAutomation3_CreateTreeWalker(IUIAutomation3* This,IUIAutomationCondition *pCondition,IUIAutomationTreeWalker **walker) {
    return This->lpVtbl->CreateTreeWalker(This,pCondition,walker);
}
static inline HRESULT IUIAutomation3_get_ControlViewWalker(IUIAutomation3* This,IUIAutomationTreeWalker **walker) {
    return This->lpVtbl->get_ControlViewWalker(This,walker);
}
static inline HRESULT IUIAutomation3_get_ContentViewWalker(IUIAutomation3* This,IUIAutomationTreeWalker **walker) {
    return This->lpVtbl->get_ContentViewWalker(This,walker);
}
static inline HRESULT IUIAutomation3_get_RawViewWalker(IUIAutomation3* This,IUIAutomationTreeWalker **walker) {
    return This->lpVtbl->get_RawViewWalker(This,walker);
}
static inline HRESULT IUIAutomation3_get_RawViewCondition(IUIAutomation3* This,IUIAutomationCondition **condition) {
    return This->lpVtbl->get_RawViewCondition(This,condition);
}
static inline HRESULT IUIAutomation3_get_ControlViewCondition(IUIAutomation3* This,IUIAutomationCondition **condition) {
    return This->lpVtbl->get_ControlViewCondition(This,condition);
}
static inline HRESULT IUIAutomation3_get_ContentViewCondition(IUIAutomation3* This,IUIAutomationCondition **condition) {
    return This->lpVtbl->get_ContentViewCondition(This,condition);
}
static inline HRESULT IUIAutomation3_CreateCacheRequest(IUIAutomation3* This,IUIAutomationCacheRequest **cacheRequest) {
    return This->lpVtbl->CreateCacheRequest(This,cacheRequest);
}
static inline HRESULT IUIAutomation3_CreateTrueCondition(IUIAutomation3* This,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateTrueCondition(This,newCondition);
}
static inline HRESULT IUIAutomation3_CreateFalseCondition(IUIAutomation3* This,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateFalseCondition(This,newCondition);
}
static inline HRESULT IUIAutomation3_CreatePropertyCondition(IUIAutomation3* This,PROPERTYID propertyId,VARIANT value,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreatePropertyCondition(This,propertyId,value,newCondition);
}
static 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 inline HRESULT IUIAutomation3_CreateAndCondition(IUIAutomation3* This,IUIAutomationCondition *condition1,IUIAutomationCondition *condition2,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateAndCondition(This,condition1,condition2,newCondition);
}
static inline HRESULT IUIAutomation3_CreateAndConditionFromArray(IUIAutomation3* This,SAFEARRAY *conditions,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateAndConditionFromArray(This,conditions,newCondition);
}
static inline HRESULT IUIAutomation3_CreateAndConditionFromNativeArray(IUIAutomation3* This,IUIAutomationCondition **conditions,int conditionCount,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateAndConditionFromNativeArray(This,conditions,conditionCount,newCondition);
}
static inline HRESULT IUIAutomation3_CreateOrCondition(IUIAutomation3* This,IUIAutomationCondition *condition1,IUIAutomationCondition *condition2,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateOrCondition(This,condition1,condition2,newCondition);
}
static inline HRESULT IUIAutomation3_CreateOrConditionFromArray(IUIAutomation3* This,SAFEARRAY *conditions,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateOrConditionFromArray(This,conditions,newCondition);
}
static inline HRESULT IUIAutomation3_CreateOrConditionFromNativeArray(IUIAutomation3* This,IUIAutomationCondition **conditions,int conditionCount,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateOrConditionFromNativeArray(This,conditions,conditionCount,newCondition);
}
static inline HRESULT IUIAutomation3_CreateNotCondition(IUIAutomation3* This,IUIAutomationCondition *condition,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateNotCondition(This,condition,newCondition);
}
static 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 inline HRESULT IUIAutomation3_RemoveAutomationEventHandler(IUIAutomation3* This,EVENTID eventId,IUIAutomationElement *element,IUIAutomationEventHandler *handler) {
    return This->lpVtbl->RemoveAutomationEventHandler(This,eventId,element,handler);
}
static 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 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 inline HRESULT IUIAutomation3_RemovePropertyChangedEventHandler(IUIAutomation3* This,IUIAutomationElement *element,IUIAutomationPropertyChangedEventHandler *handler) {
    return This->lpVtbl->RemovePropertyChangedEventHandler(This,element,handler);
}
static 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 inline HRESULT IUIAutomation3_RemoveStructureChangedEventHandler(IUIAutomation3* This,IUIAutomationElement *element,IUIAutomationStructureChangedEventHandler *handler) {
    return This->lpVtbl->RemoveStructureChangedEventHandler(This,element,handler);
}
static inline HRESULT IUIAutomation3_AddFocusChangedEventHandler(IUIAutomation3* This,IUIAutomationCacheRequest *cacheRequest,IUIAutomationFocusChangedEventHandler *handler) {
    return This->lpVtbl->AddFocusChangedEventHandler(This,cacheRequest,handler);
}
static inline HRESULT IUIAutomation3_RemoveFocusChangedEventHandler(IUIAutomation3* This,IUIAutomationFocusChangedEventHandler *handler) {
    return This->lpVtbl->RemoveFocusChangedEventHandler(This,handler);
}
static inline HRESULT IUIAutomation3_RemoveAllEventHandlers(IUIAutomation3* This) {
    return This->lpVtbl->RemoveAllEventHandlers(This);
}
static inline HRESULT IUIAutomation3_IntNativeArrayToSafeArray(IUIAutomation3* This,int *array,int arrayCount,SAFEARRAY **safeArray) {
    return This->lpVtbl->IntNativeArrayToSafeArray(This,array,arrayCount,safeArray);
}
static inline HRESULT IUIAutomation3_IntSafeArrayToNativeArray(IUIAutomation3* This,SAFEARRAY *intArray,int **array,int *arrayCount) {
    return This->lpVtbl->IntSafeArrayToNativeArray(This,intArray,array,arrayCount);
}
static inline HRESULT IUIAutomation3_RectToVariant(IUIAutomation3* This,RECT rc,VARIANT *var) {
    return This->lpVtbl->RectToVariant(This,rc,var);
}
static inline HRESULT IUIAutomation3_VariantToRect(IUIAutomation3* This,VARIANT var,RECT *rc) {
    return This->lpVtbl->VariantToRect(This,var,rc);
}
static inline HRESULT IUIAutomation3_SafeArrayToRectNativeArray(IUIAutomation3* This,SAFEARRAY *rects,RECT **rectArray,int *rectArrayCount) {
    return This->lpVtbl->SafeArrayToRectNativeArray(This,rects,rectArray,rectArrayCount);
}
static inline HRESULT IUIAutomation3_CreateProxyFactoryEntry(IUIAutomation3* This,IUIAutomationProxyFactory *factory,IUIAutomationProxyFactoryEntry **factoryEntry) {
    return This->lpVtbl->CreateProxyFactoryEntry(This,factory,factoryEntry);
}
static inline HRESULT IUIAutomation3_get_ProxyFactoryMapping(IUIAutomation3* This,IUIAutomationProxyFactoryMapping **factoryMapping) {
    return This->lpVtbl->get_ProxyFactoryMapping(This,factoryMapping);
}
static inline HRESULT IUIAutomation3_GetPropertyProgrammaticName(IUIAutomation3* This,PROPERTYID property,BSTR *name) {
    return This->lpVtbl->GetPropertyProgrammaticName(This,property,name);
}
static inline HRESULT IUIAutomation3_GetPatternProgrammaticName(IUIAutomation3* This,PATTERNID pattern,BSTR *name) {
    return This->lpVtbl->GetPatternProgrammaticName(This,pattern,name);
}
static inline HRESULT IUIAutomation3_PollForPotentialSupportedPatterns(IUIAutomation3* This,IUIAutomationElement *pElement,SAFEARRAY **patternIds,SAFEARRAY **patternNames) {
    return This->lpVtbl->PollForPotentialSupportedPatterns(This,pElement,patternIds,patternNames);
}
static inline HRESULT IUIAutomation3_PollForPotentialSupportedProperties(IUIAutomation3* This,IUIAutomationElement *pElement,SAFEARRAY **propertyIds,SAFEARRAY **propertyNames) {
    return This->lpVtbl->PollForPotentialSupportedProperties(This,pElement,propertyIds,propertyNames);
}
static inline HRESULT IUIAutomation3_CheckNotSupported(IUIAutomation3* This,VARIANT value,WINBOOL *isNotSupported) {
    return This->lpVtbl->CheckNotSupported(This,value,isNotSupported);
}
static inline HRESULT IUIAutomation3_get_ReservedNotSupportedValue(IUIAutomation3* This,IUnknown **notSupportedValue) {
    return This->lpVtbl->get_ReservedNotSupportedValue(This,notSupportedValue);
}
static inline HRESULT IUIAutomation3_get_ReservedMixedAttributeValue(IUIAutomation3* This,IUnknown **mixedAttributeValue) {
    return This->lpVtbl->get_ReservedMixedAttributeValue(This,mixedAttributeValue);
}
static inline HRESULT IUIAutomation3_ElementFromIAccessible(IUIAutomation3* This,IAccessible *accessible,int childId,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromIAccessible(This,accessible,childId,element);
}
static 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 inline HRESULT IUIAutomation3_get_AutoSetFocus(IUIAutomation3* This,WINBOOL *autoSetFocus) {
    return This->lpVtbl->get_AutoSetFocus(This,autoSetFocus);
}
static inline HRESULT IUIAutomation3_put_AutoSetFocus(IUIAutomation3* This,WINBOOL autoSetFocus) {
    return This->lpVtbl->put_AutoSetFocus(This,autoSetFocus);
}
static inline HRESULT IUIAutomation3_get_ConnectionTimeout(IUIAutomation3* This,DWORD *timeout) {
    return This->lpVtbl->get_ConnectionTimeout(This,timeout);
}
static inline HRESULT IUIAutomation3_put_ConnectionTimeout(IUIAutomation3* This,DWORD timeout) {
    return This->lpVtbl->put_ConnectionTimeout(This,timeout);
}
static inline HRESULT IUIAutomation3_get_TransactionTimeout(IUIAutomation3* This,DWORD *timeout) {
    return This->lpVtbl->get_TransactionTimeout(This,timeout);
}
static inline HRESULT IUIAutomation3_put_TransactionTimeout(IUIAutomation3* This,DWORD timeout) {
    return This->lpVtbl->put_TransactionTimeout(This,timeout);
}
/*** IUIAutomation3 methods ***/
static 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 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 inline HRESULT IUIAutomation4_QueryInterface(IUIAutomation4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomation4_AddRef(IUIAutomation4* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomation4_Release(IUIAutomation4* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomation methods ***/
static inline HRESULT IUIAutomation4_CompareElements(IUIAutomation4* This,IUIAutomationElement *el1,IUIAutomationElement *el2,WINBOOL *areSame) {
    return This->lpVtbl->CompareElements(This,el1,el2,areSame);
}
static inline HRESULT IUIAutomation4_CompareRuntimeIds(IUIAutomation4* This,SAFEARRAY *runtimeId1,SAFEARRAY *runtimeId2,WINBOOL *areSame) {
    return This->lpVtbl->CompareRuntimeIds(This,runtimeId1,runtimeId2,areSame);
}
static inline HRESULT IUIAutomation4_GetRootElement(IUIAutomation4* This,IUIAutomationElement **root) {
    return This->lpVtbl->GetRootElement(This,root);
}
static inline HRESULT IUIAutomation4_ElementFromHandle(IUIAutomation4* This,UIA_HWND hwnd,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromHandle(This,hwnd,element);
}
static inline HRESULT IUIAutomation4_ElementFromPoint(IUIAutomation4* This,POINT pt,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromPoint(This,pt,element);
}
static inline HRESULT IUIAutomation4_GetFocusedElement(IUIAutomation4* This,IUIAutomationElement **element) {
    return This->lpVtbl->GetFocusedElement(This,element);
}
static inline HRESULT IUIAutomation4_GetRootElementBuildCache(IUIAutomation4* This,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **root) {
    return This->lpVtbl->GetRootElementBuildCache(This,cacheRequest,root);
}
static inline HRESULT IUIAutomation4_ElementFromHandleBuildCache(IUIAutomation4* This,UIA_HWND hwnd,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromHandleBuildCache(This,hwnd,cacheRequest,element);
}
static inline HRESULT IUIAutomation4_ElementFromPointBuildCache(IUIAutomation4* This,POINT pt,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromPointBuildCache(This,pt,cacheRequest,element);
}
static inline HRESULT IUIAutomation4_GetFocusedElementBuildCache(IUIAutomation4* This,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **element) {
    return This->lpVtbl->GetFocusedElementBuildCache(This,cacheRequest,element);
}
static inline HRESULT IUIAutomation4_CreateTreeWalker(IUIAutomation4* This,IUIAutomationCondition *pCondition,IUIAutomationTreeWalker **walker) {
    return This->lpVtbl->CreateTreeWalker(This,pCondition,walker);
}
static inline HRESULT IUIAutomation4_get_ControlViewWalker(IUIAutomation4* This,IUIAutomationTreeWalker **walker) {
    return This->lpVtbl->get_ControlViewWalker(This,walker);
}
static inline HRESULT IUIAutomation4_get_ContentViewWalker(IUIAutomation4* This,IUIAutomationTreeWalker **walker) {
    return This->lpVtbl->get_ContentViewWalker(This,walker);
}
static inline HRESULT IUIAutomation4_get_RawViewWalker(IUIAutomation4* This,IUIAutomationTreeWalker **walker) {
    return This->lpVtbl->get_RawViewWalker(This,walker);
}
static inline HRESULT IUIAutomation4_get_RawViewCondition(IUIAutomation4* This,IUIAutomationCondition **condition) {
    return This->lpVtbl->get_RawViewCondition(This,condition);
}
static inline HRESULT IUIAutomation4_get_ControlViewCondition(IUIAutomation4* This,IUIAutomationCondition **condition) {
    return This->lpVtbl->get_ControlViewCondition(This,condition);
}
static inline HRESULT IUIAutomation4_get_ContentViewCondition(IUIAutomation4* This,IUIAutomationCondition **condition) {
    return This->lpVtbl->get_ContentViewCondition(This,condition);
}
static inline HRESULT IUIAutomation4_CreateCacheRequest(IUIAutomation4* This,IUIAutomationCacheRequest **cacheRequest) {
    return This->lpVtbl->CreateCacheRequest(This,cacheRequest);
}
static inline HRESULT IUIAutomation4_CreateTrueCondition(IUIAutomation4* This,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateTrueCondition(This,newCondition);
}
static inline HRESULT IUIAutomation4_CreateFalseCondition(IUIAutomation4* This,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateFalseCondition(This,newCondition);
}
static inline HRESULT IUIAutomation4_CreatePropertyCondition(IUIAutomation4* This,PROPERTYID propertyId,VARIANT value,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreatePropertyCondition(This,propertyId,value,newCondition);
}
static 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 inline HRESULT IUIAutomation4_CreateAndCondition(IUIAutomation4* This,IUIAutomationCondition *condition1,IUIAutomationCondition *condition2,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateAndCondition(This,condition1,condition2,newCondition);
}
static inline HRESULT IUIAutomation4_CreateAndConditionFromArray(IUIAutomation4* This,SAFEARRAY *conditions,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateAndConditionFromArray(This,conditions,newCondition);
}
static inline HRESULT IUIAutomation4_CreateAndConditionFromNativeArray(IUIAutomation4* This,IUIAutomationCondition **conditions,int conditionCount,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateAndConditionFromNativeArray(This,conditions,conditionCount,newCondition);
}
static inline HRESULT IUIAutomation4_CreateOrCondition(IUIAutomation4* This,IUIAutomationCondition *condition1,IUIAutomationCondition *condition2,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateOrCondition(This,condition1,condition2,newCondition);
}
static inline HRESULT IUIAutomation4_CreateOrConditionFromArray(IUIAutomation4* This,SAFEARRAY *conditions,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateOrConditionFromArray(This,conditions,newCondition);
}
static inline HRESULT IUIAutomation4_CreateOrConditionFromNativeArray(IUIAutomation4* This,IUIAutomationCondition **conditions,int conditionCount,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateOrConditionFromNativeArray(This,conditions,conditionCount,newCondition);
}
static inline HRESULT IUIAutomation4_CreateNotCondition(IUIAutomation4* This,IUIAutomationCondition *condition,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateNotCondition(This,condition,newCondition);
}
static 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 inline HRESULT IUIAutomation4_RemoveAutomationEventHandler(IUIAutomation4* This,EVENTID eventId,IUIAutomationElement *element,IUIAutomationEventHandler *handler) {
    return This->lpVtbl->RemoveAutomationEventHandler(This,eventId,element,handler);
}
static 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 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 inline HRESULT IUIAutomation4_RemovePropertyChangedEventHandler(IUIAutomation4* This,IUIAutomationElement *element,IUIAutomationPropertyChangedEventHandler *handler) {
    return This->lpVtbl->RemovePropertyChangedEventHandler(This,element,handler);
}
static 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 inline HRESULT IUIAutomation4_RemoveStructureChangedEventHandler(IUIAutomation4* This,IUIAutomationElement *element,IUIAutomationStructureChangedEventHandler *handler) {
    return This->lpVtbl->RemoveStructureChangedEventHandler(This,element,handler);
}
static inline HRESULT IUIAutomation4_AddFocusChangedEventHandler(IUIAutomation4* This,IUIAutomationCacheRequest *cacheRequest,IUIAutomationFocusChangedEventHandler *handler) {
    return This->lpVtbl->AddFocusChangedEventHandler(This,cacheRequest,handler);
}
static inline HRESULT IUIAutomation4_RemoveFocusChangedEventHandler(IUIAutomation4* This,IUIAutomationFocusChangedEventHandler *handler) {
    return This->lpVtbl->RemoveFocusChangedEventHandler(This,handler);
}
static inline HRESULT IUIAutomation4_RemoveAllEventHandlers(IUIAutomation4* This) {
    return This->lpVtbl->RemoveAllEventHandlers(This);
}
static inline HRESULT IUIAutomation4_IntNativeArrayToSafeArray(IUIAutomation4* This,int *array,int arrayCount,SAFEARRAY **safeArray) {
    return This->lpVtbl->IntNativeArrayToSafeArray(This,array,arrayCount,safeArray);
}
static inline HRESULT IUIAutomation4_IntSafeArrayToNativeArray(IUIAutomation4* This,SAFEARRAY *intArray,int **array,int *arrayCount) {
    return This->lpVtbl->IntSafeArrayToNativeArray(This,intArray,array,arrayCount);
}
static inline HRESULT IUIAutomation4_RectToVariant(IUIAutomation4* This,RECT rc,VARIANT *var) {
    return This->lpVtbl->RectToVariant(This,rc,var);
}
static inline HRESULT IUIAutomation4_VariantToRect(IUIAutomation4* This,VARIANT var,RECT *rc) {
    return This->lpVtbl->VariantToRect(This,var,rc);
}
static inline HRESULT IUIAutomation4_SafeArrayToRectNativeArray(IUIAutomation4* This,SAFEARRAY *rects,RECT **rectArray,int *rectArrayCount) {
    return This->lpVtbl->SafeArrayToRectNativeArray(This,rects,rectArray,rectArrayCount);
}
static inline HRESULT IUIAutomation4_CreateProxyFactoryEntry(IUIAutomation4* This,IUIAutomationProxyFactory *factory,IUIAutomationProxyFactoryEntry **factoryEntry) {
    return This->lpVtbl->CreateProxyFactoryEntry(This,factory,factoryEntry);
}
static inline HRESULT IUIAutomation4_get_ProxyFactoryMapping(IUIAutomation4* This,IUIAutomationProxyFactoryMapping **factoryMapping) {
    return This->lpVtbl->get_ProxyFactoryMapping(This,factoryMapping);
}
static inline HRESULT IUIAutomation4_GetPropertyProgrammaticName(IUIAutomation4* This,PROPERTYID property,BSTR *name) {
    return This->lpVtbl->GetPropertyProgrammaticName(This,property,name);
}
static inline HRESULT IUIAutomation4_GetPatternProgrammaticName(IUIAutomation4* This,PATTERNID pattern,BSTR *name) {
    return This->lpVtbl->GetPatternProgrammaticName(This,pattern,name);
}
static inline HRESULT IUIAutomation4_PollForPotentialSupportedPatterns(IUIAutomation4* This,IUIAutomationElement *pElement,SAFEARRAY **patternIds,SAFEARRAY **patternNames) {
    return This->lpVtbl->PollForPotentialSupportedPatterns(This,pElement,patternIds,patternNames);
}
static inline HRESULT IUIAutomation4_PollForPotentialSupportedProperties(IUIAutomation4* This,IUIAutomationElement *pElement,SAFEARRAY **propertyIds,SAFEARRAY **propertyNames) {
    return This->lpVtbl->PollForPotentialSupportedProperties(This,pElement,propertyIds,propertyNames);
}
static inline HRESULT IUIAutomation4_CheckNotSupported(IUIAutomation4* This,VARIANT value,WINBOOL *isNotSupported) {
    return This->lpVtbl->CheckNotSupported(This,value,isNotSupported);
}
static inline HRESULT IUIAutomation4_get_ReservedNotSupportedValue(IUIAutomation4* This,IUnknown **notSupportedValue) {
    return This->lpVtbl->get_ReservedNotSupportedValue(This,notSupportedValue);
}
static inline HRESULT IUIAutomation4_get_ReservedMixedAttributeValue(IUIAutomation4* This,IUnknown **mixedAttributeValue) {
    return This->lpVtbl->get_ReservedMixedAttributeValue(This,mixedAttributeValue);
}
static inline HRESULT IUIAutomation4_ElementFromIAccessible(IUIAutomation4* This,IAccessible *accessible,int childId,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromIAccessible(This,accessible,childId,element);
}
static 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 inline HRESULT IUIAutomation4_get_AutoSetFocus(IUIAutomation4* This,WINBOOL *autoSetFocus) {
    return This->lpVtbl->get_AutoSetFocus(This,autoSetFocus);
}
static inline HRESULT IUIAutomation4_put_AutoSetFocus(IUIAutomation4* This,WINBOOL autoSetFocus) {
    return This->lpVtbl->put_AutoSetFocus(This,autoSetFocus);
}
static inline HRESULT IUIAutomation4_get_ConnectionTimeout(IUIAutomation4* This,DWORD *timeout) {
    return This->lpVtbl->get_ConnectionTimeout(This,timeout);
}
static inline HRESULT IUIAutomation4_put_ConnectionTimeout(IUIAutomation4* This,DWORD timeout) {
    return This->lpVtbl->put_ConnectionTimeout(This,timeout);
}
static inline HRESULT IUIAutomation4_get_TransactionTimeout(IUIAutomation4* This,DWORD *timeout) {
    return This->lpVtbl->get_TransactionTimeout(This,timeout);
}
static inline HRESULT IUIAutomation4_put_TransactionTimeout(IUIAutomation4* This,DWORD timeout) {
    return This->lpVtbl->put_TransactionTimeout(This,timeout);
}
/*** IUIAutomation3 methods ***/
static 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 inline HRESULT IUIAutomation4_RemoveTextEditTextChangedEventHandler(IUIAutomation4* This,IUIAutomationElement *element,IUIAutomationTextEditTextChangedEventHandler *handler) {
    return This->lpVtbl->RemoveTextEditTextChangedEventHandler(This,element,handler);
}
/*** IUIAutomation4 methods ***/
static 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 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 inline HRESULT IUIAutomation5_QueryInterface(IUIAutomation5* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomation5_AddRef(IUIAutomation5* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomation5_Release(IUIAutomation5* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomation methods ***/
static inline HRESULT IUIAutomation5_CompareElements(IUIAutomation5* This,IUIAutomationElement *el1,IUIAutomationElement *el2,WINBOOL *areSame) {
    return This->lpVtbl->CompareElements(This,el1,el2,areSame);
}
static inline HRESULT IUIAutomation5_CompareRuntimeIds(IUIAutomation5* This,SAFEARRAY *runtimeId1,SAFEARRAY *runtimeId2,WINBOOL *areSame) {
    return This->lpVtbl->CompareRuntimeIds(This,runtimeId1,runtimeId2,areSame);
}
static inline HRESULT IUIAutomation5_GetRootElement(IUIAutomation5* This,IUIAutomationElement **root) {
    return This->lpVtbl->GetRootElement(This,root);
}
static inline HRESULT IUIAutomation5_ElementFromHandle(IUIAutomation5* This,UIA_HWND hwnd,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromHandle(This,hwnd,element);
}
static inline HRESULT IUIAutomation5_ElementFromPoint(IUIAutomation5* This,POINT pt,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromPoint(This,pt,element);
}
static inline HRESULT IUIAutomation5_GetFocusedElement(IUIAutomation5* This,IUIAutomationElement **element) {
    return This->lpVtbl->GetFocusedElement(This,element);
}
static inline HRESULT IUIAutomation5_GetRootElementBuildCache(IUIAutomation5* This,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **root) {
    return This->lpVtbl->GetRootElementBuildCache(This,cacheRequest,root);
}
static inline HRESULT IUIAutomation5_ElementFromHandleBuildCache(IUIAutomation5* This,UIA_HWND hwnd,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromHandleBuildCache(This,hwnd,cacheRequest,element);
}
static inline HRESULT IUIAutomation5_ElementFromPointBuildCache(IUIAutomation5* This,POINT pt,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromPointBuildCache(This,pt,cacheRequest,element);
}
static inline HRESULT IUIAutomation5_GetFocusedElementBuildCache(IUIAutomation5* This,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **element) {
    return This->lpVtbl->GetFocusedElementBuildCache(This,cacheRequest,element);
}
static inline HRESULT IUIAutomation5_CreateTreeWalker(IUIAutomation5* This,IUIAutomationCondition *pCondition,IUIAutomationTreeWalker **walker) {
    return This->lpVtbl->CreateTreeWalker(This,pCondition,walker);
}
static inline HRESULT IUIAutomation5_get_ControlViewWalker(IUIAutomation5* This,IUIAutomationTreeWalker **walker) {
    return This->lpVtbl->get_ControlViewWalker(This,walker);
}
static inline HRESULT IUIAutomation5_get_ContentViewWalker(IUIAutomation5* This,IUIAutomationTreeWalker **walker) {
    return This->lpVtbl->get_ContentViewWalker(This,walker);
}
static inline HRESULT IUIAutomation5_get_RawViewWalker(IUIAutomation5* This,IUIAutomationTreeWalker **walker) {
    return This->lpVtbl->get_RawViewWalker(This,walker);
}
static inline HRESULT IUIAutomation5_get_RawViewCondition(IUIAutomation5* This,IUIAutomationCondition **condition) {
    return This->lpVtbl->get_RawViewCondition(This,condition);
}
static inline HRESULT IUIAutomation5_get_ControlViewCondition(IUIAutomation5* This,IUIAutomationCondition **condition) {
    return This->lpVtbl->get_ControlViewCondition(This,condition);
}
static inline HRESULT IUIAutomation5_get_ContentViewCondition(IUIAutomation5* This,IUIAutomationCondition **condition) {
    return This->lpVtbl->get_ContentViewCondition(This,condition);
}
static inline HRESULT IUIAutomation5_CreateCacheRequest(IUIAutomation5* This,IUIAutomationCacheRequest **cacheRequest) {
    return This->lpVtbl->CreateCacheRequest(This,cacheRequest);
}
static inline HRESULT IUIAutomation5_CreateTrueCondition(IUIAutomation5* This,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateTrueCondition(This,newCondition);
}
static inline HRESULT IUIAutomation5_CreateFalseCondition(IUIAutomation5* This,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateFalseCondition(This,newCondition);
}
static inline HRESULT IUIAutomation5_CreatePropertyCondition(IUIAutomation5* This,PROPERTYID propertyId,VARIANT value,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreatePropertyCondition(This,propertyId,value,newCondition);
}
static 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 inline HRESULT IUIAutomation5_CreateAndCondition(IUIAutomation5* This,IUIAutomationCondition *condition1,IUIAutomationCondition *condition2,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateAndCondition(This,condition1,condition2,newCondition);
}
static inline HRESULT IUIAutomation5_CreateAndConditionFromArray(IUIAutomation5* This,SAFEARRAY *conditions,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateAndConditionFromArray(This,conditions,newCondition);
}
static inline HRESULT IUIAutomation5_CreateAndConditionFromNativeArray(IUIAutomation5* This,IUIAutomationCondition **conditions,int conditionCount,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateAndConditionFromNativeArray(This,conditions,conditionCount,newCondition);
}
static inline HRESULT IUIAutomation5_CreateOrCondition(IUIAutomation5* This,IUIAutomationCondition *condition1,IUIAutomationCondition *condition2,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateOrCondition(This,condition1,condition2,newCondition);
}
static inline HRESULT IUIAutomation5_CreateOrConditionFromArray(IUIAutomation5* This,SAFEARRAY *conditions,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateOrConditionFromArray(This,conditions,newCondition);
}
static inline HRESULT IUIAutomation5_CreateOrConditionFromNativeArray(IUIAutomation5* This,IUIAutomationCondition **conditions,int conditionCount,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateOrConditionFromNativeArray(This,conditions,conditionCount,newCondition);
}
static inline HRESULT IUIAutomation5_CreateNotCondition(IUIAutomation5* This,IUIAutomationCondition *condition,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateNotCondition(This,condition,newCondition);
}
static 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 inline HRESULT IUIAutomation5_RemoveAutomationEventHandler(IUIAutomation5* This,EVENTID eventId,IUIAutomationElement *element,IUIAutomationEventHandler *handler) {
    return This->lpVtbl->RemoveAutomationEventHandler(This,eventId,element,handler);
}
static 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 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 inline HRESULT IUIAutomation5_RemovePropertyChangedEventHandler(IUIAutomation5* This,IUIAutomationElement *element,IUIAutomationPropertyChangedEventHandler *handler) {
    return This->lpVtbl->RemovePropertyChangedEventHandler(This,element,handler);
}
static 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 inline HRESULT IUIAutomation5_RemoveStructureChangedEventHandler(IUIAutomation5* This,IUIAutomationElement *element,IUIAutomationStructureChangedEventHandler *handler) {
    return This->lpVtbl->RemoveStructureChangedEventHandler(This,element,handler);
}
static inline HRESULT IUIAutomation5_AddFocusChangedEventHandler(IUIAutomation5* This,IUIAutomationCacheRequest *cacheRequest,IUIAutomationFocusChangedEventHandler *handler) {
    return This->lpVtbl->AddFocusChangedEventHandler(This,cacheRequest,handler);
}
static inline HRESULT IUIAutomation5_RemoveFocusChangedEventHandler(IUIAutomation5* This,IUIAutomationFocusChangedEventHandler *handler) {
    return This->lpVtbl->RemoveFocusChangedEventHandler(This,handler);
}
static inline HRESULT IUIAutomation5_RemoveAllEventHandlers(IUIAutomation5* This) {
    return This->lpVtbl->RemoveAllEventHandlers(This);
}
static inline HRESULT IUIAutomation5_IntNativeArrayToSafeArray(IUIAutomation5* This,int *array,int arrayCount,SAFEARRAY **safeArray) {
    return This->lpVtbl->IntNativeArrayToSafeArray(This,array,arrayCount,safeArray);
}
static inline HRESULT IUIAutomation5_IntSafeArrayToNativeArray(IUIAutomation5* This,SAFEARRAY *intArray,int **array,int *arrayCount) {
    return This->lpVtbl->IntSafeArrayToNativeArray(This,intArray,array,arrayCount);
}
static inline HRESULT IUIAutomation5_RectToVariant(IUIAutomation5* This,RECT rc,VARIANT *var) {
    return This->lpVtbl->RectToVariant(This,rc,var);
}
static inline HRESULT IUIAutomation5_VariantToRect(IUIAutomation5* This,VARIANT var,RECT *rc) {
    return This->lpVtbl->VariantToRect(This,var,rc);
}
static inline HRESULT IUIAutomation5_SafeArrayToRectNativeArray(IUIAutomation5* This,SAFEARRAY *rects,RECT **rectArray,int *rectArrayCount) {
    return This->lpVtbl->SafeArrayToRectNativeArray(This,rects,rectArray,rectArrayCount);
}
static inline HRESULT IUIAutomation5_CreateProxyFactoryEntry(IUIAutomation5* This,IUIAutomationProxyFactory *factory,IUIAutomationProxyFactoryEntry **factoryEntry) {
    return This->lpVtbl->CreateProxyFactoryEntry(This,factory,factoryEntry);
}
static inline HRESULT IUIAutomation5_get_ProxyFactoryMapping(IUIAutomation5* This,IUIAutomationProxyFactoryMapping **factoryMapping) {
    return This->lpVtbl->get_ProxyFactoryMapping(This,factoryMapping);
}
static inline HRESULT IUIAutomation5_GetPropertyProgrammaticName(IUIAutomation5* This,PROPERTYID property,BSTR *name) {
    return This->lpVtbl->GetPropertyProgrammaticName(This,property,name);
}
static inline HRESULT IUIAutomation5_GetPatternProgrammaticName(IUIAutomation5* This,PATTERNID pattern,BSTR *name) {
    return This->lpVtbl->GetPatternProgrammaticName(This,pattern,name);
}
static inline HRESULT IUIAutomation5_PollForPotentialSupportedPatterns(IUIAutomation5* This,IUIAutomationElement *pElement,SAFEARRAY **patternIds,SAFEARRAY **patternNames) {
    return This->lpVtbl->PollForPotentialSupportedPatterns(This,pElement,patternIds,patternNames);
}
static inline HRESULT IUIAutomation5_PollForPotentialSupportedProperties(IUIAutomation5* This,IUIAutomationElement *pElement,SAFEARRAY **propertyIds,SAFEARRAY **propertyNames) {
    return This->lpVtbl->PollForPotentialSupportedProperties(This,pElement,propertyIds,propertyNames);
}
static inline HRESULT IUIAutomation5_CheckNotSupported(IUIAutomation5* This,VARIANT value,WINBOOL *isNotSupported) {
    return This->lpVtbl->CheckNotSupported(This,value,isNotSupported);
}
static inline HRESULT IUIAutomation5_get_ReservedNotSupportedValue(IUIAutomation5* This,IUnknown **notSupportedValue) {
    return This->lpVtbl->get_ReservedNotSupportedValue(This,notSupportedValue);
}
static inline HRESULT IUIAutomation5_get_ReservedMixedAttributeValue(IUIAutomation5* This,IUnknown **mixedAttributeValue) {
    return This->lpVtbl->get_ReservedMixedAttributeValue(This,mixedAttributeValue);
}
static inline HRESULT IUIAutomation5_ElementFromIAccessible(IUIAutomation5* This,IAccessible *accessible,int childId,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromIAccessible(This,accessible,childId,element);
}
static 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 inline HRESULT IUIAutomation5_get_AutoSetFocus(IUIAutomation5* This,WINBOOL *autoSetFocus) {
    return This->lpVtbl->get_AutoSetFocus(This,autoSetFocus);
}
static inline HRESULT IUIAutomation5_put_AutoSetFocus(IUIAutomation5* This,WINBOOL autoSetFocus) {
    return This->lpVtbl->put_AutoSetFocus(This,autoSetFocus);
}
static inline HRESULT IUIAutomation5_get_ConnectionTimeout(IUIAutomation5* This,DWORD *timeout) {
    return This->lpVtbl->get_ConnectionTimeout(This,timeout);
}
static inline HRESULT IUIAutomation5_put_ConnectionTimeout(IUIAutomation5* This,DWORD timeout) {
    return This->lpVtbl->put_ConnectionTimeout(This,timeout);
}
static inline HRESULT IUIAutomation5_get_TransactionTimeout(IUIAutomation5* This,DWORD *timeout) {
    return This->lpVtbl->get_TransactionTimeout(This,timeout);
}
static inline HRESULT IUIAutomation5_put_TransactionTimeout(IUIAutomation5* This,DWORD timeout) {
    return This->lpVtbl->put_TransactionTimeout(This,timeout);
}
/*** IUIAutomation3 methods ***/
static 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 inline HRESULT IUIAutomation5_RemoveTextEditTextChangedEventHandler(IUIAutomation5* This,IUIAutomationElement *element,IUIAutomationTextEditTextChangedEventHandler *handler) {
    return This->lpVtbl->RemoveTextEditTextChangedEventHandler(This,element,handler);
}
/*** IUIAutomation4 methods ***/
static 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 inline HRESULT IUIAutomation5_RemoveChangesEventHandler(IUIAutomation5* This,IUIAutomationElement *element,IUIAutomationChangesEventHandler *handler) {
    return This->lpVtbl->RemoveChangesEventHandler(This,element,handler);
}
/*** IUIAutomation5 methods ***/
static 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 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 inline HRESULT IUIAutomation6_QueryInterface(IUIAutomation6* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IUIAutomation6_AddRef(IUIAutomation6* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IUIAutomation6_Release(IUIAutomation6* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAutomation methods ***/
static inline HRESULT IUIAutomation6_CompareElements(IUIAutomation6* This,IUIAutomationElement *el1,IUIAutomationElement *el2,WINBOOL *areSame) {
    return This->lpVtbl->CompareElements(This,el1,el2,areSame);
}
static inline HRESULT IUIAutomation6_CompareRuntimeIds(IUIAutomation6* This,SAFEARRAY *runtimeId1,SAFEARRAY *runtimeId2,WINBOOL *areSame) {
    return This->lpVtbl->CompareRuntimeIds(This,runtimeId1,runtimeId2,areSame);
}
static inline HRESULT IUIAutomation6_GetRootElement(IUIAutomation6* This,IUIAutomationElement **root) {
    return This->lpVtbl->GetRootElement(This,root);
}
static inline HRESULT IUIAutomation6_ElementFromHandle(IUIAutomation6* This,UIA_HWND hwnd,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromHandle(This,hwnd,element);
}
static inline HRESULT IUIAutomation6_ElementFromPoint(IUIAutomation6* This,POINT pt,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromPoint(This,pt,element);
}
static inline HRESULT IUIAutomation6_GetFocusedElement(IUIAutomation6* This,IUIAutomationElement **element) {
    return This->lpVtbl->GetFocusedElement(This,element);
}
static inline HRESULT IUIAutomation6_GetRootElementBuildCache(IUIAutomation6* This,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **root) {
    return This->lpVtbl->GetRootElementBuildCache(This,cacheRequest,root);
}
static inline HRESULT IUIAutomation6_ElementFromHandleBuildCache(IUIAutomation6* This,UIA_HWND hwnd,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromHandleBuildCache(This,hwnd,cacheRequest,element);
}
static inline HRESULT IUIAutomation6_ElementFromPointBuildCache(IUIAutomation6* This,POINT pt,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromPointBuildCache(This,pt,cacheRequest,element);
}
static inline HRESULT IUIAutomation6_GetFocusedElementBuildCache(IUIAutomation6* This,IUIAutomationCacheRequest *cacheRequest,IUIAutomationElement **element) {
    return This->lpVtbl->GetFocusedElementBuildCache(This,cacheRequest,element);
}
static inline HRESULT IUIAutomation6_CreateTreeWalker(IUIAutomation6* This,IUIAutomationCondition *pCondition,IUIAutomationTreeWalker **walker) {
    return This->lpVtbl->CreateTreeWalker(This,pCondition,walker);
}
static inline HRESULT IUIAutomation6_get_ControlViewWalker(IUIAutomation6* This,IUIAutomationTreeWalker **walker) {
    return This->lpVtbl->get_ControlViewWalker(This,walker);
}
static inline HRESULT IUIAutomation6_get_ContentViewWalker(IUIAutomation6* This,IUIAutomationTreeWalker **walker) {
    return This->lpVtbl->get_ContentViewWalker(This,walker);
}
static inline HRESULT IUIAutomation6_get_RawViewWalker(IUIAutomation6* This,IUIAutomationTreeWalker **walker) {
    return This->lpVtbl->get_RawViewWalker(This,walker);
}
static inline HRESULT IUIAutomation6_get_RawViewCondition(IUIAutomation6* This,IUIAutomationCondition **condition) {
    return This->lpVtbl->get_RawViewCondition(This,condition);
}
static inline HRESULT IUIAutomation6_get_ControlViewCondition(IUIAutomation6* This,IUIAutomationCondition **condition) {
    return This->lpVtbl->get_ControlViewCondition(This,condition);
}
static inline HRESULT IUIAutomation6_get_ContentViewCondition(IUIAutomation6* This,IUIAutomationCondition **condition) {
    return This->lpVtbl->get_ContentViewCondition(This,condition);
}
static inline HRESULT IUIAutomation6_CreateCacheRequest(IUIAutomation6* This,IUIAutomationCacheRequest **cacheRequest) {
    return This->lpVtbl->CreateCacheRequest(This,cacheRequest);
}
static inline HRESULT IUIAutomation6_CreateTrueCondition(IUIAutomation6* This,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateTrueCondition(This,newCondition);
}
static inline HRESULT IUIAutomation6_CreateFalseCondition(IUIAutomation6* This,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateFalseCondition(This,newCondition);
}
static inline HRESULT IUIAutomation6_CreatePropertyCondition(IUIAutomation6* This,PROPERTYID propertyId,VARIANT value,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreatePropertyCondition(This,propertyId,value,newCondition);
}
static 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 inline HRESULT IUIAutomation6_CreateAndCondition(IUIAutomation6* This,IUIAutomationCondition *condition1,IUIAutomationCondition *condition2,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateAndCondition(This,condition1,condition2,newCondition);
}
static inline HRESULT IUIAutomation6_CreateAndConditionFromArray(IUIAutomation6* This,SAFEARRAY *conditions,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateAndConditionFromArray(This,conditions,newCondition);
}
static inline HRESULT IUIAutomation6_CreateAndConditionFromNativeArray(IUIAutomation6* This,IUIAutomationCondition **conditions,int conditionCount,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateAndConditionFromNativeArray(This,conditions,conditionCount,newCondition);
}
static inline HRESULT IUIAutomation6_CreateOrCondition(IUIAutomation6* This,IUIAutomationCondition *condition1,IUIAutomationCondition *condition2,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateOrCondition(This,condition1,condition2,newCondition);
}
static inline HRESULT IUIAutomation6_CreateOrConditionFromArray(IUIAutomation6* This,SAFEARRAY *conditions,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateOrConditionFromArray(This,conditions,newCondition);
}
static inline HRESULT IUIAutomation6_CreateOrConditionFromNativeArray(IUIAutomation6* This,IUIAutomationCondition **conditions,int conditionCount,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateOrConditionFromNativeArray(This,conditions,conditionCount,newCondition);
}
static inline HRESULT IUIAutomation6_CreateNotCondition(IUIAutomation6* This,IUIAutomationCondition *condition,IUIAutomationCondition **newCondition) {
    return This->lpVtbl->CreateNotCondition(This,condition,newCondition);
}
static 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 inline HRESULT IUIAutomation6_RemoveAutomationEventHandler(IUIAutomation6* This,EVENTID eventId,IUIAutomationElement *element,IUIAutomationEventHandler *handler) {
    return This->lpVtbl->RemoveAutomationEventHandler(This,eventId,element,handler);
}
static 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 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 inline HRESULT IUIAutomation6_RemovePropertyChangedEventHandler(IUIAutomation6* This,IUIAutomationElement *element,IUIAutomationPropertyChangedEventHandler *handler) {
    return This->lpVtbl->RemovePropertyChangedEventHandler(This,element,handler);
}
static 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 inline HRESULT IUIAutomation6_RemoveStructureChangedEventHandler(IUIAutomation6* This,IUIAutomationElement *element,IUIAutomationStructureChangedEventHandler *handler) {
    return This->lpVtbl->RemoveStructureChangedEventHandler(This,element,handler);
}
static inline HRESULT IUIAutomation6_AddFocusChangedEventHandler(IUIAutomation6* This,IUIAutomationCacheRequest *cacheRequest,IUIAutomationFocusChangedEventHandler *handler) {
    return This->lpVtbl->AddFocusChangedEventHandler(This,cacheRequest,handler);
}
static inline HRESULT IUIAutomation6_RemoveFocusChangedEventHandler(IUIAutomation6* This,IUIAutomationFocusChangedEventHandler *handler) {
    return This->lpVtbl->RemoveFocusChangedEventHandler(This,handler);
}
static inline HRESULT IUIAutomation6_RemoveAllEventHandlers(IUIAutomation6* This) {
    return This->lpVtbl->RemoveAllEventHandlers(This);
}
static inline HRESULT IUIAutomation6_IntNativeArrayToSafeArray(IUIAutomation6* This,int *array,int arrayCount,SAFEARRAY **safeArray) {
    return This->lpVtbl->IntNativeArrayToSafeArray(This,array,arrayCount,safeArray);
}
static inline HRESULT IUIAutomation6_IntSafeArrayToNativeArray(IUIAutomation6* This,SAFEARRAY *intArray,int **array,int *arrayCount) {
    return This->lpVtbl->IntSafeArrayToNativeArray(This,intArray,array,arrayCount);
}
static inline HRESULT IUIAutomation6_RectToVariant(IUIAutomation6* This,RECT rc,VARIANT *var) {
    return This->lpVtbl->RectToVariant(This,rc,var);
}
static inline HRESULT IUIAutomation6_VariantToRect(IUIAutomation6* This,VARIANT var,RECT *rc) {
    return This->lpVtbl->VariantToRect(This,var,rc);
}
static inline HRESULT IUIAutomation6_SafeArrayToRectNativeArray(IUIAutomation6* This,SAFEARRAY *rects,RECT **rectArray,int *rectArrayCount) {
    return This->lpVtbl->SafeArrayToRectNativeArray(This,rects,rectArray,rectArrayCount);
}
static inline HRESULT IUIAutomation6_CreateProxyFactoryEntry(IUIAutomation6* This,IUIAutomationProxyFactory *factory,IUIAutomationProxyFactoryEntry **factoryEntry) {
    return This->lpVtbl->CreateProxyFactoryEntry(This,factory,factoryEntry);
}
static inline HRESULT IUIAutomation6_get_ProxyFactoryMapping(IUIAutomation6* This,IUIAutomationProxyFactoryMapping **factoryMapping) {
    return This->lpVtbl->get_ProxyFactoryMapping(This,factoryMapping);
}
static inline HRESULT IUIAutomation6_GetPropertyProgrammaticName(IUIAutomation6* This,PROPERTYID property,BSTR *name) {
    return This->lpVtbl->GetPropertyProgrammaticName(This,property,name);
}
static inline HRESULT IUIAutomation6_GetPatternProgrammaticName(IUIAutomation6* This,PATTERNID pattern,BSTR *name) {
    return This->lpVtbl->GetPatternProgrammaticName(This,pattern,name);
}
static inline HRESULT IUIAutomation6_PollForPotentialSupportedPatterns(IUIAutomation6* This,IUIAutomationElement *pElement,SAFEARRAY **patternIds,SAFEARRAY **patternNames) {
    return This->lpVtbl->PollForPotentialSupportedPatterns(This,pElement,patternIds,patternNames);
}
static inline HRESULT IUIAutomation6_PollForPotentialSupportedProperties(IUIAutomation6* This,IUIAutomationElement *pElement,SAFEARRAY **propertyIds,SAFEARRAY **propertyNames) {
    return This->lpVtbl->PollForPotentialSupportedProperties(This,pElement,propertyIds,propertyNames);
}
static inline HRESULT IUIAutomation6_CheckNotSupported(IUIAutomation6* This,VARIANT value,WINBOOL *isNotSupported) {
    return This->lpVtbl->CheckNotSupported(This,value,isNotSupported);
}
static inline HRESULT IUIAutomation6_get_ReservedNotSupportedValue(IUIAutomation6* This,IUnknown **notSupportedValue) {
    return This->lpVtbl->get_ReservedNotSupportedValue(This,notSupportedValue);
}
static inline HRESULT IUIAutomation6_get_ReservedMixedAttributeValue(IUIAutomation6* This,IUnknown **mixedAttributeValue) {
    return This->lpVtbl->get_ReservedMixedAttributeValue(This,mixedAttributeValue);
}
static inline HRESULT IUIAutomation6_ElementFromIAccessible(IUIAutomation6* This,IAccessible *accessible,int childId,IUIAutomationElement **element) {
    return This->lpVtbl->ElementFromIAccessible(This,accessible,childId,element);
}
static 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 inline HRESULT IUIAutomation6_get_AutoSetFocus(IUIAutomation6* This,WINBOOL *autoSetFocus) {
    return This->lpVtbl->get_AutoSetFocus(This,autoSetFocus);
}
static inline HRESULT IUIAutomation6_put_AutoSetFocus(IUIAutomation6* This,WINBOOL autoSetFocus) {
    return This->lpVtbl->put_AutoSetFocus(This,autoSetFocus);
}
static inline HRESULT IUIAutomation6_get_ConnectionTimeout(IUIAutomation6* This,DWORD *timeout) {
    return This->lpVtbl->get_ConnectionTimeout(This,timeout);
}
static inline HRESULT IUIAutomation6_put_ConnectionTimeout(IUIAutomation6* This,DWORD timeout) {
    return This->lpVtbl->put_ConnectionTimeout(This,timeout);
}
static inline HRESULT IUIAutomation6_get_TransactionTimeout(IUIAutomation6* This,DWORD *timeout) {
    return This->lpVtbl->get_TransactionTimeout(This,timeout);
}
static inline HRESULT IUIAutomation6_put_TransactionTimeout(IUIAutomation6* This,DWORD timeout) {
    return This->lpVtbl->put_TransactionTimeout(This,timeout);
}
/*** IUIAutomation3 methods ***/
static 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 inline HRESULT IUIAutomation6_RemoveTextEditTextChangedEventHandler(IUIAutomation6* This,IUIAutomationElement *element,IUIAutomationTextEditTextChangedEventHandler *handler) {
    return This->lpVtbl->RemoveTextEditTextChangedEventHandler(This,element,handler);
}
/*** IUIAutomation4 methods ***/
static 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 inline HRESULT IUIAutomation6_RemoveChangesEventHandler(IUIAutomation6* This,IUIAutomationElement *element,IUIAutomationChangesEventHandler *handler) {
    return This->lpVtbl->RemoveChangesEventHandler(This,element,handler);
}
/*** IUIAutomation5 methods ***/
static 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 inline HRESULT IUIAutomation6_RemoveNotificationEventHandler(IUIAutomation6* This,IUIAutomationElement *element,IUIAutomationNotificationEventHandler *handler) {
    return This->lpVtbl->RemoveNotificationEventHandler(This,element,handler);
}
/*** IUIAutomation6 methods ***/
static inline HRESULT IUIAutomation6_CreateEventHandlerGroup(IUIAutomation6* This,IUIAutomationEventHandlerGroup **handlerGroup) {
    return This->lpVtbl->CreateEventHandlerGroup(This,handlerGroup);
}
static inline HRESULT IUIAutomation6_AddEventHandlerGroup(IUIAutomation6* This,IUIAutomationElement *element,IUIAutomationEventHandlerGroup *handlerGroup) {
    return This->lpVtbl->AddEventHandlerGroup(This,element,handlerGroup);
}
static inline HRESULT IUIAutomation6_RemoveEventHandlerGroup(IUIAutomation6* This,IUIAutomationElement *element,IUIAutomationEventHandlerGroup *handlerGroup) {
    return This->lpVtbl->RemoveEventHandlerGroup(This,element,handlerGroup);
}
static inline HRESULT IUIAutomation6_get_ConnectionRecoveryBehavior(IUIAutomation6* This,enum ConnectionRecoveryBehaviorOptions *connectionRecoveryBehaviorOptions) {
    return This->lpVtbl->get_ConnectionRecoveryBehavior(This,connectionRecoveryBehaviorOptions);
}
static inline HRESULT IUIAutomation6_put_ConnectionRecoveryBehavior(IUIAutomation6* This,enum ConnectionRecoveryBehaviorOptions connectionRecoveryBehaviorOptions) {
    return This->lpVtbl->put_ConnectionRecoveryBehavior(This,connectionRecoveryBehaviorOptions);
}
static inline HRESULT IUIAutomation6_get_CoalesceEvents(IUIAutomation6* This,enum CoalesceEventsOptions *coalesceEventsOptions) {
    return This->lpVtbl->get_CoalesceEvents(This,coalesceEventsOptions);
}
static inline HRESULT IUIAutomation6_put_CoalesceEvents(IUIAutomation6* This,enum CoalesceEventsOptions coalesceEventsOptions) {
    return This->lpVtbl->put_CoalesceEvents(This,coalesceEventsOptions);
}
static 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 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__ */
