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