/*** Autogenerated by WIDL 11.5 from include/windows.ui.text.core.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 __windows_ui_text_core_h__
#define __windows_ui_text_core_h__

/* Forward declarations */

#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManagerStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManagerStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManagerStatics __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManagerStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManagerStatics ABI::Windows::UI::Text::Core::ICoreTextServicesManagerStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    interface ICoreTextServicesManagerStatics;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment ABI::Windows::UI::Text::Core::ICoreTextCompositionSegment
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    interface ICoreTextCompositionSegment;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs ABI::Windows::UI::Text::Core::ICoreTextCompositionCompletedEventArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    interface ICoreTextCompositionCompletedEventArgs;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgs __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgs ABI::Windows::UI::Text::Core::ICoreTextCompositionStartedEventArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    interface ICoreTextCompositionStartedEventArgs;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs ABI::Windows::UI::Text::Core::ICoreTextFormatUpdatingEventArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    interface ICoreTextFormatUpdatingEventArgs;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs ABI::Windows::UI::Text::Core::ICoreTextSelectionUpdatingEventArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    interface ICoreTextSelectionUpdatingEventArgs;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs ABI::Windows::UI::Text::Core::ICoreTextTextUpdatingEventArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    interface ICoreTextTextUpdatingEventArgs;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds ABI::Windows::UI::Text::Core::ICoreTextLayoutBounds
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    interface ICoreTextLayoutBounds;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest ABI::Windows::UI::Text::Core::ICoreTextLayoutRequest
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    interface ICoreTextLayoutRequest;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestedEventArgs __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestedEventArgs ABI::Windows::UI::Text::Core::ICoreTextLayoutRequestedEventArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    interface ICoreTextLayoutRequestedEventArgs;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest ABI::Windows::UI::Text::Core::ICoreTextSelectionRequest
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    interface ICoreTextSelectionRequest;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestedEventArgs __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestedEventArgs ABI::Windows::UI::Text::Core::ICoreTextSelectionRequestedEventArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    interface ICoreTextSelectionRequestedEventArgs;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest ABI::Windows::UI::Text::Core::ICoreTextTextRequest
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    interface ICoreTextTextRequest;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestedEventArgs __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestedEventArgs ABI::Windows::UI::Text::Core::ICoreTextTextRequestedEventArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    interface ICoreTextTextRequestedEventArgs;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext ABI::Windows::UI::Text::Core::ICoreTextEditContext
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    interface ICoreTextEditContext;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager ABI::Windows::UI::Text::Core::ICoreTextServicesManager
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    interface ICoreTextServicesManager;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextServicesManager_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextServicesManager_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    class CoreTextServicesManager;
                }
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CText_CCore_CCoreTextServicesManager __x_ABI_CWindows_CUI_CText_CCore_CCoreTextServicesManager;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextServicesManager_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextFormatUpdatingEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextFormatUpdatingEventArgs_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    class CoreTextFormatUpdatingEventArgs;
                }
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CText_CCore_CCoreTextFormatUpdatingEventArgs __x_ABI_CWindows_CUI_CText_CCore_CCoreTextFormatUpdatingEventArgs;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextFormatUpdatingEventArgs_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextEditContext_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextEditContext_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    class CoreTextEditContext;
                }
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CText_CCore_CCoreTextEditContext __x_ABI_CWindows_CUI_CText_CCore_CCoreTextEditContext;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextEditContext_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextCompositionCompletedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextCompositionCompletedEventArgs_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    class CoreTextCompositionCompletedEventArgs;
                }
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CText_CCore_CCoreTextCompositionCompletedEventArgs __x_ABI_CWindows_CUI_CText_CCore_CCoreTextCompositionCompletedEventArgs;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextCompositionCompletedEventArgs_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextCompositionStartedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextCompositionStartedEventArgs_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    class CoreTextCompositionStartedEventArgs;
                }
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CText_CCore_CCoreTextCompositionStartedEventArgs __x_ABI_CWindows_CUI_CText_CCore_CCoreTextCompositionStartedEventArgs;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextCompositionStartedEventArgs_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextLayoutRequestedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextLayoutRequestedEventArgs_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    class CoreTextLayoutRequestedEventArgs;
                }
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CText_CCore_CCoreTextLayoutRequestedEventArgs __x_ABI_CWindows_CUI_CText_CCore_CCoreTextLayoutRequestedEventArgs;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextLayoutRequestedEventArgs_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextSelectionRequestedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextSelectionRequestedEventArgs_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    class CoreTextSelectionRequestedEventArgs;
                }
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CText_CCore_CCoreTextSelectionRequestedEventArgs __x_ABI_CWindows_CUI_CText_CCore_CCoreTextSelectionRequestedEventArgs;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextSelectionRequestedEventArgs_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextSelectionUpdatingEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextSelectionUpdatingEventArgs_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    class CoreTextSelectionUpdatingEventArgs;
                }
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CText_CCore_CCoreTextSelectionUpdatingEventArgs __x_ABI_CWindows_CUI_CText_CCore_CCoreTextSelectionUpdatingEventArgs;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextSelectionUpdatingEventArgs_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextTextRequestedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextTextRequestedEventArgs_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    class CoreTextTextRequestedEventArgs;
                }
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CText_CCore_CCoreTextTextRequestedEventArgs __x_ABI_CWindows_CUI_CText_CCore_CCoreTextTextRequestedEventArgs;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextTextRequestedEventArgs_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextTextUpdatingEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextTextUpdatingEventArgs_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    class CoreTextTextUpdatingEventArgs;
                }
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CText_CCore_CCoreTextTextUpdatingEventArgs __x_ABI_CWindows_CUI_CText_CCore_CCoreTextTextUpdatingEventArgs;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextTextUpdatingEventArgs_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextLayoutBounds_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextLayoutBounds_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    class CoreTextLayoutBounds;
                }
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CText_CCore_CCoreTextLayoutBounds __x_ABI_CWindows_CUI_CText_CCore_CCoreTextLayoutBounds;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextLayoutBounds_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextLayoutRequest_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextLayoutRequest_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    class CoreTextLayoutRequest;
                }
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CText_CCore_CCoreTextLayoutRequest __x_ABI_CWindows_CUI_CText_CCore_CCoreTextLayoutRequest;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextLayoutRequest_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextSelectionRequest_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextSelectionRequest_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    class CoreTextSelectionRequest;
                }
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CText_CCore_CCoreTextSelectionRequest __x_ABI_CWindows_CUI_CText_CCore_CCoreTextSelectionRequest;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextSelectionRequest_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextTextRequest_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextTextRequest_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    class CoreTextTextRequest;
                }
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CText_CCore_CCoreTextTextRequest __x_ABI_CWindows_CUI_CText_CCore_CCoreTextTextRequest;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextTextRequest_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextCompositionSegment_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextCompositionSegment_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    class CoreTextCompositionSegment;
                }
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CText_CCore_CCoreTextCompositionSegment __x_ABI_CWindows_CUI_CText_CCore_CCoreTextCompositionSegment;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextCompositionSegment_FWD_DEFINED__ */

#ifndef ____FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment __FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Text::Core::CoreTextCompositionSegment* >
#endif /* __cplusplus */
#endif

#ifndef ____FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_IInspectable_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_IInspectable_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_IInspectable __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_IInspectable;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_IInspectable ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,IInspectable* >
#endif /* __cplusplus */
#endif

#ifndef ____FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionCompletedEventArgs_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionCompletedEventArgs_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionCompletedEventArgs __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionCompletedEventArgs;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionCompletedEventArgs ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,ABI::Windows::UI::Text::Core::CoreTextCompositionCompletedEventArgs* >
#endif /* __cplusplus */
#endif

#ifndef ____FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionStartedEventArgs_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionStartedEventArgs_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionStartedEventArgs __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionStartedEventArgs;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionStartedEventArgs ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,ABI::Windows::UI::Text::Core::CoreTextCompositionStartedEventArgs* >
#endif /* __cplusplus */
#endif

#ifndef ____FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextFormatUpdatingEventArgs_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextFormatUpdatingEventArgs_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextFormatUpdatingEventArgs __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextFormatUpdatingEventArgs;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextFormatUpdatingEventArgs ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,ABI::Windows::UI::Text::Core::CoreTextFormatUpdatingEventArgs* >
#endif /* __cplusplus */
#endif

#ifndef ____FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextLayoutRequestedEventArgs_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextLayoutRequestedEventArgs_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextLayoutRequestedEventArgs __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextLayoutRequestedEventArgs;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextLayoutRequestedEventArgs ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,ABI::Windows::UI::Text::Core::CoreTextLayoutRequestedEventArgs* >
#endif /* __cplusplus */
#endif

#ifndef ____FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionRequestedEventArgs_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionRequestedEventArgs_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionRequestedEventArgs __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionRequestedEventArgs;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionRequestedEventArgs ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,ABI::Windows::UI::Text::Core::CoreTextSelectionRequestedEventArgs* >
#endif /* __cplusplus */
#endif

#ifndef ____FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionUpdatingEventArgs_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionUpdatingEventArgs_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionUpdatingEventArgs __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionUpdatingEventArgs;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionUpdatingEventArgs ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,ABI::Windows::UI::Text::Core::CoreTextSelectionUpdatingEventArgs* >
#endif /* __cplusplus */
#endif

#ifndef ____FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextRequestedEventArgs_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextRequestedEventArgs_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextRequestedEventArgs __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextRequestedEventArgs;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextRequestedEventArgs ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,ABI::Windows::UI::Text::Core::CoreTextTextRequestedEventArgs* >
#endif /* __cplusplus */
#endif

#ifndef ____FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextUpdatingEventArgs_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextUpdatingEventArgs_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextUpdatingEventArgs __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextUpdatingEventArgs;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextUpdatingEventArgs ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,ABI::Windows::UI::Text::Core::CoreTextTextUpdatingEventArgs* >
#endif /* __cplusplus */
#endif

#ifndef ____FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextServicesManager_IInspectable_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextServicesManager_IInspectable_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextServicesManager_IInspectable __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextServicesManager_IInspectable;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextServicesManager_IInspectable ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextServicesManager*,IInspectable* >
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <inspectable.h>
#include <asyncinfo.h>
#include <eventtoken.h>
#include <windowscontracts.h>
#include <windows.foundation.h>
#include <windows.globalization.h>
#include <windows.ui.viewmanagement.h>
#include <windows.ui.text.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs ABI::Windows::UI::Text::Core::ICoreTextCompositionCompletedEventArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    interface ICoreTextCompositionCompletedEventArgs;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment ABI::Windows::UI::Text::Core::ICoreTextCompositionSegment
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    interface ICoreTextCompositionSegment;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgs __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgs ABI::Windows::UI::Text::Core::ICoreTextCompositionStartedEventArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    interface ICoreTextCompositionStartedEventArgs;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext ABI::Windows::UI::Text::Core::ICoreTextEditContext
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    interface ICoreTextEditContext;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs ABI::Windows::UI::Text::Core::ICoreTextFormatUpdatingEventArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    interface ICoreTextFormatUpdatingEventArgs;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds ABI::Windows::UI::Text::Core::ICoreTextLayoutBounds
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    interface ICoreTextLayoutBounds;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest ABI::Windows::UI::Text::Core::ICoreTextLayoutRequest
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    interface ICoreTextLayoutRequest;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestedEventArgs __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestedEventArgs ABI::Windows::UI::Text::Core::ICoreTextLayoutRequestedEventArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    interface ICoreTextLayoutRequestedEventArgs;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest ABI::Windows::UI::Text::Core::ICoreTextSelectionRequest
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    interface ICoreTextSelectionRequest;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestedEventArgs __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestedEventArgs ABI::Windows::UI::Text::Core::ICoreTextSelectionRequestedEventArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    interface ICoreTextSelectionRequestedEventArgs;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs ABI::Windows::UI::Text::Core::ICoreTextSelectionUpdatingEventArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    interface ICoreTextSelectionUpdatingEventArgs;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager ABI::Windows::UI::Text::Core::ICoreTextServicesManager
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    interface ICoreTextServicesManager;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManagerStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManagerStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManagerStatics __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManagerStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManagerStatics ABI::Windows::UI::Text::Core::ICoreTextServicesManagerStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    interface ICoreTextServicesManagerStatics;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest ABI::Windows::UI::Text::Core::ICoreTextTextRequest
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    interface ICoreTextTextRequest;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestedEventArgs __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestedEventArgs ABI::Windows::UI::Text::Core::ICoreTextTextRequestedEventArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    interface ICoreTextTextRequestedEventArgs;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs ABI::Windows::UI::Text::Core::ICoreTextTextUpdatingEventArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    interface ICoreTextTextUpdatingEventArgs;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#if !defined(WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION)
#define WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION 0xe0000
#endif // defined(WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION)

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextFormatUpdatingReason_ENUM_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextFormatUpdatingReason_ENUM_DEFINED__
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    enum CoreTextFormatUpdatingReason {
                        CoreTextFormatUpdatingReason_None = 0,
                        CoreTextFormatUpdatingReason_CompositionUnconverted = 1,
                        CoreTextFormatUpdatingReason_CompositionConverted = 2,
                        CoreTextFormatUpdatingReason_CompositionTargetUnconverted = 3,
                        CoreTextFormatUpdatingReason_CompositionTargetConverted = 4
                    };
                }
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CText_CCore_CCoreTextFormatUpdatingReason {
    CoreTextFormatUpdatingReason_None = 0,
    CoreTextFormatUpdatingReason_CompositionUnconverted = 1,
    CoreTextFormatUpdatingReason_CompositionConverted = 2,
    CoreTextFormatUpdatingReason_CompositionTargetUnconverted = 3,
    CoreTextFormatUpdatingReason_CompositionTargetConverted = 4
};
#ifdef WIDL_using_Windows_UI_Text_Core
#define CoreTextFormatUpdatingReason __x_ABI_CWindows_CUI_CText_CCore_CCoreTextFormatUpdatingReason
#endif /* WIDL_using_Windows_UI_Text_Core */
#endif

#endif /* ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextFormatUpdatingReason_ENUM_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CText_CCore_CCoreTextFormatUpdatingReason __x_ABI_CWindows_CUI_CText_CCore_CCoreTextFormatUpdatingReason;
#endif /* __cplusplus */

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextFormatUpdatingResult_ENUM_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextFormatUpdatingResult_ENUM_DEFINED__
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    enum CoreTextFormatUpdatingResult {
                        CoreTextFormatUpdatingResult_Succeeded = 0,
                        CoreTextFormatUpdatingResult_Failed = 1
                    };
                }
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CText_CCore_CCoreTextFormatUpdatingResult {
    CoreTextFormatUpdatingResult_Succeeded = 0,
    CoreTextFormatUpdatingResult_Failed = 1
};
#ifdef WIDL_using_Windows_UI_Text_Core
#define CoreTextFormatUpdatingResult __x_ABI_CWindows_CUI_CText_CCore_CCoreTextFormatUpdatingResult
#endif /* WIDL_using_Windows_UI_Text_Core */
#endif

#endif /* ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextFormatUpdatingResult_ENUM_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CText_CCore_CCoreTextFormatUpdatingResult __x_ABI_CWindows_CUI_CText_CCore_CCoreTextFormatUpdatingResult;
#endif /* __cplusplus */

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextInputPaneDisplayPolicy_ENUM_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextInputPaneDisplayPolicy_ENUM_DEFINED__
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    enum CoreTextInputPaneDisplayPolicy {
                        CoreTextInputPaneDisplayPolicy_Automatic = 0,
                        CoreTextInputPaneDisplayPolicy_Manual = 1
                    };
                }
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CText_CCore_CCoreTextInputPaneDisplayPolicy {
    CoreTextInputPaneDisplayPolicy_Automatic = 0,
    CoreTextInputPaneDisplayPolicy_Manual = 1
};
#ifdef WIDL_using_Windows_UI_Text_Core
#define CoreTextInputPaneDisplayPolicy __x_ABI_CWindows_CUI_CText_CCore_CCoreTextInputPaneDisplayPolicy
#endif /* WIDL_using_Windows_UI_Text_Core */
#endif

#endif /* ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextInputPaneDisplayPolicy_ENUM_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CText_CCore_CCoreTextInputPaneDisplayPolicy __x_ABI_CWindows_CUI_CText_CCore_CCoreTextInputPaneDisplayPolicy;
#endif /* __cplusplus */

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextInputScope_ENUM_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextInputScope_ENUM_DEFINED__
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    enum CoreTextInputScope {
                        CoreTextInputScope_Default = 0,
                        CoreTextInputScope_Url = 1,
                        CoreTextInputScope_FilePath = 2,
                        CoreTextInputScope_FileName = 3,
                        CoreTextInputScope_EmailUserName = 4,
                        CoreTextInputScope_EmailAddress = 5,
                        CoreTextInputScope_UserName = 6,
                        CoreTextInputScope_PersonalFullName = 7,
                        CoreTextInputScope_PersonalNamePrefix = 8,
                        CoreTextInputScope_PersonalGivenName = 9,
                        CoreTextInputScope_PersonalMiddleName = 10,
                        CoreTextInputScope_PersonalSurname = 11,
                        CoreTextInputScope_PersonalNameSuffix = 12,
                        CoreTextInputScope_Address = 13,
                        CoreTextInputScope_AddressPostalCode = 14,
                        CoreTextInputScope_AddressStreet = 15,
                        CoreTextInputScope_AddressStateOrProvince = 16,
                        CoreTextInputScope_AddressCity = 17,
                        CoreTextInputScope_AddressCountryName = 18,
                        CoreTextInputScope_AddressCountryShortName = 19,
                        CoreTextInputScope_CurrencyAmountAndSymbol = 20,
                        CoreTextInputScope_CurrencyAmount = 21,
                        CoreTextInputScope_Date = 22,
                        CoreTextInputScope_DateMonth = 23,
                        CoreTextInputScope_DateDay = 24,
                        CoreTextInputScope_DateYear = 25,
                        CoreTextInputScope_DateMonthName = 26,
                        CoreTextInputScope_DateDayName = 27,
                        CoreTextInputScope_Number = 29,
                        CoreTextInputScope_SingleCharacter = 30,
                        CoreTextInputScope_Password = 31,
                        CoreTextInputScope_TelephoneNumber = 32,
                        CoreTextInputScope_TelephoneCountryCode = 33,
                        CoreTextInputScope_TelephoneAreaCode = 34,
                        CoreTextInputScope_TelephoneLocalNumber = 35,
                        CoreTextInputScope_Time = 36,
                        CoreTextInputScope_TimeHour = 37,
                        CoreTextInputScope_TimeMinuteOrSecond = 38,
                        CoreTextInputScope_NumberFullWidth = 39,
                        CoreTextInputScope_AlphanumericHalfWidth = 40,
                        CoreTextInputScope_AlphanumericFullWidth = 41,
                        CoreTextInputScope_CurrencyChinese = 42,
                        CoreTextInputScope_Bopomofo = 43,
                        CoreTextInputScope_Hiragana = 44,
                        CoreTextInputScope_KatakanaHalfWidth = 45,
                        CoreTextInputScope_KatakanaFullWidth = 46,
                        CoreTextInputScope_Hanja = 47,
                        CoreTextInputScope_HangulHalfWidth = 48,
                        CoreTextInputScope_HangulFullWidth = 49,
                        CoreTextInputScope_Search = 50,
                        CoreTextInputScope_Formula = 51,
                        CoreTextInputScope_SearchIncremental = 52,
                        CoreTextInputScope_ChineseHalfWidth = 53,
                        CoreTextInputScope_ChineseFullWidth = 54,
                        CoreTextInputScope_NativeScript = 55,
                        CoreTextInputScope_Text = 57,
                        CoreTextInputScope_Chat = 58,
                        CoreTextInputScope_NameOrPhoneNumber = 59,
                        CoreTextInputScope_EmailUserNameOrAddress = 60,
                        CoreTextInputScope_Private = 61,
                        CoreTextInputScope_Maps = 62,
                        CoreTextInputScope_PasswordNumeric = 63,
                        CoreTextInputScope_FormulaNumber = 67
                    };
                }
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CText_CCore_CCoreTextInputScope {
    CoreTextInputScope_Default = 0,
    CoreTextInputScope_Url = 1,
    CoreTextInputScope_FilePath = 2,
    CoreTextInputScope_FileName = 3,
    CoreTextInputScope_EmailUserName = 4,
    CoreTextInputScope_EmailAddress = 5,
    CoreTextInputScope_UserName = 6,
    CoreTextInputScope_PersonalFullName = 7,
    CoreTextInputScope_PersonalNamePrefix = 8,
    CoreTextInputScope_PersonalGivenName = 9,
    CoreTextInputScope_PersonalMiddleName = 10,
    CoreTextInputScope_PersonalSurname = 11,
    CoreTextInputScope_PersonalNameSuffix = 12,
    CoreTextInputScope_Address = 13,
    CoreTextInputScope_AddressPostalCode = 14,
    CoreTextInputScope_AddressStreet = 15,
    CoreTextInputScope_AddressStateOrProvince = 16,
    CoreTextInputScope_AddressCity = 17,
    CoreTextInputScope_AddressCountryName = 18,
    CoreTextInputScope_AddressCountryShortName = 19,
    CoreTextInputScope_CurrencyAmountAndSymbol = 20,
    CoreTextInputScope_CurrencyAmount = 21,
    CoreTextInputScope_Date = 22,
    CoreTextInputScope_DateMonth = 23,
    CoreTextInputScope_DateDay = 24,
    CoreTextInputScope_DateYear = 25,
    CoreTextInputScope_DateMonthName = 26,
    CoreTextInputScope_DateDayName = 27,
    CoreTextInputScope_Number = 29,
    CoreTextInputScope_SingleCharacter = 30,
    CoreTextInputScope_Password = 31,
    CoreTextInputScope_TelephoneNumber = 32,
    CoreTextInputScope_TelephoneCountryCode = 33,
    CoreTextInputScope_TelephoneAreaCode = 34,
    CoreTextInputScope_TelephoneLocalNumber = 35,
    CoreTextInputScope_Time = 36,
    CoreTextInputScope_TimeHour = 37,
    CoreTextInputScope_TimeMinuteOrSecond = 38,
    CoreTextInputScope_NumberFullWidth = 39,
    CoreTextInputScope_AlphanumericHalfWidth = 40,
    CoreTextInputScope_AlphanumericFullWidth = 41,
    CoreTextInputScope_CurrencyChinese = 42,
    CoreTextInputScope_Bopomofo = 43,
    CoreTextInputScope_Hiragana = 44,
    CoreTextInputScope_KatakanaHalfWidth = 45,
    CoreTextInputScope_KatakanaFullWidth = 46,
    CoreTextInputScope_Hanja = 47,
    CoreTextInputScope_HangulHalfWidth = 48,
    CoreTextInputScope_HangulFullWidth = 49,
    CoreTextInputScope_Search = 50,
    CoreTextInputScope_Formula = 51,
    CoreTextInputScope_SearchIncremental = 52,
    CoreTextInputScope_ChineseHalfWidth = 53,
    CoreTextInputScope_ChineseFullWidth = 54,
    CoreTextInputScope_NativeScript = 55,
    CoreTextInputScope_Text = 57,
    CoreTextInputScope_Chat = 58,
    CoreTextInputScope_NameOrPhoneNumber = 59,
    CoreTextInputScope_EmailUserNameOrAddress = 60,
    CoreTextInputScope_Private = 61,
    CoreTextInputScope_Maps = 62,
    CoreTextInputScope_PasswordNumeric = 63,
    CoreTextInputScope_FormulaNumber = 67
};
#ifdef WIDL_using_Windows_UI_Text_Core
#define CoreTextInputScope __x_ABI_CWindows_CUI_CText_CCore_CCoreTextInputScope
#endif /* WIDL_using_Windows_UI_Text_Core */
#endif

#endif /* ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextInputScope_ENUM_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CText_CCore_CCoreTextInputScope __x_ABI_CWindows_CUI_CText_CCore_CCoreTextInputScope;
#endif /* __cplusplus */

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextSelectionUpdatingResult_ENUM_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextSelectionUpdatingResult_ENUM_DEFINED__
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    enum CoreTextSelectionUpdatingResult {
                        CoreTextSelectionUpdatingResult_Succeeded = 0,
                        CoreTextSelectionUpdatingResult_Failed = 1
                    };
                }
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CText_CCore_CCoreTextSelectionUpdatingResult {
    CoreTextSelectionUpdatingResult_Succeeded = 0,
    CoreTextSelectionUpdatingResult_Failed = 1
};
#ifdef WIDL_using_Windows_UI_Text_Core
#define CoreTextSelectionUpdatingResult __x_ABI_CWindows_CUI_CText_CCore_CCoreTextSelectionUpdatingResult
#endif /* WIDL_using_Windows_UI_Text_Core */
#endif

#endif /* ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextSelectionUpdatingResult_ENUM_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CText_CCore_CCoreTextSelectionUpdatingResult __x_ABI_CWindows_CUI_CText_CCore_CCoreTextSelectionUpdatingResult;
#endif /* __cplusplus */

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextTextUpdatingResult_ENUM_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextTextUpdatingResult_ENUM_DEFINED__
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    enum CoreTextTextUpdatingResult {
                        CoreTextTextUpdatingResult_Succeeded = 0,
                        CoreTextTextUpdatingResult_Failed = 1
                    };
                }
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CText_CCore_CCoreTextTextUpdatingResult {
    CoreTextTextUpdatingResult_Succeeded = 0,
    CoreTextTextUpdatingResult_Failed = 1
};
#ifdef WIDL_using_Windows_UI_Text_Core
#define CoreTextTextUpdatingResult __x_ABI_CWindows_CUI_CText_CCore_CCoreTextTextUpdatingResult
#endif /* WIDL_using_Windows_UI_Text_Core */
#endif

#endif /* ____x_ABI_CWindows_CUI_CText_CCore_CCoreTextTextUpdatingResult_ENUM_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CText_CCore_CCoreTextTextUpdatingResult __x_ABI_CWindows_CUI_CText_CCore_CCoreTextTextUpdatingResult;
#endif /* __cplusplus */

#ifndef __cplusplus
typedef struct __x_ABI_CWindows_CUI_CText_CCore_CCoreTextRange __x_ABI_CWindows_CUI_CText_CCore_CCoreTextRange;
#else /* __cplusplus */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    typedef struct CoreTextRange CoreTextRange;
                }
            }
        }
    }
}
#endif /* __cplusplus */

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    struct CoreTextRange {
                        INT32 StartCaretPosition;
                        INT32 EndCaretPosition;
                    };
                }
            }
        }
    }
}
extern "C" {
#else
struct __x_ABI_CWindows_CUI_CText_CCore_CCoreTextRange {
    INT32 StartCaretPosition;
    INT32 EndCaretPosition;
};
#ifdef WIDL_using_Windows_UI_Text_Core
#define CoreTextRange __x_ABI_CWindows_CUI_CText_CCore_CCoreTextRange
#endif /* WIDL_using_Windows_UI_Text_Core */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#ifndef ____FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment __FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Text::Core::CoreTextCompositionSegment* >
#endif /* __cplusplus */
#endif

/*****************************************************************************
 * ICoreTextServicesManagerStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManagerStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManagerStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManagerStatics, 0x1520a388, 0xe2cf, 0x4d65, 0xae,0xb9, 0xb3,0x2d,0x86,0xfe,0x39,0xb9);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    MIDL_INTERFACE("1520a388-e2cf-4d65-aeb9-b32d86fe39b9")
                    ICoreTextServicesManagerStatics : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE GetForCurrentView(
                            ABI::Windows::UI::Text::Core::ICoreTextServicesManager **value) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManagerStatics, 0x1520a388, 0xe2cf, 0x4d65, 0xae,0xb9, 0xb3,0x2d,0x86,0xfe,0x39,0xb9)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManagerStaticsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManagerStatics *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManagerStatics *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManagerStatics *This,
        TrustLevel *trustLevel);

    /*** ICoreTextServicesManagerStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *GetForCurrentView)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManagerStatics *This,
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManagerStaticsVtbl;

interface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManagerStatics {
    CONST_VTBL __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManagerStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManagerStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManagerStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManagerStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManagerStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManagerStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManagerStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ICoreTextServicesManagerStatics methods ***/
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManagerStatics_GetForCurrentView(This,value) (This)->lpVtbl->GetForCurrentView(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManagerStatics_QueryInterface(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManagerStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManagerStatics_AddRef(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManagerStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManagerStatics_Release(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManagerStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManagerStatics_GetIids(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManagerStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManagerStatics_GetRuntimeClassName(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManagerStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManagerStatics_GetTrustLevel(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManagerStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ICoreTextServicesManagerStatics methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManagerStatics_GetForCurrentView(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManagerStatics* This,__x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager **value) {
    return This->lpVtbl->GetForCurrentView(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Text_Core
#define IID_ICoreTextServicesManagerStatics IID___x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManagerStatics
#define ICoreTextServicesManagerStaticsVtbl __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManagerStaticsVtbl
#define ICoreTextServicesManagerStatics __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManagerStatics
#define ICoreTextServicesManagerStatics_QueryInterface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManagerStatics_QueryInterface
#define ICoreTextServicesManagerStatics_AddRef __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManagerStatics_AddRef
#define ICoreTextServicesManagerStatics_Release __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManagerStatics_Release
#define ICoreTextServicesManagerStatics_GetIids __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManagerStatics_GetIids
#define ICoreTextServicesManagerStatics_GetRuntimeClassName __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManagerStatics_GetRuntimeClassName
#define ICoreTextServicesManagerStatics_GetTrustLevel __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManagerStatics_GetTrustLevel
#define ICoreTextServicesManagerStatics_GetForCurrentView __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManagerStatics_GetForCurrentView
#endif /* WIDL_using_Windows_UI_Text_Core */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManagerStatics_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * ICoreTextCompositionSegment interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment, 0x776c6bd9, 0x4ead, 0x4da7, 0x8f,0x47, 0x3a,0x88,0xb5,0x23,0xcc,0x34);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    MIDL_INTERFACE("776c6bd9-4ead-4da7-8f47-3a88b523cc34")
                    ICoreTextCompositionSegment : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE get_PreconversionString(
                            HSTRING *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_Range(
                            ABI::Windows::UI::Text::Core::CoreTextRange *value) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment, 0x776c6bd9, 0x4ead, 0x4da7, 0x8f,0x47, 0x3a,0x88,0xb5,0x23,0xcc,0x34)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegmentVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment *This,
        TrustLevel *trustLevel);

    /*** ICoreTextCompositionSegment methods ***/
    HRESULT (STDMETHODCALLTYPE *get_PreconversionString)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Range)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment *This,
        __x_ABI_CWindows_CUI_CText_CCore_CCoreTextRange *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegmentVtbl;

interface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment {
    CONST_VTBL __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegmentVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ICoreTextCompositionSegment methods ***/
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment_get_PreconversionString(This,value) (This)->lpVtbl->get_PreconversionString(This,value)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment_get_Range(This,value) (This)->lpVtbl->get_Range(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment_QueryInterface(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment_AddRef(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment_Release(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment_GetIids(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment_GetRuntimeClassName(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment_GetTrustLevel(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ICoreTextCompositionSegment methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment_get_PreconversionString(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment* This,HSTRING *value) {
    return This->lpVtbl->get_PreconversionString(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment_get_Range(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment* This,__x_ABI_CWindows_CUI_CText_CCore_CCoreTextRange *value) {
    return This->lpVtbl->get_Range(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Text_Core
#define IID_ICoreTextCompositionSegment IID___x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment
#define ICoreTextCompositionSegmentVtbl __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegmentVtbl
#define ICoreTextCompositionSegment __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment
#define ICoreTextCompositionSegment_QueryInterface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment_QueryInterface
#define ICoreTextCompositionSegment_AddRef __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment_AddRef
#define ICoreTextCompositionSegment_Release __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment_Release
#define ICoreTextCompositionSegment_GetIids __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment_GetIids
#define ICoreTextCompositionSegment_GetRuntimeClassName __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment_GetRuntimeClassName
#define ICoreTextCompositionSegment_GetTrustLevel __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment_GetTrustLevel
#define ICoreTextCompositionSegment_get_PreconversionString __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment_get_PreconversionString
#define ICoreTextCompositionSegment_get_Range __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment_get_Range
#endif /* WIDL_using_Windows_UI_Text_Core */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * ICoreTextCompositionCompletedEventArgs interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs, 0x1f34ebb6, 0xb79f, 0x4121, 0xa5,0xe7, 0xfd,0xa9,0xb8,0x61,0x6e,0x30);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    MIDL_INTERFACE("1f34ebb6-b79f-4121-a5e7-fda9b8616e30")
                    ICoreTextCompositionCompletedEventArgs : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE get_IsCanceled(
                            boolean *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_CompositionSegments(
                            ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Text::Core::CoreTextCompositionSegment* > **value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE GetDeferral(
                            ABI::Windows::Foundation::IDeferral **value) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs, 0x1f34ebb6, 0xb79f, 0x4121, 0xa5,0xe7, 0xfd,0xa9,0xb8,0x61,0x6e,0x30)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs *This,
        TrustLevel *trustLevel);

    /*** ICoreTextCompositionCompletedEventArgs methods ***/
    HRESULT (STDMETHODCALLTYPE *get_IsCanceled)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_CompositionSegments)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs *This,
        __FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment **value);

    HRESULT (STDMETHODCALLTYPE *GetDeferral)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs *This,
        __x_ABI_CWindows_CFoundation_CIDeferral **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgsVtbl;

interface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs {
    CONST_VTBL __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ICoreTextCompositionCompletedEventArgs methods ***/
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs_get_IsCanceled(This,value) (This)->lpVtbl->get_IsCanceled(This,value)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs_get_CompositionSegments(This,value) (This)->lpVtbl->get_CompositionSegments(This,value)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs_GetDeferral(This,value) (This)->lpVtbl->GetDeferral(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs_QueryInterface(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs_AddRef(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs_Release(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs_GetIids(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs_GetTrustLevel(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ICoreTextCompositionCompletedEventArgs methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs_get_IsCanceled(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs* This,boolean *value) {
    return This->lpVtbl->get_IsCanceled(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs_get_CompositionSegments(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs* This,__FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment **value) {
    return This->lpVtbl->get_CompositionSegments(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs_GetDeferral(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs* This,__x_ABI_CWindows_CFoundation_CIDeferral **value) {
    return This->lpVtbl->GetDeferral(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Text_Core
#define IID_ICoreTextCompositionCompletedEventArgs IID___x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs
#define ICoreTextCompositionCompletedEventArgsVtbl __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgsVtbl
#define ICoreTextCompositionCompletedEventArgs __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs
#define ICoreTextCompositionCompletedEventArgs_QueryInterface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs_QueryInterface
#define ICoreTextCompositionCompletedEventArgs_AddRef __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs_AddRef
#define ICoreTextCompositionCompletedEventArgs_Release __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs_Release
#define ICoreTextCompositionCompletedEventArgs_GetIids __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs_GetIids
#define ICoreTextCompositionCompletedEventArgs_GetRuntimeClassName __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs_GetRuntimeClassName
#define ICoreTextCompositionCompletedEventArgs_GetTrustLevel __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs_GetTrustLevel
#define ICoreTextCompositionCompletedEventArgs_get_IsCanceled __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs_get_IsCanceled
#define ICoreTextCompositionCompletedEventArgs_get_CompositionSegments __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs_get_CompositionSegments
#define ICoreTextCompositionCompletedEventArgs_GetDeferral __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs_GetDeferral
#endif /* WIDL_using_Windows_UI_Text_Core */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * ICoreTextCompositionStartedEventArgs interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgs_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgs, 0x276b16a9, 0x64e7, 0x4ab0, 0xbc,0x4b, 0xa0,0x2d,0x73,0x83,0x5b,0xfb);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    MIDL_INTERFACE("276b16a9-64e7-4ab0-bc4b-a02d73835bfb")
                    ICoreTextCompositionStartedEventArgs : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE get_IsCanceled(
                            boolean *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE GetDeferral(
                            ABI::Windows::Foundation::IDeferral **value) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgs, 0x276b16a9, 0x64e7, 0x4ab0, 0xbc,0x4b, 0xa0,0x2d,0x73,0x83,0x5b,0xfb)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgs *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgs *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgs *This,
        TrustLevel *trustLevel);

    /*** ICoreTextCompositionStartedEventArgs methods ***/
    HRESULT (STDMETHODCALLTYPE *get_IsCanceled)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgs *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *GetDeferral)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgs *This,
        __x_ABI_CWindows_CFoundation_CIDeferral **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgsVtbl;

interface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgs {
    CONST_VTBL __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ICoreTextCompositionStartedEventArgs methods ***/
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgs_get_IsCanceled(This,value) (This)->lpVtbl->get_IsCanceled(This,value)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgs_GetDeferral(This,value) (This)->lpVtbl->GetDeferral(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgs_QueryInterface(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgs_AddRef(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgs_Release(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgs_GetIids(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgs* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgs* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgs_GetTrustLevel(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgs* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ICoreTextCompositionStartedEventArgs methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgs_get_IsCanceled(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgs* This,boolean *value) {
    return This->lpVtbl->get_IsCanceled(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgs_GetDeferral(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgs* This,__x_ABI_CWindows_CFoundation_CIDeferral **value) {
    return This->lpVtbl->GetDeferral(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Text_Core
#define IID_ICoreTextCompositionStartedEventArgs IID___x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgs
#define ICoreTextCompositionStartedEventArgsVtbl __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgsVtbl
#define ICoreTextCompositionStartedEventArgs __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgs
#define ICoreTextCompositionStartedEventArgs_QueryInterface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgs_QueryInterface
#define ICoreTextCompositionStartedEventArgs_AddRef __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgs_AddRef
#define ICoreTextCompositionStartedEventArgs_Release __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgs_Release
#define ICoreTextCompositionStartedEventArgs_GetIids __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgs_GetIids
#define ICoreTextCompositionStartedEventArgs_GetRuntimeClassName __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgs_GetRuntimeClassName
#define ICoreTextCompositionStartedEventArgs_GetTrustLevel __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgs_GetTrustLevel
#define ICoreTextCompositionStartedEventArgs_get_IsCanceled __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgs_get_IsCanceled
#define ICoreTextCompositionStartedEventArgs_GetDeferral __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgs_GetDeferral
#endif /* WIDL_using_Windows_UI_Text_Core */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgs_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * ICoreTextFormatUpdatingEventArgs interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs, 0x7310bd33, 0xb4a8, 0x43b1, 0xb3,0x7b, 0x07,0x24,0xd4,0xac,0xa7,0xab);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    MIDL_INTERFACE("7310bd33-b4a8-43b1-b37b-0724d4aca7ab")
                    ICoreTextFormatUpdatingEventArgs : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE get_Range(
                            ABI::Windows::UI::Text::Core::CoreTextRange *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_TextColor(
                            ABI::Windows::Foundation::IReference<ABI::Windows::UI::ViewManagement::UIElementType > **value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_BackgroundColor(
                            ABI::Windows::Foundation::IReference<ABI::Windows::UI::ViewManagement::UIElementType > **value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_UnderlineColor(
                            ABI::Windows::Foundation::IReference<ABI::Windows::UI::ViewManagement::UIElementType > **value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_UnderlineType(
                            ABI::Windows::Foundation::IReference<ABI::Windows::UI::Text::UnderlineType > **value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_Reason(
                            ABI::Windows::UI::Text::Core::CoreTextFormatUpdatingReason *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_Result(
                            ABI::Windows::UI::Text::Core::CoreTextFormatUpdatingResult *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE put_Result(
                            ABI::Windows::UI::Text::Core::CoreTextFormatUpdatingResult value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_IsCanceled(
                            boolean *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE GetDeferral(
                            ABI::Windows::Foundation::IDeferral **value) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs, 0x7310bd33, 0xb4a8, 0x43b1, 0xb3,0x7b, 0x07,0x24,0xd4,0xac,0xa7,0xab)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs *This,
        TrustLevel *trustLevel);

    /*** ICoreTextFormatUpdatingEventArgs methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Range)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs *This,
        __x_ABI_CWindows_CUI_CText_CCore_CCoreTextRange *value);

    HRESULT (STDMETHODCALLTYPE *get_TextColor)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs *This,
        __FIReference_1_UIElementType **value);

    HRESULT (STDMETHODCALLTYPE *get_BackgroundColor)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs *This,
        __FIReference_1_UIElementType **value);

    HRESULT (STDMETHODCALLTYPE *get_UnderlineColor)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs *This,
        __FIReference_1_UIElementType **value);

    HRESULT (STDMETHODCALLTYPE *get_UnderlineType)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs *This,
        __FIReference_1_UnderlineType **value);

    HRESULT (STDMETHODCALLTYPE *get_Reason)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs *This,
        __x_ABI_CWindows_CUI_CText_CCore_CCoreTextFormatUpdatingReason *value);

    HRESULT (STDMETHODCALLTYPE *get_Result)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs *This,
        __x_ABI_CWindows_CUI_CText_CCore_CCoreTextFormatUpdatingResult *value);

    HRESULT (STDMETHODCALLTYPE *put_Result)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs *This,
        __x_ABI_CWindows_CUI_CText_CCore_CCoreTextFormatUpdatingResult value);

    HRESULT (STDMETHODCALLTYPE *get_IsCanceled)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *GetDeferral)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs *This,
        __x_ABI_CWindows_CFoundation_CIDeferral **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgsVtbl;

interface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs {
    CONST_VTBL __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ICoreTextFormatUpdatingEventArgs methods ***/
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs_get_Range(This,value) (This)->lpVtbl->get_Range(This,value)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs_get_TextColor(This,value) (This)->lpVtbl->get_TextColor(This,value)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs_get_BackgroundColor(This,value) (This)->lpVtbl->get_BackgroundColor(This,value)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs_get_UnderlineColor(This,value) (This)->lpVtbl->get_UnderlineColor(This,value)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs_get_UnderlineType(This,value) (This)->lpVtbl->get_UnderlineType(This,value)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs_get_Reason(This,value) (This)->lpVtbl->get_Reason(This,value)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs_get_Result(This,value) (This)->lpVtbl->get_Result(This,value)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs_put_Result(This,value) (This)->lpVtbl->put_Result(This,value)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs_get_IsCanceled(This,value) (This)->lpVtbl->get_IsCanceled(This,value)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs_GetDeferral(This,value) (This)->lpVtbl->GetDeferral(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs_QueryInterface(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs_AddRef(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs_Release(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs_GetIids(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs_GetTrustLevel(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ICoreTextFormatUpdatingEventArgs methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs_get_Range(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs* This,__x_ABI_CWindows_CUI_CText_CCore_CCoreTextRange *value) {
    return This->lpVtbl->get_Range(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs_get_TextColor(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs* This,__FIReference_1_UIElementType **value) {
    return This->lpVtbl->get_TextColor(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs_get_BackgroundColor(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs* This,__FIReference_1_UIElementType **value) {
    return This->lpVtbl->get_BackgroundColor(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs_get_UnderlineColor(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs* This,__FIReference_1_UIElementType **value) {
    return This->lpVtbl->get_UnderlineColor(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs_get_UnderlineType(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs* This,__FIReference_1_UnderlineType **value) {
    return This->lpVtbl->get_UnderlineType(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs_get_Reason(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs* This,__x_ABI_CWindows_CUI_CText_CCore_CCoreTextFormatUpdatingReason *value) {
    return This->lpVtbl->get_Reason(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs_get_Result(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs* This,__x_ABI_CWindows_CUI_CText_CCore_CCoreTextFormatUpdatingResult *value) {
    return This->lpVtbl->get_Result(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs_put_Result(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs* This,__x_ABI_CWindows_CUI_CText_CCore_CCoreTextFormatUpdatingResult value) {
    return This->lpVtbl->put_Result(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs_get_IsCanceled(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs* This,boolean *value) {
    return This->lpVtbl->get_IsCanceled(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs_GetDeferral(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs* This,__x_ABI_CWindows_CFoundation_CIDeferral **value) {
    return This->lpVtbl->GetDeferral(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Text_Core
#define IID_ICoreTextFormatUpdatingEventArgs IID___x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs
#define ICoreTextFormatUpdatingEventArgsVtbl __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgsVtbl
#define ICoreTextFormatUpdatingEventArgs __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs
#define ICoreTextFormatUpdatingEventArgs_QueryInterface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs_QueryInterface
#define ICoreTextFormatUpdatingEventArgs_AddRef __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs_AddRef
#define ICoreTextFormatUpdatingEventArgs_Release __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs_Release
#define ICoreTextFormatUpdatingEventArgs_GetIids __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs_GetIids
#define ICoreTextFormatUpdatingEventArgs_GetRuntimeClassName __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs_GetRuntimeClassName
#define ICoreTextFormatUpdatingEventArgs_GetTrustLevel __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs_GetTrustLevel
#define ICoreTextFormatUpdatingEventArgs_get_Range __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs_get_Range
#define ICoreTextFormatUpdatingEventArgs_get_TextColor __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs_get_TextColor
#define ICoreTextFormatUpdatingEventArgs_get_BackgroundColor __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs_get_BackgroundColor
#define ICoreTextFormatUpdatingEventArgs_get_UnderlineColor __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs_get_UnderlineColor
#define ICoreTextFormatUpdatingEventArgs_get_UnderlineType __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs_get_UnderlineType
#define ICoreTextFormatUpdatingEventArgs_get_Reason __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs_get_Reason
#define ICoreTextFormatUpdatingEventArgs_get_Result __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs_get_Result
#define ICoreTextFormatUpdatingEventArgs_put_Result __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs_put_Result
#define ICoreTextFormatUpdatingEventArgs_get_IsCanceled __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs_get_IsCanceled
#define ICoreTextFormatUpdatingEventArgs_GetDeferral __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs_GetDeferral
#endif /* WIDL_using_Windows_UI_Text_Core */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * ICoreTextSelectionUpdatingEventArgs interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs, 0xd445839f, 0xfe7f, 0x4bd5, 0x8a,0x26, 0x09,0x22,0xc1,0xb3,0xe6,0x39);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    MIDL_INTERFACE("d445839f-fe7f-4bd5-8a26-0922c1b3e639")
                    ICoreTextSelectionUpdatingEventArgs : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE get_Selection(
                            ABI::Windows::UI::Text::Core::CoreTextRange *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_Result(
                            ABI::Windows::UI::Text::Core::CoreTextSelectionUpdatingResult *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE put_Result(
                            ABI::Windows::UI::Text::Core::CoreTextSelectionUpdatingResult value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_IsCanceled(
                            boolean *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE GetDeferral(
                            ABI::Windows::Foundation::IDeferral **value) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs, 0xd445839f, 0xfe7f, 0x4bd5, 0x8a,0x26, 0x09,0x22,0xc1,0xb3,0xe6,0x39)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs *This,
        TrustLevel *trustLevel);

    /*** ICoreTextSelectionUpdatingEventArgs methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Selection)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs *This,
        __x_ABI_CWindows_CUI_CText_CCore_CCoreTextRange *value);

    HRESULT (STDMETHODCALLTYPE *get_Result)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs *This,
        __x_ABI_CWindows_CUI_CText_CCore_CCoreTextSelectionUpdatingResult *value);

    HRESULT (STDMETHODCALLTYPE *put_Result)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs *This,
        __x_ABI_CWindows_CUI_CText_CCore_CCoreTextSelectionUpdatingResult value);

    HRESULT (STDMETHODCALLTYPE *get_IsCanceled)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *GetDeferral)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs *This,
        __x_ABI_CWindows_CFoundation_CIDeferral **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgsVtbl;

interface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs {
    CONST_VTBL __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ICoreTextSelectionUpdatingEventArgs methods ***/
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs_get_Selection(This,value) (This)->lpVtbl->get_Selection(This,value)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs_get_Result(This,value) (This)->lpVtbl->get_Result(This,value)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs_put_Result(This,value) (This)->lpVtbl->put_Result(This,value)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs_get_IsCanceled(This,value) (This)->lpVtbl->get_IsCanceled(This,value)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs_GetDeferral(This,value) (This)->lpVtbl->GetDeferral(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs_QueryInterface(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs_AddRef(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs_Release(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs_GetIids(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs_GetTrustLevel(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ICoreTextSelectionUpdatingEventArgs methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs_get_Selection(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs* This,__x_ABI_CWindows_CUI_CText_CCore_CCoreTextRange *value) {
    return This->lpVtbl->get_Selection(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs_get_Result(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs* This,__x_ABI_CWindows_CUI_CText_CCore_CCoreTextSelectionUpdatingResult *value) {
    return This->lpVtbl->get_Result(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs_put_Result(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs* This,__x_ABI_CWindows_CUI_CText_CCore_CCoreTextSelectionUpdatingResult value) {
    return This->lpVtbl->put_Result(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs_get_IsCanceled(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs* This,boolean *value) {
    return This->lpVtbl->get_IsCanceled(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs_GetDeferral(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs* This,__x_ABI_CWindows_CFoundation_CIDeferral **value) {
    return This->lpVtbl->GetDeferral(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Text_Core
#define IID_ICoreTextSelectionUpdatingEventArgs IID___x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs
#define ICoreTextSelectionUpdatingEventArgsVtbl __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgsVtbl
#define ICoreTextSelectionUpdatingEventArgs __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs
#define ICoreTextSelectionUpdatingEventArgs_QueryInterface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs_QueryInterface
#define ICoreTextSelectionUpdatingEventArgs_AddRef __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs_AddRef
#define ICoreTextSelectionUpdatingEventArgs_Release __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs_Release
#define ICoreTextSelectionUpdatingEventArgs_GetIids __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs_GetIids
#define ICoreTextSelectionUpdatingEventArgs_GetRuntimeClassName __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs_GetRuntimeClassName
#define ICoreTextSelectionUpdatingEventArgs_GetTrustLevel __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs_GetTrustLevel
#define ICoreTextSelectionUpdatingEventArgs_get_Selection __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs_get_Selection
#define ICoreTextSelectionUpdatingEventArgs_get_Result __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs_get_Result
#define ICoreTextSelectionUpdatingEventArgs_put_Result __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs_put_Result
#define ICoreTextSelectionUpdatingEventArgs_get_IsCanceled __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs_get_IsCanceled
#define ICoreTextSelectionUpdatingEventArgs_GetDeferral __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs_GetDeferral
#endif /* WIDL_using_Windows_UI_Text_Core */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * ICoreTextTextUpdatingEventArgs interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs, 0xeea7918d, 0xcc2b, 0x4f03, 0x8f,0xf6, 0x02,0xfd,0x21,0x7d,0xb4,0x50);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    MIDL_INTERFACE("eea7918d-cc2b-4f03-8ff6-02fd217db450")
                    ICoreTextTextUpdatingEventArgs : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE get_Range(
                            ABI::Windows::UI::Text::Core::CoreTextRange *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_Text(
                            HSTRING *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_NewSelection(
                            ABI::Windows::UI::Text::Core::CoreTextRange *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_InputLanguage(
                            ABI::Windows::Globalization::ILanguage **value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_Result(
                            ABI::Windows::UI::Text::Core::CoreTextTextUpdatingResult *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE put_Result(
                            ABI::Windows::UI::Text::Core::CoreTextTextUpdatingResult value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_IsCanceled(
                            boolean *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE GetDeferral(
                            ABI::Windows::Foundation::IDeferral **value) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs, 0xeea7918d, 0xcc2b, 0x4f03, 0x8f,0xf6, 0x02,0xfd,0x21,0x7d,0xb4,0x50)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs *This,
        TrustLevel *trustLevel);

    /*** ICoreTextTextUpdatingEventArgs methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Range)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs *This,
        __x_ABI_CWindows_CUI_CText_CCore_CCoreTextRange *value);

    HRESULT (STDMETHODCALLTYPE *get_Text)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_NewSelection)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs *This,
        __x_ABI_CWindows_CUI_CText_CCore_CCoreTextRange *value);

    HRESULT (STDMETHODCALLTYPE *get_InputLanguage)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs *This,
        __x_ABI_CWindows_CGlobalization_CILanguage **value);

    HRESULT (STDMETHODCALLTYPE *get_Result)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs *This,
        __x_ABI_CWindows_CUI_CText_CCore_CCoreTextTextUpdatingResult *value);

    HRESULT (STDMETHODCALLTYPE *put_Result)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs *This,
        __x_ABI_CWindows_CUI_CText_CCore_CCoreTextTextUpdatingResult value);

    HRESULT (STDMETHODCALLTYPE *get_IsCanceled)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *GetDeferral)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs *This,
        __x_ABI_CWindows_CFoundation_CIDeferral **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgsVtbl;

interface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs {
    CONST_VTBL __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ICoreTextTextUpdatingEventArgs methods ***/
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs_get_Range(This,value) (This)->lpVtbl->get_Range(This,value)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs_get_Text(This,value) (This)->lpVtbl->get_Text(This,value)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs_get_NewSelection(This,value) (This)->lpVtbl->get_NewSelection(This,value)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs_get_InputLanguage(This,value) (This)->lpVtbl->get_InputLanguage(This,value)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs_get_Result(This,value) (This)->lpVtbl->get_Result(This,value)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs_put_Result(This,value) (This)->lpVtbl->put_Result(This,value)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs_get_IsCanceled(This,value) (This)->lpVtbl->get_IsCanceled(This,value)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs_GetDeferral(This,value) (This)->lpVtbl->GetDeferral(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs_QueryInterface(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs_AddRef(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs_Release(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs_GetIids(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs_GetTrustLevel(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ICoreTextTextUpdatingEventArgs methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs_get_Range(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs* This,__x_ABI_CWindows_CUI_CText_CCore_CCoreTextRange *value) {
    return This->lpVtbl->get_Range(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs_get_Text(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs* This,HSTRING *value) {
    return This->lpVtbl->get_Text(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs_get_NewSelection(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs* This,__x_ABI_CWindows_CUI_CText_CCore_CCoreTextRange *value) {
    return This->lpVtbl->get_NewSelection(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs_get_InputLanguage(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs* This,__x_ABI_CWindows_CGlobalization_CILanguage **value) {
    return This->lpVtbl->get_InputLanguage(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs_get_Result(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs* This,__x_ABI_CWindows_CUI_CText_CCore_CCoreTextTextUpdatingResult *value) {
    return This->lpVtbl->get_Result(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs_put_Result(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs* This,__x_ABI_CWindows_CUI_CText_CCore_CCoreTextTextUpdatingResult value) {
    return This->lpVtbl->put_Result(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs_get_IsCanceled(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs* This,boolean *value) {
    return This->lpVtbl->get_IsCanceled(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs_GetDeferral(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs* This,__x_ABI_CWindows_CFoundation_CIDeferral **value) {
    return This->lpVtbl->GetDeferral(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Text_Core
#define IID_ICoreTextTextUpdatingEventArgs IID___x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs
#define ICoreTextTextUpdatingEventArgsVtbl __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgsVtbl
#define ICoreTextTextUpdatingEventArgs __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs
#define ICoreTextTextUpdatingEventArgs_QueryInterface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs_QueryInterface
#define ICoreTextTextUpdatingEventArgs_AddRef __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs_AddRef
#define ICoreTextTextUpdatingEventArgs_Release __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs_Release
#define ICoreTextTextUpdatingEventArgs_GetIids __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs_GetIids
#define ICoreTextTextUpdatingEventArgs_GetRuntimeClassName __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs_GetRuntimeClassName
#define ICoreTextTextUpdatingEventArgs_GetTrustLevel __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs_GetTrustLevel
#define ICoreTextTextUpdatingEventArgs_get_Range __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs_get_Range
#define ICoreTextTextUpdatingEventArgs_get_Text __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs_get_Text
#define ICoreTextTextUpdatingEventArgs_get_NewSelection __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs_get_NewSelection
#define ICoreTextTextUpdatingEventArgs_get_InputLanguage __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs_get_InputLanguage
#define ICoreTextTextUpdatingEventArgs_get_Result __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs_get_Result
#define ICoreTextTextUpdatingEventArgs_put_Result __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs_put_Result
#define ICoreTextTextUpdatingEventArgs_get_IsCanceled __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs_get_IsCanceled
#define ICoreTextTextUpdatingEventArgs_GetDeferral __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs_GetDeferral
#endif /* WIDL_using_Windows_UI_Text_Core */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * ICoreTextLayoutBounds interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds, 0xe972c974, 0x4436, 0x4917, 0x80,0xd0, 0xa5,0x25,0xe4,0xca,0x67,0x80);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    MIDL_INTERFACE("e972c974-4436-4917-80d0-a525e4ca6780")
                    ICoreTextLayoutBounds : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE get_TextBounds(
                            ABI::Windows::Foundation::Rect *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE put_TextBounds(
                            ABI::Windows::Foundation::Rect value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_ControlBounds(
                            ABI::Windows::Foundation::Rect *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE put_ControlBounds(
                            ABI::Windows::Foundation::Rect value) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds, 0xe972c974, 0x4436, 0x4917, 0x80,0xd0, 0xa5,0x25,0xe4,0xca,0x67,0x80)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBoundsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds *This,
        TrustLevel *trustLevel);

    /*** ICoreTextLayoutBounds methods ***/
    HRESULT (STDMETHODCALLTYPE *get_TextBounds)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds *This,
        __x_ABI_CWindows_CFoundation_CRect *value);

    HRESULT (STDMETHODCALLTYPE *put_TextBounds)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds *This,
        __x_ABI_CWindows_CFoundation_CRect value);

    HRESULT (STDMETHODCALLTYPE *get_ControlBounds)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds *This,
        __x_ABI_CWindows_CFoundation_CRect *value);

    HRESULT (STDMETHODCALLTYPE *put_ControlBounds)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds *This,
        __x_ABI_CWindows_CFoundation_CRect value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBoundsVtbl;

interface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds {
    CONST_VTBL __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBoundsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ICoreTextLayoutBounds methods ***/
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds_get_TextBounds(This,value) (This)->lpVtbl->get_TextBounds(This,value)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds_put_TextBounds(This,value) (This)->lpVtbl->put_TextBounds(This,value)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds_get_ControlBounds(This,value) (This)->lpVtbl->get_ControlBounds(This,value)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds_put_ControlBounds(This,value) (This)->lpVtbl->put_ControlBounds(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds_QueryInterface(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds_AddRef(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds_Release(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds_GetIids(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds_GetRuntimeClassName(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds_GetTrustLevel(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ICoreTextLayoutBounds methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds_get_TextBounds(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds* This,__x_ABI_CWindows_CFoundation_CRect *value) {
    return This->lpVtbl->get_TextBounds(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds_put_TextBounds(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds* This,__x_ABI_CWindows_CFoundation_CRect value) {
    return This->lpVtbl->put_TextBounds(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds_get_ControlBounds(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds* This,__x_ABI_CWindows_CFoundation_CRect *value) {
    return This->lpVtbl->get_ControlBounds(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds_put_ControlBounds(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds* This,__x_ABI_CWindows_CFoundation_CRect value) {
    return This->lpVtbl->put_ControlBounds(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Text_Core
#define IID_ICoreTextLayoutBounds IID___x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds
#define ICoreTextLayoutBoundsVtbl __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBoundsVtbl
#define ICoreTextLayoutBounds __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds
#define ICoreTextLayoutBounds_QueryInterface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds_QueryInterface
#define ICoreTextLayoutBounds_AddRef __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds_AddRef
#define ICoreTextLayoutBounds_Release __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds_Release
#define ICoreTextLayoutBounds_GetIids __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds_GetIids
#define ICoreTextLayoutBounds_GetRuntimeClassName __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds_GetRuntimeClassName
#define ICoreTextLayoutBounds_GetTrustLevel __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds_GetTrustLevel
#define ICoreTextLayoutBounds_get_TextBounds __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds_get_TextBounds
#define ICoreTextLayoutBounds_put_TextBounds __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds_put_TextBounds
#define ICoreTextLayoutBounds_get_ControlBounds __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds_get_ControlBounds
#define ICoreTextLayoutBounds_put_ControlBounds __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds_put_ControlBounds
#endif /* WIDL_using_Windows_UI_Text_Core */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * ICoreTextLayoutRequest interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest, 0x2555a8cc, 0x51fd, 0x4f03, 0x98,0xbf, 0xac,0x78,0x17,0x4d,0x68,0xe0);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    MIDL_INTERFACE("2555a8cc-51fd-4f03-98bf-ac78174d68e0")
                    ICoreTextLayoutRequest : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE get_Range(
                            ABI::Windows::UI::Text::Core::CoreTextRange *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_LayoutBounds(
                            ABI::Windows::UI::Text::Core::ICoreTextLayoutBounds **value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_IsCanceled(
                            boolean *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE GetDeferral(
                            ABI::Windows::Foundation::IDeferral **value) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest, 0x2555a8cc, 0x51fd, 0x4f03, 0x98,0xbf, 0xac,0x78,0x17,0x4d,0x68,0xe0)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest *This,
        TrustLevel *trustLevel);

    /*** ICoreTextLayoutRequest methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Range)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest *This,
        __x_ABI_CWindows_CUI_CText_CCore_CCoreTextRange *value);

    HRESULT (STDMETHODCALLTYPE *get_LayoutBounds)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest *This,
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds **value);

    HRESULT (STDMETHODCALLTYPE *get_IsCanceled)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *GetDeferral)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest *This,
        __x_ABI_CWindows_CFoundation_CIDeferral **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestVtbl;

interface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest {
    CONST_VTBL __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ICoreTextLayoutRequest methods ***/
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest_get_Range(This,value) (This)->lpVtbl->get_Range(This,value)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest_get_LayoutBounds(This,value) (This)->lpVtbl->get_LayoutBounds(This,value)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest_get_IsCanceled(This,value) (This)->lpVtbl->get_IsCanceled(This,value)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest_GetDeferral(This,value) (This)->lpVtbl->GetDeferral(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest_QueryInterface(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest_AddRef(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest_Release(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest_GetIids(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest_GetRuntimeClassName(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest_GetTrustLevel(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ICoreTextLayoutRequest methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest_get_Range(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest* This,__x_ABI_CWindows_CUI_CText_CCore_CCoreTextRange *value) {
    return This->lpVtbl->get_Range(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest_get_LayoutBounds(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest* This,__x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutBounds **value) {
    return This->lpVtbl->get_LayoutBounds(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest_get_IsCanceled(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest* This,boolean *value) {
    return This->lpVtbl->get_IsCanceled(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest_GetDeferral(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest* This,__x_ABI_CWindows_CFoundation_CIDeferral **value) {
    return This->lpVtbl->GetDeferral(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Text_Core
#define IID_ICoreTextLayoutRequest IID___x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest
#define ICoreTextLayoutRequestVtbl __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestVtbl
#define ICoreTextLayoutRequest __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest
#define ICoreTextLayoutRequest_QueryInterface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest_QueryInterface
#define ICoreTextLayoutRequest_AddRef __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest_AddRef
#define ICoreTextLayoutRequest_Release __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest_Release
#define ICoreTextLayoutRequest_GetIids __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest_GetIids
#define ICoreTextLayoutRequest_GetRuntimeClassName __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest_GetRuntimeClassName
#define ICoreTextLayoutRequest_GetTrustLevel __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest_GetTrustLevel
#define ICoreTextLayoutRequest_get_Range __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest_get_Range
#define ICoreTextLayoutRequest_get_LayoutBounds __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest_get_LayoutBounds
#define ICoreTextLayoutRequest_get_IsCanceled __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest_get_IsCanceled
#define ICoreTextLayoutRequest_GetDeferral __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest_GetDeferral
#endif /* WIDL_using_Windows_UI_Text_Core */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * ICoreTextLayoutRequestedEventArgs interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestedEventArgs_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestedEventArgs, 0xb1dc6ae0, 0x9a7b, 0x4e9e, 0xa5,0x66, 0x4a,0x6b,0x5f,0x8a,0xd6,0x76);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    MIDL_INTERFACE("b1dc6ae0-9a7b-4e9e-a566-4a6b5f8ad676")
                    ICoreTextLayoutRequestedEventArgs : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE get_Request(
                            ABI::Windows::UI::Text::Core::ICoreTextLayoutRequest **value) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestedEventArgs, 0xb1dc6ae0, 0x9a7b, 0x4e9e, 0xa5,0x66, 0x4a,0x6b,0x5f,0x8a,0xd6,0x76)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestedEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestedEventArgs *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestedEventArgs *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestedEventArgs *This,
        TrustLevel *trustLevel);

    /*** ICoreTextLayoutRequestedEventArgs methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Request)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestedEventArgs *This,
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestedEventArgsVtbl;

interface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestedEventArgs {
    CONST_VTBL __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestedEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestedEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestedEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ICoreTextLayoutRequestedEventArgs methods ***/
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestedEventArgs_get_Request(This,value) (This)->lpVtbl->get_Request(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestedEventArgs_QueryInterface(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestedEventArgs_AddRef(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestedEventArgs_Release(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestedEventArgs_GetIids(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestedEventArgs* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestedEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestedEventArgs* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestedEventArgs_GetTrustLevel(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestedEventArgs* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ICoreTextLayoutRequestedEventArgs methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestedEventArgs_get_Request(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestedEventArgs* This,__x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequest **value) {
    return This->lpVtbl->get_Request(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Text_Core
#define IID_ICoreTextLayoutRequestedEventArgs IID___x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestedEventArgs
#define ICoreTextLayoutRequestedEventArgsVtbl __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestedEventArgsVtbl
#define ICoreTextLayoutRequestedEventArgs __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestedEventArgs
#define ICoreTextLayoutRequestedEventArgs_QueryInterface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestedEventArgs_QueryInterface
#define ICoreTextLayoutRequestedEventArgs_AddRef __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestedEventArgs_AddRef
#define ICoreTextLayoutRequestedEventArgs_Release __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestedEventArgs_Release
#define ICoreTextLayoutRequestedEventArgs_GetIids __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestedEventArgs_GetIids
#define ICoreTextLayoutRequestedEventArgs_GetRuntimeClassName __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestedEventArgs_GetRuntimeClassName
#define ICoreTextLayoutRequestedEventArgs_GetTrustLevel __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestedEventArgs_GetTrustLevel
#define ICoreTextLayoutRequestedEventArgs_get_Request __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestedEventArgs_get_Request
#endif /* WIDL_using_Windows_UI_Text_Core */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestedEventArgs_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * ICoreTextSelectionRequest interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest, 0xf0a70403, 0x208b, 0x4301, 0x88,0x3c, 0x74,0xca,0x74,0x85,0xfd,0x8d);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    MIDL_INTERFACE("f0a70403-208b-4301-883c-74ca7485fd8d")
                    ICoreTextSelectionRequest : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE get_Selection(
                            ABI::Windows::UI::Text::Core::CoreTextRange *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE put_Selection(
                            ABI::Windows::UI::Text::Core::CoreTextRange value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_IsCanceled(
                            boolean *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE GetDeferral(
                            ABI::Windows::Foundation::IDeferral **value) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest, 0xf0a70403, 0x208b, 0x4301, 0x88,0x3c, 0x74,0xca,0x74,0x85,0xfd,0x8d)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest *This,
        TrustLevel *trustLevel);

    /*** ICoreTextSelectionRequest methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Selection)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest *This,
        __x_ABI_CWindows_CUI_CText_CCore_CCoreTextRange *value);

    HRESULT (STDMETHODCALLTYPE *put_Selection)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest *This,
        __x_ABI_CWindows_CUI_CText_CCore_CCoreTextRange value);

    HRESULT (STDMETHODCALLTYPE *get_IsCanceled)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *GetDeferral)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest *This,
        __x_ABI_CWindows_CFoundation_CIDeferral **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestVtbl;

interface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest {
    CONST_VTBL __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ICoreTextSelectionRequest methods ***/
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest_get_Selection(This,value) (This)->lpVtbl->get_Selection(This,value)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest_put_Selection(This,value) (This)->lpVtbl->put_Selection(This,value)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest_get_IsCanceled(This,value) (This)->lpVtbl->get_IsCanceled(This,value)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest_GetDeferral(This,value) (This)->lpVtbl->GetDeferral(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest_QueryInterface(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest_AddRef(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest_Release(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest_GetIids(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest_GetRuntimeClassName(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest_GetTrustLevel(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ICoreTextSelectionRequest methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest_get_Selection(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest* This,__x_ABI_CWindows_CUI_CText_CCore_CCoreTextRange *value) {
    return This->lpVtbl->get_Selection(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest_put_Selection(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest* This,__x_ABI_CWindows_CUI_CText_CCore_CCoreTextRange value) {
    return This->lpVtbl->put_Selection(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest_get_IsCanceled(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest* This,boolean *value) {
    return This->lpVtbl->get_IsCanceled(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest_GetDeferral(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest* This,__x_ABI_CWindows_CFoundation_CIDeferral **value) {
    return This->lpVtbl->GetDeferral(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Text_Core
#define IID_ICoreTextSelectionRequest IID___x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest
#define ICoreTextSelectionRequestVtbl __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestVtbl
#define ICoreTextSelectionRequest __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest
#define ICoreTextSelectionRequest_QueryInterface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest_QueryInterface
#define ICoreTextSelectionRequest_AddRef __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest_AddRef
#define ICoreTextSelectionRequest_Release __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest_Release
#define ICoreTextSelectionRequest_GetIids __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest_GetIids
#define ICoreTextSelectionRequest_GetRuntimeClassName __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest_GetRuntimeClassName
#define ICoreTextSelectionRequest_GetTrustLevel __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest_GetTrustLevel
#define ICoreTextSelectionRequest_get_Selection __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest_get_Selection
#define ICoreTextSelectionRequest_put_Selection __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest_put_Selection
#define ICoreTextSelectionRequest_get_IsCanceled __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest_get_IsCanceled
#define ICoreTextSelectionRequest_GetDeferral __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest_GetDeferral
#endif /* WIDL_using_Windows_UI_Text_Core */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * ICoreTextSelectionRequestedEventArgs interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestedEventArgs_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestedEventArgs, 0x13c6682b, 0xf614, 0x421a, 0x8f,0x4b, 0x9e,0xc8,0xa5,0xa3,0x7f,0xcd);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    MIDL_INTERFACE("13c6682b-f614-421a-8f4b-9ec8a5a37fcd")
                    ICoreTextSelectionRequestedEventArgs : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE get_Request(
                            ABI::Windows::UI::Text::Core::ICoreTextSelectionRequest **value) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestedEventArgs, 0x13c6682b, 0xf614, 0x421a, 0x8f,0x4b, 0x9e,0xc8,0xa5,0xa3,0x7f,0xcd)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestedEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestedEventArgs *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestedEventArgs *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestedEventArgs *This,
        TrustLevel *trustLevel);

    /*** ICoreTextSelectionRequestedEventArgs methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Request)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestedEventArgs *This,
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestedEventArgsVtbl;

interface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestedEventArgs {
    CONST_VTBL __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestedEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestedEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestedEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ICoreTextSelectionRequestedEventArgs methods ***/
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestedEventArgs_get_Request(This,value) (This)->lpVtbl->get_Request(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestedEventArgs_QueryInterface(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestedEventArgs_AddRef(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestedEventArgs_Release(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestedEventArgs_GetIids(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestedEventArgs* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestedEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestedEventArgs* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestedEventArgs_GetTrustLevel(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestedEventArgs* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ICoreTextSelectionRequestedEventArgs methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestedEventArgs_get_Request(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestedEventArgs* This,__x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequest **value) {
    return This->lpVtbl->get_Request(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Text_Core
#define IID_ICoreTextSelectionRequestedEventArgs IID___x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestedEventArgs
#define ICoreTextSelectionRequestedEventArgsVtbl __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestedEventArgsVtbl
#define ICoreTextSelectionRequestedEventArgs __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestedEventArgs
#define ICoreTextSelectionRequestedEventArgs_QueryInterface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestedEventArgs_QueryInterface
#define ICoreTextSelectionRequestedEventArgs_AddRef __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestedEventArgs_AddRef
#define ICoreTextSelectionRequestedEventArgs_Release __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestedEventArgs_Release
#define ICoreTextSelectionRequestedEventArgs_GetIids __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestedEventArgs_GetIids
#define ICoreTextSelectionRequestedEventArgs_GetRuntimeClassName __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestedEventArgs_GetRuntimeClassName
#define ICoreTextSelectionRequestedEventArgs_GetTrustLevel __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestedEventArgs_GetTrustLevel
#define ICoreTextSelectionRequestedEventArgs_get_Request __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestedEventArgs_get_Request
#endif /* WIDL_using_Windows_UI_Text_Core */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestedEventArgs_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * ICoreTextTextRequest interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest, 0x50d950a9, 0xf51e, 0x4cc1, 0x8c,0xa1, 0xe6,0x34,0x6d,0x1a,0x61,0xbe);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    MIDL_INTERFACE("50d950a9-f51e-4cc1-8ca1-e6346d1a61be")
                    ICoreTextTextRequest : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE get_Range(
                            ABI::Windows::UI::Text::Core::CoreTextRange *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_Text(
                            HSTRING *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE put_Text(
                            HSTRING value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_IsCanceled(
                            boolean *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE GetDeferral(
                            ABI::Windows::Foundation::IDeferral **value) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest, 0x50d950a9, 0xf51e, 0x4cc1, 0x8c,0xa1, 0xe6,0x34,0x6d,0x1a,0x61,0xbe)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest *This,
        TrustLevel *trustLevel);

    /*** ICoreTextTextRequest methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Range)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest *This,
        __x_ABI_CWindows_CUI_CText_CCore_CCoreTextRange *value);

    HRESULT (STDMETHODCALLTYPE *get_Text)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *put_Text)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest *This,
        HSTRING value);

    HRESULT (STDMETHODCALLTYPE *get_IsCanceled)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *GetDeferral)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest *This,
        __x_ABI_CWindows_CFoundation_CIDeferral **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestVtbl;

interface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest {
    CONST_VTBL __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ICoreTextTextRequest methods ***/
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest_get_Range(This,value) (This)->lpVtbl->get_Range(This,value)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest_get_Text(This,value) (This)->lpVtbl->get_Text(This,value)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest_put_Text(This,value) (This)->lpVtbl->put_Text(This,value)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest_get_IsCanceled(This,value) (This)->lpVtbl->get_IsCanceled(This,value)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest_GetDeferral(This,value) (This)->lpVtbl->GetDeferral(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest_QueryInterface(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest_AddRef(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest_Release(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest_GetIids(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest_GetRuntimeClassName(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest_GetTrustLevel(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ICoreTextTextRequest methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest_get_Range(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest* This,__x_ABI_CWindows_CUI_CText_CCore_CCoreTextRange *value) {
    return This->lpVtbl->get_Range(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest_get_Text(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest* This,HSTRING *value) {
    return This->lpVtbl->get_Text(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest_put_Text(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest* This,HSTRING value) {
    return This->lpVtbl->put_Text(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest_get_IsCanceled(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest* This,boolean *value) {
    return This->lpVtbl->get_IsCanceled(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest_GetDeferral(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest* This,__x_ABI_CWindows_CFoundation_CIDeferral **value) {
    return This->lpVtbl->GetDeferral(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Text_Core
#define IID_ICoreTextTextRequest IID___x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest
#define ICoreTextTextRequestVtbl __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestVtbl
#define ICoreTextTextRequest __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest
#define ICoreTextTextRequest_QueryInterface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest_QueryInterface
#define ICoreTextTextRequest_AddRef __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest_AddRef
#define ICoreTextTextRequest_Release __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest_Release
#define ICoreTextTextRequest_GetIids __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest_GetIids
#define ICoreTextTextRequest_GetRuntimeClassName __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest_GetRuntimeClassName
#define ICoreTextTextRequest_GetTrustLevel __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest_GetTrustLevel
#define ICoreTextTextRequest_get_Range __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest_get_Range
#define ICoreTextTextRequest_get_Text __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest_get_Text
#define ICoreTextTextRequest_put_Text __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest_put_Text
#define ICoreTextTextRequest_get_IsCanceled __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest_get_IsCanceled
#define ICoreTextTextRequest_GetDeferral __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest_GetDeferral
#endif /* WIDL_using_Windows_UI_Text_Core */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * ICoreTextTextRequestedEventArgs interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestedEventArgs_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestedEventArgs, 0xf096a2d0, 0x41c6, 0x4c02, 0x8b,0x1a, 0xd9,0x53,0xb0,0x0c,0xab,0xb3);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    MIDL_INTERFACE("f096a2d0-41c6-4c02-8b1a-d953b00cabb3")
                    ICoreTextTextRequestedEventArgs : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE get_Request(
                            ABI::Windows::UI::Text::Core::ICoreTextTextRequest **value) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestedEventArgs, 0xf096a2d0, 0x41c6, 0x4c02, 0x8b,0x1a, 0xd9,0x53,0xb0,0x0c,0xab,0xb3)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestedEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestedEventArgs *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestedEventArgs *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestedEventArgs *This,
        TrustLevel *trustLevel);

    /*** ICoreTextTextRequestedEventArgs methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Request)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestedEventArgs *This,
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestedEventArgsVtbl;

interface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestedEventArgs {
    CONST_VTBL __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestedEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestedEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestedEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ICoreTextTextRequestedEventArgs methods ***/
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestedEventArgs_get_Request(This,value) (This)->lpVtbl->get_Request(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestedEventArgs_QueryInterface(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestedEventArgs_AddRef(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestedEventArgs_Release(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestedEventArgs_GetIids(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestedEventArgs* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestedEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestedEventArgs* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestedEventArgs_GetTrustLevel(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestedEventArgs* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ICoreTextTextRequestedEventArgs methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestedEventArgs_get_Request(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestedEventArgs* This,__x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequest **value) {
    return This->lpVtbl->get_Request(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Text_Core
#define IID_ICoreTextTextRequestedEventArgs IID___x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestedEventArgs
#define ICoreTextTextRequestedEventArgsVtbl __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestedEventArgsVtbl
#define ICoreTextTextRequestedEventArgs __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestedEventArgs
#define ICoreTextTextRequestedEventArgs_QueryInterface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestedEventArgs_QueryInterface
#define ICoreTextTextRequestedEventArgs_AddRef __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestedEventArgs_AddRef
#define ICoreTextTextRequestedEventArgs_Release __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestedEventArgs_Release
#define ICoreTextTextRequestedEventArgs_GetIids __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestedEventArgs_GetIids
#define ICoreTextTextRequestedEventArgs_GetRuntimeClassName __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestedEventArgs_GetRuntimeClassName
#define ICoreTextTextRequestedEventArgs_GetTrustLevel __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestedEventArgs_GetTrustLevel
#define ICoreTextTextRequestedEventArgs_get_Request __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestedEventArgs_get_Request
#endif /* WIDL_using_Windows_UI_Text_Core */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestedEventArgs_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * ICoreTextEditContext interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext, 0xbf6608af, 0x4041, 0x47c3, 0xb2,0x63, 0xa9,0x18,0xeb,0x5e,0xae,0xf2);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    MIDL_INTERFACE("bf6608af-4041-47c3-b263-a918eb5eaef2")
                    ICoreTextEditContext : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE get_Name(
                            HSTRING *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE put_Name(
                            HSTRING value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_InputScope(
                            ABI::Windows::UI::Text::Core::CoreTextInputScope *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE put_InputScope(
                            ABI::Windows::UI::Text::Core::CoreTextInputScope value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_IsReadOnly(
                            boolean *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE put_IsReadOnly(
                            boolean value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_InputPaneDisplayPolicy(
                            ABI::Windows::UI::Text::Core::CoreTextInputPaneDisplayPolicy *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE put_InputPaneDisplayPolicy(
                            ABI::Windows::UI::Text::Core::CoreTextInputPaneDisplayPolicy value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE add_TextRequested(
                            ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,ABI::Windows::UI::Text::Core::CoreTextTextRequestedEventArgs* > *handler,
                            EventRegistrationToken *cookie) = 0;

                        virtual HRESULT STDMETHODCALLTYPE remove_TextRequested(
                            EventRegistrationToken cookie) = 0;

                        virtual HRESULT STDMETHODCALLTYPE add_SelectionRequested(
                            ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,ABI::Windows::UI::Text::Core::CoreTextSelectionRequestedEventArgs* > *handler,
                            EventRegistrationToken *cookie) = 0;

                        virtual HRESULT STDMETHODCALLTYPE remove_SelectionRequested(
                            EventRegistrationToken cookie) = 0;

                        virtual HRESULT STDMETHODCALLTYPE add_LayoutRequested(
                            ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,ABI::Windows::UI::Text::Core::CoreTextLayoutRequestedEventArgs* > *handler,
                            EventRegistrationToken *cookie) = 0;

                        virtual HRESULT STDMETHODCALLTYPE remove_LayoutRequested(
                            EventRegistrationToken cookie) = 0;

                        virtual HRESULT STDMETHODCALLTYPE add_TextUpdating(
                            ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,ABI::Windows::UI::Text::Core::CoreTextTextUpdatingEventArgs* > *handler,
                            EventRegistrationToken *cookie) = 0;

                        virtual HRESULT STDMETHODCALLTYPE remove_TextUpdating(
                            EventRegistrationToken cookie) = 0;

                        virtual HRESULT STDMETHODCALLTYPE add_SelectionUpdating(
                            ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,ABI::Windows::UI::Text::Core::CoreTextSelectionUpdatingEventArgs* > *handler,
                            EventRegistrationToken *cookie) = 0;

                        virtual HRESULT STDMETHODCALLTYPE remove_SelectionUpdating(
                            EventRegistrationToken cookie) = 0;

                        virtual HRESULT STDMETHODCALLTYPE add_FormatUpdating(
                            ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,ABI::Windows::UI::Text::Core::CoreTextFormatUpdatingEventArgs* > *handler,
                            EventRegistrationToken *cookie) = 0;

                        virtual HRESULT STDMETHODCALLTYPE remove_FormatUpdating(
                            EventRegistrationToken cookie) = 0;

                        virtual HRESULT STDMETHODCALLTYPE add_CompositionStarted(
                            ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,ABI::Windows::UI::Text::Core::CoreTextCompositionStartedEventArgs* > *handler,
                            EventRegistrationToken *cookie) = 0;

                        virtual HRESULT STDMETHODCALLTYPE remove_CompositionStarted(
                            EventRegistrationToken cookie) = 0;

                        virtual HRESULT STDMETHODCALLTYPE add_CompositionCompleted(
                            ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,ABI::Windows::UI::Text::Core::CoreTextCompositionCompletedEventArgs* > *handler,
                            EventRegistrationToken *cookie) = 0;

                        virtual HRESULT STDMETHODCALLTYPE remove_CompositionCompleted(
                            EventRegistrationToken cookie) = 0;

                        virtual HRESULT STDMETHODCALLTYPE add_FocusRemoved(
                            ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,IInspectable* > *handler,
                            EventRegistrationToken *cookie) = 0;

                        virtual HRESULT STDMETHODCALLTYPE remove_FocusRemoved(
                            EventRegistrationToken cookie) = 0;

                        virtual HRESULT STDMETHODCALLTYPE NotifyFocusEnter(
                            ) = 0;

                        virtual HRESULT STDMETHODCALLTYPE NotifyFocusLeave(
                            ) = 0;

                        virtual HRESULT STDMETHODCALLTYPE NotifyTextChanged(
                            ABI::Windows::UI::Text::Core::CoreTextRange modifiedRange,
                            INT32 newLength,
                            ABI::Windows::UI::Text::Core::CoreTextRange newSelection) = 0;

                        virtual HRESULT STDMETHODCALLTYPE NotifySelectionChanged(
                            ABI::Windows::UI::Text::Core::CoreTextRange selection) = 0;

                        virtual HRESULT STDMETHODCALLTYPE NotifyLayoutChanged(
                            ) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext, 0xbf6608af, 0x4041, 0x47c3, 0xb2,0x63, 0xa9,0x18,0xeb,0x5e,0xae,0xf2)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContextVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext *This,
        TrustLevel *trustLevel);

    /*** ICoreTextEditContext methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Name)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *put_Name)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext *This,
        HSTRING value);

    HRESULT (STDMETHODCALLTYPE *get_InputScope)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext *This,
        __x_ABI_CWindows_CUI_CText_CCore_CCoreTextInputScope *value);

    HRESULT (STDMETHODCALLTYPE *put_InputScope)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext *This,
        __x_ABI_CWindows_CUI_CText_CCore_CCoreTextInputScope value);

    HRESULT (STDMETHODCALLTYPE *get_IsReadOnly)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *put_IsReadOnly)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext *This,
        boolean value);

    HRESULT (STDMETHODCALLTYPE *get_InputPaneDisplayPolicy)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext *This,
        __x_ABI_CWindows_CUI_CText_CCore_CCoreTextInputPaneDisplayPolicy *value);

    HRESULT (STDMETHODCALLTYPE *put_InputPaneDisplayPolicy)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext *This,
        __x_ABI_CWindows_CUI_CText_CCore_CCoreTextInputPaneDisplayPolicy value);

    HRESULT (STDMETHODCALLTYPE *add_TextRequested)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext *This,
        __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextRequestedEventArgs *handler,
        EventRegistrationToken *cookie);

    HRESULT (STDMETHODCALLTYPE *remove_TextRequested)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext *This,
        EventRegistrationToken cookie);

    HRESULT (STDMETHODCALLTYPE *add_SelectionRequested)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext *This,
        __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionRequestedEventArgs *handler,
        EventRegistrationToken *cookie);

    HRESULT (STDMETHODCALLTYPE *remove_SelectionRequested)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext *This,
        EventRegistrationToken cookie);

    HRESULT (STDMETHODCALLTYPE *add_LayoutRequested)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext *This,
        __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextLayoutRequestedEventArgs *handler,
        EventRegistrationToken *cookie);

    HRESULT (STDMETHODCALLTYPE *remove_LayoutRequested)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext *This,
        EventRegistrationToken cookie);

    HRESULT (STDMETHODCALLTYPE *add_TextUpdating)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext *This,
        __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextUpdatingEventArgs *handler,
        EventRegistrationToken *cookie);

    HRESULT (STDMETHODCALLTYPE *remove_TextUpdating)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext *This,
        EventRegistrationToken cookie);

    HRESULT (STDMETHODCALLTYPE *add_SelectionUpdating)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext *This,
        __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionUpdatingEventArgs *handler,
        EventRegistrationToken *cookie);

    HRESULT (STDMETHODCALLTYPE *remove_SelectionUpdating)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext *This,
        EventRegistrationToken cookie);

    HRESULT (STDMETHODCALLTYPE *add_FormatUpdating)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext *This,
        __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextFormatUpdatingEventArgs *handler,
        EventRegistrationToken *cookie);

    HRESULT (STDMETHODCALLTYPE *remove_FormatUpdating)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext *This,
        EventRegistrationToken cookie);

    HRESULT (STDMETHODCALLTYPE *add_CompositionStarted)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext *This,
        __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionStartedEventArgs *handler,
        EventRegistrationToken *cookie);

    HRESULT (STDMETHODCALLTYPE *remove_CompositionStarted)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext *This,
        EventRegistrationToken cookie);

    HRESULT (STDMETHODCALLTYPE *add_CompositionCompleted)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext *This,
        __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionCompletedEventArgs *handler,
        EventRegistrationToken *cookie);

    HRESULT (STDMETHODCALLTYPE *remove_CompositionCompleted)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext *This,
        EventRegistrationToken cookie);

    HRESULT (STDMETHODCALLTYPE *add_FocusRemoved)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext *This,
        __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_IInspectable *handler,
        EventRegistrationToken *cookie);

    HRESULT (STDMETHODCALLTYPE *remove_FocusRemoved)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext *This,
        EventRegistrationToken cookie);

    HRESULT (STDMETHODCALLTYPE *NotifyFocusEnter)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext *This);

    HRESULT (STDMETHODCALLTYPE *NotifyFocusLeave)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext *This);

    HRESULT (STDMETHODCALLTYPE *NotifyTextChanged)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext *This,
        __x_ABI_CWindows_CUI_CText_CCore_CCoreTextRange modifiedRange,
        INT32 newLength,
        __x_ABI_CWindows_CUI_CText_CCore_CCoreTextRange newSelection);

    HRESULT (STDMETHODCALLTYPE *NotifySelectionChanged)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext *This,
        __x_ABI_CWindows_CUI_CText_CCore_CCoreTextRange selection);

    HRESULT (STDMETHODCALLTYPE *NotifyLayoutChanged)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext *This);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContextVtbl;

interface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext {
    CONST_VTBL __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContextVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ICoreTextEditContext methods ***/
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_get_Name(This,value) (This)->lpVtbl->get_Name(This,value)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_put_Name(This,value) (This)->lpVtbl->put_Name(This,value)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_get_InputScope(This,value) (This)->lpVtbl->get_InputScope(This,value)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_put_InputScope(This,value) (This)->lpVtbl->put_InputScope(This,value)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_get_IsReadOnly(This,value) (This)->lpVtbl->get_IsReadOnly(This,value)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_put_IsReadOnly(This,value) (This)->lpVtbl->put_IsReadOnly(This,value)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_get_InputPaneDisplayPolicy(This,value) (This)->lpVtbl->get_InputPaneDisplayPolicy(This,value)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_put_InputPaneDisplayPolicy(This,value) (This)->lpVtbl->put_InputPaneDisplayPolicy(This,value)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_add_TextRequested(This,handler,cookie) (This)->lpVtbl->add_TextRequested(This,handler,cookie)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_remove_TextRequested(This,cookie) (This)->lpVtbl->remove_TextRequested(This,cookie)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_add_SelectionRequested(This,handler,cookie) (This)->lpVtbl->add_SelectionRequested(This,handler,cookie)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_remove_SelectionRequested(This,cookie) (This)->lpVtbl->remove_SelectionRequested(This,cookie)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_add_LayoutRequested(This,handler,cookie) (This)->lpVtbl->add_LayoutRequested(This,handler,cookie)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_remove_LayoutRequested(This,cookie) (This)->lpVtbl->remove_LayoutRequested(This,cookie)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_add_TextUpdating(This,handler,cookie) (This)->lpVtbl->add_TextUpdating(This,handler,cookie)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_remove_TextUpdating(This,cookie) (This)->lpVtbl->remove_TextUpdating(This,cookie)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_add_SelectionUpdating(This,handler,cookie) (This)->lpVtbl->add_SelectionUpdating(This,handler,cookie)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_remove_SelectionUpdating(This,cookie) (This)->lpVtbl->remove_SelectionUpdating(This,cookie)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_add_FormatUpdating(This,handler,cookie) (This)->lpVtbl->add_FormatUpdating(This,handler,cookie)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_remove_FormatUpdating(This,cookie) (This)->lpVtbl->remove_FormatUpdating(This,cookie)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_add_CompositionStarted(This,handler,cookie) (This)->lpVtbl->add_CompositionStarted(This,handler,cookie)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_remove_CompositionStarted(This,cookie) (This)->lpVtbl->remove_CompositionStarted(This,cookie)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_add_CompositionCompleted(This,handler,cookie) (This)->lpVtbl->add_CompositionCompleted(This,handler,cookie)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_remove_CompositionCompleted(This,cookie) (This)->lpVtbl->remove_CompositionCompleted(This,cookie)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_add_FocusRemoved(This,handler,cookie) (This)->lpVtbl->add_FocusRemoved(This,handler,cookie)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_remove_FocusRemoved(This,cookie) (This)->lpVtbl->remove_FocusRemoved(This,cookie)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_NotifyFocusEnter(This) (This)->lpVtbl->NotifyFocusEnter(This)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_NotifyFocusLeave(This) (This)->lpVtbl->NotifyFocusLeave(This)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_NotifyTextChanged(This,modifiedRange,newLength,newSelection) (This)->lpVtbl->NotifyTextChanged(This,modifiedRange,newLength,newSelection)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_NotifySelectionChanged(This,selection) (This)->lpVtbl->NotifySelectionChanged(This,selection)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_NotifyLayoutChanged(This) (This)->lpVtbl->NotifyLayoutChanged(This)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_QueryInterface(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_AddRef(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_Release(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_GetIids(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_GetRuntimeClassName(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_GetTrustLevel(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ICoreTextEditContext methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_get_Name(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext* This,HSTRING *value) {
    return This->lpVtbl->get_Name(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_put_Name(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext* This,HSTRING value) {
    return This->lpVtbl->put_Name(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_get_InputScope(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext* This,__x_ABI_CWindows_CUI_CText_CCore_CCoreTextInputScope *value) {
    return This->lpVtbl->get_InputScope(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_put_InputScope(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext* This,__x_ABI_CWindows_CUI_CText_CCore_CCoreTextInputScope value) {
    return This->lpVtbl->put_InputScope(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_get_IsReadOnly(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext* This,boolean *value) {
    return This->lpVtbl->get_IsReadOnly(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_put_IsReadOnly(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext* This,boolean value) {
    return This->lpVtbl->put_IsReadOnly(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_get_InputPaneDisplayPolicy(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext* This,__x_ABI_CWindows_CUI_CText_CCore_CCoreTextInputPaneDisplayPolicy *value) {
    return This->lpVtbl->get_InputPaneDisplayPolicy(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_put_InputPaneDisplayPolicy(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext* This,__x_ABI_CWindows_CUI_CText_CCore_CCoreTextInputPaneDisplayPolicy value) {
    return This->lpVtbl->put_InputPaneDisplayPolicy(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_add_TextRequested(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext* This,__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextRequestedEventArgs *handler,EventRegistrationToken *cookie) {
    return This->lpVtbl->add_TextRequested(This,handler,cookie);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_remove_TextRequested(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext* This,EventRegistrationToken cookie) {
    return This->lpVtbl->remove_TextRequested(This,cookie);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_add_SelectionRequested(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext* This,__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionRequestedEventArgs *handler,EventRegistrationToken *cookie) {
    return This->lpVtbl->add_SelectionRequested(This,handler,cookie);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_remove_SelectionRequested(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext* This,EventRegistrationToken cookie) {
    return This->lpVtbl->remove_SelectionRequested(This,cookie);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_add_LayoutRequested(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext* This,__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextLayoutRequestedEventArgs *handler,EventRegistrationToken *cookie) {
    return This->lpVtbl->add_LayoutRequested(This,handler,cookie);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_remove_LayoutRequested(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext* This,EventRegistrationToken cookie) {
    return This->lpVtbl->remove_LayoutRequested(This,cookie);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_add_TextUpdating(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext* This,__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextUpdatingEventArgs *handler,EventRegistrationToken *cookie) {
    return This->lpVtbl->add_TextUpdating(This,handler,cookie);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_remove_TextUpdating(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext* This,EventRegistrationToken cookie) {
    return This->lpVtbl->remove_TextUpdating(This,cookie);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_add_SelectionUpdating(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext* This,__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionUpdatingEventArgs *handler,EventRegistrationToken *cookie) {
    return This->lpVtbl->add_SelectionUpdating(This,handler,cookie);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_remove_SelectionUpdating(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext* This,EventRegistrationToken cookie) {
    return This->lpVtbl->remove_SelectionUpdating(This,cookie);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_add_FormatUpdating(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext* This,__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextFormatUpdatingEventArgs *handler,EventRegistrationToken *cookie) {
    return This->lpVtbl->add_FormatUpdating(This,handler,cookie);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_remove_FormatUpdating(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext* This,EventRegistrationToken cookie) {
    return This->lpVtbl->remove_FormatUpdating(This,cookie);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_add_CompositionStarted(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext* This,__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionStartedEventArgs *handler,EventRegistrationToken *cookie) {
    return This->lpVtbl->add_CompositionStarted(This,handler,cookie);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_remove_CompositionStarted(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext* This,EventRegistrationToken cookie) {
    return This->lpVtbl->remove_CompositionStarted(This,cookie);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_add_CompositionCompleted(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext* This,__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionCompletedEventArgs *handler,EventRegistrationToken *cookie) {
    return This->lpVtbl->add_CompositionCompleted(This,handler,cookie);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_remove_CompositionCompleted(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext* This,EventRegistrationToken cookie) {
    return This->lpVtbl->remove_CompositionCompleted(This,cookie);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_add_FocusRemoved(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext* This,__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_IInspectable *handler,EventRegistrationToken *cookie) {
    return This->lpVtbl->add_FocusRemoved(This,handler,cookie);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_remove_FocusRemoved(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext* This,EventRegistrationToken cookie) {
    return This->lpVtbl->remove_FocusRemoved(This,cookie);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_NotifyFocusEnter(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext* This) {
    return This->lpVtbl->NotifyFocusEnter(This);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_NotifyFocusLeave(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext* This) {
    return This->lpVtbl->NotifyFocusLeave(This);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_NotifyTextChanged(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext* This,__x_ABI_CWindows_CUI_CText_CCore_CCoreTextRange modifiedRange,INT32 newLength,__x_ABI_CWindows_CUI_CText_CCore_CCoreTextRange newSelection) {
    return This->lpVtbl->NotifyTextChanged(This,modifiedRange,newLength,newSelection);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_NotifySelectionChanged(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext* This,__x_ABI_CWindows_CUI_CText_CCore_CCoreTextRange selection) {
    return This->lpVtbl->NotifySelectionChanged(This,selection);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_NotifyLayoutChanged(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext* This) {
    return This->lpVtbl->NotifyLayoutChanged(This);
}
#endif
#ifdef WIDL_using_Windows_UI_Text_Core
#define IID_ICoreTextEditContext IID___x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext
#define ICoreTextEditContextVtbl __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContextVtbl
#define ICoreTextEditContext __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext
#define ICoreTextEditContext_QueryInterface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_QueryInterface
#define ICoreTextEditContext_AddRef __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_AddRef
#define ICoreTextEditContext_Release __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_Release
#define ICoreTextEditContext_GetIids __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_GetIids
#define ICoreTextEditContext_GetRuntimeClassName __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_GetRuntimeClassName
#define ICoreTextEditContext_GetTrustLevel __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_GetTrustLevel
#define ICoreTextEditContext_get_Name __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_get_Name
#define ICoreTextEditContext_put_Name __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_put_Name
#define ICoreTextEditContext_get_InputScope __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_get_InputScope
#define ICoreTextEditContext_put_InputScope __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_put_InputScope
#define ICoreTextEditContext_get_IsReadOnly __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_get_IsReadOnly
#define ICoreTextEditContext_put_IsReadOnly __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_put_IsReadOnly
#define ICoreTextEditContext_get_InputPaneDisplayPolicy __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_get_InputPaneDisplayPolicy
#define ICoreTextEditContext_put_InputPaneDisplayPolicy __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_put_InputPaneDisplayPolicy
#define ICoreTextEditContext_add_TextRequested __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_add_TextRequested
#define ICoreTextEditContext_remove_TextRequested __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_remove_TextRequested
#define ICoreTextEditContext_add_SelectionRequested __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_add_SelectionRequested
#define ICoreTextEditContext_remove_SelectionRequested __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_remove_SelectionRequested
#define ICoreTextEditContext_add_LayoutRequested __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_add_LayoutRequested
#define ICoreTextEditContext_remove_LayoutRequested __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_remove_LayoutRequested
#define ICoreTextEditContext_add_TextUpdating __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_add_TextUpdating
#define ICoreTextEditContext_remove_TextUpdating __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_remove_TextUpdating
#define ICoreTextEditContext_add_SelectionUpdating __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_add_SelectionUpdating
#define ICoreTextEditContext_remove_SelectionUpdating __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_remove_SelectionUpdating
#define ICoreTextEditContext_add_FormatUpdating __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_add_FormatUpdating
#define ICoreTextEditContext_remove_FormatUpdating __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_remove_FormatUpdating
#define ICoreTextEditContext_add_CompositionStarted __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_add_CompositionStarted
#define ICoreTextEditContext_remove_CompositionStarted __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_remove_CompositionStarted
#define ICoreTextEditContext_add_CompositionCompleted __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_add_CompositionCompleted
#define ICoreTextEditContext_remove_CompositionCompleted __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_remove_CompositionCompleted
#define ICoreTextEditContext_add_FocusRemoved __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_add_FocusRemoved
#define ICoreTextEditContext_remove_FocusRemoved __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_remove_FocusRemoved
#define ICoreTextEditContext_NotifyFocusEnter __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_NotifyFocusEnter
#define ICoreTextEditContext_NotifyFocusLeave __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_NotifyFocusLeave
#define ICoreTextEditContext_NotifyTextChanged __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_NotifyTextChanged
#define ICoreTextEditContext_NotifySelectionChanged __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_NotifySelectionChanged
#define ICoreTextEditContext_NotifyLayoutChanged __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_NotifyLayoutChanged
#endif /* WIDL_using_Windows_UI_Text_Core */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * ICoreTextServicesManager interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager, 0xc2507d83, 0x6e0a, 0x4a8a, 0xbd,0xf8, 0x19,0x48,0x87,0x48,0x54,0xba);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Text {
                namespace Core {
                    MIDL_INTERFACE("c2507d83-6e0a-4a8a-bdf8-1948874854ba")
                    ICoreTextServicesManager : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE get_InputLanguage(
                            ABI::Windows::Globalization::ILanguage **value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE add_InputLanguageChanged(
                            ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextServicesManager*,IInspectable* > *handler,
                            EventRegistrationToken *cookie) = 0;

                        virtual HRESULT STDMETHODCALLTYPE remove_InputLanguageChanged(
                            EventRegistrationToken cookie) = 0;

                        virtual HRESULT STDMETHODCALLTYPE CreateEditContext(
                            ABI::Windows::UI::Text::Core::ICoreTextEditContext **out) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager, 0xc2507d83, 0x6e0a, 0x4a8a, 0xbd,0xf8, 0x19,0x48,0x87,0x48,0x54,0xba)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManagerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager *This,
        TrustLevel *trustLevel);

    /*** ICoreTextServicesManager methods ***/
    HRESULT (STDMETHODCALLTYPE *get_InputLanguage)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager *This,
        __x_ABI_CWindows_CGlobalization_CILanguage **value);

    HRESULT (STDMETHODCALLTYPE *add_InputLanguageChanged)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager *This,
        __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextServicesManager_IInspectable *handler,
        EventRegistrationToken *cookie);

    HRESULT (STDMETHODCALLTYPE *remove_InputLanguageChanged)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager *This,
        EventRegistrationToken cookie);

    HRESULT (STDMETHODCALLTYPE *CreateEditContext)(
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager *This,
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext **out);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManagerVtbl;

interface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager {
    CONST_VTBL __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManagerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ICoreTextServicesManager methods ***/
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager_get_InputLanguage(This,value) (This)->lpVtbl->get_InputLanguage(This,value)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager_add_InputLanguageChanged(This,handler,cookie) (This)->lpVtbl->add_InputLanguageChanged(This,handler,cookie)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager_remove_InputLanguageChanged(This,cookie) (This)->lpVtbl->remove_InputLanguageChanged(This,cookie)
#define __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager_CreateEditContext(This,out) (This)->lpVtbl->CreateEditContext(This,out)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager_QueryInterface(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager_AddRef(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager_Release(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager_GetIids(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager_GetRuntimeClassName(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager_GetTrustLevel(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ICoreTextServicesManager methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager_get_InputLanguage(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager* This,__x_ABI_CWindows_CGlobalization_CILanguage **value) {
    return This->lpVtbl->get_InputLanguage(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager_add_InputLanguageChanged(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager* This,__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextServicesManager_IInspectable *handler,EventRegistrationToken *cookie) {
    return This->lpVtbl->add_InputLanguageChanged(This,handler,cookie);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager_remove_InputLanguageChanged(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager* This,EventRegistrationToken cookie) {
    return This->lpVtbl->remove_InputLanguageChanged(This,cookie);
}
static inline HRESULT __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager_CreateEditContext(__x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager* This,__x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext **out) {
    return This->lpVtbl->CreateEditContext(This,out);
}
#endif
#ifdef WIDL_using_Windows_UI_Text_Core
#define IID_ICoreTextServicesManager IID___x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager
#define ICoreTextServicesManagerVtbl __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManagerVtbl
#define ICoreTextServicesManager __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager
#define ICoreTextServicesManager_QueryInterface __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager_QueryInterface
#define ICoreTextServicesManager_AddRef __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager_AddRef
#define ICoreTextServicesManager_Release __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager_Release
#define ICoreTextServicesManager_GetIids __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager_GetIids
#define ICoreTextServicesManager_GetRuntimeClassName __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager_GetRuntimeClassName
#define ICoreTextServicesManager_GetTrustLevel __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager_GetTrustLevel
#define ICoreTextServicesManager_get_InputLanguage __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager_get_InputLanguage
#define ICoreTextServicesManager_add_InputLanguageChanged __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager_add_InputLanguageChanged
#define ICoreTextServicesManager_remove_InputLanguageChanged __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager_remove_InputLanguageChanged
#define ICoreTextServicesManager_CreateEditContext __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager_CreateEditContext
#endif /* WIDL_using_Windows_UI_Text_Core */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Text.Core.CoreTextServicesManager
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Text_Core_CoreTextServicesManager_DEFINED
#define RUNTIMECLASS_Windows_UI_Text_Core_CoreTextServicesManager_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Text_Core_CoreTextServicesManager[] = {'W','i','n','d','o','w','s','.','U','I','.','T','e','x','t','.','C','o','r','e','.','C','o','r','e','T','e','x','t','S','e','r','v','i','c','e','s','M','a','n','a','g','e','r',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Text_Core_CoreTextServicesManager[] = L"Windows.UI.Text.Core.CoreTextServicesManager";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Text_Core_CoreTextServicesManager[] = {'W','i','n','d','o','w','s','.','U','I','.','T','e','x','t','.','C','o','r','e','.','C','o','r','e','T','e','x','t','S','e','r','v','i','c','e','s','M','a','n','a','g','e','r',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Text_Core_CoreTextServicesManager_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Text.Core.CoreTextFormatUpdatingEventArgs
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Text_Core_CoreTextFormatUpdatingEventArgs_DEFINED
#define RUNTIMECLASS_Windows_UI_Text_Core_CoreTextFormatUpdatingEventArgs_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Text_Core_CoreTextFormatUpdatingEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','T','e','x','t','.','C','o','r','e','.','C','o','r','e','T','e','x','t','F','o','r','m','a','t','U','p','d','a','t','i','n','g','E','v','e','n','t','A','r','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Text_Core_CoreTextFormatUpdatingEventArgs[] = L"Windows.UI.Text.Core.CoreTextFormatUpdatingEventArgs";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Text_Core_CoreTextFormatUpdatingEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','T','e','x','t','.','C','o','r','e','.','C','o','r','e','T','e','x','t','F','o','r','m','a','t','U','p','d','a','t','i','n','g','E','v','e','n','t','A','r','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Text_Core_CoreTextFormatUpdatingEventArgs_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Text.Core.CoreTextEditContext
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Text_Core_CoreTextEditContext_DEFINED
#define RUNTIMECLASS_Windows_UI_Text_Core_CoreTextEditContext_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Text_Core_CoreTextEditContext[] = {'W','i','n','d','o','w','s','.','U','I','.','T','e','x','t','.','C','o','r','e','.','C','o','r','e','T','e','x','t','E','d','i','t','C','o','n','t','e','x','t',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Text_Core_CoreTextEditContext[] = L"Windows.UI.Text.Core.CoreTextEditContext";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Text_Core_CoreTextEditContext[] = {'W','i','n','d','o','w','s','.','U','I','.','T','e','x','t','.','C','o','r','e','.','C','o','r','e','T','e','x','t','E','d','i','t','C','o','n','t','e','x','t',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Text_Core_CoreTextEditContext_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Text.Core.CoreTextCompositionCompletedEventArgs
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Text_Core_CoreTextCompositionCompletedEventArgs_DEFINED
#define RUNTIMECLASS_Windows_UI_Text_Core_CoreTextCompositionCompletedEventArgs_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Text_Core_CoreTextCompositionCompletedEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','T','e','x','t','.','C','o','r','e','.','C','o','r','e','T','e','x','t','C','o','m','p','o','s','i','t','i','o','n','C','o','m','p','l','e','t','e','d','E','v','e','n','t','A','r','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Text_Core_CoreTextCompositionCompletedEventArgs[] = L"Windows.UI.Text.Core.CoreTextCompositionCompletedEventArgs";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Text_Core_CoreTextCompositionCompletedEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','T','e','x','t','.','C','o','r','e','.','C','o','r','e','T','e','x','t','C','o','m','p','o','s','i','t','i','o','n','C','o','m','p','l','e','t','e','d','E','v','e','n','t','A','r','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Text_Core_CoreTextCompositionCompletedEventArgs_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Text.Core.CoreTextCompositionStartedEventArgs
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Text_Core_CoreTextCompositionStartedEventArgs_DEFINED
#define RUNTIMECLASS_Windows_UI_Text_Core_CoreTextCompositionStartedEventArgs_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Text_Core_CoreTextCompositionStartedEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','T','e','x','t','.','C','o','r','e','.','C','o','r','e','T','e','x','t','C','o','m','p','o','s','i','t','i','o','n','S','t','a','r','t','e','d','E','v','e','n','t','A','r','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Text_Core_CoreTextCompositionStartedEventArgs[] = L"Windows.UI.Text.Core.CoreTextCompositionStartedEventArgs";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Text_Core_CoreTextCompositionStartedEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','T','e','x','t','.','C','o','r','e','.','C','o','r','e','T','e','x','t','C','o','m','p','o','s','i','t','i','o','n','S','t','a','r','t','e','d','E','v','e','n','t','A','r','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Text_Core_CoreTextCompositionStartedEventArgs_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Text.Core.CoreTextLayoutRequestedEventArgs
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Text_Core_CoreTextLayoutRequestedEventArgs_DEFINED
#define RUNTIMECLASS_Windows_UI_Text_Core_CoreTextLayoutRequestedEventArgs_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Text_Core_CoreTextLayoutRequestedEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','T','e','x','t','.','C','o','r','e','.','C','o','r','e','T','e','x','t','L','a','y','o','u','t','R','e','q','u','e','s','t','e','d','E','v','e','n','t','A','r','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Text_Core_CoreTextLayoutRequestedEventArgs[] = L"Windows.UI.Text.Core.CoreTextLayoutRequestedEventArgs";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Text_Core_CoreTextLayoutRequestedEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','T','e','x','t','.','C','o','r','e','.','C','o','r','e','T','e','x','t','L','a','y','o','u','t','R','e','q','u','e','s','t','e','d','E','v','e','n','t','A','r','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Text_Core_CoreTextLayoutRequestedEventArgs_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Text.Core.CoreTextSelectionRequestedEventArgs
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Text_Core_CoreTextSelectionRequestedEventArgs_DEFINED
#define RUNTIMECLASS_Windows_UI_Text_Core_CoreTextSelectionRequestedEventArgs_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Text_Core_CoreTextSelectionRequestedEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','T','e','x','t','.','C','o','r','e','.','C','o','r','e','T','e','x','t','S','e','l','e','c','t','i','o','n','R','e','q','u','e','s','t','e','d','E','v','e','n','t','A','r','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Text_Core_CoreTextSelectionRequestedEventArgs[] = L"Windows.UI.Text.Core.CoreTextSelectionRequestedEventArgs";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Text_Core_CoreTextSelectionRequestedEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','T','e','x','t','.','C','o','r','e','.','C','o','r','e','T','e','x','t','S','e','l','e','c','t','i','o','n','R','e','q','u','e','s','t','e','d','E','v','e','n','t','A','r','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Text_Core_CoreTextSelectionRequestedEventArgs_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Text.Core.CoreTextSelectionUpdatingEventArgs
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Text_Core_CoreTextSelectionUpdatingEventArgs_DEFINED
#define RUNTIMECLASS_Windows_UI_Text_Core_CoreTextSelectionUpdatingEventArgs_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Text_Core_CoreTextSelectionUpdatingEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','T','e','x','t','.','C','o','r','e','.','C','o','r','e','T','e','x','t','S','e','l','e','c','t','i','o','n','U','p','d','a','t','i','n','g','E','v','e','n','t','A','r','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Text_Core_CoreTextSelectionUpdatingEventArgs[] = L"Windows.UI.Text.Core.CoreTextSelectionUpdatingEventArgs";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Text_Core_CoreTextSelectionUpdatingEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','T','e','x','t','.','C','o','r','e','.','C','o','r','e','T','e','x','t','S','e','l','e','c','t','i','o','n','U','p','d','a','t','i','n','g','E','v','e','n','t','A','r','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Text_Core_CoreTextSelectionUpdatingEventArgs_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Text.Core.CoreTextTextRequestedEventArgs
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Text_Core_CoreTextTextRequestedEventArgs_DEFINED
#define RUNTIMECLASS_Windows_UI_Text_Core_CoreTextTextRequestedEventArgs_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Text_Core_CoreTextTextRequestedEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','T','e','x','t','.','C','o','r','e','.','C','o','r','e','T','e','x','t','T','e','x','t','R','e','q','u','e','s','t','e','d','E','v','e','n','t','A','r','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Text_Core_CoreTextTextRequestedEventArgs[] = L"Windows.UI.Text.Core.CoreTextTextRequestedEventArgs";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Text_Core_CoreTextTextRequestedEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','T','e','x','t','.','C','o','r','e','.','C','o','r','e','T','e','x','t','T','e','x','t','R','e','q','u','e','s','t','e','d','E','v','e','n','t','A','r','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Text_Core_CoreTextTextRequestedEventArgs_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Text.Core.CoreTextTextUpdatingEventArgs
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Text_Core_CoreTextTextUpdatingEventArgs_DEFINED
#define RUNTIMECLASS_Windows_UI_Text_Core_CoreTextTextUpdatingEventArgs_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Text_Core_CoreTextTextUpdatingEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','T','e','x','t','.','C','o','r','e','.','C','o','r','e','T','e','x','t','T','e','x','t','U','p','d','a','t','i','n','g','E','v','e','n','t','A','r','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Text_Core_CoreTextTextUpdatingEventArgs[] = L"Windows.UI.Text.Core.CoreTextTextUpdatingEventArgs";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Text_Core_CoreTextTextUpdatingEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','T','e','x','t','.','C','o','r','e','.','C','o','r','e','T','e','x','t','T','e','x','t','U','p','d','a','t','i','n','g','E','v','e','n','t','A','r','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Text_Core_CoreTextTextUpdatingEventArgs_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Text.Core.CoreTextLayoutBounds
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Text_Core_CoreTextLayoutBounds_DEFINED
#define RUNTIMECLASS_Windows_UI_Text_Core_CoreTextLayoutBounds_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Text_Core_CoreTextLayoutBounds[] = {'W','i','n','d','o','w','s','.','U','I','.','T','e','x','t','.','C','o','r','e','.','C','o','r','e','T','e','x','t','L','a','y','o','u','t','B','o','u','n','d','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Text_Core_CoreTextLayoutBounds[] = L"Windows.UI.Text.Core.CoreTextLayoutBounds";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Text_Core_CoreTextLayoutBounds[] = {'W','i','n','d','o','w','s','.','U','I','.','T','e','x','t','.','C','o','r','e','.','C','o','r','e','T','e','x','t','L','a','y','o','u','t','B','o','u','n','d','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Text_Core_CoreTextLayoutBounds_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Text.Core.CoreTextLayoutRequest
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Text_Core_CoreTextLayoutRequest_DEFINED
#define RUNTIMECLASS_Windows_UI_Text_Core_CoreTextLayoutRequest_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Text_Core_CoreTextLayoutRequest[] = {'W','i','n','d','o','w','s','.','U','I','.','T','e','x','t','.','C','o','r','e','.','C','o','r','e','T','e','x','t','L','a','y','o','u','t','R','e','q','u','e','s','t',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Text_Core_CoreTextLayoutRequest[] = L"Windows.UI.Text.Core.CoreTextLayoutRequest";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Text_Core_CoreTextLayoutRequest[] = {'W','i','n','d','o','w','s','.','U','I','.','T','e','x','t','.','C','o','r','e','.','C','o','r','e','T','e','x','t','L','a','y','o','u','t','R','e','q','u','e','s','t',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Text_Core_CoreTextLayoutRequest_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Text.Core.CoreTextSelectionRequest
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Text_Core_CoreTextSelectionRequest_DEFINED
#define RUNTIMECLASS_Windows_UI_Text_Core_CoreTextSelectionRequest_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Text_Core_CoreTextSelectionRequest[] = {'W','i','n','d','o','w','s','.','U','I','.','T','e','x','t','.','C','o','r','e','.','C','o','r','e','T','e','x','t','S','e','l','e','c','t','i','o','n','R','e','q','u','e','s','t',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Text_Core_CoreTextSelectionRequest[] = L"Windows.UI.Text.Core.CoreTextSelectionRequest";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Text_Core_CoreTextSelectionRequest[] = {'W','i','n','d','o','w','s','.','U','I','.','T','e','x','t','.','C','o','r','e','.','C','o','r','e','T','e','x','t','S','e','l','e','c','t','i','o','n','R','e','q','u','e','s','t',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Text_Core_CoreTextSelectionRequest_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Text.Core.CoreTextTextRequest
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Text_Core_CoreTextTextRequest_DEFINED
#define RUNTIMECLASS_Windows_UI_Text_Core_CoreTextTextRequest_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Text_Core_CoreTextTextRequest[] = {'W','i','n','d','o','w','s','.','U','I','.','T','e','x','t','.','C','o','r','e','.','C','o','r','e','T','e','x','t','T','e','x','t','R','e','q','u','e','s','t',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Text_Core_CoreTextTextRequest[] = L"Windows.UI.Text.Core.CoreTextTextRequest";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Text_Core_CoreTextTextRequest[] = {'W','i','n','d','o','w','s','.','U','I','.','T','e','x','t','.','C','o','r','e','.','C','o','r','e','T','e','x','t','T','e','x','t','R','e','q','u','e','s','t',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Text_Core_CoreTextTextRequest_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Text.Core.CoreTextCompositionSegment
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Text_Core_CoreTextCompositionSegment_DEFINED
#define RUNTIMECLASS_Windows_UI_Text_Core_CoreTextCompositionSegment_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Text_Core_CoreTextCompositionSegment[] = {'W','i','n','d','o','w','s','.','U','I','.','T','e','x','t','.','C','o','r','e','.','C','o','r','e','T','e','x','t','C','o','m','p','o','s','i','t','i','o','n','S','e','g','m','e','n','t',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Text_Core_CoreTextCompositionSegment[] = L"Windows.UI.Text.Core.CoreTextCompositionSegment";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Text_Core_CoreTextCompositionSegment[] = {'W','i','n','d','o','w','s','.','U','I','.','T','e','x','t','.','C','o','r','e','.','C','o','r','e','T','e','x','t','C','o','m','p','o','s','i','t','i','o','n','S','e','g','m','e','n','t',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Text_Core_CoreTextCompositionSegment_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IVectorView<ABI::Windows::UI::Text::Core::CoreTextCompositionSegment* > interface
 */
#ifndef ____FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment_INTERFACE_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment, 0x214b64ff, 0xcf4d, 0x5dd4, 0x93,0x2a, 0x7b,0xc6,0x6e,0x69,0x03,0x6e);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("214b64ff-cf4d-5dd4-932a-7bc66e69036e")
                IVectorView<ABI::Windows::UI::Text::Core::CoreTextCompositionSegment* > : IVectorView_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Text::Core::CoreTextCompositionSegment*, ABI::Windows::UI::Text::Core::ICoreTextCompositionSegment* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment, 0x214b64ff, 0xcf4d, 0x5dd4, 0x93,0x2a, 0x7b,0xc6,0x6e,0x69,0x03,0x6e)
#endif
#else
typedef struct __FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegmentVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment *This,
        TrustLevel *trustLevel);

    /*** IVectorView<ABI::Windows::UI::Text::Core::CoreTextCompositionSegment* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment *This,
        UINT32 index,
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment **value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment *This,
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment **items,
        UINT32 *value);

    END_INTERFACE
} __FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegmentVtbl;

interface __FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment {
    CONST_VTBL __FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegmentVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVectorView<ABI::Windows::UI::Text::Core::CoreTextCompositionSegment* > methods ***/
#define __FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment_QueryInterface(__FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment_AddRef(__FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment_Release(__FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment_GetIids(__FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment_GetRuntimeClassName(__FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment_GetTrustLevel(__FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVectorView<ABI::Windows::UI::Text::Core::CoreTextCompositionSegment* > methods ***/
static inline HRESULT __FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment_GetAt(__FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment* This,UINT32 index,__x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment_get_Size(__FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment_IndexOf(__FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment* This,__x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment_GetMany(__FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionSegment **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVectorView_CoreTextCompositionSegment IID___FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment
#define IVectorView_CoreTextCompositionSegmentVtbl __FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegmentVtbl
#define IVectorView_CoreTextCompositionSegment __FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment
#define IVectorView_CoreTextCompositionSegment_QueryInterface __FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment_QueryInterface
#define IVectorView_CoreTextCompositionSegment_AddRef __FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment_AddRef
#define IVectorView_CoreTextCompositionSegment_Release __FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment_Release
#define IVectorView_CoreTextCompositionSegment_GetIids __FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment_GetIids
#define IVectorView_CoreTextCompositionSegment_GetRuntimeClassName __FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment_GetRuntimeClassName
#define IVectorView_CoreTextCompositionSegment_GetTrustLevel __FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment_GetTrustLevel
#define IVectorView_CoreTextCompositionSegment_GetAt __FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment_GetAt
#define IVectorView_CoreTextCompositionSegment_get_Size __FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment_get_Size
#define IVectorView_CoreTextCompositionSegment_IndexOf __FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment_IndexOf
#define IVectorView_CoreTextCompositionSegment_GetMany __FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVectorView_1_Windows__CUI__CText__CCore__CCoreTextCompositionSegment_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,IInspectable* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_IInspectable_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_IInspectable_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_IInspectable, 0xef53b467, 0xc472, 0x5b59, 0xa8,0x27, 0x38,0xad,0xc3,0xa9,0xd3,0x26);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("ef53b467-c472-5b59-a827-38adc3a9d326")
            ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,IInspectable* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Text::Core::CoreTextEditContext*, ABI::Windows::UI::Text::Core::ICoreTextEditContext* >, IInspectable* >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_IInspectable, 0xef53b467, 0xc472, 0x5b59, 0xa8,0x27, 0x38,0xad,0xc3,0xa9,0xd3,0x26)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_IInspectableVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,IInspectable* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_IInspectable *This,
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext *sender,
        IInspectable *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_IInspectableVtbl;

interface __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_IInspectable {
    CONST_VTBL __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_IInspectableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_IInspectable_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_IInspectable_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_IInspectable_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,IInspectable* > methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_IInspectable_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_IInspectable_QueryInterface(__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_IInspectable* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_IInspectable_AddRef(__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_IInspectable* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_IInspectable_Release(__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_IInspectable* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,IInspectable* > methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_IInspectable_Invoke(__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_IInspectable* This,__x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext *sender,IInspectable *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_CoreTextEditContext_IInspectable IID___FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_IInspectable
#define ITypedEventHandler_CoreTextEditContext_IInspectableVtbl __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_IInspectableVtbl
#define ITypedEventHandler_CoreTextEditContext_IInspectable __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_IInspectable
#define ITypedEventHandler_CoreTextEditContext_IInspectable_QueryInterface __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_IInspectable_QueryInterface
#define ITypedEventHandler_CoreTextEditContext_IInspectable_AddRef __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_IInspectable_AddRef
#define ITypedEventHandler_CoreTextEditContext_IInspectable_Release __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_IInspectable_Release
#define ITypedEventHandler_CoreTextEditContext_IInspectable_Invoke __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_IInspectable_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_IInspectable_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,ABI::Windows::UI::Text::Core::CoreTextCompositionCompletedEventArgs* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionCompletedEventArgs_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionCompletedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionCompletedEventArgs, 0xa2d7059e, 0x68ed, 0x5260, 0x8d,0x8e, 0x1d,0xcf,0x3d,0x25,0xd6,0x63);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("a2d7059e-68ed-5260-8d8e-1dcf3d25d663")
            ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,ABI::Windows::UI::Text::Core::CoreTextCompositionCompletedEventArgs* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Text::Core::CoreTextEditContext*, ABI::Windows::UI::Text::Core::ICoreTextEditContext* >, ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Text::Core::CoreTextCompositionCompletedEventArgs*, ABI::Windows::UI::Text::Core::ICoreTextCompositionCompletedEventArgs* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionCompletedEventArgs, 0xa2d7059e, 0x68ed, 0x5260, 0x8d,0x8e, 0x1d,0xcf,0x3d,0x25,0xd6,0x63)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionCompletedEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,ABI::Windows::UI::Text::Core::CoreTextCompositionCompletedEventArgs* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionCompletedEventArgs *This,
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext *sender,
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionCompletedEventArgsVtbl;

interface __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionCompletedEventArgs {
    CONST_VTBL __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionCompletedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionCompletedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionCompletedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionCompletedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,ABI::Windows::UI::Text::Core::CoreTextCompositionCompletedEventArgs* > methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionCompletedEventArgs_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionCompletedEventArgs_QueryInterface(__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionCompletedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionCompletedEventArgs_AddRef(__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionCompletedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionCompletedEventArgs_Release(__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionCompletedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,ABI::Windows::UI::Text::Core::CoreTextCompositionCompletedEventArgs* > methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionCompletedEventArgs_Invoke(__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionCompletedEventArgs* This,__x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext *sender,__x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionCompletedEventArgs *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_CoreTextEditContext_CoreTextCompositionCompletedEventArgs IID___FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionCompletedEventArgs
#define ITypedEventHandler_CoreTextEditContext_CoreTextCompositionCompletedEventArgsVtbl __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionCompletedEventArgsVtbl
#define ITypedEventHandler_CoreTextEditContext_CoreTextCompositionCompletedEventArgs __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionCompletedEventArgs
#define ITypedEventHandler_CoreTextEditContext_CoreTextCompositionCompletedEventArgs_QueryInterface __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionCompletedEventArgs_QueryInterface
#define ITypedEventHandler_CoreTextEditContext_CoreTextCompositionCompletedEventArgs_AddRef __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionCompletedEventArgs_AddRef
#define ITypedEventHandler_CoreTextEditContext_CoreTextCompositionCompletedEventArgs_Release __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionCompletedEventArgs_Release
#define ITypedEventHandler_CoreTextEditContext_CoreTextCompositionCompletedEventArgs_Invoke __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionCompletedEventArgs_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionCompletedEventArgs_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,ABI::Windows::UI::Text::Core::CoreTextCompositionStartedEventArgs* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionStartedEventArgs_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionStartedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionStartedEventArgs, 0xe671d625, 0x5b59, 0x57e6, 0xa9,0x2e, 0x40,0x00,0x95,0x07,0x85,0x3a);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("e671d625-5b59-57e6-a92e-40009507853a")
            ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,ABI::Windows::UI::Text::Core::CoreTextCompositionStartedEventArgs* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Text::Core::CoreTextEditContext*, ABI::Windows::UI::Text::Core::ICoreTextEditContext* >, ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Text::Core::CoreTextCompositionStartedEventArgs*, ABI::Windows::UI::Text::Core::ICoreTextCompositionStartedEventArgs* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionStartedEventArgs, 0xe671d625, 0x5b59, 0x57e6, 0xa9,0x2e, 0x40,0x00,0x95,0x07,0x85,0x3a)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionStartedEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,ABI::Windows::UI::Text::Core::CoreTextCompositionStartedEventArgs* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionStartedEventArgs *This,
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext *sender,
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgs *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionStartedEventArgsVtbl;

interface __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionStartedEventArgs {
    CONST_VTBL __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionStartedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionStartedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionStartedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionStartedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,ABI::Windows::UI::Text::Core::CoreTextCompositionStartedEventArgs* > methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionStartedEventArgs_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionStartedEventArgs_QueryInterface(__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionStartedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionStartedEventArgs_AddRef(__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionStartedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionStartedEventArgs_Release(__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionStartedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,ABI::Windows::UI::Text::Core::CoreTextCompositionStartedEventArgs* > methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionStartedEventArgs_Invoke(__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionStartedEventArgs* This,__x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext *sender,__x_ABI_CWindows_CUI_CText_CCore_CICoreTextCompositionStartedEventArgs *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_CoreTextEditContext_CoreTextCompositionStartedEventArgs IID___FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionStartedEventArgs
#define ITypedEventHandler_CoreTextEditContext_CoreTextCompositionStartedEventArgsVtbl __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionStartedEventArgsVtbl
#define ITypedEventHandler_CoreTextEditContext_CoreTextCompositionStartedEventArgs __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionStartedEventArgs
#define ITypedEventHandler_CoreTextEditContext_CoreTextCompositionStartedEventArgs_QueryInterface __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionStartedEventArgs_QueryInterface
#define ITypedEventHandler_CoreTextEditContext_CoreTextCompositionStartedEventArgs_AddRef __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionStartedEventArgs_AddRef
#define ITypedEventHandler_CoreTextEditContext_CoreTextCompositionStartedEventArgs_Release __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionStartedEventArgs_Release
#define ITypedEventHandler_CoreTextEditContext_CoreTextCompositionStartedEventArgs_Invoke __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionStartedEventArgs_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextCompositionStartedEventArgs_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,ABI::Windows::UI::Text::Core::CoreTextFormatUpdatingEventArgs* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextFormatUpdatingEventArgs_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextFormatUpdatingEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextFormatUpdatingEventArgs, 0x3e4ef599, 0x4cc2, 0x5248, 0xbf,0x2d, 0x13,0xf1,0x76,0x13,0xb0,0xa6);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("3e4ef599-4cc2-5248-bf2d-13f17613b0a6")
            ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,ABI::Windows::UI::Text::Core::CoreTextFormatUpdatingEventArgs* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Text::Core::CoreTextEditContext*, ABI::Windows::UI::Text::Core::ICoreTextEditContext* >, ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Text::Core::CoreTextFormatUpdatingEventArgs*, ABI::Windows::UI::Text::Core::ICoreTextFormatUpdatingEventArgs* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextFormatUpdatingEventArgs, 0x3e4ef599, 0x4cc2, 0x5248, 0xbf,0x2d, 0x13,0xf1,0x76,0x13,0xb0,0xa6)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextFormatUpdatingEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,ABI::Windows::UI::Text::Core::CoreTextFormatUpdatingEventArgs* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextFormatUpdatingEventArgs *This,
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext *sender,
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextFormatUpdatingEventArgsVtbl;

interface __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextFormatUpdatingEventArgs {
    CONST_VTBL __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextFormatUpdatingEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextFormatUpdatingEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextFormatUpdatingEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextFormatUpdatingEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,ABI::Windows::UI::Text::Core::CoreTextFormatUpdatingEventArgs* > methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextFormatUpdatingEventArgs_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextFormatUpdatingEventArgs_QueryInterface(__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextFormatUpdatingEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextFormatUpdatingEventArgs_AddRef(__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextFormatUpdatingEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextFormatUpdatingEventArgs_Release(__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextFormatUpdatingEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,ABI::Windows::UI::Text::Core::CoreTextFormatUpdatingEventArgs* > methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextFormatUpdatingEventArgs_Invoke(__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextFormatUpdatingEventArgs* This,__x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext *sender,__x_ABI_CWindows_CUI_CText_CCore_CICoreTextFormatUpdatingEventArgs *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_CoreTextEditContext_CoreTextFormatUpdatingEventArgs IID___FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextFormatUpdatingEventArgs
#define ITypedEventHandler_CoreTextEditContext_CoreTextFormatUpdatingEventArgsVtbl __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextFormatUpdatingEventArgsVtbl
#define ITypedEventHandler_CoreTextEditContext_CoreTextFormatUpdatingEventArgs __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextFormatUpdatingEventArgs
#define ITypedEventHandler_CoreTextEditContext_CoreTextFormatUpdatingEventArgs_QueryInterface __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextFormatUpdatingEventArgs_QueryInterface
#define ITypedEventHandler_CoreTextEditContext_CoreTextFormatUpdatingEventArgs_AddRef __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextFormatUpdatingEventArgs_AddRef
#define ITypedEventHandler_CoreTextEditContext_CoreTextFormatUpdatingEventArgs_Release __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextFormatUpdatingEventArgs_Release
#define ITypedEventHandler_CoreTextEditContext_CoreTextFormatUpdatingEventArgs_Invoke __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextFormatUpdatingEventArgs_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextFormatUpdatingEventArgs_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,ABI::Windows::UI::Text::Core::CoreTextLayoutRequestedEventArgs* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextLayoutRequestedEventArgs_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextLayoutRequestedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextLayoutRequestedEventArgs, 0x1a5f5596, 0x561c, 0x57f6, 0xa4,0xff, 0xcb,0x85,0x01,0x3c,0x65,0x44);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("1a5f5596-561c-57f6-a4ff-cb85013c6544")
            ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,ABI::Windows::UI::Text::Core::CoreTextLayoutRequestedEventArgs* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Text::Core::CoreTextEditContext*, ABI::Windows::UI::Text::Core::ICoreTextEditContext* >, ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Text::Core::CoreTextLayoutRequestedEventArgs*, ABI::Windows::UI::Text::Core::ICoreTextLayoutRequestedEventArgs* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextLayoutRequestedEventArgs, 0x1a5f5596, 0x561c, 0x57f6, 0xa4,0xff, 0xcb,0x85,0x01,0x3c,0x65,0x44)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextLayoutRequestedEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,ABI::Windows::UI::Text::Core::CoreTextLayoutRequestedEventArgs* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextLayoutRequestedEventArgs *This,
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext *sender,
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestedEventArgs *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextLayoutRequestedEventArgsVtbl;

interface __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextLayoutRequestedEventArgs {
    CONST_VTBL __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextLayoutRequestedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextLayoutRequestedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextLayoutRequestedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextLayoutRequestedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,ABI::Windows::UI::Text::Core::CoreTextLayoutRequestedEventArgs* > methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextLayoutRequestedEventArgs_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextLayoutRequestedEventArgs_QueryInterface(__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextLayoutRequestedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextLayoutRequestedEventArgs_AddRef(__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextLayoutRequestedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextLayoutRequestedEventArgs_Release(__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextLayoutRequestedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,ABI::Windows::UI::Text::Core::CoreTextLayoutRequestedEventArgs* > methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextLayoutRequestedEventArgs_Invoke(__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextLayoutRequestedEventArgs* This,__x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext *sender,__x_ABI_CWindows_CUI_CText_CCore_CICoreTextLayoutRequestedEventArgs *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_CoreTextEditContext_CoreTextLayoutRequestedEventArgs IID___FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextLayoutRequestedEventArgs
#define ITypedEventHandler_CoreTextEditContext_CoreTextLayoutRequestedEventArgsVtbl __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextLayoutRequestedEventArgsVtbl
#define ITypedEventHandler_CoreTextEditContext_CoreTextLayoutRequestedEventArgs __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextLayoutRequestedEventArgs
#define ITypedEventHandler_CoreTextEditContext_CoreTextLayoutRequestedEventArgs_QueryInterface __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextLayoutRequestedEventArgs_QueryInterface
#define ITypedEventHandler_CoreTextEditContext_CoreTextLayoutRequestedEventArgs_AddRef __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextLayoutRequestedEventArgs_AddRef
#define ITypedEventHandler_CoreTextEditContext_CoreTextLayoutRequestedEventArgs_Release __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextLayoutRequestedEventArgs_Release
#define ITypedEventHandler_CoreTextEditContext_CoreTextLayoutRequestedEventArgs_Invoke __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextLayoutRequestedEventArgs_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextLayoutRequestedEventArgs_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,ABI::Windows::UI::Text::Core::CoreTextSelectionRequestedEventArgs* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionRequestedEventArgs_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionRequestedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionRequestedEventArgs, 0x882e51e1, 0xf4a3, 0x57e5, 0x93,0x92, 0x6a,0x8c,0x38,0x57,0x91,0x81);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("882e51e1-f4a3-57e5-9392-6a8c38579181")
            ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,ABI::Windows::UI::Text::Core::CoreTextSelectionRequestedEventArgs* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Text::Core::CoreTextEditContext*, ABI::Windows::UI::Text::Core::ICoreTextEditContext* >, ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Text::Core::CoreTextSelectionRequestedEventArgs*, ABI::Windows::UI::Text::Core::ICoreTextSelectionRequestedEventArgs* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionRequestedEventArgs, 0x882e51e1, 0xf4a3, 0x57e5, 0x93,0x92, 0x6a,0x8c,0x38,0x57,0x91,0x81)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionRequestedEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,ABI::Windows::UI::Text::Core::CoreTextSelectionRequestedEventArgs* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionRequestedEventArgs *This,
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext *sender,
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestedEventArgs *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionRequestedEventArgsVtbl;

interface __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionRequestedEventArgs {
    CONST_VTBL __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionRequestedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionRequestedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionRequestedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionRequestedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,ABI::Windows::UI::Text::Core::CoreTextSelectionRequestedEventArgs* > methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionRequestedEventArgs_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionRequestedEventArgs_QueryInterface(__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionRequestedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionRequestedEventArgs_AddRef(__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionRequestedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionRequestedEventArgs_Release(__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionRequestedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,ABI::Windows::UI::Text::Core::CoreTextSelectionRequestedEventArgs* > methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionRequestedEventArgs_Invoke(__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionRequestedEventArgs* This,__x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext *sender,__x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionRequestedEventArgs *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_CoreTextEditContext_CoreTextSelectionRequestedEventArgs IID___FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionRequestedEventArgs
#define ITypedEventHandler_CoreTextEditContext_CoreTextSelectionRequestedEventArgsVtbl __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionRequestedEventArgsVtbl
#define ITypedEventHandler_CoreTextEditContext_CoreTextSelectionRequestedEventArgs __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionRequestedEventArgs
#define ITypedEventHandler_CoreTextEditContext_CoreTextSelectionRequestedEventArgs_QueryInterface __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionRequestedEventArgs_QueryInterface
#define ITypedEventHandler_CoreTextEditContext_CoreTextSelectionRequestedEventArgs_AddRef __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionRequestedEventArgs_AddRef
#define ITypedEventHandler_CoreTextEditContext_CoreTextSelectionRequestedEventArgs_Release __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionRequestedEventArgs_Release
#define ITypedEventHandler_CoreTextEditContext_CoreTextSelectionRequestedEventArgs_Invoke __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionRequestedEventArgs_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionRequestedEventArgs_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,ABI::Windows::UI::Text::Core::CoreTextSelectionUpdatingEventArgs* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionUpdatingEventArgs_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionUpdatingEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionUpdatingEventArgs, 0x6b140a40, 0xd461, 0x555a, 0xb6,0xeb, 0x5d,0xbb,0x8e,0x21,0x01,0xe5);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("6b140a40-d461-555a-b6eb-5dbb8e2101e5")
            ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,ABI::Windows::UI::Text::Core::CoreTextSelectionUpdatingEventArgs* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Text::Core::CoreTextEditContext*, ABI::Windows::UI::Text::Core::ICoreTextEditContext* >, ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Text::Core::CoreTextSelectionUpdatingEventArgs*, ABI::Windows::UI::Text::Core::ICoreTextSelectionUpdatingEventArgs* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionUpdatingEventArgs, 0x6b140a40, 0xd461, 0x555a, 0xb6,0xeb, 0x5d,0xbb,0x8e,0x21,0x01,0xe5)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionUpdatingEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,ABI::Windows::UI::Text::Core::CoreTextSelectionUpdatingEventArgs* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionUpdatingEventArgs *This,
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext *sender,
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionUpdatingEventArgsVtbl;

interface __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionUpdatingEventArgs {
    CONST_VTBL __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionUpdatingEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionUpdatingEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionUpdatingEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionUpdatingEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,ABI::Windows::UI::Text::Core::CoreTextSelectionUpdatingEventArgs* > methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionUpdatingEventArgs_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionUpdatingEventArgs_QueryInterface(__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionUpdatingEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionUpdatingEventArgs_AddRef(__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionUpdatingEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionUpdatingEventArgs_Release(__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionUpdatingEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,ABI::Windows::UI::Text::Core::CoreTextSelectionUpdatingEventArgs* > methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionUpdatingEventArgs_Invoke(__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionUpdatingEventArgs* This,__x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext *sender,__x_ABI_CWindows_CUI_CText_CCore_CICoreTextSelectionUpdatingEventArgs *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_CoreTextEditContext_CoreTextSelectionUpdatingEventArgs IID___FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionUpdatingEventArgs
#define ITypedEventHandler_CoreTextEditContext_CoreTextSelectionUpdatingEventArgsVtbl __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionUpdatingEventArgsVtbl
#define ITypedEventHandler_CoreTextEditContext_CoreTextSelectionUpdatingEventArgs __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionUpdatingEventArgs
#define ITypedEventHandler_CoreTextEditContext_CoreTextSelectionUpdatingEventArgs_QueryInterface __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionUpdatingEventArgs_QueryInterface
#define ITypedEventHandler_CoreTextEditContext_CoreTextSelectionUpdatingEventArgs_AddRef __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionUpdatingEventArgs_AddRef
#define ITypedEventHandler_CoreTextEditContext_CoreTextSelectionUpdatingEventArgs_Release __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionUpdatingEventArgs_Release
#define ITypedEventHandler_CoreTextEditContext_CoreTextSelectionUpdatingEventArgs_Invoke __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionUpdatingEventArgs_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextSelectionUpdatingEventArgs_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,ABI::Windows::UI::Text::Core::CoreTextTextRequestedEventArgs* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextRequestedEventArgs_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextRequestedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextRequestedEventArgs, 0xc7e08176, 0x4134, 0x50b7, 0xbc,0x73, 0x72,0x9e,0x9f,0x9a,0xd2,0x2a);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("c7e08176-4134-50b7-bc73-729e9f9ad22a")
            ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,ABI::Windows::UI::Text::Core::CoreTextTextRequestedEventArgs* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Text::Core::CoreTextEditContext*, ABI::Windows::UI::Text::Core::ICoreTextEditContext* >, ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Text::Core::CoreTextTextRequestedEventArgs*, ABI::Windows::UI::Text::Core::ICoreTextTextRequestedEventArgs* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextRequestedEventArgs, 0xc7e08176, 0x4134, 0x50b7, 0xbc,0x73, 0x72,0x9e,0x9f,0x9a,0xd2,0x2a)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextRequestedEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,ABI::Windows::UI::Text::Core::CoreTextTextRequestedEventArgs* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextRequestedEventArgs *This,
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext *sender,
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestedEventArgs *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextRequestedEventArgsVtbl;

interface __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextRequestedEventArgs {
    CONST_VTBL __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextRequestedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextRequestedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextRequestedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextRequestedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,ABI::Windows::UI::Text::Core::CoreTextTextRequestedEventArgs* > methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextRequestedEventArgs_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextRequestedEventArgs_QueryInterface(__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextRequestedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextRequestedEventArgs_AddRef(__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextRequestedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextRequestedEventArgs_Release(__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextRequestedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,ABI::Windows::UI::Text::Core::CoreTextTextRequestedEventArgs* > methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextRequestedEventArgs_Invoke(__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextRequestedEventArgs* This,__x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext *sender,__x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextRequestedEventArgs *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_CoreTextEditContext_CoreTextTextRequestedEventArgs IID___FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextRequestedEventArgs
#define ITypedEventHandler_CoreTextEditContext_CoreTextTextRequestedEventArgsVtbl __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextRequestedEventArgsVtbl
#define ITypedEventHandler_CoreTextEditContext_CoreTextTextRequestedEventArgs __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextRequestedEventArgs
#define ITypedEventHandler_CoreTextEditContext_CoreTextTextRequestedEventArgs_QueryInterface __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextRequestedEventArgs_QueryInterface
#define ITypedEventHandler_CoreTextEditContext_CoreTextTextRequestedEventArgs_AddRef __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextRequestedEventArgs_AddRef
#define ITypedEventHandler_CoreTextEditContext_CoreTextTextRequestedEventArgs_Release __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextRequestedEventArgs_Release
#define ITypedEventHandler_CoreTextEditContext_CoreTextTextRequestedEventArgs_Invoke __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextRequestedEventArgs_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextRequestedEventArgs_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,ABI::Windows::UI::Text::Core::CoreTextTextUpdatingEventArgs* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextUpdatingEventArgs_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextUpdatingEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextUpdatingEventArgs, 0xfd896a84, 0xdf7c, 0x50d5, 0x91,0x67, 0x58,0xf6,0x16,0xbd,0xdb,0x6e);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("fd896a84-df7c-50d5-9167-58f616bddb6e")
            ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,ABI::Windows::UI::Text::Core::CoreTextTextUpdatingEventArgs* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Text::Core::CoreTextEditContext*, ABI::Windows::UI::Text::Core::ICoreTextEditContext* >, ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Text::Core::CoreTextTextUpdatingEventArgs*, ABI::Windows::UI::Text::Core::ICoreTextTextUpdatingEventArgs* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextUpdatingEventArgs, 0xfd896a84, 0xdf7c, 0x50d5, 0x91,0x67, 0x58,0xf6,0x16,0xbd,0xdb,0x6e)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextUpdatingEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,ABI::Windows::UI::Text::Core::CoreTextTextUpdatingEventArgs* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextUpdatingEventArgs *This,
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext *sender,
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextUpdatingEventArgsVtbl;

interface __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextUpdatingEventArgs {
    CONST_VTBL __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextUpdatingEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextUpdatingEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextUpdatingEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextUpdatingEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,ABI::Windows::UI::Text::Core::CoreTextTextUpdatingEventArgs* > methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextUpdatingEventArgs_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextUpdatingEventArgs_QueryInterface(__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextUpdatingEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextUpdatingEventArgs_AddRef(__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextUpdatingEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextUpdatingEventArgs_Release(__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextUpdatingEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextEditContext*,ABI::Windows::UI::Text::Core::CoreTextTextUpdatingEventArgs* > methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextUpdatingEventArgs_Invoke(__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextUpdatingEventArgs* This,__x_ABI_CWindows_CUI_CText_CCore_CICoreTextEditContext *sender,__x_ABI_CWindows_CUI_CText_CCore_CICoreTextTextUpdatingEventArgs *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_CoreTextEditContext_CoreTextTextUpdatingEventArgs IID___FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextUpdatingEventArgs
#define ITypedEventHandler_CoreTextEditContext_CoreTextTextUpdatingEventArgsVtbl __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextUpdatingEventArgsVtbl
#define ITypedEventHandler_CoreTextEditContext_CoreTextTextUpdatingEventArgs __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextUpdatingEventArgs
#define ITypedEventHandler_CoreTextEditContext_CoreTextTextUpdatingEventArgs_QueryInterface __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextUpdatingEventArgs_QueryInterface
#define ITypedEventHandler_CoreTextEditContext_CoreTextTextUpdatingEventArgs_AddRef __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextUpdatingEventArgs_AddRef
#define ITypedEventHandler_CoreTextEditContext_CoreTextTextUpdatingEventArgs_Release __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextUpdatingEventArgs_Release
#define ITypedEventHandler_CoreTextEditContext_CoreTextTextUpdatingEventArgs_Invoke __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextUpdatingEventArgs_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextEditContext_Windows__CUI__CText__CCore__CCoreTextTextUpdatingEventArgs_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextServicesManager*,IInspectable* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextServicesManager_IInspectable_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextServicesManager_IInspectable_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextServicesManager_IInspectable, 0x112fb01d, 0x260a, 0x51c6, 0x91,0x98, 0x5d,0xb3,0xe6,0xe9,0xef,0x3d);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("112fb01d-260a-51c6-9198-5db3e6e9ef3d")
            ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextServicesManager*,IInspectable* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Text::Core::CoreTextServicesManager*, ABI::Windows::UI::Text::Core::ICoreTextServicesManager* >, IInspectable* >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextServicesManager_IInspectable, 0x112fb01d, 0x260a, 0x51c6, 0x91,0x98, 0x5d,0xb3,0xe6,0xe9,0xef,0x3d)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextServicesManager_IInspectableVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextServicesManager*,IInspectable* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextServicesManager_IInspectable *This,
        __x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager *sender,
        IInspectable *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextServicesManager_IInspectableVtbl;

interface __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextServicesManager_IInspectable {
    CONST_VTBL __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextServicesManager_IInspectableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextServicesManager_IInspectable_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextServicesManager_IInspectable_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextServicesManager_IInspectable_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextServicesManager*,IInspectable* > methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextServicesManager_IInspectable_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextServicesManager_IInspectable_QueryInterface(__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextServicesManager_IInspectable* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextServicesManager_IInspectable_AddRef(__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextServicesManager_IInspectable* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextServicesManager_IInspectable_Release(__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextServicesManager_IInspectable* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::UI::Text::Core::CoreTextServicesManager*,IInspectable* > methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextServicesManager_IInspectable_Invoke(__FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextServicesManager_IInspectable* This,__x_ABI_CWindows_CUI_CText_CCore_CICoreTextServicesManager *sender,IInspectable *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_CoreTextServicesManager_IInspectable IID___FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextServicesManager_IInspectable
#define ITypedEventHandler_CoreTextServicesManager_IInspectableVtbl __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextServicesManager_IInspectableVtbl
#define ITypedEventHandler_CoreTextServicesManager_IInspectable __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextServicesManager_IInspectable
#define ITypedEventHandler_CoreTextServicesManager_IInspectable_QueryInterface __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextServicesManager_IInspectable_QueryInterface
#define ITypedEventHandler_CoreTextServicesManager_IInspectable_AddRef __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextServicesManager_IInspectable_AddRef
#define ITypedEventHandler_CoreTextServicesManager_IInspectable_Release __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextServicesManager_IInspectable_Release
#define ITypedEventHandler_CoreTextServicesManager_IInspectable_Invoke __FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextServicesManager_IInspectable_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CUI__CText__CCore__CCoreTextServicesManager_IInspectable_INTERFACE_DEFINED__ */

/* Begin additional prototypes for all interfaces */

ULONG           __RPC_USER HSTRING_UserSize     (ULONG *, ULONG, HSTRING *);
unsigned char * __RPC_USER HSTRING_UserMarshal  (ULONG *, unsigned char *, HSTRING *);
unsigned char * __RPC_USER HSTRING_UserUnmarshal(ULONG *, unsigned char *, HSTRING *);
void            __RPC_USER HSTRING_UserFree     (ULONG *, HSTRING *);

/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __windows_ui_text_core_h__ */
