/*** Autogenerated by WIDL 9.18 from include/windows.media.speechrecognition.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_media_speechrecognition_h__
#define __windows_media_speechrecognition_h__

#ifndef __WIDL_INLINE
#if defined(__cplusplus) || defined(_MSC_VER)
#define __WIDL_INLINE inline
#elif defined(__GNUC__)
#define __WIDL_INLINE __inline__
#endif
#endif

/* Forward declarations */

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionCompletedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionCompletedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionCompletedEventArgs __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionCompletedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionCompletedEventArgs ABI::Windows::Media::SpeechRecognition::ISpeechContinuousRecognitionCompletedEventArgs
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                interface ISpeechContinuousRecognitionCompletedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionResultGeneratedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionResultGeneratedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionResultGeneratedEventArgs __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionResultGeneratedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionResultGeneratedEventArgs ABI::Windows::Media::SpeechRecognition::ISpeechContinuousRecognitionResultGeneratedEventArgs
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                interface ISpeechContinuousRecognitionResultGeneratedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession ABI::Windows::Media::SpeechRecognition::ISpeechContinuousRecognitionSession
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                interface ISpeechContinuousRecognitionSession;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionCompilationResult_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionCompilationResult_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionCompilationResult __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionCompilationResult;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionCompilationResult ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionCompilationResult
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                interface ISpeechRecognitionCompilationResult;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionConstraint
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                interface ISpeechRecognitionConstraint;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesis_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesis_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesis __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesis;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesis ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionHypothesis
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                interface ISpeechRecognitionHypothesis;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesisGeneratedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesisGeneratedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesisGeneratedEventArgs __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesisGeneratedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesisGeneratedEventArgs ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionHypothesisGeneratedEventArgs
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                interface ISpeechRecognitionHypothesisGeneratedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraint_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraint_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraint __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraint;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraint ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionListConstraint
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                interface ISpeechRecognitionListConstraint;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintFactory __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintFactory ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionListConstraintFactory
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                interface ISpeechRecognitionListConstraintFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionQualityDegradingEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionQualityDegradingEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionQualityDegradingEventArgs __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionQualityDegradingEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionQualityDegradingEventArgs ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionQualityDegradingEventArgs
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                interface ISpeechRecognitionQualityDegradingEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionResult
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                interface ISpeechRecognitionResult;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult2_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult2 __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult2 ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionResult2
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                interface ISpeechRecognitionResult2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionSemanticInterpretation_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionSemanticInterpretation_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionSemanticInterpretation __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionSemanticInterpretation;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionSemanticInterpretation ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionSemanticInterpretation
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                interface ISpeechRecognitionSemanticInterpretation;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer ABI::Windows::Media::SpeechRecognition::ISpeechRecognizer
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                interface ISpeechRecognizer;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2 __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2 ABI::Windows::Media::SpeechRecognition::ISpeechRecognizer2
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                interface ISpeechRecognizer2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerFactory __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerFactory ABI::Windows::Media::SpeechRecognition::ISpeechRecognizerFactory
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                interface ISpeechRecognizerFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStateChangedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStateChangedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStateChangedEventArgs __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStateChangedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStateChangedEventArgs ABI::Windows::Media::SpeechRecognition::ISpeechRecognizerStateChangedEventArgs
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                interface ISpeechRecognizerStateChangedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics ABI::Windows::Media::SpeechRecognition::ISpeechRecognizerStatics
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                interface ISpeechRecognizerStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics2_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics2 __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics2 ABI::Windows::Media::SpeechRecognition::ISpeechRecognizerStatics2
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                interface ISpeechRecognizerStatics2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts ABI::Windows::Media::SpeechRecognition::ISpeechRecognizerTimeouts
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                interface ISpeechRecognizerTimeouts;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions ABI::Windows::Media::SpeechRecognition::ISpeechRecognizerUIOptions
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                interface ISpeechRecognizerUIOptions;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSet_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSet_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSet __x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSet;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSet ABI::Windows::Media::SpeechRecognition::IVoiceCommandSet
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                interface IVoiceCommandSet;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechContinuousRecognitionCompletedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechContinuousRecognitionCompletedEventArgs_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                class SpeechContinuousRecognitionCompletedEventArgs;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechContinuousRecognitionCompletedEventArgs __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechContinuousRecognitionCompletedEventArgs;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechContinuousRecognitionCompletedEventArgs_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechContinuousRecognitionResultGeneratedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechContinuousRecognitionResultGeneratedEventArgs_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                class SpeechContinuousRecognitionResultGeneratedEventArgs;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechContinuousRecognitionResultGeneratedEventArgs __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechContinuousRecognitionResultGeneratedEventArgs;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechContinuousRecognitionResultGeneratedEventArgs_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechContinuousRecognitionSession_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechContinuousRecognitionSession_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                class SpeechContinuousRecognitionSession;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechContinuousRecognitionSession __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechContinuousRecognitionSession;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechContinuousRecognitionSession_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionCompilationResult_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionCompilationResult_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                class SpeechRecognitionCompilationResult;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionCompilationResult __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionCompilationResult;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionCompilationResult_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionHypothesis_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionHypothesis_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                class SpeechRecognitionHypothesis;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionHypothesis __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionHypothesis;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionHypothesis_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionHypothesisGeneratedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionHypothesisGeneratedEventArgs_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                class SpeechRecognitionHypothesisGeneratedEventArgs;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionHypothesisGeneratedEventArgs __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionHypothesisGeneratedEventArgs;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionHypothesisGeneratedEventArgs_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionListConstraint_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionListConstraint_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                class SpeechRecognitionListConstraint;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionListConstraint __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionListConstraint;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionListConstraint_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionQualityDegradingEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionQualityDegradingEventArgs_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                class SpeechRecognitionQualityDegradingEventArgs;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionQualityDegradingEventArgs __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionQualityDegradingEventArgs;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionQualityDegradingEventArgs_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionResult_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionResult_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                class SpeechRecognitionResult;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionResult __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionResult;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionResult_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionSemanticInterpretation_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionSemanticInterpretation_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                class SpeechRecognitionSemanticInterpretation;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionSemanticInterpretation __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionSemanticInterpretation;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionSemanticInterpretation_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognizer_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognizer_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                class SpeechRecognizer;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognizer __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognizer;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognizer_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognizerStateChangedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognizerStateChangedEventArgs_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                class SpeechRecognizerStateChangedEventArgs;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognizerStateChangedEventArgs __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognizerStateChangedEventArgs;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognizerStateChangedEventArgs_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognizerTimeouts_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognizerTimeouts_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                class SpeechRecognizerTimeouts;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognizerTimeouts __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognizerTimeouts;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognizerTimeouts_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognizerUIOptions_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognizerUIOptions_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                class SpeechRecognizerUIOptions;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognizerUIOptions __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognizerUIOptions;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognizerUIOptions_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CVoiceCommandSet_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CVoiceCommandSet_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                class VoiceCommandSet;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CMedia_CSpeechRecognition_CVoiceCommandSet __x_ABI_CWindows_CMedia_CSpeechRecognition_CVoiceCommandSet;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CMedia_CSpeechRecognition_CVoiceCommandSet_FWD_DEFINED__ */

#ifndef ____FIIterable_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_FWD_DEFINED__
#define ____FIIterable_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint __FIIterable_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionConstraint* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_FWD_DEFINED__
#define ____FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint __FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionConstraint* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionConstraint* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_FWD_DEFINED__
#define ____FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_FWD_DEFINED__
typedef interface __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint;
#ifdef __cplusplus
#define __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint ABI::Windows::Foundation::Collections::IVector<ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionConstraint* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_FWD_DEFINED__
#define ____FIIterable_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult __FIIterable_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionResult* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_FWD_DEFINED__
#define ____FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult __FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionResult* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionResult* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult_FWD_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult_FWD_DEFINED__
typedef interface __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult;
#ifdef __cplusplus
#define __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult ABI::Windows::Foundation::IAsyncOperationCompletedHandler<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionCompilationResult* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_FWD_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_FWD_DEFINED__
typedef interface __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult;
#ifdef __cplusplus
#define __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult ABI::Windows::Foundation::IAsyncOperationCompletedHandler<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionResult* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult_FWD_DEFINED__
#define ____FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult;
#ifdef __cplusplus
#define __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionCompilationResult* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_FWD_DEFINED__
#define ____FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult;
#ifdef __cplusplus
#define __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionResult* >
#endif /* __cplusplus */
#endif

#ifndef ____FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionCompletedEventArgs_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionCompletedEventArgs_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionCompletedEventArgs __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionCompletedEventArgs;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionCompletedEventArgs ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::Media::SpeechRecognition::SpeechContinuousRecognitionSession*,ABI::Windows::Media::SpeechRecognition::SpeechContinuousRecognitionCompletedEventArgs* >
#endif /* __cplusplus */
#endif

#ifndef ____FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionResultGeneratedEventArgs_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionResultGeneratedEventArgs_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionResultGeneratedEventArgs __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionResultGeneratedEventArgs;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionResultGeneratedEventArgs ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::Media::SpeechRecognition::SpeechContinuousRecognitionSession*,ABI::Windows::Media::SpeechRecognition::SpeechContinuousRecognitionResultGeneratedEventArgs* >
#endif /* __cplusplus */
#endif

#ifndef ____FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionHypothesisGeneratedEventArgs_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionHypothesisGeneratedEventArgs_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionHypothesisGeneratedEventArgs __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionHypothesisGeneratedEventArgs;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionHypothesisGeneratedEventArgs ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::Media::SpeechRecognition::SpeechRecognizer*,ABI::Windows::Media::SpeechRecognition::SpeechRecognitionHypothesisGeneratedEventArgs* >
#endif /* __cplusplus */
#endif

#ifndef ____FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionQualityDegradingEventArgs_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionQualityDegradingEventArgs_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionQualityDegradingEventArgs __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionQualityDegradingEventArgs;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionQualityDegradingEventArgs ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::Media::SpeechRecognition::SpeechRecognizer*,ABI::Windows::Media::SpeechRecognition::SpeechRecognitionQualityDegradingEventArgs* >
#endif /* __cplusplus */
#endif

#ifndef ____FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognizerStateChangedEventArgs_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognizerStateChangedEventArgs_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognizerStateChangedEventArgs __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognizerStateChangedEventArgs;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognizerStateChangedEventArgs ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::Media::SpeechRecognition::SpeechRecognizer*,ABI::Windows::Media::SpeechRecognition::SpeechRecognizerStateChangedEventArgs* >
#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>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechContinuousRecognitionMode __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechContinuousRecognitionMode;
#endif /* __cplusplus */

#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionAudioProblem __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionAudioProblem;
#endif /* __cplusplus */

#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionConfidence __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionConfidence;
#endif /* __cplusplus */

#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionConstraintProbability __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionConstraintProbability;
#endif /* __cplusplus */

#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionConstraintType __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionConstraintType;
#endif /* __cplusplus */

#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionResultStatus __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionResultStatus;
#endif /* __cplusplus */

#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognizerState __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognizerState;
#endif /* __cplusplus */

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionCompletedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionCompletedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionCompletedEventArgs __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionCompletedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionCompletedEventArgs ABI::Windows::Media::SpeechRecognition::ISpeechContinuousRecognitionCompletedEventArgs
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                interface ISpeechContinuousRecognitionCompletedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionResultGeneratedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionResultGeneratedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionResultGeneratedEventArgs __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionResultGeneratedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionResultGeneratedEventArgs ABI::Windows::Media::SpeechRecognition::ISpeechContinuousRecognitionResultGeneratedEventArgs
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                interface ISpeechContinuousRecognitionResultGeneratedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession ABI::Windows::Media::SpeechRecognition::ISpeechContinuousRecognitionSession
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                interface ISpeechContinuousRecognitionSession;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionCompilationResult_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionCompilationResult_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionCompilationResult __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionCompilationResult;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionCompilationResult ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionCompilationResult
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                interface ISpeechRecognitionCompilationResult;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionConstraint
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                interface ISpeechRecognitionConstraint;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesis_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesis_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesis __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesis;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesis ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionHypothesis
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                interface ISpeechRecognitionHypothesis;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesisGeneratedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesisGeneratedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesisGeneratedEventArgs __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesisGeneratedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesisGeneratedEventArgs ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionHypothesisGeneratedEventArgs
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                interface ISpeechRecognitionHypothesisGeneratedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraint_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraint_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraint __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraint;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraint ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionListConstraint
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                interface ISpeechRecognitionListConstraint;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintFactory __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintFactory ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionListConstraintFactory
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                interface ISpeechRecognitionListConstraintFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionQualityDegradingEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionQualityDegradingEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionQualityDegradingEventArgs __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionQualityDegradingEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionQualityDegradingEventArgs ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionQualityDegradingEventArgs
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                interface ISpeechRecognitionQualityDegradingEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionResult
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                interface ISpeechRecognitionResult;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult2_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult2 __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult2 ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionResult2
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                interface ISpeechRecognitionResult2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionSemanticInterpretation_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionSemanticInterpretation_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionSemanticInterpretation __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionSemanticInterpretation;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionSemanticInterpretation ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionSemanticInterpretation
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                interface ISpeechRecognitionSemanticInterpretation;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer ABI::Windows::Media::SpeechRecognition::ISpeechRecognizer
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                interface ISpeechRecognizer;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2 __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2 ABI::Windows::Media::SpeechRecognition::ISpeechRecognizer2
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                interface ISpeechRecognizer2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerFactory __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerFactory ABI::Windows::Media::SpeechRecognition::ISpeechRecognizerFactory
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                interface ISpeechRecognizerFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStateChangedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStateChangedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStateChangedEventArgs __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStateChangedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStateChangedEventArgs ABI::Windows::Media::SpeechRecognition::ISpeechRecognizerStateChangedEventArgs
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                interface ISpeechRecognizerStateChangedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics ABI::Windows::Media::SpeechRecognition::ISpeechRecognizerStatics
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                interface ISpeechRecognizerStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics2_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics2 __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics2 ABI::Windows::Media::SpeechRecognition::ISpeechRecognizerStatics2
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                interface ISpeechRecognizerStatics2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts ABI::Windows::Media::SpeechRecognition::ISpeechRecognizerTimeouts
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                interface ISpeechRecognizerTimeouts;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions ABI::Windows::Media::SpeechRecognition::ISpeechRecognizerUIOptions
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                interface ISpeechRecognizerUIOptions;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSet_FWD_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSet_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSet __x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSet;
#ifdef __cplusplus
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSet ABI::Windows::Media::SpeechRecognition::IVoiceCommandSet
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                interface IVoiceCommandSet;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_FWD_DEFINED__
#define ____FIIterable_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint __FIIterable_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionConstraint* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_FWD_DEFINED__
#define ____FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint __FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionConstraint* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionConstraint* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_FWD_DEFINED__
#define ____FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_FWD_DEFINED__
typedef interface __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint;
#ifdef __cplusplus
#define __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint ABI::Windows::Foundation::Collections::IVector<ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionConstraint* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_FWD_DEFINED__
#define ____FIIterable_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult __FIIterable_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionResult* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_FWD_DEFINED__
#define ____FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult __FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionResult* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionResult* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult_FWD_DEFINED__
#define ____FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult;
#ifdef __cplusplus
#define __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionCompilationResult* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_FWD_DEFINED__
#define ____FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult;
#ifdef __cplusplus
#define __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionResult* >
#endif /* __cplusplus */
#endif

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                enum SpeechContinuousRecognitionMode {
                    SpeechContinuousRecognitionMode_Default = 0,
                    SpeechContinuousRecognitionMode_PauseOnRecognition = 1
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechContinuousRecognitionMode {
    SpeechContinuousRecognitionMode_Default = 0,
    SpeechContinuousRecognitionMode_PauseOnRecognition = 1
};
#ifdef WIDL_using_Windows_Media_SpeechRecognition
#define SpeechContinuousRecognitionMode __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechContinuousRecognitionMode
#endif /* WIDL_using_Windows_Media_SpeechRecognition */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                enum SpeechRecognitionAudioProblem {
                    SpeechRecognitionAudioProblem_None = 0,
                    SpeechRecognitionAudioProblem_TooNoisy = 1,
                    SpeechRecognitionAudioProblem_NoSignal = 2,
                    SpeechRecognitionAudioProblem_TooLoud = 3,
                    SpeechRecognitionAudioProblem_TooQuiet = 4,
                    SpeechRecognitionAudioProblem_TooFast = 5,
                    SpeechRecognitionAudioProblem_TooSlow = 6
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionAudioProblem {
    SpeechRecognitionAudioProblem_None = 0,
    SpeechRecognitionAudioProblem_TooNoisy = 1,
    SpeechRecognitionAudioProblem_NoSignal = 2,
    SpeechRecognitionAudioProblem_TooLoud = 3,
    SpeechRecognitionAudioProblem_TooQuiet = 4,
    SpeechRecognitionAudioProblem_TooFast = 5,
    SpeechRecognitionAudioProblem_TooSlow = 6
};
#ifdef WIDL_using_Windows_Media_SpeechRecognition
#define SpeechRecognitionAudioProblem __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionAudioProblem
#endif /* WIDL_using_Windows_Media_SpeechRecognition */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                enum SpeechRecognitionConfidence {
                    SpeechRecognitionConfidence_High = 0,
                    SpeechRecognitionConfidence_Medium = 1,
                    SpeechRecognitionConfidence_Low = 2,
                    SpeechRecognitionConfidence_Rejected = 3
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionConfidence {
    SpeechRecognitionConfidence_High = 0,
    SpeechRecognitionConfidence_Medium = 1,
    SpeechRecognitionConfidence_Low = 2,
    SpeechRecognitionConfidence_Rejected = 3
};
#ifdef WIDL_using_Windows_Media_SpeechRecognition
#define SpeechRecognitionConfidence __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionConfidence
#endif /* WIDL_using_Windows_Media_SpeechRecognition */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                enum SpeechRecognitionConstraintProbability {
                    SpeechRecognitionConstraintProbability_Default = 0,
                    SpeechRecognitionConstraintProbability_Min = 1,
                    SpeechRecognitionConstraintProbability_Max = 2
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionConstraintProbability {
    SpeechRecognitionConstraintProbability_Default = 0,
    SpeechRecognitionConstraintProbability_Min = 1,
    SpeechRecognitionConstraintProbability_Max = 2
};
#ifdef WIDL_using_Windows_Media_SpeechRecognition
#define SpeechRecognitionConstraintProbability __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionConstraintProbability
#endif /* WIDL_using_Windows_Media_SpeechRecognition */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                enum SpeechRecognitionConstraintType {
                    SpeechRecognitionConstraintType_Topic = 0,
                    SpeechRecognitionConstraintType_List = 1,
                    SpeechRecognitionConstraintType_Grammar = 2,
                    SpeechRecognitionConstraintType_VoiceCommandDefinition = 3
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionConstraintType {
    SpeechRecognitionConstraintType_Topic = 0,
    SpeechRecognitionConstraintType_List = 1,
    SpeechRecognitionConstraintType_Grammar = 2,
    SpeechRecognitionConstraintType_VoiceCommandDefinition = 3
};
#ifdef WIDL_using_Windows_Media_SpeechRecognition
#define SpeechRecognitionConstraintType __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionConstraintType
#endif /* WIDL_using_Windows_Media_SpeechRecognition */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                enum SpeechRecognitionResultStatus {
                    SpeechRecognitionResultStatus_Success = 0,
                    SpeechRecognitionResultStatus_TopicLanguageNotSupported = 1,
                    SpeechRecognitionResultStatus_GrammarLanguageMismatch = 2,
                    SpeechRecognitionResultStatus_GrammarCompilationFailure = 3,
                    SpeechRecognitionResultStatus_AudioQualityFailure = 4,
                    SpeechRecognitionResultStatus_UserCanceled = 5,
                    SpeechRecognitionResultStatus_Unknown = 6,
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
                    SpeechRecognitionResultStatus_TimeoutExceeded = 7,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
                    SpeechRecognitionResultStatus_PauseLimitExceeded = 8,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
                    SpeechRecognitionResultStatus_NetworkFailure = 9,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
                    SpeechRecognitionResultStatus_MicrophoneUnavailable = 10
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionResultStatus {
    SpeechRecognitionResultStatus_Success = 0,
    SpeechRecognitionResultStatus_TopicLanguageNotSupported = 1,
    SpeechRecognitionResultStatus_GrammarLanguageMismatch = 2,
    SpeechRecognitionResultStatus_GrammarCompilationFailure = 3,
    SpeechRecognitionResultStatus_AudioQualityFailure = 4,
    SpeechRecognitionResultStatus_UserCanceled = 5,
    SpeechRecognitionResultStatus_Unknown = 6,
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
    SpeechRecognitionResultStatus_TimeoutExceeded = 7,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
    SpeechRecognitionResultStatus_PauseLimitExceeded = 8,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
    SpeechRecognitionResultStatus_NetworkFailure = 9,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
    SpeechRecognitionResultStatus_MicrophoneUnavailable = 10
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
};
#ifdef WIDL_using_Windows_Media_SpeechRecognition
#define SpeechRecognitionResultStatus __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionResultStatus
#endif /* WIDL_using_Windows_Media_SpeechRecognition */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                enum SpeechRecognizerState {
                    SpeechRecognizerState_Idle = 0,
                    SpeechRecognizerState_Capturing = 1,
                    SpeechRecognizerState_Processing = 2,
                    SpeechRecognizerState_SoundStarted = 3,
                    SpeechRecognizerState_SoundEnded = 4,
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
                    SpeechRecognizerState_SpeechDetected = 5,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
                    SpeechRecognizerState_Paused = 6
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognizerState {
    SpeechRecognizerState_Idle = 0,
    SpeechRecognizerState_Capturing = 1,
    SpeechRecognizerState_Processing = 2,
    SpeechRecognizerState_SoundStarted = 3,
    SpeechRecognizerState_SoundEnded = 4,
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
    SpeechRecognizerState_SpeechDetected = 5,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
    SpeechRecognizerState_Paused = 6
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
};
#ifdef WIDL_using_Windows_Media_SpeechRecognition
#define SpeechRecognizerState __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognizerState
#endif /* WIDL_using_Windows_Media_SpeechRecognition */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
/*****************************************************************************
 * ISpeechContinuousRecognitionCompletedEventArgs interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionCompletedEventArgs_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionCompletedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionCompletedEventArgs, 0xe3d069bb, 0xe30c, 0x5e18, 0x42,0x4b, 0x7f,0xbe,0x81,0xf8,0xfb,0xd0);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                MIDL_INTERFACE("e3d069bb-e30c-5e18-424b-7fbe81f8fbd0")
                ISpeechContinuousRecognitionCompletedEventArgs : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Status(
                        ABI::Windows::Media::SpeechRecognition::SpeechRecognitionResultStatus *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionCompletedEventArgs, 0xe3d069bb, 0xe30c, 0x5e18, 0x42,0x4b, 0x7f,0xbe,0x81,0xf8,0xfb,0xd0)
#endif
#else
typedef struct __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionCompletedEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** ISpeechContinuousRecognitionCompletedEventArgs methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Status)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionCompletedEventArgs *This,
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionResultStatus *value);

    END_INTERFACE
} __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionCompletedEventArgsVtbl;

interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionCompletedEventArgs {
    CONST_VTBL __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionCompletedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionCompletedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionCompletedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionCompletedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionCompletedEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionCompletedEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionCompletedEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ISpeechContinuousRecognitionCompletedEventArgs methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionCompletedEventArgs_get_Status(This,value) (This)->lpVtbl->get_Status(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionCompletedEventArgs_QueryInterface(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionCompletedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionCompletedEventArgs_AddRef(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionCompletedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionCompletedEventArgs_Release(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionCompletedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionCompletedEventArgs_GetIids(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionCompletedEventArgs* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionCompletedEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionCompletedEventArgs* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionCompletedEventArgs_GetTrustLevel(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionCompletedEventArgs* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ISpeechContinuousRecognitionCompletedEventArgs methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionCompletedEventArgs_get_Status(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionCompletedEventArgs* This,__x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionResultStatus *value) {
    return This->lpVtbl->get_Status(This,value);
}
#endif
#ifdef WIDL_using_Windows_Media_SpeechRecognition
#define IID_ISpeechContinuousRecognitionCompletedEventArgs IID___x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionCompletedEventArgs
#define ISpeechContinuousRecognitionCompletedEventArgsVtbl __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionCompletedEventArgsVtbl
#define ISpeechContinuousRecognitionCompletedEventArgs __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionCompletedEventArgs
#define ISpeechContinuousRecognitionCompletedEventArgs_QueryInterface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionCompletedEventArgs_QueryInterface
#define ISpeechContinuousRecognitionCompletedEventArgs_AddRef __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionCompletedEventArgs_AddRef
#define ISpeechContinuousRecognitionCompletedEventArgs_Release __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionCompletedEventArgs_Release
#define ISpeechContinuousRecognitionCompletedEventArgs_GetIids __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionCompletedEventArgs_GetIids
#define ISpeechContinuousRecognitionCompletedEventArgs_GetRuntimeClassName __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionCompletedEventArgs_GetRuntimeClassName
#define ISpeechContinuousRecognitionCompletedEventArgs_GetTrustLevel __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionCompletedEventArgs_GetTrustLevel
#define ISpeechContinuousRecognitionCompletedEventArgs_get_Status __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionCompletedEventArgs_get_Status
#endif /* WIDL_using_Windows_Media_SpeechRecognition */
#endif

#endif

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

/*****************************************************************************
 * ISpeechContinuousRecognitionResultGeneratedEventArgs interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionResultGeneratedEventArgs_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionResultGeneratedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionResultGeneratedEventArgs, 0x19091e1e, 0x6e7e, 0x5a46, 0x40,0xfb, 0x76,0x59,0x4f,0x78,0x65,0x04);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                MIDL_INTERFACE("19091e1e-6e7e-5a46-40fb-76594f786504")
                ISpeechContinuousRecognitionResultGeneratedEventArgs : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Result(
                        ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionResult **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionResultGeneratedEventArgs, 0x19091e1e, 0x6e7e, 0x5a46, 0x40,0xfb, 0x76,0x59,0x4f,0x78,0x65,0x04)
#endif
#else
typedef struct __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionResultGeneratedEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** ISpeechContinuousRecognitionResultGeneratedEventArgs methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Result)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionResultGeneratedEventArgs *This,
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult **value);

    END_INTERFACE
} __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionResultGeneratedEventArgsVtbl;

interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionResultGeneratedEventArgs {
    CONST_VTBL __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionResultGeneratedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionResultGeneratedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionResultGeneratedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionResultGeneratedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionResultGeneratedEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionResultGeneratedEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionResultGeneratedEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ISpeechContinuousRecognitionResultGeneratedEventArgs methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionResultGeneratedEventArgs_get_Result(This,value) (This)->lpVtbl->get_Result(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionResultGeneratedEventArgs_QueryInterface(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionResultGeneratedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionResultGeneratedEventArgs_AddRef(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionResultGeneratedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionResultGeneratedEventArgs_Release(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionResultGeneratedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionResultGeneratedEventArgs_GetIids(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionResultGeneratedEventArgs* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionResultGeneratedEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionResultGeneratedEventArgs* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionResultGeneratedEventArgs_GetTrustLevel(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionResultGeneratedEventArgs* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ISpeechContinuousRecognitionResultGeneratedEventArgs methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionResultGeneratedEventArgs_get_Result(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionResultGeneratedEventArgs* This,__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult **value) {
    return This->lpVtbl->get_Result(This,value);
}
#endif
#ifdef WIDL_using_Windows_Media_SpeechRecognition
#define IID_ISpeechContinuousRecognitionResultGeneratedEventArgs IID___x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionResultGeneratedEventArgs
#define ISpeechContinuousRecognitionResultGeneratedEventArgsVtbl __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionResultGeneratedEventArgsVtbl
#define ISpeechContinuousRecognitionResultGeneratedEventArgs __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionResultGeneratedEventArgs
#define ISpeechContinuousRecognitionResultGeneratedEventArgs_QueryInterface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionResultGeneratedEventArgs_QueryInterface
#define ISpeechContinuousRecognitionResultGeneratedEventArgs_AddRef __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionResultGeneratedEventArgs_AddRef
#define ISpeechContinuousRecognitionResultGeneratedEventArgs_Release __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionResultGeneratedEventArgs_Release
#define ISpeechContinuousRecognitionResultGeneratedEventArgs_GetIids __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionResultGeneratedEventArgs_GetIids
#define ISpeechContinuousRecognitionResultGeneratedEventArgs_GetRuntimeClassName __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionResultGeneratedEventArgs_GetRuntimeClassName
#define ISpeechContinuousRecognitionResultGeneratedEventArgs_GetTrustLevel __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionResultGeneratedEventArgs_GetTrustLevel
#define ISpeechContinuousRecognitionResultGeneratedEventArgs_get_Result __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionResultGeneratedEventArgs_get_Result
#endif /* WIDL_using_Windows_Media_SpeechRecognition */
#endif

#endif

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

/*****************************************************************************
 * ISpeechContinuousRecognitionSession interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession, 0x6a213c04, 0x6614, 0x49f8, 0x99,0xa2, 0xb5,0xe9,0xb3,0xa0,0x85,0xc8);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                MIDL_INTERFACE("6a213c04-6614-49f8-99a2-b5e9b3a085c8")
                ISpeechContinuousRecognitionSession : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_AutoStopSilenceTimeout(
                        ABI::Windows::Foundation::TimeSpan *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_AutoStopSilenceTimeout(
                        ABI::Windows::Foundation::TimeSpan value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE StartAsync(
                        ABI::Windows::Foundation::IAsyncAction **action) = 0;

                    virtual HRESULT STDMETHODCALLTYPE StartWithModeAsync(
                        ABI::Windows::Media::SpeechRecognition::SpeechContinuousRecognitionMode mode,
                        ABI::Windows::Foundation::IAsyncAction **action) = 0;

                    virtual HRESULT STDMETHODCALLTYPE StopAsync(
                        ABI::Windows::Foundation::IAsyncAction **action) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CancelAsync(
                        ABI::Windows::Foundation::IAsyncAction **action) = 0;

                    virtual HRESULT STDMETHODCALLTYPE PauseAsync(
                        ABI::Windows::Foundation::IAsyncAction **action) = 0;

                    virtual HRESULT STDMETHODCALLTYPE Resume(
                        ) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_Completed(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::Media::SpeechRecognition::SpeechContinuousRecognitionSession*,ABI::Windows::Media::SpeechRecognition::SpeechContinuousRecognitionCompletedEventArgs* > *value,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_Completed(
                        EventRegistrationToken token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_ResultGenerated(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::Media::SpeechRecognition::SpeechContinuousRecognitionSession*,ABI::Windows::Media::SpeechRecognition::SpeechContinuousRecognitionResultGeneratedEventArgs* > *value,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_ResultGenerated(
                        EventRegistrationToken token) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession, 0x6a213c04, 0x6614, 0x49f8, 0x99,0xa2, 0xb5,0xe9,0xb3,0xa0,0x85,0xc8)
#endif
#else
typedef struct __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSessionVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** ISpeechContinuousRecognitionSession methods ***/
    HRESULT (STDMETHODCALLTYPE *get_AutoStopSilenceTimeout)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession *This,
        __x_ABI_CWindows_CFoundation_CTimeSpan *value);

    HRESULT (STDMETHODCALLTYPE *put_AutoStopSilenceTimeout)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession *This,
        __x_ABI_CWindows_CFoundation_CTimeSpan value);

    HRESULT (STDMETHODCALLTYPE *StartAsync)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession *This,
        __x_ABI_CWindows_CFoundation_CIAsyncAction **action);

    HRESULT (STDMETHODCALLTYPE *StartWithModeAsync)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession *This,
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechContinuousRecognitionMode mode,
        __x_ABI_CWindows_CFoundation_CIAsyncAction **action);

    HRESULT (STDMETHODCALLTYPE *StopAsync)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession *This,
        __x_ABI_CWindows_CFoundation_CIAsyncAction **action);

    HRESULT (STDMETHODCALLTYPE *CancelAsync)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession *This,
        __x_ABI_CWindows_CFoundation_CIAsyncAction **action);

    HRESULT (STDMETHODCALLTYPE *PauseAsync)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession *This,
        __x_ABI_CWindows_CFoundation_CIAsyncAction **action);

    HRESULT (STDMETHODCALLTYPE *Resume)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession *This);

    HRESULT (STDMETHODCALLTYPE *add_Completed)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession *This,
        __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionCompletedEventArgs *value,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_Completed)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession *This,
        EventRegistrationToken token);

    HRESULT (STDMETHODCALLTYPE *add_ResultGenerated)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession *This,
        __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionResultGeneratedEventArgs *value,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_ResultGenerated)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession *This,
        EventRegistrationToken token);

    END_INTERFACE
} __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSessionVtbl;

interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession {
    CONST_VTBL __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSessionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ISpeechContinuousRecognitionSession methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_get_AutoStopSilenceTimeout(This,value) (This)->lpVtbl->get_AutoStopSilenceTimeout(This,value)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_put_AutoStopSilenceTimeout(This,value) (This)->lpVtbl->put_AutoStopSilenceTimeout(This,value)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_StartAsync(This,action) (This)->lpVtbl->StartAsync(This,action)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_StartWithModeAsync(This,mode,action) (This)->lpVtbl->StartWithModeAsync(This,mode,action)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_StopAsync(This,action) (This)->lpVtbl->StopAsync(This,action)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_CancelAsync(This,action) (This)->lpVtbl->CancelAsync(This,action)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_PauseAsync(This,action) (This)->lpVtbl->PauseAsync(This,action)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_Resume(This) (This)->lpVtbl->Resume(This)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_add_Completed(This,value,token) (This)->lpVtbl->add_Completed(This,value,token)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_remove_Completed(This,token) (This)->lpVtbl->remove_Completed(This,token)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_add_ResultGenerated(This,value,token) (This)->lpVtbl->add_ResultGenerated(This,value,token)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_remove_ResultGenerated(This,token) (This)->lpVtbl->remove_ResultGenerated(This,token)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_QueryInterface(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_AddRef(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_Release(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_GetIids(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_GetRuntimeClassName(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_GetTrustLevel(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ISpeechContinuousRecognitionSession methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_get_AutoStopSilenceTimeout(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession* This,__x_ABI_CWindows_CFoundation_CTimeSpan *value) {
    return This->lpVtbl->get_AutoStopSilenceTimeout(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_put_AutoStopSilenceTimeout(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession* This,__x_ABI_CWindows_CFoundation_CTimeSpan value) {
    return This->lpVtbl->put_AutoStopSilenceTimeout(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_StartAsync(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession* This,__x_ABI_CWindows_CFoundation_CIAsyncAction **action) {
    return This->lpVtbl->StartAsync(This,action);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_StartWithModeAsync(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession* This,__x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechContinuousRecognitionMode mode,__x_ABI_CWindows_CFoundation_CIAsyncAction **action) {
    return This->lpVtbl->StartWithModeAsync(This,mode,action);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_StopAsync(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession* This,__x_ABI_CWindows_CFoundation_CIAsyncAction **action) {
    return This->lpVtbl->StopAsync(This,action);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_CancelAsync(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession* This,__x_ABI_CWindows_CFoundation_CIAsyncAction **action) {
    return This->lpVtbl->CancelAsync(This,action);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_PauseAsync(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession* This,__x_ABI_CWindows_CFoundation_CIAsyncAction **action) {
    return This->lpVtbl->PauseAsync(This,action);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_Resume(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession* This) {
    return This->lpVtbl->Resume(This);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_add_Completed(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession* This,__FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionCompletedEventArgs *value,EventRegistrationToken *token) {
    return This->lpVtbl->add_Completed(This,value,token);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_remove_Completed(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_Completed(This,token);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_add_ResultGenerated(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession* This,__FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionResultGeneratedEventArgs *value,EventRegistrationToken *token) {
    return This->lpVtbl->add_ResultGenerated(This,value,token);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_remove_ResultGenerated(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_ResultGenerated(This,token);
}
#endif
#ifdef WIDL_using_Windows_Media_SpeechRecognition
#define IID_ISpeechContinuousRecognitionSession IID___x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession
#define ISpeechContinuousRecognitionSessionVtbl __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSessionVtbl
#define ISpeechContinuousRecognitionSession __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession
#define ISpeechContinuousRecognitionSession_QueryInterface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_QueryInterface
#define ISpeechContinuousRecognitionSession_AddRef __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_AddRef
#define ISpeechContinuousRecognitionSession_Release __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_Release
#define ISpeechContinuousRecognitionSession_GetIids __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_GetIids
#define ISpeechContinuousRecognitionSession_GetRuntimeClassName __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_GetRuntimeClassName
#define ISpeechContinuousRecognitionSession_GetTrustLevel __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_GetTrustLevel
#define ISpeechContinuousRecognitionSession_get_AutoStopSilenceTimeout __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_get_AutoStopSilenceTimeout
#define ISpeechContinuousRecognitionSession_put_AutoStopSilenceTimeout __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_put_AutoStopSilenceTimeout
#define ISpeechContinuousRecognitionSession_StartAsync __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_StartAsync
#define ISpeechContinuousRecognitionSession_StartWithModeAsync __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_StartWithModeAsync
#define ISpeechContinuousRecognitionSession_StopAsync __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_StopAsync
#define ISpeechContinuousRecognitionSession_CancelAsync __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_CancelAsync
#define ISpeechContinuousRecognitionSession_PauseAsync __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_PauseAsync
#define ISpeechContinuousRecognitionSession_Resume __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_Resume
#define ISpeechContinuousRecognitionSession_add_Completed __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_add_Completed
#define ISpeechContinuousRecognitionSession_remove_Completed __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_remove_Completed
#define ISpeechContinuousRecognitionSession_add_ResultGenerated __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_add_ResultGenerated
#define ISpeechContinuousRecognitionSession_remove_ResultGenerated __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession_remove_ResultGenerated
#endif /* WIDL_using_Windows_Media_SpeechRecognition */
#endif

#endif

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

/*****************************************************************************
 * ISpeechRecognitionCompilationResult interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionCompilationResult_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionCompilationResult_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionCompilationResult, 0x407e6c5d, 0x6ac7, 0x4da4, 0x9c,0xc1, 0x2f,0xce,0x32,0xcf,0x74,0x89);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                MIDL_INTERFACE("407e6c5d-6ac7-4da4-9cc1-2fce32cf7489")
                ISpeechRecognitionCompilationResult : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Status(
                        ABI::Windows::Media::SpeechRecognition::SpeechRecognitionResultStatus *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionCompilationResult, 0x407e6c5d, 0x6ac7, 0x4da4, 0x9c,0xc1, 0x2f,0xce,0x32,0xcf,0x74,0x89)
#endif
#else
typedef struct __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionCompilationResultVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** ISpeechRecognitionCompilationResult methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Status)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionCompilationResult *This,
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionResultStatus *value);

    END_INTERFACE
} __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionCompilationResultVtbl;

interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionCompilationResult {
    CONST_VTBL __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionCompilationResultVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionCompilationResult_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionCompilationResult_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionCompilationResult_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionCompilationResult_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionCompilationResult_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionCompilationResult_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ISpeechRecognitionCompilationResult methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionCompilationResult_get_Status(This,value) (This)->lpVtbl->get_Status(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionCompilationResult_QueryInterface(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionCompilationResult* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionCompilationResult_AddRef(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionCompilationResult* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionCompilationResult_Release(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionCompilationResult* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionCompilationResult_GetIids(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionCompilationResult* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionCompilationResult_GetRuntimeClassName(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionCompilationResult* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionCompilationResult_GetTrustLevel(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionCompilationResult* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ISpeechRecognitionCompilationResult methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionCompilationResult_get_Status(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionCompilationResult* This,__x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionResultStatus *value) {
    return This->lpVtbl->get_Status(This,value);
}
#endif
#ifdef WIDL_using_Windows_Media_SpeechRecognition
#define IID_ISpeechRecognitionCompilationResult IID___x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionCompilationResult
#define ISpeechRecognitionCompilationResultVtbl __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionCompilationResultVtbl
#define ISpeechRecognitionCompilationResult __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionCompilationResult
#define ISpeechRecognitionCompilationResult_QueryInterface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionCompilationResult_QueryInterface
#define ISpeechRecognitionCompilationResult_AddRef __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionCompilationResult_AddRef
#define ISpeechRecognitionCompilationResult_Release __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionCompilationResult_Release
#define ISpeechRecognitionCompilationResult_GetIids __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionCompilationResult_GetIids
#define ISpeechRecognitionCompilationResult_GetRuntimeClassName __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionCompilationResult_GetRuntimeClassName
#define ISpeechRecognitionCompilationResult_GetTrustLevel __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionCompilationResult_GetTrustLevel
#define ISpeechRecognitionCompilationResult_get_Status __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionCompilationResult_get_Status
#endif /* WIDL_using_Windows_Media_SpeechRecognition */
#endif

#endif

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

/*****************************************************************************
 * ISpeechRecognitionConstraint interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint, 0x79ac1628, 0x4d68, 0x43c4, 0x89,0x11, 0x40,0xdc,0x41,0x01,0xb5,0x5b);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                MIDL_INTERFACE("79ac1628-4d68-43c4-8911-40dc4101b55b")
                ISpeechRecognitionConstraint : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_IsEnabled(
                        boolean *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_IsEnabled(
                        boolean value) = 0;

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

                    virtual HRESULT STDMETHODCALLTYPE put_Tag(
                        HSTRING value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Type(
                        ABI::Windows::Media::SpeechRecognition::SpeechRecognitionConstraintType *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Probability(
                        ABI::Windows::Media::SpeechRecognition::SpeechRecognitionConstraintProbability *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Probability(
                        ABI::Windows::Media::SpeechRecognition::SpeechRecognitionConstraintProbability value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint, 0x79ac1628, 0x4d68, 0x43c4, 0x89,0x11, 0x40,0xdc,0x41,0x01,0xb5,0x5b)
#endif
#else
typedef struct __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraintVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** ISpeechRecognitionConstraint methods ***/
    HRESULT (STDMETHODCALLTYPE *get_IsEnabled)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *put_IsEnabled)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint *This,
        boolean value);

    HRESULT (STDMETHODCALLTYPE *get_Tag)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *put_Tag)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint *This,
        HSTRING value);

    HRESULT (STDMETHODCALLTYPE *get_Type)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint *This,
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionConstraintType *value);

    HRESULT (STDMETHODCALLTYPE *get_Probability)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint *This,
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionConstraintProbability *value);

    HRESULT (STDMETHODCALLTYPE *put_Probability)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint *This,
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionConstraintProbability value);

    END_INTERFACE
} __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraintVtbl;

interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint {
    CONST_VTBL __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraintVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ISpeechRecognitionConstraint methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint_get_IsEnabled(This,value) (This)->lpVtbl->get_IsEnabled(This,value)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint_put_IsEnabled(This,value) (This)->lpVtbl->put_IsEnabled(This,value)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint_get_Tag(This,value) (This)->lpVtbl->get_Tag(This,value)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint_put_Tag(This,value) (This)->lpVtbl->put_Tag(This,value)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint_get_Type(This,value) (This)->lpVtbl->get_Type(This,value)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint_get_Probability(This,value) (This)->lpVtbl->get_Probability(This,value)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint_put_Probability(This,value) (This)->lpVtbl->put_Probability(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint_QueryInterface(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint_AddRef(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint_Release(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint_GetIids(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint_GetRuntimeClassName(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint_GetTrustLevel(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ISpeechRecognitionConstraint methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint_get_IsEnabled(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint* This,boolean *value) {
    return This->lpVtbl->get_IsEnabled(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint_put_IsEnabled(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint* This,boolean value) {
    return This->lpVtbl->put_IsEnabled(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint_get_Tag(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint* This,HSTRING *value) {
    return This->lpVtbl->get_Tag(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint_put_Tag(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint* This,HSTRING value) {
    return This->lpVtbl->put_Tag(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint_get_Type(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint* This,__x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionConstraintType *value) {
    return This->lpVtbl->get_Type(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint_get_Probability(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint* This,__x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionConstraintProbability *value) {
    return This->lpVtbl->get_Probability(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint_put_Probability(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint* This,__x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionConstraintProbability value) {
    return This->lpVtbl->put_Probability(This,value);
}
#endif
#ifdef WIDL_using_Windows_Media_SpeechRecognition
#define IID_ISpeechRecognitionConstraint IID___x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint
#define ISpeechRecognitionConstraintVtbl __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraintVtbl
#define ISpeechRecognitionConstraint __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint
#define ISpeechRecognitionConstraint_QueryInterface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint_QueryInterface
#define ISpeechRecognitionConstraint_AddRef __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint_AddRef
#define ISpeechRecognitionConstraint_Release __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint_Release
#define ISpeechRecognitionConstraint_GetIids __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint_GetIids
#define ISpeechRecognitionConstraint_GetRuntimeClassName __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint_GetRuntimeClassName
#define ISpeechRecognitionConstraint_GetTrustLevel __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint_GetTrustLevel
#define ISpeechRecognitionConstraint_get_IsEnabled __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint_get_IsEnabled
#define ISpeechRecognitionConstraint_put_IsEnabled __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint_put_IsEnabled
#define ISpeechRecognitionConstraint_get_Tag __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint_get_Tag
#define ISpeechRecognitionConstraint_put_Tag __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint_put_Tag
#define ISpeechRecognitionConstraint_get_Type __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint_get_Type
#define ISpeechRecognitionConstraint_get_Probability __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint_get_Probability
#define ISpeechRecognitionConstraint_put_Probability __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint_put_Probability
#endif /* WIDL_using_Windows_Media_SpeechRecognition */
#endif

#endif

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

/*****************************************************************************
 * ISpeechRecognitionHypothesis interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesis_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesis_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesis, 0x7a7b25b0, 0x99c5, 0x4f7d, 0xbf,0x84, 0x10,0xaa,0x13,0x02,0xb6,0x34);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                MIDL_INTERFACE("7a7b25b0-99c5-4f7d-bf84-10aa1302b634")
                ISpeechRecognitionHypothesis : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Text(
                        HSTRING *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesis, 0x7a7b25b0, 0x99c5, 0x4f7d, 0xbf,0x84, 0x10,0xaa,0x13,0x02,0xb6,0x34)
#endif
#else
typedef struct __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesisVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** ISpeechRecognitionHypothesis methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Text)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesis *This,
        HSTRING *value);

    END_INTERFACE
} __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesisVtbl;

interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesis {
    CONST_VTBL __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesisVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesis_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesis_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesis_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesis_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesis_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesis_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ISpeechRecognitionHypothesis methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesis_get_Text(This,value) (This)->lpVtbl->get_Text(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesis_QueryInterface(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesis* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesis_AddRef(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesis* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesis_Release(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesis* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesis_GetIids(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesis* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesis_GetRuntimeClassName(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesis* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesis_GetTrustLevel(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesis* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ISpeechRecognitionHypothesis methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesis_get_Text(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesis* This,HSTRING *value) {
    return This->lpVtbl->get_Text(This,value);
}
#endif
#ifdef WIDL_using_Windows_Media_SpeechRecognition
#define IID_ISpeechRecognitionHypothesis IID___x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesis
#define ISpeechRecognitionHypothesisVtbl __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesisVtbl
#define ISpeechRecognitionHypothesis __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesis
#define ISpeechRecognitionHypothesis_QueryInterface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesis_QueryInterface
#define ISpeechRecognitionHypothesis_AddRef __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesis_AddRef
#define ISpeechRecognitionHypothesis_Release __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesis_Release
#define ISpeechRecognitionHypothesis_GetIids __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesis_GetIids
#define ISpeechRecognitionHypothesis_GetRuntimeClassName __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesis_GetRuntimeClassName
#define ISpeechRecognitionHypothesis_GetTrustLevel __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesis_GetTrustLevel
#define ISpeechRecognitionHypothesis_get_Text __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesis_get_Text
#endif /* WIDL_using_Windows_Media_SpeechRecognition */
#endif

#endif

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

/*****************************************************************************
 * ISpeechRecognitionHypothesisGeneratedEventArgs interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesisGeneratedEventArgs_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesisGeneratedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesisGeneratedEventArgs, 0x55161a7a, 0x8023, 0x5866, 0x41,0x1d, 0x12,0x13,0xbb,0x27,0x14,0x76);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                MIDL_INTERFACE("55161a7a-8023-5866-411d-1213bb271476")
                ISpeechRecognitionHypothesisGeneratedEventArgs : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Hypothesis(
                        ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionHypothesis **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesisGeneratedEventArgs, 0x55161a7a, 0x8023, 0x5866, 0x41,0x1d, 0x12,0x13,0xbb,0x27,0x14,0x76)
#endif
#else
typedef struct __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesisGeneratedEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** ISpeechRecognitionHypothesisGeneratedEventArgs methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Hypothesis)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesisGeneratedEventArgs *This,
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesis **value);

    END_INTERFACE
} __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesisGeneratedEventArgsVtbl;

interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesisGeneratedEventArgs {
    CONST_VTBL __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesisGeneratedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesisGeneratedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesisGeneratedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesisGeneratedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesisGeneratedEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesisGeneratedEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesisGeneratedEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ISpeechRecognitionHypothesisGeneratedEventArgs methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesisGeneratedEventArgs_get_Hypothesis(This,value) (This)->lpVtbl->get_Hypothesis(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesisGeneratedEventArgs_QueryInterface(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesisGeneratedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesisGeneratedEventArgs_AddRef(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesisGeneratedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesisGeneratedEventArgs_Release(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesisGeneratedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesisGeneratedEventArgs_GetIids(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesisGeneratedEventArgs* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesisGeneratedEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesisGeneratedEventArgs* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesisGeneratedEventArgs_GetTrustLevel(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesisGeneratedEventArgs* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ISpeechRecognitionHypothesisGeneratedEventArgs methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesisGeneratedEventArgs_get_Hypothesis(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesisGeneratedEventArgs* This,__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesis **value) {
    return This->lpVtbl->get_Hypothesis(This,value);
}
#endif
#ifdef WIDL_using_Windows_Media_SpeechRecognition
#define IID_ISpeechRecognitionHypothesisGeneratedEventArgs IID___x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesisGeneratedEventArgs
#define ISpeechRecognitionHypothesisGeneratedEventArgsVtbl __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesisGeneratedEventArgsVtbl
#define ISpeechRecognitionHypothesisGeneratedEventArgs __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesisGeneratedEventArgs
#define ISpeechRecognitionHypothesisGeneratedEventArgs_QueryInterface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesisGeneratedEventArgs_QueryInterface
#define ISpeechRecognitionHypothesisGeneratedEventArgs_AddRef __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesisGeneratedEventArgs_AddRef
#define ISpeechRecognitionHypothesisGeneratedEventArgs_Release __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesisGeneratedEventArgs_Release
#define ISpeechRecognitionHypothesisGeneratedEventArgs_GetIids __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesisGeneratedEventArgs_GetIids
#define ISpeechRecognitionHypothesisGeneratedEventArgs_GetRuntimeClassName __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesisGeneratedEventArgs_GetRuntimeClassName
#define ISpeechRecognitionHypothesisGeneratedEventArgs_GetTrustLevel __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesisGeneratedEventArgs_GetTrustLevel
#define ISpeechRecognitionHypothesisGeneratedEventArgs_get_Hypothesis __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesisGeneratedEventArgs_get_Hypothesis
#endif /* WIDL_using_Windows_Media_SpeechRecognition */
#endif

#endif

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

/*****************************************************************************
 * ISpeechRecognitionListConstraint interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraint_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraint_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraint, 0x09c487e9, 0xe4ad, 0x4526, 0x81,0xf2, 0x49,0x46,0xfb,0x48,0x1d,0x98);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                MIDL_INTERFACE("09c487e9-e4ad-4526-81f2-4946fb481d98")
                ISpeechRecognitionListConstraint : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Commands(
                        ABI::Windows::Foundation::Collections::IVector<HSTRING > **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraint, 0x09c487e9, 0xe4ad, 0x4526, 0x81,0xf2, 0x49,0x46,0xfb,0x48,0x1d,0x98)
#endif
#else
typedef struct __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** ISpeechRecognitionListConstraint methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Commands)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraint *This,
        __FIVector_1_HSTRING **value);

    END_INTERFACE
} __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintVtbl;

interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraint {
    CONST_VTBL __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraint_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraint_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraint_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraint_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraint_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraint_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ISpeechRecognitionListConstraint methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraint_get_Commands(This,value) (This)->lpVtbl->get_Commands(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraint_QueryInterface(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraint* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraint_AddRef(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraint* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraint_Release(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraint* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraint_GetIids(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraint* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraint_GetRuntimeClassName(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraint* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraint_GetTrustLevel(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraint* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ISpeechRecognitionListConstraint methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraint_get_Commands(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraint* This,__FIVector_1_HSTRING **value) {
    return This->lpVtbl->get_Commands(This,value);
}
#endif
#ifdef WIDL_using_Windows_Media_SpeechRecognition
#define IID_ISpeechRecognitionListConstraint IID___x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraint
#define ISpeechRecognitionListConstraintVtbl __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintVtbl
#define ISpeechRecognitionListConstraint __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraint
#define ISpeechRecognitionListConstraint_QueryInterface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraint_QueryInterface
#define ISpeechRecognitionListConstraint_AddRef __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraint_AddRef
#define ISpeechRecognitionListConstraint_Release __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraint_Release
#define ISpeechRecognitionListConstraint_GetIids __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraint_GetIids
#define ISpeechRecognitionListConstraint_GetRuntimeClassName __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraint_GetRuntimeClassName
#define ISpeechRecognitionListConstraint_GetTrustLevel __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraint_GetTrustLevel
#define ISpeechRecognitionListConstraint_get_Commands __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraint_get_Commands
#endif /* WIDL_using_Windows_Media_SpeechRecognition */
#endif

#endif

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

/*****************************************************************************
 * ISpeechRecognitionListConstraintFactory interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintFactory_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintFactory, 0x40f3cdc7, 0x562a, 0x426a, 0x9f,0x3b, 0x3b,0x4e,0x28,0x2b,0xe1,0xd5);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                MIDL_INTERFACE("40f3cdc7-562a-426a-9f3b-3b4e282be1d5")
                ISpeechRecognitionListConstraintFactory : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE Create(
                        ABI::Windows::Foundation::Collections::IIterable<HSTRING > *commands,
                        ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionListConstraint **listconstraint) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateWithTag(
                        ABI::Windows::Foundation::Collections::IIterable<HSTRING > *commands,
                        HSTRING tag,
                        ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionListConstraint **listconstraint) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintFactory, 0x40f3cdc7, 0x562a, 0x426a, 0x9f,0x3b, 0x3b,0x4e,0x28,0x2b,0xe1,0xd5)
#endif
#else
typedef struct __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintFactoryVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** ISpeechRecognitionListConstraintFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *Create)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintFactory *This,
        __FIIterable_1_HSTRING *commands,
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraint **listconstraint);

    HRESULT (STDMETHODCALLTYPE *CreateWithTag)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintFactory *This,
        __FIIterable_1_HSTRING *commands,
        HSTRING tag,
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraint **listconstraint);

    END_INTERFACE
} __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintFactoryVtbl;

interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintFactory {
    CONST_VTBL __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintFactory_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintFactory_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintFactory_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ISpeechRecognitionListConstraintFactory methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintFactory_Create(This,commands,listconstraint) (This)->lpVtbl->Create(This,commands,listconstraint)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintFactory_CreateWithTag(This,commands,tag,listconstraint) (This)->lpVtbl->CreateWithTag(This,commands,tag,listconstraint)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintFactory_QueryInterface(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintFactory_AddRef(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintFactory_Release(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintFactory_GetIids(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintFactory* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintFactory_GetRuntimeClassName(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintFactory* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintFactory_GetTrustLevel(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintFactory* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ISpeechRecognitionListConstraintFactory methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintFactory_Create(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintFactory* This,__FIIterable_1_HSTRING *commands,__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraint **listconstraint) {
    return This->lpVtbl->Create(This,commands,listconstraint);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintFactory_CreateWithTag(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintFactory* This,__FIIterable_1_HSTRING *commands,HSTRING tag,__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraint **listconstraint) {
    return This->lpVtbl->CreateWithTag(This,commands,tag,listconstraint);
}
#endif
#ifdef WIDL_using_Windows_Media_SpeechRecognition
#define IID_ISpeechRecognitionListConstraintFactory IID___x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintFactory
#define ISpeechRecognitionListConstraintFactoryVtbl __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintFactoryVtbl
#define ISpeechRecognitionListConstraintFactory __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintFactory
#define ISpeechRecognitionListConstraintFactory_QueryInterface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintFactory_QueryInterface
#define ISpeechRecognitionListConstraintFactory_AddRef __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintFactory_AddRef
#define ISpeechRecognitionListConstraintFactory_Release __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintFactory_Release
#define ISpeechRecognitionListConstraintFactory_GetIids __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintFactory_GetIids
#define ISpeechRecognitionListConstraintFactory_GetRuntimeClassName __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintFactory_GetRuntimeClassName
#define ISpeechRecognitionListConstraintFactory_GetTrustLevel __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintFactory_GetTrustLevel
#define ISpeechRecognitionListConstraintFactory_Create __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintFactory_Create
#define ISpeechRecognitionListConstraintFactory_CreateWithTag __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionListConstraintFactory_CreateWithTag
#endif /* WIDL_using_Windows_Media_SpeechRecognition */
#endif

#endif

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

/*****************************************************************************
 * ISpeechRecognitionQualityDegradingEventArgs interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionQualityDegradingEventArgs_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionQualityDegradingEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionQualityDegradingEventArgs, 0x4fe24105, 0x8c3a, 0x4c7e, 0x8d,0x0a, 0x5b,0xd4,0xf5,0xb1,0x4a,0xd8);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                MIDL_INTERFACE("4fe24105-8c3a-4c7e-8d0a-5bd4f5b14ad8")
                ISpeechRecognitionQualityDegradingEventArgs : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Problem(
                        ABI::Windows::Media::SpeechRecognition::SpeechRecognitionAudioProblem *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionQualityDegradingEventArgs, 0x4fe24105, 0x8c3a, 0x4c7e, 0x8d,0x0a, 0x5b,0xd4,0xf5,0xb1,0x4a,0xd8)
#endif
#else
typedef struct __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionQualityDegradingEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** ISpeechRecognitionQualityDegradingEventArgs methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Problem)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionQualityDegradingEventArgs *This,
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionAudioProblem *value);

    END_INTERFACE
} __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionQualityDegradingEventArgsVtbl;

interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionQualityDegradingEventArgs {
    CONST_VTBL __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionQualityDegradingEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionQualityDegradingEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionQualityDegradingEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionQualityDegradingEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionQualityDegradingEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionQualityDegradingEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionQualityDegradingEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ISpeechRecognitionQualityDegradingEventArgs methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionQualityDegradingEventArgs_get_Problem(This,value) (This)->lpVtbl->get_Problem(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionQualityDegradingEventArgs_QueryInterface(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionQualityDegradingEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionQualityDegradingEventArgs_AddRef(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionQualityDegradingEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionQualityDegradingEventArgs_Release(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionQualityDegradingEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionQualityDegradingEventArgs_GetIids(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionQualityDegradingEventArgs* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionQualityDegradingEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionQualityDegradingEventArgs* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionQualityDegradingEventArgs_GetTrustLevel(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionQualityDegradingEventArgs* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ISpeechRecognitionQualityDegradingEventArgs methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionQualityDegradingEventArgs_get_Problem(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionQualityDegradingEventArgs* This,__x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionAudioProblem *value) {
    return This->lpVtbl->get_Problem(This,value);
}
#endif
#ifdef WIDL_using_Windows_Media_SpeechRecognition
#define IID_ISpeechRecognitionQualityDegradingEventArgs IID___x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionQualityDegradingEventArgs
#define ISpeechRecognitionQualityDegradingEventArgsVtbl __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionQualityDegradingEventArgsVtbl
#define ISpeechRecognitionQualityDegradingEventArgs __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionQualityDegradingEventArgs
#define ISpeechRecognitionQualityDegradingEventArgs_QueryInterface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionQualityDegradingEventArgs_QueryInterface
#define ISpeechRecognitionQualityDegradingEventArgs_AddRef __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionQualityDegradingEventArgs_AddRef
#define ISpeechRecognitionQualityDegradingEventArgs_Release __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionQualityDegradingEventArgs_Release
#define ISpeechRecognitionQualityDegradingEventArgs_GetIids __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionQualityDegradingEventArgs_GetIids
#define ISpeechRecognitionQualityDegradingEventArgs_GetRuntimeClassName __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionQualityDegradingEventArgs_GetRuntimeClassName
#define ISpeechRecognitionQualityDegradingEventArgs_GetTrustLevel __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionQualityDegradingEventArgs_GetTrustLevel
#define ISpeechRecognitionQualityDegradingEventArgs_get_Problem __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionQualityDegradingEventArgs_get_Problem
#endif /* WIDL_using_Windows_Media_SpeechRecognition */
#endif

#endif

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

/*****************************************************************************
 * ISpeechRecognitionResult interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult, 0x4e303157, 0x034e, 0x4652, 0x85,0x7e, 0xd0,0x45,0x4c,0xc4,0xbe,0xec);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                MIDL_INTERFACE("4e303157-034e-4652-857e-d0454cc4beec")
                ISpeechRecognitionResult : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Status(
                        ABI::Windows::Media::SpeechRecognition::SpeechRecognitionResultStatus *value) = 0;

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

                    virtual HRESULT STDMETHODCALLTYPE get_Confidence(
                        ABI::Windows::Media::SpeechRecognition::SpeechRecognitionConfidence *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_SemanticInterpretation(
                        ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionSemanticInterpretation **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetAlternates(
                        UINT32 max_amount,
                        ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionResult* > **results) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Constraint(
                        ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionConstraint **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_RulePath(
                        ABI::Windows::Foundation::Collections::IVectorView<HSTRING > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_RawConfidence(
                        DOUBLE *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult, 0x4e303157, 0x034e, 0x4652, 0x85,0x7e, 0xd0,0x45,0x4c,0xc4,0xbe,0xec)
#endif
#else
typedef struct __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResultVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** ISpeechRecognitionResult methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Status)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult *This,
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionResultStatus *value);

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

    HRESULT (STDMETHODCALLTYPE *get_Confidence)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult *This,
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionConfidence *value);

    HRESULT (STDMETHODCALLTYPE *get_SemanticInterpretation)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult *This,
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionSemanticInterpretation **value);

    HRESULT (STDMETHODCALLTYPE *GetAlternates)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult *This,
        UINT32 max_amount,
        __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult **results);

    HRESULT (STDMETHODCALLTYPE *get_Constraint)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult *This,
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint **value);

    HRESULT (STDMETHODCALLTYPE *get_RulePath)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult *This,
        __FIVectorView_1_HSTRING **value);

    HRESULT (STDMETHODCALLTYPE *get_RawConfidence)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult *This,
        DOUBLE *value);

    END_INTERFACE
} __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResultVtbl;

interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult {
    CONST_VTBL __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResultVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ISpeechRecognitionResult methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult_get_Status(This,value) (This)->lpVtbl->get_Status(This,value)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult_get_Text(This,value) (This)->lpVtbl->get_Text(This,value)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult_get_Confidence(This,value) (This)->lpVtbl->get_Confidence(This,value)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult_get_SemanticInterpretation(This,value) (This)->lpVtbl->get_SemanticInterpretation(This,value)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult_GetAlternates(This,max_amount,results) (This)->lpVtbl->GetAlternates(This,max_amount,results)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult_get_Constraint(This,value) (This)->lpVtbl->get_Constraint(This,value)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult_get_RulePath(This,value) (This)->lpVtbl->get_RulePath(This,value)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult_get_RawConfidence(This,value) (This)->lpVtbl->get_RawConfidence(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult_QueryInterface(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult_AddRef(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult_Release(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult_GetIids(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult_GetRuntimeClassName(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult_GetTrustLevel(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ISpeechRecognitionResult methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult_get_Status(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult* This,__x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionResultStatus *value) {
    return This->lpVtbl->get_Status(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult_get_Text(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult* This,HSTRING *value) {
    return This->lpVtbl->get_Text(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult_get_Confidence(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult* This,__x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognitionConfidence *value) {
    return This->lpVtbl->get_Confidence(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult_get_SemanticInterpretation(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult* This,__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionSemanticInterpretation **value) {
    return This->lpVtbl->get_SemanticInterpretation(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult_GetAlternates(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult* This,UINT32 max_amount,__FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult **results) {
    return This->lpVtbl->GetAlternates(This,max_amount,results);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult_get_Constraint(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult* This,__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint **value) {
    return This->lpVtbl->get_Constraint(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult_get_RulePath(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult* This,__FIVectorView_1_HSTRING **value) {
    return This->lpVtbl->get_RulePath(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult_get_RawConfidence(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult* This,DOUBLE *value) {
    return This->lpVtbl->get_RawConfidence(This,value);
}
#endif
#ifdef WIDL_using_Windows_Media_SpeechRecognition
#define IID_ISpeechRecognitionResult IID___x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult
#define ISpeechRecognitionResultVtbl __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResultVtbl
#define ISpeechRecognitionResult __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult
#define ISpeechRecognitionResult_QueryInterface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult_QueryInterface
#define ISpeechRecognitionResult_AddRef __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult_AddRef
#define ISpeechRecognitionResult_Release __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult_Release
#define ISpeechRecognitionResult_GetIids __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult_GetIids
#define ISpeechRecognitionResult_GetRuntimeClassName __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult_GetRuntimeClassName
#define ISpeechRecognitionResult_GetTrustLevel __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult_GetTrustLevel
#define ISpeechRecognitionResult_get_Status __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult_get_Status
#define ISpeechRecognitionResult_get_Text __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult_get_Text
#define ISpeechRecognitionResult_get_Confidence __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult_get_Confidence
#define ISpeechRecognitionResult_get_SemanticInterpretation __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult_get_SemanticInterpretation
#define ISpeechRecognitionResult_GetAlternates __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult_GetAlternates
#define ISpeechRecognitionResult_get_Constraint __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult_get_Constraint
#define ISpeechRecognitionResult_get_RulePath __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult_get_RulePath
#define ISpeechRecognitionResult_get_RawConfidence __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult_get_RawConfidence
#endif /* WIDL_using_Windows_Media_SpeechRecognition */
#endif

#endif

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

/*****************************************************************************
 * ISpeechRecognitionResult2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult2, 0xaf7ed1ba, 0x451b, 0x4166, 0xa0,0xc1, 0x1f,0xfe,0x84,0x03,0x2d,0x03);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                MIDL_INTERFACE("af7ed1ba-451b-4166-a0c1-1ffe84032d03")
                ISpeechRecognitionResult2 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_PhraseStartTime(
                        ABI::Windows::Foundation::DateTime *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_PhraseDuration(
                        ABI::Windows::Foundation::TimeSpan *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult2, 0xaf7ed1ba, 0x451b, 0x4166, 0xa0,0xc1, 0x1f,0xfe,0x84,0x03,0x2d,0x03)
#endif
#else
typedef struct __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** ISpeechRecognitionResult2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_PhraseStartTime)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult2 *This,
        __x_ABI_CWindows_CFoundation_CDateTime *value);

    HRESULT (STDMETHODCALLTYPE *get_PhraseDuration)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult2 *This,
        __x_ABI_CWindows_CFoundation_CTimeSpan *value);

    END_INTERFACE
} __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult2Vtbl;

interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult2 {
    CONST_VTBL __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ISpeechRecognitionResult2 methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult2_get_PhraseStartTime(This,value) (This)->lpVtbl->get_PhraseStartTime(This,value)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult2_get_PhraseDuration(This,value) (This)->lpVtbl->get_PhraseDuration(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult2_QueryInterface(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult2_AddRef(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult2_Release(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult2_GetIids(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult2_GetRuntimeClassName(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult2_GetTrustLevel(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ISpeechRecognitionResult2 methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult2_get_PhraseStartTime(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult2* This,__x_ABI_CWindows_CFoundation_CDateTime *value) {
    return This->lpVtbl->get_PhraseStartTime(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult2_get_PhraseDuration(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult2* This,__x_ABI_CWindows_CFoundation_CTimeSpan *value) {
    return This->lpVtbl->get_PhraseDuration(This,value);
}
#endif
#ifdef WIDL_using_Windows_Media_SpeechRecognition
#define IID_ISpeechRecognitionResult2 IID___x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult2
#define ISpeechRecognitionResult2Vtbl __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult2Vtbl
#define ISpeechRecognitionResult2 __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult2
#define ISpeechRecognitionResult2_QueryInterface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult2_QueryInterface
#define ISpeechRecognitionResult2_AddRef __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult2_AddRef
#define ISpeechRecognitionResult2_Release __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult2_Release
#define ISpeechRecognitionResult2_GetIids __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult2_GetIids
#define ISpeechRecognitionResult2_GetRuntimeClassName __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult2_GetRuntimeClassName
#define ISpeechRecognitionResult2_GetTrustLevel __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult2_GetTrustLevel
#define ISpeechRecognitionResult2_get_PhraseStartTime __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult2_get_PhraseStartTime
#define ISpeechRecognitionResult2_get_PhraseDuration __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult2_get_PhraseDuration
#endif /* WIDL_using_Windows_Media_SpeechRecognition */
#endif

#endif

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

/*****************************************************************************
 * ISpeechRecognitionSemanticInterpretation interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionSemanticInterpretation_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionSemanticInterpretation_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionSemanticInterpretation, 0xaae1da9b, 0x7e32, 0x4c1f, 0x89,0xfe, 0x0c,0x65,0xf4,0x86,0xf5,0x2e);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                MIDL_INTERFACE("aae1da9b-7e32-4c1f-89fe-0c65f486f52e")
                ISpeechRecognitionSemanticInterpretation : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Properties(
                        ABI::Windows::Foundation::Collections::IMapView<HSTRING,ABI::Windows::Foundation::Collections::IVectorView<HSTRING >* > **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionSemanticInterpretation, 0xaae1da9b, 0x7e32, 0x4c1f, 0x89,0xfe, 0x0c,0x65,0xf4,0x86,0xf5,0x2e)
#endif
#else
typedef struct __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionSemanticInterpretationVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** ISpeechRecognitionSemanticInterpretation methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Properties)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionSemanticInterpretation *This,
        __FIMapView_2_HSTRING___FIVectorView_1_HSTRING **value);

    END_INTERFACE
} __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionSemanticInterpretationVtbl;

interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionSemanticInterpretation {
    CONST_VTBL __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionSemanticInterpretationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionSemanticInterpretation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionSemanticInterpretation_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionSemanticInterpretation_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionSemanticInterpretation_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionSemanticInterpretation_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionSemanticInterpretation_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ISpeechRecognitionSemanticInterpretation methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionSemanticInterpretation_get_Properties(This,value) (This)->lpVtbl->get_Properties(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionSemanticInterpretation_QueryInterface(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionSemanticInterpretation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionSemanticInterpretation_AddRef(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionSemanticInterpretation* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionSemanticInterpretation_Release(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionSemanticInterpretation* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionSemanticInterpretation_GetIids(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionSemanticInterpretation* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionSemanticInterpretation_GetRuntimeClassName(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionSemanticInterpretation* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionSemanticInterpretation_GetTrustLevel(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionSemanticInterpretation* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ISpeechRecognitionSemanticInterpretation methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionSemanticInterpretation_get_Properties(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionSemanticInterpretation* This,__FIMapView_2_HSTRING___FIVectorView_1_HSTRING **value) {
    return This->lpVtbl->get_Properties(This,value);
}
#endif
#ifdef WIDL_using_Windows_Media_SpeechRecognition
#define IID_ISpeechRecognitionSemanticInterpretation IID___x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionSemanticInterpretation
#define ISpeechRecognitionSemanticInterpretationVtbl __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionSemanticInterpretationVtbl
#define ISpeechRecognitionSemanticInterpretation __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionSemanticInterpretation
#define ISpeechRecognitionSemanticInterpretation_QueryInterface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionSemanticInterpretation_QueryInterface
#define ISpeechRecognitionSemanticInterpretation_AddRef __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionSemanticInterpretation_AddRef
#define ISpeechRecognitionSemanticInterpretation_Release __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionSemanticInterpretation_Release
#define ISpeechRecognitionSemanticInterpretation_GetIids __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionSemanticInterpretation_GetIids
#define ISpeechRecognitionSemanticInterpretation_GetRuntimeClassName __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionSemanticInterpretation_GetRuntimeClassName
#define ISpeechRecognitionSemanticInterpretation_GetTrustLevel __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionSemanticInterpretation_GetTrustLevel
#define ISpeechRecognitionSemanticInterpretation_get_Properties __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionSemanticInterpretation_get_Properties
#endif /* WIDL_using_Windows_Media_SpeechRecognition */
#endif

#endif

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

/*****************************************************************************
 * ISpeechRecognizer interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer, 0x0bc3c9cb, 0xc26a, 0x40f2, 0xae,0xb5, 0x80,0x96,0xb2,0xe4,0x80,0x73);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                MIDL_INTERFACE("0bc3c9cb-c26a-40f2-aeb5-8096b2e48073")
                ISpeechRecognizer : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_CurrentLanguage(
                        ABI::Windows::Globalization::ILanguage **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Constraints(
                        ABI::Windows::Foundation::Collections::IVector<ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionConstraint* > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Timeouts(
                        ABI::Windows::Media::SpeechRecognition::ISpeechRecognizerTimeouts **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_UIOptions(
                        ABI::Windows::Media::SpeechRecognition::ISpeechRecognizerUIOptions **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CompileConstraintsAsync(
                        ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionCompilationResult* > **operation) = 0;

                    virtual HRESULT STDMETHODCALLTYPE RecognizeAsync(
                        ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionResult* > **operation) = 0;

                    virtual HRESULT STDMETHODCALLTYPE RecognizeWithUIAsync(
                        ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionResult* > **operation) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_RecognitionQualityDegrading(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::Media::SpeechRecognition::SpeechRecognizer*,ABI::Windows::Media::SpeechRecognition::SpeechRecognitionQualityDegradingEventArgs* > *handler,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_RecognitionQualityDegrading(
                        EventRegistrationToken token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_StateChanged(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::Media::SpeechRecognition::SpeechRecognizer*,ABI::Windows::Media::SpeechRecognition::SpeechRecognizerStateChangedEventArgs* > *handler,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_StateChanged(
                        EventRegistrationToken token) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer, 0x0bc3c9cb, 0xc26a, 0x40f2, 0xae,0xb5, 0x80,0x96,0xb2,0xe4,0x80,0x73)
#endif
#else
typedef struct __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** ISpeechRecognizer methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CurrentLanguage)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer *This,
        __x_ABI_CWindows_CGlobalization_CILanguage **value);

    HRESULT (STDMETHODCALLTYPE *get_Constraints)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer *This,
        __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint **value);

    HRESULT (STDMETHODCALLTYPE *get_Timeouts)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer *This,
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts **value);

    HRESULT (STDMETHODCALLTYPE *get_UIOptions)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer *This,
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions **value);

    HRESULT (STDMETHODCALLTYPE *CompileConstraintsAsync)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer *This,
        __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult **operation);

    HRESULT (STDMETHODCALLTYPE *RecognizeAsync)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer *This,
        __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult **operation);

    HRESULT (STDMETHODCALLTYPE *RecognizeWithUIAsync)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer *This,
        __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult **operation);

    HRESULT (STDMETHODCALLTYPE *add_RecognitionQualityDegrading)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer *This,
        __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionQualityDegradingEventArgs *handler,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_RecognitionQualityDegrading)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer *This,
        EventRegistrationToken token);

    HRESULT (STDMETHODCALLTYPE *add_StateChanged)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer *This,
        __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognizerStateChangedEventArgs *handler,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_StateChanged)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer *This,
        EventRegistrationToken token);

    END_INTERFACE
} __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerVtbl;

interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer {
    CONST_VTBL __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ISpeechRecognizer methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer_get_CurrentLanguage(This,value) (This)->lpVtbl->get_CurrentLanguage(This,value)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer_get_Constraints(This,value) (This)->lpVtbl->get_Constraints(This,value)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer_get_Timeouts(This,value) (This)->lpVtbl->get_Timeouts(This,value)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer_get_UIOptions(This,value) (This)->lpVtbl->get_UIOptions(This,value)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer_CompileConstraintsAsync(This,operation) (This)->lpVtbl->CompileConstraintsAsync(This,operation)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer_RecognizeAsync(This,operation) (This)->lpVtbl->RecognizeAsync(This,operation)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer_RecognizeWithUIAsync(This,operation) (This)->lpVtbl->RecognizeWithUIAsync(This,operation)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer_add_RecognitionQualityDegrading(This,handler,token) (This)->lpVtbl->add_RecognitionQualityDegrading(This,handler,token)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer_remove_RecognitionQualityDegrading(This,token) (This)->lpVtbl->remove_RecognitionQualityDegrading(This,token)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer_add_StateChanged(This,handler,token) (This)->lpVtbl->add_StateChanged(This,handler,token)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer_remove_StateChanged(This,token) (This)->lpVtbl->remove_StateChanged(This,token)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer_QueryInterface(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer_AddRef(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer_Release(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer_GetIids(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer_GetRuntimeClassName(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer_GetTrustLevel(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ISpeechRecognizer methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer_get_CurrentLanguage(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer* This,__x_ABI_CWindows_CGlobalization_CILanguage **value) {
    return This->lpVtbl->get_CurrentLanguage(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer_get_Constraints(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer* This,__FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint **value) {
    return This->lpVtbl->get_Constraints(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer_get_Timeouts(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer* This,__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts **value) {
    return This->lpVtbl->get_Timeouts(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer_get_UIOptions(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer* This,__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions **value) {
    return This->lpVtbl->get_UIOptions(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer_CompileConstraintsAsync(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer* This,__FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult **operation) {
    return This->lpVtbl->CompileConstraintsAsync(This,operation);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer_RecognizeAsync(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer* This,__FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult **operation) {
    return This->lpVtbl->RecognizeAsync(This,operation);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer_RecognizeWithUIAsync(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer* This,__FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult **operation) {
    return This->lpVtbl->RecognizeWithUIAsync(This,operation);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer_add_RecognitionQualityDegrading(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer* This,__FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionQualityDegradingEventArgs *handler,EventRegistrationToken *token) {
    return This->lpVtbl->add_RecognitionQualityDegrading(This,handler,token);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer_remove_RecognitionQualityDegrading(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_RecognitionQualityDegrading(This,token);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer_add_StateChanged(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer* This,__FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognizerStateChangedEventArgs *handler,EventRegistrationToken *token) {
    return This->lpVtbl->add_StateChanged(This,handler,token);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer_remove_StateChanged(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_StateChanged(This,token);
}
#endif
#ifdef WIDL_using_Windows_Media_SpeechRecognition
#define IID_ISpeechRecognizer IID___x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer
#define ISpeechRecognizerVtbl __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerVtbl
#define ISpeechRecognizer __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer
#define ISpeechRecognizer_QueryInterface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer_QueryInterface
#define ISpeechRecognizer_AddRef __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer_AddRef
#define ISpeechRecognizer_Release __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer_Release
#define ISpeechRecognizer_GetIids __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer_GetIids
#define ISpeechRecognizer_GetRuntimeClassName __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer_GetRuntimeClassName
#define ISpeechRecognizer_GetTrustLevel __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer_GetTrustLevel
#define ISpeechRecognizer_get_CurrentLanguage __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer_get_CurrentLanguage
#define ISpeechRecognizer_get_Constraints __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer_get_Constraints
#define ISpeechRecognizer_get_Timeouts __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer_get_Timeouts
#define ISpeechRecognizer_get_UIOptions __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer_get_UIOptions
#define ISpeechRecognizer_CompileConstraintsAsync __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer_CompileConstraintsAsync
#define ISpeechRecognizer_RecognizeAsync __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer_RecognizeAsync
#define ISpeechRecognizer_RecognizeWithUIAsync __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer_RecognizeWithUIAsync
#define ISpeechRecognizer_add_RecognitionQualityDegrading __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer_add_RecognitionQualityDegrading
#define ISpeechRecognizer_remove_RecognitionQualityDegrading __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer_remove_RecognitionQualityDegrading
#define ISpeechRecognizer_add_StateChanged __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer_add_StateChanged
#define ISpeechRecognizer_remove_StateChanged __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer_remove_StateChanged
#endif /* WIDL_using_Windows_Media_SpeechRecognition */
#endif

#endif

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

/*****************************************************************************
 * ISpeechRecognizer2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2, 0x63c9baf1, 0x91e3, 0x4ea4, 0x86,0xa1, 0x7c,0x38,0x67,0xd0,0x84,0xa6);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                MIDL_INTERFACE("63c9baf1-91e3-4ea4-86a1-7c3867d084a6")
                ISpeechRecognizer2 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_ContinuousRecognitionSession(
                        ABI::Windows::Media::SpeechRecognition::ISpeechContinuousRecognitionSession **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_State(
                        ABI::Windows::Media::SpeechRecognition::SpeechRecognizerState *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE StopRecognitionAsync(
                        ABI::Windows::Foundation::IAsyncAction **action) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_HypothesisGenerated(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::Media::SpeechRecognition::SpeechRecognizer*,ABI::Windows::Media::SpeechRecognition::SpeechRecognitionHypothesisGeneratedEventArgs* > *handler,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_HypothesisGenerated(
                        EventRegistrationToken token) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2, 0x63c9baf1, 0x91e3, 0x4ea4, 0x86,0xa1, 0x7c,0x38,0x67,0xd0,0x84,0xa6)
#endif
#else
typedef struct __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** ISpeechRecognizer2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ContinuousRecognitionSession)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2 *This,
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession **value);

    HRESULT (STDMETHODCALLTYPE *get_State)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2 *This,
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognizerState *value);

    HRESULT (STDMETHODCALLTYPE *StopRecognitionAsync)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2 *This,
        __x_ABI_CWindows_CFoundation_CIAsyncAction **action);

    HRESULT (STDMETHODCALLTYPE *add_HypothesisGenerated)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2 *This,
        __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionHypothesisGeneratedEventArgs *handler,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_HypothesisGenerated)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2 *This,
        EventRegistrationToken token);

    END_INTERFACE
} __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2Vtbl;

interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2 {
    CONST_VTBL __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ISpeechRecognizer2 methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2_get_ContinuousRecognitionSession(This,value) (This)->lpVtbl->get_ContinuousRecognitionSession(This,value)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2_get_State(This,value) (This)->lpVtbl->get_State(This,value)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2_StopRecognitionAsync(This,action) (This)->lpVtbl->StopRecognitionAsync(This,action)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2_add_HypothesisGenerated(This,handler,token) (This)->lpVtbl->add_HypothesisGenerated(This,handler,token)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2_remove_HypothesisGenerated(This,token) (This)->lpVtbl->remove_HypothesisGenerated(This,token)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2_QueryInterface(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2_AddRef(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2_Release(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2_GetIids(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2_GetRuntimeClassName(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2_GetTrustLevel(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ISpeechRecognizer2 methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2_get_ContinuousRecognitionSession(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2* This,__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession **value) {
    return This->lpVtbl->get_ContinuousRecognitionSession(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2_get_State(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2* This,__x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognizerState *value) {
    return This->lpVtbl->get_State(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2_StopRecognitionAsync(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2* This,__x_ABI_CWindows_CFoundation_CIAsyncAction **action) {
    return This->lpVtbl->StopRecognitionAsync(This,action);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2_add_HypothesisGenerated(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2* This,__FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionHypothesisGeneratedEventArgs *handler,EventRegistrationToken *token) {
    return This->lpVtbl->add_HypothesisGenerated(This,handler,token);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2_remove_HypothesisGenerated(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_HypothesisGenerated(This,token);
}
#endif
#ifdef WIDL_using_Windows_Media_SpeechRecognition
#define IID_ISpeechRecognizer2 IID___x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2
#define ISpeechRecognizer2Vtbl __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2Vtbl
#define ISpeechRecognizer2 __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2
#define ISpeechRecognizer2_QueryInterface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2_QueryInterface
#define ISpeechRecognizer2_AddRef __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2_AddRef
#define ISpeechRecognizer2_Release __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2_Release
#define ISpeechRecognizer2_GetIids __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2_GetIids
#define ISpeechRecognizer2_GetRuntimeClassName __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2_GetRuntimeClassName
#define ISpeechRecognizer2_GetTrustLevel __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2_GetTrustLevel
#define ISpeechRecognizer2_get_ContinuousRecognitionSession __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2_get_ContinuousRecognitionSession
#define ISpeechRecognizer2_get_State __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2_get_State
#define ISpeechRecognizer2_StopRecognitionAsync __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2_StopRecognitionAsync
#define ISpeechRecognizer2_add_HypothesisGenerated __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2_add_HypothesisGenerated
#define ISpeechRecognizer2_remove_HypothesisGenerated __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer2_remove_HypothesisGenerated
#endif /* WIDL_using_Windows_Media_SpeechRecognition */
#endif

#endif

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

/*****************************************************************************
 * ISpeechRecognizerFactory interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerFactory_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerFactory, 0x60c488dd, 0x7fb8, 0x4033, 0xac,0x70, 0xd0,0x46,0xf6,0x48,0x18,0xe1);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                MIDL_INTERFACE("60c488dd-7fb8-4033-ac70-d046f64818e1")
                ISpeechRecognizerFactory : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE Create(
                        ABI::Windows::Globalization::ILanguage *language,
                        ABI::Windows::Media::SpeechRecognition::ISpeechRecognizer **speechrecognizer) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerFactory, 0x60c488dd, 0x7fb8, 0x4033, 0xac,0x70, 0xd0,0x46,0xf6,0x48,0x18,0xe1)
#endif
#else
typedef struct __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerFactoryVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** ISpeechRecognizerFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *Create)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerFactory *This,
        __x_ABI_CWindows_CGlobalization_CILanguage *language,
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer **speechrecognizer);

    END_INTERFACE
} __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerFactoryVtbl;

interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerFactory {
    CONST_VTBL __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerFactory_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerFactory_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerFactory_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ISpeechRecognizerFactory methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerFactory_Create(This,language,speechrecognizer) (This)->lpVtbl->Create(This,language,speechrecognizer)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerFactory_QueryInterface(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerFactory_AddRef(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerFactory_Release(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerFactory_GetIids(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerFactory* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerFactory_GetRuntimeClassName(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerFactory* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerFactory_GetTrustLevel(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerFactory* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ISpeechRecognizerFactory methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerFactory_Create(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerFactory* This,__x_ABI_CWindows_CGlobalization_CILanguage *language,__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer **speechrecognizer) {
    return This->lpVtbl->Create(This,language,speechrecognizer);
}
#endif
#ifdef WIDL_using_Windows_Media_SpeechRecognition
#define IID_ISpeechRecognizerFactory IID___x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerFactory
#define ISpeechRecognizerFactoryVtbl __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerFactoryVtbl
#define ISpeechRecognizerFactory __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerFactory
#define ISpeechRecognizerFactory_QueryInterface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerFactory_QueryInterface
#define ISpeechRecognizerFactory_AddRef __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerFactory_AddRef
#define ISpeechRecognizerFactory_Release __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerFactory_Release
#define ISpeechRecognizerFactory_GetIids __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerFactory_GetIids
#define ISpeechRecognizerFactory_GetRuntimeClassName __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerFactory_GetRuntimeClassName
#define ISpeechRecognizerFactory_GetTrustLevel __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerFactory_GetTrustLevel
#define ISpeechRecognizerFactory_Create __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerFactory_Create
#endif /* WIDL_using_Windows_Media_SpeechRecognition */
#endif

#endif

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

/*****************************************************************************
 * ISpeechRecognizerStateChangedEventArgs interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStateChangedEventArgs_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStateChangedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStateChangedEventArgs, 0x563d4f09, 0xba03, 0x4bad, 0xad,0x81, 0xdd,0xc6,0xc4,0xda,0xb0,0xc3);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                MIDL_INTERFACE("563d4f09-ba03-4bad-ad81-ddc6c4dab0c3")
                ISpeechRecognizerStateChangedEventArgs : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_State(
                        ABI::Windows::Media::SpeechRecognition::SpeechRecognizerState *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStateChangedEventArgs, 0x563d4f09, 0xba03, 0x4bad, 0xad,0x81, 0xdd,0xc6,0xc4,0xda,0xb0,0xc3)
#endif
#else
typedef struct __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStateChangedEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** ISpeechRecognizerStateChangedEventArgs methods ***/
    HRESULT (STDMETHODCALLTYPE *get_State)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStateChangedEventArgs *This,
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognizerState *value);

    END_INTERFACE
} __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStateChangedEventArgsVtbl;

interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStateChangedEventArgs {
    CONST_VTBL __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStateChangedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStateChangedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStateChangedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStateChangedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStateChangedEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStateChangedEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStateChangedEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ISpeechRecognizerStateChangedEventArgs methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStateChangedEventArgs_get_State(This,value) (This)->lpVtbl->get_State(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStateChangedEventArgs_QueryInterface(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStateChangedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStateChangedEventArgs_AddRef(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStateChangedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStateChangedEventArgs_Release(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStateChangedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStateChangedEventArgs_GetIids(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStateChangedEventArgs* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStateChangedEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStateChangedEventArgs* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStateChangedEventArgs_GetTrustLevel(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStateChangedEventArgs* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ISpeechRecognizerStateChangedEventArgs methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStateChangedEventArgs_get_State(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStateChangedEventArgs* This,__x_ABI_CWindows_CMedia_CSpeechRecognition_CSpeechRecognizerState *value) {
    return This->lpVtbl->get_State(This,value);
}
#endif
#ifdef WIDL_using_Windows_Media_SpeechRecognition
#define IID_ISpeechRecognizerStateChangedEventArgs IID___x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStateChangedEventArgs
#define ISpeechRecognizerStateChangedEventArgsVtbl __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStateChangedEventArgsVtbl
#define ISpeechRecognizerStateChangedEventArgs __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStateChangedEventArgs
#define ISpeechRecognizerStateChangedEventArgs_QueryInterface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStateChangedEventArgs_QueryInterface
#define ISpeechRecognizerStateChangedEventArgs_AddRef __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStateChangedEventArgs_AddRef
#define ISpeechRecognizerStateChangedEventArgs_Release __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStateChangedEventArgs_Release
#define ISpeechRecognizerStateChangedEventArgs_GetIids __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStateChangedEventArgs_GetIids
#define ISpeechRecognizerStateChangedEventArgs_GetRuntimeClassName __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStateChangedEventArgs_GetRuntimeClassName
#define ISpeechRecognizerStateChangedEventArgs_GetTrustLevel __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStateChangedEventArgs_GetTrustLevel
#define ISpeechRecognizerStateChangedEventArgs_get_State __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStateChangedEventArgs_get_State
#endif /* WIDL_using_Windows_Media_SpeechRecognition */
#endif

#endif

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

/*****************************************************************************
 * ISpeechRecognizerStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics, 0x87a35eac, 0xa7dc, 0x4b0b, 0xbc,0xc9, 0x24,0xf4,0x7c,0x0b,0x7e,0xbf);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                MIDL_INTERFACE("87a35eac-a7dc-4b0b-bcc9-24f47c0b7ebf")
                ISpeechRecognizerStatics : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_SystemSpeechLanguage(
                        ABI::Windows::Globalization::ILanguage **language) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_SupportedTopicLanguages(
                        ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Globalization::Language* > **languages) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_SupportedGrammarLanguages(
                        ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Globalization::Language* > **languages) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics, 0x87a35eac, 0xa7dc, 0x4b0b, 0xbc,0xc9, 0x24,0xf4,0x7c,0x0b,0x7e,0xbf)
#endif
#else
typedef struct __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStaticsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** ISpeechRecognizerStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *get_SystemSpeechLanguage)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics *This,
        __x_ABI_CWindows_CGlobalization_CILanguage **language);

    HRESULT (STDMETHODCALLTYPE *get_SupportedTopicLanguages)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics *This,
        __FIVectorView_1_Windows__CGlobalization__CLanguage **languages);

    HRESULT (STDMETHODCALLTYPE *get_SupportedGrammarLanguages)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics *This,
        __FIVectorView_1_Windows__CGlobalization__CLanguage **languages);

    END_INTERFACE
} __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStaticsVtbl;

interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics {
    CONST_VTBL __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ISpeechRecognizerStatics methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics_get_SystemSpeechLanguage(This,language) (This)->lpVtbl->get_SystemSpeechLanguage(This,language)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics_get_SupportedTopicLanguages(This,languages) (This)->lpVtbl->get_SupportedTopicLanguages(This,languages)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics_get_SupportedGrammarLanguages(This,languages) (This)->lpVtbl->get_SupportedGrammarLanguages(This,languages)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics_QueryInterface(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics_AddRef(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics_Release(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics_GetIids(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics_GetRuntimeClassName(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics_GetTrustLevel(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ISpeechRecognizerStatics methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics_get_SystemSpeechLanguage(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics* This,__x_ABI_CWindows_CGlobalization_CILanguage **language) {
    return This->lpVtbl->get_SystemSpeechLanguage(This,language);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics_get_SupportedTopicLanguages(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics* This,__FIVectorView_1_Windows__CGlobalization__CLanguage **languages) {
    return This->lpVtbl->get_SupportedTopicLanguages(This,languages);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics_get_SupportedGrammarLanguages(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics* This,__FIVectorView_1_Windows__CGlobalization__CLanguage **languages) {
    return This->lpVtbl->get_SupportedGrammarLanguages(This,languages);
}
#endif
#ifdef WIDL_using_Windows_Media_SpeechRecognition
#define IID_ISpeechRecognizerStatics IID___x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics
#define ISpeechRecognizerStaticsVtbl __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStaticsVtbl
#define ISpeechRecognizerStatics __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics
#define ISpeechRecognizerStatics_QueryInterface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics_QueryInterface
#define ISpeechRecognizerStatics_AddRef __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics_AddRef
#define ISpeechRecognizerStatics_Release __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics_Release
#define ISpeechRecognizerStatics_GetIids __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics_GetIids
#define ISpeechRecognizerStatics_GetRuntimeClassName __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics_GetRuntimeClassName
#define ISpeechRecognizerStatics_GetTrustLevel __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics_GetTrustLevel
#define ISpeechRecognizerStatics_get_SystemSpeechLanguage __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics_get_SystemSpeechLanguage
#define ISpeechRecognizerStatics_get_SupportedTopicLanguages __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics_get_SupportedTopicLanguages
#define ISpeechRecognizerStatics_get_SupportedGrammarLanguages __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics_get_SupportedGrammarLanguages
#endif /* WIDL_using_Windows_Media_SpeechRecognition */
#endif

#endif

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

/*****************************************************************************
 * ISpeechRecognizerStatics2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x50000
#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics2, 0x1d1b0d95, 0x7565, 0x4ef9, 0xa2,0xf3, 0xba,0x15,0x16,0x2a,0x96,0xcf);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                MIDL_INTERFACE("1d1b0d95-7565-4ef9-a2f3-ba15162a96cf")
                ISpeechRecognizerStatics2 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE TrySetSystemSpeechLanguageAsync(
                        ABI::Windows::Globalization::ILanguage *language,
                        ABI::Windows::Foundation::IAsyncOperation<boolean > **operation) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics2, 0x1d1b0d95, 0x7565, 0x4ef9, 0xa2,0xf3, 0xba,0x15,0x16,0x2a,0x96,0xcf)
#endif
#else
typedef struct __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** ISpeechRecognizerStatics2 methods ***/
    HRESULT (STDMETHODCALLTYPE *TrySetSystemSpeechLanguageAsync)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics2 *This,
        __x_ABI_CWindows_CGlobalization_CILanguage *language,
        __FIAsyncOperation_1_boolean **operation);

    END_INTERFACE
} __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics2Vtbl;

interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics2 {
    CONST_VTBL __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ISpeechRecognizerStatics2 methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics2_TrySetSystemSpeechLanguageAsync(This,language,operation) (This)->lpVtbl->TrySetSystemSpeechLanguageAsync(This,language,operation)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics2_QueryInterface(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics2_AddRef(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics2_Release(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics2_GetIids(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics2_GetRuntimeClassName(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics2_GetTrustLevel(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ISpeechRecognizerStatics2 methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics2_TrySetSystemSpeechLanguageAsync(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics2* This,__x_ABI_CWindows_CGlobalization_CILanguage *language,__FIAsyncOperation_1_boolean **operation) {
    return This->lpVtbl->TrySetSystemSpeechLanguageAsync(This,language,operation);
}
#endif
#ifdef WIDL_using_Windows_Media_SpeechRecognition
#define IID_ISpeechRecognizerStatics2 IID___x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics2
#define ISpeechRecognizerStatics2Vtbl __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics2Vtbl
#define ISpeechRecognizerStatics2 __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics2
#define ISpeechRecognizerStatics2_QueryInterface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics2_QueryInterface
#define ISpeechRecognizerStatics2_AddRef __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics2_AddRef
#define ISpeechRecognizerStatics2_Release __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics2_Release
#define ISpeechRecognizerStatics2_GetIids __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics2_GetIids
#define ISpeechRecognizerStatics2_GetRuntimeClassName __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics2_GetRuntimeClassName
#define ISpeechRecognizerStatics2_GetTrustLevel __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics2_GetTrustLevel
#define ISpeechRecognizerStatics2_TrySetSystemSpeechLanguageAsync __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics2_TrySetSystemSpeechLanguageAsync
#endif /* WIDL_using_Windows_Media_SpeechRecognition */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStatics2_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x50000 */

/*****************************************************************************
 * ISpeechRecognizerTimeouts interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts, 0x2ef76fca, 0x6a3c, 0x4dca, 0xa1,0x53, 0xdf,0x1b,0xc8,0x8a,0x79,0xaf);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                MIDL_INTERFACE("2ef76fca-6a3c-4dca-a153-df1bc88a79af")
                ISpeechRecognizerTimeouts : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_InitialSilenceTimeout(
                        ABI::Windows::Foundation::TimeSpan *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_InitialSilenceTimeout(
                        ABI::Windows::Foundation::TimeSpan value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_EndSilenceTimeout(
                        ABI::Windows::Foundation::TimeSpan *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_EndSilenceTimeout(
                        ABI::Windows::Foundation::TimeSpan value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_BabbleTimeout(
                        ABI::Windows::Foundation::TimeSpan *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_BabbleTimeout(
                        ABI::Windows::Foundation::TimeSpan value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts, 0x2ef76fca, 0x6a3c, 0x4dca, 0xa1,0x53, 0xdf,0x1b,0xc8,0x8a,0x79,0xaf)
#endif
#else
typedef struct __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeoutsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** ISpeechRecognizerTimeouts methods ***/
    HRESULT (STDMETHODCALLTYPE *get_InitialSilenceTimeout)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts *This,
        __x_ABI_CWindows_CFoundation_CTimeSpan *value);

    HRESULT (STDMETHODCALLTYPE *put_InitialSilenceTimeout)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts *This,
        __x_ABI_CWindows_CFoundation_CTimeSpan value);

    HRESULT (STDMETHODCALLTYPE *get_EndSilenceTimeout)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts *This,
        __x_ABI_CWindows_CFoundation_CTimeSpan *value);

    HRESULT (STDMETHODCALLTYPE *put_EndSilenceTimeout)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts *This,
        __x_ABI_CWindows_CFoundation_CTimeSpan value);

    HRESULT (STDMETHODCALLTYPE *get_BabbleTimeout)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts *This,
        __x_ABI_CWindows_CFoundation_CTimeSpan *value);

    HRESULT (STDMETHODCALLTYPE *put_BabbleTimeout)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts *This,
        __x_ABI_CWindows_CFoundation_CTimeSpan value);

    END_INTERFACE
} __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeoutsVtbl;

interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts {
    CONST_VTBL __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeoutsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ISpeechRecognizerTimeouts methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts_get_InitialSilenceTimeout(This,value) (This)->lpVtbl->get_InitialSilenceTimeout(This,value)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts_put_InitialSilenceTimeout(This,value) (This)->lpVtbl->put_InitialSilenceTimeout(This,value)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts_get_EndSilenceTimeout(This,value) (This)->lpVtbl->get_EndSilenceTimeout(This,value)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts_put_EndSilenceTimeout(This,value) (This)->lpVtbl->put_EndSilenceTimeout(This,value)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts_get_BabbleTimeout(This,value) (This)->lpVtbl->get_BabbleTimeout(This,value)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts_put_BabbleTimeout(This,value) (This)->lpVtbl->put_BabbleTimeout(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts_QueryInterface(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts_AddRef(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts_Release(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts_GetIids(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts_GetRuntimeClassName(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts_GetTrustLevel(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ISpeechRecognizerTimeouts methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts_get_InitialSilenceTimeout(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts* This,__x_ABI_CWindows_CFoundation_CTimeSpan *value) {
    return This->lpVtbl->get_InitialSilenceTimeout(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts_put_InitialSilenceTimeout(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts* This,__x_ABI_CWindows_CFoundation_CTimeSpan value) {
    return This->lpVtbl->put_InitialSilenceTimeout(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts_get_EndSilenceTimeout(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts* This,__x_ABI_CWindows_CFoundation_CTimeSpan *value) {
    return This->lpVtbl->get_EndSilenceTimeout(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts_put_EndSilenceTimeout(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts* This,__x_ABI_CWindows_CFoundation_CTimeSpan value) {
    return This->lpVtbl->put_EndSilenceTimeout(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts_get_BabbleTimeout(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts* This,__x_ABI_CWindows_CFoundation_CTimeSpan *value) {
    return This->lpVtbl->get_BabbleTimeout(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts_put_BabbleTimeout(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts* This,__x_ABI_CWindows_CFoundation_CTimeSpan value) {
    return This->lpVtbl->put_BabbleTimeout(This,value);
}
#endif
#ifdef WIDL_using_Windows_Media_SpeechRecognition
#define IID_ISpeechRecognizerTimeouts IID___x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts
#define ISpeechRecognizerTimeoutsVtbl __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeoutsVtbl
#define ISpeechRecognizerTimeouts __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts
#define ISpeechRecognizerTimeouts_QueryInterface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts_QueryInterface
#define ISpeechRecognizerTimeouts_AddRef __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts_AddRef
#define ISpeechRecognizerTimeouts_Release __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts_Release
#define ISpeechRecognizerTimeouts_GetIids __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts_GetIids
#define ISpeechRecognizerTimeouts_GetRuntimeClassName __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts_GetRuntimeClassName
#define ISpeechRecognizerTimeouts_GetTrustLevel __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts_GetTrustLevel
#define ISpeechRecognizerTimeouts_get_InitialSilenceTimeout __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts_get_InitialSilenceTimeout
#define ISpeechRecognizerTimeouts_put_InitialSilenceTimeout __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts_put_InitialSilenceTimeout
#define ISpeechRecognizerTimeouts_get_EndSilenceTimeout __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts_get_EndSilenceTimeout
#define ISpeechRecognizerTimeouts_put_EndSilenceTimeout __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts_put_EndSilenceTimeout
#define ISpeechRecognizerTimeouts_get_BabbleTimeout __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts_get_BabbleTimeout
#define ISpeechRecognizerTimeouts_put_BabbleTimeout __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerTimeouts_put_BabbleTimeout
#endif /* WIDL_using_Windows_Media_SpeechRecognition */
#endif

#endif

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

/*****************************************************************************
 * ISpeechRecognizerUIOptions interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions, 0x7888d641, 0xb92b, 0x44ba, 0xa2,0x5f, 0xd1,0x86,0x46,0x30,0x64,0x1f);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                MIDL_INTERFACE("7888d641-b92b-44ba-a25f-d1864630641f")
                ISpeechRecognizerUIOptions : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_ExampleText(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_ExampleText(
                        HSTRING value) = 0;

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

                    virtual HRESULT STDMETHODCALLTYPE put_AudiblePrompt(
                        HSTRING value) = 0;

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

                    virtual HRESULT STDMETHODCALLTYPE put_IsReadBackEnabled(
                        boolean value) = 0;

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

                    virtual HRESULT STDMETHODCALLTYPE put_ShowConfirmation(
                        boolean value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions, 0x7888d641, 0xb92b, 0x44ba, 0xa2,0x5f, 0xd1,0x86,0x46,0x30,0x64,0x1f)
#endif
#else
typedef struct __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptionsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** ISpeechRecognizerUIOptions methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ExampleText)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *put_ExampleText)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions *This,
        HSTRING value);

    HRESULT (STDMETHODCALLTYPE *get_AudiblePrompt)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *put_AudiblePrompt)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions *This,
        HSTRING value);

    HRESULT (STDMETHODCALLTYPE *get_IsReadBackEnabled)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *put_IsReadBackEnabled)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions *This,
        boolean value);

    HRESULT (STDMETHODCALLTYPE *get_ShowConfirmation)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *put_ShowConfirmation)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions *This,
        boolean value);

    END_INTERFACE
} __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptionsVtbl;

interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions {
    CONST_VTBL __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptionsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ISpeechRecognizerUIOptions methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions_get_ExampleText(This,value) (This)->lpVtbl->get_ExampleText(This,value)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions_put_ExampleText(This,value) (This)->lpVtbl->put_ExampleText(This,value)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions_get_AudiblePrompt(This,value) (This)->lpVtbl->get_AudiblePrompt(This,value)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions_put_AudiblePrompt(This,value) (This)->lpVtbl->put_AudiblePrompt(This,value)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions_get_IsReadBackEnabled(This,value) (This)->lpVtbl->get_IsReadBackEnabled(This,value)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions_put_IsReadBackEnabled(This,value) (This)->lpVtbl->put_IsReadBackEnabled(This,value)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions_get_ShowConfirmation(This,value) (This)->lpVtbl->get_ShowConfirmation(This,value)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions_put_ShowConfirmation(This,value) (This)->lpVtbl->put_ShowConfirmation(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions_QueryInterface(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions_AddRef(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions_Release(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions_GetIids(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions_GetRuntimeClassName(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions_GetTrustLevel(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ISpeechRecognizerUIOptions methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions_get_ExampleText(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions* This,HSTRING *value) {
    return This->lpVtbl->get_ExampleText(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions_put_ExampleText(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions* This,HSTRING value) {
    return This->lpVtbl->put_ExampleText(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions_get_AudiblePrompt(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions* This,HSTRING *value) {
    return This->lpVtbl->get_AudiblePrompt(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions_put_AudiblePrompt(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions* This,HSTRING value) {
    return This->lpVtbl->put_AudiblePrompt(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions_get_IsReadBackEnabled(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions* This,boolean *value) {
    return This->lpVtbl->get_IsReadBackEnabled(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions_put_IsReadBackEnabled(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions* This,boolean value) {
    return This->lpVtbl->put_IsReadBackEnabled(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions_get_ShowConfirmation(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions* This,boolean *value) {
    return This->lpVtbl->get_ShowConfirmation(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions_put_ShowConfirmation(__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions* This,boolean value) {
    return This->lpVtbl->put_ShowConfirmation(This,value);
}
#endif
#ifdef WIDL_using_Windows_Media_SpeechRecognition
#define IID_ISpeechRecognizerUIOptions IID___x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions
#define ISpeechRecognizerUIOptionsVtbl __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptionsVtbl
#define ISpeechRecognizerUIOptions __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions
#define ISpeechRecognizerUIOptions_QueryInterface __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions_QueryInterface
#define ISpeechRecognizerUIOptions_AddRef __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions_AddRef
#define ISpeechRecognizerUIOptions_Release __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions_Release
#define ISpeechRecognizerUIOptions_GetIids __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions_GetIids
#define ISpeechRecognizerUIOptions_GetRuntimeClassName __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions_GetRuntimeClassName
#define ISpeechRecognizerUIOptions_GetTrustLevel __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions_GetTrustLevel
#define ISpeechRecognizerUIOptions_get_ExampleText __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions_get_ExampleText
#define ISpeechRecognizerUIOptions_put_ExampleText __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions_put_ExampleText
#define ISpeechRecognizerUIOptions_get_AudiblePrompt __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions_get_AudiblePrompt
#define ISpeechRecognizerUIOptions_put_AudiblePrompt __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions_put_AudiblePrompt
#define ISpeechRecognizerUIOptions_get_IsReadBackEnabled __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions_get_IsReadBackEnabled
#define ISpeechRecognizerUIOptions_put_IsReadBackEnabled __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions_put_IsReadBackEnabled
#define ISpeechRecognizerUIOptions_get_ShowConfirmation __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions_get_ShowConfirmation
#define ISpeechRecognizerUIOptions_put_ShowConfirmation __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerUIOptions_put_ShowConfirmation
#endif /* WIDL_using_Windows_Media_SpeechRecognition */
#endif

#endif

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

/*****************************************************************************
 * IVoiceCommandSet interface
 */
#if WINDOWS_PHONE_PHONECONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSet_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSet_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSet, 0x0bedda75, 0x46e6, 0x4b11, 0xa0,0x88, 0x5c,0x68,0x63,0x28,0x99,0xb5);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Media {
            namespace SpeechRecognition {
                MIDL_INTERFACE("0bedda75-46e6-4b11-a088-5c68632899b5")
                IVoiceCommandSet : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Language(
                        HSTRING *value) = 0;

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

                    virtual HRESULT STDMETHODCALLTYPE SetPhraseListAsync(
                        HSTRING phrase_list_name,
                        ABI::Windows::Foundation::Collections::IIterable<HSTRING > *phrase_list,
                        ABI::Windows::Foundation::IAsyncAction **update_action) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSet, 0x0bedda75, 0x46e6, 0x4b11, 0xa0,0x88, 0x5c,0x68,0x63,0x28,0x99,0xb5)
#endif
#else
typedef struct __x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSetVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IVoiceCommandSet methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Language)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSet *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Name)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSet *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *SetPhraseListAsync)(
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSet *This,
        HSTRING phrase_list_name,
        __FIIterable_1_HSTRING *phrase_list,
        __x_ABI_CWindows_CFoundation_CIAsyncAction **update_action);

    END_INTERFACE
} __x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSetVtbl;

interface __x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSet {
    CONST_VTBL __x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSetVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSet_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSet_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSet_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSet_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSet_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSet_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVoiceCommandSet methods ***/
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSet_get_Language(This,value) (This)->lpVtbl->get_Language(This,value)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSet_get_Name(This,value) (This)->lpVtbl->get_Name(This,value)
#define __x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSet_SetPhraseListAsync(This,phrase_list_name,phrase_list,update_action) (This)->lpVtbl->SetPhraseListAsync(This,phrase_list_name,phrase_list,update_action)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSet_QueryInterface(__x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSet* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSet_AddRef(__x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSet* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSet_Release(__x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSet* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSet_GetIids(__x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSet* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSet_GetRuntimeClassName(__x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSet* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSet_GetTrustLevel(__x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSet* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVoiceCommandSet methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSet_get_Language(__x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSet* This,HSTRING *value) {
    return This->lpVtbl->get_Language(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSet_get_Name(__x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSet* This,HSTRING *value) {
    return This->lpVtbl->get_Name(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSet_SetPhraseListAsync(__x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSet* This,HSTRING phrase_list_name,__FIIterable_1_HSTRING *phrase_list,__x_ABI_CWindows_CFoundation_CIAsyncAction **update_action) {
    return This->lpVtbl->SetPhraseListAsync(This,phrase_list_name,phrase_list,update_action);
}
#endif
#ifdef WIDL_using_Windows_Media_SpeechRecognition
#define IID_IVoiceCommandSet IID___x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSet
#define IVoiceCommandSetVtbl __x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSetVtbl
#define IVoiceCommandSet __x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSet
#define IVoiceCommandSet_QueryInterface __x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSet_QueryInterface
#define IVoiceCommandSet_AddRef __x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSet_AddRef
#define IVoiceCommandSet_Release __x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSet_Release
#define IVoiceCommandSet_GetIids __x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSet_GetIids
#define IVoiceCommandSet_GetRuntimeClassName __x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSet_GetRuntimeClassName
#define IVoiceCommandSet_GetTrustLevel __x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSet_GetTrustLevel
#define IVoiceCommandSet_get_Language __x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSet_get_Language
#define IVoiceCommandSet_get_Name __x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSet_get_Name
#define IVoiceCommandSet_SetPhraseListAsync __x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSet_SetPhraseListAsync
#endif /* WIDL_using_Windows_Media_SpeechRecognition */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CMedia_CSpeechRecognition_CIVoiceCommandSet_INTERFACE_DEFINED__ */
#endif /* WINDOWS_PHONE_PHONECONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Media.SpeechRecognition.SpeechContinuousRecognitionCompletedEventArgs
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Media_SpeechRecognition_SpeechContinuousRecognitionCompletedEventArgs_DEFINED
#define RUNTIMECLASS_Windows_Media_SpeechRecognition_SpeechContinuousRecognitionCompletedEventArgs_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Media_SpeechRecognition_SpeechContinuousRecognitionCompletedEventArgs[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','S','p','e','e','c','h','R','e','c','o','g','n','i','t','i','o','n','.','S','p','e','e','c','h','C','o','n','t','i','n','u','o','u','s','R','e','c','o','g','n','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_Media_SpeechRecognition_SpeechContinuousRecognitionCompletedEventArgs[] = L"Windows.Media.SpeechRecognition.SpeechContinuousRecognitionCompletedEventArgs";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_SpeechRecognition_SpeechContinuousRecognitionCompletedEventArgs[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','S','p','e','e','c','h','R','e','c','o','g','n','i','t','i','o','n','.','S','p','e','e','c','h','C','o','n','t','i','n','u','o','u','s','R','e','c','o','g','n','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_Media_SpeechRecognition_SpeechContinuousRecognitionCompletedEventArgs_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Media.SpeechRecognition.SpeechContinuousRecognitionResultGeneratedEventArgs
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Media_SpeechRecognition_SpeechContinuousRecognitionResultGeneratedEventArgs_DEFINED
#define RUNTIMECLASS_Windows_Media_SpeechRecognition_SpeechContinuousRecognitionResultGeneratedEventArgs_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Media_SpeechRecognition_SpeechContinuousRecognitionResultGeneratedEventArgs[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','S','p','e','e','c','h','R','e','c','o','g','n','i','t','i','o','n','.','S','p','e','e','c','h','C','o','n','t','i','n','u','o','u','s','R','e','c','o','g','n','i','t','i','o','n','R','e','s','u','l','t','G','e','n','e','r','a','t','e','d','E','v','e','n','t','A','r','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_SpeechRecognition_SpeechContinuousRecognitionResultGeneratedEventArgs[] = L"Windows.Media.SpeechRecognition.SpeechContinuousRecognitionResultGeneratedEventArgs";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_SpeechRecognition_SpeechContinuousRecognitionResultGeneratedEventArgs[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','S','p','e','e','c','h','R','e','c','o','g','n','i','t','i','o','n','.','S','p','e','e','c','h','C','o','n','t','i','n','u','o','u','s','R','e','c','o','g','n','i','t','i','o','n','R','e','s','u','l','t','G','e','n','e','r','a','t','e','d','E','v','e','n','t','A','r','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_Media_SpeechRecognition_SpeechContinuousRecognitionResultGeneratedEventArgs_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Media.SpeechRecognition.SpeechContinuousRecognitionSession
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Media_SpeechRecognition_SpeechContinuousRecognitionSession_DEFINED
#define RUNTIMECLASS_Windows_Media_SpeechRecognition_SpeechContinuousRecognitionSession_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Media_SpeechRecognition_SpeechContinuousRecognitionSession[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','S','p','e','e','c','h','R','e','c','o','g','n','i','t','i','o','n','.','S','p','e','e','c','h','C','o','n','t','i','n','u','o','u','s','R','e','c','o','g','n','i','t','i','o','n','S','e','s','s','i','o','n',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_SpeechRecognition_SpeechContinuousRecognitionSession[] = L"Windows.Media.SpeechRecognition.SpeechContinuousRecognitionSession";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_SpeechRecognition_SpeechContinuousRecognitionSession[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','S','p','e','e','c','h','R','e','c','o','g','n','i','t','i','o','n','.','S','p','e','e','c','h','C','o','n','t','i','n','u','o','u','s','R','e','c','o','g','n','i','t','i','o','n','S','e','s','s','i','o','n',0};
#endif
#endif /* RUNTIMECLASS_Windows_Media_SpeechRecognition_SpeechContinuousRecognitionSession_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Media.SpeechRecognition.SpeechRecognitionCompilationResult
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Media_SpeechRecognition_SpeechRecognitionCompilationResult_DEFINED
#define RUNTIMECLASS_Windows_Media_SpeechRecognition_SpeechRecognitionCompilationResult_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Media_SpeechRecognition_SpeechRecognitionCompilationResult[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','S','p','e','e','c','h','R','e','c','o','g','n','i','t','i','o','n','.','S','p','e','e','c','h','R','e','c','o','g','n','i','t','i','o','n','C','o','m','p','i','l','a','t','i','o','n','R','e','s','u','l','t',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_SpeechRecognition_SpeechRecognitionCompilationResult[] = L"Windows.Media.SpeechRecognition.SpeechRecognitionCompilationResult";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_SpeechRecognition_SpeechRecognitionCompilationResult[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','S','p','e','e','c','h','R','e','c','o','g','n','i','t','i','o','n','.','S','p','e','e','c','h','R','e','c','o','g','n','i','t','i','o','n','C','o','m','p','i','l','a','t','i','o','n','R','e','s','u','l','t',0};
#endif
#endif /* RUNTIMECLASS_Windows_Media_SpeechRecognition_SpeechRecognitionCompilationResult_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Media.SpeechRecognition.SpeechRecognitionHypothesis
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Media_SpeechRecognition_SpeechRecognitionHypothesis_DEFINED
#define RUNTIMECLASS_Windows_Media_SpeechRecognition_SpeechRecognitionHypothesis_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Media_SpeechRecognition_SpeechRecognitionHypothesis[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','S','p','e','e','c','h','R','e','c','o','g','n','i','t','i','o','n','.','S','p','e','e','c','h','R','e','c','o','g','n','i','t','i','o','n','H','y','p','o','t','h','e','s','i','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_SpeechRecognition_SpeechRecognitionHypothesis[] = L"Windows.Media.SpeechRecognition.SpeechRecognitionHypothesis";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_SpeechRecognition_SpeechRecognitionHypothesis[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','S','p','e','e','c','h','R','e','c','o','g','n','i','t','i','o','n','.','S','p','e','e','c','h','R','e','c','o','g','n','i','t','i','o','n','H','y','p','o','t','h','e','s','i','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_Media_SpeechRecognition_SpeechRecognitionHypothesis_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Media.SpeechRecognition.SpeechRecognitionHypothesisGeneratedEventArgs
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Media_SpeechRecognition_SpeechRecognitionHypothesisGeneratedEventArgs_DEFINED
#define RUNTIMECLASS_Windows_Media_SpeechRecognition_SpeechRecognitionHypothesisGeneratedEventArgs_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Media_SpeechRecognition_SpeechRecognitionHypothesisGeneratedEventArgs[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','S','p','e','e','c','h','R','e','c','o','g','n','i','t','i','o','n','.','S','p','e','e','c','h','R','e','c','o','g','n','i','t','i','o','n','H','y','p','o','t','h','e','s','i','s','G','e','n','e','r','a','t','e','d','E','v','e','n','t','A','r','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_SpeechRecognition_SpeechRecognitionHypothesisGeneratedEventArgs[] = L"Windows.Media.SpeechRecognition.SpeechRecognitionHypothesisGeneratedEventArgs";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_SpeechRecognition_SpeechRecognitionHypothesisGeneratedEventArgs[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','S','p','e','e','c','h','R','e','c','o','g','n','i','t','i','o','n','.','S','p','e','e','c','h','R','e','c','o','g','n','i','t','i','o','n','H','y','p','o','t','h','e','s','i','s','G','e','n','e','r','a','t','e','d','E','v','e','n','t','A','r','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_Media_SpeechRecognition_SpeechRecognitionHypothesisGeneratedEventArgs_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Media.SpeechRecognition.SpeechRecognitionListConstraint
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Media_SpeechRecognition_SpeechRecognitionListConstraint_DEFINED
#define RUNTIMECLASS_Windows_Media_SpeechRecognition_SpeechRecognitionListConstraint_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Media_SpeechRecognition_SpeechRecognitionListConstraint[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','S','p','e','e','c','h','R','e','c','o','g','n','i','t','i','o','n','.','S','p','e','e','c','h','R','e','c','o','g','n','i','t','i','o','n','L','i','s','t','C','o','n','s','t','r','a','i','n','t',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_SpeechRecognition_SpeechRecognitionListConstraint[] = L"Windows.Media.SpeechRecognition.SpeechRecognitionListConstraint";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_SpeechRecognition_SpeechRecognitionListConstraint[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','S','p','e','e','c','h','R','e','c','o','g','n','i','t','i','o','n','.','S','p','e','e','c','h','R','e','c','o','g','n','i','t','i','o','n','L','i','s','t','C','o','n','s','t','r','a','i','n','t',0};
#endif
#endif /* RUNTIMECLASS_Windows_Media_SpeechRecognition_SpeechRecognitionListConstraint_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Media.SpeechRecognition.SpeechRecognitionQualityDegradingEventArgs
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Media_SpeechRecognition_SpeechRecognitionQualityDegradingEventArgs_DEFINED
#define RUNTIMECLASS_Windows_Media_SpeechRecognition_SpeechRecognitionQualityDegradingEventArgs_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Media_SpeechRecognition_SpeechRecognitionQualityDegradingEventArgs[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','S','p','e','e','c','h','R','e','c','o','g','n','i','t','i','o','n','.','S','p','e','e','c','h','R','e','c','o','g','n','i','t','i','o','n','Q','u','a','l','i','t','y','D','e','g','r','a','d','i','n','g','E','v','e','n','t','A','r','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_SpeechRecognition_SpeechRecognitionQualityDegradingEventArgs[] = L"Windows.Media.SpeechRecognition.SpeechRecognitionQualityDegradingEventArgs";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_SpeechRecognition_SpeechRecognitionQualityDegradingEventArgs[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','S','p','e','e','c','h','R','e','c','o','g','n','i','t','i','o','n','.','S','p','e','e','c','h','R','e','c','o','g','n','i','t','i','o','n','Q','u','a','l','i','t','y','D','e','g','r','a','d','i','n','g','E','v','e','n','t','A','r','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_Media_SpeechRecognition_SpeechRecognitionQualityDegradingEventArgs_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Media.SpeechRecognition.SpeechRecognitionResult
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Media_SpeechRecognition_SpeechRecognitionResult_DEFINED
#define RUNTIMECLASS_Windows_Media_SpeechRecognition_SpeechRecognitionResult_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Media_SpeechRecognition_SpeechRecognitionResult[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','S','p','e','e','c','h','R','e','c','o','g','n','i','t','i','o','n','.','S','p','e','e','c','h','R','e','c','o','g','n','i','t','i','o','n','R','e','s','u','l','t',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_SpeechRecognition_SpeechRecognitionResult[] = L"Windows.Media.SpeechRecognition.SpeechRecognitionResult";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_SpeechRecognition_SpeechRecognitionResult[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','S','p','e','e','c','h','R','e','c','o','g','n','i','t','i','o','n','.','S','p','e','e','c','h','R','e','c','o','g','n','i','t','i','o','n','R','e','s','u','l','t',0};
#endif
#endif /* RUNTIMECLASS_Windows_Media_SpeechRecognition_SpeechRecognitionResult_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Media.SpeechRecognition.SpeechRecognitionSemanticInterpretation
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Media_SpeechRecognition_SpeechRecognitionSemanticInterpretation_DEFINED
#define RUNTIMECLASS_Windows_Media_SpeechRecognition_SpeechRecognitionSemanticInterpretation_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Media_SpeechRecognition_SpeechRecognitionSemanticInterpretation[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','S','p','e','e','c','h','R','e','c','o','g','n','i','t','i','o','n','.','S','p','e','e','c','h','R','e','c','o','g','n','i','t','i','o','n','S','e','m','a','n','t','i','c','I','n','t','e','r','p','r','e','t','a','t','i','o','n',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_SpeechRecognition_SpeechRecognitionSemanticInterpretation[] = L"Windows.Media.SpeechRecognition.SpeechRecognitionSemanticInterpretation";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_SpeechRecognition_SpeechRecognitionSemanticInterpretation[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','S','p','e','e','c','h','R','e','c','o','g','n','i','t','i','o','n','.','S','p','e','e','c','h','R','e','c','o','g','n','i','t','i','o','n','S','e','m','a','n','t','i','c','I','n','t','e','r','p','r','e','t','a','t','i','o','n',0};
#endif
#endif /* RUNTIMECLASS_Windows_Media_SpeechRecognition_SpeechRecognitionSemanticInterpretation_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Media.SpeechRecognition.SpeechRecognizer
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Media_SpeechRecognition_SpeechRecognizer_DEFINED
#define RUNTIMECLASS_Windows_Media_SpeechRecognition_SpeechRecognizer_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Media_SpeechRecognition_SpeechRecognizer[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','S','p','e','e','c','h','R','e','c','o','g','n','i','t','i','o','n','.','S','p','e','e','c','h','R','e','c','o','g','n','i','z','e','r',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_SpeechRecognition_SpeechRecognizer[] = L"Windows.Media.SpeechRecognition.SpeechRecognizer";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_SpeechRecognition_SpeechRecognizer[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','S','p','e','e','c','h','R','e','c','o','g','n','i','t','i','o','n','.','S','p','e','e','c','h','R','e','c','o','g','n','i','z','e','r',0};
#endif
#endif /* RUNTIMECLASS_Windows_Media_SpeechRecognition_SpeechRecognizer_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Media.SpeechRecognition.SpeechRecognizerStateChangedEventArgs
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Media_SpeechRecognition_SpeechRecognizerStateChangedEventArgs_DEFINED
#define RUNTIMECLASS_Windows_Media_SpeechRecognition_SpeechRecognizerStateChangedEventArgs_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Media_SpeechRecognition_SpeechRecognizerStateChangedEventArgs[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','S','p','e','e','c','h','R','e','c','o','g','n','i','t','i','o','n','.','S','p','e','e','c','h','R','e','c','o','g','n','i','z','e','r','S','t','a','t','e','C','h','a','n','g','e','d','E','v','e','n','t','A','r','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_SpeechRecognition_SpeechRecognizerStateChangedEventArgs[] = L"Windows.Media.SpeechRecognition.SpeechRecognizerStateChangedEventArgs";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_SpeechRecognition_SpeechRecognizerStateChangedEventArgs[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','S','p','e','e','c','h','R','e','c','o','g','n','i','t','i','o','n','.','S','p','e','e','c','h','R','e','c','o','g','n','i','z','e','r','S','t','a','t','e','C','h','a','n','g','e','d','E','v','e','n','t','A','r','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_Media_SpeechRecognition_SpeechRecognizerStateChangedEventArgs_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Media.SpeechRecognition.SpeechRecognizerTimeouts
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Media_SpeechRecognition_SpeechRecognizerTimeouts_DEFINED
#define RUNTIMECLASS_Windows_Media_SpeechRecognition_SpeechRecognizerTimeouts_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Media_SpeechRecognition_SpeechRecognizerTimeouts[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','S','p','e','e','c','h','R','e','c','o','g','n','i','t','i','o','n','.','S','p','e','e','c','h','R','e','c','o','g','n','i','z','e','r','T','i','m','e','o','u','t','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_SpeechRecognition_SpeechRecognizerTimeouts[] = L"Windows.Media.SpeechRecognition.SpeechRecognizerTimeouts";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_SpeechRecognition_SpeechRecognizerTimeouts[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','S','p','e','e','c','h','R','e','c','o','g','n','i','t','i','o','n','.','S','p','e','e','c','h','R','e','c','o','g','n','i','z','e','r','T','i','m','e','o','u','t','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_Media_SpeechRecognition_SpeechRecognizerTimeouts_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Media.SpeechRecognition.SpeechRecognizerUIOptions
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Media_SpeechRecognition_SpeechRecognizerUIOptions_DEFINED
#define RUNTIMECLASS_Windows_Media_SpeechRecognition_SpeechRecognizerUIOptions_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Media_SpeechRecognition_SpeechRecognizerUIOptions[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','S','p','e','e','c','h','R','e','c','o','g','n','i','t','i','o','n','.','S','p','e','e','c','h','R','e','c','o','g','n','i','z','e','r','U','I','O','p','t','i','o','n','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_SpeechRecognition_SpeechRecognizerUIOptions[] = L"Windows.Media.SpeechRecognition.SpeechRecognizerUIOptions";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_SpeechRecognition_SpeechRecognizerUIOptions[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','S','p','e','e','c','h','R','e','c','o','g','n','i','t','i','o','n','.','S','p','e','e','c','h','R','e','c','o','g','n','i','z','e','r','U','I','O','p','t','i','o','n','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_Media_SpeechRecognition_SpeechRecognizerUIOptions_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Media.SpeechRecognition.VoiceCommandSet
 */
#if WINDOWS_PHONE_PHONECONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Media_SpeechRecognition_VoiceCommandSet_DEFINED
#define RUNTIMECLASS_Windows_Media_SpeechRecognition_VoiceCommandSet_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Media_SpeechRecognition_VoiceCommandSet[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','S','p','e','e','c','h','R','e','c','o','g','n','i','t','i','o','n','.','V','o','i','c','e','C','o','m','m','a','n','d','S','e','t',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_SpeechRecognition_VoiceCommandSet[] = L"Windows.Media.SpeechRecognition.VoiceCommandSet";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Media_SpeechRecognition_VoiceCommandSet[] = {'W','i','n','d','o','w','s','.','M','e','d','i','a','.','S','p','e','e','c','h','R','e','c','o','g','n','i','t','i','o','n','.','V','o','i','c','e','C','o','m','m','a','n','d','S','e','t',0};
#endif
#endif /* RUNTIMECLASS_Windows_Media_SpeechRecognition_VoiceCommandSet_DEFINED */
#endif /* WINDOWS_PHONE_PHONECONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IIterable<ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionConstraint* > interface
 */
#ifndef ____FIIterable_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_INTERFACE_DEFINED__
#define ____FIIterable_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterable_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint, 0x88e6436c, 0x3253, 0x520b, 0x9e,0xd8, 0xa6,0x3b,0x17,0x8c,0x44,0xa2);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("88e6436c-3253-520b-9ed8-a63b178c44a2")
                IIterable<ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionConstraint* > : IIterable_impl<ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionConstraint* >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterable_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint, 0x88e6436c, 0x3253, 0x520b, 0x9e,0xd8, 0xa6,0x3b,0x17,0x8c,0x44,0xa2)
#endif
#else
typedef struct __FIIterable_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraintVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterable<ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionConstraint* > methods ***/
    HRESULT (STDMETHODCALLTYPE *First)(
        __FIIterable_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint *This,
        __FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint **value);

    END_INTERFACE
} __FIIterable_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraintVtbl;

interface __FIIterable_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint {
    CONST_VTBL __FIIterable_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraintVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterable_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterable_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterable_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterable_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterable_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterable_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterable<ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionConstraint* > methods ***/
#define __FIIterable_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_First(This,value) (This)->lpVtbl->First(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_QueryInterface(__FIIterable_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIIterable_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_AddRef(__FIIterable_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIIterable_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_Release(__FIIterable_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_GetIids(__FIIterable_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_GetRuntimeClassName(__FIIterable_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_GetTrustLevel(__FIIterable_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterable<ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionConstraint* > methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_First(__FIIterable_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint* This,__FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint **value) {
    return This->lpVtbl->First(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterable_ISpeechRecognitionConstraint IID___FIIterable_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint
#define IIterable_ISpeechRecognitionConstraintVtbl __FIIterable_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraintVtbl
#define IIterable_ISpeechRecognitionConstraint __FIIterable_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint
#define IIterable_ISpeechRecognitionConstraint_QueryInterface __FIIterable_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_QueryInterface
#define IIterable_ISpeechRecognitionConstraint_AddRef __FIIterable_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_AddRef
#define IIterable_ISpeechRecognitionConstraint_Release __FIIterable_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_Release
#define IIterable_ISpeechRecognitionConstraint_GetIids __FIIterable_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_GetIids
#define IIterable_ISpeechRecognitionConstraint_GetRuntimeClassName __FIIterable_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_GetRuntimeClassName
#define IIterable_ISpeechRecognitionConstraint_GetTrustLevel __FIIterable_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_GetTrustLevel
#define IIterable_ISpeechRecognitionConstraint_First __FIIterable_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_First
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterable_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterator<ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionConstraint* > interface
 */
#ifndef ____FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_INTERFACE_DEFINED__
#define ____FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint, 0x738f00b1, 0xe18c, 0x5140, 0xa5,0x3a, 0xf1,0x78,0x8d,0x10,0xc9,0x3d);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("738f00b1-e18c-5140-a53a-f1788d10c93d")
                IIterator<ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionConstraint* > : IIterator_impl<ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionConstraint* >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint, 0x738f00b1, 0xe18c, 0x5140, 0xa5,0x3a, 0xf1,0x78,0x8d,0x10,0xc9,0x3d)
#endif
#else
typedef struct __FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraintVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterator<ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionConstraint* > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        __FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint *This,
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint **value);

    HRESULT (STDMETHODCALLTYPE *get_HasCurrent)(
        __FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *MoveNext)(
        __FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint *This,
        UINT32 items_size,
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint **items,
        UINT32 *value);

    END_INTERFACE
} __FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraintVtbl;

interface __FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint {
    CONST_VTBL __FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraintVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterator<ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionConstraint* > methods ***/
#define __FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
#define __FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
#define __FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
#define __FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_GetMany(This,items_size,items,value) (This)->lpVtbl->GetMany(This,items_size,items,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_QueryInterface(__FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_AddRef(__FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_Release(__FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_GetIids(__FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_GetRuntimeClassName(__FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_GetTrustLevel(__FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterator<ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionConstraint* > methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_get_Current(__FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint* This,__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint **value) {
    return This->lpVtbl->get_Current(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_get_HasCurrent(__FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint* This,boolean *value) {
    return This->lpVtbl->get_HasCurrent(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_MoveNext(__FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint* This,boolean *value) {
    return This->lpVtbl->MoveNext(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_GetMany(__FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint* This,UINT32 items_size,__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterator_ISpeechRecognitionConstraint IID___FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint
#define IIterator_ISpeechRecognitionConstraintVtbl __FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraintVtbl
#define IIterator_ISpeechRecognitionConstraint __FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint
#define IIterator_ISpeechRecognitionConstraint_QueryInterface __FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_QueryInterface
#define IIterator_ISpeechRecognitionConstraint_AddRef __FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_AddRef
#define IIterator_ISpeechRecognitionConstraint_Release __FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_Release
#define IIterator_ISpeechRecognitionConstraint_GetIids __FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_GetIids
#define IIterator_ISpeechRecognitionConstraint_GetRuntimeClassName __FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_GetRuntimeClassName
#define IIterator_ISpeechRecognitionConstraint_GetTrustLevel __FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_GetTrustLevel
#define IIterator_ISpeechRecognitionConstraint_get_Current __FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_get_Current
#define IIterator_ISpeechRecognitionConstraint_get_HasCurrent __FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_get_HasCurrent
#define IIterator_ISpeechRecognitionConstraint_MoveNext __FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_MoveNext
#define IIterator_ISpeechRecognitionConstraint_GetMany __FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterator_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVectorView<ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionConstraint* > interface
 */
#ifndef ____FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_INTERFACE_DEFINED__
#define ____FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint, 0x341dee1d, 0x6ac2, 0x5d06, 0x90,0x26, 0xb3,0x0a,0xda,0x20,0x56,0x65);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("341dee1d-6ac2-5d06-9026-b30ada205665")
                IVectorView<ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionConstraint* > : IVectorView_impl<ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionConstraint* >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint, 0x341dee1d, 0x6ac2, 0x5d06, 0x90,0x26, 0xb3,0x0a,0xda,0x20,0x56,0x65)
#endif
#else
typedef struct __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraintVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IVectorView<ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionConstraint* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint *This,
        UINT32 index,
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint **value);

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

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint *This,
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint **items,
        UINT32 *value);

    END_INTERFACE
} __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraintVtbl;

interface __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint {
    CONST_VTBL __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraintVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVectorView<ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionConstraint* > methods ***/
#define __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_QueryInterface(__FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_AddRef(__FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_Release(__FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_GetIids(__FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_GetRuntimeClassName(__FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_GetTrustLevel(__FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVectorView<ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionConstraint* > methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_GetAt(__FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint* This,UINT32 index,__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_get_Size(__FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_IndexOf(__FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint* This,__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_GetMany(__FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVectorView_ISpeechRecognitionConstraint IID___FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint
#define IVectorView_ISpeechRecognitionConstraintVtbl __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraintVtbl
#define IVectorView_ISpeechRecognitionConstraint __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint
#define IVectorView_ISpeechRecognitionConstraint_QueryInterface __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_QueryInterface
#define IVectorView_ISpeechRecognitionConstraint_AddRef __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_AddRef
#define IVectorView_ISpeechRecognitionConstraint_Release __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_Release
#define IVectorView_ISpeechRecognitionConstraint_GetIids __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_GetIids
#define IVectorView_ISpeechRecognitionConstraint_GetRuntimeClassName __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_GetRuntimeClassName
#define IVectorView_ISpeechRecognitionConstraint_GetTrustLevel __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_GetTrustLevel
#define IVectorView_ISpeechRecognitionConstraint_GetAt __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_GetAt
#define IVectorView_ISpeechRecognitionConstraint_get_Size __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_get_Size
#define IVectorView_ISpeechRecognitionConstraint_IndexOf __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_IndexOf
#define IVectorView_ISpeechRecognitionConstraint_GetMany __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVector<ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionConstraint* > interface
 */
#ifndef ____FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_INTERFACE_DEFINED__
#define ____FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint, 0x2691d763, 0x561e, 0x5060, 0xbb,0xc9, 0x7b,0x07,0x36,0x1a,0xcc,0x95);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("2691d763-561e-5060-bbc9-7b07361acc95")
                IVector<ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionConstraint* > : IVector_impl<ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionConstraint* >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint, 0x2691d763, 0x561e, 0x5060, 0xbb,0xc9, 0x7b,0x07,0x36,0x1a,0xcc,0x95)
#endif
#else
typedef struct __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraintVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IVector<ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionConstraint* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint *This,
        UINT32 index,
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint **value);

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

    HRESULT (STDMETHODCALLTYPE *GetView)(
        __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint *This,
        __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint **value);

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint *This,
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *SetAt)(
        __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint *This,
        UINT32 index,
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint *value);

    HRESULT (STDMETHODCALLTYPE *InsertAt)(
        __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint *This,
        UINT32 index,
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint *value);

    HRESULT (STDMETHODCALLTYPE *RemoveAt)(
        __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint *This,
        UINT32 index);

    HRESULT (STDMETHODCALLTYPE *Append)(
        __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint *This,
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint *value);

    HRESULT (STDMETHODCALLTYPE *RemoveAtEnd)(
        __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint *This);

    HRESULT (STDMETHODCALLTYPE *Clear)(
        __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint *This);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint **items,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *ReplaceAll)(
        __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint *This,
        UINT32 count,
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint **items);

    END_INTERFACE
} __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraintVtbl;

interface __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint {
    CONST_VTBL __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraintVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVector<ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionConstraint* > methods ***/
#define __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_GetView(This,value) (This)->lpVtbl->GetView(This,value)
#define __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_SetAt(This,index,value) (This)->lpVtbl->SetAt(This,index,value)
#define __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_InsertAt(This,index,value) (This)->lpVtbl->InsertAt(This,index,value)
#define __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_RemoveAt(This,index) (This)->lpVtbl->RemoveAt(This,index)
#define __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_Append(This,value) (This)->lpVtbl->Append(This,value)
#define __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_RemoveAtEnd(This) (This)->lpVtbl->RemoveAtEnd(This)
#define __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_Clear(This) (This)->lpVtbl->Clear(This)
#define __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#define __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_ReplaceAll(This,count,items) (This)->lpVtbl->ReplaceAll(This,count,items)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_QueryInterface(__FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_AddRef(__FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_Release(__FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_GetIids(__FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_GetRuntimeClassName(__FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_GetTrustLevel(__FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVector<ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionConstraint* > methods ***/
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_GetAt(__FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint* This,UINT32 index,__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_get_Size(__FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_GetView(__FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint* This,__FIVectorView_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint **value) {
    return This->lpVtbl->GetView(This,value);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_IndexOf(__FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint* This,__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_SetAt(__FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint* This,UINT32 index,__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint *value) {
    return This->lpVtbl->SetAt(This,index,value);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_InsertAt(__FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint* This,UINT32 index,__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint *value) {
    return This->lpVtbl->InsertAt(This,index,value);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_RemoveAt(__FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint* This,UINT32 index) {
    return This->lpVtbl->RemoveAt(This,index);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_Append(__FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint* This,__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint *value) {
    return This->lpVtbl->Append(This,value);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_RemoveAtEnd(__FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint* This) {
    return This->lpVtbl->RemoveAtEnd(This);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_Clear(__FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint* This) {
    return This->lpVtbl->Clear(This);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_GetMany(__FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_ReplaceAll(__FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint* This,UINT32 count,__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionConstraint **items) {
    return This->lpVtbl->ReplaceAll(This,count,items);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVector_ISpeechRecognitionConstraint IID___FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint
#define IVector_ISpeechRecognitionConstraintVtbl __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraintVtbl
#define IVector_ISpeechRecognitionConstraint __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint
#define IVector_ISpeechRecognitionConstraint_QueryInterface __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_QueryInterface
#define IVector_ISpeechRecognitionConstraint_AddRef __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_AddRef
#define IVector_ISpeechRecognitionConstraint_Release __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_Release
#define IVector_ISpeechRecognitionConstraint_GetIids __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_GetIids
#define IVector_ISpeechRecognitionConstraint_GetRuntimeClassName __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_GetRuntimeClassName
#define IVector_ISpeechRecognitionConstraint_GetTrustLevel __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_GetTrustLevel
#define IVector_ISpeechRecognitionConstraint_GetAt __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_GetAt
#define IVector_ISpeechRecognitionConstraint_get_Size __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_get_Size
#define IVector_ISpeechRecognitionConstraint_GetView __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_GetView
#define IVector_ISpeechRecognitionConstraint_IndexOf __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_IndexOf
#define IVector_ISpeechRecognitionConstraint_SetAt __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_SetAt
#define IVector_ISpeechRecognitionConstraint_InsertAt __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_InsertAt
#define IVector_ISpeechRecognitionConstraint_RemoveAt __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_RemoveAt
#define IVector_ISpeechRecognitionConstraint_Append __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_Append
#define IVector_ISpeechRecognitionConstraint_RemoveAtEnd __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_RemoveAtEnd
#define IVector_ISpeechRecognitionConstraint_Clear __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_Clear
#define IVector_ISpeechRecognitionConstraint_GetMany __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_GetMany
#define IVector_ISpeechRecognitionConstraint_ReplaceAll __FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_ReplaceAll
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVector_1_Windows__CMedia__CSpeechRecognition__CISpeechRecognitionConstraint_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterable<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionResult* > interface
 */
#ifndef ____FIIterable_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_INTERFACE_DEFINED__
#define ____FIIterable_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterable_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult, 0x0d9b7b48, 0x98a1, 0x5b22, 0x9a,0x66, 0x6f,0x81,0x2f,0x59,0x47,0xaa);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("0d9b7b48-98a1-5b22-9a66-6f812f5947aa")
                IIterable<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionResult* > : IIterable_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionResult*, ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionResult* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterable_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult, 0x0d9b7b48, 0x98a1, 0x5b22, 0x9a,0x66, 0x6f,0x81,0x2f,0x59,0x47,0xaa)
#endif
#else
typedef struct __FIIterable_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResultVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterable<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionResult* > methods ***/
    HRESULT (STDMETHODCALLTYPE *First)(
        __FIIterable_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult *This,
        __FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult **value);

    END_INTERFACE
} __FIIterable_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResultVtbl;

interface __FIIterable_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult {
    CONST_VTBL __FIIterable_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResultVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterable_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterable_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterable_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterable_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterable_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterable_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterable<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionResult* > methods ***/
#define __FIIterable_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_First(This,value) (This)->lpVtbl->First(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_QueryInterface(__FIIterable_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIIterable_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_AddRef(__FIIterable_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIIterable_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_Release(__FIIterable_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_GetIids(__FIIterable_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_GetRuntimeClassName(__FIIterable_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_GetTrustLevel(__FIIterable_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterable<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionResult* > methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_First(__FIIterable_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult* This,__FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult **value) {
    return This->lpVtbl->First(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterable_SpeechRecognitionResult IID___FIIterable_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult
#define IIterable_SpeechRecognitionResultVtbl __FIIterable_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResultVtbl
#define IIterable_SpeechRecognitionResult __FIIterable_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult
#define IIterable_SpeechRecognitionResult_QueryInterface __FIIterable_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_QueryInterface
#define IIterable_SpeechRecognitionResult_AddRef __FIIterable_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_AddRef
#define IIterable_SpeechRecognitionResult_Release __FIIterable_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_Release
#define IIterable_SpeechRecognitionResult_GetIids __FIIterable_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_GetIids
#define IIterable_SpeechRecognitionResult_GetRuntimeClassName __FIIterable_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_GetRuntimeClassName
#define IIterable_SpeechRecognitionResult_GetTrustLevel __FIIterable_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_GetTrustLevel
#define IIterable_SpeechRecognitionResult_First __FIIterable_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_First
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterable_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterator<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionResult* > interface
 */
#ifndef ____FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_INTERFACE_DEFINED__
#define ____FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult, 0x20756dd2, 0x6d3f, 0x5409, 0x84,0x6a, 0x0f,0x0f,0x01,0xd7,0xbf,0x9a);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("20756dd2-6d3f-5409-846a-0f0f01d7bf9a")
                IIterator<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionResult* > : IIterator_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionResult*, ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionResult* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult, 0x20756dd2, 0x6d3f, 0x5409, 0x84,0x6a, 0x0f,0x0f,0x01,0xd7,0xbf,0x9a)
#endif
#else
typedef struct __FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResultVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterator<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionResult* > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        __FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult *This,
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult **value);

    HRESULT (STDMETHODCALLTYPE *get_HasCurrent)(
        __FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *MoveNext)(
        __FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult *This,
        UINT32 items_size,
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult **items,
        UINT32 *value);

    END_INTERFACE
} __FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResultVtbl;

interface __FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult {
    CONST_VTBL __FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResultVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterator<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionResult* > methods ***/
#define __FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
#define __FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
#define __FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
#define __FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_GetMany(This,items_size,items,value) (This)->lpVtbl->GetMany(This,items_size,items,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_QueryInterface(__FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_AddRef(__FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_Release(__FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_GetIids(__FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_GetRuntimeClassName(__FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_GetTrustLevel(__FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterator<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionResult* > methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_get_Current(__FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult* This,__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult **value) {
    return This->lpVtbl->get_Current(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_get_HasCurrent(__FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult* This,boolean *value) {
    return This->lpVtbl->get_HasCurrent(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_MoveNext(__FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult* This,boolean *value) {
    return This->lpVtbl->MoveNext(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_GetMany(__FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult* This,UINT32 items_size,__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterator_SpeechRecognitionResult IID___FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult
#define IIterator_SpeechRecognitionResultVtbl __FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResultVtbl
#define IIterator_SpeechRecognitionResult __FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult
#define IIterator_SpeechRecognitionResult_QueryInterface __FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_QueryInterface
#define IIterator_SpeechRecognitionResult_AddRef __FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_AddRef
#define IIterator_SpeechRecognitionResult_Release __FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_Release
#define IIterator_SpeechRecognitionResult_GetIids __FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_GetIids
#define IIterator_SpeechRecognitionResult_GetRuntimeClassName __FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_GetRuntimeClassName
#define IIterator_SpeechRecognitionResult_GetTrustLevel __FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_GetTrustLevel
#define IIterator_SpeechRecognitionResult_get_Current __FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_get_Current
#define IIterator_SpeechRecognitionResult_get_HasCurrent __FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_get_HasCurrent
#define IIterator_SpeechRecognitionResult_MoveNext __FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_MoveNext
#define IIterator_SpeechRecognitionResult_GetMany __FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterator_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVectorView<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionResult* > interface
 */
#ifndef ____FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_INTERFACE_DEFINED__
#define ____FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult, 0x0e37810f, 0x1de6, 0x5199, 0x83,0x3f, 0x5a,0x6b,0x0b,0xd9,0x1e,0x23);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("0e37810f-1de6-5199-833f-5a6b0bd91e23")
                IVectorView<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionResult* > : IVectorView_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionResult*, ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionResult* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult, 0x0e37810f, 0x1de6, 0x5199, 0x83,0x3f, 0x5a,0x6b,0x0b,0xd9,0x1e,0x23)
#endif
#else
typedef struct __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResultVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IVectorView<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionResult* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult *This,
        UINT32 index,
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult **value);

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

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult *This,
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult **items,
        UINT32 *value);

    END_INTERFACE
} __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResultVtbl;

interface __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult {
    CONST_VTBL __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResultVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVectorView<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionResult* > methods ***/
#define __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_QueryInterface(__FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_AddRef(__FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_Release(__FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_GetIids(__FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_GetRuntimeClassName(__FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_GetTrustLevel(__FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVectorView<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionResult* > methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_GetAt(__FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult* This,UINT32 index,__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_get_Size(__FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_IndexOf(__FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult* This,__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_GetMany(__FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVectorView_SpeechRecognitionResult IID___FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult
#define IVectorView_SpeechRecognitionResultVtbl __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResultVtbl
#define IVectorView_SpeechRecognitionResult __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult
#define IVectorView_SpeechRecognitionResult_QueryInterface __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_QueryInterface
#define IVectorView_SpeechRecognitionResult_AddRef __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_AddRef
#define IVectorView_SpeechRecognitionResult_Release __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_Release
#define IVectorView_SpeechRecognitionResult_GetIids __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_GetIids
#define IVectorView_SpeechRecognitionResult_GetRuntimeClassName __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_GetRuntimeClassName
#define IVectorView_SpeechRecognitionResult_GetTrustLevel __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_GetTrustLevel
#define IVectorView_SpeechRecognitionResult_GetAt __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_GetAt
#define IVectorView_SpeechRecognitionResult_get_Size __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_get_Size
#define IVectorView_SpeechRecognitionResult_IndexOf __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_IndexOf
#define IVectorView_SpeechRecognitionResult_GetMany __FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVectorView_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperationCompletedHandler<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionCompilationResult* > interface
 */
#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult_INTERFACE_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult, 0x78c859bd, 0x14d4, 0x5c40, 0xab,0xff, 0x49,0x06,0x16,0xd5,0xe9,0x2d);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("78c859bd-14d4-5c40-abff-490616d5e92d")
            IAsyncOperationCompletedHandler<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionCompilationResult* > : IAsyncOperationCompletedHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionCompilationResult*, ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionCompilationResult* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult, 0x78c859bd, 0x14d4, 0x5c40, 0xab,0xff, 0x49,0x06,0x16,0xd5,0xe9,0x2d)
#endif
#else
typedef struct __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResultVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAsyncOperationCompletedHandler<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionCompilationResult* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult *This,
        __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult *info,
        AsyncStatus status);

    END_INTERFACE
} __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResultVtbl;

interface __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult {
    CONST_VTBL __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResultVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult_Release(This) (This)->lpVtbl->Release(This)
/*** IAsyncOperationCompletedHandler<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionCompilationResult* > methods ***/
#define __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult_QueryInterface(__FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult_AddRef(__FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult_Release(__FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult* This) {
    return This->lpVtbl->Release(This);
}
/*** IAsyncOperationCompletedHandler<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionCompilationResult* > methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult_Invoke(__FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult* This,__FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult *info,AsyncStatus status) {
    return This->lpVtbl->Invoke(This,info,status);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperationCompletedHandler_SpeechRecognitionCompilationResult IID___FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult
#define IAsyncOperationCompletedHandler_SpeechRecognitionCompilationResultVtbl __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResultVtbl
#define IAsyncOperationCompletedHandler_SpeechRecognitionCompilationResult __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult
#define IAsyncOperationCompletedHandler_SpeechRecognitionCompilationResult_QueryInterface __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult_QueryInterface
#define IAsyncOperationCompletedHandler_SpeechRecognitionCompilationResult_AddRef __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult_AddRef
#define IAsyncOperationCompletedHandler_SpeechRecognitionCompilationResult_Release __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult_Release
#define IAsyncOperationCompletedHandler_SpeechRecognitionCompilationResult_Invoke __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperationCompletedHandler<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionResult* > interface
 */
#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_INTERFACE_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult, 0xc2195c7d, 0xdcc2, 0x5c6d, 0x91,0x62, 0xc8,0xdf,0x66,0x52,0x87,0x62);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("c2195c7d-dcc2-5c6d-9162-c8df66528762")
            IAsyncOperationCompletedHandler<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionResult* > : IAsyncOperationCompletedHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionResult*, ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionResult* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult, 0xc2195c7d, 0xdcc2, 0x5c6d, 0x91,0x62, 0xc8,0xdf,0x66,0x52,0x87,0x62)
#endif
#else
typedef struct __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResultVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAsyncOperationCompletedHandler<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionResult* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult *This,
        __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult *info,
        AsyncStatus status);

    END_INTERFACE
} __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResultVtbl;

interface __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult {
    CONST_VTBL __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResultVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_Release(This) (This)->lpVtbl->Release(This)
/*** IAsyncOperationCompletedHandler<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionResult* > methods ***/
#define __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_QueryInterface(__FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_AddRef(__FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_Release(__FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult* This) {
    return This->lpVtbl->Release(This);
}
/*** IAsyncOperationCompletedHandler<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionResult* > methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_Invoke(__FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult* This,__FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult *info,AsyncStatus status) {
    return This->lpVtbl->Invoke(This,info,status);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperationCompletedHandler_SpeechRecognitionResult IID___FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult
#define IAsyncOperationCompletedHandler_SpeechRecognitionResultVtbl __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResultVtbl
#define IAsyncOperationCompletedHandler_SpeechRecognitionResult __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult
#define IAsyncOperationCompletedHandler_SpeechRecognitionResult_QueryInterface __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_QueryInterface
#define IAsyncOperationCompletedHandler_SpeechRecognitionResult_AddRef __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_AddRef
#define IAsyncOperationCompletedHandler_SpeechRecognitionResult_Release __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_Release
#define IAsyncOperationCompletedHandler_SpeechRecognitionResult_Invoke __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperation<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionCompilationResult* > interface
 */
#ifndef ____FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult_INTERFACE_DEFINED__
#define ____FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult, 0xa392249a, 0xe28a, 0x564a, 0x9e,0x73, 0x1d,0xda,0x63,0xca,0x64,0x3c);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("a392249a-e28a-564a-9e73-1dda63ca643c")
            IAsyncOperation<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionCompilationResult* > : IAsyncOperation_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionCompilationResult*, ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionCompilationResult* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult, 0xa392249a, 0xe28a, 0x564a, 0x9e,0x73, 0x1d,0xda,0x63,0xca,0x64,0x3c)
#endif
#else
typedef struct __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResultVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IAsyncOperation<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionCompilationResult* > methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Completed)(
        __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult *This,
        __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult *handler);

    HRESULT (STDMETHODCALLTYPE *get_Completed)(
        __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult *This,
        __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult **handler);

    HRESULT (STDMETHODCALLTYPE *GetResults)(
        __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult *This,
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionCompilationResult **results);

    END_INTERFACE
} __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResultVtbl;

interface __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult {
    CONST_VTBL __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResultVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAsyncOperation<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionCompilationResult* > methods ***/
#define __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
#define __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
#define __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult_GetResults(This,results) (This)->lpVtbl->GetResults(This,results)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult_QueryInterface(__FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult_AddRef(__FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult_Release(__FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult_GetIids(__FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult_GetRuntimeClassName(__FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult_GetTrustLevel(__FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAsyncOperation<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionCompilationResult* > methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult_put_Completed(__FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult* This,__FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult *handler) {
    return This->lpVtbl->put_Completed(This,handler);
}
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult_get_Completed(__FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult* This,__FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult **handler) {
    return This->lpVtbl->get_Completed(This,handler);
}
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult_GetResults(__FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult* This,__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionCompilationResult **results) {
    return This->lpVtbl->GetResults(This,results);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperation_SpeechRecognitionCompilationResult IID___FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult
#define IAsyncOperation_SpeechRecognitionCompilationResultVtbl __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResultVtbl
#define IAsyncOperation_SpeechRecognitionCompilationResult __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult
#define IAsyncOperation_SpeechRecognitionCompilationResult_QueryInterface __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult_QueryInterface
#define IAsyncOperation_SpeechRecognitionCompilationResult_AddRef __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult_AddRef
#define IAsyncOperation_SpeechRecognitionCompilationResult_Release __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult_Release
#define IAsyncOperation_SpeechRecognitionCompilationResult_GetIids __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult_GetIids
#define IAsyncOperation_SpeechRecognitionCompilationResult_GetRuntimeClassName __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult_GetRuntimeClassName
#define IAsyncOperation_SpeechRecognitionCompilationResult_GetTrustLevel __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult_GetTrustLevel
#define IAsyncOperation_SpeechRecognitionCompilationResult_put_Completed __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult_put_Completed
#define IAsyncOperation_SpeechRecognitionCompilationResult_get_Completed __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult_get_Completed
#define IAsyncOperation_SpeechRecognitionCompilationResult_GetResults __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult_GetResults
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionCompilationResult_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperation<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionResult* > interface
 */
#ifndef ____FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_INTERFACE_DEFINED__
#define ____FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult, 0xba3eebe8, 0x8d7c, 0x51f2, 0x9e,0xd4, 0xeb,0xaf,0xe3,0x67,0x4d,0xb4);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("ba3eebe8-8d7c-51f2-9ed4-ebafe3674db4")
            IAsyncOperation<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionResult* > : IAsyncOperation_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionResult*, ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionResult* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult, 0xba3eebe8, 0x8d7c, 0x51f2, 0x9e,0xd4, 0xeb,0xaf,0xe3,0x67,0x4d,0xb4)
#endif
#else
typedef struct __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResultVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IAsyncOperation<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionResult* > methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Completed)(
        __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult *This,
        __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult *handler);

    HRESULT (STDMETHODCALLTYPE *get_Completed)(
        __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult *This,
        __FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult **handler);

    HRESULT (STDMETHODCALLTYPE *GetResults)(
        __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult *This,
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult **results);

    END_INTERFACE
} __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResultVtbl;

interface __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult {
    CONST_VTBL __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResultVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAsyncOperation<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionResult* > methods ***/
#define __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
#define __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
#define __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_GetResults(This,results) (This)->lpVtbl->GetResults(This,results)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_QueryInterface(__FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_AddRef(__FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_Release(__FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_GetIids(__FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_GetRuntimeClassName(__FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_GetTrustLevel(__FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAsyncOperation<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionResult* > methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_put_Completed(__FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult* This,__FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult *handler) {
    return This->lpVtbl->put_Completed(This,handler);
}
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_get_Completed(__FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult* This,__FIAsyncOperationCompletedHandler_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult **handler) {
    return This->lpVtbl->get_Completed(This,handler);
}
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_GetResults(__FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult* This,__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionResult **results) {
    return This->lpVtbl->GetResults(This,results);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperation_SpeechRecognitionResult IID___FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult
#define IAsyncOperation_SpeechRecognitionResultVtbl __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResultVtbl
#define IAsyncOperation_SpeechRecognitionResult __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult
#define IAsyncOperation_SpeechRecognitionResult_QueryInterface __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_QueryInterface
#define IAsyncOperation_SpeechRecognitionResult_AddRef __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_AddRef
#define IAsyncOperation_SpeechRecognitionResult_Release __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_Release
#define IAsyncOperation_SpeechRecognitionResult_GetIids __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_GetIids
#define IAsyncOperation_SpeechRecognitionResult_GetRuntimeClassName __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_GetRuntimeClassName
#define IAsyncOperation_SpeechRecognitionResult_GetTrustLevel __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_GetTrustLevel
#define IAsyncOperation_SpeechRecognitionResult_put_Completed __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_put_Completed
#define IAsyncOperation_SpeechRecognitionResult_get_Completed __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_get_Completed
#define IAsyncOperation_SpeechRecognitionResult_GetResults __FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_GetResults
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperation_1_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionResult_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::Media::SpeechRecognition::SpeechContinuousRecognitionSession*,ABI::Windows::Media::SpeechRecognition::SpeechContinuousRecognitionCompletedEventArgs* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionCompletedEventArgs_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionCompletedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionCompletedEventArgs, 0x8103c018, 0x7952, 0x59f9, 0x9f,0x41, 0x23,0xb1,0x7d,0x6e,0x45,0x2d);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("8103c018-7952-59f9-9f41-23b17d6e452d")
            ITypedEventHandler<ABI::Windows::Media::SpeechRecognition::SpeechContinuousRecognitionSession*,ABI::Windows::Media::SpeechRecognition::SpeechContinuousRecognitionCompletedEventArgs* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Media::SpeechRecognition::SpeechContinuousRecognitionSession*, ABI::Windows::Media::SpeechRecognition::ISpeechContinuousRecognitionSession* >, ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Media::SpeechRecognition::SpeechContinuousRecognitionCompletedEventArgs*, ABI::Windows::Media::SpeechRecognition::ISpeechContinuousRecognitionCompletedEventArgs* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionCompletedEventArgs, 0x8103c018, 0x7952, 0x59f9, 0x9f,0x41, 0x23,0xb1,0x7d,0x6e,0x45,0x2d)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionCompletedEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITypedEventHandler<ABI::Windows::Media::SpeechRecognition::SpeechContinuousRecognitionSession*,ABI::Windows::Media::SpeechRecognition::SpeechContinuousRecognitionCompletedEventArgs* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionCompletedEventArgs *This,
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession *sender,
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionCompletedEventArgs *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionCompletedEventArgsVtbl;

interface __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionCompletedEventArgs {
    CONST_VTBL __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionCompletedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionCompletedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionCompletedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionCompletedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::Media::SpeechRecognition::SpeechContinuousRecognitionSession*,ABI::Windows::Media::SpeechRecognition::SpeechContinuousRecognitionCompletedEventArgs* > methods ***/
#define __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionCompletedEventArgs_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionCompletedEventArgs_QueryInterface(__FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionCompletedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionCompletedEventArgs_AddRef(__FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionCompletedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionCompletedEventArgs_Release(__FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionCompletedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::Media::SpeechRecognition::SpeechContinuousRecognitionSession*,ABI::Windows::Media::SpeechRecognition::SpeechContinuousRecognitionCompletedEventArgs* > methods ***/
static __WIDL_INLINE HRESULT __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionCompletedEventArgs_Invoke(__FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionCompletedEventArgs* This,__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession *sender,__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionCompletedEventArgs *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_SpeechContinuousRecognitionSession_SpeechContinuousRecognitionCompletedEventArgs IID___FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionCompletedEventArgs
#define ITypedEventHandler_SpeechContinuousRecognitionSession_SpeechContinuousRecognitionCompletedEventArgsVtbl __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionCompletedEventArgsVtbl
#define ITypedEventHandler_SpeechContinuousRecognitionSession_SpeechContinuousRecognitionCompletedEventArgs __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionCompletedEventArgs
#define ITypedEventHandler_SpeechContinuousRecognitionSession_SpeechContinuousRecognitionCompletedEventArgs_QueryInterface __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionCompletedEventArgs_QueryInterface
#define ITypedEventHandler_SpeechContinuousRecognitionSession_SpeechContinuousRecognitionCompletedEventArgs_AddRef __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionCompletedEventArgs_AddRef
#define ITypedEventHandler_SpeechContinuousRecognitionSession_SpeechContinuousRecognitionCompletedEventArgs_Release __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionCompletedEventArgs_Release
#define ITypedEventHandler_SpeechContinuousRecognitionSession_SpeechContinuousRecognitionCompletedEventArgs_Invoke __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionCompletedEventArgs_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionCompletedEventArgs_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::Media::SpeechRecognition::SpeechContinuousRecognitionSession*,ABI::Windows::Media::SpeechRecognition::SpeechContinuousRecognitionResultGeneratedEventArgs* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionResultGeneratedEventArgs_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionResultGeneratedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionResultGeneratedEventArgs, 0x26192073, 0xa2c9, 0x527d, 0x9b,0xd3, 0x91,0x1c,0x05,0xe0,0x01,0x1e);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("26192073-a2c9-527d-9bd3-911c05e0011e")
            ITypedEventHandler<ABI::Windows::Media::SpeechRecognition::SpeechContinuousRecognitionSession*,ABI::Windows::Media::SpeechRecognition::SpeechContinuousRecognitionResultGeneratedEventArgs* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Media::SpeechRecognition::SpeechContinuousRecognitionSession*, ABI::Windows::Media::SpeechRecognition::ISpeechContinuousRecognitionSession* >, ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Media::SpeechRecognition::SpeechContinuousRecognitionResultGeneratedEventArgs*, ABI::Windows::Media::SpeechRecognition::ISpeechContinuousRecognitionResultGeneratedEventArgs* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionResultGeneratedEventArgs, 0x26192073, 0xa2c9, 0x527d, 0x9b,0xd3, 0x91,0x1c,0x05,0xe0,0x01,0x1e)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionResultGeneratedEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITypedEventHandler<ABI::Windows::Media::SpeechRecognition::SpeechContinuousRecognitionSession*,ABI::Windows::Media::SpeechRecognition::SpeechContinuousRecognitionResultGeneratedEventArgs* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionResultGeneratedEventArgs *This,
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession *sender,
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionResultGeneratedEventArgs *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionResultGeneratedEventArgsVtbl;

interface __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionResultGeneratedEventArgs {
    CONST_VTBL __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionResultGeneratedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionResultGeneratedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionResultGeneratedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionResultGeneratedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::Media::SpeechRecognition::SpeechContinuousRecognitionSession*,ABI::Windows::Media::SpeechRecognition::SpeechContinuousRecognitionResultGeneratedEventArgs* > methods ***/
#define __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionResultGeneratedEventArgs_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionResultGeneratedEventArgs_QueryInterface(__FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionResultGeneratedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionResultGeneratedEventArgs_AddRef(__FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionResultGeneratedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionResultGeneratedEventArgs_Release(__FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionResultGeneratedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::Media::SpeechRecognition::SpeechContinuousRecognitionSession*,ABI::Windows::Media::SpeechRecognition::SpeechContinuousRecognitionResultGeneratedEventArgs* > methods ***/
static __WIDL_INLINE HRESULT __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionResultGeneratedEventArgs_Invoke(__FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionResultGeneratedEventArgs* This,__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionSession *sender,__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechContinuousRecognitionResultGeneratedEventArgs *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_SpeechContinuousRecognitionSession_SpeechContinuousRecognitionResultGeneratedEventArgs IID___FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionResultGeneratedEventArgs
#define ITypedEventHandler_SpeechContinuousRecognitionSession_SpeechContinuousRecognitionResultGeneratedEventArgsVtbl __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionResultGeneratedEventArgsVtbl
#define ITypedEventHandler_SpeechContinuousRecognitionSession_SpeechContinuousRecognitionResultGeneratedEventArgs __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionResultGeneratedEventArgs
#define ITypedEventHandler_SpeechContinuousRecognitionSession_SpeechContinuousRecognitionResultGeneratedEventArgs_QueryInterface __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionResultGeneratedEventArgs_QueryInterface
#define ITypedEventHandler_SpeechContinuousRecognitionSession_SpeechContinuousRecognitionResultGeneratedEventArgs_AddRef __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionResultGeneratedEventArgs_AddRef
#define ITypedEventHandler_SpeechContinuousRecognitionSession_SpeechContinuousRecognitionResultGeneratedEventArgs_Release __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionResultGeneratedEventArgs_Release
#define ITypedEventHandler_SpeechContinuousRecognitionSession_SpeechContinuousRecognitionResultGeneratedEventArgs_Invoke __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionResultGeneratedEventArgs_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionSession_Windows__CMedia__CSpeechRecognition__CSpeechContinuousRecognitionResultGeneratedEventArgs_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::Media::SpeechRecognition::SpeechRecognizer*,ABI::Windows::Media::SpeechRecognition::SpeechRecognitionHypothesisGeneratedEventArgs* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionHypothesisGeneratedEventArgs_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionHypothesisGeneratedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionHypothesisGeneratedEventArgs, 0x4cb45aba, 0x7573, 0x545a, 0xb2,0x9a, 0xe9,0xbe,0x35,0xbd,0x46,0x82);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("4cb45aba-7573-545a-b29a-e9be35bd4682")
            ITypedEventHandler<ABI::Windows::Media::SpeechRecognition::SpeechRecognizer*,ABI::Windows::Media::SpeechRecognition::SpeechRecognitionHypothesisGeneratedEventArgs* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Media::SpeechRecognition::SpeechRecognizer*, ABI::Windows::Media::SpeechRecognition::ISpeechRecognizer* >, ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionHypothesisGeneratedEventArgs*, ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionHypothesisGeneratedEventArgs* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionHypothesisGeneratedEventArgs, 0x4cb45aba, 0x7573, 0x545a, 0xb2,0x9a, 0xe9,0xbe,0x35,0xbd,0x46,0x82)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionHypothesisGeneratedEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITypedEventHandler<ABI::Windows::Media::SpeechRecognition::SpeechRecognizer*,ABI::Windows::Media::SpeechRecognition::SpeechRecognitionHypothesisGeneratedEventArgs* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionHypothesisGeneratedEventArgs *This,
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer *sender,
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesisGeneratedEventArgs *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionHypothesisGeneratedEventArgsVtbl;

interface __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionHypothesisGeneratedEventArgs {
    CONST_VTBL __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionHypothesisGeneratedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionHypothesisGeneratedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionHypothesisGeneratedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionHypothesisGeneratedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::Media::SpeechRecognition::SpeechRecognizer*,ABI::Windows::Media::SpeechRecognition::SpeechRecognitionHypothesisGeneratedEventArgs* > methods ***/
#define __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionHypothesisGeneratedEventArgs_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionHypothesisGeneratedEventArgs_QueryInterface(__FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionHypothesisGeneratedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionHypothesisGeneratedEventArgs_AddRef(__FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionHypothesisGeneratedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionHypothesisGeneratedEventArgs_Release(__FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionHypothesisGeneratedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::Media::SpeechRecognition::SpeechRecognizer*,ABI::Windows::Media::SpeechRecognition::SpeechRecognitionHypothesisGeneratedEventArgs* > methods ***/
static __WIDL_INLINE HRESULT __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionHypothesisGeneratedEventArgs_Invoke(__FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionHypothesisGeneratedEventArgs* This,__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer *sender,__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionHypothesisGeneratedEventArgs *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_SpeechRecognizer_SpeechRecognitionHypothesisGeneratedEventArgs IID___FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionHypothesisGeneratedEventArgs
#define ITypedEventHandler_SpeechRecognizer_SpeechRecognitionHypothesisGeneratedEventArgsVtbl __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionHypothesisGeneratedEventArgsVtbl
#define ITypedEventHandler_SpeechRecognizer_SpeechRecognitionHypothesisGeneratedEventArgs __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionHypothesisGeneratedEventArgs
#define ITypedEventHandler_SpeechRecognizer_SpeechRecognitionHypothesisGeneratedEventArgs_QueryInterface __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionHypothesisGeneratedEventArgs_QueryInterface
#define ITypedEventHandler_SpeechRecognizer_SpeechRecognitionHypothesisGeneratedEventArgs_AddRef __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionHypothesisGeneratedEventArgs_AddRef
#define ITypedEventHandler_SpeechRecognizer_SpeechRecognitionHypothesisGeneratedEventArgs_Release __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionHypothesisGeneratedEventArgs_Release
#define ITypedEventHandler_SpeechRecognizer_SpeechRecognitionHypothesisGeneratedEventArgs_Invoke __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionHypothesisGeneratedEventArgs_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionHypothesisGeneratedEventArgs_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::Media::SpeechRecognition::SpeechRecognizer*,ABI::Windows::Media::SpeechRecognition::SpeechRecognitionQualityDegradingEventArgs* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionQualityDegradingEventArgs_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionQualityDegradingEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionQualityDegradingEventArgs, 0x15ca7918, 0x61d2, 0x57b2, 0xb9,0x33, 0x44,0x06,0x3e,0x8b,0xb6,0x62);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("15ca7918-61d2-57b2-b933-44063e8bb662")
            ITypedEventHandler<ABI::Windows::Media::SpeechRecognition::SpeechRecognizer*,ABI::Windows::Media::SpeechRecognition::SpeechRecognitionQualityDegradingEventArgs* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Media::SpeechRecognition::SpeechRecognizer*, ABI::Windows::Media::SpeechRecognition::ISpeechRecognizer* >, ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Media::SpeechRecognition::SpeechRecognitionQualityDegradingEventArgs*, ABI::Windows::Media::SpeechRecognition::ISpeechRecognitionQualityDegradingEventArgs* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionQualityDegradingEventArgs, 0x15ca7918, 0x61d2, 0x57b2, 0xb9,0x33, 0x44,0x06,0x3e,0x8b,0xb6,0x62)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionQualityDegradingEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITypedEventHandler<ABI::Windows::Media::SpeechRecognition::SpeechRecognizer*,ABI::Windows::Media::SpeechRecognition::SpeechRecognitionQualityDegradingEventArgs* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionQualityDegradingEventArgs *This,
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer *sender,
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionQualityDegradingEventArgs *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionQualityDegradingEventArgsVtbl;

interface __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionQualityDegradingEventArgs {
    CONST_VTBL __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionQualityDegradingEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionQualityDegradingEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionQualityDegradingEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionQualityDegradingEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::Media::SpeechRecognition::SpeechRecognizer*,ABI::Windows::Media::SpeechRecognition::SpeechRecognitionQualityDegradingEventArgs* > methods ***/
#define __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionQualityDegradingEventArgs_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionQualityDegradingEventArgs_QueryInterface(__FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionQualityDegradingEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionQualityDegradingEventArgs_AddRef(__FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionQualityDegradingEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionQualityDegradingEventArgs_Release(__FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionQualityDegradingEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::Media::SpeechRecognition::SpeechRecognizer*,ABI::Windows::Media::SpeechRecognition::SpeechRecognitionQualityDegradingEventArgs* > methods ***/
static __WIDL_INLINE HRESULT __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionQualityDegradingEventArgs_Invoke(__FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionQualityDegradingEventArgs* This,__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer *sender,__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognitionQualityDegradingEventArgs *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_SpeechRecognizer_SpeechRecognitionQualityDegradingEventArgs IID___FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionQualityDegradingEventArgs
#define ITypedEventHandler_SpeechRecognizer_SpeechRecognitionQualityDegradingEventArgsVtbl __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionQualityDegradingEventArgsVtbl
#define ITypedEventHandler_SpeechRecognizer_SpeechRecognitionQualityDegradingEventArgs __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionQualityDegradingEventArgs
#define ITypedEventHandler_SpeechRecognizer_SpeechRecognitionQualityDegradingEventArgs_QueryInterface __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionQualityDegradingEventArgs_QueryInterface
#define ITypedEventHandler_SpeechRecognizer_SpeechRecognitionQualityDegradingEventArgs_AddRef __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionQualityDegradingEventArgs_AddRef
#define ITypedEventHandler_SpeechRecognizer_SpeechRecognitionQualityDegradingEventArgs_Release __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionQualityDegradingEventArgs_Release
#define ITypedEventHandler_SpeechRecognizer_SpeechRecognitionQualityDegradingEventArgs_Invoke __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionQualityDegradingEventArgs_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognitionQualityDegradingEventArgs_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::Media::SpeechRecognition::SpeechRecognizer*,ABI::Windows::Media::SpeechRecognition::SpeechRecognizerStateChangedEventArgs* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognizerStateChangedEventArgs_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognizerStateChangedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognizerStateChangedEventArgs, 0xd1185e92, 0x5c30, 0x5561, 0xb3,0xe2, 0xe8,0x2d,0xdb,0xd8,0x72,0xc3);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("d1185e92-5c30-5561-b3e2-e82ddbd872c3")
            ITypedEventHandler<ABI::Windows::Media::SpeechRecognition::SpeechRecognizer*,ABI::Windows::Media::SpeechRecognition::SpeechRecognizerStateChangedEventArgs* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Media::SpeechRecognition::SpeechRecognizer*, ABI::Windows::Media::SpeechRecognition::ISpeechRecognizer* >, ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Media::SpeechRecognition::SpeechRecognizerStateChangedEventArgs*, ABI::Windows::Media::SpeechRecognition::ISpeechRecognizerStateChangedEventArgs* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognizerStateChangedEventArgs, 0xd1185e92, 0x5c30, 0x5561, 0xb3,0xe2, 0xe8,0x2d,0xdb,0xd8,0x72,0xc3)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognizerStateChangedEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITypedEventHandler<ABI::Windows::Media::SpeechRecognition::SpeechRecognizer*,ABI::Windows::Media::SpeechRecognition::SpeechRecognizerStateChangedEventArgs* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognizerStateChangedEventArgs *This,
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer *sender,
        __x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStateChangedEventArgs *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognizerStateChangedEventArgsVtbl;

interface __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognizerStateChangedEventArgs {
    CONST_VTBL __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognizerStateChangedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognizerStateChangedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognizerStateChangedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognizerStateChangedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::Media::SpeechRecognition::SpeechRecognizer*,ABI::Windows::Media::SpeechRecognition::SpeechRecognizerStateChangedEventArgs* > methods ***/
#define __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognizerStateChangedEventArgs_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognizerStateChangedEventArgs_QueryInterface(__FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognizerStateChangedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognizerStateChangedEventArgs_AddRef(__FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognizerStateChangedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognizerStateChangedEventArgs_Release(__FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognizerStateChangedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::Media::SpeechRecognition::SpeechRecognizer*,ABI::Windows::Media::SpeechRecognition::SpeechRecognizerStateChangedEventArgs* > methods ***/
static __WIDL_INLINE HRESULT __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognizerStateChangedEventArgs_Invoke(__FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognizerStateChangedEventArgs* This,__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizer *sender,__x_ABI_CWindows_CMedia_CSpeechRecognition_CISpeechRecognizerStateChangedEventArgs *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_SpeechRecognizer_SpeechRecognizerStateChangedEventArgs IID___FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognizerStateChangedEventArgs
#define ITypedEventHandler_SpeechRecognizer_SpeechRecognizerStateChangedEventArgsVtbl __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognizerStateChangedEventArgsVtbl
#define ITypedEventHandler_SpeechRecognizer_SpeechRecognizerStateChangedEventArgs __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognizerStateChangedEventArgs
#define ITypedEventHandler_SpeechRecognizer_SpeechRecognizerStateChangedEventArgs_QueryInterface __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognizerStateChangedEventArgs_QueryInterface
#define ITypedEventHandler_SpeechRecognizer_SpeechRecognizerStateChangedEventArgs_AddRef __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognizerStateChangedEventArgs_AddRef
#define ITypedEventHandler_SpeechRecognizer_SpeechRecognizerStateChangedEventArgs_Release __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognizerStateChangedEventArgs_Release
#define ITypedEventHandler_SpeechRecognizer_SpeechRecognizerStateChangedEventArgs_Invoke __FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognizerStateChangedEventArgs_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CMedia__CSpeechRecognition__CSpeechRecognizer_Windows__CMedia__CSpeechRecognition__CSpeechRecognizerStateChangedEventArgs_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_media_speechrecognition_h__ */
