/*** Autogenerated by WIDL 1.6 from include/tuner.idl - Do not edit ***/

#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif

#include <rpc.h>
#include <rpcndr.h>

#ifndef COM_NO_WINDOWS_H
#include <windows.h>
#include <ole2.h>
#endif

#ifndef __tuner_h__
#define __tuner_h__

/* Forward declarations */

#ifndef __ITuningSpaces_FWD_DEFINED__
#define __ITuningSpaces_FWD_DEFINED__
typedef interface ITuningSpaces ITuningSpaces;
#endif

#ifndef __ITuningSpaceContainer_FWD_DEFINED__
#define __ITuningSpaceContainer_FWD_DEFINED__
typedef interface ITuningSpaceContainer ITuningSpaceContainer;
#endif

#ifndef __ITuningSpace_FWD_DEFINED__
#define __ITuningSpace_FWD_DEFINED__
typedef interface ITuningSpace ITuningSpace;
#endif

#ifndef __IEnumTuningSpaces_FWD_DEFINED__
#define __IEnumTuningSpaces_FWD_DEFINED__
typedef interface IEnumTuningSpaces IEnumTuningSpaces;
#endif

#ifndef __IDVBTuningSpace_FWD_DEFINED__
#define __IDVBTuningSpace_FWD_DEFINED__
typedef interface IDVBTuningSpace IDVBTuningSpace;
#endif

#ifndef __IDVBTuningSpace2_FWD_DEFINED__
#define __IDVBTuningSpace2_FWD_DEFINED__
typedef interface IDVBTuningSpace2 IDVBTuningSpace2;
#endif

#ifndef __IDVBSTuningSpace_FWD_DEFINED__
#define __IDVBSTuningSpace_FWD_DEFINED__
typedef interface IDVBSTuningSpace IDVBSTuningSpace;
#endif

#ifndef __IAuxInTuningSpace_FWD_DEFINED__
#define __IAuxInTuningSpace_FWD_DEFINED__
typedef interface IAuxInTuningSpace IAuxInTuningSpace;
#endif

#ifndef __IAuxInTuningSpace2_FWD_DEFINED__
#define __IAuxInTuningSpace2_FWD_DEFINED__
typedef interface IAuxInTuningSpace2 IAuxInTuningSpace2;
#endif

#ifndef __IAnalogTVTuningSpace_FWD_DEFINED__
#define __IAnalogTVTuningSpace_FWD_DEFINED__
typedef interface IAnalogTVTuningSpace IAnalogTVTuningSpace;
#endif

#ifndef __IATSCTuningSpace_FWD_DEFINED__
#define __IATSCTuningSpace_FWD_DEFINED__
typedef interface IATSCTuningSpace IATSCTuningSpace;
#endif

#ifndef __IDigitalCableTuningSpace_FWD_DEFINED__
#define __IDigitalCableTuningSpace_FWD_DEFINED__
typedef interface IDigitalCableTuningSpace IDigitalCableTuningSpace;
#endif

#ifndef __IAnalogRadioTuningSpace_FWD_DEFINED__
#define __IAnalogRadioTuningSpace_FWD_DEFINED__
typedef interface IAnalogRadioTuningSpace IAnalogRadioTuningSpace;
#endif

#ifndef __IAnalogRadioTuningSpace2_FWD_DEFINED__
#define __IAnalogRadioTuningSpace2_FWD_DEFINED__
typedef interface IAnalogRadioTuningSpace2 IAnalogRadioTuningSpace2;
#endif

#ifndef __ITuneRequest_FWD_DEFINED__
#define __ITuneRequest_FWD_DEFINED__
typedef interface ITuneRequest ITuneRequest;
#endif

#ifndef __IChannelIDTuneRequest_FWD_DEFINED__
#define __IChannelIDTuneRequest_FWD_DEFINED__
typedef interface IChannelIDTuneRequest IChannelIDTuneRequest;
#endif

#ifndef __IChannelTuneRequest_FWD_DEFINED__
#define __IChannelTuneRequest_FWD_DEFINED__
typedef interface IChannelTuneRequest IChannelTuneRequest;
#endif

#ifndef __IATSCChannelTuneRequest_FWD_DEFINED__
#define __IATSCChannelTuneRequest_FWD_DEFINED__
typedef interface IATSCChannelTuneRequest IATSCChannelTuneRequest;
#endif

#ifndef __IDigitalCableTuneRequest_FWD_DEFINED__
#define __IDigitalCableTuneRequest_FWD_DEFINED__
typedef interface IDigitalCableTuneRequest IDigitalCableTuneRequest;
#endif

#ifndef __IDVBTuneRequest_FWD_DEFINED__
#define __IDVBTuneRequest_FWD_DEFINED__
typedef interface IDVBTuneRequest IDVBTuneRequest;
#endif

#ifndef __IMPEG2TuneRequest_FWD_DEFINED__
#define __IMPEG2TuneRequest_FWD_DEFINED__
typedef interface IMPEG2TuneRequest IMPEG2TuneRequest;
#endif

#ifndef __IMPEG2TuneRequestFactory_FWD_DEFINED__
#define __IMPEG2TuneRequestFactory_FWD_DEFINED__
typedef interface IMPEG2TuneRequestFactory IMPEG2TuneRequestFactory;
#endif

#ifndef __IMPEG2TuneRequestSupport_FWD_DEFINED__
#define __IMPEG2TuneRequestSupport_FWD_DEFINED__
typedef interface IMPEG2TuneRequestSupport IMPEG2TuneRequestSupport;
#endif

#ifndef __ITunerCap_FWD_DEFINED__
#define __ITunerCap_FWD_DEFINED__
typedef interface ITunerCap ITunerCap;
#endif

#ifndef __ITunerCapEx_FWD_DEFINED__
#define __ITunerCapEx_FWD_DEFINED__
typedef interface ITunerCapEx ITunerCapEx;
#endif

#ifndef __ITuner_FWD_DEFINED__
#define __ITuner_FWD_DEFINED__
typedef interface ITuner ITuner;
#endif

#ifndef __IScanningTuner_FWD_DEFINED__
#define __IScanningTuner_FWD_DEFINED__
typedef interface IScanningTuner IScanningTuner;
#endif

#ifndef __IScanningTunerEx_FWD_DEFINED__
#define __IScanningTunerEx_FWD_DEFINED__
typedef interface IScanningTunerEx IScanningTunerEx;
#endif

#ifndef __IComponentType_FWD_DEFINED__
#define __IComponentType_FWD_DEFINED__
typedef interface IComponentType IComponentType;
#endif

#ifndef __ILanguageComponentType_FWD_DEFINED__
#define __ILanguageComponentType_FWD_DEFINED__
typedef interface ILanguageComponentType ILanguageComponentType;
#endif

#ifndef __IMPEG2ComponentType_FWD_DEFINED__
#define __IMPEG2ComponentType_FWD_DEFINED__
typedef interface IMPEG2ComponentType IMPEG2ComponentType;
#endif

#ifndef __IATSCComponentType_FWD_DEFINED__
#define __IATSCComponentType_FWD_DEFINED__
typedef interface IATSCComponentType IATSCComponentType;
#endif

#ifndef __IEnumComponentTypes_FWD_DEFINED__
#define __IEnumComponentTypes_FWD_DEFINED__
typedef interface IEnumComponentTypes IEnumComponentTypes;
#endif

#ifndef __IComponentTypes_FWD_DEFINED__
#define __IComponentTypes_FWD_DEFINED__
typedef interface IComponentTypes IComponentTypes;
#endif

#ifndef __IComponent_FWD_DEFINED__
#define __IComponent_FWD_DEFINED__
typedef interface IComponent IComponent;
#endif

#ifndef __IAnalogAudioComponentType_FWD_DEFINED__
#define __IAnalogAudioComponentType_FWD_DEFINED__
typedef interface IAnalogAudioComponentType IAnalogAudioComponentType;
#endif

#ifndef __IMPEG2Component_FWD_DEFINED__
#define __IMPEG2Component_FWD_DEFINED__
typedef interface IMPEG2Component IMPEG2Component;
#endif

#ifndef __IEnumComponents_FWD_DEFINED__
#define __IEnumComponents_FWD_DEFINED__
typedef interface IEnumComponents IEnumComponents;
#endif

#ifndef __IComponents_FWD_DEFINED__
#define __IComponents_FWD_DEFINED__
typedef interface IComponents IComponents;
#endif

#ifndef __IComponentsOld_FWD_DEFINED__
#define __IComponentsOld_FWD_DEFINED__
typedef interface IComponentsOld IComponentsOld;
#endif

#ifndef __ILocator_FWD_DEFINED__
#define __ILocator_FWD_DEFINED__
typedef interface ILocator ILocator;
#endif

#ifndef __IAnalogLocator_FWD_DEFINED__
#define __IAnalogLocator_FWD_DEFINED__
typedef interface IAnalogLocator IAnalogLocator;
#endif

#ifndef __IDigitalLocator_FWD_DEFINED__
#define __IDigitalLocator_FWD_DEFINED__
typedef interface IDigitalLocator IDigitalLocator;
#endif

#ifndef __IATSCLocator_FWD_DEFINED__
#define __IATSCLocator_FWD_DEFINED__
typedef interface IATSCLocator IATSCLocator;
#endif

#ifndef __IATSCLocator2_FWD_DEFINED__
#define __IATSCLocator2_FWD_DEFINED__
typedef interface IATSCLocator2 IATSCLocator2;
#endif

#ifndef __IDigitalCableLocator_FWD_DEFINED__
#define __IDigitalCableLocator_FWD_DEFINED__
typedef interface IDigitalCableLocator IDigitalCableLocator;
#endif

#ifndef __IDVBTLocator_FWD_DEFINED__
#define __IDVBTLocator_FWD_DEFINED__
typedef interface IDVBTLocator IDVBTLocator;
#endif

#ifndef __IDVBTLocator2_FWD_DEFINED__
#define __IDVBTLocator2_FWD_DEFINED__
typedef interface IDVBTLocator2 IDVBTLocator2;
#endif

#ifndef __IDVBSLocator_FWD_DEFINED__
#define __IDVBSLocator_FWD_DEFINED__
typedef interface IDVBSLocator IDVBSLocator;
#endif

#ifndef __IDVBSLocator2_FWD_DEFINED__
#define __IDVBSLocator2_FWD_DEFINED__
typedef interface IDVBSLocator2 IDVBSLocator2;
#endif

#ifndef __IDVBCLocator_FWD_DEFINED__
#define __IDVBCLocator_FWD_DEFINED__
typedef interface IDVBCLocator IDVBCLocator;
#endif

#ifndef __IISDBSLocator_FWD_DEFINED__
#define __IISDBSLocator_FWD_DEFINED__
typedef interface IISDBSLocator IISDBSLocator;
#endif

#ifndef __IESEvent_FWD_DEFINED__
#define __IESEvent_FWD_DEFINED__
typedef interface IESEvent IESEvent;
#endif

#ifndef __IESOpenMmiEvent_FWD_DEFINED__
#define __IESOpenMmiEvent_FWD_DEFINED__
typedef interface IESOpenMmiEvent IESOpenMmiEvent;
#endif

#ifndef __IESCloseMmiEvent_FWD_DEFINED__
#define __IESCloseMmiEvent_FWD_DEFINED__
typedef interface IESCloseMmiEvent IESCloseMmiEvent;
#endif

#ifndef __IESValueUpdatedEvent_FWD_DEFINED__
#define __IESValueUpdatedEvent_FWD_DEFINED__
typedef interface IESValueUpdatedEvent IESValueUpdatedEvent;
#endif

#ifndef __IESRequestTunerEvent_FWD_DEFINED__
#define __IESRequestTunerEvent_FWD_DEFINED__
typedef interface IESRequestTunerEvent IESRequestTunerEvent;
#endif

#ifndef __IESIsdbCasResponseEvent_FWD_DEFINED__
#define __IESIsdbCasResponseEvent_FWD_DEFINED__
typedef interface IESIsdbCasResponseEvent IESIsdbCasResponseEvent;
#endif

#ifndef __IGpnvsCommonBase_FWD_DEFINED__
#define __IGpnvsCommonBase_FWD_DEFINED__
typedef interface IGpnvsCommonBase IGpnvsCommonBase;
#endif

#ifndef __IESEventFactory_FWD_DEFINED__
#define __IESEventFactory_FWD_DEFINED__
typedef interface IESEventFactory IESEventFactory;
#endif

#ifndef __IESLicenseRenewalResultEvent_FWD_DEFINED__
#define __IESLicenseRenewalResultEvent_FWD_DEFINED__
typedef interface IESLicenseRenewalResultEvent IESLicenseRenewalResultEvent;
#endif

#ifndef __IESFileExpiryDateEvent_FWD_DEFINED__
#define __IESFileExpiryDateEvent_FWD_DEFINED__
typedef interface IESFileExpiryDateEvent IESFileExpiryDateEvent;
#endif

#ifndef __IESEvents_FWD_DEFINED__
#define __IESEvents_FWD_DEFINED__
typedef interface IESEvents IESEvents;
#endif

#ifndef __IESEventService_FWD_DEFINED__
#define __IESEventService_FWD_DEFINED__
typedef interface IESEventService IESEventService;
#endif

#ifndef __IESEventServiceConfiguration_FWD_DEFINED__
#define __IESEventServiceConfiguration_FWD_DEFINED__
typedef interface IESEventServiceConfiguration IESEventServiceConfiguration;
#endif

#ifndef __IBroadcastEvent_FWD_DEFINED__
#define __IBroadcastEvent_FWD_DEFINED__
typedef interface IBroadcastEvent IBroadcastEvent;
#endif

#ifndef __IBroadcastEventEx_FWD_DEFINED__
#define __IBroadcastEventEx_FWD_DEFINED__
typedef interface IBroadcastEventEx IBroadcastEventEx;
#endif

#ifndef __IRegisterTuner_FWD_DEFINED__
#define __IRegisterTuner_FWD_DEFINED__
typedef interface IRegisterTuner IRegisterTuner;
#endif

#ifndef __IBDAComparable_FWD_DEFINED__
#define __IBDAComparable_FWD_DEFINED__
typedef interface IBDAComparable IBDAComparable;
#endif

#ifndef __IPersistTuneXml_FWD_DEFINED__
#define __IPersistTuneXml_FWD_DEFINED__
typedef interface IPersistTuneXml IPersistTuneXml;
#endif

#ifndef __IPersistTuneXmlUtility_FWD_DEFINED__
#define __IPersistTuneXmlUtility_FWD_DEFINED__
typedef interface IPersistTuneXmlUtility IPersistTuneXmlUtility;
#endif

#ifndef __IPersistTuneXmlUtility2_FWD_DEFINED__
#define __IPersistTuneXmlUtility2_FWD_DEFINED__
typedef interface IPersistTuneXmlUtility2 IPersistTuneXmlUtility2;
#endif

#ifndef __IBDACreateTuneRequestEx_FWD_DEFINED__
#define __IBDACreateTuneRequestEx_FWD_DEFINED__
typedef interface IBDACreateTuneRequestEx IBDACreateTuneRequestEx;
#endif

#ifndef __SystemTuningSpaces_FWD_DEFINED__
#define __SystemTuningSpaces_FWD_DEFINED__
#ifdef __cplusplus
typedef class SystemTuningSpaces SystemTuningSpaces;
#else
typedef struct SystemTuningSpaces SystemTuningSpaces;
#endif /* defined __cplusplus */
#endif /* defined __SystemTuningSpaces_FWD_DEFINED__ */

#ifndef __TuningSpace_FWD_DEFINED__
#define __TuningSpace_FWD_DEFINED__
#ifdef __cplusplus
typedef class TuningSpace TuningSpace;
#else
typedef struct TuningSpace TuningSpace;
#endif /* defined __cplusplus */
#endif /* defined __TuningSpace_FWD_DEFINED__ */

#ifndef __ChannelIDTuningSpace_FWD_DEFINED__
#define __ChannelIDTuningSpace_FWD_DEFINED__
#ifdef __cplusplus
typedef class ChannelIDTuningSpace ChannelIDTuningSpace;
#else
typedef struct ChannelIDTuningSpace ChannelIDTuningSpace;
#endif /* defined __cplusplus */
#endif /* defined __ChannelIDTuningSpace_FWD_DEFINED__ */

#ifndef __ATSCTuningSpace_FWD_DEFINED__
#define __ATSCTuningSpace_FWD_DEFINED__
#ifdef __cplusplus
typedef class ATSCTuningSpace ATSCTuningSpace;
#else
typedef struct ATSCTuningSpace ATSCTuningSpace;
#endif /* defined __cplusplus */
#endif /* defined __ATSCTuningSpace_FWD_DEFINED__ */

#ifndef __DigitalCableTuningSpace_FWD_DEFINED__
#define __DigitalCableTuningSpace_FWD_DEFINED__
#ifdef __cplusplus
typedef class DigitalCableTuningSpace DigitalCableTuningSpace;
#else
typedef struct DigitalCableTuningSpace DigitalCableTuningSpace;
#endif /* defined __cplusplus */
#endif /* defined __DigitalCableTuningSpace_FWD_DEFINED__ */

#ifndef __AnalogRadioTuningSpace_FWD_DEFINED__
#define __AnalogRadioTuningSpace_FWD_DEFINED__
#ifdef __cplusplus
typedef class AnalogRadioTuningSpace AnalogRadioTuningSpace;
#else
typedef struct AnalogRadioTuningSpace AnalogRadioTuningSpace;
#endif /* defined __cplusplus */
#endif /* defined __AnalogRadioTuningSpace_FWD_DEFINED__ */

#ifndef __AuxInTuningSpace_FWD_DEFINED__
#define __AuxInTuningSpace_FWD_DEFINED__
#ifdef __cplusplus
typedef class AuxInTuningSpace AuxInTuningSpace;
#else
typedef struct AuxInTuningSpace AuxInTuningSpace;
#endif /* defined __cplusplus */
#endif /* defined __AuxInTuningSpace_FWD_DEFINED__ */

#ifndef __AnalogTVTuningSpace_FWD_DEFINED__
#define __AnalogTVTuningSpace_FWD_DEFINED__
#ifdef __cplusplus
typedef class AnalogTVTuningSpace AnalogTVTuningSpace;
#else
typedef struct AnalogTVTuningSpace AnalogTVTuningSpace;
#endif /* defined __cplusplus */
#endif /* defined __AnalogTVTuningSpace_FWD_DEFINED__ */

#ifndef __DVBTuningSpace_FWD_DEFINED__
#define __DVBTuningSpace_FWD_DEFINED__
#ifdef __cplusplus
typedef class DVBTuningSpace DVBTuningSpace;
#else
typedef struct DVBTuningSpace DVBTuningSpace;
#endif /* defined __cplusplus */
#endif /* defined __DVBTuningSpace_FWD_DEFINED__ */

#ifndef __DVBSTuningSpace_FWD_DEFINED__
#define __DVBSTuningSpace_FWD_DEFINED__
#ifdef __cplusplus
typedef class DVBSTuningSpace DVBSTuningSpace;
#else
typedef struct DVBSTuningSpace DVBSTuningSpace;
#endif /* defined __cplusplus */
#endif /* defined __DVBSTuningSpace_FWD_DEFINED__ */

#ifndef __ComponentTypes_FWD_DEFINED__
#define __ComponentTypes_FWD_DEFINED__
#ifdef __cplusplus
typedef class ComponentTypes ComponentTypes;
#else
typedef struct ComponentTypes ComponentTypes;
#endif /* defined __cplusplus */
#endif /* defined __ComponentTypes_FWD_DEFINED__ */

#ifndef __ComponentType_FWD_DEFINED__
#define __ComponentType_FWD_DEFINED__
#ifdef __cplusplus
typedef class ComponentType ComponentType;
#else
typedef struct ComponentType ComponentType;
#endif /* defined __cplusplus */
#endif /* defined __ComponentType_FWD_DEFINED__ */

#ifndef __LanguageComponentType_FWD_DEFINED__
#define __LanguageComponentType_FWD_DEFINED__
#ifdef __cplusplus
typedef class LanguageComponentType LanguageComponentType;
#else
typedef struct LanguageComponentType LanguageComponentType;
#endif /* defined __cplusplus */
#endif /* defined __LanguageComponentType_FWD_DEFINED__ */

#ifndef __MPEG2ComponentType_FWD_DEFINED__
#define __MPEG2ComponentType_FWD_DEFINED__
#ifdef __cplusplus
typedef class MPEG2ComponentType MPEG2ComponentType;
#else
typedef struct MPEG2ComponentType MPEG2ComponentType;
#endif /* defined __cplusplus */
#endif /* defined __MPEG2ComponentType_FWD_DEFINED__ */

#ifndef __ATSCComponentType_FWD_DEFINED__
#define __ATSCComponentType_FWD_DEFINED__
#ifdef __cplusplus
typedef class ATSCComponentType ATSCComponentType;
#else
typedef struct ATSCComponentType ATSCComponentType;
#endif /* defined __cplusplus */
#endif /* defined __ATSCComponentType_FWD_DEFINED__ */

#ifndef __Components_FWD_DEFINED__
#define __Components_FWD_DEFINED__
#ifdef __cplusplus
typedef class Components Components;
#else
typedef struct Components Components;
#endif /* defined __cplusplus */
#endif /* defined __Components_FWD_DEFINED__ */

#ifndef __Component_FWD_DEFINED__
#define __Component_FWD_DEFINED__
#ifdef __cplusplus
typedef class Component Component;
#else
typedef struct Component Component;
#endif /* defined __cplusplus */
#endif /* defined __Component_FWD_DEFINED__ */

#ifndef __MPEG2Component_FWD_DEFINED__
#define __MPEG2Component_FWD_DEFINED__
#ifdef __cplusplus
typedef class MPEG2Component MPEG2Component;
#else
typedef struct MPEG2Component MPEG2Component;
#endif /* defined __cplusplus */
#endif /* defined __MPEG2Component_FWD_DEFINED__ */

#ifndef __AnalogAudioComponentType_FWD_DEFINED__
#define __AnalogAudioComponentType_FWD_DEFINED__
#ifdef __cplusplus
typedef class AnalogAudioComponentType AnalogAudioComponentType;
#else
typedef struct AnalogAudioComponentType AnalogAudioComponentType;
#endif /* defined __cplusplus */
#endif /* defined __AnalogAudioComponentType_FWD_DEFINED__ */

#ifndef __TuneRequest_FWD_DEFINED__
#define __TuneRequest_FWD_DEFINED__
#ifdef __cplusplus
typedef class TuneRequest TuneRequest;
#else
typedef struct TuneRequest TuneRequest;
#endif /* defined __cplusplus */
#endif /* defined __TuneRequest_FWD_DEFINED__ */

#ifndef __ChannelIDTuneRequest_FWD_DEFINED__
#define __ChannelIDTuneRequest_FWD_DEFINED__
#ifdef __cplusplus
typedef class ChannelIDTuneRequest ChannelIDTuneRequest;
#else
typedef struct ChannelIDTuneRequest ChannelIDTuneRequest;
#endif /* defined __cplusplus */
#endif /* defined __ChannelIDTuneRequest_FWD_DEFINED__ */

#ifndef __ChannelTuneRequest_FWD_DEFINED__
#define __ChannelTuneRequest_FWD_DEFINED__
#ifdef __cplusplus
typedef class ChannelTuneRequest ChannelTuneRequest;
#else
typedef struct ChannelTuneRequest ChannelTuneRequest;
#endif /* defined __cplusplus */
#endif /* defined __ChannelTuneRequest_FWD_DEFINED__ */

#ifndef __ATSCChannelTuneRequest_FWD_DEFINED__
#define __ATSCChannelTuneRequest_FWD_DEFINED__
#ifdef __cplusplus
typedef class ATSCChannelTuneRequest ATSCChannelTuneRequest;
#else
typedef struct ATSCChannelTuneRequest ATSCChannelTuneRequest;
#endif /* defined __cplusplus */
#endif /* defined __ATSCChannelTuneRequest_FWD_DEFINED__ */

#ifndef __DigitalCableTuneRequest_FWD_DEFINED__
#define __DigitalCableTuneRequest_FWD_DEFINED__
#ifdef __cplusplus
typedef class DigitalCableTuneRequest DigitalCableTuneRequest;
#else
typedef struct DigitalCableTuneRequest DigitalCableTuneRequest;
#endif /* defined __cplusplus */
#endif /* defined __DigitalCableTuneRequest_FWD_DEFINED__ */

#ifndef __MPEG2TuneRequest_FWD_DEFINED__
#define __MPEG2TuneRequest_FWD_DEFINED__
#ifdef __cplusplus
typedef class MPEG2TuneRequest MPEG2TuneRequest;
#else
typedef struct MPEG2TuneRequest MPEG2TuneRequest;
#endif /* defined __cplusplus */
#endif /* defined __MPEG2TuneRequest_FWD_DEFINED__ */

#ifndef __MPEG2TuneRequestFactory_FWD_DEFINED__
#define __MPEG2TuneRequestFactory_FWD_DEFINED__
#ifdef __cplusplus
typedef class MPEG2TuneRequestFactory MPEG2TuneRequestFactory;
#else
typedef struct MPEG2TuneRequestFactory MPEG2TuneRequestFactory;
#endif /* defined __cplusplus */
#endif /* defined __MPEG2TuneRequestFactory_FWD_DEFINED__ */

#ifndef __Locator_FWD_DEFINED__
#define __Locator_FWD_DEFINED__
#ifdef __cplusplus
typedef class Locator Locator;
#else
typedef struct Locator Locator;
#endif /* defined __cplusplus */
#endif /* defined __Locator_FWD_DEFINED__ */

#ifndef __DigitalLocator_FWD_DEFINED__
#define __DigitalLocator_FWD_DEFINED__
#ifdef __cplusplus
typedef class DigitalLocator DigitalLocator;
#else
typedef struct DigitalLocator DigitalLocator;
#endif /* defined __cplusplus */
#endif /* defined __DigitalLocator_FWD_DEFINED__ */

#ifndef __AnalogLocator_FWD_DEFINED__
#define __AnalogLocator_FWD_DEFINED__
#ifdef __cplusplus
typedef class AnalogLocator AnalogLocator;
#else
typedef struct AnalogLocator AnalogLocator;
#endif /* defined __cplusplus */
#endif /* defined __AnalogLocator_FWD_DEFINED__ */

#ifndef __ATSCLocator_FWD_DEFINED__
#define __ATSCLocator_FWD_DEFINED__
#ifdef __cplusplus
typedef class ATSCLocator ATSCLocator;
#else
typedef struct ATSCLocator ATSCLocator;
#endif /* defined __cplusplus */
#endif /* defined __ATSCLocator_FWD_DEFINED__ */

#ifndef __DigitalCableLocator_FWD_DEFINED__
#define __DigitalCableLocator_FWD_DEFINED__
#ifdef __cplusplus
typedef class DigitalCableLocator DigitalCableLocator;
#else
typedef struct DigitalCableLocator DigitalCableLocator;
#endif /* defined __cplusplus */
#endif /* defined __DigitalCableLocator_FWD_DEFINED__ */

#ifndef __DVBTLocator_FWD_DEFINED__
#define __DVBTLocator_FWD_DEFINED__
#ifdef __cplusplus
typedef class DVBTLocator DVBTLocator;
#else
typedef struct DVBTLocator DVBTLocator;
#endif /* defined __cplusplus */
#endif /* defined __DVBTLocator_FWD_DEFINED__ */

#ifndef __DVBTLocator2_FWD_DEFINED__
#define __DVBTLocator2_FWD_DEFINED__
#ifdef __cplusplus
typedef class DVBTLocator2 DVBTLocator2;
#else
typedef struct DVBTLocator2 DVBTLocator2;
#endif /* defined __cplusplus */
#endif /* defined __DVBTLocator2_FWD_DEFINED__ */

#ifndef __DVBSLocator_FWD_DEFINED__
#define __DVBSLocator_FWD_DEFINED__
#ifdef __cplusplus
typedef class DVBSLocator DVBSLocator;
#else
typedef struct DVBSLocator DVBSLocator;
#endif /* defined __cplusplus */
#endif /* defined __DVBSLocator_FWD_DEFINED__ */

#ifndef __DVBCLocator_FWD_DEFINED__
#define __DVBCLocator_FWD_DEFINED__
#ifdef __cplusplus
typedef class DVBCLocator DVBCLocator;
#else
typedef struct DVBCLocator DVBCLocator;
#endif /* defined __cplusplus */
#endif /* defined __DVBCLocator_FWD_DEFINED__ */

#ifndef __ISDBSLocator_FWD_DEFINED__
#define __ISDBSLocator_FWD_DEFINED__
#ifdef __cplusplus
typedef class ISDBSLocator ISDBSLocator;
#else
typedef struct ISDBSLocator ISDBSLocator;
#endif /* defined __cplusplus */
#endif /* defined __ISDBSLocator_FWD_DEFINED__ */

#ifndef __DVBTuneRequest_FWD_DEFINED__
#define __DVBTuneRequest_FWD_DEFINED__
#ifdef __cplusplus
typedef class DVBTuneRequest DVBTuneRequest;
#else
typedef struct DVBTuneRequest DVBTuneRequest;
#endif /* defined __cplusplus */
#endif /* defined __DVBTuneRequest_FWD_DEFINED__ */

#ifndef __CreatePropBagOnRegKey_FWD_DEFINED__
#define __CreatePropBagOnRegKey_FWD_DEFINED__
#ifdef __cplusplus
typedef class CreatePropBagOnRegKey CreatePropBagOnRegKey;
#else
typedef struct CreatePropBagOnRegKey CreatePropBagOnRegKey;
#endif /* defined __cplusplus */
#endif /* defined __CreatePropBagOnRegKey_FWD_DEFINED__ */

#ifndef __BroadcastEventService_FWD_DEFINED__
#define __BroadcastEventService_FWD_DEFINED__
#ifdef __cplusplus
typedef class BroadcastEventService BroadcastEventService;
#else
typedef struct BroadcastEventService BroadcastEventService;
#endif /* defined __cplusplus */
#endif /* defined __BroadcastEventService_FWD_DEFINED__ */

#ifndef __TunerMarshaler_FWD_DEFINED__
#define __TunerMarshaler_FWD_DEFINED__
#ifdef __cplusplus
typedef class TunerMarshaler TunerMarshaler;
#else
typedef struct TunerMarshaler TunerMarshaler;
#endif /* defined __cplusplus */
#endif /* defined __TunerMarshaler_FWD_DEFINED__ */

#ifndef __PersistTuneXmlUtility_FWD_DEFINED__
#define __PersistTuneXmlUtility_FWD_DEFINED__
#ifdef __cplusplus
typedef class PersistTuneXmlUtility PersistTuneXmlUtility;
#else
typedef struct PersistTuneXmlUtility PersistTuneXmlUtility;
#endif /* defined __cplusplus */
#endif /* defined __PersistTuneXmlUtility_FWD_DEFINED__ */

#ifndef __ESEventService_FWD_DEFINED__
#define __ESEventService_FWD_DEFINED__
#ifdef __cplusplus
typedef class ESEventService ESEventService;
#else
typedef struct ESEventService ESEventService;
#endif /* defined __cplusplus */
#endif /* defined __ESEventService_FWD_DEFINED__ */

#ifndef __ESEventFactory_FWD_DEFINED__
#define __ESEventFactory_FWD_DEFINED__
#ifdef __cplusplus
typedef class ESEventFactory ESEventFactory;
#else
typedef struct ESEventFactory ESEventFactory;
#endif /* defined __cplusplus */
#endif /* defined __ESEventFactory_FWD_DEFINED__ */

/* Headers for imported files */

#include <oaidl.h>
#include <comcat.h>
#include <strmif.h>
#include <bdaiface.h>
#include <regbag.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef __IAnalogLocator_FWD_DEFINED__
#define __IAnalogLocator_FWD_DEFINED__
typedef interface IAnalogLocator IAnalogLocator;
#endif

#ifndef __IATSCLocator_FWD_DEFINED__
#define __IATSCLocator_FWD_DEFINED__
typedef interface IATSCLocator IATSCLocator;
#endif

#ifndef __IComponent_FWD_DEFINED__
#define __IComponent_FWD_DEFINED__
typedef interface IComponent IComponent;
#endif

#ifndef __IComponents_FWD_DEFINED__
#define __IComponents_FWD_DEFINED__
typedef interface IComponents IComponents;
#endif

#ifndef __IComponentType_FWD_DEFINED__
#define __IComponentType_FWD_DEFINED__
typedef interface IComponentType IComponentType;
#endif

#ifndef __IComponentTypes_FWD_DEFINED__
#define __IComponentTypes_FWD_DEFINED__
typedef interface IComponentTypes IComponentTypes;
#endif

#ifndef __IDigitalCableLocator_FWD_DEFINED__
#define __IDigitalCableLocator_FWD_DEFINED__
typedef interface IDigitalCableLocator IDigitalCableLocator;
#endif

#ifndef __IDigitalCableTuneRequest_FWD_DEFINED__
#define __IDigitalCableTuneRequest_FWD_DEFINED__
typedef interface IDigitalCableTuneRequest IDigitalCableTuneRequest;
#endif

#ifndef __IDigitalCableTuningSpace_FWD_DEFINED__
#define __IDigitalCableTuningSpace_FWD_DEFINED__
typedef interface IDigitalCableTuningSpace IDigitalCableTuningSpace;
#endif

#ifndef __IDVBCLocator_FWD_DEFINED__
#define __IDVBCLocator_FWD_DEFINED__
typedef interface IDVBCLocator IDVBCLocator;
#endif

#ifndef __IDVBSLocator_FWD_DEFINED__
#define __IDVBSLocator_FWD_DEFINED__
typedef interface IDVBSLocator IDVBSLocator;
#endif

#ifndef __IDVBSLocator2_FWD_DEFINED__
#define __IDVBSLocator2_FWD_DEFINED__
typedef interface IDVBSLocator2 IDVBSLocator2;
#endif

#ifndef __IDVBTLocator_FWD_DEFINED__
#define __IDVBTLocator_FWD_DEFINED__
typedef interface IDVBTLocator IDVBTLocator;
#endif

#ifndef __IDVBTLocator2_FWD_DEFINED__
#define __IDVBTLocator2_FWD_DEFINED__
typedef interface IDVBTLocator2 IDVBTLocator2;
#endif

#ifndef __IEnumComponents_FWD_DEFINED__
#define __IEnumComponents_FWD_DEFINED__
typedef interface IEnumComponents IEnumComponents;
#endif

#ifndef __IEnumComponentTypes_FWD_DEFINED__
#define __IEnumComponentTypes_FWD_DEFINED__
typedef interface IEnumComponentTypes IEnumComponentTypes;
#endif

#ifndef __IEnumTuningSpaces_FWD_DEFINED__
#define __IEnumTuningSpaces_FWD_DEFINED__
typedef interface IEnumTuningSpaces IEnumTuningSpaces;
#endif

#ifndef __IISDBSLocator_FWD_DEFINED__
#define __IISDBSLocator_FWD_DEFINED__
typedef interface IISDBSLocator IISDBSLocator;
#endif

#ifndef __ILanguageComponentType_FWD_DEFINED__
#define __ILanguageComponentType_FWD_DEFINED__
typedef interface ILanguageComponentType ILanguageComponentType;
#endif

#ifndef __ILocator_FWD_DEFINED__
#define __ILocator_FWD_DEFINED__
typedef interface ILocator ILocator;
#endif

#ifndef __IMPEG2Component_FWD_DEFINED__
#define __IMPEG2Component_FWD_DEFINED__
typedef interface IMPEG2Component IMPEG2Component;
#endif

#ifndef __IMPEG2ComponentType_FWD_DEFINED__
#define __IMPEG2ComponentType_FWD_DEFINED__
typedef interface IMPEG2ComponentType IMPEG2ComponentType;
#endif

#ifndef __IScanningTuner_FWD_DEFINED__
#define __IScanningTuner_FWD_DEFINED__
typedef interface IScanningTuner IScanningTuner;
#endif

#ifndef __ITuneRequest_FWD_DEFINED__
#define __ITuneRequest_FWD_DEFINED__
typedef interface ITuneRequest ITuneRequest;
#endif

#ifndef __ITuner_FWD_DEFINED__
#define __ITuner_FWD_DEFINED__
typedef interface ITuner ITuner;
#endif

#ifndef __ITunerCap_FWD_DEFINED__
#define __ITunerCap_FWD_DEFINED__
typedef interface ITunerCap ITunerCap;
#endif

#ifndef __ITuningSpace_FWD_DEFINED__
#define __ITuningSpace_FWD_DEFINED__
typedef interface ITuningSpace ITuningSpace;
#endif

#ifndef __ITuningSpaceContainer_FWD_DEFINED__
#define __ITuningSpaceContainer_FWD_DEFINED__
typedef interface ITuningSpaceContainer ITuningSpaceContainer;
#endif


#include <winapifamily.h>
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
enum {
    DISPID_TUNER_TS_UNIQUENAME = 1,
    DISPID_TUNER_TS_FRIENDLYNAME = 2,
    DISPID_TUNER_TS_CLSID = 3,
    DISPID_TUNER_TS_NETWORKTYPE = 4,
    DISPID_TUNER_TS__NETWORKTYPE = 5,
    DISPID_TUNER_TS_CREATETUNEREQUEST = 6,
    DISPID_TUNER_TS_ENUMCATEGORYGUIDS = 7,
    DISPID_TUNER_TS_ENUMDEVICEMONIKERS = 8,
    DISPID_TUNER_TS_DEFAULTPREFERREDCOMPONENTTYPES = 9,
    DISPID_TUNER_TS_FREQMAP = 10,
    DISPID_TUNER_TS_DEFLOCATOR = 11,
    DISPID_TUNER_TS_CLONE = 12,
    DISPID_TUNER_TR_TUNINGSPACE = 1,
    DISPID_TUNER_TR_COMPONENTS = 2,
    DISPID_TUNER_TR_CLONE = 3,
    DISPID_TUNER_TR_LOCATOR = 4,
    DISPID_TUNER_CT_CATEGORY = 1,
    DISPID_TUNER_CT_MEDIAMAJORTYPE = 2,
    DISPID_TUNER_CT__MEDIAMAJORTYPE = 3,
    DISPID_TUNER_CT_MEDIASUBTYPE = 4,
    DISPID_TUNER_CT__MEDIASUBTYPE = 5,
    DISPID_TUNER_CT_MEDIAFORMATTYPE = 6,
    DISPID_TUNER_CT__MEDIAFORMATTYPE = 7,
    DISPID_TUNER_CT_MEDIATYPE = 8,
    DISPID_TUNER_CT_CLONE = 9,
    DISPID_TUNER_LCT_LANGID = 100,
    DISPID_TUNER_MP2CT_TYPE = 200,
    DISPID_TUNER_ATSCCT_FLAGS = 300,
    DISPID_TUNER_L_CARRFREQ = 1,
    DISPID_TUNER_L_INNERFECMETHOD = 2,
    DISPID_TUNER_L_INNERFECRATE = 3,
    DISPID_TUNER_L_OUTERFECMETHOD = 4,
    DISPID_TUNER_L_OUTERFECRATE = 5,
    DISPID_TUNER_L_MOD = 6,
    DISPID_TUNER_L_SYMRATE = 7,
    DISPID_TUNER_L_CLONE = 8,
    DISPID_TUNER_L_ATSC_PHYS_CHANNEL = 201,
    DISPID_TUNER_L_ATSC_TSID = 202,
    DISPID_TUNER_L_ATSC_MP2_PROGNO = 203,
    DISPID_TUNER_L_DVBT_BANDWIDTH = 301,
    DISPID_TUNER_L_DVBT_LPINNERFECMETHOD = 302,
    DISPID_TUNER_L_DVBT_LPINNERFECRATE = 303,
    DISPID_TUNER_L_DVBT_GUARDINTERVAL = 304,
    DISPID_TUNER_L_DVBT_HALPHA = 305,
    DISPID_TUNER_L_DVBT_TRANSMISSIONMODE = 306,
    DISPID_TUNER_L_DVBT_INUSE = 307,
    DISPID_TUNER_L_DVBT2_PHYSICALLAYERPIPEID = 351,
    DISPID_TUNER_L_DVBS_POLARISATION = 401,
    DISPID_TUNER_L_DVBS_WEST = 402,
    DISPID_TUNER_L_DVBS_ORBITAL = 403,
    DISPID_TUNER_L_DVBS_AZIMUTH = 404,
    DISPID_TUNER_L_DVBS_ELEVATION = 405,
    DISPID_TUNER_L_DVBS2_DISEQ_LNB_SOURCE = 406,
    DISPID_TUNER_TS_DVBS2_LOW_OSC_FREQ_OVERRIDE = 407,
    DISPID_TUNER_TS_DVBS2_HI_OSC_FREQ_OVERRIDE = 408,
    DISPID_TUNER_TS_DVBS2_LNB_SWITCH_FREQ_OVERRIDE = 409,
    DISPID_TUNER_TS_DVBS2_SPECTRAL_INVERSION_OVERRIDE = 410,
    DISPID_TUNER_L_DVBS2_ROLLOFF = 411,
    DISPID_TUNER_L_DVBS2_PILOT = 412,
    DISPID_TUNER_L_ANALOG_STANDARD = 601,
    DISPID_TUNER_L_DTV_O_MAJOR_CHANNEL = 701,
    DISPID_TUNER_C_TYPE = 1,
    DISPID_TUNER_C_STATUS = 2,
    DISPID_TUNER_C_LANGID = 3,
    DISPID_TUNER_C_DESCRIPTION = 4,
    DISPID_TUNER_C_CLONE = 5,
    DISPID_TUNER_C_MP2_PID = 101,
    DISPID_TUNER_C_MP2_PCRPID = 102,
    DISPID_TUNER_C_MP2_PROGNO = 103,
    DISPID_TUNER_C_ANALOG_AUDIO = 201,
    DISPID_TUNER_TS_DVB_SYSTEMTYPE = 101,
    DISPID_TUNER_TS_DVB2_NETWORK_ID = 102,
    DISPID_TUNER_TS_DVBS_LOW_OSC_FREQ = 1001,
    DISPID_TUNER_TS_DVBS_HI_OSC_FREQ = 1002,
    DISPID_TUNER_TS_DVBS_LNB_SWITCH_FREQ = 1003,
    DISPID_TUNER_TS_DVBS_INPUT_RANGE = 1004,
    DISPID_TUNER_TS_DVBS_SPECTRAL_INVERSION = 1005,
    DISPID_TUNER_TS_AR_MINFREQUENCY = 101,
    DISPID_TUNER_TS_AR_MAXFREQUENCY = 102,
    DISPID_TUNER_TS_AR_STEP = 103,
    DISPID_TUNER_TS_AR_COUNTRYCODE = 104,
    DISPID_TUNER_TS_AUX_COUNTRYCODE = 101,
    DISPID_TUNER_TS_ATV_MINCHANNEL = 101,
    DISPID_TUNER_TS_ATV_MAXCHANNEL = 102,
    DISPID_TUNER_TS_ATV_INPUTTYPE = 103,
    DISPID_TUNER_TS_ATV_COUNTRYCODE = 104,
    DISPID_TUNER_TS_ATSC_MINMINORCHANNEL = 201,
    DISPID_TUNER_TS_ATSC_MAXMINORCHANNEL = 202,
    DISPID_TUNER_TS_ATSC_MINPHYSCHANNEL = 203,
    DISPID_TUNER_TS_ATSC_MAXPHYSCHANNEL = 204,
    DISPID_TUNER_TS_DC_MINMAJORCHANNEL = 301,
    DISPID_TUNER_TS_DC_MAXMAJORCHANNEL = 302,
    DISPID_TUNER_TS_DC_MINSOURCEID = 303,
    DISPID_TUNER_TS_DC_MAXSOURCEID = 304,
    DISPID_CHTUNER_ATVAC_CHANNEL = 101,
    DISPID_CHTUNER_ATVDC_SYSTEM = 101,
    DISPID_CHTUNER_ATVDC_CONTENT = 102,
    DISPID_CHTUNER_CIDTR_CHANNELID = 101,
    DISPID_CHTUNER_CTR_CHANNEL = 101,
    DISPID_CHTUNER_ACTR_MINOR_CHANNEL = 201,
    DISPID_CHTUNER_DCTR_MAJOR_CHANNEL = 301,
    DISPID_CHTUNER_DCTR_SRCID = 302,
    DISPID_DVBTUNER_DVBC_ATTRIBUTESVALID = 101,
    DISPID_DVBTUNER_DVBC_PID = 102,
    DISPID_DVBTUNER_DVBC_TAG = 103,
    DISPID_DVBTUNER_DVBC_COMPONENTTYPE = 104,
    DISPID_DVBTUNER_ONID = 101,
    DISPID_DVBTUNER_TSID = 102,
    DISPID_DVBTUNER_SID = 103,
    DISPID_MP2TUNER_TSID = 101,
    DISPID_MP2TUNER_PROGNO = 102,
    DISPID_MP2TUNERFACTORY_CREATETUNEREQUEST = 1
};


#define SID_ESEventService CLSID_ESEventService
#define SID_ESEventFactory CLSID_ESEventFactory
#define SID_SBroadcastEventService CLSID_BroadcastEventService
#define SID_SContentTuneRequest IID_ITuner
#define SID_ScanningTuner IID_IScanningTuner
#define SID_ScanningTunerEx IID_IScanningTunerEx

/*****************************************************************************
 * ITuningSpaces interface
 */
#ifndef __ITuningSpaces_INTERFACE_DEFINED__
#define __ITuningSpaces_INTERFACE_DEFINED__

DEFINE_GUID(IID_ITuningSpaces, 0x901284e4, 0x33fe, 0x4b69, 0x8d,0x63, 0x63,0x4a,0x59,0x6f,0x37,0x56);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("901284e4-33fe-4b69-8d63-634a596f3756")
ITuningSpaces : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Count(
        LONG *Count) = 0;

    virtual HRESULT STDMETHODCALLTYPE get__NewEnum(
        IEnumVARIANT **NewEnum) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Item(
        VARIANT varIndex,
        ITuningSpace **TuningSpace) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_EnumTuningSpaces(
        IEnumTuningSpaces **NewEnum) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ITuningSpaces, 0x901284e4, 0x33fe, 0x4b69, 0x8d,0x63, 0x63,0x4a,0x59,0x6f,0x37,0x56)
#endif
#else
typedef struct ITuningSpacesVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ITuningSpaces* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ITuningSpaces* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ITuningSpaces* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ITuningSpaces* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ITuningSpaces methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Count)(
        ITuningSpaces* This,
        LONG *Count);

    HRESULT (STDMETHODCALLTYPE *get__NewEnum)(
        ITuningSpaces* This,
        IEnumVARIANT **NewEnum);

    HRESULT (STDMETHODCALLTYPE *get_Item)(
        ITuningSpaces* This,
        VARIANT varIndex,
        ITuningSpace **TuningSpace);

    HRESULT (STDMETHODCALLTYPE *get_EnumTuningSpaces)(
        ITuningSpaces* This,
        IEnumTuningSpaces **NewEnum);

    END_INTERFACE
} ITuningSpacesVtbl;
interface ITuningSpaces {
    CONST_VTBL ITuningSpacesVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ITuningSpaces_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITuningSpaces_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITuningSpaces_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ITuningSpaces_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ITuningSpaces_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ITuningSpaces_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ITuningSpaces_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ITuningSpaces methods ***/
#define ITuningSpaces_get_Count(This,Count) (This)->lpVtbl->get_Count(This,Count)
#define ITuningSpaces_get__NewEnum(This,NewEnum) (This)->lpVtbl->get__NewEnum(This,NewEnum)
#define ITuningSpaces_get_Item(This,varIndex,TuningSpace) (This)->lpVtbl->get_Item(This,varIndex,TuningSpace)
#define ITuningSpaces_get_EnumTuningSpaces(This,NewEnum) (This)->lpVtbl->get_EnumTuningSpaces(This,NewEnum)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ITuningSpaces_QueryInterface(ITuningSpaces* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ITuningSpaces_AddRef(ITuningSpaces* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ITuningSpaces_Release(ITuningSpaces* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ITuningSpaces_GetTypeInfoCount(ITuningSpaces* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ITuningSpaces_GetTypeInfo(ITuningSpaces* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ITuningSpaces_GetIDsOfNames(ITuningSpaces* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ITuningSpaces_Invoke(ITuningSpaces* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ITuningSpaces methods ***/
static FORCEINLINE HRESULT ITuningSpaces_get_Count(ITuningSpaces* This,LONG *Count) {
    return This->lpVtbl->get_Count(This,Count);
}
static FORCEINLINE HRESULT ITuningSpaces_get__NewEnum(ITuningSpaces* This,IEnumVARIANT **NewEnum) {
    return This->lpVtbl->get__NewEnum(This,NewEnum);
}
static FORCEINLINE HRESULT ITuningSpaces_get_Item(ITuningSpaces* This,VARIANT varIndex,ITuningSpace **TuningSpace) {
    return This->lpVtbl->get_Item(This,varIndex,TuningSpace);
}
static FORCEINLINE HRESULT ITuningSpaces_get_EnumTuningSpaces(ITuningSpaces* This,IEnumTuningSpaces **NewEnum) {
    return This->lpVtbl->get_EnumTuningSpaces(This,NewEnum);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ITuningSpaces_get_Count_Proxy(
    ITuningSpaces* This,
    LONG *Count);
void __RPC_STUB ITuningSpaces_get_Count_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITuningSpaces_get__NewEnum_Proxy(
    ITuningSpaces* This,
    IEnumVARIANT **NewEnum);
void __RPC_STUB ITuningSpaces_get__NewEnum_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITuningSpaces_get_Item_Proxy(
    ITuningSpaces* This,
    VARIANT varIndex,
    ITuningSpace **TuningSpace);
void __RPC_STUB ITuningSpaces_get_Item_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITuningSpaces_get_EnumTuningSpaces_Proxy(
    ITuningSpaces* This,
    IEnumTuningSpaces **NewEnum);
void __RPC_STUB ITuningSpaces_get_EnumTuningSpaces_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ITuningSpaces_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITuningSpaceContainer interface
 */
#ifndef __ITuningSpaceContainer_INTERFACE_DEFINED__
#define __ITuningSpaceContainer_INTERFACE_DEFINED__

DEFINE_GUID(IID_ITuningSpaceContainer, 0x5b692e84, 0xe2f1, 0x11d2, 0x94,0x93, 0x00,0xc0,0x4f,0x72,0xd9,0x80);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("5b692e84-e2f1-11d2-9493-00c04f72d980")
ITuningSpaceContainer : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Count(
        LONG *Count) = 0;

    virtual HRESULT STDMETHODCALLTYPE get__NewEnum(
        IEnumVARIANT **NewEnum) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Item(
        VARIANT varIndex,
        ITuningSpace **TuningSpace) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Item(
        VARIANT varIndex,
        ITuningSpace *TuningSpace) = 0;

    virtual HRESULT STDMETHODCALLTYPE TuningSpacesForCLSID(
        BSTR SpaceCLSID,
        ITuningSpaces **NewColl) = 0;

    virtual HRESULT STDMETHODCALLTYPE _TuningSpacesForCLSID(
        REFCLSID SpaceCLSID,
        ITuningSpaces **NewColl) = 0;

    virtual HRESULT STDMETHODCALLTYPE TuningSpacesForName(
        BSTR Name,
        ITuningSpaces **NewColl) = 0;

    virtual HRESULT STDMETHODCALLTYPE FindID(
        ITuningSpace *TuningSpace,
        LONG *ID) = 0;

    virtual HRESULT STDMETHODCALLTYPE Add(
        ITuningSpace *TuningSpace,
        VARIANT *NewIndex) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_EnumTuningSpaces(
        IEnumTuningSpaces **ppEnum) = 0;

    virtual HRESULT STDMETHODCALLTYPE Remove(
        VARIANT Index) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_MaxCount(
        LONG *MaxCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_MaxCount(
        LONG MaxCount) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ITuningSpaceContainer, 0x5b692e84, 0xe2f1, 0x11d2, 0x94,0x93, 0x00,0xc0,0x4f,0x72,0xd9,0x80)
#endif
#else
typedef struct ITuningSpaceContainerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ITuningSpaceContainer* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ITuningSpaceContainer* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ITuningSpaceContainer* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ITuningSpaceContainer* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ITuningSpaceContainer methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Count)(
        ITuningSpaceContainer* This,
        LONG *Count);

    HRESULT (STDMETHODCALLTYPE *get__NewEnum)(
        ITuningSpaceContainer* This,
        IEnumVARIANT **NewEnum);

    HRESULT (STDMETHODCALLTYPE *get_Item)(
        ITuningSpaceContainer* This,
        VARIANT varIndex,
        ITuningSpace **TuningSpace);

    HRESULT (STDMETHODCALLTYPE *put_Item)(
        ITuningSpaceContainer* This,
        VARIANT varIndex,
        ITuningSpace *TuningSpace);

    HRESULT (STDMETHODCALLTYPE *TuningSpacesForCLSID)(
        ITuningSpaceContainer* This,
        BSTR SpaceCLSID,
        ITuningSpaces **NewColl);

    HRESULT (STDMETHODCALLTYPE *_TuningSpacesForCLSID)(
        ITuningSpaceContainer* This,
        REFCLSID SpaceCLSID,
        ITuningSpaces **NewColl);

    HRESULT (STDMETHODCALLTYPE *TuningSpacesForName)(
        ITuningSpaceContainer* This,
        BSTR Name,
        ITuningSpaces **NewColl);

    HRESULT (STDMETHODCALLTYPE *FindID)(
        ITuningSpaceContainer* This,
        ITuningSpace *TuningSpace,
        LONG *ID);

    HRESULT (STDMETHODCALLTYPE *Add)(
        ITuningSpaceContainer* This,
        ITuningSpace *TuningSpace,
        VARIANT *NewIndex);

    HRESULT (STDMETHODCALLTYPE *get_EnumTuningSpaces)(
        ITuningSpaceContainer* This,
        IEnumTuningSpaces **ppEnum);

    HRESULT (STDMETHODCALLTYPE *Remove)(
        ITuningSpaceContainer* This,
        VARIANT Index);

    HRESULT (STDMETHODCALLTYPE *get_MaxCount)(
        ITuningSpaceContainer* This,
        LONG *MaxCount);

    HRESULT (STDMETHODCALLTYPE *put_MaxCount)(
        ITuningSpaceContainer* This,
        LONG MaxCount);

    END_INTERFACE
} ITuningSpaceContainerVtbl;
interface ITuningSpaceContainer {
    CONST_VTBL ITuningSpaceContainerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ITuningSpaceContainer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITuningSpaceContainer_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITuningSpaceContainer_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ITuningSpaceContainer_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ITuningSpaceContainer_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ITuningSpaceContainer_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ITuningSpaceContainer_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ITuningSpaceContainer methods ***/
#define ITuningSpaceContainer_get_Count(This,Count) (This)->lpVtbl->get_Count(This,Count)
#define ITuningSpaceContainer_get__NewEnum(This,NewEnum) (This)->lpVtbl->get__NewEnum(This,NewEnum)
#define ITuningSpaceContainer_get_Item(This,varIndex,TuningSpace) (This)->lpVtbl->get_Item(This,varIndex,TuningSpace)
#define ITuningSpaceContainer_put_Item(This,varIndex,TuningSpace) (This)->lpVtbl->put_Item(This,varIndex,TuningSpace)
#define ITuningSpaceContainer_TuningSpacesForCLSID(This,SpaceCLSID,NewColl) (This)->lpVtbl->TuningSpacesForCLSID(This,SpaceCLSID,NewColl)
#define ITuningSpaceContainer__TuningSpacesForCLSID(This,SpaceCLSID,NewColl) (This)->lpVtbl->_TuningSpacesForCLSID(This,SpaceCLSID,NewColl)
#define ITuningSpaceContainer_TuningSpacesForName(This,Name,NewColl) (This)->lpVtbl->TuningSpacesForName(This,Name,NewColl)
#define ITuningSpaceContainer_FindID(This,TuningSpace,ID) (This)->lpVtbl->FindID(This,TuningSpace,ID)
#define ITuningSpaceContainer_Add(This,TuningSpace,NewIndex) (This)->lpVtbl->Add(This,TuningSpace,NewIndex)
#define ITuningSpaceContainer_get_EnumTuningSpaces(This,ppEnum) (This)->lpVtbl->get_EnumTuningSpaces(This,ppEnum)
#define ITuningSpaceContainer_Remove(This,Index) (This)->lpVtbl->Remove(This,Index)
#define ITuningSpaceContainer_get_MaxCount(This,MaxCount) (This)->lpVtbl->get_MaxCount(This,MaxCount)
#define ITuningSpaceContainer_put_MaxCount(This,MaxCount) (This)->lpVtbl->put_MaxCount(This,MaxCount)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ITuningSpaceContainer_QueryInterface(ITuningSpaceContainer* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ITuningSpaceContainer_AddRef(ITuningSpaceContainer* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ITuningSpaceContainer_Release(ITuningSpaceContainer* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ITuningSpaceContainer_GetTypeInfoCount(ITuningSpaceContainer* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ITuningSpaceContainer_GetTypeInfo(ITuningSpaceContainer* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ITuningSpaceContainer_GetIDsOfNames(ITuningSpaceContainer* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ITuningSpaceContainer_Invoke(ITuningSpaceContainer* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ITuningSpaceContainer methods ***/
static FORCEINLINE HRESULT ITuningSpaceContainer_get_Count(ITuningSpaceContainer* This,LONG *Count) {
    return This->lpVtbl->get_Count(This,Count);
}
static FORCEINLINE HRESULT ITuningSpaceContainer_get__NewEnum(ITuningSpaceContainer* This,IEnumVARIANT **NewEnum) {
    return This->lpVtbl->get__NewEnum(This,NewEnum);
}
static FORCEINLINE HRESULT ITuningSpaceContainer_get_Item(ITuningSpaceContainer* This,VARIANT varIndex,ITuningSpace **TuningSpace) {
    return This->lpVtbl->get_Item(This,varIndex,TuningSpace);
}
static FORCEINLINE HRESULT ITuningSpaceContainer_put_Item(ITuningSpaceContainer* This,VARIANT varIndex,ITuningSpace *TuningSpace) {
    return This->lpVtbl->put_Item(This,varIndex,TuningSpace);
}
static FORCEINLINE HRESULT ITuningSpaceContainer_TuningSpacesForCLSID(ITuningSpaceContainer* This,BSTR SpaceCLSID,ITuningSpaces **NewColl) {
    return This->lpVtbl->TuningSpacesForCLSID(This,SpaceCLSID,NewColl);
}
static FORCEINLINE HRESULT ITuningSpaceContainer__TuningSpacesForCLSID(ITuningSpaceContainer* This,REFCLSID SpaceCLSID,ITuningSpaces **NewColl) {
    return This->lpVtbl->_TuningSpacesForCLSID(This,SpaceCLSID,NewColl);
}
static FORCEINLINE HRESULT ITuningSpaceContainer_TuningSpacesForName(ITuningSpaceContainer* This,BSTR Name,ITuningSpaces **NewColl) {
    return This->lpVtbl->TuningSpacesForName(This,Name,NewColl);
}
static FORCEINLINE HRESULT ITuningSpaceContainer_FindID(ITuningSpaceContainer* This,ITuningSpace *TuningSpace,LONG *ID) {
    return This->lpVtbl->FindID(This,TuningSpace,ID);
}
static FORCEINLINE HRESULT ITuningSpaceContainer_Add(ITuningSpaceContainer* This,ITuningSpace *TuningSpace,VARIANT *NewIndex) {
    return This->lpVtbl->Add(This,TuningSpace,NewIndex);
}
static FORCEINLINE HRESULT ITuningSpaceContainer_get_EnumTuningSpaces(ITuningSpaceContainer* This,IEnumTuningSpaces **ppEnum) {
    return This->lpVtbl->get_EnumTuningSpaces(This,ppEnum);
}
static FORCEINLINE HRESULT ITuningSpaceContainer_Remove(ITuningSpaceContainer* This,VARIANT Index) {
    return This->lpVtbl->Remove(This,Index);
}
static FORCEINLINE HRESULT ITuningSpaceContainer_get_MaxCount(ITuningSpaceContainer* This,LONG *MaxCount) {
    return This->lpVtbl->get_MaxCount(This,MaxCount);
}
static FORCEINLINE HRESULT ITuningSpaceContainer_put_MaxCount(ITuningSpaceContainer* This,LONG MaxCount) {
    return This->lpVtbl->put_MaxCount(This,MaxCount);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ITuningSpaceContainer_get_Count_Proxy(
    ITuningSpaceContainer* This,
    LONG *Count);
void __RPC_STUB ITuningSpaceContainer_get_Count_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITuningSpaceContainer_get__NewEnum_Proxy(
    ITuningSpaceContainer* This,
    IEnumVARIANT **NewEnum);
void __RPC_STUB ITuningSpaceContainer_get__NewEnum_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITuningSpaceContainer_get_Item_Proxy(
    ITuningSpaceContainer* This,
    VARIANT varIndex,
    ITuningSpace **TuningSpace);
void __RPC_STUB ITuningSpaceContainer_get_Item_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITuningSpaceContainer_put_Item_Proxy(
    ITuningSpaceContainer* This,
    VARIANT varIndex,
    ITuningSpace *TuningSpace);
void __RPC_STUB ITuningSpaceContainer_put_Item_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITuningSpaceContainer_TuningSpacesForCLSID_Proxy(
    ITuningSpaceContainer* This,
    BSTR SpaceCLSID,
    ITuningSpaces **NewColl);
void __RPC_STUB ITuningSpaceContainer_TuningSpacesForCLSID_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITuningSpaceContainer__TuningSpacesForCLSID_Proxy(
    ITuningSpaceContainer* This,
    REFCLSID SpaceCLSID,
    ITuningSpaces **NewColl);
void __RPC_STUB ITuningSpaceContainer__TuningSpacesForCLSID_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITuningSpaceContainer_TuningSpacesForName_Proxy(
    ITuningSpaceContainer* This,
    BSTR Name,
    ITuningSpaces **NewColl);
void __RPC_STUB ITuningSpaceContainer_TuningSpacesForName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITuningSpaceContainer_FindID_Proxy(
    ITuningSpaceContainer* This,
    ITuningSpace *TuningSpace,
    LONG *ID);
void __RPC_STUB ITuningSpaceContainer_FindID_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITuningSpaceContainer_Add_Proxy(
    ITuningSpaceContainer* This,
    ITuningSpace *TuningSpace,
    VARIANT *NewIndex);
void __RPC_STUB ITuningSpaceContainer_Add_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITuningSpaceContainer_get_EnumTuningSpaces_Proxy(
    ITuningSpaceContainer* This,
    IEnumTuningSpaces **ppEnum);
void __RPC_STUB ITuningSpaceContainer_get_EnumTuningSpaces_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITuningSpaceContainer_Remove_Proxy(
    ITuningSpaceContainer* This,
    VARIANT Index);
void __RPC_STUB ITuningSpaceContainer_Remove_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITuningSpaceContainer_get_MaxCount_Proxy(
    ITuningSpaceContainer* This,
    LONG *MaxCount);
void __RPC_STUB ITuningSpaceContainer_get_MaxCount_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITuningSpaceContainer_put_MaxCount_Proxy(
    ITuningSpaceContainer* This,
    LONG MaxCount);
void __RPC_STUB ITuningSpaceContainer_put_MaxCount_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ITuningSpaceContainer_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITuningSpace interface
 */
#ifndef __ITuningSpace_INTERFACE_DEFINED__
#define __ITuningSpace_INTERFACE_DEFINED__

DEFINE_GUID(IID_ITuningSpace, 0x061c6e30, 0xe622, 0x11d2, 0x94,0x93, 0x00,0xc0,0x4f,0x72,0xd9,0x80);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("061c6e30-e622-11d2-9493-00c04f72d980")
ITuningSpace : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_UniqueName(
        BSTR *Name) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_UniqueName(
        BSTR Name) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_FriendlyName(
        BSTR *Name) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_FriendlyName(
        BSTR Name) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CLSID(
        BSTR *SpaceCLSID) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_NetworkType(
        BSTR *NetworkTypeGuid) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_NetworkType(
        BSTR NetworkTypeGuid) = 0;

    virtual HRESULT STDMETHODCALLTYPE get__NetworkType(
        GUID *NetworkTypeGuid) = 0;

    virtual HRESULT STDMETHODCALLTYPE put__NetworkType(
        REFCLSID NetworkTypeGuid) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateTuneRequest(
        ITuneRequest **TuneRequest) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumCategoryGUIDs(
        IEnumGUID **ppEnum) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumDeviceMonikers(
        IEnumMoniker **ppEnum) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_DefaultPreferredComponentTypes(
        IComponentTypes **ComponentTypes) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_DefaultPreferredComponentTypes(
        IComponentTypes *NewComponentTypes) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_FrequencyMapping(
        BSTR *pMapping) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_FrequencyMapping(
        BSTR Mapping) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_DefaultLocator(
        ILocator **LocatorVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_DefaultLocator(
        ILocator *LocatorVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        ITuningSpace **NewTS) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ITuningSpace, 0x061c6e30, 0xe622, 0x11d2, 0x94,0x93, 0x00,0xc0,0x4f,0x72,0xd9,0x80)
#endif
#else
typedef struct ITuningSpaceVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ITuningSpace* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ITuningSpace* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ITuningSpace* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ITuningSpace* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ITuningSpace methods ***/
    HRESULT (STDMETHODCALLTYPE *get_UniqueName)(
        ITuningSpace* This,
        BSTR *Name);

    HRESULT (STDMETHODCALLTYPE *put_UniqueName)(
        ITuningSpace* This,
        BSTR Name);

    HRESULT (STDMETHODCALLTYPE *get_FriendlyName)(
        ITuningSpace* This,
        BSTR *Name);

    HRESULT (STDMETHODCALLTYPE *put_FriendlyName)(
        ITuningSpace* This,
        BSTR Name);

    HRESULT (STDMETHODCALLTYPE *get_CLSID)(
        ITuningSpace* This,
        BSTR *SpaceCLSID);

    HRESULT (STDMETHODCALLTYPE *get_NetworkType)(
        ITuningSpace* This,
        BSTR *NetworkTypeGuid);

    HRESULT (STDMETHODCALLTYPE *put_NetworkType)(
        ITuningSpace* This,
        BSTR NetworkTypeGuid);

    HRESULT (STDMETHODCALLTYPE *get__NetworkType)(
        ITuningSpace* This,
        GUID *NetworkTypeGuid);

    HRESULT (STDMETHODCALLTYPE *put__NetworkType)(
        ITuningSpace* This,
        REFCLSID NetworkTypeGuid);

    HRESULT (STDMETHODCALLTYPE *CreateTuneRequest)(
        ITuningSpace* This,
        ITuneRequest **TuneRequest);

    HRESULT (STDMETHODCALLTYPE *EnumCategoryGUIDs)(
        ITuningSpace* This,
        IEnumGUID **ppEnum);

    HRESULT (STDMETHODCALLTYPE *EnumDeviceMonikers)(
        ITuningSpace* This,
        IEnumMoniker **ppEnum);

    HRESULT (STDMETHODCALLTYPE *get_DefaultPreferredComponentTypes)(
        ITuningSpace* This,
        IComponentTypes **ComponentTypes);

    HRESULT (STDMETHODCALLTYPE *put_DefaultPreferredComponentTypes)(
        ITuningSpace* This,
        IComponentTypes *NewComponentTypes);

    HRESULT (STDMETHODCALLTYPE *get_FrequencyMapping)(
        ITuningSpace* This,
        BSTR *pMapping);

    HRESULT (STDMETHODCALLTYPE *put_FrequencyMapping)(
        ITuningSpace* This,
        BSTR Mapping);

    HRESULT (STDMETHODCALLTYPE *get_DefaultLocator)(
        ITuningSpace* This,
        ILocator **LocatorVal);

    HRESULT (STDMETHODCALLTYPE *put_DefaultLocator)(
        ITuningSpace* This,
        ILocator *LocatorVal);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        ITuningSpace* This,
        ITuningSpace **NewTS);

    END_INTERFACE
} ITuningSpaceVtbl;
interface ITuningSpace {
    CONST_VTBL ITuningSpaceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ITuningSpace_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITuningSpace_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITuningSpace_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ITuningSpace_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ITuningSpace_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ITuningSpace_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ITuningSpace_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ITuningSpace methods ***/
#define ITuningSpace_get_UniqueName(This,Name) (This)->lpVtbl->get_UniqueName(This,Name)
#define ITuningSpace_put_UniqueName(This,Name) (This)->lpVtbl->put_UniqueName(This,Name)
#define ITuningSpace_get_FriendlyName(This,Name) (This)->lpVtbl->get_FriendlyName(This,Name)
#define ITuningSpace_put_FriendlyName(This,Name) (This)->lpVtbl->put_FriendlyName(This,Name)
#define ITuningSpace_get_CLSID(This,SpaceCLSID) (This)->lpVtbl->get_CLSID(This,SpaceCLSID)
#define ITuningSpace_get_NetworkType(This,NetworkTypeGuid) (This)->lpVtbl->get_NetworkType(This,NetworkTypeGuid)
#define ITuningSpace_put_NetworkType(This,NetworkTypeGuid) (This)->lpVtbl->put_NetworkType(This,NetworkTypeGuid)
#define ITuningSpace_get__NetworkType(This,NetworkTypeGuid) (This)->lpVtbl->get__NetworkType(This,NetworkTypeGuid)
#define ITuningSpace_put__NetworkType(This,NetworkTypeGuid) (This)->lpVtbl->put__NetworkType(This,NetworkTypeGuid)
#define ITuningSpace_CreateTuneRequest(This,TuneRequest) (This)->lpVtbl->CreateTuneRequest(This,TuneRequest)
#define ITuningSpace_EnumCategoryGUIDs(This,ppEnum) (This)->lpVtbl->EnumCategoryGUIDs(This,ppEnum)
#define ITuningSpace_EnumDeviceMonikers(This,ppEnum) (This)->lpVtbl->EnumDeviceMonikers(This,ppEnum)
#define ITuningSpace_get_DefaultPreferredComponentTypes(This,ComponentTypes) (This)->lpVtbl->get_DefaultPreferredComponentTypes(This,ComponentTypes)
#define ITuningSpace_put_DefaultPreferredComponentTypes(This,NewComponentTypes) (This)->lpVtbl->put_DefaultPreferredComponentTypes(This,NewComponentTypes)
#define ITuningSpace_get_FrequencyMapping(This,pMapping) (This)->lpVtbl->get_FrequencyMapping(This,pMapping)
#define ITuningSpace_put_FrequencyMapping(This,Mapping) (This)->lpVtbl->put_FrequencyMapping(This,Mapping)
#define ITuningSpace_get_DefaultLocator(This,LocatorVal) (This)->lpVtbl->get_DefaultLocator(This,LocatorVal)
#define ITuningSpace_put_DefaultLocator(This,LocatorVal) (This)->lpVtbl->put_DefaultLocator(This,LocatorVal)
#define ITuningSpace_Clone(This,NewTS) (This)->lpVtbl->Clone(This,NewTS)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ITuningSpace_QueryInterface(ITuningSpace* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ITuningSpace_AddRef(ITuningSpace* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ITuningSpace_Release(ITuningSpace* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ITuningSpace_GetTypeInfoCount(ITuningSpace* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ITuningSpace_GetTypeInfo(ITuningSpace* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ITuningSpace_GetIDsOfNames(ITuningSpace* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ITuningSpace_Invoke(ITuningSpace* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ITuningSpace methods ***/
static FORCEINLINE HRESULT ITuningSpace_get_UniqueName(ITuningSpace* This,BSTR *Name) {
    return This->lpVtbl->get_UniqueName(This,Name);
}
static FORCEINLINE HRESULT ITuningSpace_put_UniqueName(ITuningSpace* This,BSTR Name) {
    return This->lpVtbl->put_UniqueName(This,Name);
}
static FORCEINLINE HRESULT ITuningSpace_get_FriendlyName(ITuningSpace* This,BSTR *Name) {
    return This->lpVtbl->get_FriendlyName(This,Name);
}
static FORCEINLINE HRESULT ITuningSpace_put_FriendlyName(ITuningSpace* This,BSTR Name) {
    return This->lpVtbl->put_FriendlyName(This,Name);
}
static FORCEINLINE HRESULT ITuningSpace_get_CLSID(ITuningSpace* This,BSTR *SpaceCLSID) {
    return This->lpVtbl->get_CLSID(This,SpaceCLSID);
}
static FORCEINLINE HRESULT ITuningSpace_get_NetworkType(ITuningSpace* This,BSTR *NetworkTypeGuid) {
    return This->lpVtbl->get_NetworkType(This,NetworkTypeGuid);
}
static FORCEINLINE HRESULT ITuningSpace_put_NetworkType(ITuningSpace* This,BSTR NetworkTypeGuid) {
    return This->lpVtbl->put_NetworkType(This,NetworkTypeGuid);
}
static FORCEINLINE HRESULT ITuningSpace_get__NetworkType(ITuningSpace* This,GUID *NetworkTypeGuid) {
    return This->lpVtbl->get__NetworkType(This,NetworkTypeGuid);
}
static FORCEINLINE HRESULT ITuningSpace_put__NetworkType(ITuningSpace* This,REFCLSID NetworkTypeGuid) {
    return This->lpVtbl->put__NetworkType(This,NetworkTypeGuid);
}
static FORCEINLINE HRESULT ITuningSpace_CreateTuneRequest(ITuningSpace* This,ITuneRequest **TuneRequest) {
    return This->lpVtbl->CreateTuneRequest(This,TuneRequest);
}
static FORCEINLINE HRESULT ITuningSpace_EnumCategoryGUIDs(ITuningSpace* This,IEnumGUID **ppEnum) {
    return This->lpVtbl->EnumCategoryGUIDs(This,ppEnum);
}
static FORCEINLINE HRESULT ITuningSpace_EnumDeviceMonikers(ITuningSpace* This,IEnumMoniker **ppEnum) {
    return This->lpVtbl->EnumDeviceMonikers(This,ppEnum);
}
static FORCEINLINE HRESULT ITuningSpace_get_DefaultPreferredComponentTypes(ITuningSpace* This,IComponentTypes **ComponentTypes) {
    return This->lpVtbl->get_DefaultPreferredComponentTypes(This,ComponentTypes);
}
static FORCEINLINE HRESULT ITuningSpace_put_DefaultPreferredComponentTypes(ITuningSpace* This,IComponentTypes *NewComponentTypes) {
    return This->lpVtbl->put_DefaultPreferredComponentTypes(This,NewComponentTypes);
}
static FORCEINLINE HRESULT ITuningSpace_get_FrequencyMapping(ITuningSpace* This,BSTR *pMapping) {
    return This->lpVtbl->get_FrequencyMapping(This,pMapping);
}
static FORCEINLINE HRESULT ITuningSpace_put_FrequencyMapping(ITuningSpace* This,BSTR Mapping) {
    return This->lpVtbl->put_FrequencyMapping(This,Mapping);
}
static FORCEINLINE HRESULT ITuningSpace_get_DefaultLocator(ITuningSpace* This,ILocator **LocatorVal) {
    return This->lpVtbl->get_DefaultLocator(This,LocatorVal);
}
static FORCEINLINE HRESULT ITuningSpace_put_DefaultLocator(ITuningSpace* This,ILocator *LocatorVal) {
    return This->lpVtbl->put_DefaultLocator(This,LocatorVal);
}
static FORCEINLINE HRESULT ITuningSpace_Clone(ITuningSpace* This,ITuningSpace **NewTS) {
    return This->lpVtbl->Clone(This,NewTS);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ITuningSpace_get_UniqueName_Proxy(
    ITuningSpace* This,
    BSTR *Name);
void __RPC_STUB ITuningSpace_get_UniqueName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITuningSpace_put_UniqueName_Proxy(
    ITuningSpace* This,
    BSTR Name);
void __RPC_STUB ITuningSpace_put_UniqueName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITuningSpace_get_FriendlyName_Proxy(
    ITuningSpace* This,
    BSTR *Name);
void __RPC_STUB ITuningSpace_get_FriendlyName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITuningSpace_put_FriendlyName_Proxy(
    ITuningSpace* This,
    BSTR Name);
void __RPC_STUB ITuningSpace_put_FriendlyName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITuningSpace_get_CLSID_Proxy(
    ITuningSpace* This,
    BSTR *SpaceCLSID);
void __RPC_STUB ITuningSpace_get_CLSID_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITuningSpace_get_NetworkType_Proxy(
    ITuningSpace* This,
    BSTR *NetworkTypeGuid);
void __RPC_STUB ITuningSpace_get_NetworkType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITuningSpace_put_NetworkType_Proxy(
    ITuningSpace* This,
    BSTR NetworkTypeGuid);
void __RPC_STUB ITuningSpace_put_NetworkType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITuningSpace_get__NetworkType_Proxy(
    ITuningSpace* This,
    GUID *NetworkTypeGuid);
void __RPC_STUB ITuningSpace_get__NetworkType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITuningSpace_put__NetworkType_Proxy(
    ITuningSpace* This,
    REFCLSID NetworkTypeGuid);
void __RPC_STUB ITuningSpace_put__NetworkType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITuningSpace_CreateTuneRequest_Proxy(
    ITuningSpace* This,
    ITuneRequest **TuneRequest);
void __RPC_STUB ITuningSpace_CreateTuneRequest_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITuningSpace_EnumCategoryGUIDs_Proxy(
    ITuningSpace* This,
    IEnumGUID **ppEnum);
void __RPC_STUB ITuningSpace_EnumCategoryGUIDs_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITuningSpace_EnumDeviceMonikers_Proxy(
    ITuningSpace* This,
    IEnumMoniker **ppEnum);
void __RPC_STUB ITuningSpace_EnumDeviceMonikers_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITuningSpace_get_DefaultPreferredComponentTypes_Proxy(
    ITuningSpace* This,
    IComponentTypes **ComponentTypes);
void __RPC_STUB ITuningSpace_get_DefaultPreferredComponentTypes_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITuningSpace_put_DefaultPreferredComponentTypes_Proxy(
    ITuningSpace* This,
    IComponentTypes *NewComponentTypes);
void __RPC_STUB ITuningSpace_put_DefaultPreferredComponentTypes_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITuningSpace_get_FrequencyMapping_Proxy(
    ITuningSpace* This,
    BSTR *pMapping);
void __RPC_STUB ITuningSpace_get_FrequencyMapping_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITuningSpace_put_FrequencyMapping_Proxy(
    ITuningSpace* This,
    BSTR Mapping);
void __RPC_STUB ITuningSpace_put_FrequencyMapping_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITuningSpace_get_DefaultLocator_Proxy(
    ITuningSpace* This,
    ILocator **LocatorVal);
void __RPC_STUB ITuningSpace_get_DefaultLocator_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITuningSpace_put_DefaultLocator_Proxy(
    ITuningSpace* This,
    ILocator *LocatorVal);
void __RPC_STUB ITuningSpace_put_DefaultLocator_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITuningSpace_Clone_Proxy(
    ITuningSpace* This,
    ITuningSpace **NewTS);
void __RPC_STUB ITuningSpace_Clone_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ITuningSpace_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IEnumTuningSpaces interface
 */
#ifndef __IEnumTuningSpaces_INTERFACE_DEFINED__
#define __IEnumTuningSpaces_INTERFACE_DEFINED__

DEFINE_GUID(IID_IEnumTuningSpaces, 0x8b8eb248, 0xfc2b, 0x11d2, 0x9d,0x8c, 0x00,0xc0,0x4f,0x72,0xd9,0x80);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("8b8eb248-fc2b-11d2-9d8c-00c04f72d980")
IEnumTuningSpaces : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Next(
        ULONG celt,
        ITuningSpace **rgelt,
        ULONG *pceltFetched) = 0;

    virtual HRESULT STDMETHODCALLTYPE Skip(
        ULONG celt) = 0;

    virtual HRESULT STDMETHODCALLTYPE Reset(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IEnumTuningSpaces **ppEnum) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IEnumTuningSpaces, 0x8b8eb248, 0xfc2b, 0x11d2, 0x9d,0x8c, 0x00,0xc0,0x4f,0x72,0xd9,0x80)
#endif
#else
typedef struct IEnumTuningSpacesVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IEnumTuningSpaces methods ***/
    HRESULT (STDMETHODCALLTYPE *Next)(
        IEnumTuningSpaces* This,
        ULONG celt,
        ITuningSpace **rgelt,
        ULONG *pceltFetched);

    HRESULT (STDMETHODCALLTYPE *Skip)(
        IEnumTuningSpaces* This,
        ULONG celt);

    HRESULT (STDMETHODCALLTYPE *Reset)(
        IEnumTuningSpaces* This);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IEnumTuningSpaces* This,
        IEnumTuningSpaces **ppEnum);

    END_INTERFACE
} IEnumTuningSpacesVtbl;
interface IEnumTuningSpaces {
    CONST_VTBL IEnumTuningSpacesVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IEnumTuningSpaces_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IEnumTuningSpaces_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IEnumTuningSpaces_Release(This) (This)->lpVtbl->Release(This)
/*** IEnumTuningSpaces methods ***/
#define IEnumTuningSpaces_Next(This,celt,rgelt,pceltFetched) (This)->lpVtbl->Next(This,celt,rgelt,pceltFetched)
#define IEnumTuningSpaces_Skip(This,celt) (This)->lpVtbl->Skip(This,celt)
#define IEnumTuningSpaces_Reset(This) (This)->lpVtbl->Reset(This)
#define IEnumTuningSpaces_Clone(This,ppEnum) (This)->lpVtbl->Clone(This,ppEnum)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IEnumTuningSpaces_QueryInterface(IEnumTuningSpaces* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IEnumTuningSpaces_AddRef(IEnumTuningSpaces* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IEnumTuningSpaces_Release(IEnumTuningSpaces* This) {
    return This->lpVtbl->Release(This);
}
/*** IEnumTuningSpaces methods ***/
static FORCEINLINE HRESULT IEnumTuningSpaces_Next(IEnumTuningSpaces* This,ULONG celt,ITuningSpace **rgelt,ULONG *pceltFetched) {
    return This->lpVtbl->Next(This,celt,rgelt,pceltFetched);
}
static FORCEINLINE HRESULT IEnumTuningSpaces_Skip(IEnumTuningSpaces* This,ULONG celt) {
    return This->lpVtbl->Skip(This,celt);
}
static FORCEINLINE HRESULT IEnumTuningSpaces_Reset(IEnumTuningSpaces* This) {
    return This->lpVtbl->Reset(This);
}
static FORCEINLINE HRESULT IEnumTuningSpaces_Clone(IEnumTuningSpaces* This,IEnumTuningSpaces **ppEnum) {
    return This->lpVtbl->Clone(This,ppEnum);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IEnumTuningSpaces_Next_Proxy(
    IEnumTuningSpaces* This,
    ULONG celt,
    ITuningSpace **rgelt,
    ULONG *pceltFetched);
void __RPC_STUB IEnumTuningSpaces_Next_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IEnumTuningSpaces_Skip_Proxy(
    IEnumTuningSpaces* This,
    ULONG celt);
void __RPC_STUB IEnumTuningSpaces_Skip_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IEnumTuningSpaces_Reset_Proxy(
    IEnumTuningSpaces* This);
void __RPC_STUB IEnumTuningSpaces_Reset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IEnumTuningSpaces_Clone_Proxy(
    IEnumTuningSpaces* This,
    IEnumTuningSpaces **ppEnum);
void __RPC_STUB IEnumTuningSpaces_Clone_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IEnumTuningSpaces_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDVBTuningSpace interface
 */
#ifndef __IDVBTuningSpace_INTERFACE_DEFINED__
#define __IDVBTuningSpace_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDVBTuningSpace, 0xada0b268, 0x3b19, 0x4e5b, 0xac,0xc4, 0x49,0xf8,0x52,0xbe,0x13,0xba);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("ada0b268-3b19-4e5b-acc4-49f852be13ba")
IDVBTuningSpace : public ITuningSpace
{
    virtual HRESULT STDMETHODCALLTYPE get_SystemType(
        DVBSystemType *SysType) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_SystemType(
        DVBSystemType SysType) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDVBTuningSpace, 0xada0b268, 0x3b19, 0x4e5b, 0xac,0xc4, 0x49,0xf8,0x52,0xbe,0x13,0xba)
#endif
#else
typedef struct IDVBTuningSpaceVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IDVBTuningSpace* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IDVBTuningSpace* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IDVBTuningSpace* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IDVBTuningSpace* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ITuningSpace methods ***/
    HRESULT (STDMETHODCALLTYPE *get_UniqueName)(
        IDVBTuningSpace* This,
        BSTR *Name);

    HRESULT (STDMETHODCALLTYPE *put_UniqueName)(
        IDVBTuningSpace* This,
        BSTR Name);

    HRESULT (STDMETHODCALLTYPE *get_FriendlyName)(
        IDVBTuningSpace* This,
        BSTR *Name);

    HRESULT (STDMETHODCALLTYPE *put_FriendlyName)(
        IDVBTuningSpace* This,
        BSTR Name);

    HRESULT (STDMETHODCALLTYPE *get_CLSID)(
        IDVBTuningSpace* This,
        BSTR *SpaceCLSID);

    HRESULT (STDMETHODCALLTYPE *get_NetworkType)(
        IDVBTuningSpace* This,
        BSTR *NetworkTypeGuid);

    HRESULT (STDMETHODCALLTYPE *put_NetworkType)(
        IDVBTuningSpace* This,
        BSTR NetworkTypeGuid);

    HRESULT (STDMETHODCALLTYPE *get__NetworkType)(
        IDVBTuningSpace* This,
        GUID *NetworkTypeGuid);

    HRESULT (STDMETHODCALLTYPE *put__NetworkType)(
        IDVBTuningSpace* This,
        REFCLSID NetworkTypeGuid);

    HRESULT (STDMETHODCALLTYPE *CreateTuneRequest)(
        IDVBTuningSpace* This,
        ITuneRequest **TuneRequest);

    HRESULT (STDMETHODCALLTYPE *EnumCategoryGUIDs)(
        IDVBTuningSpace* This,
        IEnumGUID **ppEnum);

    HRESULT (STDMETHODCALLTYPE *EnumDeviceMonikers)(
        IDVBTuningSpace* This,
        IEnumMoniker **ppEnum);

    HRESULT (STDMETHODCALLTYPE *get_DefaultPreferredComponentTypes)(
        IDVBTuningSpace* This,
        IComponentTypes **ComponentTypes);

    HRESULT (STDMETHODCALLTYPE *put_DefaultPreferredComponentTypes)(
        IDVBTuningSpace* This,
        IComponentTypes *NewComponentTypes);

    HRESULT (STDMETHODCALLTYPE *get_FrequencyMapping)(
        IDVBTuningSpace* This,
        BSTR *pMapping);

    HRESULT (STDMETHODCALLTYPE *put_FrequencyMapping)(
        IDVBTuningSpace* This,
        BSTR Mapping);

    HRESULT (STDMETHODCALLTYPE *get_DefaultLocator)(
        IDVBTuningSpace* This,
        ILocator **LocatorVal);

    HRESULT (STDMETHODCALLTYPE *put_DefaultLocator)(
        IDVBTuningSpace* This,
        ILocator *LocatorVal);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IDVBTuningSpace* This,
        ITuningSpace **NewTS);

    /*** IDVBTuningSpace methods ***/
    HRESULT (STDMETHODCALLTYPE *get_SystemType)(
        IDVBTuningSpace* This,
        DVBSystemType *SysType);

    HRESULT (STDMETHODCALLTYPE *put_SystemType)(
        IDVBTuningSpace* This,
        DVBSystemType SysType);

    END_INTERFACE
} IDVBTuningSpaceVtbl;
interface IDVBTuningSpace {
    CONST_VTBL IDVBTuningSpaceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDVBTuningSpace_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDVBTuningSpace_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDVBTuningSpace_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IDVBTuningSpace_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IDVBTuningSpace_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IDVBTuningSpace_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IDVBTuningSpace_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ITuningSpace methods ***/
#define IDVBTuningSpace_get_UniqueName(This,Name) (This)->lpVtbl->get_UniqueName(This,Name)
#define IDVBTuningSpace_put_UniqueName(This,Name) (This)->lpVtbl->put_UniqueName(This,Name)
#define IDVBTuningSpace_get_FriendlyName(This,Name) (This)->lpVtbl->get_FriendlyName(This,Name)
#define IDVBTuningSpace_put_FriendlyName(This,Name) (This)->lpVtbl->put_FriendlyName(This,Name)
#define IDVBTuningSpace_get_CLSID(This,SpaceCLSID) (This)->lpVtbl->get_CLSID(This,SpaceCLSID)
#define IDVBTuningSpace_get_NetworkType(This,NetworkTypeGuid) (This)->lpVtbl->get_NetworkType(This,NetworkTypeGuid)
#define IDVBTuningSpace_put_NetworkType(This,NetworkTypeGuid) (This)->lpVtbl->put_NetworkType(This,NetworkTypeGuid)
#define IDVBTuningSpace_get__NetworkType(This,NetworkTypeGuid) (This)->lpVtbl->get__NetworkType(This,NetworkTypeGuid)
#define IDVBTuningSpace_put__NetworkType(This,NetworkTypeGuid) (This)->lpVtbl->put__NetworkType(This,NetworkTypeGuid)
#define IDVBTuningSpace_CreateTuneRequest(This,TuneRequest) (This)->lpVtbl->CreateTuneRequest(This,TuneRequest)
#define IDVBTuningSpace_EnumCategoryGUIDs(This,ppEnum) (This)->lpVtbl->EnumCategoryGUIDs(This,ppEnum)
#define IDVBTuningSpace_EnumDeviceMonikers(This,ppEnum) (This)->lpVtbl->EnumDeviceMonikers(This,ppEnum)
#define IDVBTuningSpace_get_DefaultPreferredComponentTypes(This,ComponentTypes) (This)->lpVtbl->get_DefaultPreferredComponentTypes(This,ComponentTypes)
#define IDVBTuningSpace_put_DefaultPreferredComponentTypes(This,NewComponentTypes) (This)->lpVtbl->put_DefaultPreferredComponentTypes(This,NewComponentTypes)
#define IDVBTuningSpace_get_FrequencyMapping(This,pMapping) (This)->lpVtbl->get_FrequencyMapping(This,pMapping)
#define IDVBTuningSpace_put_FrequencyMapping(This,Mapping) (This)->lpVtbl->put_FrequencyMapping(This,Mapping)
#define IDVBTuningSpace_get_DefaultLocator(This,LocatorVal) (This)->lpVtbl->get_DefaultLocator(This,LocatorVal)
#define IDVBTuningSpace_put_DefaultLocator(This,LocatorVal) (This)->lpVtbl->put_DefaultLocator(This,LocatorVal)
#define IDVBTuningSpace_Clone(This,NewTS) (This)->lpVtbl->Clone(This,NewTS)
/*** IDVBTuningSpace methods ***/
#define IDVBTuningSpace_get_SystemType(This,SysType) (This)->lpVtbl->get_SystemType(This,SysType)
#define IDVBTuningSpace_put_SystemType(This,SysType) (This)->lpVtbl->put_SystemType(This,SysType)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDVBTuningSpace_QueryInterface(IDVBTuningSpace* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDVBTuningSpace_AddRef(IDVBTuningSpace* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDVBTuningSpace_Release(IDVBTuningSpace* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IDVBTuningSpace_GetTypeInfoCount(IDVBTuningSpace* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IDVBTuningSpace_GetTypeInfo(IDVBTuningSpace* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IDVBTuningSpace_GetIDsOfNames(IDVBTuningSpace* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IDVBTuningSpace_Invoke(IDVBTuningSpace* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ITuningSpace methods ***/
static FORCEINLINE HRESULT IDVBTuningSpace_get_UniqueName(IDVBTuningSpace* This,BSTR *Name) {
    return This->lpVtbl->get_UniqueName(This,Name);
}
static FORCEINLINE HRESULT IDVBTuningSpace_put_UniqueName(IDVBTuningSpace* This,BSTR Name) {
    return This->lpVtbl->put_UniqueName(This,Name);
}
static FORCEINLINE HRESULT IDVBTuningSpace_get_FriendlyName(IDVBTuningSpace* This,BSTR *Name) {
    return This->lpVtbl->get_FriendlyName(This,Name);
}
static FORCEINLINE HRESULT IDVBTuningSpace_put_FriendlyName(IDVBTuningSpace* This,BSTR Name) {
    return This->lpVtbl->put_FriendlyName(This,Name);
}
static FORCEINLINE HRESULT IDVBTuningSpace_get_CLSID(IDVBTuningSpace* This,BSTR *SpaceCLSID) {
    return This->lpVtbl->get_CLSID(This,SpaceCLSID);
}
static FORCEINLINE HRESULT IDVBTuningSpace_get_NetworkType(IDVBTuningSpace* This,BSTR *NetworkTypeGuid) {
    return This->lpVtbl->get_NetworkType(This,NetworkTypeGuid);
}
static FORCEINLINE HRESULT IDVBTuningSpace_put_NetworkType(IDVBTuningSpace* This,BSTR NetworkTypeGuid) {
    return This->lpVtbl->put_NetworkType(This,NetworkTypeGuid);
}
static FORCEINLINE HRESULT IDVBTuningSpace_get__NetworkType(IDVBTuningSpace* This,GUID *NetworkTypeGuid) {
    return This->lpVtbl->get__NetworkType(This,NetworkTypeGuid);
}
static FORCEINLINE HRESULT IDVBTuningSpace_put__NetworkType(IDVBTuningSpace* This,REFCLSID NetworkTypeGuid) {
    return This->lpVtbl->put__NetworkType(This,NetworkTypeGuid);
}
static FORCEINLINE HRESULT IDVBTuningSpace_CreateTuneRequest(IDVBTuningSpace* This,ITuneRequest **TuneRequest) {
    return This->lpVtbl->CreateTuneRequest(This,TuneRequest);
}
static FORCEINLINE HRESULT IDVBTuningSpace_EnumCategoryGUIDs(IDVBTuningSpace* This,IEnumGUID **ppEnum) {
    return This->lpVtbl->EnumCategoryGUIDs(This,ppEnum);
}
static FORCEINLINE HRESULT IDVBTuningSpace_EnumDeviceMonikers(IDVBTuningSpace* This,IEnumMoniker **ppEnum) {
    return This->lpVtbl->EnumDeviceMonikers(This,ppEnum);
}
static FORCEINLINE HRESULT IDVBTuningSpace_get_DefaultPreferredComponentTypes(IDVBTuningSpace* This,IComponentTypes **ComponentTypes) {
    return This->lpVtbl->get_DefaultPreferredComponentTypes(This,ComponentTypes);
}
static FORCEINLINE HRESULT IDVBTuningSpace_put_DefaultPreferredComponentTypes(IDVBTuningSpace* This,IComponentTypes *NewComponentTypes) {
    return This->lpVtbl->put_DefaultPreferredComponentTypes(This,NewComponentTypes);
}
static FORCEINLINE HRESULT IDVBTuningSpace_get_FrequencyMapping(IDVBTuningSpace* This,BSTR *pMapping) {
    return This->lpVtbl->get_FrequencyMapping(This,pMapping);
}
static FORCEINLINE HRESULT IDVBTuningSpace_put_FrequencyMapping(IDVBTuningSpace* This,BSTR Mapping) {
    return This->lpVtbl->put_FrequencyMapping(This,Mapping);
}
static FORCEINLINE HRESULT IDVBTuningSpace_get_DefaultLocator(IDVBTuningSpace* This,ILocator **LocatorVal) {
    return This->lpVtbl->get_DefaultLocator(This,LocatorVal);
}
static FORCEINLINE HRESULT IDVBTuningSpace_put_DefaultLocator(IDVBTuningSpace* This,ILocator *LocatorVal) {
    return This->lpVtbl->put_DefaultLocator(This,LocatorVal);
}
static FORCEINLINE HRESULT IDVBTuningSpace_Clone(IDVBTuningSpace* This,ITuningSpace **NewTS) {
    return This->lpVtbl->Clone(This,NewTS);
}
/*** IDVBTuningSpace methods ***/
static FORCEINLINE HRESULT IDVBTuningSpace_get_SystemType(IDVBTuningSpace* This,DVBSystemType *SysType) {
    return This->lpVtbl->get_SystemType(This,SysType);
}
static FORCEINLINE HRESULT IDVBTuningSpace_put_SystemType(IDVBTuningSpace* This,DVBSystemType SysType) {
    return This->lpVtbl->put_SystemType(This,SysType);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IDVBTuningSpace_get_SystemType_Proxy(
    IDVBTuningSpace* This,
    DVBSystemType *SysType);
void __RPC_STUB IDVBTuningSpace_get_SystemType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDVBTuningSpace_put_SystemType_Proxy(
    IDVBTuningSpace* This,
    DVBSystemType SysType);
void __RPC_STUB IDVBTuningSpace_put_SystemType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IDVBTuningSpace_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDVBTuningSpace2 interface
 */
#ifndef __IDVBTuningSpace2_INTERFACE_DEFINED__
#define __IDVBTuningSpace2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDVBTuningSpace2, 0x843188b4, 0xce62, 0x43db, 0x96,0x6b, 0x81,0x45,0xa0,0x94,0xe0,0x40);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("843188b4-ce62-43db-966b-8145a094e040")
IDVBTuningSpace2 : public IDVBTuningSpace
{
    virtual HRESULT STDMETHODCALLTYPE get_NetworkID(
        LONG *NetworkID) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_NetworkID(
        LONG NetworkID) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDVBTuningSpace2, 0x843188b4, 0xce62, 0x43db, 0x96,0x6b, 0x81,0x45,0xa0,0x94,0xe0,0x40)
#endif
#else
typedef struct IDVBTuningSpace2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IDVBTuningSpace2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IDVBTuningSpace2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IDVBTuningSpace2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IDVBTuningSpace2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ITuningSpace methods ***/
    HRESULT (STDMETHODCALLTYPE *get_UniqueName)(
        IDVBTuningSpace2* This,
        BSTR *Name);

    HRESULT (STDMETHODCALLTYPE *put_UniqueName)(
        IDVBTuningSpace2* This,
        BSTR Name);

    HRESULT (STDMETHODCALLTYPE *get_FriendlyName)(
        IDVBTuningSpace2* This,
        BSTR *Name);

    HRESULT (STDMETHODCALLTYPE *put_FriendlyName)(
        IDVBTuningSpace2* This,
        BSTR Name);

    HRESULT (STDMETHODCALLTYPE *get_CLSID)(
        IDVBTuningSpace2* This,
        BSTR *SpaceCLSID);

    HRESULT (STDMETHODCALLTYPE *get_NetworkType)(
        IDVBTuningSpace2* This,
        BSTR *NetworkTypeGuid);

    HRESULT (STDMETHODCALLTYPE *put_NetworkType)(
        IDVBTuningSpace2* This,
        BSTR NetworkTypeGuid);

    HRESULT (STDMETHODCALLTYPE *get__NetworkType)(
        IDVBTuningSpace2* This,
        GUID *NetworkTypeGuid);

    HRESULT (STDMETHODCALLTYPE *put__NetworkType)(
        IDVBTuningSpace2* This,
        REFCLSID NetworkTypeGuid);

    HRESULT (STDMETHODCALLTYPE *CreateTuneRequest)(
        IDVBTuningSpace2* This,
        ITuneRequest **TuneRequest);

    HRESULT (STDMETHODCALLTYPE *EnumCategoryGUIDs)(
        IDVBTuningSpace2* This,
        IEnumGUID **ppEnum);

    HRESULT (STDMETHODCALLTYPE *EnumDeviceMonikers)(
        IDVBTuningSpace2* This,
        IEnumMoniker **ppEnum);

    HRESULT (STDMETHODCALLTYPE *get_DefaultPreferredComponentTypes)(
        IDVBTuningSpace2* This,
        IComponentTypes **ComponentTypes);

    HRESULT (STDMETHODCALLTYPE *put_DefaultPreferredComponentTypes)(
        IDVBTuningSpace2* This,
        IComponentTypes *NewComponentTypes);

    HRESULT (STDMETHODCALLTYPE *get_FrequencyMapping)(
        IDVBTuningSpace2* This,
        BSTR *pMapping);

    HRESULT (STDMETHODCALLTYPE *put_FrequencyMapping)(
        IDVBTuningSpace2* This,
        BSTR Mapping);

    HRESULT (STDMETHODCALLTYPE *get_DefaultLocator)(
        IDVBTuningSpace2* This,
        ILocator **LocatorVal);

    HRESULT (STDMETHODCALLTYPE *put_DefaultLocator)(
        IDVBTuningSpace2* This,
        ILocator *LocatorVal);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IDVBTuningSpace2* This,
        ITuningSpace **NewTS);

    /*** IDVBTuningSpace methods ***/
    HRESULT (STDMETHODCALLTYPE *get_SystemType)(
        IDVBTuningSpace2* This,
        DVBSystemType *SysType);

    HRESULT (STDMETHODCALLTYPE *put_SystemType)(
        IDVBTuningSpace2* This,
        DVBSystemType SysType);

    /*** IDVBTuningSpace2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_NetworkID)(
        IDVBTuningSpace2* This,
        LONG *NetworkID);

    HRESULT (STDMETHODCALLTYPE *put_NetworkID)(
        IDVBTuningSpace2* This,
        LONG NetworkID);

    END_INTERFACE
} IDVBTuningSpace2Vtbl;
interface IDVBTuningSpace2 {
    CONST_VTBL IDVBTuningSpace2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDVBTuningSpace2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDVBTuningSpace2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDVBTuningSpace2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IDVBTuningSpace2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IDVBTuningSpace2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IDVBTuningSpace2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IDVBTuningSpace2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ITuningSpace methods ***/
#define IDVBTuningSpace2_get_UniqueName(This,Name) (This)->lpVtbl->get_UniqueName(This,Name)
#define IDVBTuningSpace2_put_UniqueName(This,Name) (This)->lpVtbl->put_UniqueName(This,Name)
#define IDVBTuningSpace2_get_FriendlyName(This,Name) (This)->lpVtbl->get_FriendlyName(This,Name)
#define IDVBTuningSpace2_put_FriendlyName(This,Name) (This)->lpVtbl->put_FriendlyName(This,Name)
#define IDVBTuningSpace2_get_CLSID(This,SpaceCLSID) (This)->lpVtbl->get_CLSID(This,SpaceCLSID)
#define IDVBTuningSpace2_get_NetworkType(This,NetworkTypeGuid) (This)->lpVtbl->get_NetworkType(This,NetworkTypeGuid)
#define IDVBTuningSpace2_put_NetworkType(This,NetworkTypeGuid) (This)->lpVtbl->put_NetworkType(This,NetworkTypeGuid)
#define IDVBTuningSpace2_get__NetworkType(This,NetworkTypeGuid) (This)->lpVtbl->get__NetworkType(This,NetworkTypeGuid)
#define IDVBTuningSpace2_put__NetworkType(This,NetworkTypeGuid) (This)->lpVtbl->put__NetworkType(This,NetworkTypeGuid)
#define IDVBTuningSpace2_CreateTuneRequest(This,TuneRequest) (This)->lpVtbl->CreateTuneRequest(This,TuneRequest)
#define IDVBTuningSpace2_EnumCategoryGUIDs(This,ppEnum) (This)->lpVtbl->EnumCategoryGUIDs(This,ppEnum)
#define IDVBTuningSpace2_EnumDeviceMonikers(This,ppEnum) (This)->lpVtbl->EnumDeviceMonikers(This,ppEnum)
#define IDVBTuningSpace2_get_DefaultPreferredComponentTypes(This,ComponentTypes) (This)->lpVtbl->get_DefaultPreferredComponentTypes(This,ComponentTypes)
#define IDVBTuningSpace2_put_DefaultPreferredComponentTypes(This,NewComponentTypes) (This)->lpVtbl->put_DefaultPreferredComponentTypes(This,NewComponentTypes)
#define IDVBTuningSpace2_get_FrequencyMapping(This,pMapping) (This)->lpVtbl->get_FrequencyMapping(This,pMapping)
#define IDVBTuningSpace2_put_FrequencyMapping(This,Mapping) (This)->lpVtbl->put_FrequencyMapping(This,Mapping)
#define IDVBTuningSpace2_get_DefaultLocator(This,LocatorVal) (This)->lpVtbl->get_DefaultLocator(This,LocatorVal)
#define IDVBTuningSpace2_put_DefaultLocator(This,LocatorVal) (This)->lpVtbl->put_DefaultLocator(This,LocatorVal)
#define IDVBTuningSpace2_Clone(This,NewTS) (This)->lpVtbl->Clone(This,NewTS)
/*** IDVBTuningSpace methods ***/
#define IDVBTuningSpace2_get_SystemType(This,SysType) (This)->lpVtbl->get_SystemType(This,SysType)
#define IDVBTuningSpace2_put_SystemType(This,SysType) (This)->lpVtbl->put_SystemType(This,SysType)
/*** IDVBTuningSpace2 methods ***/
#define IDVBTuningSpace2_get_NetworkID(This,NetworkID) (This)->lpVtbl->get_NetworkID(This,NetworkID)
#define IDVBTuningSpace2_put_NetworkID(This,NetworkID) (This)->lpVtbl->put_NetworkID(This,NetworkID)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDVBTuningSpace2_QueryInterface(IDVBTuningSpace2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDVBTuningSpace2_AddRef(IDVBTuningSpace2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDVBTuningSpace2_Release(IDVBTuningSpace2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IDVBTuningSpace2_GetTypeInfoCount(IDVBTuningSpace2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IDVBTuningSpace2_GetTypeInfo(IDVBTuningSpace2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IDVBTuningSpace2_GetIDsOfNames(IDVBTuningSpace2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IDVBTuningSpace2_Invoke(IDVBTuningSpace2* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ITuningSpace methods ***/
static FORCEINLINE HRESULT IDVBTuningSpace2_get_UniqueName(IDVBTuningSpace2* This,BSTR *Name) {
    return This->lpVtbl->get_UniqueName(This,Name);
}
static FORCEINLINE HRESULT IDVBTuningSpace2_put_UniqueName(IDVBTuningSpace2* This,BSTR Name) {
    return This->lpVtbl->put_UniqueName(This,Name);
}
static FORCEINLINE HRESULT IDVBTuningSpace2_get_FriendlyName(IDVBTuningSpace2* This,BSTR *Name) {
    return This->lpVtbl->get_FriendlyName(This,Name);
}
static FORCEINLINE HRESULT IDVBTuningSpace2_put_FriendlyName(IDVBTuningSpace2* This,BSTR Name) {
    return This->lpVtbl->put_FriendlyName(This,Name);
}
static FORCEINLINE HRESULT IDVBTuningSpace2_get_CLSID(IDVBTuningSpace2* This,BSTR *SpaceCLSID) {
    return This->lpVtbl->get_CLSID(This,SpaceCLSID);
}
static FORCEINLINE HRESULT IDVBTuningSpace2_get_NetworkType(IDVBTuningSpace2* This,BSTR *NetworkTypeGuid) {
    return This->lpVtbl->get_NetworkType(This,NetworkTypeGuid);
}
static FORCEINLINE HRESULT IDVBTuningSpace2_put_NetworkType(IDVBTuningSpace2* This,BSTR NetworkTypeGuid) {
    return This->lpVtbl->put_NetworkType(This,NetworkTypeGuid);
}
static FORCEINLINE HRESULT IDVBTuningSpace2_get__NetworkType(IDVBTuningSpace2* This,GUID *NetworkTypeGuid) {
    return This->lpVtbl->get__NetworkType(This,NetworkTypeGuid);
}
static FORCEINLINE HRESULT IDVBTuningSpace2_put__NetworkType(IDVBTuningSpace2* This,REFCLSID NetworkTypeGuid) {
    return This->lpVtbl->put__NetworkType(This,NetworkTypeGuid);
}
static FORCEINLINE HRESULT IDVBTuningSpace2_CreateTuneRequest(IDVBTuningSpace2* This,ITuneRequest **TuneRequest) {
    return This->lpVtbl->CreateTuneRequest(This,TuneRequest);
}
static FORCEINLINE HRESULT IDVBTuningSpace2_EnumCategoryGUIDs(IDVBTuningSpace2* This,IEnumGUID **ppEnum) {
    return This->lpVtbl->EnumCategoryGUIDs(This,ppEnum);
}
static FORCEINLINE HRESULT IDVBTuningSpace2_EnumDeviceMonikers(IDVBTuningSpace2* This,IEnumMoniker **ppEnum) {
    return This->lpVtbl->EnumDeviceMonikers(This,ppEnum);
}
static FORCEINLINE HRESULT IDVBTuningSpace2_get_DefaultPreferredComponentTypes(IDVBTuningSpace2* This,IComponentTypes **ComponentTypes) {
    return This->lpVtbl->get_DefaultPreferredComponentTypes(This,ComponentTypes);
}
static FORCEINLINE HRESULT IDVBTuningSpace2_put_DefaultPreferredComponentTypes(IDVBTuningSpace2* This,IComponentTypes *NewComponentTypes) {
    return This->lpVtbl->put_DefaultPreferredComponentTypes(This,NewComponentTypes);
}
static FORCEINLINE HRESULT IDVBTuningSpace2_get_FrequencyMapping(IDVBTuningSpace2* This,BSTR *pMapping) {
    return This->lpVtbl->get_FrequencyMapping(This,pMapping);
}
static FORCEINLINE HRESULT IDVBTuningSpace2_put_FrequencyMapping(IDVBTuningSpace2* This,BSTR Mapping) {
    return This->lpVtbl->put_FrequencyMapping(This,Mapping);
}
static FORCEINLINE HRESULT IDVBTuningSpace2_get_DefaultLocator(IDVBTuningSpace2* This,ILocator **LocatorVal) {
    return This->lpVtbl->get_DefaultLocator(This,LocatorVal);
}
static FORCEINLINE HRESULT IDVBTuningSpace2_put_DefaultLocator(IDVBTuningSpace2* This,ILocator *LocatorVal) {
    return This->lpVtbl->put_DefaultLocator(This,LocatorVal);
}
static FORCEINLINE HRESULT IDVBTuningSpace2_Clone(IDVBTuningSpace2* This,ITuningSpace **NewTS) {
    return This->lpVtbl->Clone(This,NewTS);
}
/*** IDVBTuningSpace methods ***/
static FORCEINLINE HRESULT IDVBTuningSpace2_get_SystemType(IDVBTuningSpace2* This,DVBSystemType *SysType) {
    return This->lpVtbl->get_SystemType(This,SysType);
}
static FORCEINLINE HRESULT IDVBTuningSpace2_put_SystemType(IDVBTuningSpace2* This,DVBSystemType SysType) {
    return This->lpVtbl->put_SystemType(This,SysType);
}
/*** IDVBTuningSpace2 methods ***/
static FORCEINLINE HRESULT IDVBTuningSpace2_get_NetworkID(IDVBTuningSpace2* This,LONG *NetworkID) {
    return This->lpVtbl->get_NetworkID(This,NetworkID);
}
static FORCEINLINE HRESULT IDVBTuningSpace2_put_NetworkID(IDVBTuningSpace2* This,LONG NetworkID) {
    return This->lpVtbl->put_NetworkID(This,NetworkID);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IDVBTuningSpace2_get_NetworkID_Proxy(
    IDVBTuningSpace2* This,
    LONG *NetworkID);
void __RPC_STUB IDVBTuningSpace2_get_NetworkID_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDVBTuningSpace2_put_NetworkID_Proxy(
    IDVBTuningSpace2* This,
    LONG NetworkID);
void __RPC_STUB IDVBTuningSpace2_put_NetworkID_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IDVBTuningSpace2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDVBSTuningSpace interface
 */
#ifndef __IDVBSTuningSpace_INTERFACE_DEFINED__
#define __IDVBSTuningSpace_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDVBSTuningSpace, 0xcdf7be60, 0xd954, 0x42fd, 0xa9,0x72, 0x78,0x97,0x19,0x58,0xe4,0x70);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("cdf7be60-d954-42fd-a972-78971958e470")
IDVBSTuningSpace : public IDVBTuningSpace2
{
    virtual HRESULT STDMETHODCALLTYPE get_LowOscillator(
        LONG *LowOscillator) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_LowOscillator(
        LONG LowOscillator) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HighOscillator(
        LONG *HighOscillator) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_HighOscillator(
        LONG HighOscillator) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_LNBSwitch(
        LONG *LNBSwitch) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_LNBSwitch(
        LONG LNBSwitch) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_InputRange(
        BSTR *InputRange) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_InputRange(
        BSTR InputRange) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_SpectralInversion(
        SpectralInversion *SpectralInversionVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_SpectralInversion(
        SpectralInversion SpectralInversionVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDVBSTuningSpace, 0xcdf7be60, 0xd954, 0x42fd, 0xa9,0x72, 0x78,0x97,0x19,0x58,0xe4,0x70)
#endif
#else
typedef struct IDVBSTuningSpaceVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IDVBSTuningSpace* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IDVBSTuningSpace* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IDVBSTuningSpace* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IDVBSTuningSpace* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ITuningSpace methods ***/
    HRESULT (STDMETHODCALLTYPE *get_UniqueName)(
        IDVBSTuningSpace* This,
        BSTR *Name);

    HRESULT (STDMETHODCALLTYPE *put_UniqueName)(
        IDVBSTuningSpace* This,
        BSTR Name);

    HRESULT (STDMETHODCALLTYPE *get_FriendlyName)(
        IDVBSTuningSpace* This,
        BSTR *Name);

    HRESULT (STDMETHODCALLTYPE *put_FriendlyName)(
        IDVBSTuningSpace* This,
        BSTR Name);

    HRESULT (STDMETHODCALLTYPE *get_CLSID)(
        IDVBSTuningSpace* This,
        BSTR *SpaceCLSID);

    HRESULT (STDMETHODCALLTYPE *get_NetworkType)(
        IDVBSTuningSpace* This,
        BSTR *NetworkTypeGuid);

    HRESULT (STDMETHODCALLTYPE *put_NetworkType)(
        IDVBSTuningSpace* This,
        BSTR NetworkTypeGuid);

    HRESULT (STDMETHODCALLTYPE *get__NetworkType)(
        IDVBSTuningSpace* This,
        GUID *NetworkTypeGuid);

    HRESULT (STDMETHODCALLTYPE *put__NetworkType)(
        IDVBSTuningSpace* This,
        REFCLSID NetworkTypeGuid);

    HRESULT (STDMETHODCALLTYPE *CreateTuneRequest)(
        IDVBSTuningSpace* This,
        ITuneRequest **TuneRequest);

    HRESULT (STDMETHODCALLTYPE *EnumCategoryGUIDs)(
        IDVBSTuningSpace* This,
        IEnumGUID **ppEnum);

    HRESULT (STDMETHODCALLTYPE *EnumDeviceMonikers)(
        IDVBSTuningSpace* This,
        IEnumMoniker **ppEnum);

    HRESULT (STDMETHODCALLTYPE *get_DefaultPreferredComponentTypes)(
        IDVBSTuningSpace* This,
        IComponentTypes **ComponentTypes);

    HRESULT (STDMETHODCALLTYPE *put_DefaultPreferredComponentTypes)(
        IDVBSTuningSpace* This,
        IComponentTypes *NewComponentTypes);

    HRESULT (STDMETHODCALLTYPE *get_FrequencyMapping)(
        IDVBSTuningSpace* This,
        BSTR *pMapping);

    HRESULT (STDMETHODCALLTYPE *put_FrequencyMapping)(
        IDVBSTuningSpace* This,
        BSTR Mapping);

    HRESULT (STDMETHODCALLTYPE *get_DefaultLocator)(
        IDVBSTuningSpace* This,
        ILocator **LocatorVal);

    HRESULT (STDMETHODCALLTYPE *put_DefaultLocator)(
        IDVBSTuningSpace* This,
        ILocator *LocatorVal);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IDVBSTuningSpace* This,
        ITuningSpace **NewTS);

    /*** IDVBTuningSpace methods ***/
    HRESULT (STDMETHODCALLTYPE *get_SystemType)(
        IDVBSTuningSpace* This,
        DVBSystemType *SysType);

    HRESULT (STDMETHODCALLTYPE *put_SystemType)(
        IDVBSTuningSpace* This,
        DVBSystemType SysType);

    /*** IDVBTuningSpace2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_NetworkID)(
        IDVBSTuningSpace* This,
        LONG *NetworkID);

    HRESULT (STDMETHODCALLTYPE *put_NetworkID)(
        IDVBSTuningSpace* This,
        LONG NetworkID);

    /*** IDVBSTuningSpace methods ***/
    HRESULT (STDMETHODCALLTYPE *get_LowOscillator)(
        IDVBSTuningSpace* This,
        LONG *LowOscillator);

    HRESULT (STDMETHODCALLTYPE *put_LowOscillator)(
        IDVBSTuningSpace* This,
        LONG LowOscillator);

    HRESULT (STDMETHODCALLTYPE *get_HighOscillator)(
        IDVBSTuningSpace* This,
        LONG *HighOscillator);

    HRESULT (STDMETHODCALLTYPE *put_HighOscillator)(
        IDVBSTuningSpace* This,
        LONG HighOscillator);

    HRESULT (STDMETHODCALLTYPE *get_LNBSwitch)(
        IDVBSTuningSpace* This,
        LONG *LNBSwitch);

    HRESULT (STDMETHODCALLTYPE *put_LNBSwitch)(
        IDVBSTuningSpace* This,
        LONG LNBSwitch);

    HRESULT (STDMETHODCALLTYPE *get_InputRange)(
        IDVBSTuningSpace* This,
        BSTR *InputRange);

    HRESULT (STDMETHODCALLTYPE *put_InputRange)(
        IDVBSTuningSpace* This,
        BSTR InputRange);

    HRESULT (STDMETHODCALLTYPE *get_SpectralInversion)(
        IDVBSTuningSpace* This,
        SpectralInversion *SpectralInversionVal);

    HRESULT (STDMETHODCALLTYPE *put_SpectralInversion)(
        IDVBSTuningSpace* This,
        SpectralInversion SpectralInversionVal);

    END_INTERFACE
} IDVBSTuningSpaceVtbl;
interface IDVBSTuningSpace {
    CONST_VTBL IDVBSTuningSpaceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDVBSTuningSpace_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDVBSTuningSpace_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDVBSTuningSpace_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IDVBSTuningSpace_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IDVBSTuningSpace_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IDVBSTuningSpace_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IDVBSTuningSpace_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ITuningSpace methods ***/
#define IDVBSTuningSpace_get_UniqueName(This,Name) (This)->lpVtbl->get_UniqueName(This,Name)
#define IDVBSTuningSpace_put_UniqueName(This,Name) (This)->lpVtbl->put_UniqueName(This,Name)
#define IDVBSTuningSpace_get_FriendlyName(This,Name) (This)->lpVtbl->get_FriendlyName(This,Name)
#define IDVBSTuningSpace_put_FriendlyName(This,Name) (This)->lpVtbl->put_FriendlyName(This,Name)
#define IDVBSTuningSpace_get_CLSID(This,SpaceCLSID) (This)->lpVtbl->get_CLSID(This,SpaceCLSID)
#define IDVBSTuningSpace_get_NetworkType(This,NetworkTypeGuid) (This)->lpVtbl->get_NetworkType(This,NetworkTypeGuid)
#define IDVBSTuningSpace_put_NetworkType(This,NetworkTypeGuid) (This)->lpVtbl->put_NetworkType(This,NetworkTypeGuid)
#define IDVBSTuningSpace_get__NetworkType(This,NetworkTypeGuid) (This)->lpVtbl->get__NetworkType(This,NetworkTypeGuid)
#define IDVBSTuningSpace_put__NetworkType(This,NetworkTypeGuid) (This)->lpVtbl->put__NetworkType(This,NetworkTypeGuid)
#define IDVBSTuningSpace_CreateTuneRequest(This,TuneRequest) (This)->lpVtbl->CreateTuneRequest(This,TuneRequest)
#define IDVBSTuningSpace_EnumCategoryGUIDs(This,ppEnum) (This)->lpVtbl->EnumCategoryGUIDs(This,ppEnum)
#define IDVBSTuningSpace_EnumDeviceMonikers(This,ppEnum) (This)->lpVtbl->EnumDeviceMonikers(This,ppEnum)
#define IDVBSTuningSpace_get_DefaultPreferredComponentTypes(This,ComponentTypes) (This)->lpVtbl->get_DefaultPreferredComponentTypes(This,ComponentTypes)
#define IDVBSTuningSpace_put_DefaultPreferredComponentTypes(This,NewComponentTypes) (This)->lpVtbl->put_DefaultPreferredComponentTypes(This,NewComponentTypes)
#define IDVBSTuningSpace_get_FrequencyMapping(This,pMapping) (This)->lpVtbl->get_FrequencyMapping(This,pMapping)
#define IDVBSTuningSpace_put_FrequencyMapping(This,Mapping) (This)->lpVtbl->put_FrequencyMapping(This,Mapping)
#define IDVBSTuningSpace_get_DefaultLocator(This,LocatorVal) (This)->lpVtbl->get_DefaultLocator(This,LocatorVal)
#define IDVBSTuningSpace_put_DefaultLocator(This,LocatorVal) (This)->lpVtbl->put_DefaultLocator(This,LocatorVal)
#define IDVBSTuningSpace_Clone(This,NewTS) (This)->lpVtbl->Clone(This,NewTS)
/*** IDVBTuningSpace methods ***/
#define IDVBSTuningSpace_get_SystemType(This,SysType) (This)->lpVtbl->get_SystemType(This,SysType)
#define IDVBSTuningSpace_put_SystemType(This,SysType) (This)->lpVtbl->put_SystemType(This,SysType)
/*** IDVBTuningSpace2 methods ***/
#define IDVBSTuningSpace_get_NetworkID(This,NetworkID) (This)->lpVtbl->get_NetworkID(This,NetworkID)
#define IDVBSTuningSpace_put_NetworkID(This,NetworkID) (This)->lpVtbl->put_NetworkID(This,NetworkID)
/*** IDVBSTuningSpace methods ***/
#define IDVBSTuningSpace_get_LowOscillator(This,LowOscillator) (This)->lpVtbl->get_LowOscillator(This,LowOscillator)
#define IDVBSTuningSpace_put_LowOscillator(This,LowOscillator) (This)->lpVtbl->put_LowOscillator(This,LowOscillator)
#define IDVBSTuningSpace_get_HighOscillator(This,HighOscillator) (This)->lpVtbl->get_HighOscillator(This,HighOscillator)
#define IDVBSTuningSpace_put_HighOscillator(This,HighOscillator) (This)->lpVtbl->put_HighOscillator(This,HighOscillator)
#define IDVBSTuningSpace_get_LNBSwitch(This,LNBSwitch) (This)->lpVtbl->get_LNBSwitch(This,LNBSwitch)
#define IDVBSTuningSpace_put_LNBSwitch(This,LNBSwitch) (This)->lpVtbl->put_LNBSwitch(This,LNBSwitch)
#define IDVBSTuningSpace_get_InputRange(This,InputRange) (This)->lpVtbl->get_InputRange(This,InputRange)
#define IDVBSTuningSpace_put_InputRange(This,InputRange) (This)->lpVtbl->put_InputRange(This,InputRange)
#define IDVBSTuningSpace_get_SpectralInversion(This,SpectralInversionVal) (This)->lpVtbl->get_SpectralInversion(This,SpectralInversionVal)
#define IDVBSTuningSpace_put_SpectralInversion(This,SpectralInversionVal) (This)->lpVtbl->put_SpectralInversion(This,SpectralInversionVal)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDVBSTuningSpace_QueryInterface(IDVBSTuningSpace* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDVBSTuningSpace_AddRef(IDVBSTuningSpace* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDVBSTuningSpace_Release(IDVBSTuningSpace* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IDVBSTuningSpace_GetTypeInfoCount(IDVBSTuningSpace* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IDVBSTuningSpace_GetTypeInfo(IDVBSTuningSpace* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IDVBSTuningSpace_GetIDsOfNames(IDVBSTuningSpace* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IDVBSTuningSpace_Invoke(IDVBSTuningSpace* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ITuningSpace methods ***/
static FORCEINLINE HRESULT IDVBSTuningSpace_get_UniqueName(IDVBSTuningSpace* This,BSTR *Name) {
    return This->lpVtbl->get_UniqueName(This,Name);
}
static FORCEINLINE HRESULT IDVBSTuningSpace_put_UniqueName(IDVBSTuningSpace* This,BSTR Name) {
    return This->lpVtbl->put_UniqueName(This,Name);
}
static FORCEINLINE HRESULT IDVBSTuningSpace_get_FriendlyName(IDVBSTuningSpace* This,BSTR *Name) {
    return This->lpVtbl->get_FriendlyName(This,Name);
}
static FORCEINLINE HRESULT IDVBSTuningSpace_put_FriendlyName(IDVBSTuningSpace* This,BSTR Name) {
    return This->lpVtbl->put_FriendlyName(This,Name);
}
static FORCEINLINE HRESULT IDVBSTuningSpace_get_CLSID(IDVBSTuningSpace* This,BSTR *SpaceCLSID) {
    return This->lpVtbl->get_CLSID(This,SpaceCLSID);
}
static FORCEINLINE HRESULT IDVBSTuningSpace_get_NetworkType(IDVBSTuningSpace* This,BSTR *NetworkTypeGuid) {
    return This->lpVtbl->get_NetworkType(This,NetworkTypeGuid);
}
static FORCEINLINE HRESULT IDVBSTuningSpace_put_NetworkType(IDVBSTuningSpace* This,BSTR NetworkTypeGuid) {
    return This->lpVtbl->put_NetworkType(This,NetworkTypeGuid);
}
static FORCEINLINE HRESULT IDVBSTuningSpace_get__NetworkType(IDVBSTuningSpace* This,GUID *NetworkTypeGuid) {
    return This->lpVtbl->get__NetworkType(This,NetworkTypeGuid);
}
static FORCEINLINE HRESULT IDVBSTuningSpace_put__NetworkType(IDVBSTuningSpace* This,REFCLSID NetworkTypeGuid) {
    return This->lpVtbl->put__NetworkType(This,NetworkTypeGuid);
}
static FORCEINLINE HRESULT IDVBSTuningSpace_CreateTuneRequest(IDVBSTuningSpace* This,ITuneRequest **TuneRequest) {
    return This->lpVtbl->CreateTuneRequest(This,TuneRequest);
}
static FORCEINLINE HRESULT IDVBSTuningSpace_EnumCategoryGUIDs(IDVBSTuningSpace* This,IEnumGUID **ppEnum) {
    return This->lpVtbl->EnumCategoryGUIDs(This,ppEnum);
}
static FORCEINLINE HRESULT IDVBSTuningSpace_EnumDeviceMonikers(IDVBSTuningSpace* This,IEnumMoniker **ppEnum) {
    return This->lpVtbl->EnumDeviceMonikers(This,ppEnum);
}
static FORCEINLINE HRESULT IDVBSTuningSpace_get_DefaultPreferredComponentTypes(IDVBSTuningSpace* This,IComponentTypes **ComponentTypes) {
    return This->lpVtbl->get_DefaultPreferredComponentTypes(This,ComponentTypes);
}
static FORCEINLINE HRESULT IDVBSTuningSpace_put_DefaultPreferredComponentTypes(IDVBSTuningSpace* This,IComponentTypes *NewComponentTypes) {
    return This->lpVtbl->put_DefaultPreferredComponentTypes(This,NewComponentTypes);
}
static FORCEINLINE HRESULT IDVBSTuningSpace_get_FrequencyMapping(IDVBSTuningSpace* This,BSTR *pMapping) {
    return This->lpVtbl->get_FrequencyMapping(This,pMapping);
}
static FORCEINLINE HRESULT IDVBSTuningSpace_put_FrequencyMapping(IDVBSTuningSpace* This,BSTR Mapping) {
    return This->lpVtbl->put_FrequencyMapping(This,Mapping);
}
static FORCEINLINE HRESULT IDVBSTuningSpace_get_DefaultLocator(IDVBSTuningSpace* This,ILocator **LocatorVal) {
    return This->lpVtbl->get_DefaultLocator(This,LocatorVal);
}
static FORCEINLINE HRESULT IDVBSTuningSpace_put_DefaultLocator(IDVBSTuningSpace* This,ILocator *LocatorVal) {
    return This->lpVtbl->put_DefaultLocator(This,LocatorVal);
}
static FORCEINLINE HRESULT IDVBSTuningSpace_Clone(IDVBSTuningSpace* This,ITuningSpace **NewTS) {
    return This->lpVtbl->Clone(This,NewTS);
}
/*** IDVBTuningSpace methods ***/
static FORCEINLINE HRESULT IDVBSTuningSpace_get_SystemType(IDVBSTuningSpace* This,DVBSystemType *SysType) {
    return This->lpVtbl->get_SystemType(This,SysType);
}
static FORCEINLINE HRESULT IDVBSTuningSpace_put_SystemType(IDVBSTuningSpace* This,DVBSystemType SysType) {
    return This->lpVtbl->put_SystemType(This,SysType);
}
/*** IDVBTuningSpace2 methods ***/
static FORCEINLINE HRESULT IDVBSTuningSpace_get_NetworkID(IDVBSTuningSpace* This,LONG *NetworkID) {
    return This->lpVtbl->get_NetworkID(This,NetworkID);
}
static FORCEINLINE HRESULT IDVBSTuningSpace_put_NetworkID(IDVBSTuningSpace* This,LONG NetworkID) {
    return This->lpVtbl->put_NetworkID(This,NetworkID);
}
/*** IDVBSTuningSpace methods ***/
static FORCEINLINE HRESULT IDVBSTuningSpace_get_LowOscillator(IDVBSTuningSpace* This,LONG *LowOscillator) {
    return This->lpVtbl->get_LowOscillator(This,LowOscillator);
}
static FORCEINLINE HRESULT IDVBSTuningSpace_put_LowOscillator(IDVBSTuningSpace* This,LONG LowOscillator) {
    return This->lpVtbl->put_LowOscillator(This,LowOscillator);
}
static FORCEINLINE HRESULT IDVBSTuningSpace_get_HighOscillator(IDVBSTuningSpace* This,LONG *HighOscillator) {
    return This->lpVtbl->get_HighOscillator(This,HighOscillator);
}
static FORCEINLINE HRESULT IDVBSTuningSpace_put_HighOscillator(IDVBSTuningSpace* This,LONG HighOscillator) {
    return This->lpVtbl->put_HighOscillator(This,HighOscillator);
}
static FORCEINLINE HRESULT IDVBSTuningSpace_get_LNBSwitch(IDVBSTuningSpace* This,LONG *LNBSwitch) {
    return This->lpVtbl->get_LNBSwitch(This,LNBSwitch);
}
static FORCEINLINE HRESULT IDVBSTuningSpace_put_LNBSwitch(IDVBSTuningSpace* This,LONG LNBSwitch) {
    return This->lpVtbl->put_LNBSwitch(This,LNBSwitch);
}
static FORCEINLINE HRESULT IDVBSTuningSpace_get_InputRange(IDVBSTuningSpace* This,BSTR *InputRange) {
    return This->lpVtbl->get_InputRange(This,InputRange);
}
static FORCEINLINE HRESULT IDVBSTuningSpace_put_InputRange(IDVBSTuningSpace* This,BSTR InputRange) {
    return This->lpVtbl->put_InputRange(This,InputRange);
}
static FORCEINLINE HRESULT IDVBSTuningSpace_get_SpectralInversion(IDVBSTuningSpace* This,SpectralInversion *SpectralInversionVal) {
    return This->lpVtbl->get_SpectralInversion(This,SpectralInversionVal);
}
static FORCEINLINE HRESULT IDVBSTuningSpace_put_SpectralInversion(IDVBSTuningSpace* This,SpectralInversion SpectralInversionVal) {
    return This->lpVtbl->put_SpectralInversion(This,SpectralInversionVal);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IDVBSTuningSpace_get_LowOscillator_Proxy(
    IDVBSTuningSpace* This,
    LONG *LowOscillator);
void __RPC_STUB IDVBSTuningSpace_get_LowOscillator_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDVBSTuningSpace_put_LowOscillator_Proxy(
    IDVBSTuningSpace* This,
    LONG LowOscillator);
void __RPC_STUB IDVBSTuningSpace_put_LowOscillator_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDVBSTuningSpace_get_HighOscillator_Proxy(
    IDVBSTuningSpace* This,
    LONG *HighOscillator);
void __RPC_STUB IDVBSTuningSpace_get_HighOscillator_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDVBSTuningSpace_put_HighOscillator_Proxy(
    IDVBSTuningSpace* This,
    LONG HighOscillator);
void __RPC_STUB IDVBSTuningSpace_put_HighOscillator_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDVBSTuningSpace_get_LNBSwitch_Proxy(
    IDVBSTuningSpace* This,
    LONG *LNBSwitch);
void __RPC_STUB IDVBSTuningSpace_get_LNBSwitch_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDVBSTuningSpace_put_LNBSwitch_Proxy(
    IDVBSTuningSpace* This,
    LONG LNBSwitch);
void __RPC_STUB IDVBSTuningSpace_put_LNBSwitch_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDVBSTuningSpace_get_InputRange_Proxy(
    IDVBSTuningSpace* This,
    BSTR *InputRange);
void __RPC_STUB IDVBSTuningSpace_get_InputRange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDVBSTuningSpace_put_InputRange_Proxy(
    IDVBSTuningSpace* This,
    BSTR InputRange);
void __RPC_STUB IDVBSTuningSpace_put_InputRange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDVBSTuningSpace_get_SpectralInversion_Proxy(
    IDVBSTuningSpace* This,
    SpectralInversion *SpectralInversionVal);
void __RPC_STUB IDVBSTuningSpace_get_SpectralInversion_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDVBSTuningSpace_put_SpectralInversion_Proxy(
    IDVBSTuningSpace* This,
    SpectralInversion SpectralInversionVal);
void __RPC_STUB IDVBSTuningSpace_put_SpectralInversion_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IDVBSTuningSpace_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAuxInTuningSpace interface
 */
#ifndef __IAuxInTuningSpace_INTERFACE_DEFINED__
#define __IAuxInTuningSpace_INTERFACE_DEFINED__

DEFINE_GUID(IID_IAuxInTuningSpace, 0xe48244b8, 0x7e17, 0x4f76, 0xa7,0x63, 0x50,0x90,0xff,0x1e,0x2f,0x30);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("e48244b8-7e17-4f76-a763-5090ff1e2f30")
IAuxInTuningSpace : public ITuningSpace
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IAuxInTuningSpace, 0xe48244b8, 0x7e17, 0x4f76, 0xa7,0x63, 0x50,0x90,0xff,0x1e,0x2f,0x30)
#endif
#else
typedef struct IAuxInTuningSpaceVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IAuxInTuningSpace* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IAuxInTuningSpace* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IAuxInTuningSpace* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IAuxInTuningSpace* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ITuningSpace methods ***/
    HRESULT (STDMETHODCALLTYPE *get_UniqueName)(
        IAuxInTuningSpace* This,
        BSTR *Name);

    HRESULT (STDMETHODCALLTYPE *put_UniqueName)(
        IAuxInTuningSpace* This,
        BSTR Name);

    HRESULT (STDMETHODCALLTYPE *get_FriendlyName)(
        IAuxInTuningSpace* This,
        BSTR *Name);

    HRESULT (STDMETHODCALLTYPE *put_FriendlyName)(
        IAuxInTuningSpace* This,
        BSTR Name);

    HRESULT (STDMETHODCALLTYPE *get_CLSID)(
        IAuxInTuningSpace* This,
        BSTR *SpaceCLSID);

    HRESULT (STDMETHODCALLTYPE *get_NetworkType)(
        IAuxInTuningSpace* This,
        BSTR *NetworkTypeGuid);

    HRESULT (STDMETHODCALLTYPE *put_NetworkType)(
        IAuxInTuningSpace* This,
        BSTR NetworkTypeGuid);

    HRESULT (STDMETHODCALLTYPE *get__NetworkType)(
        IAuxInTuningSpace* This,
        GUID *NetworkTypeGuid);

    HRESULT (STDMETHODCALLTYPE *put__NetworkType)(
        IAuxInTuningSpace* This,
        REFCLSID NetworkTypeGuid);

    HRESULT (STDMETHODCALLTYPE *CreateTuneRequest)(
        IAuxInTuningSpace* This,
        ITuneRequest **TuneRequest);

    HRESULT (STDMETHODCALLTYPE *EnumCategoryGUIDs)(
        IAuxInTuningSpace* This,
        IEnumGUID **ppEnum);

    HRESULT (STDMETHODCALLTYPE *EnumDeviceMonikers)(
        IAuxInTuningSpace* This,
        IEnumMoniker **ppEnum);

    HRESULT (STDMETHODCALLTYPE *get_DefaultPreferredComponentTypes)(
        IAuxInTuningSpace* This,
        IComponentTypes **ComponentTypes);

    HRESULT (STDMETHODCALLTYPE *put_DefaultPreferredComponentTypes)(
        IAuxInTuningSpace* This,
        IComponentTypes *NewComponentTypes);

    HRESULT (STDMETHODCALLTYPE *get_FrequencyMapping)(
        IAuxInTuningSpace* This,
        BSTR *pMapping);

    HRESULT (STDMETHODCALLTYPE *put_FrequencyMapping)(
        IAuxInTuningSpace* This,
        BSTR Mapping);

    HRESULT (STDMETHODCALLTYPE *get_DefaultLocator)(
        IAuxInTuningSpace* This,
        ILocator **LocatorVal);

    HRESULT (STDMETHODCALLTYPE *put_DefaultLocator)(
        IAuxInTuningSpace* This,
        ILocator *LocatorVal);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IAuxInTuningSpace* This,
        ITuningSpace **NewTS);

    END_INTERFACE
} IAuxInTuningSpaceVtbl;
interface IAuxInTuningSpace {
    CONST_VTBL IAuxInTuningSpaceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IAuxInTuningSpace_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IAuxInTuningSpace_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IAuxInTuningSpace_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IAuxInTuningSpace_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IAuxInTuningSpace_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IAuxInTuningSpace_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IAuxInTuningSpace_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ITuningSpace methods ***/
#define IAuxInTuningSpace_get_UniqueName(This,Name) (This)->lpVtbl->get_UniqueName(This,Name)
#define IAuxInTuningSpace_put_UniqueName(This,Name) (This)->lpVtbl->put_UniqueName(This,Name)
#define IAuxInTuningSpace_get_FriendlyName(This,Name) (This)->lpVtbl->get_FriendlyName(This,Name)
#define IAuxInTuningSpace_put_FriendlyName(This,Name) (This)->lpVtbl->put_FriendlyName(This,Name)
#define IAuxInTuningSpace_get_CLSID(This,SpaceCLSID) (This)->lpVtbl->get_CLSID(This,SpaceCLSID)
#define IAuxInTuningSpace_get_NetworkType(This,NetworkTypeGuid) (This)->lpVtbl->get_NetworkType(This,NetworkTypeGuid)
#define IAuxInTuningSpace_put_NetworkType(This,NetworkTypeGuid) (This)->lpVtbl->put_NetworkType(This,NetworkTypeGuid)
#define IAuxInTuningSpace_get__NetworkType(This,NetworkTypeGuid) (This)->lpVtbl->get__NetworkType(This,NetworkTypeGuid)
#define IAuxInTuningSpace_put__NetworkType(This,NetworkTypeGuid) (This)->lpVtbl->put__NetworkType(This,NetworkTypeGuid)
#define IAuxInTuningSpace_CreateTuneRequest(This,TuneRequest) (This)->lpVtbl->CreateTuneRequest(This,TuneRequest)
#define IAuxInTuningSpace_EnumCategoryGUIDs(This,ppEnum) (This)->lpVtbl->EnumCategoryGUIDs(This,ppEnum)
#define IAuxInTuningSpace_EnumDeviceMonikers(This,ppEnum) (This)->lpVtbl->EnumDeviceMonikers(This,ppEnum)
#define IAuxInTuningSpace_get_DefaultPreferredComponentTypes(This,ComponentTypes) (This)->lpVtbl->get_DefaultPreferredComponentTypes(This,ComponentTypes)
#define IAuxInTuningSpace_put_DefaultPreferredComponentTypes(This,NewComponentTypes) (This)->lpVtbl->put_DefaultPreferredComponentTypes(This,NewComponentTypes)
#define IAuxInTuningSpace_get_FrequencyMapping(This,pMapping) (This)->lpVtbl->get_FrequencyMapping(This,pMapping)
#define IAuxInTuningSpace_put_FrequencyMapping(This,Mapping) (This)->lpVtbl->put_FrequencyMapping(This,Mapping)
#define IAuxInTuningSpace_get_DefaultLocator(This,LocatorVal) (This)->lpVtbl->get_DefaultLocator(This,LocatorVal)
#define IAuxInTuningSpace_put_DefaultLocator(This,LocatorVal) (This)->lpVtbl->put_DefaultLocator(This,LocatorVal)
#define IAuxInTuningSpace_Clone(This,NewTS) (This)->lpVtbl->Clone(This,NewTS)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IAuxInTuningSpace_QueryInterface(IAuxInTuningSpace* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IAuxInTuningSpace_AddRef(IAuxInTuningSpace* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IAuxInTuningSpace_Release(IAuxInTuningSpace* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IAuxInTuningSpace_GetTypeInfoCount(IAuxInTuningSpace* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IAuxInTuningSpace_GetTypeInfo(IAuxInTuningSpace* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IAuxInTuningSpace_GetIDsOfNames(IAuxInTuningSpace* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IAuxInTuningSpace_Invoke(IAuxInTuningSpace* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ITuningSpace methods ***/
static FORCEINLINE HRESULT IAuxInTuningSpace_get_UniqueName(IAuxInTuningSpace* This,BSTR *Name) {
    return This->lpVtbl->get_UniqueName(This,Name);
}
static FORCEINLINE HRESULT IAuxInTuningSpace_put_UniqueName(IAuxInTuningSpace* This,BSTR Name) {
    return This->lpVtbl->put_UniqueName(This,Name);
}
static FORCEINLINE HRESULT IAuxInTuningSpace_get_FriendlyName(IAuxInTuningSpace* This,BSTR *Name) {
    return This->lpVtbl->get_FriendlyName(This,Name);
}
static FORCEINLINE HRESULT IAuxInTuningSpace_put_FriendlyName(IAuxInTuningSpace* This,BSTR Name) {
    return This->lpVtbl->put_FriendlyName(This,Name);
}
static FORCEINLINE HRESULT IAuxInTuningSpace_get_CLSID(IAuxInTuningSpace* This,BSTR *SpaceCLSID) {
    return This->lpVtbl->get_CLSID(This,SpaceCLSID);
}
static FORCEINLINE HRESULT IAuxInTuningSpace_get_NetworkType(IAuxInTuningSpace* This,BSTR *NetworkTypeGuid) {
    return This->lpVtbl->get_NetworkType(This,NetworkTypeGuid);
}
static FORCEINLINE HRESULT IAuxInTuningSpace_put_NetworkType(IAuxInTuningSpace* This,BSTR NetworkTypeGuid) {
    return This->lpVtbl->put_NetworkType(This,NetworkTypeGuid);
}
static FORCEINLINE HRESULT IAuxInTuningSpace_get__NetworkType(IAuxInTuningSpace* This,GUID *NetworkTypeGuid) {
    return This->lpVtbl->get__NetworkType(This,NetworkTypeGuid);
}
static FORCEINLINE HRESULT IAuxInTuningSpace_put__NetworkType(IAuxInTuningSpace* This,REFCLSID NetworkTypeGuid) {
    return This->lpVtbl->put__NetworkType(This,NetworkTypeGuid);
}
static FORCEINLINE HRESULT IAuxInTuningSpace_CreateTuneRequest(IAuxInTuningSpace* This,ITuneRequest **TuneRequest) {
    return This->lpVtbl->CreateTuneRequest(This,TuneRequest);
}
static FORCEINLINE HRESULT IAuxInTuningSpace_EnumCategoryGUIDs(IAuxInTuningSpace* This,IEnumGUID **ppEnum) {
    return This->lpVtbl->EnumCategoryGUIDs(This,ppEnum);
}
static FORCEINLINE HRESULT IAuxInTuningSpace_EnumDeviceMonikers(IAuxInTuningSpace* This,IEnumMoniker **ppEnum) {
    return This->lpVtbl->EnumDeviceMonikers(This,ppEnum);
}
static FORCEINLINE HRESULT IAuxInTuningSpace_get_DefaultPreferredComponentTypes(IAuxInTuningSpace* This,IComponentTypes **ComponentTypes) {
    return This->lpVtbl->get_DefaultPreferredComponentTypes(This,ComponentTypes);
}
static FORCEINLINE HRESULT IAuxInTuningSpace_put_DefaultPreferredComponentTypes(IAuxInTuningSpace* This,IComponentTypes *NewComponentTypes) {
    return This->lpVtbl->put_DefaultPreferredComponentTypes(This,NewComponentTypes);
}
static FORCEINLINE HRESULT IAuxInTuningSpace_get_FrequencyMapping(IAuxInTuningSpace* This,BSTR *pMapping) {
    return This->lpVtbl->get_FrequencyMapping(This,pMapping);
}
static FORCEINLINE HRESULT IAuxInTuningSpace_put_FrequencyMapping(IAuxInTuningSpace* This,BSTR Mapping) {
    return This->lpVtbl->put_FrequencyMapping(This,Mapping);
}
static FORCEINLINE HRESULT IAuxInTuningSpace_get_DefaultLocator(IAuxInTuningSpace* This,ILocator **LocatorVal) {
    return This->lpVtbl->get_DefaultLocator(This,LocatorVal);
}
static FORCEINLINE HRESULT IAuxInTuningSpace_put_DefaultLocator(IAuxInTuningSpace* This,ILocator *LocatorVal) {
    return This->lpVtbl->put_DefaultLocator(This,LocatorVal);
}
static FORCEINLINE HRESULT IAuxInTuningSpace_Clone(IAuxInTuningSpace* This,ITuningSpace **NewTS) {
    return This->lpVtbl->Clone(This,NewTS);
}
#endif
#endif

#endif


#endif  /* __IAuxInTuningSpace_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAuxInTuningSpace2 interface
 */
#ifndef __IAuxInTuningSpace2_INTERFACE_DEFINED__
#define __IAuxInTuningSpace2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IAuxInTuningSpace2, 0xb10931ed, 0x8bfe, 0x4ab0, 0x9d,0xce, 0xe4,0x69,0xc2,0x9a,0x97,0x29);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("b10931ed-8bfe-4ab0-9dce-e469c29a9729")
IAuxInTuningSpace2 : public IAuxInTuningSpace
{
    virtual HRESULT STDMETHODCALLTYPE get_CountryCode(
        LONG *CountryCodeVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_CountryCode(
        LONG NewCountryCodeVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IAuxInTuningSpace2, 0xb10931ed, 0x8bfe, 0x4ab0, 0x9d,0xce, 0xe4,0x69,0xc2,0x9a,0x97,0x29)
#endif
#else
typedef struct IAuxInTuningSpace2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IAuxInTuningSpace2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IAuxInTuningSpace2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IAuxInTuningSpace2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IAuxInTuningSpace2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ITuningSpace methods ***/
    HRESULT (STDMETHODCALLTYPE *get_UniqueName)(
        IAuxInTuningSpace2* This,
        BSTR *Name);

    HRESULT (STDMETHODCALLTYPE *put_UniqueName)(
        IAuxInTuningSpace2* This,
        BSTR Name);

    HRESULT (STDMETHODCALLTYPE *get_FriendlyName)(
        IAuxInTuningSpace2* This,
        BSTR *Name);

    HRESULT (STDMETHODCALLTYPE *put_FriendlyName)(
        IAuxInTuningSpace2* This,
        BSTR Name);

    HRESULT (STDMETHODCALLTYPE *get_CLSID)(
        IAuxInTuningSpace2* This,
        BSTR *SpaceCLSID);

    HRESULT (STDMETHODCALLTYPE *get_NetworkType)(
        IAuxInTuningSpace2* This,
        BSTR *NetworkTypeGuid);

    HRESULT (STDMETHODCALLTYPE *put_NetworkType)(
        IAuxInTuningSpace2* This,
        BSTR NetworkTypeGuid);

    HRESULT (STDMETHODCALLTYPE *get__NetworkType)(
        IAuxInTuningSpace2* This,
        GUID *NetworkTypeGuid);

    HRESULT (STDMETHODCALLTYPE *put__NetworkType)(
        IAuxInTuningSpace2* This,
        REFCLSID NetworkTypeGuid);

    HRESULT (STDMETHODCALLTYPE *CreateTuneRequest)(
        IAuxInTuningSpace2* This,
        ITuneRequest **TuneRequest);

    HRESULT (STDMETHODCALLTYPE *EnumCategoryGUIDs)(
        IAuxInTuningSpace2* This,
        IEnumGUID **ppEnum);

    HRESULT (STDMETHODCALLTYPE *EnumDeviceMonikers)(
        IAuxInTuningSpace2* This,
        IEnumMoniker **ppEnum);

    HRESULT (STDMETHODCALLTYPE *get_DefaultPreferredComponentTypes)(
        IAuxInTuningSpace2* This,
        IComponentTypes **ComponentTypes);

    HRESULT (STDMETHODCALLTYPE *put_DefaultPreferredComponentTypes)(
        IAuxInTuningSpace2* This,
        IComponentTypes *NewComponentTypes);

    HRESULT (STDMETHODCALLTYPE *get_FrequencyMapping)(
        IAuxInTuningSpace2* This,
        BSTR *pMapping);

    HRESULT (STDMETHODCALLTYPE *put_FrequencyMapping)(
        IAuxInTuningSpace2* This,
        BSTR Mapping);

    HRESULT (STDMETHODCALLTYPE *get_DefaultLocator)(
        IAuxInTuningSpace2* This,
        ILocator **LocatorVal);

    HRESULT (STDMETHODCALLTYPE *put_DefaultLocator)(
        IAuxInTuningSpace2* This,
        ILocator *LocatorVal);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IAuxInTuningSpace2* This,
        ITuningSpace **NewTS);

    /*** IAuxInTuningSpace2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CountryCode)(
        IAuxInTuningSpace2* This,
        LONG *CountryCodeVal);

    HRESULT (STDMETHODCALLTYPE *put_CountryCode)(
        IAuxInTuningSpace2* This,
        LONG NewCountryCodeVal);

    END_INTERFACE
} IAuxInTuningSpace2Vtbl;
interface IAuxInTuningSpace2 {
    CONST_VTBL IAuxInTuningSpace2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IAuxInTuningSpace2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IAuxInTuningSpace2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IAuxInTuningSpace2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IAuxInTuningSpace2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IAuxInTuningSpace2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IAuxInTuningSpace2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IAuxInTuningSpace2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ITuningSpace methods ***/
#define IAuxInTuningSpace2_get_UniqueName(This,Name) (This)->lpVtbl->get_UniqueName(This,Name)
#define IAuxInTuningSpace2_put_UniqueName(This,Name) (This)->lpVtbl->put_UniqueName(This,Name)
#define IAuxInTuningSpace2_get_FriendlyName(This,Name) (This)->lpVtbl->get_FriendlyName(This,Name)
#define IAuxInTuningSpace2_put_FriendlyName(This,Name) (This)->lpVtbl->put_FriendlyName(This,Name)
#define IAuxInTuningSpace2_get_CLSID(This,SpaceCLSID) (This)->lpVtbl->get_CLSID(This,SpaceCLSID)
#define IAuxInTuningSpace2_get_NetworkType(This,NetworkTypeGuid) (This)->lpVtbl->get_NetworkType(This,NetworkTypeGuid)
#define IAuxInTuningSpace2_put_NetworkType(This,NetworkTypeGuid) (This)->lpVtbl->put_NetworkType(This,NetworkTypeGuid)
#define IAuxInTuningSpace2_get__NetworkType(This,NetworkTypeGuid) (This)->lpVtbl->get__NetworkType(This,NetworkTypeGuid)
#define IAuxInTuningSpace2_put__NetworkType(This,NetworkTypeGuid) (This)->lpVtbl->put__NetworkType(This,NetworkTypeGuid)
#define IAuxInTuningSpace2_CreateTuneRequest(This,TuneRequest) (This)->lpVtbl->CreateTuneRequest(This,TuneRequest)
#define IAuxInTuningSpace2_EnumCategoryGUIDs(This,ppEnum) (This)->lpVtbl->EnumCategoryGUIDs(This,ppEnum)
#define IAuxInTuningSpace2_EnumDeviceMonikers(This,ppEnum) (This)->lpVtbl->EnumDeviceMonikers(This,ppEnum)
#define IAuxInTuningSpace2_get_DefaultPreferredComponentTypes(This,ComponentTypes) (This)->lpVtbl->get_DefaultPreferredComponentTypes(This,ComponentTypes)
#define IAuxInTuningSpace2_put_DefaultPreferredComponentTypes(This,NewComponentTypes) (This)->lpVtbl->put_DefaultPreferredComponentTypes(This,NewComponentTypes)
#define IAuxInTuningSpace2_get_FrequencyMapping(This,pMapping) (This)->lpVtbl->get_FrequencyMapping(This,pMapping)
#define IAuxInTuningSpace2_put_FrequencyMapping(This,Mapping) (This)->lpVtbl->put_FrequencyMapping(This,Mapping)
#define IAuxInTuningSpace2_get_DefaultLocator(This,LocatorVal) (This)->lpVtbl->get_DefaultLocator(This,LocatorVal)
#define IAuxInTuningSpace2_put_DefaultLocator(This,LocatorVal) (This)->lpVtbl->put_DefaultLocator(This,LocatorVal)
#define IAuxInTuningSpace2_Clone(This,NewTS) (This)->lpVtbl->Clone(This,NewTS)
/*** IAuxInTuningSpace2 methods ***/
#define IAuxInTuningSpace2_get_CountryCode(This,CountryCodeVal) (This)->lpVtbl->get_CountryCode(This,CountryCodeVal)
#define IAuxInTuningSpace2_put_CountryCode(This,NewCountryCodeVal) (This)->lpVtbl->put_CountryCode(This,NewCountryCodeVal)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IAuxInTuningSpace2_QueryInterface(IAuxInTuningSpace2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IAuxInTuningSpace2_AddRef(IAuxInTuningSpace2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IAuxInTuningSpace2_Release(IAuxInTuningSpace2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IAuxInTuningSpace2_GetTypeInfoCount(IAuxInTuningSpace2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IAuxInTuningSpace2_GetTypeInfo(IAuxInTuningSpace2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IAuxInTuningSpace2_GetIDsOfNames(IAuxInTuningSpace2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IAuxInTuningSpace2_Invoke(IAuxInTuningSpace2* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ITuningSpace methods ***/
static FORCEINLINE HRESULT IAuxInTuningSpace2_get_UniqueName(IAuxInTuningSpace2* This,BSTR *Name) {
    return This->lpVtbl->get_UniqueName(This,Name);
}
static FORCEINLINE HRESULT IAuxInTuningSpace2_put_UniqueName(IAuxInTuningSpace2* This,BSTR Name) {
    return This->lpVtbl->put_UniqueName(This,Name);
}
static FORCEINLINE HRESULT IAuxInTuningSpace2_get_FriendlyName(IAuxInTuningSpace2* This,BSTR *Name) {
    return This->lpVtbl->get_FriendlyName(This,Name);
}
static FORCEINLINE HRESULT IAuxInTuningSpace2_put_FriendlyName(IAuxInTuningSpace2* This,BSTR Name) {
    return This->lpVtbl->put_FriendlyName(This,Name);
}
static FORCEINLINE HRESULT IAuxInTuningSpace2_get_CLSID(IAuxInTuningSpace2* This,BSTR *SpaceCLSID) {
    return This->lpVtbl->get_CLSID(This,SpaceCLSID);
}
static FORCEINLINE HRESULT IAuxInTuningSpace2_get_NetworkType(IAuxInTuningSpace2* This,BSTR *NetworkTypeGuid) {
    return This->lpVtbl->get_NetworkType(This,NetworkTypeGuid);
}
static FORCEINLINE HRESULT IAuxInTuningSpace2_put_NetworkType(IAuxInTuningSpace2* This,BSTR NetworkTypeGuid) {
    return This->lpVtbl->put_NetworkType(This,NetworkTypeGuid);
}
static FORCEINLINE HRESULT IAuxInTuningSpace2_get__NetworkType(IAuxInTuningSpace2* This,GUID *NetworkTypeGuid) {
    return This->lpVtbl->get__NetworkType(This,NetworkTypeGuid);
}
static FORCEINLINE HRESULT IAuxInTuningSpace2_put__NetworkType(IAuxInTuningSpace2* This,REFCLSID NetworkTypeGuid) {
    return This->lpVtbl->put__NetworkType(This,NetworkTypeGuid);
}
static FORCEINLINE HRESULT IAuxInTuningSpace2_CreateTuneRequest(IAuxInTuningSpace2* This,ITuneRequest **TuneRequest) {
    return This->lpVtbl->CreateTuneRequest(This,TuneRequest);
}
static FORCEINLINE HRESULT IAuxInTuningSpace2_EnumCategoryGUIDs(IAuxInTuningSpace2* This,IEnumGUID **ppEnum) {
    return This->lpVtbl->EnumCategoryGUIDs(This,ppEnum);
}
static FORCEINLINE HRESULT IAuxInTuningSpace2_EnumDeviceMonikers(IAuxInTuningSpace2* This,IEnumMoniker **ppEnum) {
    return This->lpVtbl->EnumDeviceMonikers(This,ppEnum);
}
static FORCEINLINE HRESULT IAuxInTuningSpace2_get_DefaultPreferredComponentTypes(IAuxInTuningSpace2* This,IComponentTypes **ComponentTypes) {
    return This->lpVtbl->get_DefaultPreferredComponentTypes(This,ComponentTypes);
}
static FORCEINLINE HRESULT IAuxInTuningSpace2_put_DefaultPreferredComponentTypes(IAuxInTuningSpace2* This,IComponentTypes *NewComponentTypes) {
    return This->lpVtbl->put_DefaultPreferredComponentTypes(This,NewComponentTypes);
}
static FORCEINLINE HRESULT IAuxInTuningSpace2_get_FrequencyMapping(IAuxInTuningSpace2* This,BSTR *pMapping) {
    return This->lpVtbl->get_FrequencyMapping(This,pMapping);
}
static FORCEINLINE HRESULT IAuxInTuningSpace2_put_FrequencyMapping(IAuxInTuningSpace2* This,BSTR Mapping) {
    return This->lpVtbl->put_FrequencyMapping(This,Mapping);
}
static FORCEINLINE HRESULT IAuxInTuningSpace2_get_DefaultLocator(IAuxInTuningSpace2* This,ILocator **LocatorVal) {
    return This->lpVtbl->get_DefaultLocator(This,LocatorVal);
}
static FORCEINLINE HRESULT IAuxInTuningSpace2_put_DefaultLocator(IAuxInTuningSpace2* This,ILocator *LocatorVal) {
    return This->lpVtbl->put_DefaultLocator(This,LocatorVal);
}
static FORCEINLINE HRESULT IAuxInTuningSpace2_Clone(IAuxInTuningSpace2* This,ITuningSpace **NewTS) {
    return This->lpVtbl->Clone(This,NewTS);
}
/*** IAuxInTuningSpace2 methods ***/
static FORCEINLINE HRESULT IAuxInTuningSpace2_get_CountryCode(IAuxInTuningSpace2* This,LONG *CountryCodeVal) {
    return This->lpVtbl->get_CountryCode(This,CountryCodeVal);
}
static FORCEINLINE HRESULT IAuxInTuningSpace2_put_CountryCode(IAuxInTuningSpace2* This,LONG NewCountryCodeVal) {
    return This->lpVtbl->put_CountryCode(This,NewCountryCodeVal);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IAuxInTuningSpace2_get_CountryCode_Proxy(
    IAuxInTuningSpace2* This,
    LONG *CountryCodeVal);
void __RPC_STUB IAuxInTuningSpace2_get_CountryCode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAuxInTuningSpace2_put_CountryCode_Proxy(
    IAuxInTuningSpace2* This,
    LONG NewCountryCodeVal);
void __RPC_STUB IAuxInTuningSpace2_put_CountryCode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IAuxInTuningSpace2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAnalogTVTuningSpace interface
 */
#ifndef __IAnalogTVTuningSpace_INTERFACE_DEFINED__
#define __IAnalogTVTuningSpace_INTERFACE_DEFINED__

DEFINE_GUID(IID_IAnalogTVTuningSpace, 0x2a6e293c, 0x2595, 0x11d3, 0xb6,0x4c, 0x00,0xc0,0x4f,0x79,0x49,0x8e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2a6e293c-2595-11d3-b64c-00c04f79498e")
IAnalogTVTuningSpace : public ITuningSpace
{
    virtual HRESULT STDMETHODCALLTYPE get_MinChannel(
        LONG *MinChannelVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_MinChannel(
        LONG NewMinChannelVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_MaxChannel(
        LONG *MaxChannelVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_MaxChannel(
        LONG NewMaxChannelVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_InputType(
        TunerInputType *InputTypeVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_InputType(
        TunerInputType NewInputTypeVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CountryCode(
        LONG *CountryCodeVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_CountryCode(
        LONG NewCountryCodeVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IAnalogTVTuningSpace, 0x2a6e293c, 0x2595, 0x11d3, 0xb6,0x4c, 0x00,0xc0,0x4f,0x79,0x49,0x8e)
#endif
#else
typedef struct IAnalogTVTuningSpaceVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IAnalogTVTuningSpace* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IAnalogTVTuningSpace* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IAnalogTVTuningSpace* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IAnalogTVTuningSpace* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ITuningSpace methods ***/
    HRESULT (STDMETHODCALLTYPE *get_UniqueName)(
        IAnalogTVTuningSpace* This,
        BSTR *Name);

    HRESULT (STDMETHODCALLTYPE *put_UniqueName)(
        IAnalogTVTuningSpace* This,
        BSTR Name);

    HRESULT (STDMETHODCALLTYPE *get_FriendlyName)(
        IAnalogTVTuningSpace* This,
        BSTR *Name);

    HRESULT (STDMETHODCALLTYPE *put_FriendlyName)(
        IAnalogTVTuningSpace* This,
        BSTR Name);

    HRESULT (STDMETHODCALLTYPE *get_CLSID)(
        IAnalogTVTuningSpace* This,
        BSTR *SpaceCLSID);

    HRESULT (STDMETHODCALLTYPE *get_NetworkType)(
        IAnalogTVTuningSpace* This,
        BSTR *NetworkTypeGuid);

    HRESULT (STDMETHODCALLTYPE *put_NetworkType)(
        IAnalogTVTuningSpace* This,
        BSTR NetworkTypeGuid);

    HRESULT (STDMETHODCALLTYPE *get__NetworkType)(
        IAnalogTVTuningSpace* This,
        GUID *NetworkTypeGuid);

    HRESULT (STDMETHODCALLTYPE *put__NetworkType)(
        IAnalogTVTuningSpace* This,
        REFCLSID NetworkTypeGuid);

    HRESULT (STDMETHODCALLTYPE *CreateTuneRequest)(
        IAnalogTVTuningSpace* This,
        ITuneRequest **TuneRequest);

    HRESULT (STDMETHODCALLTYPE *EnumCategoryGUIDs)(
        IAnalogTVTuningSpace* This,
        IEnumGUID **ppEnum);

    HRESULT (STDMETHODCALLTYPE *EnumDeviceMonikers)(
        IAnalogTVTuningSpace* This,
        IEnumMoniker **ppEnum);

    HRESULT (STDMETHODCALLTYPE *get_DefaultPreferredComponentTypes)(
        IAnalogTVTuningSpace* This,
        IComponentTypes **ComponentTypes);

    HRESULT (STDMETHODCALLTYPE *put_DefaultPreferredComponentTypes)(
        IAnalogTVTuningSpace* This,
        IComponentTypes *NewComponentTypes);

    HRESULT (STDMETHODCALLTYPE *get_FrequencyMapping)(
        IAnalogTVTuningSpace* This,
        BSTR *pMapping);

    HRESULT (STDMETHODCALLTYPE *put_FrequencyMapping)(
        IAnalogTVTuningSpace* This,
        BSTR Mapping);

    HRESULT (STDMETHODCALLTYPE *get_DefaultLocator)(
        IAnalogTVTuningSpace* This,
        ILocator **LocatorVal);

    HRESULT (STDMETHODCALLTYPE *put_DefaultLocator)(
        IAnalogTVTuningSpace* This,
        ILocator *LocatorVal);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IAnalogTVTuningSpace* This,
        ITuningSpace **NewTS);

    /*** IAnalogTVTuningSpace methods ***/
    HRESULT (STDMETHODCALLTYPE *get_MinChannel)(
        IAnalogTVTuningSpace* This,
        LONG *MinChannelVal);

    HRESULT (STDMETHODCALLTYPE *put_MinChannel)(
        IAnalogTVTuningSpace* This,
        LONG NewMinChannelVal);

    HRESULT (STDMETHODCALLTYPE *get_MaxChannel)(
        IAnalogTVTuningSpace* This,
        LONG *MaxChannelVal);

    HRESULT (STDMETHODCALLTYPE *put_MaxChannel)(
        IAnalogTVTuningSpace* This,
        LONG NewMaxChannelVal);

    HRESULT (STDMETHODCALLTYPE *get_InputType)(
        IAnalogTVTuningSpace* This,
        TunerInputType *InputTypeVal);

    HRESULT (STDMETHODCALLTYPE *put_InputType)(
        IAnalogTVTuningSpace* This,
        TunerInputType NewInputTypeVal);

    HRESULT (STDMETHODCALLTYPE *get_CountryCode)(
        IAnalogTVTuningSpace* This,
        LONG *CountryCodeVal);

    HRESULT (STDMETHODCALLTYPE *put_CountryCode)(
        IAnalogTVTuningSpace* This,
        LONG NewCountryCodeVal);

    END_INTERFACE
} IAnalogTVTuningSpaceVtbl;
interface IAnalogTVTuningSpace {
    CONST_VTBL IAnalogTVTuningSpaceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IAnalogTVTuningSpace_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IAnalogTVTuningSpace_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IAnalogTVTuningSpace_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IAnalogTVTuningSpace_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IAnalogTVTuningSpace_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IAnalogTVTuningSpace_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IAnalogTVTuningSpace_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ITuningSpace methods ***/
#define IAnalogTVTuningSpace_get_UniqueName(This,Name) (This)->lpVtbl->get_UniqueName(This,Name)
#define IAnalogTVTuningSpace_put_UniqueName(This,Name) (This)->lpVtbl->put_UniqueName(This,Name)
#define IAnalogTVTuningSpace_get_FriendlyName(This,Name) (This)->lpVtbl->get_FriendlyName(This,Name)
#define IAnalogTVTuningSpace_put_FriendlyName(This,Name) (This)->lpVtbl->put_FriendlyName(This,Name)
#define IAnalogTVTuningSpace_get_CLSID(This,SpaceCLSID) (This)->lpVtbl->get_CLSID(This,SpaceCLSID)
#define IAnalogTVTuningSpace_get_NetworkType(This,NetworkTypeGuid) (This)->lpVtbl->get_NetworkType(This,NetworkTypeGuid)
#define IAnalogTVTuningSpace_put_NetworkType(This,NetworkTypeGuid) (This)->lpVtbl->put_NetworkType(This,NetworkTypeGuid)
#define IAnalogTVTuningSpace_get__NetworkType(This,NetworkTypeGuid) (This)->lpVtbl->get__NetworkType(This,NetworkTypeGuid)
#define IAnalogTVTuningSpace_put__NetworkType(This,NetworkTypeGuid) (This)->lpVtbl->put__NetworkType(This,NetworkTypeGuid)
#define IAnalogTVTuningSpace_CreateTuneRequest(This,TuneRequest) (This)->lpVtbl->CreateTuneRequest(This,TuneRequest)
#define IAnalogTVTuningSpace_EnumCategoryGUIDs(This,ppEnum) (This)->lpVtbl->EnumCategoryGUIDs(This,ppEnum)
#define IAnalogTVTuningSpace_EnumDeviceMonikers(This,ppEnum) (This)->lpVtbl->EnumDeviceMonikers(This,ppEnum)
#define IAnalogTVTuningSpace_get_DefaultPreferredComponentTypes(This,ComponentTypes) (This)->lpVtbl->get_DefaultPreferredComponentTypes(This,ComponentTypes)
#define IAnalogTVTuningSpace_put_DefaultPreferredComponentTypes(This,NewComponentTypes) (This)->lpVtbl->put_DefaultPreferredComponentTypes(This,NewComponentTypes)
#define IAnalogTVTuningSpace_get_FrequencyMapping(This,pMapping) (This)->lpVtbl->get_FrequencyMapping(This,pMapping)
#define IAnalogTVTuningSpace_put_FrequencyMapping(This,Mapping) (This)->lpVtbl->put_FrequencyMapping(This,Mapping)
#define IAnalogTVTuningSpace_get_DefaultLocator(This,LocatorVal) (This)->lpVtbl->get_DefaultLocator(This,LocatorVal)
#define IAnalogTVTuningSpace_put_DefaultLocator(This,LocatorVal) (This)->lpVtbl->put_DefaultLocator(This,LocatorVal)
#define IAnalogTVTuningSpace_Clone(This,NewTS) (This)->lpVtbl->Clone(This,NewTS)
/*** IAnalogTVTuningSpace methods ***/
#define IAnalogTVTuningSpace_get_MinChannel(This,MinChannelVal) (This)->lpVtbl->get_MinChannel(This,MinChannelVal)
#define IAnalogTVTuningSpace_put_MinChannel(This,NewMinChannelVal) (This)->lpVtbl->put_MinChannel(This,NewMinChannelVal)
#define IAnalogTVTuningSpace_get_MaxChannel(This,MaxChannelVal) (This)->lpVtbl->get_MaxChannel(This,MaxChannelVal)
#define IAnalogTVTuningSpace_put_MaxChannel(This,NewMaxChannelVal) (This)->lpVtbl->put_MaxChannel(This,NewMaxChannelVal)
#define IAnalogTVTuningSpace_get_InputType(This,InputTypeVal) (This)->lpVtbl->get_InputType(This,InputTypeVal)
#define IAnalogTVTuningSpace_put_InputType(This,NewInputTypeVal) (This)->lpVtbl->put_InputType(This,NewInputTypeVal)
#define IAnalogTVTuningSpace_get_CountryCode(This,CountryCodeVal) (This)->lpVtbl->get_CountryCode(This,CountryCodeVal)
#define IAnalogTVTuningSpace_put_CountryCode(This,NewCountryCodeVal) (This)->lpVtbl->put_CountryCode(This,NewCountryCodeVal)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IAnalogTVTuningSpace_QueryInterface(IAnalogTVTuningSpace* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IAnalogTVTuningSpace_AddRef(IAnalogTVTuningSpace* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IAnalogTVTuningSpace_Release(IAnalogTVTuningSpace* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IAnalogTVTuningSpace_GetTypeInfoCount(IAnalogTVTuningSpace* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IAnalogTVTuningSpace_GetTypeInfo(IAnalogTVTuningSpace* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IAnalogTVTuningSpace_GetIDsOfNames(IAnalogTVTuningSpace* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IAnalogTVTuningSpace_Invoke(IAnalogTVTuningSpace* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ITuningSpace methods ***/
static FORCEINLINE HRESULT IAnalogTVTuningSpace_get_UniqueName(IAnalogTVTuningSpace* This,BSTR *Name) {
    return This->lpVtbl->get_UniqueName(This,Name);
}
static FORCEINLINE HRESULT IAnalogTVTuningSpace_put_UniqueName(IAnalogTVTuningSpace* This,BSTR Name) {
    return This->lpVtbl->put_UniqueName(This,Name);
}
static FORCEINLINE HRESULT IAnalogTVTuningSpace_get_FriendlyName(IAnalogTVTuningSpace* This,BSTR *Name) {
    return This->lpVtbl->get_FriendlyName(This,Name);
}
static FORCEINLINE HRESULT IAnalogTVTuningSpace_put_FriendlyName(IAnalogTVTuningSpace* This,BSTR Name) {
    return This->lpVtbl->put_FriendlyName(This,Name);
}
static FORCEINLINE HRESULT IAnalogTVTuningSpace_get_CLSID(IAnalogTVTuningSpace* This,BSTR *SpaceCLSID) {
    return This->lpVtbl->get_CLSID(This,SpaceCLSID);
}
static FORCEINLINE HRESULT IAnalogTVTuningSpace_get_NetworkType(IAnalogTVTuningSpace* This,BSTR *NetworkTypeGuid) {
    return This->lpVtbl->get_NetworkType(This,NetworkTypeGuid);
}
static FORCEINLINE HRESULT IAnalogTVTuningSpace_put_NetworkType(IAnalogTVTuningSpace* This,BSTR NetworkTypeGuid) {
    return This->lpVtbl->put_NetworkType(This,NetworkTypeGuid);
}
static FORCEINLINE HRESULT IAnalogTVTuningSpace_get__NetworkType(IAnalogTVTuningSpace* This,GUID *NetworkTypeGuid) {
    return This->lpVtbl->get__NetworkType(This,NetworkTypeGuid);
}
static FORCEINLINE HRESULT IAnalogTVTuningSpace_put__NetworkType(IAnalogTVTuningSpace* This,REFCLSID NetworkTypeGuid) {
    return This->lpVtbl->put__NetworkType(This,NetworkTypeGuid);
}
static FORCEINLINE HRESULT IAnalogTVTuningSpace_CreateTuneRequest(IAnalogTVTuningSpace* This,ITuneRequest **TuneRequest) {
    return This->lpVtbl->CreateTuneRequest(This,TuneRequest);
}
static FORCEINLINE HRESULT IAnalogTVTuningSpace_EnumCategoryGUIDs(IAnalogTVTuningSpace* This,IEnumGUID **ppEnum) {
    return This->lpVtbl->EnumCategoryGUIDs(This,ppEnum);
}
static FORCEINLINE HRESULT IAnalogTVTuningSpace_EnumDeviceMonikers(IAnalogTVTuningSpace* This,IEnumMoniker **ppEnum) {
    return This->lpVtbl->EnumDeviceMonikers(This,ppEnum);
}
static FORCEINLINE HRESULT IAnalogTVTuningSpace_get_DefaultPreferredComponentTypes(IAnalogTVTuningSpace* This,IComponentTypes **ComponentTypes) {
    return This->lpVtbl->get_DefaultPreferredComponentTypes(This,ComponentTypes);
}
static FORCEINLINE HRESULT IAnalogTVTuningSpace_put_DefaultPreferredComponentTypes(IAnalogTVTuningSpace* This,IComponentTypes *NewComponentTypes) {
    return This->lpVtbl->put_DefaultPreferredComponentTypes(This,NewComponentTypes);
}
static FORCEINLINE HRESULT IAnalogTVTuningSpace_get_FrequencyMapping(IAnalogTVTuningSpace* This,BSTR *pMapping) {
    return This->lpVtbl->get_FrequencyMapping(This,pMapping);
}
static FORCEINLINE HRESULT IAnalogTVTuningSpace_put_FrequencyMapping(IAnalogTVTuningSpace* This,BSTR Mapping) {
    return This->lpVtbl->put_FrequencyMapping(This,Mapping);
}
static FORCEINLINE HRESULT IAnalogTVTuningSpace_get_DefaultLocator(IAnalogTVTuningSpace* This,ILocator **LocatorVal) {
    return This->lpVtbl->get_DefaultLocator(This,LocatorVal);
}
static FORCEINLINE HRESULT IAnalogTVTuningSpace_put_DefaultLocator(IAnalogTVTuningSpace* This,ILocator *LocatorVal) {
    return This->lpVtbl->put_DefaultLocator(This,LocatorVal);
}
static FORCEINLINE HRESULT IAnalogTVTuningSpace_Clone(IAnalogTVTuningSpace* This,ITuningSpace **NewTS) {
    return This->lpVtbl->Clone(This,NewTS);
}
/*** IAnalogTVTuningSpace methods ***/
static FORCEINLINE HRESULT IAnalogTVTuningSpace_get_MinChannel(IAnalogTVTuningSpace* This,LONG *MinChannelVal) {
    return This->lpVtbl->get_MinChannel(This,MinChannelVal);
}
static FORCEINLINE HRESULT IAnalogTVTuningSpace_put_MinChannel(IAnalogTVTuningSpace* This,LONG NewMinChannelVal) {
    return This->lpVtbl->put_MinChannel(This,NewMinChannelVal);
}
static FORCEINLINE HRESULT IAnalogTVTuningSpace_get_MaxChannel(IAnalogTVTuningSpace* This,LONG *MaxChannelVal) {
    return This->lpVtbl->get_MaxChannel(This,MaxChannelVal);
}
static FORCEINLINE HRESULT IAnalogTVTuningSpace_put_MaxChannel(IAnalogTVTuningSpace* This,LONG NewMaxChannelVal) {
    return This->lpVtbl->put_MaxChannel(This,NewMaxChannelVal);
}
static FORCEINLINE HRESULT IAnalogTVTuningSpace_get_InputType(IAnalogTVTuningSpace* This,TunerInputType *InputTypeVal) {
    return This->lpVtbl->get_InputType(This,InputTypeVal);
}
static FORCEINLINE HRESULT IAnalogTVTuningSpace_put_InputType(IAnalogTVTuningSpace* This,TunerInputType NewInputTypeVal) {
    return This->lpVtbl->put_InputType(This,NewInputTypeVal);
}
static FORCEINLINE HRESULT IAnalogTVTuningSpace_get_CountryCode(IAnalogTVTuningSpace* This,LONG *CountryCodeVal) {
    return This->lpVtbl->get_CountryCode(This,CountryCodeVal);
}
static FORCEINLINE HRESULT IAnalogTVTuningSpace_put_CountryCode(IAnalogTVTuningSpace* This,LONG NewCountryCodeVal) {
    return This->lpVtbl->put_CountryCode(This,NewCountryCodeVal);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IAnalogTVTuningSpace_get_MinChannel_Proxy(
    IAnalogTVTuningSpace* This,
    LONG *MinChannelVal);
void __RPC_STUB IAnalogTVTuningSpace_get_MinChannel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAnalogTVTuningSpace_put_MinChannel_Proxy(
    IAnalogTVTuningSpace* This,
    LONG NewMinChannelVal);
void __RPC_STUB IAnalogTVTuningSpace_put_MinChannel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAnalogTVTuningSpace_get_MaxChannel_Proxy(
    IAnalogTVTuningSpace* This,
    LONG *MaxChannelVal);
void __RPC_STUB IAnalogTVTuningSpace_get_MaxChannel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAnalogTVTuningSpace_put_MaxChannel_Proxy(
    IAnalogTVTuningSpace* This,
    LONG NewMaxChannelVal);
void __RPC_STUB IAnalogTVTuningSpace_put_MaxChannel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAnalogTVTuningSpace_get_InputType_Proxy(
    IAnalogTVTuningSpace* This,
    TunerInputType *InputTypeVal);
void __RPC_STUB IAnalogTVTuningSpace_get_InputType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAnalogTVTuningSpace_put_InputType_Proxy(
    IAnalogTVTuningSpace* This,
    TunerInputType NewInputTypeVal);
void __RPC_STUB IAnalogTVTuningSpace_put_InputType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAnalogTVTuningSpace_get_CountryCode_Proxy(
    IAnalogTVTuningSpace* This,
    LONG *CountryCodeVal);
void __RPC_STUB IAnalogTVTuningSpace_get_CountryCode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAnalogTVTuningSpace_put_CountryCode_Proxy(
    IAnalogTVTuningSpace* This,
    LONG NewCountryCodeVal);
void __RPC_STUB IAnalogTVTuningSpace_put_CountryCode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IAnalogTVTuningSpace_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IATSCTuningSpace interface
 */
#ifndef __IATSCTuningSpace_INTERFACE_DEFINED__
#define __IATSCTuningSpace_INTERFACE_DEFINED__

DEFINE_GUID(IID_IATSCTuningSpace, 0x0369b4e2, 0x45b6, 0x11d3, 0xb6,0x50, 0x00,0xc0,0x4f,0x79,0x49,0x8e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("0369b4e2-45b6-11d3-b650-00c04f79498e")
IATSCTuningSpace : public IAnalogTVTuningSpace
{
    virtual HRESULT STDMETHODCALLTYPE get_MinMinorChannel(
        LONG *MinMinorChannelVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_MinMinorChannel(
        LONG NewMinMinorChannelVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_MaxMinorChannel(
        LONG *MaxMinorChannelVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_MaxMinorChannel(
        LONG NewMaxMinorChannelVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_MinPhysicalChannel(
        LONG *MinPhysicalChannelVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_MinPhysicalChannel(
        LONG NewMinPhysicalChannelVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_MaxPhysicalChannel(
        LONG *MaxPhysicalChannelVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_MaxPhysicalChannel(
        LONG NewMaxPhysicalChannelVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IATSCTuningSpace, 0x0369b4e2, 0x45b6, 0x11d3, 0xb6,0x50, 0x00,0xc0,0x4f,0x79,0x49,0x8e)
#endif
#else
typedef struct IATSCTuningSpaceVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IATSCTuningSpace* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IATSCTuningSpace* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IATSCTuningSpace* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IATSCTuningSpace* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ITuningSpace methods ***/
    HRESULT (STDMETHODCALLTYPE *get_UniqueName)(
        IATSCTuningSpace* This,
        BSTR *Name);

    HRESULT (STDMETHODCALLTYPE *put_UniqueName)(
        IATSCTuningSpace* This,
        BSTR Name);

    HRESULT (STDMETHODCALLTYPE *get_FriendlyName)(
        IATSCTuningSpace* This,
        BSTR *Name);

    HRESULT (STDMETHODCALLTYPE *put_FriendlyName)(
        IATSCTuningSpace* This,
        BSTR Name);

    HRESULT (STDMETHODCALLTYPE *get_CLSID)(
        IATSCTuningSpace* This,
        BSTR *SpaceCLSID);

    HRESULT (STDMETHODCALLTYPE *get_NetworkType)(
        IATSCTuningSpace* This,
        BSTR *NetworkTypeGuid);

    HRESULT (STDMETHODCALLTYPE *put_NetworkType)(
        IATSCTuningSpace* This,
        BSTR NetworkTypeGuid);

    HRESULT (STDMETHODCALLTYPE *get__NetworkType)(
        IATSCTuningSpace* This,
        GUID *NetworkTypeGuid);

    HRESULT (STDMETHODCALLTYPE *put__NetworkType)(
        IATSCTuningSpace* This,
        REFCLSID NetworkTypeGuid);

    HRESULT (STDMETHODCALLTYPE *CreateTuneRequest)(
        IATSCTuningSpace* This,
        ITuneRequest **TuneRequest);

    HRESULT (STDMETHODCALLTYPE *EnumCategoryGUIDs)(
        IATSCTuningSpace* This,
        IEnumGUID **ppEnum);

    HRESULT (STDMETHODCALLTYPE *EnumDeviceMonikers)(
        IATSCTuningSpace* This,
        IEnumMoniker **ppEnum);

    HRESULT (STDMETHODCALLTYPE *get_DefaultPreferredComponentTypes)(
        IATSCTuningSpace* This,
        IComponentTypes **ComponentTypes);

    HRESULT (STDMETHODCALLTYPE *put_DefaultPreferredComponentTypes)(
        IATSCTuningSpace* This,
        IComponentTypes *NewComponentTypes);

    HRESULT (STDMETHODCALLTYPE *get_FrequencyMapping)(
        IATSCTuningSpace* This,
        BSTR *pMapping);

    HRESULT (STDMETHODCALLTYPE *put_FrequencyMapping)(
        IATSCTuningSpace* This,
        BSTR Mapping);

    HRESULT (STDMETHODCALLTYPE *get_DefaultLocator)(
        IATSCTuningSpace* This,
        ILocator **LocatorVal);

    HRESULT (STDMETHODCALLTYPE *put_DefaultLocator)(
        IATSCTuningSpace* This,
        ILocator *LocatorVal);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IATSCTuningSpace* This,
        ITuningSpace **NewTS);

    /*** IAnalogTVTuningSpace methods ***/
    HRESULT (STDMETHODCALLTYPE *get_MinChannel)(
        IATSCTuningSpace* This,
        LONG *MinChannelVal);

    HRESULT (STDMETHODCALLTYPE *put_MinChannel)(
        IATSCTuningSpace* This,
        LONG NewMinChannelVal);

    HRESULT (STDMETHODCALLTYPE *get_MaxChannel)(
        IATSCTuningSpace* This,
        LONG *MaxChannelVal);

    HRESULT (STDMETHODCALLTYPE *put_MaxChannel)(
        IATSCTuningSpace* This,
        LONG NewMaxChannelVal);

    HRESULT (STDMETHODCALLTYPE *get_InputType)(
        IATSCTuningSpace* This,
        TunerInputType *InputTypeVal);

    HRESULT (STDMETHODCALLTYPE *put_InputType)(
        IATSCTuningSpace* This,
        TunerInputType NewInputTypeVal);

    HRESULT (STDMETHODCALLTYPE *get_CountryCode)(
        IATSCTuningSpace* This,
        LONG *CountryCodeVal);

    HRESULT (STDMETHODCALLTYPE *put_CountryCode)(
        IATSCTuningSpace* This,
        LONG NewCountryCodeVal);

    /*** IATSCTuningSpace methods ***/
    HRESULT (STDMETHODCALLTYPE *get_MinMinorChannel)(
        IATSCTuningSpace* This,
        LONG *MinMinorChannelVal);

    HRESULT (STDMETHODCALLTYPE *put_MinMinorChannel)(
        IATSCTuningSpace* This,
        LONG NewMinMinorChannelVal);

    HRESULT (STDMETHODCALLTYPE *get_MaxMinorChannel)(
        IATSCTuningSpace* This,
        LONG *MaxMinorChannelVal);

    HRESULT (STDMETHODCALLTYPE *put_MaxMinorChannel)(
        IATSCTuningSpace* This,
        LONG NewMaxMinorChannelVal);

    HRESULT (STDMETHODCALLTYPE *get_MinPhysicalChannel)(
        IATSCTuningSpace* This,
        LONG *MinPhysicalChannelVal);

    HRESULT (STDMETHODCALLTYPE *put_MinPhysicalChannel)(
        IATSCTuningSpace* This,
        LONG NewMinPhysicalChannelVal);

    HRESULT (STDMETHODCALLTYPE *get_MaxPhysicalChannel)(
        IATSCTuningSpace* This,
        LONG *MaxPhysicalChannelVal);

    HRESULT (STDMETHODCALLTYPE *put_MaxPhysicalChannel)(
        IATSCTuningSpace* This,
        LONG NewMaxPhysicalChannelVal);

    END_INTERFACE
} IATSCTuningSpaceVtbl;
interface IATSCTuningSpace {
    CONST_VTBL IATSCTuningSpaceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IATSCTuningSpace_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IATSCTuningSpace_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IATSCTuningSpace_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IATSCTuningSpace_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IATSCTuningSpace_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IATSCTuningSpace_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IATSCTuningSpace_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ITuningSpace methods ***/
#define IATSCTuningSpace_get_UniqueName(This,Name) (This)->lpVtbl->get_UniqueName(This,Name)
#define IATSCTuningSpace_put_UniqueName(This,Name) (This)->lpVtbl->put_UniqueName(This,Name)
#define IATSCTuningSpace_get_FriendlyName(This,Name) (This)->lpVtbl->get_FriendlyName(This,Name)
#define IATSCTuningSpace_put_FriendlyName(This,Name) (This)->lpVtbl->put_FriendlyName(This,Name)
#define IATSCTuningSpace_get_CLSID(This,SpaceCLSID) (This)->lpVtbl->get_CLSID(This,SpaceCLSID)
#define IATSCTuningSpace_get_NetworkType(This,NetworkTypeGuid) (This)->lpVtbl->get_NetworkType(This,NetworkTypeGuid)
#define IATSCTuningSpace_put_NetworkType(This,NetworkTypeGuid) (This)->lpVtbl->put_NetworkType(This,NetworkTypeGuid)
#define IATSCTuningSpace_get__NetworkType(This,NetworkTypeGuid) (This)->lpVtbl->get__NetworkType(This,NetworkTypeGuid)
#define IATSCTuningSpace_put__NetworkType(This,NetworkTypeGuid) (This)->lpVtbl->put__NetworkType(This,NetworkTypeGuid)
#define IATSCTuningSpace_CreateTuneRequest(This,TuneRequest) (This)->lpVtbl->CreateTuneRequest(This,TuneRequest)
#define IATSCTuningSpace_EnumCategoryGUIDs(This,ppEnum) (This)->lpVtbl->EnumCategoryGUIDs(This,ppEnum)
#define IATSCTuningSpace_EnumDeviceMonikers(This,ppEnum) (This)->lpVtbl->EnumDeviceMonikers(This,ppEnum)
#define IATSCTuningSpace_get_DefaultPreferredComponentTypes(This,ComponentTypes) (This)->lpVtbl->get_DefaultPreferredComponentTypes(This,ComponentTypes)
#define IATSCTuningSpace_put_DefaultPreferredComponentTypes(This,NewComponentTypes) (This)->lpVtbl->put_DefaultPreferredComponentTypes(This,NewComponentTypes)
#define IATSCTuningSpace_get_FrequencyMapping(This,pMapping) (This)->lpVtbl->get_FrequencyMapping(This,pMapping)
#define IATSCTuningSpace_put_FrequencyMapping(This,Mapping) (This)->lpVtbl->put_FrequencyMapping(This,Mapping)
#define IATSCTuningSpace_get_DefaultLocator(This,LocatorVal) (This)->lpVtbl->get_DefaultLocator(This,LocatorVal)
#define IATSCTuningSpace_put_DefaultLocator(This,LocatorVal) (This)->lpVtbl->put_DefaultLocator(This,LocatorVal)
#define IATSCTuningSpace_Clone(This,NewTS) (This)->lpVtbl->Clone(This,NewTS)
/*** IAnalogTVTuningSpace methods ***/
#define IATSCTuningSpace_get_MinChannel(This,MinChannelVal) (This)->lpVtbl->get_MinChannel(This,MinChannelVal)
#define IATSCTuningSpace_put_MinChannel(This,NewMinChannelVal) (This)->lpVtbl->put_MinChannel(This,NewMinChannelVal)
#define IATSCTuningSpace_get_MaxChannel(This,MaxChannelVal) (This)->lpVtbl->get_MaxChannel(This,MaxChannelVal)
#define IATSCTuningSpace_put_MaxChannel(This,NewMaxChannelVal) (This)->lpVtbl->put_MaxChannel(This,NewMaxChannelVal)
#define IATSCTuningSpace_get_InputType(This,InputTypeVal) (This)->lpVtbl->get_InputType(This,InputTypeVal)
#define IATSCTuningSpace_put_InputType(This,NewInputTypeVal) (This)->lpVtbl->put_InputType(This,NewInputTypeVal)
#define IATSCTuningSpace_get_CountryCode(This,CountryCodeVal) (This)->lpVtbl->get_CountryCode(This,CountryCodeVal)
#define IATSCTuningSpace_put_CountryCode(This,NewCountryCodeVal) (This)->lpVtbl->put_CountryCode(This,NewCountryCodeVal)
/*** IATSCTuningSpace methods ***/
#define IATSCTuningSpace_get_MinMinorChannel(This,MinMinorChannelVal) (This)->lpVtbl->get_MinMinorChannel(This,MinMinorChannelVal)
#define IATSCTuningSpace_put_MinMinorChannel(This,NewMinMinorChannelVal) (This)->lpVtbl->put_MinMinorChannel(This,NewMinMinorChannelVal)
#define IATSCTuningSpace_get_MaxMinorChannel(This,MaxMinorChannelVal) (This)->lpVtbl->get_MaxMinorChannel(This,MaxMinorChannelVal)
#define IATSCTuningSpace_put_MaxMinorChannel(This,NewMaxMinorChannelVal) (This)->lpVtbl->put_MaxMinorChannel(This,NewMaxMinorChannelVal)
#define IATSCTuningSpace_get_MinPhysicalChannel(This,MinPhysicalChannelVal) (This)->lpVtbl->get_MinPhysicalChannel(This,MinPhysicalChannelVal)
#define IATSCTuningSpace_put_MinPhysicalChannel(This,NewMinPhysicalChannelVal) (This)->lpVtbl->put_MinPhysicalChannel(This,NewMinPhysicalChannelVal)
#define IATSCTuningSpace_get_MaxPhysicalChannel(This,MaxPhysicalChannelVal) (This)->lpVtbl->get_MaxPhysicalChannel(This,MaxPhysicalChannelVal)
#define IATSCTuningSpace_put_MaxPhysicalChannel(This,NewMaxPhysicalChannelVal) (This)->lpVtbl->put_MaxPhysicalChannel(This,NewMaxPhysicalChannelVal)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IATSCTuningSpace_QueryInterface(IATSCTuningSpace* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IATSCTuningSpace_AddRef(IATSCTuningSpace* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IATSCTuningSpace_Release(IATSCTuningSpace* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IATSCTuningSpace_GetTypeInfoCount(IATSCTuningSpace* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IATSCTuningSpace_GetTypeInfo(IATSCTuningSpace* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IATSCTuningSpace_GetIDsOfNames(IATSCTuningSpace* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IATSCTuningSpace_Invoke(IATSCTuningSpace* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ITuningSpace methods ***/
static FORCEINLINE HRESULT IATSCTuningSpace_get_UniqueName(IATSCTuningSpace* This,BSTR *Name) {
    return This->lpVtbl->get_UniqueName(This,Name);
}
static FORCEINLINE HRESULT IATSCTuningSpace_put_UniqueName(IATSCTuningSpace* This,BSTR Name) {
    return This->lpVtbl->put_UniqueName(This,Name);
}
static FORCEINLINE HRESULT IATSCTuningSpace_get_FriendlyName(IATSCTuningSpace* This,BSTR *Name) {
    return This->lpVtbl->get_FriendlyName(This,Name);
}
static FORCEINLINE HRESULT IATSCTuningSpace_put_FriendlyName(IATSCTuningSpace* This,BSTR Name) {
    return This->lpVtbl->put_FriendlyName(This,Name);
}
static FORCEINLINE HRESULT IATSCTuningSpace_get_CLSID(IATSCTuningSpace* This,BSTR *SpaceCLSID) {
    return This->lpVtbl->get_CLSID(This,SpaceCLSID);
}
static FORCEINLINE HRESULT IATSCTuningSpace_get_NetworkType(IATSCTuningSpace* This,BSTR *NetworkTypeGuid) {
    return This->lpVtbl->get_NetworkType(This,NetworkTypeGuid);
}
static FORCEINLINE HRESULT IATSCTuningSpace_put_NetworkType(IATSCTuningSpace* This,BSTR NetworkTypeGuid) {
    return This->lpVtbl->put_NetworkType(This,NetworkTypeGuid);
}
static FORCEINLINE HRESULT IATSCTuningSpace_get__NetworkType(IATSCTuningSpace* This,GUID *NetworkTypeGuid) {
    return This->lpVtbl->get__NetworkType(This,NetworkTypeGuid);
}
static FORCEINLINE HRESULT IATSCTuningSpace_put__NetworkType(IATSCTuningSpace* This,REFCLSID NetworkTypeGuid) {
    return This->lpVtbl->put__NetworkType(This,NetworkTypeGuid);
}
static FORCEINLINE HRESULT IATSCTuningSpace_CreateTuneRequest(IATSCTuningSpace* This,ITuneRequest **TuneRequest) {
    return This->lpVtbl->CreateTuneRequest(This,TuneRequest);
}
static FORCEINLINE HRESULT IATSCTuningSpace_EnumCategoryGUIDs(IATSCTuningSpace* This,IEnumGUID **ppEnum) {
    return This->lpVtbl->EnumCategoryGUIDs(This,ppEnum);
}
static FORCEINLINE HRESULT IATSCTuningSpace_EnumDeviceMonikers(IATSCTuningSpace* This,IEnumMoniker **ppEnum) {
    return This->lpVtbl->EnumDeviceMonikers(This,ppEnum);
}
static FORCEINLINE HRESULT IATSCTuningSpace_get_DefaultPreferredComponentTypes(IATSCTuningSpace* This,IComponentTypes **ComponentTypes) {
    return This->lpVtbl->get_DefaultPreferredComponentTypes(This,ComponentTypes);
}
static FORCEINLINE HRESULT IATSCTuningSpace_put_DefaultPreferredComponentTypes(IATSCTuningSpace* This,IComponentTypes *NewComponentTypes) {
    return This->lpVtbl->put_DefaultPreferredComponentTypes(This,NewComponentTypes);
}
static FORCEINLINE HRESULT IATSCTuningSpace_get_FrequencyMapping(IATSCTuningSpace* This,BSTR *pMapping) {
    return This->lpVtbl->get_FrequencyMapping(This,pMapping);
}
static FORCEINLINE HRESULT IATSCTuningSpace_put_FrequencyMapping(IATSCTuningSpace* This,BSTR Mapping) {
    return This->lpVtbl->put_FrequencyMapping(This,Mapping);
}
static FORCEINLINE HRESULT IATSCTuningSpace_get_DefaultLocator(IATSCTuningSpace* This,ILocator **LocatorVal) {
    return This->lpVtbl->get_DefaultLocator(This,LocatorVal);
}
static FORCEINLINE HRESULT IATSCTuningSpace_put_DefaultLocator(IATSCTuningSpace* This,ILocator *LocatorVal) {
    return This->lpVtbl->put_DefaultLocator(This,LocatorVal);
}
static FORCEINLINE HRESULT IATSCTuningSpace_Clone(IATSCTuningSpace* This,ITuningSpace **NewTS) {
    return This->lpVtbl->Clone(This,NewTS);
}
/*** IAnalogTVTuningSpace methods ***/
static FORCEINLINE HRESULT IATSCTuningSpace_get_MinChannel(IATSCTuningSpace* This,LONG *MinChannelVal) {
    return This->lpVtbl->get_MinChannel(This,MinChannelVal);
}
static FORCEINLINE HRESULT IATSCTuningSpace_put_MinChannel(IATSCTuningSpace* This,LONG NewMinChannelVal) {
    return This->lpVtbl->put_MinChannel(This,NewMinChannelVal);
}
static FORCEINLINE HRESULT IATSCTuningSpace_get_MaxChannel(IATSCTuningSpace* This,LONG *MaxChannelVal) {
    return This->lpVtbl->get_MaxChannel(This,MaxChannelVal);
}
static FORCEINLINE HRESULT IATSCTuningSpace_put_MaxChannel(IATSCTuningSpace* This,LONG NewMaxChannelVal) {
    return This->lpVtbl->put_MaxChannel(This,NewMaxChannelVal);
}
static FORCEINLINE HRESULT IATSCTuningSpace_get_InputType(IATSCTuningSpace* This,TunerInputType *InputTypeVal) {
    return This->lpVtbl->get_InputType(This,InputTypeVal);
}
static FORCEINLINE HRESULT IATSCTuningSpace_put_InputType(IATSCTuningSpace* This,TunerInputType NewInputTypeVal) {
    return This->lpVtbl->put_InputType(This,NewInputTypeVal);
}
static FORCEINLINE HRESULT IATSCTuningSpace_get_CountryCode(IATSCTuningSpace* This,LONG *CountryCodeVal) {
    return This->lpVtbl->get_CountryCode(This,CountryCodeVal);
}
static FORCEINLINE HRESULT IATSCTuningSpace_put_CountryCode(IATSCTuningSpace* This,LONG NewCountryCodeVal) {
    return This->lpVtbl->put_CountryCode(This,NewCountryCodeVal);
}
/*** IATSCTuningSpace methods ***/
static FORCEINLINE HRESULT IATSCTuningSpace_get_MinMinorChannel(IATSCTuningSpace* This,LONG *MinMinorChannelVal) {
    return This->lpVtbl->get_MinMinorChannel(This,MinMinorChannelVal);
}
static FORCEINLINE HRESULT IATSCTuningSpace_put_MinMinorChannel(IATSCTuningSpace* This,LONG NewMinMinorChannelVal) {
    return This->lpVtbl->put_MinMinorChannel(This,NewMinMinorChannelVal);
}
static FORCEINLINE HRESULT IATSCTuningSpace_get_MaxMinorChannel(IATSCTuningSpace* This,LONG *MaxMinorChannelVal) {
    return This->lpVtbl->get_MaxMinorChannel(This,MaxMinorChannelVal);
}
static FORCEINLINE HRESULT IATSCTuningSpace_put_MaxMinorChannel(IATSCTuningSpace* This,LONG NewMaxMinorChannelVal) {
    return This->lpVtbl->put_MaxMinorChannel(This,NewMaxMinorChannelVal);
}
static FORCEINLINE HRESULT IATSCTuningSpace_get_MinPhysicalChannel(IATSCTuningSpace* This,LONG *MinPhysicalChannelVal) {
    return This->lpVtbl->get_MinPhysicalChannel(This,MinPhysicalChannelVal);
}
static FORCEINLINE HRESULT IATSCTuningSpace_put_MinPhysicalChannel(IATSCTuningSpace* This,LONG NewMinPhysicalChannelVal) {
    return This->lpVtbl->put_MinPhysicalChannel(This,NewMinPhysicalChannelVal);
}
static FORCEINLINE HRESULT IATSCTuningSpace_get_MaxPhysicalChannel(IATSCTuningSpace* This,LONG *MaxPhysicalChannelVal) {
    return This->lpVtbl->get_MaxPhysicalChannel(This,MaxPhysicalChannelVal);
}
static FORCEINLINE HRESULT IATSCTuningSpace_put_MaxPhysicalChannel(IATSCTuningSpace* This,LONG NewMaxPhysicalChannelVal) {
    return This->lpVtbl->put_MaxPhysicalChannel(This,NewMaxPhysicalChannelVal);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IATSCTuningSpace_get_MinMinorChannel_Proxy(
    IATSCTuningSpace* This,
    LONG *MinMinorChannelVal);
void __RPC_STUB IATSCTuningSpace_get_MinMinorChannel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IATSCTuningSpace_put_MinMinorChannel_Proxy(
    IATSCTuningSpace* This,
    LONG NewMinMinorChannelVal);
void __RPC_STUB IATSCTuningSpace_put_MinMinorChannel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IATSCTuningSpace_get_MaxMinorChannel_Proxy(
    IATSCTuningSpace* This,
    LONG *MaxMinorChannelVal);
void __RPC_STUB IATSCTuningSpace_get_MaxMinorChannel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IATSCTuningSpace_put_MaxMinorChannel_Proxy(
    IATSCTuningSpace* This,
    LONG NewMaxMinorChannelVal);
void __RPC_STUB IATSCTuningSpace_put_MaxMinorChannel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IATSCTuningSpace_get_MinPhysicalChannel_Proxy(
    IATSCTuningSpace* This,
    LONG *MinPhysicalChannelVal);
void __RPC_STUB IATSCTuningSpace_get_MinPhysicalChannel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IATSCTuningSpace_put_MinPhysicalChannel_Proxy(
    IATSCTuningSpace* This,
    LONG NewMinPhysicalChannelVal);
void __RPC_STUB IATSCTuningSpace_put_MinPhysicalChannel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IATSCTuningSpace_get_MaxPhysicalChannel_Proxy(
    IATSCTuningSpace* This,
    LONG *MaxPhysicalChannelVal);
void __RPC_STUB IATSCTuningSpace_get_MaxPhysicalChannel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IATSCTuningSpace_put_MaxPhysicalChannel_Proxy(
    IATSCTuningSpace* This,
    LONG NewMaxPhysicalChannelVal);
void __RPC_STUB IATSCTuningSpace_put_MaxPhysicalChannel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IATSCTuningSpace_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDigitalCableTuningSpace interface
 */
#ifndef __IDigitalCableTuningSpace_INTERFACE_DEFINED__
#define __IDigitalCableTuningSpace_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDigitalCableTuningSpace, 0x013f9f9c, 0xb449, 0x4ec7, 0xa6,0xd2, 0x9d,0x4f,0x2f,0xc7,0x0a,0xe5);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("013f9f9c-b449-4ec7-a6d2-9d4f2fc70ae5")
IDigitalCableTuningSpace : public IATSCTuningSpace
{
    virtual HRESULT STDMETHODCALLTYPE get_MinMajorChannel(
        LONG *MinMajorChannelVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_MinMajorChannel(
        LONG NewMinMajorChannelVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_MaxMajorChannel(
        LONG *MaxMajorChannelVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_MaxMajorChannel(
        LONG NewMaxMajorChannelVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_MinSourceID(
        LONG *MinSourceIDVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_MinSourceID(
        LONG NewMinSourceIDVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_MaxSourceID(
        LONG *MaxSourceIDVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_MaxSourceID(
        LONG NewMaxSourceIDVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDigitalCableTuningSpace, 0x013f9f9c, 0xb449, 0x4ec7, 0xa6,0xd2, 0x9d,0x4f,0x2f,0xc7,0x0a,0xe5)
#endif
#else
typedef struct IDigitalCableTuningSpaceVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IDigitalCableTuningSpace* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IDigitalCableTuningSpace* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IDigitalCableTuningSpace* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IDigitalCableTuningSpace* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ITuningSpace methods ***/
    HRESULT (STDMETHODCALLTYPE *get_UniqueName)(
        IDigitalCableTuningSpace* This,
        BSTR *Name);

    HRESULT (STDMETHODCALLTYPE *put_UniqueName)(
        IDigitalCableTuningSpace* This,
        BSTR Name);

    HRESULT (STDMETHODCALLTYPE *get_FriendlyName)(
        IDigitalCableTuningSpace* This,
        BSTR *Name);

    HRESULT (STDMETHODCALLTYPE *put_FriendlyName)(
        IDigitalCableTuningSpace* This,
        BSTR Name);

    HRESULT (STDMETHODCALLTYPE *get_CLSID)(
        IDigitalCableTuningSpace* This,
        BSTR *SpaceCLSID);

    HRESULT (STDMETHODCALLTYPE *get_NetworkType)(
        IDigitalCableTuningSpace* This,
        BSTR *NetworkTypeGuid);

    HRESULT (STDMETHODCALLTYPE *put_NetworkType)(
        IDigitalCableTuningSpace* This,
        BSTR NetworkTypeGuid);

    HRESULT (STDMETHODCALLTYPE *get__NetworkType)(
        IDigitalCableTuningSpace* This,
        GUID *NetworkTypeGuid);

    HRESULT (STDMETHODCALLTYPE *put__NetworkType)(
        IDigitalCableTuningSpace* This,
        REFCLSID NetworkTypeGuid);

    HRESULT (STDMETHODCALLTYPE *CreateTuneRequest)(
        IDigitalCableTuningSpace* This,
        ITuneRequest **TuneRequest);

    HRESULT (STDMETHODCALLTYPE *EnumCategoryGUIDs)(
        IDigitalCableTuningSpace* This,
        IEnumGUID **ppEnum);

    HRESULT (STDMETHODCALLTYPE *EnumDeviceMonikers)(
        IDigitalCableTuningSpace* This,
        IEnumMoniker **ppEnum);

    HRESULT (STDMETHODCALLTYPE *get_DefaultPreferredComponentTypes)(
        IDigitalCableTuningSpace* This,
        IComponentTypes **ComponentTypes);

    HRESULT (STDMETHODCALLTYPE *put_DefaultPreferredComponentTypes)(
        IDigitalCableTuningSpace* This,
        IComponentTypes *NewComponentTypes);

    HRESULT (STDMETHODCALLTYPE *get_FrequencyMapping)(
        IDigitalCableTuningSpace* This,
        BSTR *pMapping);

    HRESULT (STDMETHODCALLTYPE *put_FrequencyMapping)(
        IDigitalCableTuningSpace* This,
        BSTR Mapping);

    HRESULT (STDMETHODCALLTYPE *get_DefaultLocator)(
        IDigitalCableTuningSpace* This,
        ILocator **LocatorVal);

    HRESULT (STDMETHODCALLTYPE *put_DefaultLocator)(
        IDigitalCableTuningSpace* This,
        ILocator *LocatorVal);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IDigitalCableTuningSpace* This,
        ITuningSpace **NewTS);

    /*** IAnalogTVTuningSpace methods ***/
    HRESULT (STDMETHODCALLTYPE *get_MinChannel)(
        IDigitalCableTuningSpace* This,
        LONG *MinChannelVal);

    HRESULT (STDMETHODCALLTYPE *put_MinChannel)(
        IDigitalCableTuningSpace* This,
        LONG NewMinChannelVal);

    HRESULT (STDMETHODCALLTYPE *get_MaxChannel)(
        IDigitalCableTuningSpace* This,
        LONG *MaxChannelVal);

    HRESULT (STDMETHODCALLTYPE *put_MaxChannel)(
        IDigitalCableTuningSpace* This,
        LONG NewMaxChannelVal);

    HRESULT (STDMETHODCALLTYPE *get_InputType)(
        IDigitalCableTuningSpace* This,
        TunerInputType *InputTypeVal);

    HRESULT (STDMETHODCALLTYPE *put_InputType)(
        IDigitalCableTuningSpace* This,
        TunerInputType NewInputTypeVal);

    HRESULT (STDMETHODCALLTYPE *get_CountryCode)(
        IDigitalCableTuningSpace* This,
        LONG *CountryCodeVal);

    HRESULT (STDMETHODCALLTYPE *put_CountryCode)(
        IDigitalCableTuningSpace* This,
        LONG NewCountryCodeVal);

    /*** IATSCTuningSpace methods ***/
    HRESULT (STDMETHODCALLTYPE *get_MinMinorChannel)(
        IDigitalCableTuningSpace* This,
        LONG *MinMinorChannelVal);

    HRESULT (STDMETHODCALLTYPE *put_MinMinorChannel)(
        IDigitalCableTuningSpace* This,
        LONG NewMinMinorChannelVal);

    HRESULT (STDMETHODCALLTYPE *get_MaxMinorChannel)(
        IDigitalCableTuningSpace* This,
        LONG *MaxMinorChannelVal);

    HRESULT (STDMETHODCALLTYPE *put_MaxMinorChannel)(
        IDigitalCableTuningSpace* This,
        LONG NewMaxMinorChannelVal);

    HRESULT (STDMETHODCALLTYPE *get_MinPhysicalChannel)(
        IDigitalCableTuningSpace* This,
        LONG *MinPhysicalChannelVal);

    HRESULT (STDMETHODCALLTYPE *put_MinPhysicalChannel)(
        IDigitalCableTuningSpace* This,
        LONG NewMinPhysicalChannelVal);

    HRESULT (STDMETHODCALLTYPE *get_MaxPhysicalChannel)(
        IDigitalCableTuningSpace* This,
        LONG *MaxPhysicalChannelVal);

    HRESULT (STDMETHODCALLTYPE *put_MaxPhysicalChannel)(
        IDigitalCableTuningSpace* This,
        LONG NewMaxPhysicalChannelVal);

    /*** IDigitalCableTuningSpace methods ***/
    HRESULT (STDMETHODCALLTYPE *get_MinMajorChannel)(
        IDigitalCableTuningSpace* This,
        LONG *MinMajorChannelVal);

    HRESULT (STDMETHODCALLTYPE *put_MinMajorChannel)(
        IDigitalCableTuningSpace* This,
        LONG NewMinMajorChannelVal);

    HRESULT (STDMETHODCALLTYPE *get_MaxMajorChannel)(
        IDigitalCableTuningSpace* This,
        LONG *MaxMajorChannelVal);

    HRESULT (STDMETHODCALLTYPE *put_MaxMajorChannel)(
        IDigitalCableTuningSpace* This,
        LONG NewMaxMajorChannelVal);

    HRESULT (STDMETHODCALLTYPE *get_MinSourceID)(
        IDigitalCableTuningSpace* This,
        LONG *MinSourceIDVal);

    HRESULT (STDMETHODCALLTYPE *put_MinSourceID)(
        IDigitalCableTuningSpace* This,
        LONG NewMinSourceIDVal);

    HRESULT (STDMETHODCALLTYPE *get_MaxSourceID)(
        IDigitalCableTuningSpace* This,
        LONG *MaxSourceIDVal);

    HRESULT (STDMETHODCALLTYPE *put_MaxSourceID)(
        IDigitalCableTuningSpace* This,
        LONG NewMaxSourceIDVal);

    END_INTERFACE
} IDigitalCableTuningSpaceVtbl;
interface IDigitalCableTuningSpace {
    CONST_VTBL IDigitalCableTuningSpaceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDigitalCableTuningSpace_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDigitalCableTuningSpace_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDigitalCableTuningSpace_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IDigitalCableTuningSpace_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IDigitalCableTuningSpace_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IDigitalCableTuningSpace_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IDigitalCableTuningSpace_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ITuningSpace methods ***/
#define IDigitalCableTuningSpace_get_UniqueName(This,Name) (This)->lpVtbl->get_UniqueName(This,Name)
#define IDigitalCableTuningSpace_put_UniqueName(This,Name) (This)->lpVtbl->put_UniqueName(This,Name)
#define IDigitalCableTuningSpace_get_FriendlyName(This,Name) (This)->lpVtbl->get_FriendlyName(This,Name)
#define IDigitalCableTuningSpace_put_FriendlyName(This,Name) (This)->lpVtbl->put_FriendlyName(This,Name)
#define IDigitalCableTuningSpace_get_CLSID(This,SpaceCLSID) (This)->lpVtbl->get_CLSID(This,SpaceCLSID)
#define IDigitalCableTuningSpace_get_NetworkType(This,NetworkTypeGuid) (This)->lpVtbl->get_NetworkType(This,NetworkTypeGuid)
#define IDigitalCableTuningSpace_put_NetworkType(This,NetworkTypeGuid) (This)->lpVtbl->put_NetworkType(This,NetworkTypeGuid)
#define IDigitalCableTuningSpace_get__NetworkType(This,NetworkTypeGuid) (This)->lpVtbl->get__NetworkType(This,NetworkTypeGuid)
#define IDigitalCableTuningSpace_put__NetworkType(This,NetworkTypeGuid) (This)->lpVtbl->put__NetworkType(This,NetworkTypeGuid)
#define IDigitalCableTuningSpace_CreateTuneRequest(This,TuneRequest) (This)->lpVtbl->CreateTuneRequest(This,TuneRequest)
#define IDigitalCableTuningSpace_EnumCategoryGUIDs(This,ppEnum) (This)->lpVtbl->EnumCategoryGUIDs(This,ppEnum)
#define IDigitalCableTuningSpace_EnumDeviceMonikers(This,ppEnum) (This)->lpVtbl->EnumDeviceMonikers(This,ppEnum)
#define IDigitalCableTuningSpace_get_DefaultPreferredComponentTypes(This,ComponentTypes) (This)->lpVtbl->get_DefaultPreferredComponentTypes(This,ComponentTypes)
#define IDigitalCableTuningSpace_put_DefaultPreferredComponentTypes(This,NewComponentTypes) (This)->lpVtbl->put_DefaultPreferredComponentTypes(This,NewComponentTypes)
#define IDigitalCableTuningSpace_get_FrequencyMapping(This,pMapping) (This)->lpVtbl->get_FrequencyMapping(This,pMapping)
#define IDigitalCableTuningSpace_put_FrequencyMapping(This,Mapping) (This)->lpVtbl->put_FrequencyMapping(This,Mapping)
#define IDigitalCableTuningSpace_get_DefaultLocator(This,LocatorVal) (This)->lpVtbl->get_DefaultLocator(This,LocatorVal)
#define IDigitalCableTuningSpace_put_DefaultLocator(This,LocatorVal) (This)->lpVtbl->put_DefaultLocator(This,LocatorVal)
#define IDigitalCableTuningSpace_Clone(This,NewTS) (This)->lpVtbl->Clone(This,NewTS)
/*** IAnalogTVTuningSpace methods ***/
#define IDigitalCableTuningSpace_get_MinChannel(This,MinChannelVal) (This)->lpVtbl->get_MinChannel(This,MinChannelVal)
#define IDigitalCableTuningSpace_put_MinChannel(This,NewMinChannelVal) (This)->lpVtbl->put_MinChannel(This,NewMinChannelVal)
#define IDigitalCableTuningSpace_get_MaxChannel(This,MaxChannelVal) (This)->lpVtbl->get_MaxChannel(This,MaxChannelVal)
#define IDigitalCableTuningSpace_put_MaxChannel(This,NewMaxChannelVal) (This)->lpVtbl->put_MaxChannel(This,NewMaxChannelVal)
#define IDigitalCableTuningSpace_get_InputType(This,InputTypeVal) (This)->lpVtbl->get_InputType(This,InputTypeVal)
#define IDigitalCableTuningSpace_put_InputType(This,NewInputTypeVal) (This)->lpVtbl->put_InputType(This,NewInputTypeVal)
#define IDigitalCableTuningSpace_get_CountryCode(This,CountryCodeVal) (This)->lpVtbl->get_CountryCode(This,CountryCodeVal)
#define IDigitalCableTuningSpace_put_CountryCode(This,NewCountryCodeVal) (This)->lpVtbl->put_CountryCode(This,NewCountryCodeVal)
/*** IATSCTuningSpace methods ***/
#define IDigitalCableTuningSpace_get_MinMinorChannel(This,MinMinorChannelVal) (This)->lpVtbl->get_MinMinorChannel(This,MinMinorChannelVal)
#define IDigitalCableTuningSpace_put_MinMinorChannel(This,NewMinMinorChannelVal) (This)->lpVtbl->put_MinMinorChannel(This,NewMinMinorChannelVal)
#define IDigitalCableTuningSpace_get_MaxMinorChannel(This,MaxMinorChannelVal) (This)->lpVtbl->get_MaxMinorChannel(This,MaxMinorChannelVal)
#define IDigitalCableTuningSpace_put_MaxMinorChannel(This,NewMaxMinorChannelVal) (This)->lpVtbl->put_MaxMinorChannel(This,NewMaxMinorChannelVal)
#define IDigitalCableTuningSpace_get_MinPhysicalChannel(This,MinPhysicalChannelVal) (This)->lpVtbl->get_MinPhysicalChannel(This,MinPhysicalChannelVal)
#define IDigitalCableTuningSpace_put_MinPhysicalChannel(This,NewMinPhysicalChannelVal) (This)->lpVtbl->put_MinPhysicalChannel(This,NewMinPhysicalChannelVal)
#define IDigitalCableTuningSpace_get_MaxPhysicalChannel(This,MaxPhysicalChannelVal) (This)->lpVtbl->get_MaxPhysicalChannel(This,MaxPhysicalChannelVal)
#define IDigitalCableTuningSpace_put_MaxPhysicalChannel(This,NewMaxPhysicalChannelVal) (This)->lpVtbl->put_MaxPhysicalChannel(This,NewMaxPhysicalChannelVal)
/*** IDigitalCableTuningSpace methods ***/
#define IDigitalCableTuningSpace_get_MinMajorChannel(This,MinMajorChannelVal) (This)->lpVtbl->get_MinMajorChannel(This,MinMajorChannelVal)
#define IDigitalCableTuningSpace_put_MinMajorChannel(This,NewMinMajorChannelVal) (This)->lpVtbl->put_MinMajorChannel(This,NewMinMajorChannelVal)
#define IDigitalCableTuningSpace_get_MaxMajorChannel(This,MaxMajorChannelVal) (This)->lpVtbl->get_MaxMajorChannel(This,MaxMajorChannelVal)
#define IDigitalCableTuningSpace_put_MaxMajorChannel(This,NewMaxMajorChannelVal) (This)->lpVtbl->put_MaxMajorChannel(This,NewMaxMajorChannelVal)
#define IDigitalCableTuningSpace_get_MinSourceID(This,MinSourceIDVal) (This)->lpVtbl->get_MinSourceID(This,MinSourceIDVal)
#define IDigitalCableTuningSpace_put_MinSourceID(This,NewMinSourceIDVal) (This)->lpVtbl->put_MinSourceID(This,NewMinSourceIDVal)
#define IDigitalCableTuningSpace_get_MaxSourceID(This,MaxSourceIDVal) (This)->lpVtbl->get_MaxSourceID(This,MaxSourceIDVal)
#define IDigitalCableTuningSpace_put_MaxSourceID(This,NewMaxSourceIDVal) (This)->lpVtbl->put_MaxSourceID(This,NewMaxSourceIDVal)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDigitalCableTuningSpace_QueryInterface(IDigitalCableTuningSpace* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDigitalCableTuningSpace_AddRef(IDigitalCableTuningSpace* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDigitalCableTuningSpace_Release(IDigitalCableTuningSpace* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IDigitalCableTuningSpace_GetTypeInfoCount(IDigitalCableTuningSpace* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IDigitalCableTuningSpace_GetTypeInfo(IDigitalCableTuningSpace* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IDigitalCableTuningSpace_GetIDsOfNames(IDigitalCableTuningSpace* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IDigitalCableTuningSpace_Invoke(IDigitalCableTuningSpace* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ITuningSpace methods ***/
static FORCEINLINE HRESULT IDigitalCableTuningSpace_get_UniqueName(IDigitalCableTuningSpace* This,BSTR *Name) {
    return This->lpVtbl->get_UniqueName(This,Name);
}
static FORCEINLINE HRESULT IDigitalCableTuningSpace_put_UniqueName(IDigitalCableTuningSpace* This,BSTR Name) {
    return This->lpVtbl->put_UniqueName(This,Name);
}
static FORCEINLINE HRESULT IDigitalCableTuningSpace_get_FriendlyName(IDigitalCableTuningSpace* This,BSTR *Name) {
    return This->lpVtbl->get_FriendlyName(This,Name);
}
static FORCEINLINE HRESULT IDigitalCableTuningSpace_put_FriendlyName(IDigitalCableTuningSpace* This,BSTR Name) {
    return This->lpVtbl->put_FriendlyName(This,Name);
}
static FORCEINLINE HRESULT IDigitalCableTuningSpace_get_CLSID(IDigitalCableTuningSpace* This,BSTR *SpaceCLSID) {
    return This->lpVtbl->get_CLSID(This,SpaceCLSID);
}
static FORCEINLINE HRESULT IDigitalCableTuningSpace_get_NetworkType(IDigitalCableTuningSpace* This,BSTR *NetworkTypeGuid) {
    return This->lpVtbl->get_NetworkType(This,NetworkTypeGuid);
}
static FORCEINLINE HRESULT IDigitalCableTuningSpace_put_NetworkType(IDigitalCableTuningSpace* This,BSTR NetworkTypeGuid) {
    return This->lpVtbl->put_NetworkType(This,NetworkTypeGuid);
}
static FORCEINLINE HRESULT IDigitalCableTuningSpace_get__NetworkType(IDigitalCableTuningSpace* This,GUID *NetworkTypeGuid) {
    return This->lpVtbl->get__NetworkType(This,NetworkTypeGuid);
}
static FORCEINLINE HRESULT IDigitalCableTuningSpace_put__NetworkType(IDigitalCableTuningSpace* This,REFCLSID NetworkTypeGuid) {
    return This->lpVtbl->put__NetworkType(This,NetworkTypeGuid);
}
static FORCEINLINE HRESULT IDigitalCableTuningSpace_CreateTuneRequest(IDigitalCableTuningSpace* This,ITuneRequest **TuneRequest) {
    return This->lpVtbl->CreateTuneRequest(This,TuneRequest);
}
static FORCEINLINE HRESULT IDigitalCableTuningSpace_EnumCategoryGUIDs(IDigitalCableTuningSpace* This,IEnumGUID **ppEnum) {
    return This->lpVtbl->EnumCategoryGUIDs(This,ppEnum);
}
static FORCEINLINE HRESULT IDigitalCableTuningSpace_EnumDeviceMonikers(IDigitalCableTuningSpace* This,IEnumMoniker **ppEnum) {
    return This->lpVtbl->EnumDeviceMonikers(This,ppEnum);
}
static FORCEINLINE HRESULT IDigitalCableTuningSpace_get_DefaultPreferredComponentTypes(IDigitalCableTuningSpace* This,IComponentTypes **ComponentTypes) {
    return This->lpVtbl->get_DefaultPreferredComponentTypes(This,ComponentTypes);
}
static FORCEINLINE HRESULT IDigitalCableTuningSpace_put_DefaultPreferredComponentTypes(IDigitalCableTuningSpace* This,IComponentTypes *NewComponentTypes) {
    return This->lpVtbl->put_DefaultPreferredComponentTypes(This,NewComponentTypes);
}
static FORCEINLINE HRESULT IDigitalCableTuningSpace_get_FrequencyMapping(IDigitalCableTuningSpace* This,BSTR *pMapping) {
    return This->lpVtbl->get_FrequencyMapping(This,pMapping);
}
static FORCEINLINE HRESULT IDigitalCableTuningSpace_put_FrequencyMapping(IDigitalCableTuningSpace* This,BSTR Mapping) {
    return This->lpVtbl->put_FrequencyMapping(This,Mapping);
}
static FORCEINLINE HRESULT IDigitalCableTuningSpace_get_DefaultLocator(IDigitalCableTuningSpace* This,ILocator **LocatorVal) {
    return This->lpVtbl->get_DefaultLocator(This,LocatorVal);
}
static FORCEINLINE HRESULT IDigitalCableTuningSpace_put_DefaultLocator(IDigitalCableTuningSpace* This,ILocator *LocatorVal) {
    return This->lpVtbl->put_DefaultLocator(This,LocatorVal);
}
static FORCEINLINE HRESULT IDigitalCableTuningSpace_Clone(IDigitalCableTuningSpace* This,ITuningSpace **NewTS) {
    return This->lpVtbl->Clone(This,NewTS);
}
/*** IAnalogTVTuningSpace methods ***/
static FORCEINLINE HRESULT IDigitalCableTuningSpace_get_MinChannel(IDigitalCableTuningSpace* This,LONG *MinChannelVal) {
    return This->lpVtbl->get_MinChannel(This,MinChannelVal);
}
static FORCEINLINE HRESULT IDigitalCableTuningSpace_put_MinChannel(IDigitalCableTuningSpace* This,LONG NewMinChannelVal) {
    return This->lpVtbl->put_MinChannel(This,NewMinChannelVal);
}
static FORCEINLINE HRESULT IDigitalCableTuningSpace_get_MaxChannel(IDigitalCableTuningSpace* This,LONG *MaxChannelVal) {
    return This->lpVtbl->get_MaxChannel(This,MaxChannelVal);
}
static FORCEINLINE HRESULT IDigitalCableTuningSpace_put_MaxChannel(IDigitalCableTuningSpace* This,LONG NewMaxChannelVal) {
    return This->lpVtbl->put_MaxChannel(This,NewMaxChannelVal);
}
static FORCEINLINE HRESULT IDigitalCableTuningSpace_get_InputType(IDigitalCableTuningSpace* This,TunerInputType *InputTypeVal) {
    return This->lpVtbl->get_InputType(This,InputTypeVal);
}
static FORCEINLINE HRESULT IDigitalCableTuningSpace_put_InputType(IDigitalCableTuningSpace* This,TunerInputType NewInputTypeVal) {
    return This->lpVtbl->put_InputType(This,NewInputTypeVal);
}
static FORCEINLINE HRESULT IDigitalCableTuningSpace_get_CountryCode(IDigitalCableTuningSpace* This,LONG *CountryCodeVal) {
    return This->lpVtbl->get_CountryCode(This,CountryCodeVal);
}
static FORCEINLINE HRESULT IDigitalCableTuningSpace_put_CountryCode(IDigitalCableTuningSpace* This,LONG NewCountryCodeVal) {
    return This->lpVtbl->put_CountryCode(This,NewCountryCodeVal);
}
/*** IATSCTuningSpace methods ***/
static FORCEINLINE HRESULT IDigitalCableTuningSpace_get_MinMinorChannel(IDigitalCableTuningSpace* This,LONG *MinMinorChannelVal) {
    return This->lpVtbl->get_MinMinorChannel(This,MinMinorChannelVal);
}
static FORCEINLINE HRESULT IDigitalCableTuningSpace_put_MinMinorChannel(IDigitalCableTuningSpace* This,LONG NewMinMinorChannelVal) {
    return This->lpVtbl->put_MinMinorChannel(This,NewMinMinorChannelVal);
}
static FORCEINLINE HRESULT IDigitalCableTuningSpace_get_MaxMinorChannel(IDigitalCableTuningSpace* This,LONG *MaxMinorChannelVal) {
    return This->lpVtbl->get_MaxMinorChannel(This,MaxMinorChannelVal);
}
static FORCEINLINE HRESULT IDigitalCableTuningSpace_put_MaxMinorChannel(IDigitalCableTuningSpace* This,LONG NewMaxMinorChannelVal) {
    return This->lpVtbl->put_MaxMinorChannel(This,NewMaxMinorChannelVal);
}
static FORCEINLINE HRESULT IDigitalCableTuningSpace_get_MinPhysicalChannel(IDigitalCableTuningSpace* This,LONG *MinPhysicalChannelVal) {
    return This->lpVtbl->get_MinPhysicalChannel(This,MinPhysicalChannelVal);
}
static FORCEINLINE HRESULT IDigitalCableTuningSpace_put_MinPhysicalChannel(IDigitalCableTuningSpace* This,LONG NewMinPhysicalChannelVal) {
    return This->lpVtbl->put_MinPhysicalChannel(This,NewMinPhysicalChannelVal);
}
static FORCEINLINE HRESULT IDigitalCableTuningSpace_get_MaxPhysicalChannel(IDigitalCableTuningSpace* This,LONG *MaxPhysicalChannelVal) {
    return This->lpVtbl->get_MaxPhysicalChannel(This,MaxPhysicalChannelVal);
}
static FORCEINLINE HRESULT IDigitalCableTuningSpace_put_MaxPhysicalChannel(IDigitalCableTuningSpace* This,LONG NewMaxPhysicalChannelVal) {
    return This->lpVtbl->put_MaxPhysicalChannel(This,NewMaxPhysicalChannelVal);
}
/*** IDigitalCableTuningSpace methods ***/
static FORCEINLINE HRESULT IDigitalCableTuningSpace_get_MinMajorChannel(IDigitalCableTuningSpace* This,LONG *MinMajorChannelVal) {
    return This->lpVtbl->get_MinMajorChannel(This,MinMajorChannelVal);
}
static FORCEINLINE HRESULT IDigitalCableTuningSpace_put_MinMajorChannel(IDigitalCableTuningSpace* This,LONG NewMinMajorChannelVal) {
    return This->lpVtbl->put_MinMajorChannel(This,NewMinMajorChannelVal);
}
static FORCEINLINE HRESULT IDigitalCableTuningSpace_get_MaxMajorChannel(IDigitalCableTuningSpace* This,LONG *MaxMajorChannelVal) {
    return This->lpVtbl->get_MaxMajorChannel(This,MaxMajorChannelVal);
}
static FORCEINLINE HRESULT IDigitalCableTuningSpace_put_MaxMajorChannel(IDigitalCableTuningSpace* This,LONG NewMaxMajorChannelVal) {
    return This->lpVtbl->put_MaxMajorChannel(This,NewMaxMajorChannelVal);
}
static FORCEINLINE HRESULT IDigitalCableTuningSpace_get_MinSourceID(IDigitalCableTuningSpace* This,LONG *MinSourceIDVal) {
    return This->lpVtbl->get_MinSourceID(This,MinSourceIDVal);
}
static FORCEINLINE HRESULT IDigitalCableTuningSpace_put_MinSourceID(IDigitalCableTuningSpace* This,LONG NewMinSourceIDVal) {
    return This->lpVtbl->put_MinSourceID(This,NewMinSourceIDVal);
}
static FORCEINLINE HRESULT IDigitalCableTuningSpace_get_MaxSourceID(IDigitalCableTuningSpace* This,LONG *MaxSourceIDVal) {
    return This->lpVtbl->get_MaxSourceID(This,MaxSourceIDVal);
}
static FORCEINLINE HRESULT IDigitalCableTuningSpace_put_MaxSourceID(IDigitalCableTuningSpace* This,LONG NewMaxSourceIDVal) {
    return This->lpVtbl->put_MaxSourceID(This,NewMaxSourceIDVal);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IDigitalCableTuningSpace_get_MinMajorChannel_Proxy(
    IDigitalCableTuningSpace* This,
    LONG *MinMajorChannelVal);
void __RPC_STUB IDigitalCableTuningSpace_get_MinMajorChannel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDigitalCableTuningSpace_put_MinMajorChannel_Proxy(
    IDigitalCableTuningSpace* This,
    LONG NewMinMajorChannelVal);
void __RPC_STUB IDigitalCableTuningSpace_put_MinMajorChannel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDigitalCableTuningSpace_get_MaxMajorChannel_Proxy(
    IDigitalCableTuningSpace* This,
    LONG *MaxMajorChannelVal);
void __RPC_STUB IDigitalCableTuningSpace_get_MaxMajorChannel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDigitalCableTuningSpace_put_MaxMajorChannel_Proxy(
    IDigitalCableTuningSpace* This,
    LONG NewMaxMajorChannelVal);
void __RPC_STUB IDigitalCableTuningSpace_put_MaxMajorChannel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDigitalCableTuningSpace_get_MinSourceID_Proxy(
    IDigitalCableTuningSpace* This,
    LONG *MinSourceIDVal);
void __RPC_STUB IDigitalCableTuningSpace_get_MinSourceID_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDigitalCableTuningSpace_put_MinSourceID_Proxy(
    IDigitalCableTuningSpace* This,
    LONG NewMinSourceIDVal);
void __RPC_STUB IDigitalCableTuningSpace_put_MinSourceID_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDigitalCableTuningSpace_get_MaxSourceID_Proxy(
    IDigitalCableTuningSpace* This,
    LONG *MaxSourceIDVal);
void __RPC_STUB IDigitalCableTuningSpace_get_MaxSourceID_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDigitalCableTuningSpace_put_MaxSourceID_Proxy(
    IDigitalCableTuningSpace* This,
    LONG NewMaxSourceIDVal);
void __RPC_STUB IDigitalCableTuningSpace_put_MaxSourceID_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IDigitalCableTuningSpace_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAnalogRadioTuningSpace interface
 */
#ifndef __IAnalogRadioTuningSpace_INTERFACE_DEFINED__
#define __IAnalogRadioTuningSpace_INTERFACE_DEFINED__

DEFINE_GUID(IID_IAnalogRadioTuningSpace, 0x2a6e293b, 0x2595, 0x11d3, 0xb6,0x4c, 0x00,0xc0,0x4f,0x79,0x49,0x8e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2a6e293b-2595-11d3-b64c-00c04f79498e")
IAnalogRadioTuningSpace : public ITuningSpace
{
    virtual HRESULT STDMETHODCALLTYPE get_MinFrequency(
        LONG *MinFrequencyVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_MinFrequency(
        LONG NewMinFrequencyVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_MaxFrequency(
        LONG *MaxFrequencyVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_MaxFrequency(
        LONG NewMaxFrequencyVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Step(
        LONG *StepVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Step(
        LONG NewStepVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IAnalogRadioTuningSpace, 0x2a6e293b, 0x2595, 0x11d3, 0xb6,0x4c, 0x00,0xc0,0x4f,0x79,0x49,0x8e)
#endif
#else
typedef struct IAnalogRadioTuningSpaceVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IAnalogRadioTuningSpace* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IAnalogRadioTuningSpace* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IAnalogRadioTuningSpace* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IAnalogRadioTuningSpace* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ITuningSpace methods ***/
    HRESULT (STDMETHODCALLTYPE *get_UniqueName)(
        IAnalogRadioTuningSpace* This,
        BSTR *Name);

    HRESULT (STDMETHODCALLTYPE *put_UniqueName)(
        IAnalogRadioTuningSpace* This,
        BSTR Name);

    HRESULT (STDMETHODCALLTYPE *get_FriendlyName)(
        IAnalogRadioTuningSpace* This,
        BSTR *Name);

    HRESULT (STDMETHODCALLTYPE *put_FriendlyName)(
        IAnalogRadioTuningSpace* This,
        BSTR Name);

    HRESULT (STDMETHODCALLTYPE *get_CLSID)(
        IAnalogRadioTuningSpace* This,
        BSTR *SpaceCLSID);

    HRESULT (STDMETHODCALLTYPE *get_NetworkType)(
        IAnalogRadioTuningSpace* This,
        BSTR *NetworkTypeGuid);

    HRESULT (STDMETHODCALLTYPE *put_NetworkType)(
        IAnalogRadioTuningSpace* This,
        BSTR NetworkTypeGuid);

    HRESULT (STDMETHODCALLTYPE *get__NetworkType)(
        IAnalogRadioTuningSpace* This,
        GUID *NetworkTypeGuid);

    HRESULT (STDMETHODCALLTYPE *put__NetworkType)(
        IAnalogRadioTuningSpace* This,
        REFCLSID NetworkTypeGuid);

    HRESULT (STDMETHODCALLTYPE *CreateTuneRequest)(
        IAnalogRadioTuningSpace* This,
        ITuneRequest **TuneRequest);

    HRESULT (STDMETHODCALLTYPE *EnumCategoryGUIDs)(
        IAnalogRadioTuningSpace* This,
        IEnumGUID **ppEnum);

    HRESULT (STDMETHODCALLTYPE *EnumDeviceMonikers)(
        IAnalogRadioTuningSpace* This,
        IEnumMoniker **ppEnum);

    HRESULT (STDMETHODCALLTYPE *get_DefaultPreferredComponentTypes)(
        IAnalogRadioTuningSpace* This,
        IComponentTypes **ComponentTypes);

    HRESULT (STDMETHODCALLTYPE *put_DefaultPreferredComponentTypes)(
        IAnalogRadioTuningSpace* This,
        IComponentTypes *NewComponentTypes);

    HRESULT (STDMETHODCALLTYPE *get_FrequencyMapping)(
        IAnalogRadioTuningSpace* This,
        BSTR *pMapping);

    HRESULT (STDMETHODCALLTYPE *put_FrequencyMapping)(
        IAnalogRadioTuningSpace* This,
        BSTR Mapping);

    HRESULT (STDMETHODCALLTYPE *get_DefaultLocator)(
        IAnalogRadioTuningSpace* This,
        ILocator **LocatorVal);

    HRESULT (STDMETHODCALLTYPE *put_DefaultLocator)(
        IAnalogRadioTuningSpace* This,
        ILocator *LocatorVal);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IAnalogRadioTuningSpace* This,
        ITuningSpace **NewTS);

    /*** IAnalogRadioTuningSpace methods ***/
    HRESULT (STDMETHODCALLTYPE *get_MinFrequency)(
        IAnalogRadioTuningSpace* This,
        LONG *MinFrequencyVal);

    HRESULT (STDMETHODCALLTYPE *put_MinFrequency)(
        IAnalogRadioTuningSpace* This,
        LONG NewMinFrequencyVal);

    HRESULT (STDMETHODCALLTYPE *get_MaxFrequency)(
        IAnalogRadioTuningSpace* This,
        LONG *MaxFrequencyVal);

    HRESULT (STDMETHODCALLTYPE *put_MaxFrequency)(
        IAnalogRadioTuningSpace* This,
        LONG NewMaxFrequencyVal);

    HRESULT (STDMETHODCALLTYPE *get_Step)(
        IAnalogRadioTuningSpace* This,
        LONG *StepVal);

    HRESULT (STDMETHODCALLTYPE *put_Step)(
        IAnalogRadioTuningSpace* This,
        LONG NewStepVal);

    END_INTERFACE
} IAnalogRadioTuningSpaceVtbl;
interface IAnalogRadioTuningSpace {
    CONST_VTBL IAnalogRadioTuningSpaceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IAnalogRadioTuningSpace_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IAnalogRadioTuningSpace_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IAnalogRadioTuningSpace_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IAnalogRadioTuningSpace_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IAnalogRadioTuningSpace_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IAnalogRadioTuningSpace_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IAnalogRadioTuningSpace_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ITuningSpace methods ***/
#define IAnalogRadioTuningSpace_get_UniqueName(This,Name) (This)->lpVtbl->get_UniqueName(This,Name)
#define IAnalogRadioTuningSpace_put_UniqueName(This,Name) (This)->lpVtbl->put_UniqueName(This,Name)
#define IAnalogRadioTuningSpace_get_FriendlyName(This,Name) (This)->lpVtbl->get_FriendlyName(This,Name)
#define IAnalogRadioTuningSpace_put_FriendlyName(This,Name) (This)->lpVtbl->put_FriendlyName(This,Name)
#define IAnalogRadioTuningSpace_get_CLSID(This,SpaceCLSID) (This)->lpVtbl->get_CLSID(This,SpaceCLSID)
#define IAnalogRadioTuningSpace_get_NetworkType(This,NetworkTypeGuid) (This)->lpVtbl->get_NetworkType(This,NetworkTypeGuid)
#define IAnalogRadioTuningSpace_put_NetworkType(This,NetworkTypeGuid) (This)->lpVtbl->put_NetworkType(This,NetworkTypeGuid)
#define IAnalogRadioTuningSpace_get__NetworkType(This,NetworkTypeGuid) (This)->lpVtbl->get__NetworkType(This,NetworkTypeGuid)
#define IAnalogRadioTuningSpace_put__NetworkType(This,NetworkTypeGuid) (This)->lpVtbl->put__NetworkType(This,NetworkTypeGuid)
#define IAnalogRadioTuningSpace_CreateTuneRequest(This,TuneRequest) (This)->lpVtbl->CreateTuneRequest(This,TuneRequest)
#define IAnalogRadioTuningSpace_EnumCategoryGUIDs(This,ppEnum) (This)->lpVtbl->EnumCategoryGUIDs(This,ppEnum)
#define IAnalogRadioTuningSpace_EnumDeviceMonikers(This,ppEnum) (This)->lpVtbl->EnumDeviceMonikers(This,ppEnum)
#define IAnalogRadioTuningSpace_get_DefaultPreferredComponentTypes(This,ComponentTypes) (This)->lpVtbl->get_DefaultPreferredComponentTypes(This,ComponentTypes)
#define IAnalogRadioTuningSpace_put_DefaultPreferredComponentTypes(This,NewComponentTypes) (This)->lpVtbl->put_DefaultPreferredComponentTypes(This,NewComponentTypes)
#define IAnalogRadioTuningSpace_get_FrequencyMapping(This,pMapping) (This)->lpVtbl->get_FrequencyMapping(This,pMapping)
#define IAnalogRadioTuningSpace_put_FrequencyMapping(This,Mapping) (This)->lpVtbl->put_FrequencyMapping(This,Mapping)
#define IAnalogRadioTuningSpace_get_DefaultLocator(This,LocatorVal) (This)->lpVtbl->get_DefaultLocator(This,LocatorVal)
#define IAnalogRadioTuningSpace_put_DefaultLocator(This,LocatorVal) (This)->lpVtbl->put_DefaultLocator(This,LocatorVal)
#define IAnalogRadioTuningSpace_Clone(This,NewTS) (This)->lpVtbl->Clone(This,NewTS)
/*** IAnalogRadioTuningSpace methods ***/
#define IAnalogRadioTuningSpace_get_MinFrequency(This,MinFrequencyVal) (This)->lpVtbl->get_MinFrequency(This,MinFrequencyVal)
#define IAnalogRadioTuningSpace_put_MinFrequency(This,NewMinFrequencyVal) (This)->lpVtbl->put_MinFrequency(This,NewMinFrequencyVal)
#define IAnalogRadioTuningSpace_get_MaxFrequency(This,MaxFrequencyVal) (This)->lpVtbl->get_MaxFrequency(This,MaxFrequencyVal)
#define IAnalogRadioTuningSpace_put_MaxFrequency(This,NewMaxFrequencyVal) (This)->lpVtbl->put_MaxFrequency(This,NewMaxFrequencyVal)
#define IAnalogRadioTuningSpace_get_Step(This,StepVal) (This)->lpVtbl->get_Step(This,StepVal)
#define IAnalogRadioTuningSpace_put_Step(This,NewStepVal) (This)->lpVtbl->put_Step(This,NewStepVal)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IAnalogRadioTuningSpace_QueryInterface(IAnalogRadioTuningSpace* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IAnalogRadioTuningSpace_AddRef(IAnalogRadioTuningSpace* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IAnalogRadioTuningSpace_Release(IAnalogRadioTuningSpace* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IAnalogRadioTuningSpace_GetTypeInfoCount(IAnalogRadioTuningSpace* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IAnalogRadioTuningSpace_GetTypeInfo(IAnalogRadioTuningSpace* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IAnalogRadioTuningSpace_GetIDsOfNames(IAnalogRadioTuningSpace* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IAnalogRadioTuningSpace_Invoke(IAnalogRadioTuningSpace* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ITuningSpace methods ***/
static FORCEINLINE HRESULT IAnalogRadioTuningSpace_get_UniqueName(IAnalogRadioTuningSpace* This,BSTR *Name) {
    return This->lpVtbl->get_UniqueName(This,Name);
}
static FORCEINLINE HRESULT IAnalogRadioTuningSpace_put_UniqueName(IAnalogRadioTuningSpace* This,BSTR Name) {
    return This->lpVtbl->put_UniqueName(This,Name);
}
static FORCEINLINE HRESULT IAnalogRadioTuningSpace_get_FriendlyName(IAnalogRadioTuningSpace* This,BSTR *Name) {
    return This->lpVtbl->get_FriendlyName(This,Name);
}
static FORCEINLINE HRESULT IAnalogRadioTuningSpace_put_FriendlyName(IAnalogRadioTuningSpace* This,BSTR Name) {
    return This->lpVtbl->put_FriendlyName(This,Name);
}
static FORCEINLINE HRESULT IAnalogRadioTuningSpace_get_CLSID(IAnalogRadioTuningSpace* This,BSTR *SpaceCLSID) {
    return This->lpVtbl->get_CLSID(This,SpaceCLSID);
}
static FORCEINLINE HRESULT IAnalogRadioTuningSpace_get_NetworkType(IAnalogRadioTuningSpace* This,BSTR *NetworkTypeGuid) {
    return This->lpVtbl->get_NetworkType(This,NetworkTypeGuid);
}
static FORCEINLINE HRESULT IAnalogRadioTuningSpace_put_NetworkType(IAnalogRadioTuningSpace* This,BSTR NetworkTypeGuid) {
    return This->lpVtbl->put_NetworkType(This,NetworkTypeGuid);
}
static FORCEINLINE HRESULT IAnalogRadioTuningSpace_get__NetworkType(IAnalogRadioTuningSpace* This,GUID *NetworkTypeGuid) {
    return This->lpVtbl->get__NetworkType(This,NetworkTypeGuid);
}
static FORCEINLINE HRESULT IAnalogRadioTuningSpace_put__NetworkType(IAnalogRadioTuningSpace* This,REFCLSID NetworkTypeGuid) {
    return This->lpVtbl->put__NetworkType(This,NetworkTypeGuid);
}
static FORCEINLINE HRESULT IAnalogRadioTuningSpace_CreateTuneRequest(IAnalogRadioTuningSpace* This,ITuneRequest **TuneRequest) {
    return This->lpVtbl->CreateTuneRequest(This,TuneRequest);
}
static FORCEINLINE HRESULT IAnalogRadioTuningSpace_EnumCategoryGUIDs(IAnalogRadioTuningSpace* This,IEnumGUID **ppEnum) {
    return This->lpVtbl->EnumCategoryGUIDs(This,ppEnum);
}
static FORCEINLINE HRESULT IAnalogRadioTuningSpace_EnumDeviceMonikers(IAnalogRadioTuningSpace* This,IEnumMoniker **ppEnum) {
    return This->lpVtbl->EnumDeviceMonikers(This,ppEnum);
}
static FORCEINLINE HRESULT IAnalogRadioTuningSpace_get_DefaultPreferredComponentTypes(IAnalogRadioTuningSpace* This,IComponentTypes **ComponentTypes) {
    return This->lpVtbl->get_DefaultPreferredComponentTypes(This,ComponentTypes);
}
static FORCEINLINE HRESULT IAnalogRadioTuningSpace_put_DefaultPreferredComponentTypes(IAnalogRadioTuningSpace* This,IComponentTypes *NewComponentTypes) {
    return This->lpVtbl->put_DefaultPreferredComponentTypes(This,NewComponentTypes);
}
static FORCEINLINE HRESULT IAnalogRadioTuningSpace_get_FrequencyMapping(IAnalogRadioTuningSpace* This,BSTR *pMapping) {
    return This->lpVtbl->get_FrequencyMapping(This,pMapping);
}
static FORCEINLINE HRESULT IAnalogRadioTuningSpace_put_FrequencyMapping(IAnalogRadioTuningSpace* This,BSTR Mapping) {
    return This->lpVtbl->put_FrequencyMapping(This,Mapping);
}
static FORCEINLINE HRESULT IAnalogRadioTuningSpace_get_DefaultLocator(IAnalogRadioTuningSpace* This,ILocator **LocatorVal) {
    return This->lpVtbl->get_DefaultLocator(This,LocatorVal);
}
static FORCEINLINE HRESULT IAnalogRadioTuningSpace_put_DefaultLocator(IAnalogRadioTuningSpace* This,ILocator *LocatorVal) {
    return This->lpVtbl->put_DefaultLocator(This,LocatorVal);
}
static FORCEINLINE HRESULT IAnalogRadioTuningSpace_Clone(IAnalogRadioTuningSpace* This,ITuningSpace **NewTS) {
    return This->lpVtbl->Clone(This,NewTS);
}
/*** IAnalogRadioTuningSpace methods ***/
static FORCEINLINE HRESULT IAnalogRadioTuningSpace_get_MinFrequency(IAnalogRadioTuningSpace* This,LONG *MinFrequencyVal) {
    return This->lpVtbl->get_MinFrequency(This,MinFrequencyVal);
}
static FORCEINLINE HRESULT IAnalogRadioTuningSpace_put_MinFrequency(IAnalogRadioTuningSpace* This,LONG NewMinFrequencyVal) {
    return This->lpVtbl->put_MinFrequency(This,NewMinFrequencyVal);
}
static FORCEINLINE HRESULT IAnalogRadioTuningSpace_get_MaxFrequency(IAnalogRadioTuningSpace* This,LONG *MaxFrequencyVal) {
    return This->lpVtbl->get_MaxFrequency(This,MaxFrequencyVal);
}
static FORCEINLINE HRESULT IAnalogRadioTuningSpace_put_MaxFrequency(IAnalogRadioTuningSpace* This,LONG NewMaxFrequencyVal) {
    return This->lpVtbl->put_MaxFrequency(This,NewMaxFrequencyVal);
}
static FORCEINLINE HRESULT IAnalogRadioTuningSpace_get_Step(IAnalogRadioTuningSpace* This,LONG *StepVal) {
    return This->lpVtbl->get_Step(This,StepVal);
}
static FORCEINLINE HRESULT IAnalogRadioTuningSpace_put_Step(IAnalogRadioTuningSpace* This,LONG NewStepVal) {
    return This->lpVtbl->put_Step(This,NewStepVal);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IAnalogRadioTuningSpace_get_MinFrequency_Proxy(
    IAnalogRadioTuningSpace* This,
    LONG *MinFrequencyVal);
void __RPC_STUB IAnalogRadioTuningSpace_get_MinFrequency_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAnalogRadioTuningSpace_put_MinFrequency_Proxy(
    IAnalogRadioTuningSpace* This,
    LONG NewMinFrequencyVal);
void __RPC_STUB IAnalogRadioTuningSpace_put_MinFrequency_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAnalogRadioTuningSpace_get_MaxFrequency_Proxy(
    IAnalogRadioTuningSpace* This,
    LONG *MaxFrequencyVal);
void __RPC_STUB IAnalogRadioTuningSpace_get_MaxFrequency_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAnalogRadioTuningSpace_put_MaxFrequency_Proxy(
    IAnalogRadioTuningSpace* This,
    LONG NewMaxFrequencyVal);
void __RPC_STUB IAnalogRadioTuningSpace_put_MaxFrequency_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAnalogRadioTuningSpace_get_Step_Proxy(
    IAnalogRadioTuningSpace* This,
    LONG *StepVal);
void __RPC_STUB IAnalogRadioTuningSpace_get_Step_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAnalogRadioTuningSpace_put_Step_Proxy(
    IAnalogRadioTuningSpace* This,
    LONG NewStepVal);
void __RPC_STUB IAnalogRadioTuningSpace_put_Step_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IAnalogRadioTuningSpace_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAnalogRadioTuningSpace2 interface
 */
#ifndef __IAnalogRadioTuningSpace2_INTERFACE_DEFINED__
#define __IAnalogRadioTuningSpace2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IAnalogRadioTuningSpace2, 0x39dd45da, 0x2da8, 0x46ba, 0x8a,0x8a, 0x87,0xe2,0xb7,0x3d,0x98,0x3a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("39dd45da-2da8-46ba-8a8a-87e2b73d983a")
IAnalogRadioTuningSpace2 : public IAnalogRadioTuningSpace
{
    virtual HRESULT STDMETHODCALLTYPE get_CountryCode(
        LONG *CountryCodeVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_CountryCode(
        LONG NewCountryCodeVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IAnalogRadioTuningSpace2, 0x39dd45da, 0x2da8, 0x46ba, 0x8a,0x8a, 0x87,0xe2,0xb7,0x3d,0x98,0x3a)
#endif
#else
typedef struct IAnalogRadioTuningSpace2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IAnalogRadioTuningSpace2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IAnalogRadioTuningSpace2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IAnalogRadioTuningSpace2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IAnalogRadioTuningSpace2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ITuningSpace methods ***/
    HRESULT (STDMETHODCALLTYPE *get_UniqueName)(
        IAnalogRadioTuningSpace2* This,
        BSTR *Name);

    HRESULT (STDMETHODCALLTYPE *put_UniqueName)(
        IAnalogRadioTuningSpace2* This,
        BSTR Name);

    HRESULT (STDMETHODCALLTYPE *get_FriendlyName)(
        IAnalogRadioTuningSpace2* This,
        BSTR *Name);

    HRESULT (STDMETHODCALLTYPE *put_FriendlyName)(
        IAnalogRadioTuningSpace2* This,
        BSTR Name);

    HRESULT (STDMETHODCALLTYPE *get_CLSID)(
        IAnalogRadioTuningSpace2* This,
        BSTR *SpaceCLSID);

    HRESULT (STDMETHODCALLTYPE *get_NetworkType)(
        IAnalogRadioTuningSpace2* This,
        BSTR *NetworkTypeGuid);

    HRESULT (STDMETHODCALLTYPE *put_NetworkType)(
        IAnalogRadioTuningSpace2* This,
        BSTR NetworkTypeGuid);

    HRESULT (STDMETHODCALLTYPE *get__NetworkType)(
        IAnalogRadioTuningSpace2* This,
        GUID *NetworkTypeGuid);

    HRESULT (STDMETHODCALLTYPE *put__NetworkType)(
        IAnalogRadioTuningSpace2* This,
        REFCLSID NetworkTypeGuid);

    HRESULT (STDMETHODCALLTYPE *CreateTuneRequest)(
        IAnalogRadioTuningSpace2* This,
        ITuneRequest **TuneRequest);

    HRESULT (STDMETHODCALLTYPE *EnumCategoryGUIDs)(
        IAnalogRadioTuningSpace2* This,
        IEnumGUID **ppEnum);

    HRESULT (STDMETHODCALLTYPE *EnumDeviceMonikers)(
        IAnalogRadioTuningSpace2* This,
        IEnumMoniker **ppEnum);

    HRESULT (STDMETHODCALLTYPE *get_DefaultPreferredComponentTypes)(
        IAnalogRadioTuningSpace2* This,
        IComponentTypes **ComponentTypes);

    HRESULT (STDMETHODCALLTYPE *put_DefaultPreferredComponentTypes)(
        IAnalogRadioTuningSpace2* This,
        IComponentTypes *NewComponentTypes);

    HRESULT (STDMETHODCALLTYPE *get_FrequencyMapping)(
        IAnalogRadioTuningSpace2* This,
        BSTR *pMapping);

    HRESULT (STDMETHODCALLTYPE *put_FrequencyMapping)(
        IAnalogRadioTuningSpace2* This,
        BSTR Mapping);

    HRESULT (STDMETHODCALLTYPE *get_DefaultLocator)(
        IAnalogRadioTuningSpace2* This,
        ILocator **LocatorVal);

    HRESULT (STDMETHODCALLTYPE *put_DefaultLocator)(
        IAnalogRadioTuningSpace2* This,
        ILocator *LocatorVal);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IAnalogRadioTuningSpace2* This,
        ITuningSpace **NewTS);

    /*** IAnalogRadioTuningSpace methods ***/
    HRESULT (STDMETHODCALLTYPE *get_MinFrequency)(
        IAnalogRadioTuningSpace2* This,
        LONG *MinFrequencyVal);

    HRESULT (STDMETHODCALLTYPE *put_MinFrequency)(
        IAnalogRadioTuningSpace2* This,
        LONG NewMinFrequencyVal);

    HRESULT (STDMETHODCALLTYPE *get_MaxFrequency)(
        IAnalogRadioTuningSpace2* This,
        LONG *MaxFrequencyVal);

    HRESULT (STDMETHODCALLTYPE *put_MaxFrequency)(
        IAnalogRadioTuningSpace2* This,
        LONG NewMaxFrequencyVal);

    HRESULT (STDMETHODCALLTYPE *get_Step)(
        IAnalogRadioTuningSpace2* This,
        LONG *StepVal);

    HRESULT (STDMETHODCALLTYPE *put_Step)(
        IAnalogRadioTuningSpace2* This,
        LONG NewStepVal);

    /*** IAnalogRadioTuningSpace2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CountryCode)(
        IAnalogRadioTuningSpace2* This,
        LONG *CountryCodeVal);

    HRESULT (STDMETHODCALLTYPE *put_CountryCode)(
        IAnalogRadioTuningSpace2* This,
        LONG NewCountryCodeVal);

    END_INTERFACE
} IAnalogRadioTuningSpace2Vtbl;
interface IAnalogRadioTuningSpace2 {
    CONST_VTBL IAnalogRadioTuningSpace2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IAnalogRadioTuningSpace2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IAnalogRadioTuningSpace2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IAnalogRadioTuningSpace2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IAnalogRadioTuningSpace2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IAnalogRadioTuningSpace2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IAnalogRadioTuningSpace2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IAnalogRadioTuningSpace2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ITuningSpace methods ***/
#define IAnalogRadioTuningSpace2_get_UniqueName(This,Name) (This)->lpVtbl->get_UniqueName(This,Name)
#define IAnalogRadioTuningSpace2_put_UniqueName(This,Name) (This)->lpVtbl->put_UniqueName(This,Name)
#define IAnalogRadioTuningSpace2_get_FriendlyName(This,Name) (This)->lpVtbl->get_FriendlyName(This,Name)
#define IAnalogRadioTuningSpace2_put_FriendlyName(This,Name) (This)->lpVtbl->put_FriendlyName(This,Name)
#define IAnalogRadioTuningSpace2_get_CLSID(This,SpaceCLSID) (This)->lpVtbl->get_CLSID(This,SpaceCLSID)
#define IAnalogRadioTuningSpace2_get_NetworkType(This,NetworkTypeGuid) (This)->lpVtbl->get_NetworkType(This,NetworkTypeGuid)
#define IAnalogRadioTuningSpace2_put_NetworkType(This,NetworkTypeGuid) (This)->lpVtbl->put_NetworkType(This,NetworkTypeGuid)
#define IAnalogRadioTuningSpace2_get__NetworkType(This,NetworkTypeGuid) (This)->lpVtbl->get__NetworkType(This,NetworkTypeGuid)
#define IAnalogRadioTuningSpace2_put__NetworkType(This,NetworkTypeGuid) (This)->lpVtbl->put__NetworkType(This,NetworkTypeGuid)
#define IAnalogRadioTuningSpace2_CreateTuneRequest(This,TuneRequest) (This)->lpVtbl->CreateTuneRequest(This,TuneRequest)
#define IAnalogRadioTuningSpace2_EnumCategoryGUIDs(This,ppEnum) (This)->lpVtbl->EnumCategoryGUIDs(This,ppEnum)
#define IAnalogRadioTuningSpace2_EnumDeviceMonikers(This,ppEnum) (This)->lpVtbl->EnumDeviceMonikers(This,ppEnum)
#define IAnalogRadioTuningSpace2_get_DefaultPreferredComponentTypes(This,ComponentTypes) (This)->lpVtbl->get_DefaultPreferredComponentTypes(This,ComponentTypes)
#define IAnalogRadioTuningSpace2_put_DefaultPreferredComponentTypes(This,NewComponentTypes) (This)->lpVtbl->put_DefaultPreferredComponentTypes(This,NewComponentTypes)
#define IAnalogRadioTuningSpace2_get_FrequencyMapping(This,pMapping) (This)->lpVtbl->get_FrequencyMapping(This,pMapping)
#define IAnalogRadioTuningSpace2_put_FrequencyMapping(This,Mapping) (This)->lpVtbl->put_FrequencyMapping(This,Mapping)
#define IAnalogRadioTuningSpace2_get_DefaultLocator(This,LocatorVal) (This)->lpVtbl->get_DefaultLocator(This,LocatorVal)
#define IAnalogRadioTuningSpace2_put_DefaultLocator(This,LocatorVal) (This)->lpVtbl->put_DefaultLocator(This,LocatorVal)
#define IAnalogRadioTuningSpace2_Clone(This,NewTS) (This)->lpVtbl->Clone(This,NewTS)
/*** IAnalogRadioTuningSpace methods ***/
#define IAnalogRadioTuningSpace2_get_MinFrequency(This,MinFrequencyVal) (This)->lpVtbl->get_MinFrequency(This,MinFrequencyVal)
#define IAnalogRadioTuningSpace2_put_MinFrequency(This,NewMinFrequencyVal) (This)->lpVtbl->put_MinFrequency(This,NewMinFrequencyVal)
#define IAnalogRadioTuningSpace2_get_MaxFrequency(This,MaxFrequencyVal) (This)->lpVtbl->get_MaxFrequency(This,MaxFrequencyVal)
#define IAnalogRadioTuningSpace2_put_MaxFrequency(This,NewMaxFrequencyVal) (This)->lpVtbl->put_MaxFrequency(This,NewMaxFrequencyVal)
#define IAnalogRadioTuningSpace2_get_Step(This,StepVal) (This)->lpVtbl->get_Step(This,StepVal)
#define IAnalogRadioTuningSpace2_put_Step(This,NewStepVal) (This)->lpVtbl->put_Step(This,NewStepVal)
/*** IAnalogRadioTuningSpace2 methods ***/
#define IAnalogRadioTuningSpace2_get_CountryCode(This,CountryCodeVal) (This)->lpVtbl->get_CountryCode(This,CountryCodeVal)
#define IAnalogRadioTuningSpace2_put_CountryCode(This,NewCountryCodeVal) (This)->lpVtbl->put_CountryCode(This,NewCountryCodeVal)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IAnalogRadioTuningSpace2_QueryInterface(IAnalogRadioTuningSpace2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IAnalogRadioTuningSpace2_AddRef(IAnalogRadioTuningSpace2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IAnalogRadioTuningSpace2_Release(IAnalogRadioTuningSpace2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IAnalogRadioTuningSpace2_GetTypeInfoCount(IAnalogRadioTuningSpace2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IAnalogRadioTuningSpace2_GetTypeInfo(IAnalogRadioTuningSpace2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IAnalogRadioTuningSpace2_GetIDsOfNames(IAnalogRadioTuningSpace2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IAnalogRadioTuningSpace2_Invoke(IAnalogRadioTuningSpace2* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ITuningSpace methods ***/
static FORCEINLINE HRESULT IAnalogRadioTuningSpace2_get_UniqueName(IAnalogRadioTuningSpace2* This,BSTR *Name) {
    return This->lpVtbl->get_UniqueName(This,Name);
}
static FORCEINLINE HRESULT IAnalogRadioTuningSpace2_put_UniqueName(IAnalogRadioTuningSpace2* This,BSTR Name) {
    return This->lpVtbl->put_UniqueName(This,Name);
}
static FORCEINLINE HRESULT IAnalogRadioTuningSpace2_get_FriendlyName(IAnalogRadioTuningSpace2* This,BSTR *Name) {
    return This->lpVtbl->get_FriendlyName(This,Name);
}
static FORCEINLINE HRESULT IAnalogRadioTuningSpace2_put_FriendlyName(IAnalogRadioTuningSpace2* This,BSTR Name) {
    return This->lpVtbl->put_FriendlyName(This,Name);
}
static FORCEINLINE HRESULT IAnalogRadioTuningSpace2_get_CLSID(IAnalogRadioTuningSpace2* This,BSTR *SpaceCLSID) {
    return This->lpVtbl->get_CLSID(This,SpaceCLSID);
}
static FORCEINLINE HRESULT IAnalogRadioTuningSpace2_get_NetworkType(IAnalogRadioTuningSpace2* This,BSTR *NetworkTypeGuid) {
    return This->lpVtbl->get_NetworkType(This,NetworkTypeGuid);
}
static FORCEINLINE HRESULT IAnalogRadioTuningSpace2_put_NetworkType(IAnalogRadioTuningSpace2* This,BSTR NetworkTypeGuid) {
    return This->lpVtbl->put_NetworkType(This,NetworkTypeGuid);
}
static FORCEINLINE HRESULT IAnalogRadioTuningSpace2_get__NetworkType(IAnalogRadioTuningSpace2* This,GUID *NetworkTypeGuid) {
    return This->lpVtbl->get__NetworkType(This,NetworkTypeGuid);
}
static FORCEINLINE HRESULT IAnalogRadioTuningSpace2_put__NetworkType(IAnalogRadioTuningSpace2* This,REFCLSID NetworkTypeGuid) {
    return This->lpVtbl->put__NetworkType(This,NetworkTypeGuid);
}
static FORCEINLINE HRESULT IAnalogRadioTuningSpace2_CreateTuneRequest(IAnalogRadioTuningSpace2* This,ITuneRequest **TuneRequest) {
    return This->lpVtbl->CreateTuneRequest(This,TuneRequest);
}
static FORCEINLINE HRESULT IAnalogRadioTuningSpace2_EnumCategoryGUIDs(IAnalogRadioTuningSpace2* This,IEnumGUID **ppEnum) {
    return This->lpVtbl->EnumCategoryGUIDs(This,ppEnum);
}
static FORCEINLINE HRESULT IAnalogRadioTuningSpace2_EnumDeviceMonikers(IAnalogRadioTuningSpace2* This,IEnumMoniker **ppEnum) {
    return This->lpVtbl->EnumDeviceMonikers(This,ppEnum);
}
static FORCEINLINE HRESULT IAnalogRadioTuningSpace2_get_DefaultPreferredComponentTypes(IAnalogRadioTuningSpace2* This,IComponentTypes **ComponentTypes) {
    return This->lpVtbl->get_DefaultPreferredComponentTypes(This,ComponentTypes);
}
static FORCEINLINE HRESULT IAnalogRadioTuningSpace2_put_DefaultPreferredComponentTypes(IAnalogRadioTuningSpace2* This,IComponentTypes *NewComponentTypes) {
    return This->lpVtbl->put_DefaultPreferredComponentTypes(This,NewComponentTypes);
}
static FORCEINLINE HRESULT IAnalogRadioTuningSpace2_get_FrequencyMapping(IAnalogRadioTuningSpace2* This,BSTR *pMapping) {
    return This->lpVtbl->get_FrequencyMapping(This,pMapping);
}
static FORCEINLINE HRESULT IAnalogRadioTuningSpace2_put_FrequencyMapping(IAnalogRadioTuningSpace2* This,BSTR Mapping) {
    return This->lpVtbl->put_FrequencyMapping(This,Mapping);
}
static FORCEINLINE HRESULT IAnalogRadioTuningSpace2_get_DefaultLocator(IAnalogRadioTuningSpace2* This,ILocator **LocatorVal) {
    return This->lpVtbl->get_DefaultLocator(This,LocatorVal);
}
static FORCEINLINE HRESULT IAnalogRadioTuningSpace2_put_DefaultLocator(IAnalogRadioTuningSpace2* This,ILocator *LocatorVal) {
    return This->lpVtbl->put_DefaultLocator(This,LocatorVal);
}
static FORCEINLINE HRESULT IAnalogRadioTuningSpace2_Clone(IAnalogRadioTuningSpace2* This,ITuningSpace **NewTS) {
    return This->lpVtbl->Clone(This,NewTS);
}
/*** IAnalogRadioTuningSpace methods ***/
static FORCEINLINE HRESULT IAnalogRadioTuningSpace2_get_MinFrequency(IAnalogRadioTuningSpace2* This,LONG *MinFrequencyVal) {
    return This->lpVtbl->get_MinFrequency(This,MinFrequencyVal);
}
static FORCEINLINE HRESULT IAnalogRadioTuningSpace2_put_MinFrequency(IAnalogRadioTuningSpace2* This,LONG NewMinFrequencyVal) {
    return This->lpVtbl->put_MinFrequency(This,NewMinFrequencyVal);
}
static FORCEINLINE HRESULT IAnalogRadioTuningSpace2_get_MaxFrequency(IAnalogRadioTuningSpace2* This,LONG *MaxFrequencyVal) {
    return This->lpVtbl->get_MaxFrequency(This,MaxFrequencyVal);
}
static FORCEINLINE HRESULT IAnalogRadioTuningSpace2_put_MaxFrequency(IAnalogRadioTuningSpace2* This,LONG NewMaxFrequencyVal) {
    return This->lpVtbl->put_MaxFrequency(This,NewMaxFrequencyVal);
}
static FORCEINLINE HRESULT IAnalogRadioTuningSpace2_get_Step(IAnalogRadioTuningSpace2* This,LONG *StepVal) {
    return This->lpVtbl->get_Step(This,StepVal);
}
static FORCEINLINE HRESULT IAnalogRadioTuningSpace2_put_Step(IAnalogRadioTuningSpace2* This,LONG NewStepVal) {
    return This->lpVtbl->put_Step(This,NewStepVal);
}
/*** IAnalogRadioTuningSpace2 methods ***/
static FORCEINLINE HRESULT IAnalogRadioTuningSpace2_get_CountryCode(IAnalogRadioTuningSpace2* This,LONG *CountryCodeVal) {
    return This->lpVtbl->get_CountryCode(This,CountryCodeVal);
}
static FORCEINLINE HRESULT IAnalogRadioTuningSpace2_put_CountryCode(IAnalogRadioTuningSpace2* This,LONG NewCountryCodeVal) {
    return This->lpVtbl->put_CountryCode(This,NewCountryCodeVal);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IAnalogRadioTuningSpace2_get_CountryCode_Proxy(
    IAnalogRadioTuningSpace2* This,
    LONG *CountryCodeVal);
void __RPC_STUB IAnalogRadioTuningSpace2_get_CountryCode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAnalogRadioTuningSpace2_put_CountryCode_Proxy(
    IAnalogRadioTuningSpace2* This,
    LONG NewCountryCodeVal);
void __RPC_STUB IAnalogRadioTuningSpace2_put_CountryCode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IAnalogRadioTuningSpace2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITuneRequest interface
 */
#ifndef __ITuneRequest_INTERFACE_DEFINED__
#define __ITuneRequest_INTERFACE_DEFINED__

DEFINE_GUID(IID_ITuneRequest, 0x07ddc146, 0xfc3d, 0x11d2, 0x9d,0x8c, 0x00,0xc0,0x4f,0x72,0xd9,0x80);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("07ddc146-fc3d-11d2-9d8c-00c04f72d980")
ITuneRequest : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_TuningSpace(
        ITuningSpace **TuningSpace) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Components(
        IComponents **Components) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        ITuneRequest **NewTuneRequest) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Locator(
        ILocator **Locator) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Locator(
        ILocator *Locator) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ITuneRequest, 0x07ddc146, 0xfc3d, 0x11d2, 0x9d,0x8c, 0x00,0xc0,0x4f,0x72,0xd9,0x80)
#endif
#else
typedef struct ITuneRequestVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ITuneRequest* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ITuneRequest* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ITuneRequest* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ITuneRequest* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ITuneRequest methods ***/
    HRESULT (STDMETHODCALLTYPE *get_TuningSpace)(
        ITuneRequest* This,
        ITuningSpace **TuningSpace);

    HRESULT (STDMETHODCALLTYPE *get_Components)(
        ITuneRequest* This,
        IComponents **Components);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        ITuneRequest* This,
        ITuneRequest **NewTuneRequest);

    HRESULT (STDMETHODCALLTYPE *get_Locator)(
        ITuneRequest* This,
        ILocator **Locator);

    HRESULT (STDMETHODCALLTYPE *put_Locator)(
        ITuneRequest* This,
        ILocator *Locator);

    END_INTERFACE
} ITuneRequestVtbl;
interface ITuneRequest {
    CONST_VTBL ITuneRequestVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ITuneRequest_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITuneRequest_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITuneRequest_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ITuneRequest_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ITuneRequest_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ITuneRequest_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ITuneRequest_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ITuneRequest methods ***/
#define ITuneRequest_get_TuningSpace(This,TuningSpace) (This)->lpVtbl->get_TuningSpace(This,TuningSpace)
#define ITuneRequest_get_Components(This,Components) (This)->lpVtbl->get_Components(This,Components)
#define ITuneRequest_Clone(This,NewTuneRequest) (This)->lpVtbl->Clone(This,NewTuneRequest)
#define ITuneRequest_get_Locator(This,Locator) (This)->lpVtbl->get_Locator(This,Locator)
#define ITuneRequest_put_Locator(This,Locator) (This)->lpVtbl->put_Locator(This,Locator)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ITuneRequest_QueryInterface(ITuneRequest* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ITuneRequest_AddRef(ITuneRequest* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ITuneRequest_Release(ITuneRequest* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ITuneRequest_GetTypeInfoCount(ITuneRequest* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ITuneRequest_GetTypeInfo(ITuneRequest* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ITuneRequest_GetIDsOfNames(ITuneRequest* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ITuneRequest_Invoke(ITuneRequest* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ITuneRequest methods ***/
static FORCEINLINE HRESULT ITuneRequest_get_TuningSpace(ITuneRequest* This,ITuningSpace **TuningSpace) {
    return This->lpVtbl->get_TuningSpace(This,TuningSpace);
}
static FORCEINLINE HRESULT ITuneRequest_get_Components(ITuneRequest* This,IComponents **Components) {
    return This->lpVtbl->get_Components(This,Components);
}
static FORCEINLINE HRESULT ITuneRequest_Clone(ITuneRequest* This,ITuneRequest **NewTuneRequest) {
    return This->lpVtbl->Clone(This,NewTuneRequest);
}
static FORCEINLINE HRESULT ITuneRequest_get_Locator(ITuneRequest* This,ILocator **Locator) {
    return This->lpVtbl->get_Locator(This,Locator);
}
static FORCEINLINE HRESULT ITuneRequest_put_Locator(ITuneRequest* This,ILocator *Locator) {
    return This->lpVtbl->put_Locator(This,Locator);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ITuneRequest_get_TuningSpace_Proxy(
    ITuneRequest* This,
    ITuningSpace **TuningSpace);
void __RPC_STUB ITuneRequest_get_TuningSpace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITuneRequest_get_Components_Proxy(
    ITuneRequest* This,
    IComponents **Components);
void __RPC_STUB ITuneRequest_get_Components_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITuneRequest_Clone_Proxy(
    ITuneRequest* This,
    ITuneRequest **NewTuneRequest);
void __RPC_STUB ITuneRequest_Clone_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITuneRequest_get_Locator_Proxy(
    ITuneRequest* This,
    ILocator **Locator);
void __RPC_STUB ITuneRequest_get_Locator_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITuneRequest_put_Locator_Proxy(
    ITuneRequest* This,
    ILocator *Locator);
void __RPC_STUB ITuneRequest_put_Locator_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ITuneRequest_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IChannelIDTuneRequest interface
 */
#ifndef __IChannelIDTuneRequest_INTERFACE_DEFINED__
#define __IChannelIDTuneRequest_INTERFACE_DEFINED__

DEFINE_GUID(IID_IChannelIDTuneRequest, 0x156eff60, 0x86f4, 0x4e28, 0x89,0xfc, 0x10,0x97,0x99,0xfd,0x57,0xee);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("156eff60-86f4-4e28-89fc-109799fd57ee")
IChannelIDTuneRequest : public ITuneRequest
{
    virtual HRESULT STDMETHODCALLTYPE get_ChannelID(
        BSTR *ChannelID) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ChannelID(
        BSTR ChannelID) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IChannelIDTuneRequest, 0x156eff60, 0x86f4, 0x4e28, 0x89,0xfc, 0x10,0x97,0x99,0xfd,0x57,0xee)
#endif
#else
typedef struct IChannelIDTuneRequestVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IChannelIDTuneRequest* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IChannelIDTuneRequest* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IChannelIDTuneRequest* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IChannelIDTuneRequest* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ITuneRequest methods ***/
    HRESULT (STDMETHODCALLTYPE *get_TuningSpace)(
        IChannelIDTuneRequest* This,
        ITuningSpace **TuningSpace);

    HRESULT (STDMETHODCALLTYPE *get_Components)(
        IChannelIDTuneRequest* This,
        IComponents **Components);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IChannelIDTuneRequest* This,
        ITuneRequest **NewTuneRequest);

    HRESULT (STDMETHODCALLTYPE *get_Locator)(
        IChannelIDTuneRequest* This,
        ILocator **Locator);

    HRESULT (STDMETHODCALLTYPE *put_Locator)(
        IChannelIDTuneRequest* This,
        ILocator *Locator);

    /*** IChannelIDTuneRequest methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ChannelID)(
        IChannelIDTuneRequest* This,
        BSTR *ChannelID);

    HRESULT (STDMETHODCALLTYPE *put_ChannelID)(
        IChannelIDTuneRequest* This,
        BSTR ChannelID);

    END_INTERFACE
} IChannelIDTuneRequestVtbl;
interface IChannelIDTuneRequest {
    CONST_VTBL IChannelIDTuneRequestVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IChannelIDTuneRequest_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IChannelIDTuneRequest_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IChannelIDTuneRequest_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IChannelIDTuneRequest_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IChannelIDTuneRequest_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IChannelIDTuneRequest_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IChannelIDTuneRequest_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ITuneRequest methods ***/
#define IChannelIDTuneRequest_get_TuningSpace(This,TuningSpace) (This)->lpVtbl->get_TuningSpace(This,TuningSpace)
#define IChannelIDTuneRequest_get_Components(This,Components) (This)->lpVtbl->get_Components(This,Components)
#define IChannelIDTuneRequest_Clone(This,NewTuneRequest) (This)->lpVtbl->Clone(This,NewTuneRequest)
#define IChannelIDTuneRequest_get_Locator(This,Locator) (This)->lpVtbl->get_Locator(This,Locator)
#define IChannelIDTuneRequest_put_Locator(This,Locator) (This)->lpVtbl->put_Locator(This,Locator)
/*** IChannelIDTuneRequest methods ***/
#define IChannelIDTuneRequest_get_ChannelID(This,ChannelID) (This)->lpVtbl->get_ChannelID(This,ChannelID)
#define IChannelIDTuneRequest_put_ChannelID(This,ChannelID) (This)->lpVtbl->put_ChannelID(This,ChannelID)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IChannelIDTuneRequest_QueryInterface(IChannelIDTuneRequest* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IChannelIDTuneRequest_AddRef(IChannelIDTuneRequest* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IChannelIDTuneRequest_Release(IChannelIDTuneRequest* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IChannelIDTuneRequest_GetTypeInfoCount(IChannelIDTuneRequest* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IChannelIDTuneRequest_GetTypeInfo(IChannelIDTuneRequest* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IChannelIDTuneRequest_GetIDsOfNames(IChannelIDTuneRequest* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IChannelIDTuneRequest_Invoke(IChannelIDTuneRequest* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ITuneRequest methods ***/
static FORCEINLINE HRESULT IChannelIDTuneRequest_get_TuningSpace(IChannelIDTuneRequest* This,ITuningSpace **TuningSpace) {
    return This->lpVtbl->get_TuningSpace(This,TuningSpace);
}
static FORCEINLINE HRESULT IChannelIDTuneRequest_get_Components(IChannelIDTuneRequest* This,IComponents **Components) {
    return This->lpVtbl->get_Components(This,Components);
}
static FORCEINLINE HRESULT IChannelIDTuneRequest_Clone(IChannelIDTuneRequest* This,ITuneRequest **NewTuneRequest) {
    return This->lpVtbl->Clone(This,NewTuneRequest);
}
static FORCEINLINE HRESULT IChannelIDTuneRequest_get_Locator(IChannelIDTuneRequest* This,ILocator **Locator) {
    return This->lpVtbl->get_Locator(This,Locator);
}
static FORCEINLINE HRESULT IChannelIDTuneRequest_put_Locator(IChannelIDTuneRequest* This,ILocator *Locator) {
    return This->lpVtbl->put_Locator(This,Locator);
}
/*** IChannelIDTuneRequest methods ***/
static FORCEINLINE HRESULT IChannelIDTuneRequest_get_ChannelID(IChannelIDTuneRequest* This,BSTR *ChannelID) {
    return This->lpVtbl->get_ChannelID(This,ChannelID);
}
static FORCEINLINE HRESULT IChannelIDTuneRequest_put_ChannelID(IChannelIDTuneRequest* This,BSTR ChannelID) {
    return This->lpVtbl->put_ChannelID(This,ChannelID);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IChannelIDTuneRequest_get_ChannelID_Proxy(
    IChannelIDTuneRequest* This,
    BSTR *ChannelID);
void __RPC_STUB IChannelIDTuneRequest_get_ChannelID_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IChannelIDTuneRequest_put_ChannelID_Proxy(
    IChannelIDTuneRequest* This,
    BSTR ChannelID);
void __RPC_STUB IChannelIDTuneRequest_put_ChannelID_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IChannelIDTuneRequest_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IChannelTuneRequest interface
 */
#ifndef __IChannelTuneRequest_INTERFACE_DEFINED__
#define __IChannelTuneRequest_INTERFACE_DEFINED__

DEFINE_GUID(IID_IChannelTuneRequest, 0x0369b4e0, 0x45b6, 0x11d3, 0xb6,0x50, 0x00,0xc0,0x4f,0x79,0x49,0x8e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("0369b4e0-45b6-11d3-b650-00c04f79498e")
IChannelTuneRequest : public ITuneRequest
{
    virtual HRESULT STDMETHODCALLTYPE get_Channel(
        LONG *Channel) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Channel(
        LONG Channel) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IChannelTuneRequest, 0x0369b4e0, 0x45b6, 0x11d3, 0xb6,0x50, 0x00,0xc0,0x4f,0x79,0x49,0x8e)
#endif
#else
typedef struct IChannelTuneRequestVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IChannelTuneRequest* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IChannelTuneRequest* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IChannelTuneRequest* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IChannelTuneRequest* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ITuneRequest methods ***/
    HRESULT (STDMETHODCALLTYPE *get_TuningSpace)(
        IChannelTuneRequest* This,
        ITuningSpace **TuningSpace);

    HRESULT (STDMETHODCALLTYPE *get_Components)(
        IChannelTuneRequest* This,
        IComponents **Components);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IChannelTuneRequest* This,
        ITuneRequest **NewTuneRequest);

    HRESULT (STDMETHODCALLTYPE *get_Locator)(
        IChannelTuneRequest* This,
        ILocator **Locator);

    HRESULT (STDMETHODCALLTYPE *put_Locator)(
        IChannelTuneRequest* This,
        ILocator *Locator);

    /*** IChannelTuneRequest methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Channel)(
        IChannelTuneRequest* This,
        LONG *Channel);

    HRESULT (STDMETHODCALLTYPE *put_Channel)(
        IChannelTuneRequest* This,
        LONG Channel);

    END_INTERFACE
} IChannelTuneRequestVtbl;
interface IChannelTuneRequest {
    CONST_VTBL IChannelTuneRequestVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IChannelTuneRequest_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IChannelTuneRequest_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IChannelTuneRequest_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IChannelTuneRequest_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IChannelTuneRequest_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IChannelTuneRequest_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IChannelTuneRequest_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ITuneRequest methods ***/
#define IChannelTuneRequest_get_TuningSpace(This,TuningSpace) (This)->lpVtbl->get_TuningSpace(This,TuningSpace)
#define IChannelTuneRequest_get_Components(This,Components) (This)->lpVtbl->get_Components(This,Components)
#define IChannelTuneRequest_Clone(This,NewTuneRequest) (This)->lpVtbl->Clone(This,NewTuneRequest)
#define IChannelTuneRequest_get_Locator(This,Locator) (This)->lpVtbl->get_Locator(This,Locator)
#define IChannelTuneRequest_put_Locator(This,Locator) (This)->lpVtbl->put_Locator(This,Locator)
/*** IChannelTuneRequest methods ***/
#define IChannelTuneRequest_get_Channel(This,Channel) (This)->lpVtbl->get_Channel(This,Channel)
#define IChannelTuneRequest_put_Channel(This,Channel) (This)->lpVtbl->put_Channel(This,Channel)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IChannelTuneRequest_QueryInterface(IChannelTuneRequest* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IChannelTuneRequest_AddRef(IChannelTuneRequest* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IChannelTuneRequest_Release(IChannelTuneRequest* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IChannelTuneRequest_GetTypeInfoCount(IChannelTuneRequest* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IChannelTuneRequest_GetTypeInfo(IChannelTuneRequest* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IChannelTuneRequest_GetIDsOfNames(IChannelTuneRequest* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IChannelTuneRequest_Invoke(IChannelTuneRequest* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ITuneRequest methods ***/
static FORCEINLINE HRESULT IChannelTuneRequest_get_TuningSpace(IChannelTuneRequest* This,ITuningSpace **TuningSpace) {
    return This->lpVtbl->get_TuningSpace(This,TuningSpace);
}
static FORCEINLINE HRESULT IChannelTuneRequest_get_Components(IChannelTuneRequest* This,IComponents **Components) {
    return This->lpVtbl->get_Components(This,Components);
}
static FORCEINLINE HRESULT IChannelTuneRequest_Clone(IChannelTuneRequest* This,ITuneRequest **NewTuneRequest) {
    return This->lpVtbl->Clone(This,NewTuneRequest);
}
static FORCEINLINE HRESULT IChannelTuneRequest_get_Locator(IChannelTuneRequest* This,ILocator **Locator) {
    return This->lpVtbl->get_Locator(This,Locator);
}
static FORCEINLINE HRESULT IChannelTuneRequest_put_Locator(IChannelTuneRequest* This,ILocator *Locator) {
    return This->lpVtbl->put_Locator(This,Locator);
}
/*** IChannelTuneRequest methods ***/
static FORCEINLINE HRESULT IChannelTuneRequest_get_Channel(IChannelTuneRequest* This,LONG *Channel) {
    return This->lpVtbl->get_Channel(This,Channel);
}
static FORCEINLINE HRESULT IChannelTuneRequest_put_Channel(IChannelTuneRequest* This,LONG Channel) {
    return This->lpVtbl->put_Channel(This,Channel);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IChannelTuneRequest_get_Channel_Proxy(
    IChannelTuneRequest* This,
    LONG *Channel);
void __RPC_STUB IChannelTuneRequest_get_Channel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IChannelTuneRequest_put_Channel_Proxy(
    IChannelTuneRequest* This,
    LONG Channel);
void __RPC_STUB IChannelTuneRequest_put_Channel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IChannelTuneRequest_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IATSCChannelTuneRequest interface
 */
#ifndef __IATSCChannelTuneRequest_INTERFACE_DEFINED__
#define __IATSCChannelTuneRequest_INTERFACE_DEFINED__

DEFINE_GUID(IID_IATSCChannelTuneRequest, 0x0369b4e1, 0x45b6, 0x11d3, 0xb6,0x50, 0x00,0xc0,0x4f,0x79,0x49,0x8e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("0369b4e1-45b6-11d3-b650-00c04f79498e")
IATSCChannelTuneRequest : public IChannelTuneRequest
{
    virtual HRESULT STDMETHODCALLTYPE get_MinorChannel(
        LONG *MinorChannel) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_MinorChannel(
        LONG MinorChannel) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IATSCChannelTuneRequest, 0x0369b4e1, 0x45b6, 0x11d3, 0xb6,0x50, 0x00,0xc0,0x4f,0x79,0x49,0x8e)
#endif
#else
typedef struct IATSCChannelTuneRequestVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IATSCChannelTuneRequest* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IATSCChannelTuneRequest* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IATSCChannelTuneRequest* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IATSCChannelTuneRequest* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ITuneRequest methods ***/
    HRESULT (STDMETHODCALLTYPE *get_TuningSpace)(
        IATSCChannelTuneRequest* This,
        ITuningSpace **TuningSpace);

    HRESULT (STDMETHODCALLTYPE *get_Components)(
        IATSCChannelTuneRequest* This,
        IComponents **Components);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IATSCChannelTuneRequest* This,
        ITuneRequest **NewTuneRequest);

    HRESULT (STDMETHODCALLTYPE *get_Locator)(
        IATSCChannelTuneRequest* This,
        ILocator **Locator);

    HRESULT (STDMETHODCALLTYPE *put_Locator)(
        IATSCChannelTuneRequest* This,
        ILocator *Locator);

    /*** IChannelTuneRequest methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Channel)(
        IATSCChannelTuneRequest* This,
        LONG *Channel);

    HRESULT (STDMETHODCALLTYPE *put_Channel)(
        IATSCChannelTuneRequest* This,
        LONG Channel);

    /*** IATSCChannelTuneRequest methods ***/
    HRESULT (STDMETHODCALLTYPE *get_MinorChannel)(
        IATSCChannelTuneRequest* This,
        LONG *MinorChannel);

    HRESULT (STDMETHODCALLTYPE *put_MinorChannel)(
        IATSCChannelTuneRequest* This,
        LONG MinorChannel);

    END_INTERFACE
} IATSCChannelTuneRequestVtbl;
interface IATSCChannelTuneRequest {
    CONST_VTBL IATSCChannelTuneRequestVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IATSCChannelTuneRequest_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IATSCChannelTuneRequest_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IATSCChannelTuneRequest_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IATSCChannelTuneRequest_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IATSCChannelTuneRequest_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IATSCChannelTuneRequest_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IATSCChannelTuneRequest_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ITuneRequest methods ***/
#define IATSCChannelTuneRequest_get_TuningSpace(This,TuningSpace) (This)->lpVtbl->get_TuningSpace(This,TuningSpace)
#define IATSCChannelTuneRequest_get_Components(This,Components) (This)->lpVtbl->get_Components(This,Components)
#define IATSCChannelTuneRequest_Clone(This,NewTuneRequest) (This)->lpVtbl->Clone(This,NewTuneRequest)
#define IATSCChannelTuneRequest_get_Locator(This,Locator) (This)->lpVtbl->get_Locator(This,Locator)
#define IATSCChannelTuneRequest_put_Locator(This,Locator) (This)->lpVtbl->put_Locator(This,Locator)
/*** IChannelTuneRequest methods ***/
#define IATSCChannelTuneRequest_get_Channel(This,Channel) (This)->lpVtbl->get_Channel(This,Channel)
#define IATSCChannelTuneRequest_put_Channel(This,Channel) (This)->lpVtbl->put_Channel(This,Channel)
/*** IATSCChannelTuneRequest methods ***/
#define IATSCChannelTuneRequest_get_MinorChannel(This,MinorChannel) (This)->lpVtbl->get_MinorChannel(This,MinorChannel)
#define IATSCChannelTuneRequest_put_MinorChannel(This,MinorChannel) (This)->lpVtbl->put_MinorChannel(This,MinorChannel)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IATSCChannelTuneRequest_QueryInterface(IATSCChannelTuneRequest* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IATSCChannelTuneRequest_AddRef(IATSCChannelTuneRequest* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IATSCChannelTuneRequest_Release(IATSCChannelTuneRequest* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IATSCChannelTuneRequest_GetTypeInfoCount(IATSCChannelTuneRequest* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IATSCChannelTuneRequest_GetTypeInfo(IATSCChannelTuneRequest* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IATSCChannelTuneRequest_GetIDsOfNames(IATSCChannelTuneRequest* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IATSCChannelTuneRequest_Invoke(IATSCChannelTuneRequest* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ITuneRequest methods ***/
static FORCEINLINE HRESULT IATSCChannelTuneRequest_get_TuningSpace(IATSCChannelTuneRequest* This,ITuningSpace **TuningSpace) {
    return This->lpVtbl->get_TuningSpace(This,TuningSpace);
}
static FORCEINLINE HRESULT IATSCChannelTuneRequest_get_Components(IATSCChannelTuneRequest* This,IComponents **Components) {
    return This->lpVtbl->get_Components(This,Components);
}
static FORCEINLINE HRESULT IATSCChannelTuneRequest_Clone(IATSCChannelTuneRequest* This,ITuneRequest **NewTuneRequest) {
    return This->lpVtbl->Clone(This,NewTuneRequest);
}
static FORCEINLINE HRESULT IATSCChannelTuneRequest_get_Locator(IATSCChannelTuneRequest* This,ILocator **Locator) {
    return This->lpVtbl->get_Locator(This,Locator);
}
static FORCEINLINE HRESULT IATSCChannelTuneRequest_put_Locator(IATSCChannelTuneRequest* This,ILocator *Locator) {
    return This->lpVtbl->put_Locator(This,Locator);
}
/*** IChannelTuneRequest methods ***/
static FORCEINLINE HRESULT IATSCChannelTuneRequest_get_Channel(IATSCChannelTuneRequest* This,LONG *Channel) {
    return This->lpVtbl->get_Channel(This,Channel);
}
static FORCEINLINE HRESULT IATSCChannelTuneRequest_put_Channel(IATSCChannelTuneRequest* This,LONG Channel) {
    return This->lpVtbl->put_Channel(This,Channel);
}
/*** IATSCChannelTuneRequest methods ***/
static FORCEINLINE HRESULT IATSCChannelTuneRequest_get_MinorChannel(IATSCChannelTuneRequest* This,LONG *MinorChannel) {
    return This->lpVtbl->get_MinorChannel(This,MinorChannel);
}
static FORCEINLINE HRESULT IATSCChannelTuneRequest_put_MinorChannel(IATSCChannelTuneRequest* This,LONG MinorChannel) {
    return This->lpVtbl->put_MinorChannel(This,MinorChannel);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IATSCChannelTuneRequest_get_MinorChannel_Proxy(
    IATSCChannelTuneRequest* This,
    LONG *MinorChannel);
void __RPC_STUB IATSCChannelTuneRequest_get_MinorChannel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IATSCChannelTuneRequest_put_MinorChannel_Proxy(
    IATSCChannelTuneRequest* This,
    LONG MinorChannel);
void __RPC_STUB IATSCChannelTuneRequest_put_MinorChannel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IATSCChannelTuneRequest_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDigitalCableTuneRequest interface
 */
#ifndef __IDigitalCableTuneRequest_INTERFACE_DEFINED__
#define __IDigitalCableTuneRequest_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDigitalCableTuneRequest, 0xbad7753b, 0x6b37, 0x4810, 0xae,0x57, 0x3c,0xe0,0xc4,0xa9,0xe6,0xcb);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("bad7753b-6b37-4810-ae57-3ce0c4a9e6cb")
IDigitalCableTuneRequest : public IATSCChannelTuneRequest
{
    virtual HRESULT STDMETHODCALLTYPE get_MajorChannel(
        LONG *pMajorChannel) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_MajorChannel(
        LONG MajorChannel) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_SourceID(
        LONG *pSourceID) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_SourceID(
        LONG SourceID) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDigitalCableTuneRequest, 0xbad7753b, 0x6b37, 0x4810, 0xae,0x57, 0x3c,0xe0,0xc4,0xa9,0xe6,0xcb)
#endif
#else
typedef struct IDigitalCableTuneRequestVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IDigitalCableTuneRequest* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IDigitalCableTuneRequest* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IDigitalCableTuneRequest* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IDigitalCableTuneRequest* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ITuneRequest methods ***/
    HRESULT (STDMETHODCALLTYPE *get_TuningSpace)(
        IDigitalCableTuneRequest* This,
        ITuningSpace **TuningSpace);

    HRESULT (STDMETHODCALLTYPE *get_Components)(
        IDigitalCableTuneRequest* This,
        IComponents **Components);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IDigitalCableTuneRequest* This,
        ITuneRequest **NewTuneRequest);

    HRESULT (STDMETHODCALLTYPE *get_Locator)(
        IDigitalCableTuneRequest* This,
        ILocator **Locator);

    HRESULT (STDMETHODCALLTYPE *put_Locator)(
        IDigitalCableTuneRequest* This,
        ILocator *Locator);

    /*** IChannelTuneRequest methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Channel)(
        IDigitalCableTuneRequest* This,
        LONG *Channel);

    HRESULT (STDMETHODCALLTYPE *put_Channel)(
        IDigitalCableTuneRequest* This,
        LONG Channel);

    /*** IATSCChannelTuneRequest methods ***/
    HRESULT (STDMETHODCALLTYPE *get_MinorChannel)(
        IDigitalCableTuneRequest* This,
        LONG *MinorChannel);

    HRESULT (STDMETHODCALLTYPE *put_MinorChannel)(
        IDigitalCableTuneRequest* This,
        LONG MinorChannel);

    /*** IDigitalCableTuneRequest methods ***/
    HRESULT (STDMETHODCALLTYPE *get_MajorChannel)(
        IDigitalCableTuneRequest* This,
        LONG *pMajorChannel);

    HRESULT (STDMETHODCALLTYPE *put_MajorChannel)(
        IDigitalCableTuneRequest* This,
        LONG MajorChannel);

    HRESULT (STDMETHODCALLTYPE *get_SourceID)(
        IDigitalCableTuneRequest* This,
        LONG *pSourceID);

    HRESULT (STDMETHODCALLTYPE *put_SourceID)(
        IDigitalCableTuneRequest* This,
        LONG SourceID);

    END_INTERFACE
} IDigitalCableTuneRequestVtbl;
interface IDigitalCableTuneRequest {
    CONST_VTBL IDigitalCableTuneRequestVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDigitalCableTuneRequest_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDigitalCableTuneRequest_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDigitalCableTuneRequest_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IDigitalCableTuneRequest_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IDigitalCableTuneRequest_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IDigitalCableTuneRequest_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IDigitalCableTuneRequest_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ITuneRequest methods ***/
#define IDigitalCableTuneRequest_get_TuningSpace(This,TuningSpace) (This)->lpVtbl->get_TuningSpace(This,TuningSpace)
#define IDigitalCableTuneRequest_get_Components(This,Components) (This)->lpVtbl->get_Components(This,Components)
#define IDigitalCableTuneRequest_Clone(This,NewTuneRequest) (This)->lpVtbl->Clone(This,NewTuneRequest)
#define IDigitalCableTuneRequest_get_Locator(This,Locator) (This)->lpVtbl->get_Locator(This,Locator)
#define IDigitalCableTuneRequest_put_Locator(This,Locator) (This)->lpVtbl->put_Locator(This,Locator)
/*** IChannelTuneRequest methods ***/
#define IDigitalCableTuneRequest_get_Channel(This,Channel) (This)->lpVtbl->get_Channel(This,Channel)
#define IDigitalCableTuneRequest_put_Channel(This,Channel) (This)->lpVtbl->put_Channel(This,Channel)
/*** IATSCChannelTuneRequest methods ***/
#define IDigitalCableTuneRequest_get_MinorChannel(This,MinorChannel) (This)->lpVtbl->get_MinorChannel(This,MinorChannel)
#define IDigitalCableTuneRequest_put_MinorChannel(This,MinorChannel) (This)->lpVtbl->put_MinorChannel(This,MinorChannel)
/*** IDigitalCableTuneRequest methods ***/
#define IDigitalCableTuneRequest_get_MajorChannel(This,pMajorChannel) (This)->lpVtbl->get_MajorChannel(This,pMajorChannel)
#define IDigitalCableTuneRequest_put_MajorChannel(This,MajorChannel) (This)->lpVtbl->put_MajorChannel(This,MajorChannel)
#define IDigitalCableTuneRequest_get_SourceID(This,pSourceID) (This)->lpVtbl->get_SourceID(This,pSourceID)
#define IDigitalCableTuneRequest_put_SourceID(This,SourceID) (This)->lpVtbl->put_SourceID(This,SourceID)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDigitalCableTuneRequest_QueryInterface(IDigitalCableTuneRequest* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDigitalCableTuneRequest_AddRef(IDigitalCableTuneRequest* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDigitalCableTuneRequest_Release(IDigitalCableTuneRequest* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IDigitalCableTuneRequest_GetTypeInfoCount(IDigitalCableTuneRequest* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IDigitalCableTuneRequest_GetTypeInfo(IDigitalCableTuneRequest* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IDigitalCableTuneRequest_GetIDsOfNames(IDigitalCableTuneRequest* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IDigitalCableTuneRequest_Invoke(IDigitalCableTuneRequest* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ITuneRequest methods ***/
static FORCEINLINE HRESULT IDigitalCableTuneRequest_get_TuningSpace(IDigitalCableTuneRequest* This,ITuningSpace **TuningSpace) {
    return This->lpVtbl->get_TuningSpace(This,TuningSpace);
}
static FORCEINLINE HRESULT IDigitalCableTuneRequest_get_Components(IDigitalCableTuneRequest* This,IComponents **Components) {
    return This->lpVtbl->get_Components(This,Components);
}
static FORCEINLINE HRESULT IDigitalCableTuneRequest_Clone(IDigitalCableTuneRequest* This,ITuneRequest **NewTuneRequest) {
    return This->lpVtbl->Clone(This,NewTuneRequest);
}
static FORCEINLINE HRESULT IDigitalCableTuneRequest_get_Locator(IDigitalCableTuneRequest* This,ILocator **Locator) {
    return This->lpVtbl->get_Locator(This,Locator);
}
static FORCEINLINE HRESULT IDigitalCableTuneRequest_put_Locator(IDigitalCableTuneRequest* This,ILocator *Locator) {
    return This->lpVtbl->put_Locator(This,Locator);
}
/*** IChannelTuneRequest methods ***/
static FORCEINLINE HRESULT IDigitalCableTuneRequest_get_Channel(IDigitalCableTuneRequest* This,LONG *Channel) {
    return This->lpVtbl->get_Channel(This,Channel);
}
static FORCEINLINE HRESULT IDigitalCableTuneRequest_put_Channel(IDigitalCableTuneRequest* This,LONG Channel) {
    return This->lpVtbl->put_Channel(This,Channel);
}
/*** IATSCChannelTuneRequest methods ***/
static FORCEINLINE HRESULT IDigitalCableTuneRequest_get_MinorChannel(IDigitalCableTuneRequest* This,LONG *MinorChannel) {
    return This->lpVtbl->get_MinorChannel(This,MinorChannel);
}
static FORCEINLINE HRESULT IDigitalCableTuneRequest_put_MinorChannel(IDigitalCableTuneRequest* This,LONG MinorChannel) {
    return This->lpVtbl->put_MinorChannel(This,MinorChannel);
}
/*** IDigitalCableTuneRequest methods ***/
static FORCEINLINE HRESULT IDigitalCableTuneRequest_get_MajorChannel(IDigitalCableTuneRequest* This,LONG *pMajorChannel) {
    return This->lpVtbl->get_MajorChannel(This,pMajorChannel);
}
static FORCEINLINE HRESULT IDigitalCableTuneRequest_put_MajorChannel(IDigitalCableTuneRequest* This,LONG MajorChannel) {
    return This->lpVtbl->put_MajorChannel(This,MajorChannel);
}
static FORCEINLINE HRESULT IDigitalCableTuneRequest_get_SourceID(IDigitalCableTuneRequest* This,LONG *pSourceID) {
    return This->lpVtbl->get_SourceID(This,pSourceID);
}
static FORCEINLINE HRESULT IDigitalCableTuneRequest_put_SourceID(IDigitalCableTuneRequest* This,LONG SourceID) {
    return This->lpVtbl->put_SourceID(This,SourceID);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IDigitalCableTuneRequest_get_MajorChannel_Proxy(
    IDigitalCableTuneRequest* This,
    LONG *pMajorChannel);
void __RPC_STUB IDigitalCableTuneRequest_get_MajorChannel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDigitalCableTuneRequest_put_MajorChannel_Proxy(
    IDigitalCableTuneRequest* This,
    LONG MajorChannel);
void __RPC_STUB IDigitalCableTuneRequest_put_MajorChannel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDigitalCableTuneRequest_get_SourceID_Proxy(
    IDigitalCableTuneRequest* This,
    LONG *pSourceID);
void __RPC_STUB IDigitalCableTuneRequest_get_SourceID_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDigitalCableTuneRequest_put_SourceID_Proxy(
    IDigitalCableTuneRequest* This,
    LONG SourceID);
void __RPC_STUB IDigitalCableTuneRequest_put_SourceID_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IDigitalCableTuneRequest_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDVBTuneRequest interface
 */
#ifndef __IDVBTuneRequest_INTERFACE_DEFINED__
#define __IDVBTuneRequest_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDVBTuneRequest, 0x0d6f567e, 0xa636, 0x42bb, 0x83,0xba, 0xce,0x4c,0x17,0x04,0xaf,0xa2);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("0d6f567e-a636-42bb-83ba-ce4c1704afa2")
IDVBTuneRequest : public ITuneRequest
{
    virtual HRESULT STDMETHODCALLTYPE get_ONID(
        LONG *ONID) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ONID(
        LONG ONID) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_TSID(
        LONG *TSID) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_TSID(
        LONG TSID) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_SID(
        LONG *SID) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_SID(
        LONG SID) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDVBTuneRequest, 0x0d6f567e, 0xa636, 0x42bb, 0x83,0xba, 0xce,0x4c,0x17,0x04,0xaf,0xa2)
#endif
#else
typedef struct IDVBTuneRequestVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IDVBTuneRequest* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IDVBTuneRequest* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IDVBTuneRequest* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IDVBTuneRequest* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ITuneRequest methods ***/
    HRESULT (STDMETHODCALLTYPE *get_TuningSpace)(
        IDVBTuneRequest* This,
        ITuningSpace **TuningSpace);

    HRESULT (STDMETHODCALLTYPE *get_Components)(
        IDVBTuneRequest* This,
        IComponents **Components);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IDVBTuneRequest* This,
        ITuneRequest **NewTuneRequest);

    HRESULT (STDMETHODCALLTYPE *get_Locator)(
        IDVBTuneRequest* This,
        ILocator **Locator);

    HRESULT (STDMETHODCALLTYPE *put_Locator)(
        IDVBTuneRequest* This,
        ILocator *Locator);

    /*** IDVBTuneRequest methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ONID)(
        IDVBTuneRequest* This,
        LONG *ONID);

    HRESULT (STDMETHODCALLTYPE *put_ONID)(
        IDVBTuneRequest* This,
        LONG ONID);

    HRESULT (STDMETHODCALLTYPE *get_TSID)(
        IDVBTuneRequest* This,
        LONG *TSID);

    HRESULT (STDMETHODCALLTYPE *put_TSID)(
        IDVBTuneRequest* This,
        LONG TSID);

    HRESULT (STDMETHODCALLTYPE *get_SID)(
        IDVBTuneRequest* This,
        LONG *SID);

    HRESULT (STDMETHODCALLTYPE *put_SID)(
        IDVBTuneRequest* This,
        LONG SID);

    END_INTERFACE
} IDVBTuneRequestVtbl;
interface IDVBTuneRequest {
    CONST_VTBL IDVBTuneRequestVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDVBTuneRequest_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDVBTuneRequest_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDVBTuneRequest_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IDVBTuneRequest_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IDVBTuneRequest_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IDVBTuneRequest_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IDVBTuneRequest_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ITuneRequest methods ***/
#define IDVBTuneRequest_get_TuningSpace(This,TuningSpace) (This)->lpVtbl->get_TuningSpace(This,TuningSpace)
#define IDVBTuneRequest_get_Components(This,Components) (This)->lpVtbl->get_Components(This,Components)
#define IDVBTuneRequest_Clone(This,NewTuneRequest) (This)->lpVtbl->Clone(This,NewTuneRequest)
#define IDVBTuneRequest_get_Locator(This,Locator) (This)->lpVtbl->get_Locator(This,Locator)
#define IDVBTuneRequest_put_Locator(This,Locator) (This)->lpVtbl->put_Locator(This,Locator)
/*** IDVBTuneRequest methods ***/
#define IDVBTuneRequest_get_ONID(This,ONID) (This)->lpVtbl->get_ONID(This,ONID)
#define IDVBTuneRequest_put_ONID(This,ONID) (This)->lpVtbl->put_ONID(This,ONID)
#define IDVBTuneRequest_get_TSID(This,TSID) (This)->lpVtbl->get_TSID(This,TSID)
#define IDVBTuneRequest_put_TSID(This,TSID) (This)->lpVtbl->put_TSID(This,TSID)
#define IDVBTuneRequest_get_SID(This,SID) (This)->lpVtbl->get_SID(This,SID)
#define IDVBTuneRequest_put_SID(This,SID) (This)->lpVtbl->put_SID(This,SID)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDVBTuneRequest_QueryInterface(IDVBTuneRequest* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDVBTuneRequest_AddRef(IDVBTuneRequest* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDVBTuneRequest_Release(IDVBTuneRequest* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IDVBTuneRequest_GetTypeInfoCount(IDVBTuneRequest* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IDVBTuneRequest_GetTypeInfo(IDVBTuneRequest* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IDVBTuneRequest_GetIDsOfNames(IDVBTuneRequest* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IDVBTuneRequest_Invoke(IDVBTuneRequest* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ITuneRequest methods ***/
static FORCEINLINE HRESULT IDVBTuneRequest_get_TuningSpace(IDVBTuneRequest* This,ITuningSpace **TuningSpace) {
    return This->lpVtbl->get_TuningSpace(This,TuningSpace);
}
static FORCEINLINE HRESULT IDVBTuneRequest_get_Components(IDVBTuneRequest* This,IComponents **Components) {
    return This->lpVtbl->get_Components(This,Components);
}
static FORCEINLINE HRESULT IDVBTuneRequest_Clone(IDVBTuneRequest* This,ITuneRequest **NewTuneRequest) {
    return This->lpVtbl->Clone(This,NewTuneRequest);
}
static FORCEINLINE HRESULT IDVBTuneRequest_get_Locator(IDVBTuneRequest* This,ILocator **Locator) {
    return This->lpVtbl->get_Locator(This,Locator);
}
static FORCEINLINE HRESULT IDVBTuneRequest_put_Locator(IDVBTuneRequest* This,ILocator *Locator) {
    return This->lpVtbl->put_Locator(This,Locator);
}
/*** IDVBTuneRequest methods ***/
static FORCEINLINE HRESULT IDVBTuneRequest_get_ONID(IDVBTuneRequest* This,LONG *ONID) {
    return This->lpVtbl->get_ONID(This,ONID);
}
static FORCEINLINE HRESULT IDVBTuneRequest_put_ONID(IDVBTuneRequest* This,LONG ONID) {
    return This->lpVtbl->put_ONID(This,ONID);
}
static FORCEINLINE HRESULT IDVBTuneRequest_get_TSID(IDVBTuneRequest* This,LONG *TSID) {
    return This->lpVtbl->get_TSID(This,TSID);
}
static FORCEINLINE HRESULT IDVBTuneRequest_put_TSID(IDVBTuneRequest* This,LONG TSID) {
    return This->lpVtbl->put_TSID(This,TSID);
}
static FORCEINLINE HRESULT IDVBTuneRequest_get_SID(IDVBTuneRequest* This,LONG *SID) {
    return This->lpVtbl->get_SID(This,SID);
}
static FORCEINLINE HRESULT IDVBTuneRequest_put_SID(IDVBTuneRequest* This,LONG SID) {
    return This->lpVtbl->put_SID(This,SID);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IDVBTuneRequest_get_ONID_Proxy(
    IDVBTuneRequest* This,
    LONG *ONID);
void __RPC_STUB IDVBTuneRequest_get_ONID_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDVBTuneRequest_put_ONID_Proxy(
    IDVBTuneRequest* This,
    LONG ONID);
void __RPC_STUB IDVBTuneRequest_put_ONID_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDVBTuneRequest_get_TSID_Proxy(
    IDVBTuneRequest* This,
    LONG *TSID);
void __RPC_STUB IDVBTuneRequest_get_TSID_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDVBTuneRequest_put_TSID_Proxy(
    IDVBTuneRequest* This,
    LONG TSID);
void __RPC_STUB IDVBTuneRequest_put_TSID_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDVBTuneRequest_get_SID_Proxy(
    IDVBTuneRequest* This,
    LONG *SID);
void __RPC_STUB IDVBTuneRequest_get_SID_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDVBTuneRequest_put_SID_Proxy(
    IDVBTuneRequest* This,
    LONG SID);
void __RPC_STUB IDVBTuneRequest_put_SID_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IDVBTuneRequest_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMPEG2TuneRequest interface
 */
#ifndef __IMPEG2TuneRequest_INTERFACE_DEFINED__
#define __IMPEG2TuneRequest_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMPEG2TuneRequest, 0xeb7d987f, 0x8a01, 0x42ad, 0xb8,0xae, 0x57,0x4d,0xee,0xe4,0x4d,0x1a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("eb7d987f-8a01-42ad-b8ae-574deee44d1a")
IMPEG2TuneRequest : public ITuneRequest
{
    virtual HRESULT STDMETHODCALLTYPE get_TSID(
        LONG *TSID) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_TSID(
        LONG TSID) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ProgNo(
        LONG *ProgNo) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ProgNo(
        LONG ProgNo) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMPEG2TuneRequest, 0xeb7d987f, 0x8a01, 0x42ad, 0xb8,0xae, 0x57,0x4d,0xee,0xe4,0x4d,0x1a)
#endif
#else
typedef struct IMPEG2TuneRequestVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IMPEG2TuneRequest* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IMPEG2TuneRequest* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IMPEG2TuneRequest* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IMPEG2TuneRequest* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ITuneRequest methods ***/
    HRESULT (STDMETHODCALLTYPE *get_TuningSpace)(
        IMPEG2TuneRequest* This,
        ITuningSpace **TuningSpace);

    HRESULT (STDMETHODCALLTYPE *get_Components)(
        IMPEG2TuneRequest* This,
        IComponents **Components);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IMPEG2TuneRequest* This,
        ITuneRequest **NewTuneRequest);

    HRESULT (STDMETHODCALLTYPE *get_Locator)(
        IMPEG2TuneRequest* This,
        ILocator **Locator);

    HRESULT (STDMETHODCALLTYPE *put_Locator)(
        IMPEG2TuneRequest* This,
        ILocator *Locator);

    /*** IMPEG2TuneRequest methods ***/
    HRESULT (STDMETHODCALLTYPE *get_TSID)(
        IMPEG2TuneRequest* This,
        LONG *TSID);

    HRESULT (STDMETHODCALLTYPE *put_TSID)(
        IMPEG2TuneRequest* This,
        LONG TSID);

    HRESULT (STDMETHODCALLTYPE *get_ProgNo)(
        IMPEG2TuneRequest* This,
        LONG *ProgNo);

    HRESULT (STDMETHODCALLTYPE *put_ProgNo)(
        IMPEG2TuneRequest* This,
        LONG ProgNo);

    END_INTERFACE
} IMPEG2TuneRequestVtbl;
interface IMPEG2TuneRequest {
    CONST_VTBL IMPEG2TuneRequestVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMPEG2TuneRequest_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMPEG2TuneRequest_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMPEG2TuneRequest_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IMPEG2TuneRequest_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IMPEG2TuneRequest_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IMPEG2TuneRequest_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IMPEG2TuneRequest_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ITuneRequest methods ***/
#define IMPEG2TuneRequest_get_TuningSpace(This,TuningSpace) (This)->lpVtbl->get_TuningSpace(This,TuningSpace)
#define IMPEG2TuneRequest_get_Components(This,Components) (This)->lpVtbl->get_Components(This,Components)
#define IMPEG2TuneRequest_Clone(This,NewTuneRequest) (This)->lpVtbl->Clone(This,NewTuneRequest)
#define IMPEG2TuneRequest_get_Locator(This,Locator) (This)->lpVtbl->get_Locator(This,Locator)
#define IMPEG2TuneRequest_put_Locator(This,Locator) (This)->lpVtbl->put_Locator(This,Locator)
/*** IMPEG2TuneRequest methods ***/
#define IMPEG2TuneRequest_get_TSID(This,TSID) (This)->lpVtbl->get_TSID(This,TSID)
#define IMPEG2TuneRequest_put_TSID(This,TSID) (This)->lpVtbl->put_TSID(This,TSID)
#define IMPEG2TuneRequest_get_ProgNo(This,ProgNo) (This)->lpVtbl->get_ProgNo(This,ProgNo)
#define IMPEG2TuneRequest_put_ProgNo(This,ProgNo) (This)->lpVtbl->put_ProgNo(This,ProgNo)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IMPEG2TuneRequest_QueryInterface(IMPEG2TuneRequest* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IMPEG2TuneRequest_AddRef(IMPEG2TuneRequest* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IMPEG2TuneRequest_Release(IMPEG2TuneRequest* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IMPEG2TuneRequest_GetTypeInfoCount(IMPEG2TuneRequest* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IMPEG2TuneRequest_GetTypeInfo(IMPEG2TuneRequest* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IMPEG2TuneRequest_GetIDsOfNames(IMPEG2TuneRequest* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IMPEG2TuneRequest_Invoke(IMPEG2TuneRequest* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ITuneRequest methods ***/
static FORCEINLINE HRESULT IMPEG2TuneRequest_get_TuningSpace(IMPEG2TuneRequest* This,ITuningSpace **TuningSpace) {
    return This->lpVtbl->get_TuningSpace(This,TuningSpace);
}
static FORCEINLINE HRESULT IMPEG2TuneRequest_get_Components(IMPEG2TuneRequest* This,IComponents **Components) {
    return This->lpVtbl->get_Components(This,Components);
}
static FORCEINLINE HRESULT IMPEG2TuneRequest_Clone(IMPEG2TuneRequest* This,ITuneRequest **NewTuneRequest) {
    return This->lpVtbl->Clone(This,NewTuneRequest);
}
static FORCEINLINE HRESULT IMPEG2TuneRequest_get_Locator(IMPEG2TuneRequest* This,ILocator **Locator) {
    return This->lpVtbl->get_Locator(This,Locator);
}
static FORCEINLINE HRESULT IMPEG2TuneRequest_put_Locator(IMPEG2TuneRequest* This,ILocator *Locator) {
    return This->lpVtbl->put_Locator(This,Locator);
}
/*** IMPEG2TuneRequest methods ***/
static FORCEINLINE HRESULT IMPEG2TuneRequest_get_TSID(IMPEG2TuneRequest* This,LONG *TSID) {
    return This->lpVtbl->get_TSID(This,TSID);
}
static FORCEINLINE HRESULT IMPEG2TuneRequest_put_TSID(IMPEG2TuneRequest* This,LONG TSID) {
    return This->lpVtbl->put_TSID(This,TSID);
}
static FORCEINLINE HRESULT IMPEG2TuneRequest_get_ProgNo(IMPEG2TuneRequest* This,LONG *ProgNo) {
    return This->lpVtbl->get_ProgNo(This,ProgNo);
}
static FORCEINLINE HRESULT IMPEG2TuneRequest_put_ProgNo(IMPEG2TuneRequest* This,LONG ProgNo) {
    return This->lpVtbl->put_ProgNo(This,ProgNo);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IMPEG2TuneRequest_get_TSID_Proxy(
    IMPEG2TuneRequest* This,
    LONG *TSID);
void __RPC_STUB IMPEG2TuneRequest_get_TSID_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMPEG2TuneRequest_put_TSID_Proxy(
    IMPEG2TuneRequest* This,
    LONG TSID);
void __RPC_STUB IMPEG2TuneRequest_put_TSID_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMPEG2TuneRequest_get_ProgNo_Proxy(
    IMPEG2TuneRequest* This,
    LONG *ProgNo);
void __RPC_STUB IMPEG2TuneRequest_get_ProgNo_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMPEG2TuneRequest_put_ProgNo_Proxy(
    IMPEG2TuneRequest* This,
    LONG ProgNo);
void __RPC_STUB IMPEG2TuneRequest_put_ProgNo_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IMPEG2TuneRequest_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMPEG2TuneRequestFactory interface
 */
#ifndef __IMPEG2TuneRequestFactory_INTERFACE_DEFINED__
#define __IMPEG2TuneRequestFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMPEG2TuneRequestFactory, 0x14e11abd, 0xee37, 0x4893, 0x9e,0xa1, 0x69,0x64,0xde,0x93,0x3e,0x39);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("14e11abd-ee37-4893-9ea1-6964de933e39")
IMPEG2TuneRequestFactory : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE CreateTuneRequest(
        ITuningSpace *TuningSpace,
        IMPEG2TuneRequest **TuneRequest) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMPEG2TuneRequestFactory, 0x14e11abd, 0xee37, 0x4893, 0x9e,0xa1, 0x69,0x64,0xde,0x93,0x3e,0x39)
#endif
#else
typedef struct IMPEG2TuneRequestFactoryVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IMPEG2TuneRequestFactory* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IMPEG2TuneRequestFactory* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IMPEG2TuneRequestFactory* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IMPEG2TuneRequestFactory* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IMPEG2TuneRequestFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateTuneRequest)(
        IMPEG2TuneRequestFactory* This,
        ITuningSpace *TuningSpace,
        IMPEG2TuneRequest **TuneRequest);

    END_INTERFACE
} IMPEG2TuneRequestFactoryVtbl;
interface IMPEG2TuneRequestFactory {
    CONST_VTBL IMPEG2TuneRequestFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMPEG2TuneRequestFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMPEG2TuneRequestFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMPEG2TuneRequestFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IMPEG2TuneRequestFactory_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IMPEG2TuneRequestFactory_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IMPEG2TuneRequestFactory_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IMPEG2TuneRequestFactory_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IMPEG2TuneRequestFactory methods ***/
#define IMPEG2TuneRequestFactory_CreateTuneRequest(This,TuningSpace,TuneRequest) (This)->lpVtbl->CreateTuneRequest(This,TuningSpace,TuneRequest)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IMPEG2TuneRequestFactory_QueryInterface(IMPEG2TuneRequestFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IMPEG2TuneRequestFactory_AddRef(IMPEG2TuneRequestFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IMPEG2TuneRequestFactory_Release(IMPEG2TuneRequestFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IMPEG2TuneRequestFactory_GetTypeInfoCount(IMPEG2TuneRequestFactory* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IMPEG2TuneRequestFactory_GetTypeInfo(IMPEG2TuneRequestFactory* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IMPEG2TuneRequestFactory_GetIDsOfNames(IMPEG2TuneRequestFactory* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IMPEG2TuneRequestFactory_Invoke(IMPEG2TuneRequestFactory* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IMPEG2TuneRequestFactory methods ***/
static FORCEINLINE HRESULT IMPEG2TuneRequestFactory_CreateTuneRequest(IMPEG2TuneRequestFactory* This,ITuningSpace *TuningSpace,IMPEG2TuneRequest **TuneRequest) {
    return This->lpVtbl->CreateTuneRequest(This,TuningSpace,TuneRequest);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IMPEG2TuneRequestFactory_CreateTuneRequest_Proxy(
    IMPEG2TuneRequestFactory* This,
    ITuningSpace *TuningSpace,
    IMPEG2TuneRequest **TuneRequest);
void __RPC_STUB IMPEG2TuneRequestFactory_CreateTuneRequest_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IMPEG2TuneRequestFactory_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMPEG2TuneRequestSupport interface
 */
#ifndef __IMPEG2TuneRequestSupport_INTERFACE_DEFINED__
#define __IMPEG2TuneRequestSupport_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMPEG2TuneRequestSupport, 0x1b9d5fc3, 0x5bbc, 0x4b6c, 0xbb,0x18, 0xb9,0xd1,0x0e,0x3e,0xee,0xbf);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("1b9d5fc3-5bbc-4b6c-bb18-b9d10e3eeebf")
IMPEG2TuneRequestSupport : public IUnknown
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMPEG2TuneRequestSupport, 0x1b9d5fc3, 0x5bbc, 0x4b6c, 0xbb,0x18, 0xb9,0xd1,0x0e,0x3e,0xee,0xbf)
#endif
#else
typedef struct IMPEG2TuneRequestSupportVtbl {
    BEGIN_INTERFACE

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

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

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

    END_INTERFACE
} IMPEG2TuneRequestSupportVtbl;
interface IMPEG2TuneRequestSupport {
    CONST_VTBL IMPEG2TuneRequestSupportVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMPEG2TuneRequestSupport_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMPEG2TuneRequestSupport_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMPEG2TuneRequestSupport_Release(This) (This)->lpVtbl->Release(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IMPEG2TuneRequestSupport_QueryInterface(IMPEG2TuneRequestSupport* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IMPEG2TuneRequestSupport_AddRef(IMPEG2TuneRequestSupport* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IMPEG2TuneRequestSupport_Release(IMPEG2TuneRequestSupport* This) {
    return This->lpVtbl->Release(This);
}
#endif
#endif

#endif


#endif  /* __IMPEG2TuneRequestSupport_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITunerCap interface
 */
#ifndef __ITunerCap_INTERFACE_DEFINED__
#define __ITunerCap_INTERFACE_DEFINED__

DEFINE_GUID(IID_ITunerCap, 0xe60dfa45, 0x8d56, 0x4e65, 0xa8,0xab, 0xd6,0xbe,0x94,0x12,0xc2,0x49);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("e60dfa45-8d56-4e65-a8ab-d6be9412c249")
ITunerCap : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE get_SupportedNetworkTypes(
        ULONG ulcNetworkTypesMax,
        ULONG *pulcNetworkTypes,
        GUID *pguidNetworkTypes) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_SupportedVideoFormats(
        ULONG *pulAMTunerModeType,
        ULONG *pulAnalogVideoStandard) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_AuxInputCount(
        ULONG *pulCompositeCount,
        ULONG *pulSvideoCount) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ITunerCap, 0xe60dfa45, 0x8d56, 0x4e65, 0xa8,0xab, 0xd6,0xbe,0x94,0x12,0xc2,0x49)
#endif
#else
typedef struct ITunerCapVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITunerCap methods ***/
    HRESULT (STDMETHODCALLTYPE *get_SupportedNetworkTypes)(
        ITunerCap* This,
        ULONG ulcNetworkTypesMax,
        ULONG *pulcNetworkTypes,
        GUID *pguidNetworkTypes);

    HRESULT (STDMETHODCALLTYPE *get_SupportedVideoFormats)(
        ITunerCap* This,
        ULONG *pulAMTunerModeType,
        ULONG *pulAnalogVideoStandard);

    HRESULT (STDMETHODCALLTYPE *get_AuxInputCount)(
        ITunerCap* This,
        ULONG *pulCompositeCount,
        ULONG *pulSvideoCount);

    END_INTERFACE
} ITunerCapVtbl;
interface ITunerCap {
    CONST_VTBL ITunerCapVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ITunerCap_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITunerCap_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITunerCap_Release(This) (This)->lpVtbl->Release(This)
/*** ITunerCap methods ***/
#define ITunerCap_get_SupportedNetworkTypes(This,ulcNetworkTypesMax,pulcNetworkTypes,pguidNetworkTypes) (This)->lpVtbl->get_SupportedNetworkTypes(This,ulcNetworkTypesMax,pulcNetworkTypes,pguidNetworkTypes)
#define ITunerCap_get_SupportedVideoFormats(This,pulAMTunerModeType,pulAnalogVideoStandard) (This)->lpVtbl->get_SupportedVideoFormats(This,pulAMTunerModeType,pulAnalogVideoStandard)
#define ITunerCap_get_AuxInputCount(This,pulCompositeCount,pulSvideoCount) (This)->lpVtbl->get_AuxInputCount(This,pulCompositeCount,pulSvideoCount)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ITunerCap_QueryInterface(ITunerCap* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ITunerCap_AddRef(ITunerCap* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ITunerCap_Release(ITunerCap* This) {
    return This->lpVtbl->Release(This);
}
/*** ITunerCap methods ***/
static FORCEINLINE HRESULT ITunerCap_get_SupportedNetworkTypes(ITunerCap* This,ULONG ulcNetworkTypesMax,ULONG *pulcNetworkTypes,GUID *pguidNetworkTypes) {
    return This->lpVtbl->get_SupportedNetworkTypes(This,ulcNetworkTypesMax,pulcNetworkTypes,pguidNetworkTypes);
}
static FORCEINLINE HRESULT ITunerCap_get_SupportedVideoFormats(ITunerCap* This,ULONG *pulAMTunerModeType,ULONG *pulAnalogVideoStandard) {
    return This->lpVtbl->get_SupportedVideoFormats(This,pulAMTunerModeType,pulAnalogVideoStandard);
}
static FORCEINLINE HRESULT ITunerCap_get_AuxInputCount(ITunerCap* This,ULONG *pulCompositeCount,ULONG *pulSvideoCount) {
    return This->lpVtbl->get_AuxInputCount(This,pulCompositeCount,pulSvideoCount);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ITunerCap_get_SupportedNetworkTypes_Proxy(
    ITunerCap* This,
    ULONG ulcNetworkTypesMax,
    ULONG *pulcNetworkTypes,
    GUID *pguidNetworkTypes);
void __RPC_STUB ITunerCap_get_SupportedNetworkTypes_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITunerCap_get_SupportedVideoFormats_Proxy(
    ITunerCap* This,
    ULONG *pulAMTunerModeType,
    ULONG *pulAnalogVideoStandard);
void __RPC_STUB ITunerCap_get_SupportedVideoFormats_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITunerCap_get_AuxInputCount_Proxy(
    ITunerCap* This,
    ULONG *pulCompositeCount,
    ULONG *pulSvideoCount);
void __RPC_STUB ITunerCap_get_AuxInputCount_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ITunerCap_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITunerCapEx interface
 */
#ifndef __ITunerCapEx_INTERFACE_DEFINED__
#define __ITunerCapEx_INTERFACE_DEFINED__

DEFINE_GUID(IID_ITunerCapEx, 0xed3e0c66, 0x18c8, 0x4ea6, 0x93,0x00, 0xf6,0x84,0x1f,0xdd,0x35,0xdc);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("ed3e0c66-18c8-4ea6-9300-f6841fdd35dc")
ITunerCapEx : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE get_Has608_708Caption(
        VARIANT_BOOL *pbHasCaption) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ITunerCapEx, 0xed3e0c66, 0x18c8, 0x4ea6, 0x93,0x00, 0xf6,0x84,0x1f,0xdd,0x35,0xdc)
#endif
#else
typedef struct ITunerCapExVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITunerCapEx methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Has608_708Caption)(
        ITunerCapEx* This,
        VARIANT_BOOL *pbHasCaption);

    END_INTERFACE
} ITunerCapExVtbl;
interface ITunerCapEx {
    CONST_VTBL ITunerCapExVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ITunerCapEx_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITunerCapEx_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITunerCapEx_Release(This) (This)->lpVtbl->Release(This)
/*** ITunerCapEx methods ***/
#define ITunerCapEx_get_Has608_708Caption(This,pbHasCaption) (This)->lpVtbl->get_Has608_708Caption(This,pbHasCaption)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ITunerCapEx_QueryInterface(ITunerCapEx* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ITunerCapEx_AddRef(ITunerCapEx* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ITunerCapEx_Release(ITunerCapEx* This) {
    return This->lpVtbl->Release(This);
}
/*** ITunerCapEx methods ***/
static FORCEINLINE HRESULT ITunerCapEx_get_Has608_708Caption(ITunerCapEx* This,VARIANT_BOOL *pbHasCaption) {
    return This->lpVtbl->get_Has608_708Caption(This,pbHasCaption);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ITunerCapEx_get_Has608_708Caption_Proxy(
    ITunerCapEx* This,
    VARIANT_BOOL *pbHasCaption);
void __RPC_STUB ITunerCapEx_get_Has608_708Caption_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ITunerCapEx_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITuner interface
 */
#ifndef __ITuner_INTERFACE_DEFINED__
#define __ITuner_INTERFACE_DEFINED__

DEFINE_GUID(IID_ITuner, 0x28c52640, 0x018a, 0x11d3, 0x9d,0x8e, 0x00,0xc0,0x4f,0x72,0xd9,0x80);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("28c52640-018a-11d3-9d8e-00c04f72d980")
ITuner : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE get_TuningSpace(
        ITuningSpace **TuningSpace) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_TuningSpace(
        ITuningSpace *TuningSpace) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumTuningSpaces(
        IEnumTuningSpaces **ppEnum) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_TuneRequest(
        ITuneRequest **TuneRequest) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_TuneRequest(
        ITuneRequest *TuneRequest) = 0;

    virtual HRESULT STDMETHODCALLTYPE Validate(
        ITuneRequest *TuneRequest) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_PreferredComponentTypes(
        IComponentTypes **ComponentTypes) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_PreferredComponentTypes(
        IComponentTypes *ComponentTypes) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_SignalStrength(
        LONG *Strength) = 0;

    virtual HRESULT STDMETHODCALLTYPE TriggerSignalEvents(
        LONG Interval) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ITuner, 0x28c52640, 0x018a, 0x11d3, 0x9d,0x8e, 0x00,0xc0,0x4f,0x72,0xd9,0x80)
#endif
#else
typedef struct ITunerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITuner methods ***/
    HRESULT (STDMETHODCALLTYPE *get_TuningSpace)(
        ITuner* This,
        ITuningSpace **TuningSpace);

    HRESULT (STDMETHODCALLTYPE *put_TuningSpace)(
        ITuner* This,
        ITuningSpace *TuningSpace);

    HRESULT (STDMETHODCALLTYPE *EnumTuningSpaces)(
        ITuner* This,
        IEnumTuningSpaces **ppEnum);

    HRESULT (STDMETHODCALLTYPE *get_TuneRequest)(
        ITuner* This,
        ITuneRequest **TuneRequest);

    HRESULT (STDMETHODCALLTYPE *put_TuneRequest)(
        ITuner* This,
        ITuneRequest *TuneRequest);

    HRESULT (STDMETHODCALLTYPE *Validate)(
        ITuner* This,
        ITuneRequest *TuneRequest);

    HRESULT (STDMETHODCALLTYPE *get_PreferredComponentTypes)(
        ITuner* This,
        IComponentTypes **ComponentTypes);

    HRESULT (STDMETHODCALLTYPE *put_PreferredComponentTypes)(
        ITuner* This,
        IComponentTypes *ComponentTypes);

    HRESULT (STDMETHODCALLTYPE *get_SignalStrength)(
        ITuner* This,
        LONG *Strength);

    HRESULT (STDMETHODCALLTYPE *TriggerSignalEvents)(
        ITuner* This,
        LONG Interval);

    END_INTERFACE
} ITunerVtbl;
interface ITuner {
    CONST_VTBL ITunerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ITuner_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ITuner_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ITuner_Release(This) (This)->lpVtbl->Release(This)
/*** ITuner methods ***/
#define ITuner_get_TuningSpace(This,TuningSpace) (This)->lpVtbl->get_TuningSpace(This,TuningSpace)
#define ITuner_put_TuningSpace(This,TuningSpace) (This)->lpVtbl->put_TuningSpace(This,TuningSpace)
#define ITuner_EnumTuningSpaces(This,ppEnum) (This)->lpVtbl->EnumTuningSpaces(This,ppEnum)
#define ITuner_get_TuneRequest(This,TuneRequest) (This)->lpVtbl->get_TuneRequest(This,TuneRequest)
#define ITuner_put_TuneRequest(This,TuneRequest) (This)->lpVtbl->put_TuneRequest(This,TuneRequest)
#define ITuner_Validate(This,TuneRequest) (This)->lpVtbl->Validate(This,TuneRequest)
#define ITuner_get_PreferredComponentTypes(This,ComponentTypes) (This)->lpVtbl->get_PreferredComponentTypes(This,ComponentTypes)
#define ITuner_put_PreferredComponentTypes(This,ComponentTypes) (This)->lpVtbl->put_PreferredComponentTypes(This,ComponentTypes)
#define ITuner_get_SignalStrength(This,Strength) (This)->lpVtbl->get_SignalStrength(This,Strength)
#define ITuner_TriggerSignalEvents(This,Interval) (This)->lpVtbl->TriggerSignalEvents(This,Interval)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ITuner_QueryInterface(ITuner* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ITuner_AddRef(ITuner* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ITuner_Release(ITuner* This) {
    return This->lpVtbl->Release(This);
}
/*** ITuner methods ***/
static FORCEINLINE HRESULT ITuner_get_TuningSpace(ITuner* This,ITuningSpace **TuningSpace) {
    return This->lpVtbl->get_TuningSpace(This,TuningSpace);
}
static FORCEINLINE HRESULT ITuner_put_TuningSpace(ITuner* This,ITuningSpace *TuningSpace) {
    return This->lpVtbl->put_TuningSpace(This,TuningSpace);
}
static FORCEINLINE HRESULT ITuner_EnumTuningSpaces(ITuner* This,IEnumTuningSpaces **ppEnum) {
    return This->lpVtbl->EnumTuningSpaces(This,ppEnum);
}
static FORCEINLINE HRESULT ITuner_get_TuneRequest(ITuner* This,ITuneRequest **TuneRequest) {
    return This->lpVtbl->get_TuneRequest(This,TuneRequest);
}
static FORCEINLINE HRESULT ITuner_put_TuneRequest(ITuner* This,ITuneRequest *TuneRequest) {
    return This->lpVtbl->put_TuneRequest(This,TuneRequest);
}
static FORCEINLINE HRESULT ITuner_Validate(ITuner* This,ITuneRequest *TuneRequest) {
    return This->lpVtbl->Validate(This,TuneRequest);
}
static FORCEINLINE HRESULT ITuner_get_PreferredComponentTypes(ITuner* This,IComponentTypes **ComponentTypes) {
    return This->lpVtbl->get_PreferredComponentTypes(This,ComponentTypes);
}
static FORCEINLINE HRESULT ITuner_put_PreferredComponentTypes(ITuner* This,IComponentTypes *ComponentTypes) {
    return This->lpVtbl->put_PreferredComponentTypes(This,ComponentTypes);
}
static FORCEINLINE HRESULT ITuner_get_SignalStrength(ITuner* This,LONG *Strength) {
    return This->lpVtbl->get_SignalStrength(This,Strength);
}
static FORCEINLINE HRESULT ITuner_TriggerSignalEvents(ITuner* This,LONG Interval) {
    return This->lpVtbl->TriggerSignalEvents(This,Interval);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ITuner_get_TuningSpace_Proxy(
    ITuner* This,
    ITuningSpace **TuningSpace);
void __RPC_STUB ITuner_get_TuningSpace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITuner_put_TuningSpace_Proxy(
    ITuner* This,
    ITuningSpace *TuningSpace);
void __RPC_STUB ITuner_put_TuningSpace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITuner_EnumTuningSpaces_Proxy(
    ITuner* This,
    IEnumTuningSpaces **ppEnum);
void __RPC_STUB ITuner_EnumTuningSpaces_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITuner_get_TuneRequest_Proxy(
    ITuner* This,
    ITuneRequest **TuneRequest);
void __RPC_STUB ITuner_get_TuneRequest_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITuner_put_TuneRequest_Proxy(
    ITuner* This,
    ITuneRequest *TuneRequest);
void __RPC_STUB ITuner_put_TuneRequest_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITuner_Validate_Proxy(
    ITuner* This,
    ITuneRequest *TuneRequest);
void __RPC_STUB ITuner_Validate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITuner_get_PreferredComponentTypes_Proxy(
    ITuner* This,
    IComponentTypes **ComponentTypes);
void __RPC_STUB ITuner_get_PreferredComponentTypes_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITuner_put_PreferredComponentTypes_Proxy(
    ITuner* This,
    IComponentTypes *ComponentTypes);
void __RPC_STUB ITuner_put_PreferredComponentTypes_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITuner_get_SignalStrength_Proxy(
    ITuner* This,
    LONG *Strength);
void __RPC_STUB ITuner_get_SignalStrength_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ITuner_TriggerSignalEvents_Proxy(
    ITuner* This,
    LONG Interval);
void __RPC_STUB ITuner_TriggerSignalEvents_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ITuner_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IScanningTuner interface
 */
#ifndef __IScanningTuner_INTERFACE_DEFINED__
#define __IScanningTuner_INTERFACE_DEFINED__

DEFINE_GUID(IID_IScanningTuner, 0x1dfd0a5c, 0x0284, 0x11d3, 0x9d,0x8e, 0x00,0xc0,0x4f,0x72,0xd9,0x80);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("1dfd0a5c-0284-11d3-9d8e-00c04f72d980")
IScanningTuner : public ITuner
{
    virtual HRESULT STDMETHODCALLTYPE SeekUp(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SeekDown(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE ScanUp(
        LONG MillisecondsPause) = 0;

    virtual HRESULT STDMETHODCALLTYPE ScanDown(
        LONG MillisecondsPause) = 0;

    virtual HRESULT STDMETHODCALLTYPE AutoProgram(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IScanningTuner, 0x1dfd0a5c, 0x0284, 0x11d3, 0x9d,0x8e, 0x00,0xc0,0x4f,0x72,0xd9,0x80)
#endif
#else
typedef struct IScanningTunerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITuner methods ***/
    HRESULT (STDMETHODCALLTYPE *get_TuningSpace)(
        IScanningTuner* This,
        ITuningSpace **TuningSpace);

    HRESULT (STDMETHODCALLTYPE *put_TuningSpace)(
        IScanningTuner* This,
        ITuningSpace *TuningSpace);

    HRESULT (STDMETHODCALLTYPE *EnumTuningSpaces)(
        IScanningTuner* This,
        IEnumTuningSpaces **ppEnum);

    HRESULT (STDMETHODCALLTYPE *get_TuneRequest)(
        IScanningTuner* This,
        ITuneRequest **TuneRequest);

    HRESULT (STDMETHODCALLTYPE *put_TuneRequest)(
        IScanningTuner* This,
        ITuneRequest *TuneRequest);

    HRESULT (STDMETHODCALLTYPE *Validate)(
        IScanningTuner* This,
        ITuneRequest *TuneRequest);

    HRESULT (STDMETHODCALLTYPE *get_PreferredComponentTypes)(
        IScanningTuner* This,
        IComponentTypes **ComponentTypes);

    HRESULT (STDMETHODCALLTYPE *put_PreferredComponentTypes)(
        IScanningTuner* This,
        IComponentTypes *ComponentTypes);

    HRESULT (STDMETHODCALLTYPE *get_SignalStrength)(
        IScanningTuner* This,
        LONG *Strength);

    HRESULT (STDMETHODCALLTYPE *TriggerSignalEvents)(
        IScanningTuner* This,
        LONG Interval);

    /*** IScanningTuner methods ***/
    HRESULT (STDMETHODCALLTYPE *SeekUp)(
        IScanningTuner* This);

    HRESULT (STDMETHODCALLTYPE *SeekDown)(
        IScanningTuner* This);

    HRESULT (STDMETHODCALLTYPE *ScanUp)(
        IScanningTuner* This,
        LONG MillisecondsPause);

    HRESULT (STDMETHODCALLTYPE *ScanDown)(
        IScanningTuner* This,
        LONG MillisecondsPause);

    HRESULT (STDMETHODCALLTYPE *AutoProgram)(
        IScanningTuner* This);

    END_INTERFACE
} IScanningTunerVtbl;
interface IScanningTuner {
    CONST_VTBL IScanningTunerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IScanningTuner_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IScanningTuner_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IScanningTuner_Release(This) (This)->lpVtbl->Release(This)
/*** ITuner methods ***/
#define IScanningTuner_get_TuningSpace(This,TuningSpace) (This)->lpVtbl->get_TuningSpace(This,TuningSpace)
#define IScanningTuner_put_TuningSpace(This,TuningSpace) (This)->lpVtbl->put_TuningSpace(This,TuningSpace)
#define IScanningTuner_EnumTuningSpaces(This,ppEnum) (This)->lpVtbl->EnumTuningSpaces(This,ppEnum)
#define IScanningTuner_get_TuneRequest(This,TuneRequest) (This)->lpVtbl->get_TuneRequest(This,TuneRequest)
#define IScanningTuner_put_TuneRequest(This,TuneRequest) (This)->lpVtbl->put_TuneRequest(This,TuneRequest)
#define IScanningTuner_Validate(This,TuneRequest) (This)->lpVtbl->Validate(This,TuneRequest)
#define IScanningTuner_get_PreferredComponentTypes(This,ComponentTypes) (This)->lpVtbl->get_PreferredComponentTypes(This,ComponentTypes)
#define IScanningTuner_put_PreferredComponentTypes(This,ComponentTypes) (This)->lpVtbl->put_PreferredComponentTypes(This,ComponentTypes)
#define IScanningTuner_get_SignalStrength(This,Strength) (This)->lpVtbl->get_SignalStrength(This,Strength)
#define IScanningTuner_TriggerSignalEvents(This,Interval) (This)->lpVtbl->TriggerSignalEvents(This,Interval)
/*** IScanningTuner methods ***/
#define IScanningTuner_SeekUp(This) (This)->lpVtbl->SeekUp(This)
#define IScanningTuner_SeekDown(This) (This)->lpVtbl->SeekDown(This)
#define IScanningTuner_ScanUp(This,MillisecondsPause) (This)->lpVtbl->ScanUp(This,MillisecondsPause)
#define IScanningTuner_ScanDown(This,MillisecondsPause) (This)->lpVtbl->ScanDown(This,MillisecondsPause)
#define IScanningTuner_AutoProgram(This) (This)->lpVtbl->AutoProgram(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IScanningTuner_QueryInterface(IScanningTuner* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IScanningTuner_AddRef(IScanningTuner* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IScanningTuner_Release(IScanningTuner* This) {
    return This->lpVtbl->Release(This);
}
/*** ITuner methods ***/
static FORCEINLINE HRESULT IScanningTuner_get_TuningSpace(IScanningTuner* This,ITuningSpace **TuningSpace) {
    return This->lpVtbl->get_TuningSpace(This,TuningSpace);
}
static FORCEINLINE HRESULT IScanningTuner_put_TuningSpace(IScanningTuner* This,ITuningSpace *TuningSpace) {
    return This->lpVtbl->put_TuningSpace(This,TuningSpace);
}
static FORCEINLINE HRESULT IScanningTuner_EnumTuningSpaces(IScanningTuner* This,IEnumTuningSpaces **ppEnum) {
    return This->lpVtbl->EnumTuningSpaces(This,ppEnum);
}
static FORCEINLINE HRESULT IScanningTuner_get_TuneRequest(IScanningTuner* This,ITuneRequest **TuneRequest) {
    return This->lpVtbl->get_TuneRequest(This,TuneRequest);
}
static FORCEINLINE HRESULT IScanningTuner_put_TuneRequest(IScanningTuner* This,ITuneRequest *TuneRequest) {
    return This->lpVtbl->put_TuneRequest(This,TuneRequest);
}
static FORCEINLINE HRESULT IScanningTuner_Validate(IScanningTuner* This,ITuneRequest *TuneRequest) {
    return This->lpVtbl->Validate(This,TuneRequest);
}
static FORCEINLINE HRESULT IScanningTuner_get_PreferredComponentTypes(IScanningTuner* This,IComponentTypes **ComponentTypes) {
    return This->lpVtbl->get_PreferredComponentTypes(This,ComponentTypes);
}
static FORCEINLINE HRESULT IScanningTuner_put_PreferredComponentTypes(IScanningTuner* This,IComponentTypes *ComponentTypes) {
    return This->lpVtbl->put_PreferredComponentTypes(This,ComponentTypes);
}
static FORCEINLINE HRESULT IScanningTuner_get_SignalStrength(IScanningTuner* This,LONG *Strength) {
    return This->lpVtbl->get_SignalStrength(This,Strength);
}
static FORCEINLINE HRESULT IScanningTuner_TriggerSignalEvents(IScanningTuner* This,LONG Interval) {
    return This->lpVtbl->TriggerSignalEvents(This,Interval);
}
/*** IScanningTuner methods ***/
static FORCEINLINE HRESULT IScanningTuner_SeekUp(IScanningTuner* This) {
    return This->lpVtbl->SeekUp(This);
}
static FORCEINLINE HRESULT IScanningTuner_SeekDown(IScanningTuner* This) {
    return This->lpVtbl->SeekDown(This);
}
static FORCEINLINE HRESULT IScanningTuner_ScanUp(IScanningTuner* This,LONG MillisecondsPause) {
    return This->lpVtbl->ScanUp(This,MillisecondsPause);
}
static FORCEINLINE HRESULT IScanningTuner_ScanDown(IScanningTuner* This,LONG MillisecondsPause) {
    return This->lpVtbl->ScanDown(This,MillisecondsPause);
}
static FORCEINLINE HRESULT IScanningTuner_AutoProgram(IScanningTuner* This) {
    return This->lpVtbl->AutoProgram(This);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IScanningTuner_SeekUp_Proxy(
    IScanningTuner* This);
void __RPC_STUB IScanningTuner_SeekUp_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IScanningTuner_SeekDown_Proxy(
    IScanningTuner* This);
void __RPC_STUB IScanningTuner_SeekDown_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IScanningTuner_ScanUp_Proxy(
    IScanningTuner* This,
    LONG MillisecondsPause);
void __RPC_STUB IScanningTuner_ScanUp_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IScanningTuner_ScanDown_Proxy(
    IScanningTuner* This,
    LONG MillisecondsPause);
void __RPC_STUB IScanningTuner_ScanDown_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IScanningTuner_AutoProgram_Proxy(
    IScanningTuner* This);
void __RPC_STUB IScanningTuner_AutoProgram_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IScanningTuner_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IScanningTunerEx interface
 */
#ifndef __IScanningTunerEx_INTERFACE_DEFINED__
#define __IScanningTunerEx_INTERFACE_DEFINED__

DEFINE_GUID(IID_IScanningTunerEx, 0x04bbd195, 0x0e2d, 0x4593, 0x9b,0xd5, 0x4f,0x90,0x8b,0xc3,0x3c,0xf5);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("04bbd195-0e2d-4593-9bd5-4f908bc33cf5")
IScanningTunerEx : public IScanningTuner
{
    virtual HRESULT STDMETHODCALLTYPE GetCurrentLocator(
        ILocator **pILocator) = 0;

    virtual HRESULT STDMETHODCALLTYPE PerformExhaustiveScan(
        LONG dwLowerFreq,
        LONG dwHigherFreq,
        VARIANT_BOOL bFineTune,
        HEVENT hEvent) = 0;

    virtual HRESULT STDMETHODCALLTYPE TerminateCurrentScan(
        LONG *pcurrentFreq) = 0;

    virtual HRESULT STDMETHODCALLTYPE ResumeCurrentScan(
        HEVENT hEvent) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTunerScanningCapability(
        LONG *HardwareAssistedScanning,
        LONG *NumStandardsSupported,
        GUID *BroadcastStandards) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTunerStatus(
        LONG *SecondsLeft,
        LONG *CurrentLockType,
        LONG *AutoDetect,
        LONG *CurrentFreq) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrentTunerStandardCapability(
        GUID CurrentBroadcastStandard,
        LONG *SettlingTime,
        LONG *TvStandardsSupported) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetScanSignalTypeFilter(
        LONG ScanModulationTypes,
        LONG AnalogVideoStandard) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IScanningTunerEx, 0x04bbd195, 0x0e2d, 0x4593, 0x9b,0xd5, 0x4f,0x90,0x8b,0xc3,0x3c,0xf5)
#endif
#else
typedef struct IScanningTunerExVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITuner methods ***/
    HRESULT (STDMETHODCALLTYPE *get_TuningSpace)(
        IScanningTunerEx* This,
        ITuningSpace **TuningSpace);

    HRESULT (STDMETHODCALLTYPE *put_TuningSpace)(
        IScanningTunerEx* This,
        ITuningSpace *TuningSpace);

    HRESULT (STDMETHODCALLTYPE *EnumTuningSpaces)(
        IScanningTunerEx* This,
        IEnumTuningSpaces **ppEnum);

    HRESULT (STDMETHODCALLTYPE *get_TuneRequest)(
        IScanningTunerEx* This,
        ITuneRequest **TuneRequest);

    HRESULT (STDMETHODCALLTYPE *put_TuneRequest)(
        IScanningTunerEx* This,
        ITuneRequest *TuneRequest);

    HRESULT (STDMETHODCALLTYPE *Validate)(
        IScanningTunerEx* This,
        ITuneRequest *TuneRequest);

    HRESULT (STDMETHODCALLTYPE *get_PreferredComponentTypes)(
        IScanningTunerEx* This,
        IComponentTypes **ComponentTypes);

    HRESULT (STDMETHODCALLTYPE *put_PreferredComponentTypes)(
        IScanningTunerEx* This,
        IComponentTypes *ComponentTypes);

    HRESULT (STDMETHODCALLTYPE *get_SignalStrength)(
        IScanningTunerEx* This,
        LONG *Strength);

    HRESULT (STDMETHODCALLTYPE *TriggerSignalEvents)(
        IScanningTunerEx* This,
        LONG Interval);

    /*** IScanningTuner methods ***/
    HRESULT (STDMETHODCALLTYPE *SeekUp)(
        IScanningTunerEx* This);

    HRESULT (STDMETHODCALLTYPE *SeekDown)(
        IScanningTunerEx* This);

    HRESULT (STDMETHODCALLTYPE *ScanUp)(
        IScanningTunerEx* This,
        LONG MillisecondsPause);

    HRESULT (STDMETHODCALLTYPE *ScanDown)(
        IScanningTunerEx* This,
        LONG MillisecondsPause);

    HRESULT (STDMETHODCALLTYPE *AutoProgram)(
        IScanningTunerEx* This);

    /*** IScanningTunerEx methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCurrentLocator)(
        IScanningTunerEx* This,
        ILocator **pILocator);

    HRESULT (STDMETHODCALLTYPE *PerformExhaustiveScan)(
        IScanningTunerEx* This,
        LONG dwLowerFreq,
        LONG dwHigherFreq,
        VARIANT_BOOL bFineTune,
        HEVENT hEvent);

    HRESULT (STDMETHODCALLTYPE *TerminateCurrentScan)(
        IScanningTunerEx* This,
        LONG *pcurrentFreq);

    HRESULT (STDMETHODCALLTYPE *ResumeCurrentScan)(
        IScanningTunerEx* This,
        HEVENT hEvent);

    HRESULT (STDMETHODCALLTYPE *GetTunerScanningCapability)(
        IScanningTunerEx* This,
        LONG *HardwareAssistedScanning,
        LONG *NumStandardsSupported,
        GUID *BroadcastStandards);

    HRESULT (STDMETHODCALLTYPE *GetTunerStatus)(
        IScanningTunerEx* This,
        LONG *SecondsLeft,
        LONG *CurrentLockType,
        LONG *AutoDetect,
        LONG *CurrentFreq);

    HRESULT (STDMETHODCALLTYPE *GetCurrentTunerStandardCapability)(
        IScanningTunerEx* This,
        GUID CurrentBroadcastStandard,
        LONG *SettlingTime,
        LONG *TvStandardsSupported);

    HRESULT (STDMETHODCALLTYPE *SetScanSignalTypeFilter)(
        IScanningTunerEx* This,
        LONG ScanModulationTypes,
        LONG AnalogVideoStandard);

    END_INTERFACE
} IScanningTunerExVtbl;
interface IScanningTunerEx {
    CONST_VTBL IScanningTunerExVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IScanningTunerEx_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IScanningTunerEx_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IScanningTunerEx_Release(This) (This)->lpVtbl->Release(This)
/*** ITuner methods ***/
#define IScanningTunerEx_get_TuningSpace(This,TuningSpace) (This)->lpVtbl->get_TuningSpace(This,TuningSpace)
#define IScanningTunerEx_put_TuningSpace(This,TuningSpace) (This)->lpVtbl->put_TuningSpace(This,TuningSpace)
#define IScanningTunerEx_EnumTuningSpaces(This,ppEnum) (This)->lpVtbl->EnumTuningSpaces(This,ppEnum)
#define IScanningTunerEx_get_TuneRequest(This,TuneRequest) (This)->lpVtbl->get_TuneRequest(This,TuneRequest)
#define IScanningTunerEx_put_TuneRequest(This,TuneRequest) (This)->lpVtbl->put_TuneRequest(This,TuneRequest)
#define IScanningTunerEx_Validate(This,TuneRequest) (This)->lpVtbl->Validate(This,TuneRequest)
#define IScanningTunerEx_get_PreferredComponentTypes(This,ComponentTypes) (This)->lpVtbl->get_PreferredComponentTypes(This,ComponentTypes)
#define IScanningTunerEx_put_PreferredComponentTypes(This,ComponentTypes) (This)->lpVtbl->put_PreferredComponentTypes(This,ComponentTypes)
#define IScanningTunerEx_get_SignalStrength(This,Strength) (This)->lpVtbl->get_SignalStrength(This,Strength)
#define IScanningTunerEx_TriggerSignalEvents(This,Interval) (This)->lpVtbl->TriggerSignalEvents(This,Interval)
/*** IScanningTuner methods ***/
#define IScanningTunerEx_SeekUp(This) (This)->lpVtbl->SeekUp(This)
#define IScanningTunerEx_SeekDown(This) (This)->lpVtbl->SeekDown(This)
#define IScanningTunerEx_ScanUp(This,MillisecondsPause) (This)->lpVtbl->ScanUp(This,MillisecondsPause)
#define IScanningTunerEx_ScanDown(This,MillisecondsPause) (This)->lpVtbl->ScanDown(This,MillisecondsPause)
#define IScanningTunerEx_AutoProgram(This) (This)->lpVtbl->AutoProgram(This)
/*** IScanningTunerEx methods ***/
#define IScanningTunerEx_GetCurrentLocator(This,pILocator) (This)->lpVtbl->GetCurrentLocator(This,pILocator)
#define IScanningTunerEx_PerformExhaustiveScan(This,dwLowerFreq,dwHigherFreq,bFineTune,hEvent) (This)->lpVtbl->PerformExhaustiveScan(This,dwLowerFreq,dwHigherFreq,bFineTune,hEvent)
#define IScanningTunerEx_TerminateCurrentScan(This,pcurrentFreq) (This)->lpVtbl->TerminateCurrentScan(This,pcurrentFreq)
#define IScanningTunerEx_ResumeCurrentScan(This,hEvent) (This)->lpVtbl->ResumeCurrentScan(This,hEvent)
#define IScanningTunerEx_GetTunerScanningCapability(This,HardwareAssistedScanning,NumStandardsSupported,BroadcastStandards) (This)->lpVtbl->GetTunerScanningCapability(This,HardwareAssistedScanning,NumStandardsSupported,BroadcastStandards)
#define IScanningTunerEx_GetTunerStatus(This,SecondsLeft,CurrentLockType,AutoDetect,CurrentFreq) (This)->lpVtbl->GetTunerStatus(This,SecondsLeft,CurrentLockType,AutoDetect,CurrentFreq)
#define IScanningTunerEx_GetCurrentTunerStandardCapability(This,CurrentBroadcastStandard,SettlingTime,TvStandardsSupported) (This)->lpVtbl->GetCurrentTunerStandardCapability(This,CurrentBroadcastStandard,SettlingTime,TvStandardsSupported)
#define IScanningTunerEx_SetScanSignalTypeFilter(This,ScanModulationTypes,AnalogVideoStandard) (This)->lpVtbl->SetScanSignalTypeFilter(This,ScanModulationTypes,AnalogVideoStandard)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IScanningTunerEx_QueryInterface(IScanningTunerEx* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IScanningTunerEx_AddRef(IScanningTunerEx* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IScanningTunerEx_Release(IScanningTunerEx* This) {
    return This->lpVtbl->Release(This);
}
/*** ITuner methods ***/
static FORCEINLINE HRESULT IScanningTunerEx_get_TuningSpace(IScanningTunerEx* This,ITuningSpace **TuningSpace) {
    return This->lpVtbl->get_TuningSpace(This,TuningSpace);
}
static FORCEINLINE HRESULT IScanningTunerEx_put_TuningSpace(IScanningTunerEx* This,ITuningSpace *TuningSpace) {
    return This->lpVtbl->put_TuningSpace(This,TuningSpace);
}
static FORCEINLINE HRESULT IScanningTunerEx_EnumTuningSpaces(IScanningTunerEx* This,IEnumTuningSpaces **ppEnum) {
    return This->lpVtbl->EnumTuningSpaces(This,ppEnum);
}
static FORCEINLINE HRESULT IScanningTunerEx_get_TuneRequest(IScanningTunerEx* This,ITuneRequest **TuneRequest) {
    return This->lpVtbl->get_TuneRequest(This,TuneRequest);
}
static FORCEINLINE HRESULT IScanningTunerEx_put_TuneRequest(IScanningTunerEx* This,ITuneRequest *TuneRequest) {
    return This->lpVtbl->put_TuneRequest(This,TuneRequest);
}
static FORCEINLINE HRESULT IScanningTunerEx_Validate(IScanningTunerEx* This,ITuneRequest *TuneRequest) {
    return This->lpVtbl->Validate(This,TuneRequest);
}
static FORCEINLINE HRESULT IScanningTunerEx_get_PreferredComponentTypes(IScanningTunerEx* This,IComponentTypes **ComponentTypes) {
    return This->lpVtbl->get_PreferredComponentTypes(This,ComponentTypes);
}
static FORCEINLINE HRESULT IScanningTunerEx_put_PreferredComponentTypes(IScanningTunerEx* This,IComponentTypes *ComponentTypes) {
    return This->lpVtbl->put_PreferredComponentTypes(This,ComponentTypes);
}
static FORCEINLINE HRESULT IScanningTunerEx_get_SignalStrength(IScanningTunerEx* This,LONG *Strength) {
    return This->lpVtbl->get_SignalStrength(This,Strength);
}
static FORCEINLINE HRESULT IScanningTunerEx_TriggerSignalEvents(IScanningTunerEx* This,LONG Interval) {
    return This->lpVtbl->TriggerSignalEvents(This,Interval);
}
/*** IScanningTuner methods ***/
static FORCEINLINE HRESULT IScanningTunerEx_SeekUp(IScanningTunerEx* This) {
    return This->lpVtbl->SeekUp(This);
}
static FORCEINLINE HRESULT IScanningTunerEx_SeekDown(IScanningTunerEx* This) {
    return This->lpVtbl->SeekDown(This);
}
static FORCEINLINE HRESULT IScanningTunerEx_ScanUp(IScanningTunerEx* This,LONG MillisecondsPause) {
    return This->lpVtbl->ScanUp(This,MillisecondsPause);
}
static FORCEINLINE HRESULT IScanningTunerEx_ScanDown(IScanningTunerEx* This,LONG MillisecondsPause) {
    return This->lpVtbl->ScanDown(This,MillisecondsPause);
}
static FORCEINLINE HRESULT IScanningTunerEx_AutoProgram(IScanningTunerEx* This) {
    return This->lpVtbl->AutoProgram(This);
}
/*** IScanningTunerEx methods ***/
static FORCEINLINE HRESULT IScanningTunerEx_GetCurrentLocator(IScanningTunerEx* This,ILocator **pILocator) {
    return This->lpVtbl->GetCurrentLocator(This,pILocator);
}
static FORCEINLINE HRESULT IScanningTunerEx_PerformExhaustiveScan(IScanningTunerEx* This,LONG dwLowerFreq,LONG dwHigherFreq,VARIANT_BOOL bFineTune,HEVENT hEvent) {
    return This->lpVtbl->PerformExhaustiveScan(This,dwLowerFreq,dwHigherFreq,bFineTune,hEvent);
}
static FORCEINLINE HRESULT IScanningTunerEx_TerminateCurrentScan(IScanningTunerEx* This,LONG *pcurrentFreq) {
    return This->lpVtbl->TerminateCurrentScan(This,pcurrentFreq);
}
static FORCEINLINE HRESULT IScanningTunerEx_ResumeCurrentScan(IScanningTunerEx* This,HEVENT hEvent) {
    return This->lpVtbl->ResumeCurrentScan(This,hEvent);
}
static FORCEINLINE HRESULT IScanningTunerEx_GetTunerScanningCapability(IScanningTunerEx* This,LONG *HardwareAssistedScanning,LONG *NumStandardsSupported,GUID *BroadcastStandards) {
    return This->lpVtbl->GetTunerScanningCapability(This,HardwareAssistedScanning,NumStandardsSupported,BroadcastStandards);
}
static FORCEINLINE HRESULT IScanningTunerEx_GetTunerStatus(IScanningTunerEx* This,LONG *SecondsLeft,LONG *CurrentLockType,LONG *AutoDetect,LONG *CurrentFreq) {
    return This->lpVtbl->GetTunerStatus(This,SecondsLeft,CurrentLockType,AutoDetect,CurrentFreq);
}
static FORCEINLINE HRESULT IScanningTunerEx_GetCurrentTunerStandardCapability(IScanningTunerEx* This,GUID CurrentBroadcastStandard,LONG *SettlingTime,LONG *TvStandardsSupported) {
    return This->lpVtbl->GetCurrentTunerStandardCapability(This,CurrentBroadcastStandard,SettlingTime,TvStandardsSupported);
}
static FORCEINLINE HRESULT IScanningTunerEx_SetScanSignalTypeFilter(IScanningTunerEx* This,LONG ScanModulationTypes,LONG AnalogVideoStandard) {
    return This->lpVtbl->SetScanSignalTypeFilter(This,ScanModulationTypes,AnalogVideoStandard);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IScanningTunerEx_GetCurrentLocator_Proxy(
    IScanningTunerEx* This,
    ILocator **pILocator);
void __RPC_STUB IScanningTunerEx_GetCurrentLocator_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IScanningTunerEx_PerformExhaustiveScan_Proxy(
    IScanningTunerEx* This,
    LONG dwLowerFreq,
    LONG dwHigherFreq,
    VARIANT_BOOL bFineTune,
    HEVENT hEvent);
void __RPC_STUB IScanningTunerEx_PerformExhaustiveScan_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IScanningTunerEx_TerminateCurrentScan_Proxy(
    IScanningTunerEx* This,
    LONG *pcurrentFreq);
void __RPC_STUB IScanningTunerEx_TerminateCurrentScan_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IScanningTunerEx_ResumeCurrentScan_Proxy(
    IScanningTunerEx* This,
    HEVENT hEvent);
void __RPC_STUB IScanningTunerEx_ResumeCurrentScan_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IScanningTunerEx_GetTunerScanningCapability_Proxy(
    IScanningTunerEx* This,
    LONG *HardwareAssistedScanning,
    LONG *NumStandardsSupported,
    GUID *BroadcastStandards);
void __RPC_STUB IScanningTunerEx_GetTunerScanningCapability_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IScanningTunerEx_GetTunerStatus_Proxy(
    IScanningTunerEx* This,
    LONG *SecondsLeft,
    LONG *CurrentLockType,
    LONG *AutoDetect,
    LONG *CurrentFreq);
void __RPC_STUB IScanningTunerEx_GetTunerStatus_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IScanningTunerEx_GetCurrentTunerStandardCapability_Proxy(
    IScanningTunerEx* This,
    GUID CurrentBroadcastStandard,
    LONG *SettlingTime,
    LONG *TvStandardsSupported);
void __RPC_STUB IScanningTunerEx_GetCurrentTunerStandardCapability_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IScanningTunerEx_SetScanSignalTypeFilter_Proxy(
    IScanningTunerEx* This,
    LONG ScanModulationTypes,
    LONG AnalogVideoStandard);
void __RPC_STUB IScanningTunerEx_SetScanSignalTypeFilter_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IScanningTunerEx_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IComponentType interface
 */
#ifndef __IComponentType_INTERFACE_DEFINED__
#define __IComponentType_INTERFACE_DEFINED__

DEFINE_GUID(IID_IComponentType, 0x6a340dc0, 0x0311, 0x11d3, 0x9d,0x8e, 0x00,0xc0,0x4f,0x72,0xd9,0x80);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("6a340dc0-0311-11d3-9d8e-00c04f72d980")
IComponentType : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Category(
        ComponentCategory *Category) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Category(
        ComponentCategory Category) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_MediaMajorType(
        BSTR *MediaMajorType) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_MediaMajorType(
        BSTR MediaMajorType) = 0;

    virtual HRESULT STDMETHODCALLTYPE get__MediaMajorType(
        GUID *MediaMajorTypeGuid) = 0;

    virtual HRESULT STDMETHODCALLTYPE put__MediaMajorType(
        REFCLSID MediaMajorTypeGuid) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_MediaSubType(
        BSTR *MediaSubType) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_MediaSubType(
        BSTR MediaSubType) = 0;

    virtual HRESULT STDMETHODCALLTYPE get__MediaSubType(
        GUID *MediaSubTypeGuid) = 0;

    virtual HRESULT STDMETHODCALLTYPE put__MediaSubType(
        REFCLSID MediaSubTypeGuid) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_MediaFormatType(
        BSTR *MediaFormatType) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_MediaFormatType(
        BSTR MediaFormatType) = 0;

    virtual HRESULT STDMETHODCALLTYPE get__MediaFormatType(
        GUID *MediaFormatTypeGuid) = 0;

    virtual HRESULT STDMETHODCALLTYPE put__MediaFormatType(
        REFCLSID MediaFormatTypeGuid) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_MediaType(
        AM_MEDIA_TYPE *MediaType) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_MediaType(
        AM_MEDIA_TYPE *MediaType) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IComponentType **NewCT) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IComponentType, 0x6a340dc0, 0x0311, 0x11d3, 0x9d,0x8e, 0x00,0xc0,0x4f,0x72,0xd9,0x80)
#endif
#else
typedef struct IComponentTypeVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IComponentType* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IComponentType* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IComponentType* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IComponentType* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IComponentType methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Category)(
        IComponentType* This,
        ComponentCategory *Category);

    HRESULT (STDMETHODCALLTYPE *put_Category)(
        IComponentType* This,
        ComponentCategory Category);

    HRESULT (STDMETHODCALLTYPE *get_MediaMajorType)(
        IComponentType* This,
        BSTR *MediaMajorType);

    HRESULT (STDMETHODCALLTYPE *put_MediaMajorType)(
        IComponentType* This,
        BSTR MediaMajorType);

    HRESULT (STDMETHODCALLTYPE *get__MediaMajorType)(
        IComponentType* This,
        GUID *MediaMajorTypeGuid);

    HRESULT (STDMETHODCALLTYPE *put__MediaMajorType)(
        IComponentType* This,
        REFCLSID MediaMajorTypeGuid);

    HRESULT (STDMETHODCALLTYPE *get_MediaSubType)(
        IComponentType* This,
        BSTR *MediaSubType);

    HRESULT (STDMETHODCALLTYPE *put_MediaSubType)(
        IComponentType* This,
        BSTR MediaSubType);

    HRESULT (STDMETHODCALLTYPE *get__MediaSubType)(
        IComponentType* This,
        GUID *MediaSubTypeGuid);

    HRESULT (STDMETHODCALLTYPE *put__MediaSubType)(
        IComponentType* This,
        REFCLSID MediaSubTypeGuid);

    HRESULT (STDMETHODCALLTYPE *get_MediaFormatType)(
        IComponentType* This,
        BSTR *MediaFormatType);

    HRESULT (STDMETHODCALLTYPE *put_MediaFormatType)(
        IComponentType* This,
        BSTR MediaFormatType);

    HRESULT (STDMETHODCALLTYPE *get__MediaFormatType)(
        IComponentType* This,
        GUID *MediaFormatTypeGuid);

    HRESULT (STDMETHODCALLTYPE *put__MediaFormatType)(
        IComponentType* This,
        REFCLSID MediaFormatTypeGuid);

    HRESULT (STDMETHODCALLTYPE *get_MediaType)(
        IComponentType* This,
        AM_MEDIA_TYPE *MediaType);

    HRESULT (STDMETHODCALLTYPE *put_MediaType)(
        IComponentType* This,
        AM_MEDIA_TYPE *MediaType);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IComponentType* This,
        IComponentType **NewCT);

    END_INTERFACE
} IComponentTypeVtbl;
interface IComponentType {
    CONST_VTBL IComponentTypeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IComponentType_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IComponentType_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IComponentType_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IComponentType_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IComponentType_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IComponentType_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IComponentType_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IComponentType methods ***/
#define IComponentType_get_Category(This,Category) (This)->lpVtbl->get_Category(This,Category)
#define IComponentType_put_Category(This,Category) (This)->lpVtbl->put_Category(This,Category)
#define IComponentType_get_MediaMajorType(This,MediaMajorType) (This)->lpVtbl->get_MediaMajorType(This,MediaMajorType)
#define IComponentType_put_MediaMajorType(This,MediaMajorType) (This)->lpVtbl->put_MediaMajorType(This,MediaMajorType)
#define IComponentType_get__MediaMajorType(This,MediaMajorTypeGuid) (This)->lpVtbl->get__MediaMajorType(This,MediaMajorTypeGuid)
#define IComponentType_put__MediaMajorType(This,MediaMajorTypeGuid) (This)->lpVtbl->put__MediaMajorType(This,MediaMajorTypeGuid)
#define IComponentType_get_MediaSubType(This,MediaSubType) (This)->lpVtbl->get_MediaSubType(This,MediaSubType)
#define IComponentType_put_MediaSubType(This,MediaSubType) (This)->lpVtbl->put_MediaSubType(This,MediaSubType)
#define IComponentType_get__MediaSubType(This,MediaSubTypeGuid) (This)->lpVtbl->get__MediaSubType(This,MediaSubTypeGuid)
#define IComponentType_put__MediaSubType(This,MediaSubTypeGuid) (This)->lpVtbl->put__MediaSubType(This,MediaSubTypeGuid)
#define IComponentType_get_MediaFormatType(This,MediaFormatType) (This)->lpVtbl->get_MediaFormatType(This,MediaFormatType)
#define IComponentType_put_MediaFormatType(This,MediaFormatType) (This)->lpVtbl->put_MediaFormatType(This,MediaFormatType)
#define IComponentType_get__MediaFormatType(This,MediaFormatTypeGuid) (This)->lpVtbl->get__MediaFormatType(This,MediaFormatTypeGuid)
#define IComponentType_put__MediaFormatType(This,MediaFormatTypeGuid) (This)->lpVtbl->put__MediaFormatType(This,MediaFormatTypeGuid)
#define IComponentType_get_MediaType(This,MediaType) (This)->lpVtbl->get_MediaType(This,MediaType)
#define IComponentType_put_MediaType(This,MediaType) (This)->lpVtbl->put_MediaType(This,MediaType)
#define IComponentType_Clone(This,NewCT) (This)->lpVtbl->Clone(This,NewCT)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IComponentType_QueryInterface(IComponentType* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IComponentType_AddRef(IComponentType* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IComponentType_Release(IComponentType* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IComponentType_GetTypeInfoCount(IComponentType* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IComponentType_GetTypeInfo(IComponentType* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IComponentType_GetIDsOfNames(IComponentType* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IComponentType_Invoke(IComponentType* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IComponentType methods ***/
static FORCEINLINE HRESULT IComponentType_get_Category(IComponentType* This,ComponentCategory *Category) {
    return This->lpVtbl->get_Category(This,Category);
}
static FORCEINLINE HRESULT IComponentType_put_Category(IComponentType* This,ComponentCategory Category) {
    return This->lpVtbl->put_Category(This,Category);
}
static FORCEINLINE HRESULT IComponentType_get_MediaMajorType(IComponentType* This,BSTR *MediaMajorType) {
    return This->lpVtbl->get_MediaMajorType(This,MediaMajorType);
}
static FORCEINLINE HRESULT IComponentType_put_MediaMajorType(IComponentType* This,BSTR MediaMajorType) {
    return This->lpVtbl->put_MediaMajorType(This,MediaMajorType);
}
static FORCEINLINE HRESULT IComponentType_get__MediaMajorType(IComponentType* This,GUID *MediaMajorTypeGuid) {
    return This->lpVtbl->get__MediaMajorType(This,MediaMajorTypeGuid);
}
static FORCEINLINE HRESULT IComponentType_put__MediaMajorType(IComponentType* This,REFCLSID MediaMajorTypeGuid) {
    return This->lpVtbl->put__MediaMajorType(This,MediaMajorTypeGuid);
}
static FORCEINLINE HRESULT IComponentType_get_MediaSubType(IComponentType* This,BSTR *MediaSubType) {
    return This->lpVtbl->get_MediaSubType(This,MediaSubType);
}
static FORCEINLINE HRESULT IComponentType_put_MediaSubType(IComponentType* This,BSTR MediaSubType) {
    return This->lpVtbl->put_MediaSubType(This,MediaSubType);
}
static FORCEINLINE HRESULT IComponentType_get__MediaSubType(IComponentType* This,GUID *MediaSubTypeGuid) {
    return This->lpVtbl->get__MediaSubType(This,MediaSubTypeGuid);
}
static FORCEINLINE HRESULT IComponentType_put__MediaSubType(IComponentType* This,REFCLSID MediaSubTypeGuid) {
    return This->lpVtbl->put__MediaSubType(This,MediaSubTypeGuid);
}
static FORCEINLINE HRESULT IComponentType_get_MediaFormatType(IComponentType* This,BSTR *MediaFormatType) {
    return This->lpVtbl->get_MediaFormatType(This,MediaFormatType);
}
static FORCEINLINE HRESULT IComponentType_put_MediaFormatType(IComponentType* This,BSTR MediaFormatType) {
    return This->lpVtbl->put_MediaFormatType(This,MediaFormatType);
}
static FORCEINLINE HRESULT IComponentType_get__MediaFormatType(IComponentType* This,GUID *MediaFormatTypeGuid) {
    return This->lpVtbl->get__MediaFormatType(This,MediaFormatTypeGuid);
}
static FORCEINLINE HRESULT IComponentType_put__MediaFormatType(IComponentType* This,REFCLSID MediaFormatTypeGuid) {
    return This->lpVtbl->put__MediaFormatType(This,MediaFormatTypeGuid);
}
static FORCEINLINE HRESULT IComponentType_get_MediaType(IComponentType* This,AM_MEDIA_TYPE *MediaType) {
    return This->lpVtbl->get_MediaType(This,MediaType);
}
static FORCEINLINE HRESULT IComponentType_put_MediaType(IComponentType* This,AM_MEDIA_TYPE *MediaType) {
    return This->lpVtbl->put_MediaType(This,MediaType);
}
static FORCEINLINE HRESULT IComponentType_Clone(IComponentType* This,IComponentType **NewCT) {
    return This->lpVtbl->Clone(This,NewCT);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IComponentType_get_Category_Proxy(
    IComponentType* This,
    ComponentCategory *Category);
void __RPC_STUB IComponentType_get_Category_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IComponentType_put_Category_Proxy(
    IComponentType* This,
    ComponentCategory Category);
void __RPC_STUB IComponentType_put_Category_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IComponentType_get_MediaMajorType_Proxy(
    IComponentType* This,
    BSTR *MediaMajorType);
void __RPC_STUB IComponentType_get_MediaMajorType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IComponentType_put_MediaMajorType_Proxy(
    IComponentType* This,
    BSTR MediaMajorType);
void __RPC_STUB IComponentType_put_MediaMajorType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IComponentType_get__MediaMajorType_Proxy(
    IComponentType* This,
    GUID *MediaMajorTypeGuid);
void __RPC_STUB IComponentType_get__MediaMajorType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IComponentType_put__MediaMajorType_Proxy(
    IComponentType* This,
    REFCLSID MediaMajorTypeGuid);
void __RPC_STUB IComponentType_put__MediaMajorType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IComponentType_get_MediaSubType_Proxy(
    IComponentType* This,
    BSTR *MediaSubType);
void __RPC_STUB IComponentType_get_MediaSubType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IComponentType_put_MediaSubType_Proxy(
    IComponentType* This,
    BSTR MediaSubType);
void __RPC_STUB IComponentType_put_MediaSubType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IComponentType_get__MediaSubType_Proxy(
    IComponentType* This,
    GUID *MediaSubTypeGuid);
void __RPC_STUB IComponentType_get__MediaSubType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IComponentType_put__MediaSubType_Proxy(
    IComponentType* This,
    REFCLSID MediaSubTypeGuid);
void __RPC_STUB IComponentType_put__MediaSubType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IComponentType_get_MediaFormatType_Proxy(
    IComponentType* This,
    BSTR *MediaFormatType);
void __RPC_STUB IComponentType_get_MediaFormatType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IComponentType_put_MediaFormatType_Proxy(
    IComponentType* This,
    BSTR MediaFormatType);
void __RPC_STUB IComponentType_put_MediaFormatType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IComponentType_get__MediaFormatType_Proxy(
    IComponentType* This,
    GUID *MediaFormatTypeGuid);
void __RPC_STUB IComponentType_get__MediaFormatType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IComponentType_put__MediaFormatType_Proxy(
    IComponentType* This,
    REFCLSID MediaFormatTypeGuid);
void __RPC_STUB IComponentType_put__MediaFormatType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IComponentType_get_MediaType_Proxy(
    IComponentType* This,
    AM_MEDIA_TYPE *MediaType);
void __RPC_STUB IComponentType_get_MediaType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IComponentType_put_MediaType_Proxy(
    IComponentType* This,
    AM_MEDIA_TYPE *MediaType);
void __RPC_STUB IComponentType_put_MediaType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IComponentType_Clone_Proxy(
    IComponentType* This,
    IComponentType **NewCT);
void __RPC_STUB IComponentType_Clone_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IComponentType_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ILanguageComponentType interface
 */
#ifndef __ILanguageComponentType_INTERFACE_DEFINED__
#define __ILanguageComponentType_INTERFACE_DEFINED__

DEFINE_GUID(IID_ILanguageComponentType, 0xb874c8ba, 0x0fa2, 0x11d3, 0x9d,0x8e, 0x00,0xc0,0x4f,0x72,0xd9,0x80);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("b874c8ba-0fa2-11d3-9d8e-00c04f72d980")
ILanguageComponentType : public IComponentType
{
    virtual HRESULT STDMETHODCALLTYPE get_LangID(
        LONG *LangID) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_LangID(
        LONG LangID) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ILanguageComponentType, 0xb874c8ba, 0x0fa2, 0x11d3, 0x9d,0x8e, 0x00,0xc0,0x4f,0x72,0xd9,0x80)
#endif
#else
typedef struct ILanguageComponentTypeVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ILanguageComponentType* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ILanguageComponentType* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ILanguageComponentType* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ILanguageComponentType* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IComponentType methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Category)(
        ILanguageComponentType* This,
        ComponentCategory *Category);

    HRESULT (STDMETHODCALLTYPE *put_Category)(
        ILanguageComponentType* This,
        ComponentCategory Category);

    HRESULT (STDMETHODCALLTYPE *get_MediaMajorType)(
        ILanguageComponentType* This,
        BSTR *MediaMajorType);

    HRESULT (STDMETHODCALLTYPE *put_MediaMajorType)(
        ILanguageComponentType* This,
        BSTR MediaMajorType);

    HRESULT (STDMETHODCALLTYPE *get__MediaMajorType)(
        ILanguageComponentType* This,
        GUID *MediaMajorTypeGuid);

    HRESULT (STDMETHODCALLTYPE *put__MediaMajorType)(
        ILanguageComponentType* This,
        REFCLSID MediaMajorTypeGuid);

    HRESULT (STDMETHODCALLTYPE *get_MediaSubType)(
        ILanguageComponentType* This,
        BSTR *MediaSubType);

    HRESULT (STDMETHODCALLTYPE *put_MediaSubType)(
        ILanguageComponentType* This,
        BSTR MediaSubType);

    HRESULT (STDMETHODCALLTYPE *get__MediaSubType)(
        ILanguageComponentType* This,
        GUID *MediaSubTypeGuid);

    HRESULT (STDMETHODCALLTYPE *put__MediaSubType)(
        ILanguageComponentType* This,
        REFCLSID MediaSubTypeGuid);

    HRESULT (STDMETHODCALLTYPE *get_MediaFormatType)(
        ILanguageComponentType* This,
        BSTR *MediaFormatType);

    HRESULT (STDMETHODCALLTYPE *put_MediaFormatType)(
        ILanguageComponentType* This,
        BSTR MediaFormatType);

    HRESULT (STDMETHODCALLTYPE *get__MediaFormatType)(
        ILanguageComponentType* This,
        GUID *MediaFormatTypeGuid);

    HRESULT (STDMETHODCALLTYPE *put__MediaFormatType)(
        ILanguageComponentType* This,
        REFCLSID MediaFormatTypeGuid);

    HRESULT (STDMETHODCALLTYPE *get_MediaType)(
        ILanguageComponentType* This,
        AM_MEDIA_TYPE *MediaType);

    HRESULT (STDMETHODCALLTYPE *put_MediaType)(
        ILanguageComponentType* This,
        AM_MEDIA_TYPE *MediaType);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        ILanguageComponentType* This,
        IComponentType **NewCT);

    /*** ILanguageComponentType methods ***/
    HRESULT (STDMETHODCALLTYPE *get_LangID)(
        ILanguageComponentType* This,
        LONG *LangID);

    HRESULT (STDMETHODCALLTYPE *put_LangID)(
        ILanguageComponentType* This,
        LONG LangID);

    END_INTERFACE
} ILanguageComponentTypeVtbl;
interface ILanguageComponentType {
    CONST_VTBL ILanguageComponentTypeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ILanguageComponentType_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ILanguageComponentType_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ILanguageComponentType_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ILanguageComponentType_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ILanguageComponentType_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ILanguageComponentType_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ILanguageComponentType_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IComponentType methods ***/
#define ILanguageComponentType_get_Category(This,Category) (This)->lpVtbl->get_Category(This,Category)
#define ILanguageComponentType_put_Category(This,Category) (This)->lpVtbl->put_Category(This,Category)
#define ILanguageComponentType_get_MediaMajorType(This,MediaMajorType) (This)->lpVtbl->get_MediaMajorType(This,MediaMajorType)
#define ILanguageComponentType_put_MediaMajorType(This,MediaMajorType) (This)->lpVtbl->put_MediaMajorType(This,MediaMajorType)
#define ILanguageComponentType_get__MediaMajorType(This,MediaMajorTypeGuid) (This)->lpVtbl->get__MediaMajorType(This,MediaMajorTypeGuid)
#define ILanguageComponentType_put__MediaMajorType(This,MediaMajorTypeGuid) (This)->lpVtbl->put__MediaMajorType(This,MediaMajorTypeGuid)
#define ILanguageComponentType_get_MediaSubType(This,MediaSubType) (This)->lpVtbl->get_MediaSubType(This,MediaSubType)
#define ILanguageComponentType_put_MediaSubType(This,MediaSubType) (This)->lpVtbl->put_MediaSubType(This,MediaSubType)
#define ILanguageComponentType_get__MediaSubType(This,MediaSubTypeGuid) (This)->lpVtbl->get__MediaSubType(This,MediaSubTypeGuid)
#define ILanguageComponentType_put__MediaSubType(This,MediaSubTypeGuid) (This)->lpVtbl->put__MediaSubType(This,MediaSubTypeGuid)
#define ILanguageComponentType_get_MediaFormatType(This,MediaFormatType) (This)->lpVtbl->get_MediaFormatType(This,MediaFormatType)
#define ILanguageComponentType_put_MediaFormatType(This,MediaFormatType) (This)->lpVtbl->put_MediaFormatType(This,MediaFormatType)
#define ILanguageComponentType_get__MediaFormatType(This,MediaFormatTypeGuid) (This)->lpVtbl->get__MediaFormatType(This,MediaFormatTypeGuid)
#define ILanguageComponentType_put__MediaFormatType(This,MediaFormatTypeGuid) (This)->lpVtbl->put__MediaFormatType(This,MediaFormatTypeGuid)
#define ILanguageComponentType_get_MediaType(This,MediaType) (This)->lpVtbl->get_MediaType(This,MediaType)
#define ILanguageComponentType_put_MediaType(This,MediaType) (This)->lpVtbl->put_MediaType(This,MediaType)
#define ILanguageComponentType_Clone(This,NewCT) (This)->lpVtbl->Clone(This,NewCT)
/*** ILanguageComponentType methods ***/
#define ILanguageComponentType_get_LangID(This,LangID) (This)->lpVtbl->get_LangID(This,LangID)
#define ILanguageComponentType_put_LangID(This,LangID) (This)->lpVtbl->put_LangID(This,LangID)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ILanguageComponentType_QueryInterface(ILanguageComponentType* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ILanguageComponentType_AddRef(ILanguageComponentType* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ILanguageComponentType_Release(ILanguageComponentType* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ILanguageComponentType_GetTypeInfoCount(ILanguageComponentType* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ILanguageComponentType_GetTypeInfo(ILanguageComponentType* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ILanguageComponentType_GetIDsOfNames(ILanguageComponentType* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ILanguageComponentType_Invoke(ILanguageComponentType* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IComponentType methods ***/
static FORCEINLINE HRESULT ILanguageComponentType_get_Category(ILanguageComponentType* This,ComponentCategory *Category) {
    return This->lpVtbl->get_Category(This,Category);
}
static FORCEINLINE HRESULT ILanguageComponentType_put_Category(ILanguageComponentType* This,ComponentCategory Category) {
    return This->lpVtbl->put_Category(This,Category);
}
static FORCEINLINE HRESULT ILanguageComponentType_get_MediaMajorType(ILanguageComponentType* This,BSTR *MediaMajorType) {
    return This->lpVtbl->get_MediaMajorType(This,MediaMajorType);
}
static FORCEINLINE HRESULT ILanguageComponentType_put_MediaMajorType(ILanguageComponentType* This,BSTR MediaMajorType) {
    return This->lpVtbl->put_MediaMajorType(This,MediaMajorType);
}
static FORCEINLINE HRESULT ILanguageComponentType_get__MediaMajorType(ILanguageComponentType* This,GUID *MediaMajorTypeGuid) {
    return This->lpVtbl->get__MediaMajorType(This,MediaMajorTypeGuid);
}
static FORCEINLINE HRESULT ILanguageComponentType_put__MediaMajorType(ILanguageComponentType* This,REFCLSID MediaMajorTypeGuid) {
    return This->lpVtbl->put__MediaMajorType(This,MediaMajorTypeGuid);
}
static FORCEINLINE HRESULT ILanguageComponentType_get_MediaSubType(ILanguageComponentType* This,BSTR *MediaSubType) {
    return This->lpVtbl->get_MediaSubType(This,MediaSubType);
}
static FORCEINLINE HRESULT ILanguageComponentType_put_MediaSubType(ILanguageComponentType* This,BSTR MediaSubType) {
    return This->lpVtbl->put_MediaSubType(This,MediaSubType);
}
static FORCEINLINE HRESULT ILanguageComponentType_get__MediaSubType(ILanguageComponentType* This,GUID *MediaSubTypeGuid) {
    return This->lpVtbl->get__MediaSubType(This,MediaSubTypeGuid);
}
static FORCEINLINE HRESULT ILanguageComponentType_put__MediaSubType(ILanguageComponentType* This,REFCLSID MediaSubTypeGuid) {
    return This->lpVtbl->put__MediaSubType(This,MediaSubTypeGuid);
}
static FORCEINLINE HRESULT ILanguageComponentType_get_MediaFormatType(ILanguageComponentType* This,BSTR *MediaFormatType) {
    return This->lpVtbl->get_MediaFormatType(This,MediaFormatType);
}
static FORCEINLINE HRESULT ILanguageComponentType_put_MediaFormatType(ILanguageComponentType* This,BSTR MediaFormatType) {
    return This->lpVtbl->put_MediaFormatType(This,MediaFormatType);
}
static FORCEINLINE HRESULT ILanguageComponentType_get__MediaFormatType(ILanguageComponentType* This,GUID *MediaFormatTypeGuid) {
    return This->lpVtbl->get__MediaFormatType(This,MediaFormatTypeGuid);
}
static FORCEINLINE HRESULT ILanguageComponentType_put__MediaFormatType(ILanguageComponentType* This,REFCLSID MediaFormatTypeGuid) {
    return This->lpVtbl->put__MediaFormatType(This,MediaFormatTypeGuid);
}
static FORCEINLINE HRESULT ILanguageComponentType_get_MediaType(ILanguageComponentType* This,AM_MEDIA_TYPE *MediaType) {
    return This->lpVtbl->get_MediaType(This,MediaType);
}
static FORCEINLINE HRESULT ILanguageComponentType_put_MediaType(ILanguageComponentType* This,AM_MEDIA_TYPE *MediaType) {
    return This->lpVtbl->put_MediaType(This,MediaType);
}
static FORCEINLINE HRESULT ILanguageComponentType_Clone(ILanguageComponentType* This,IComponentType **NewCT) {
    return This->lpVtbl->Clone(This,NewCT);
}
/*** ILanguageComponentType methods ***/
static FORCEINLINE HRESULT ILanguageComponentType_get_LangID(ILanguageComponentType* This,LONG *LangID) {
    return This->lpVtbl->get_LangID(This,LangID);
}
static FORCEINLINE HRESULT ILanguageComponentType_put_LangID(ILanguageComponentType* This,LONG LangID) {
    return This->lpVtbl->put_LangID(This,LangID);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ILanguageComponentType_get_LangID_Proxy(
    ILanguageComponentType* This,
    LONG *LangID);
void __RPC_STUB ILanguageComponentType_get_LangID_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ILanguageComponentType_put_LangID_Proxy(
    ILanguageComponentType* This,
    LONG LangID);
void __RPC_STUB ILanguageComponentType_put_LangID_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ILanguageComponentType_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMPEG2ComponentType interface
 */
#ifndef __IMPEG2ComponentType_INTERFACE_DEFINED__
#define __IMPEG2ComponentType_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMPEG2ComponentType, 0x2c073d84, 0xb51c, 0x48c9, 0xaa,0x9f, 0x68,0x97,0x1e,0x1f,0x6e,0x38);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2c073d84-b51c-48c9-aa9f-68971e1f6e38")
IMPEG2ComponentType : public ILanguageComponentType
{
    virtual HRESULT STDMETHODCALLTYPE get_StreamType(
        MPEG2StreamType *MP2StreamType) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_StreamType(
        MPEG2StreamType MP2StreamType) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMPEG2ComponentType, 0x2c073d84, 0xb51c, 0x48c9, 0xaa,0x9f, 0x68,0x97,0x1e,0x1f,0x6e,0x38)
#endif
#else
typedef struct IMPEG2ComponentTypeVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IMPEG2ComponentType* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IMPEG2ComponentType* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IMPEG2ComponentType* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IMPEG2ComponentType* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IComponentType methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Category)(
        IMPEG2ComponentType* This,
        ComponentCategory *Category);

    HRESULT (STDMETHODCALLTYPE *put_Category)(
        IMPEG2ComponentType* This,
        ComponentCategory Category);

    HRESULT (STDMETHODCALLTYPE *get_MediaMajorType)(
        IMPEG2ComponentType* This,
        BSTR *MediaMajorType);

    HRESULT (STDMETHODCALLTYPE *put_MediaMajorType)(
        IMPEG2ComponentType* This,
        BSTR MediaMajorType);

    HRESULT (STDMETHODCALLTYPE *get__MediaMajorType)(
        IMPEG2ComponentType* This,
        GUID *MediaMajorTypeGuid);

    HRESULT (STDMETHODCALLTYPE *put__MediaMajorType)(
        IMPEG2ComponentType* This,
        REFCLSID MediaMajorTypeGuid);

    HRESULT (STDMETHODCALLTYPE *get_MediaSubType)(
        IMPEG2ComponentType* This,
        BSTR *MediaSubType);

    HRESULT (STDMETHODCALLTYPE *put_MediaSubType)(
        IMPEG2ComponentType* This,
        BSTR MediaSubType);

    HRESULT (STDMETHODCALLTYPE *get__MediaSubType)(
        IMPEG2ComponentType* This,
        GUID *MediaSubTypeGuid);

    HRESULT (STDMETHODCALLTYPE *put__MediaSubType)(
        IMPEG2ComponentType* This,
        REFCLSID MediaSubTypeGuid);

    HRESULT (STDMETHODCALLTYPE *get_MediaFormatType)(
        IMPEG2ComponentType* This,
        BSTR *MediaFormatType);

    HRESULT (STDMETHODCALLTYPE *put_MediaFormatType)(
        IMPEG2ComponentType* This,
        BSTR MediaFormatType);

    HRESULT (STDMETHODCALLTYPE *get__MediaFormatType)(
        IMPEG2ComponentType* This,
        GUID *MediaFormatTypeGuid);

    HRESULT (STDMETHODCALLTYPE *put__MediaFormatType)(
        IMPEG2ComponentType* This,
        REFCLSID MediaFormatTypeGuid);

    HRESULT (STDMETHODCALLTYPE *get_MediaType)(
        IMPEG2ComponentType* This,
        AM_MEDIA_TYPE *MediaType);

    HRESULT (STDMETHODCALLTYPE *put_MediaType)(
        IMPEG2ComponentType* This,
        AM_MEDIA_TYPE *MediaType);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IMPEG2ComponentType* This,
        IComponentType **NewCT);

    /*** ILanguageComponentType methods ***/
    HRESULT (STDMETHODCALLTYPE *get_LangID)(
        IMPEG2ComponentType* This,
        LONG *LangID);

    HRESULT (STDMETHODCALLTYPE *put_LangID)(
        IMPEG2ComponentType* This,
        LONG LangID);

    /*** IMPEG2ComponentType methods ***/
    HRESULT (STDMETHODCALLTYPE *get_StreamType)(
        IMPEG2ComponentType* This,
        MPEG2StreamType *MP2StreamType);

    HRESULT (STDMETHODCALLTYPE *put_StreamType)(
        IMPEG2ComponentType* This,
        MPEG2StreamType MP2StreamType);

    END_INTERFACE
} IMPEG2ComponentTypeVtbl;
interface IMPEG2ComponentType {
    CONST_VTBL IMPEG2ComponentTypeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMPEG2ComponentType_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMPEG2ComponentType_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMPEG2ComponentType_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IMPEG2ComponentType_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IMPEG2ComponentType_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IMPEG2ComponentType_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IMPEG2ComponentType_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IComponentType methods ***/
#define IMPEG2ComponentType_get_Category(This,Category) (This)->lpVtbl->get_Category(This,Category)
#define IMPEG2ComponentType_put_Category(This,Category) (This)->lpVtbl->put_Category(This,Category)
#define IMPEG2ComponentType_get_MediaMajorType(This,MediaMajorType) (This)->lpVtbl->get_MediaMajorType(This,MediaMajorType)
#define IMPEG2ComponentType_put_MediaMajorType(This,MediaMajorType) (This)->lpVtbl->put_MediaMajorType(This,MediaMajorType)
#define IMPEG2ComponentType_get__MediaMajorType(This,MediaMajorTypeGuid) (This)->lpVtbl->get__MediaMajorType(This,MediaMajorTypeGuid)
#define IMPEG2ComponentType_put__MediaMajorType(This,MediaMajorTypeGuid) (This)->lpVtbl->put__MediaMajorType(This,MediaMajorTypeGuid)
#define IMPEG2ComponentType_get_MediaSubType(This,MediaSubType) (This)->lpVtbl->get_MediaSubType(This,MediaSubType)
#define IMPEG2ComponentType_put_MediaSubType(This,MediaSubType) (This)->lpVtbl->put_MediaSubType(This,MediaSubType)
#define IMPEG2ComponentType_get__MediaSubType(This,MediaSubTypeGuid) (This)->lpVtbl->get__MediaSubType(This,MediaSubTypeGuid)
#define IMPEG2ComponentType_put__MediaSubType(This,MediaSubTypeGuid) (This)->lpVtbl->put__MediaSubType(This,MediaSubTypeGuid)
#define IMPEG2ComponentType_get_MediaFormatType(This,MediaFormatType) (This)->lpVtbl->get_MediaFormatType(This,MediaFormatType)
#define IMPEG2ComponentType_put_MediaFormatType(This,MediaFormatType) (This)->lpVtbl->put_MediaFormatType(This,MediaFormatType)
#define IMPEG2ComponentType_get__MediaFormatType(This,MediaFormatTypeGuid) (This)->lpVtbl->get__MediaFormatType(This,MediaFormatTypeGuid)
#define IMPEG2ComponentType_put__MediaFormatType(This,MediaFormatTypeGuid) (This)->lpVtbl->put__MediaFormatType(This,MediaFormatTypeGuid)
#define IMPEG2ComponentType_get_MediaType(This,MediaType) (This)->lpVtbl->get_MediaType(This,MediaType)
#define IMPEG2ComponentType_put_MediaType(This,MediaType) (This)->lpVtbl->put_MediaType(This,MediaType)
#define IMPEG2ComponentType_Clone(This,NewCT) (This)->lpVtbl->Clone(This,NewCT)
/*** ILanguageComponentType methods ***/
#define IMPEG2ComponentType_get_LangID(This,LangID) (This)->lpVtbl->get_LangID(This,LangID)
#define IMPEG2ComponentType_put_LangID(This,LangID) (This)->lpVtbl->put_LangID(This,LangID)
/*** IMPEG2ComponentType methods ***/
#define IMPEG2ComponentType_get_StreamType(This,MP2StreamType) (This)->lpVtbl->get_StreamType(This,MP2StreamType)
#define IMPEG2ComponentType_put_StreamType(This,MP2StreamType) (This)->lpVtbl->put_StreamType(This,MP2StreamType)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IMPEG2ComponentType_QueryInterface(IMPEG2ComponentType* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IMPEG2ComponentType_AddRef(IMPEG2ComponentType* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IMPEG2ComponentType_Release(IMPEG2ComponentType* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IMPEG2ComponentType_GetTypeInfoCount(IMPEG2ComponentType* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IMPEG2ComponentType_GetTypeInfo(IMPEG2ComponentType* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IMPEG2ComponentType_GetIDsOfNames(IMPEG2ComponentType* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IMPEG2ComponentType_Invoke(IMPEG2ComponentType* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IComponentType methods ***/
static FORCEINLINE HRESULT IMPEG2ComponentType_get_Category(IMPEG2ComponentType* This,ComponentCategory *Category) {
    return This->lpVtbl->get_Category(This,Category);
}
static FORCEINLINE HRESULT IMPEG2ComponentType_put_Category(IMPEG2ComponentType* This,ComponentCategory Category) {
    return This->lpVtbl->put_Category(This,Category);
}
static FORCEINLINE HRESULT IMPEG2ComponentType_get_MediaMajorType(IMPEG2ComponentType* This,BSTR *MediaMajorType) {
    return This->lpVtbl->get_MediaMajorType(This,MediaMajorType);
}
static FORCEINLINE HRESULT IMPEG2ComponentType_put_MediaMajorType(IMPEG2ComponentType* This,BSTR MediaMajorType) {
    return This->lpVtbl->put_MediaMajorType(This,MediaMajorType);
}
static FORCEINLINE HRESULT IMPEG2ComponentType_get__MediaMajorType(IMPEG2ComponentType* This,GUID *MediaMajorTypeGuid) {
    return This->lpVtbl->get__MediaMajorType(This,MediaMajorTypeGuid);
}
static FORCEINLINE HRESULT IMPEG2ComponentType_put__MediaMajorType(IMPEG2ComponentType* This,REFCLSID MediaMajorTypeGuid) {
    return This->lpVtbl->put__MediaMajorType(This,MediaMajorTypeGuid);
}
static FORCEINLINE HRESULT IMPEG2ComponentType_get_MediaSubType(IMPEG2ComponentType* This,BSTR *MediaSubType) {
    return This->lpVtbl->get_MediaSubType(This,MediaSubType);
}
static FORCEINLINE HRESULT IMPEG2ComponentType_put_MediaSubType(IMPEG2ComponentType* This,BSTR MediaSubType) {
    return This->lpVtbl->put_MediaSubType(This,MediaSubType);
}
static FORCEINLINE HRESULT IMPEG2ComponentType_get__MediaSubType(IMPEG2ComponentType* This,GUID *MediaSubTypeGuid) {
    return This->lpVtbl->get__MediaSubType(This,MediaSubTypeGuid);
}
static FORCEINLINE HRESULT IMPEG2ComponentType_put__MediaSubType(IMPEG2ComponentType* This,REFCLSID MediaSubTypeGuid) {
    return This->lpVtbl->put__MediaSubType(This,MediaSubTypeGuid);
}
static FORCEINLINE HRESULT IMPEG2ComponentType_get_MediaFormatType(IMPEG2ComponentType* This,BSTR *MediaFormatType) {
    return This->lpVtbl->get_MediaFormatType(This,MediaFormatType);
}
static FORCEINLINE HRESULT IMPEG2ComponentType_put_MediaFormatType(IMPEG2ComponentType* This,BSTR MediaFormatType) {
    return This->lpVtbl->put_MediaFormatType(This,MediaFormatType);
}
static FORCEINLINE HRESULT IMPEG2ComponentType_get__MediaFormatType(IMPEG2ComponentType* This,GUID *MediaFormatTypeGuid) {
    return This->lpVtbl->get__MediaFormatType(This,MediaFormatTypeGuid);
}
static FORCEINLINE HRESULT IMPEG2ComponentType_put__MediaFormatType(IMPEG2ComponentType* This,REFCLSID MediaFormatTypeGuid) {
    return This->lpVtbl->put__MediaFormatType(This,MediaFormatTypeGuid);
}
static FORCEINLINE HRESULT IMPEG2ComponentType_get_MediaType(IMPEG2ComponentType* This,AM_MEDIA_TYPE *MediaType) {
    return This->lpVtbl->get_MediaType(This,MediaType);
}
static FORCEINLINE HRESULT IMPEG2ComponentType_put_MediaType(IMPEG2ComponentType* This,AM_MEDIA_TYPE *MediaType) {
    return This->lpVtbl->put_MediaType(This,MediaType);
}
static FORCEINLINE HRESULT IMPEG2ComponentType_Clone(IMPEG2ComponentType* This,IComponentType **NewCT) {
    return This->lpVtbl->Clone(This,NewCT);
}
/*** ILanguageComponentType methods ***/
static FORCEINLINE HRESULT IMPEG2ComponentType_get_LangID(IMPEG2ComponentType* This,LONG *LangID) {
    return This->lpVtbl->get_LangID(This,LangID);
}
static FORCEINLINE HRESULT IMPEG2ComponentType_put_LangID(IMPEG2ComponentType* This,LONG LangID) {
    return This->lpVtbl->put_LangID(This,LangID);
}
/*** IMPEG2ComponentType methods ***/
static FORCEINLINE HRESULT IMPEG2ComponentType_get_StreamType(IMPEG2ComponentType* This,MPEG2StreamType *MP2StreamType) {
    return This->lpVtbl->get_StreamType(This,MP2StreamType);
}
static FORCEINLINE HRESULT IMPEG2ComponentType_put_StreamType(IMPEG2ComponentType* This,MPEG2StreamType MP2StreamType) {
    return This->lpVtbl->put_StreamType(This,MP2StreamType);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IMPEG2ComponentType_get_StreamType_Proxy(
    IMPEG2ComponentType* This,
    MPEG2StreamType *MP2StreamType);
void __RPC_STUB IMPEG2ComponentType_get_StreamType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMPEG2ComponentType_put_StreamType_Proxy(
    IMPEG2ComponentType* This,
    MPEG2StreamType MP2StreamType);
void __RPC_STUB IMPEG2ComponentType_put_StreamType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IMPEG2ComponentType_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IATSCComponentType interface
 */
#ifndef __IATSCComponentType_INTERFACE_DEFINED__
#define __IATSCComponentType_INTERFACE_DEFINED__

DEFINE_GUID(IID_IATSCComponentType, 0xfc189e4d, 0x7bd4, 0x4125, 0xb3,0xb3, 0x3a,0x76,0xa3,0x32,0xcc,0x96);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("fc189e4d-7bd4-4125-b3b3-3a76a332cc96")
IATSCComponentType : public IMPEG2ComponentType
{
    virtual HRESULT STDMETHODCALLTYPE get_Flags(
        LONG *Flags) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Flags(
        LONG flags) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IATSCComponentType, 0xfc189e4d, 0x7bd4, 0x4125, 0xb3,0xb3, 0x3a,0x76,0xa3,0x32,0xcc,0x96)
#endif
#else
typedef struct IATSCComponentTypeVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IATSCComponentType* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IATSCComponentType* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IATSCComponentType* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IATSCComponentType* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IComponentType methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Category)(
        IATSCComponentType* This,
        ComponentCategory *Category);

    HRESULT (STDMETHODCALLTYPE *put_Category)(
        IATSCComponentType* This,
        ComponentCategory Category);

    HRESULT (STDMETHODCALLTYPE *get_MediaMajorType)(
        IATSCComponentType* This,
        BSTR *MediaMajorType);

    HRESULT (STDMETHODCALLTYPE *put_MediaMajorType)(
        IATSCComponentType* This,
        BSTR MediaMajorType);

    HRESULT (STDMETHODCALLTYPE *get__MediaMajorType)(
        IATSCComponentType* This,
        GUID *MediaMajorTypeGuid);

    HRESULT (STDMETHODCALLTYPE *put__MediaMajorType)(
        IATSCComponentType* This,
        REFCLSID MediaMajorTypeGuid);

    HRESULT (STDMETHODCALLTYPE *get_MediaSubType)(
        IATSCComponentType* This,
        BSTR *MediaSubType);

    HRESULT (STDMETHODCALLTYPE *put_MediaSubType)(
        IATSCComponentType* This,
        BSTR MediaSubType);

    HRESULT (STDMETHODCALLTYPE *get__MediaSubType)(
        IATSCComponentType* This,
        GUID *MediaSubTypeGuid);

    HRESULT (STDMETHODCALLTYPE *put__MediaSubType)(
        IATSCComponentType* This,
        REFCLSID MediaSubTypeGuid);

    HRESULT (STDMETHODCALLTYPE *get_MediaFormatType)(
        IATSCComponentType* This,
        BSTR *MediaFormatType);

    HRESULT (STDMETHODCALLTYPE *put_MediaFormatType)(
        IATSCComponentType* This,
        BSTR MediaFormatType);

    HRESULT (STDMETHODCALLTYPE *get__MediaFormatType)(
        IATSCComponentType* This,
        GUID *MediaFormatTypeGuid);

    HRESULT (STDMETHODCALLTYPE *put__MediaFormatType)(
        IATSCComponentType* This,
        REFCLSID MediaFormatTypeGuid);

    HRESULT (STDMETHODCALLTYPE *get_MediaType)(
        IATSCComponentType* This,
        AM_MEDIA_TYPE *MediaType);

    HRESULT (STDMETHODCALLTYPE *put_MediaType)(
        IATSCComponentType* This,
        AM_MEDIA_TYPE *MediaType);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IATSCComponentType* This,
        IComponentType **NewCT);

    /*** ILanguageComponentType methods ***/
    HRESULT (STDMETHODCALLTYPE *get_LangID)(
        IATSCComponentType* This,
        LONG *LangID);

    HRESULT (STDMETHODCALLTYPE *put_LangID)(
        IATSCComponentType* This,
        LONG LangID);

    /*** IMPEG2ComponentType methods ***/
    HRESULT (STDMETHODCALLTYPE *get_StreamType)(
        IATSCComponentType* This,
        MPEG2StreamType *MP2StreamType);

    HRESULT (STDMETHODCALLTYPE *put_StreamType)(
        IATSCComponentType* This,
        MPEG2StreamType MP2StreamType);

    /*** IATSCComponentType methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Flags)(
        IATSCComponentType* This,
        LONG *Flags);

    HRESULT (STDMETHODCALLTYPE *put_Flags)(
        IATSCComponentType* This,
        LONG flags);

    END_INTERFACE
} IATSCComponentTypeVtbl;
interface IATSCComponentType {
    CONST_VTBL IATSCComponentTypeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IATSCComponentType_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IATSCComponentType_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IATSCComponentType_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IATSCComponentType_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IATSCComponentType_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IATSCComponentType_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IATSCComponentType_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IComponentType methods ***/
#define IATSCComponentType_get_Category(This,Category) (This)->lpVtbl->get_Category(This,Category)
#define IATSCComponentType_put_Category(This,Category) (This)->lpVtbl->put_Category(This,Category)
#define IATSCComponentType_get_MediaMajorType(This,MediaMajorType) (This)->lpVtbl->get_MediaMajorType(This,MediaMajorType)
#define IATSCComponentType_put_MediaMajorType(This,MediaMajorType) (This)->lpVtbl->put_MediaMajorType(This,MediaMajorType)
#define IATSCComponentType_get__MediaMajorType(This,MediaMajorTypeGuid) (This)->lpVtbl->get__MediaMajorType(This,MediaMajorTypeGuid)
#define IATSCComponentType_put__MediaMajorType(This,MediaMajorTypeGuid) (This)->lpVtbl->put__MediaMajorType(This,MediaMajorTypeGuid)
#define IATSCComponentType_get_MediaSubType(This,MediaSubType) (This)->lpVtbl->get_MediaSubType(This,MediaSubType)
#define IATSCComponentType_put_MediaSubType(This,MediaSubType) (This)->lpVtbl->put_MediaSubType(This,MediaSubType)
#define IATSCComponentType_get__MediaSubType(This,MediaSubTypeGuid) (This)->lpVtbl->get__MediaSubType(This,MediaSubTypeGuid)
#define IATSCComponentType_put__MediaSubType(This,MediaSubTypeGuid) (This)->lpVtbl->put__MediaSubType(This,MediaSubTypeGuid)
#define IATSCComponentType_get_MediaFormatType(This,MediaFormatType) (This)->lpVtbl->get_MediaFormatType(This,MediaFormatType)
#define IATSCComponentType_put_MediaFormatType(This,MediaFormatType) (This)->lpVtbl->put_MediaFormatType(This,MediaFormatType)
#define IATSCComponentType_get__MediaFormatType(This,MediaFormatTypeGuid) (This)->lpVtbl->get__MediaFormatType(This,MediaFormatTypeGuid)
#define IATSCComponentType_put__MediaFormatType(This,MediaFormatTypeGuid) (This)->lpVtbl->put__MediaFormatType(This,MediaFormatTypeGuid)
#define IATSCComponentType_get_MediaType(This,MediaType) (This)->lpVtbl->get_MediaType(This,MediaType)
#define IATSCComponentType_put_MediaType(This,MediaType) (This)->lpVtbl->put_MediaType(This,MediaType)
#define IATSCComponentType_Clone(This,NewCT) (This)->lpVtbl->Clone(This,NewCT)
/*** ILanguageComponentType methods ***/
#define IATSCComponentType_get_LangID(This,LangID) (This)->lpVtbl->get_LangID(This,LangID)
#define IATSCComponentType_put_LangID(This,LangID) (This)->lpVtbl->put_LangID(This,LangID)
/*** IMPEG2ComponentType methods ***/
#define IATSCComponentType_get_StreamType(This,MP2StreamType) (This)->lpVtbl->get_StreamType(This,MP2StreamType)
#define IATSCComponentType_put_StreamType(This,MP2StreamType) (This)->lpVtbl->put_StreamType(This,MP2StreamType)
/*** IATSCComponentType methods ***/
#define IATSCComponentType_get_Flags(This,Flags) (This)->lpVtbl->get_Flags(This,Flags)
#define IATSCComponentType_put_Flags(This,flags) (This)->lpVtbl->put_Flags(This,flags)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IATSCComponentType_QueryInterface(IATSCComponentType* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IATSCComponentType_AddRef(IATSCComponentType* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IATSCComponentType_Release(IATSCComponentType* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IATSCComponentType_GetTypeInfoCount(IATSCComponentType* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IATSCComponentType_GetTypeInfo(IATSCComponentType* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IATSCComponentType_GetIDsOfNames(IATSCComponentType* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IATSCComponentType_Invoke(IATSCComponentType* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IComponentType methods ***/
static FORCEINLINE HRESULT IATSCComponentType_get_Category(IATSCComponentType* This,ComponentCategory *Category) {
    return This->lpVtbl->get_Category(This,Category);
}
static FORCEINLINE HRESULT IATSCComponentType_put_Category(IATSCComponentType* This,ComponentCategory Category) {
    return This->lpVtbl->put_Category(This,Category);
}
static FORCEINLINE HRESULT IATSCComponentType_get_MediaMajorType(IATSCComponentType* This,BSTR *MediaMajorType) {
    return This->lpVtbl->get_MediaMajorType(This,MediaMajorType);
}
static FORCEINLINE HRESULT IATSCComponentType_put_MediaMajorType(IATSCComponentType* This,BSTR MediaMajorType) {
    return This->lpVtbl->put_MediaMajorType(This,MediaMajorType);
}
static FORCEINLINE HRESULT IATSCComponentType_get__MediaMajorType(IATSCComponentType* This,GUID *MediaMajorTypeGuid) {
    return This->lpVtbl->get__MediaMajorType(This,MediaMajorTypeGuid);
}
static FORCEINLINE HRESULT IATSCComponentType_put__MediaMajorType(IATSCComponentType* This,REFCLSID MediaMajorTypeGuid) {
    return This->lpVtbl->put__MediaMajorType(This,MediaMajorTypeGuid);
}
static FORCEINLINE HRESULT IATSCComponentType_get_MediaSubType(IATSCComponentType* This,BSTR *MediaSubType) {
    return This->lpVtbl->get_MediaSubType(This,MediaSubType);
}
static FORCEINLINE HRESULT IATSCComponentType_put_MediaSubType(IATSCComponentType* This,BSTR MediaSubType) {
    return This->lpVtbl->put_MediaSubType(This,MediaSubType);
}
static FORCEINLINE HRESULT IATSCComponentType_get__MediaSubType(IATSCComponentType* This,GUID *MediaSubTypeGuid) {
    return This->lpVtbl->get__MediaSubType(This,MediaSubTypeGuid);
}
static FORCEINLINE HRESULT IATSCComponentType_put__MediaSubType(IATSCComponentType* This,REFCLSID MediaSubTypeGuid) {
    return This->lpVtbl->put__MediaSubType(This,MediaSubTypeGuid);
}
static FORCEINLINE HRESULT IATSCComponentType_get_MediaFormatType(IATSCComponentType* This,BSTR *MediaFormatType) {
    return This->lpVtbl->get_MediaFormatType(This,MediaFormatType);
}
static FORCEINLINE HRESULT IATSCComponentType_put_MediaFormatType(IATSCComponentType* This,BSTR MediaFormatType) {
    return This->lpVtbl->put_MediaFormatType(This,MediaFormatType);
}
static FORCEINLINE HRESULT IATSCComponentType_get__MediaFormatType(IATSCComponentType* This,GUID *MediaFormatTypeGuid) {
    return This->lpVtbl->get__MediaFormatType(This,MediaFormatTypeGuid);
}
static FORCEINLINE HRESULT IATSCComponentType_put__MediaFormatType(IATSCComponentType* This,REFCLSID MediaFormatTypeGuid) {
    return This->lpVtbl->put__MediaFormatType(This,MediaFormatTypeGuid);
}
static FORCEINLINE HRESULT IATSCComponentType_get_MediaType(IATSCComponentType* This,AM_MEDIA_TYPE *MediaType) {
    return This->lpVtbl->get_MediaType(This,MediaType);
}
static FORCEINLINE HRESULT IATSCComponentType_put_MediaType(IATSCComponentType* This,AM_MEDIA_TYPE *MediaType) {
    return This->lpVtbl->put_MediaType(This,MediaType);
}
static FORCEINLINE HRESULT IATSCComponentType_Clone(IATSCComponentType* This,IComponentType **NewCT) {
    return This->lpVtbl->Clone(This,NewCT);
}
/*** ILanguageComponentType methods ***/
static FORCEINLINE HRESULT IATSCComponentType_get_LangID(IATSCComponentType* This,LONG *LangID) {
    return This->lpVtbl->get_LangID(This,LangID);
}
static FORCEINLINE HRESULT IATSCComponentType_put_LangID(IATSCComponentType* This,LONG LangID) {
    return This->lpVtbl->put_LangID(This,LangID);
}
/*** IMPEG2ComponentType methods ***/
static FORCEINLINE HRESULT IATSCComponentType_get_StreamType(IATSCComponentType* This,MPEG2StreamType *MP2StreamType) {
    return This->lpVtbl->get_StreamType(This,MP2StreamType);
}
static FORCEINLINE HRESULT IATSCComponentType_put_StreamType(IATSCComponentType* This,MPEG2StreamType MP2StreamType) {
    return This->lpVtbl->put_StreamType(This,MP2StreamType);
}
/*** IATSCComponentType methods ***/
static FORCEINLINE HRESULT IATSCComponentType_get_Flags(IATSCComponentType* This,LONG *Flags) {
    return This->lpVtbl->get_Flags(This,Flags);
}
static FORCEINLINE HRESULT IATSCComponentType_put_Flags(IATSCComponentType* This,LONG flags) {
    return This->lpVtbl->put_Flags(This,flags);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IATSCComponentType_get_Flags_Proxy(
    IATSCComponentType* This,
    LONG *Flags);
void __RPC_STUB IATSCComponentType_get_Flags_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IATSCComponentType_put_Flags_Proxy(
    IATSCComponentType* This,
    LONG flags);
void __RPC_STUB IATSCComponentType_put_Flags_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IATSCComponentType_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IEnumComponentTypes interface
 */
#ifndef __IEnumComponentTypes_INTERFACE_DEFINED__
#define __IEnumComponentTypes_INTERFACE_DEFINED__

DEFINE_GUID(IID_IEnumComponentTypes, 0x8a674b4a, 0x1f63, 0x11d3, 0xb6,0x4c, 0x00,0xc0,0x4f,0x79,0x49,0x8e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("8a674b4a-1f63-11d3-b64c-00c04f79498e")
IEnumComponentTypes : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Next(
        ULONG celt,
        IComponentType **rgelt,
        ULONG *pceltFetched) = 0;

    virtual HRESULT STDMETHODCALLTYPE Skip(
        ULONG celt) = 0;

    virtual HRESULT STDMETHODCALLTYPE Reset(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IEnumComponentTypes **ppEnum) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IEnumComponentTypes, 0x8a674b4a, 0x1f63, 0x11d3, 0xb6,0x4c, 0x00,0xc0,0x4f,0x79,0x49,0x8e)
#endif
#else
typedef struct IEnumComponentTypesVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IEnumComponentTypes methods ***/
    HRESULT (STDMETHODCALLTYPE *Next)(
        IEnumComponentTypes* This,
        ULONG celt,
        IComponentType **rgelt,
        ULONG *pceltFetched);

    HRESULT (STDMETHODCALLTYPE *Skip)(
        IEnumComponentTypes* This,
        ULONG celt);

    HRESULT (STDMETHODCALLTYPE *Reset)(
        IEnumComponentTypes* This);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IEnumComponentTypes* This,
        IEnumComponentTypes **ppEnum);

    END_INTERFACE
} IEnumComponentTypesVtbl;
interface IEnumComponentTypes {
    CONST_VTBL IEnumComponentTypesVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IEnumComponentTypes_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IEnumComponentTypes_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IEnumComponentTypes_Release(This) (This)->lpVtbl->Release(This)
/*** IEnumComponentTypes methods ***/
#define IEnumComponentTypes_Next(This,celt,rgelt,pceltFetched) (This)->lpVtbl->Next(This,celt,rgelt,pceltFetched)
#define IEnumComponentTypes_Skip(This,celt) (This)->lpVtbl->Skip(This,celt)
#define IEnumComponentTypes_Reset(This) (This)->lpVtbl->Reset(This)
#define IEnumComponentTypes_Clone(This,ppEnum) (This)->lpVtbl->Clone(This,ppEnum)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IEnumComponentTypes_QueryInterface(IEnumComponentTypes* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IEnumComponentTypes_AddRef(IEnumComponentTypes* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IEnumComponentTypes_Release(IEnumComponentTypes* This) {
    return This->lpVtbl->Release(This);
}
/*** IEnumComponentTypes methods ***/
static FORCEINLINE HRESULT IEnumComponentTypes_Next(IEnumComponentTypes* This,ULONG celt,IComponentType **rgelt,ULONG *pceltFetched) {
    return This->lpVtbl->Next(This,celt,rgelt,pceltFetched);
}
static FORCEINLINE HRESULT IEnumComponentTypes_Skip(IEnumComponentTypes* This,ULONG celt) {
    return This->lpVtbl->Skip(This,celt);
}
static FORCEINLINE HRESULT IEnumComponentTypes_Reset(IEnumComponentTypes* This) {
    return This->lpVtbl->Reset(This);
}
static FORCEINLINE HRESULT IEnumComponentTypes_Clone(IEnumComponentTypes* This,IEnumComponentTypes **ppEnum) {
    return This->lpVtbl->Clone(This,ppEnum);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IEnumComponentTypes_Next_Proxy(
    IEnumComponentTypes* This,
    ULONG celt,
    IComponentType **rgelt,
    ULONG *pceltFetched);
void __RPC_STUB IEnumComponentTypes_Next_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IEnumComponentTypes_Skip_Proxy(
    IEnumComponentTypes* This,
    ULONG celt);
void __RPC_STUB IEnumComponentTypes_Skip_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IEnumComponentTypes_Reset_Proxy(
    IEnumComponentTypes* This);
void __RPC_STUB IEnumComponentTypes_Reset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IEnumComponentTypes_Clone_Proxy(
    IEnumComponentTypes* This,
    IEnumComponentTypes **ppEnum);
void __RPC_STUB IEnumComponentTypes_Clone_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IEnumComponentTypes_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IComponentTypes interface
 */
#ifndef __IComponentTypes_INTERFACE_DEFINED__
#define __IComponentTypes_INTERFACE_DEFINED__

DEFINE_GUID(IID_IComponentTypes, 0x0dc13d4a, 0x0313, 0x11d3, 0x9d,0x8e, 0x00,0xc0,0x4f,0x72,0xd9,0x80);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("0dc13d4a-0313-11d3-9d8e-00c04f72d980")
IComponentTypes : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Count(
        LONG *Count) = 0;

    virtual HRESULT STDMETHODCALLTYPE get__NewEnum(
        IEnumVARIANT **ppNewEnum) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumComponentTypes(
        IEnumComponentTypes **ppNewEnum) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Item(
        VARIANT Index,
        IComponentType **ComponentType) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Item(
        VARIANT Index,
        IComponentType *ComponentType) = 0;

    virtual HRESULT STDMETHODCALLTYPE Add(
        IComponentType *ComponentType,
        VARIANT *NewIndex) = 0;

    virtual HRESULT STDMETHODCALLTYPE Remove(
        VARIANT Index) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IComponentTypes **NewList) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IComponentTypes, 0x0dc13d4a, 0x0313, 0x11d3, 0x9d,0x8e, 0x00,0xc0,0x4f,0x72,0xd9,0x80)
#endif
#else
typedef struct IComponentTypesVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IComponentTypes* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IComponentTypes* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IComponentTypes* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IComponentTypes* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IComponentTypes methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Count)(
        IComponentTypes* This,
        LONG *Count);

    HRESULT (STDMETHODCALLTYPE *get__NewEnum)(
        IComponentTypes* This,
        IEnumVARIANT **ppNewEnum);

    HRESULT (STDMETHODCALLTYPE *EnumComponentTypes)(
        IComponentTypes* This,
        IEnumComponentTypes **ppNewEnum);

    HRESULT (STDMETHODCALLTYPE *get_Item)(
        IComponentTypes* This,
        VARIANT Index,
        IComponentType **ComponentType);

    HRESULT (STDMETHODCALLTYPE *put_Item)(
        IComponentTypes* This,
        VARIANT Index,
        IComponentType *ComponentType);

    HRESULT (STDMETHODCALLTYPE *Add)(
        IComponentTypes* This,
        IComponentType *ComponentType,
        VARIANT *NewIndex);

    HRESULT (STDMETHODCALLTYPE *Remove)(
        IComponentTypes* This,
        VARIANT Index);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IComponentTypes* This,
        IComponentTypes **NewList);

    END_INTERFACE
} IComponentTypesVtbl;
interface IComponentTypes {
    CONST_VTBL IComponentTypesVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IComponentTypes_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IComponentTypes_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IComponentTypes_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IComponentTypes_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IComponentTypes_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IComponentTypes_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IComponentTypes_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IComponentTypes methods ***/
#define IComponentTypes_get_Count(This,Count) (This)->lpVtbl->get_Count(This,Count)
#define IComponentTypes_get__NewEnum(This,ppNewEnum) (This)->lpVtbl->get__NewEnum(This,ppNewEnum)
#define IComponentTypes_EnumComponentTypes(This,ppNewEnum) (This)->lpVtbl->EnumComponentTypes(This,ppNewEnum)
#define IComponentTypes_get_Item(This,Index,ComponentType) (This)->lpVtbl->get_Item(This,Index,ComponentType)
#define IComponentTypes_put_Item(This,Index,ComponentType) (This)->lpVtbl->put_Item(This,Index,ComponentType)
#define IComponentTypes_Add(This,ComponentType,NewIndex) (This)->lpVtbl->Add(This,ComponentType,NewIndex)
#define IComponentTypes_Remove(This,Index) (This)->lpVtbl->Remove(This,Index)
#define IComponentTypes_Clone(This,NewList) (This)->lpVtbl->Clone(This,NewList)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IComponentTypes_QueryInterface(IComponentTypes* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IComponentTypes_AddRef(IComponentTypes* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IComponentTypes_Release(IComponentTypes* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IComponentTypes_GetTypeInfoCount(IComponentTypes* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IComponentTypes_GetTypeInfo(IComponentTypes* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IComponentTypes_GetIDsOfNames(IComponentTypes* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IComponentTypes_Invoke(IComponentTypes* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IComponentTypes methods ***/
static FORCEINLINE HRESULT IComponentTypes_get_Count(IComponentTypes* This,LONG *Count) {
    return This->lpVtbl->get_Count(This,Count);
}
static FORCEINLINE HRESULT IComponentTypes_get__NewEnum(IComponentTypes* This,IEnumVARIANT **ppNewEnum) {
    return This->lpVtbl->get__NewEnum(This,ppNewEnum);
}
static FORCEINLINE HRESULT IComponentTypes_EnumComponentTypes(IComponentTypes* This,IEnumComponentTypes **ppNewEnum) {
    return This->lpVtbl->EnumComponentTypes(This,ppNewEnum);
}
static FORCEINLINE HRESULT IComponentTypes_get_Item(IComponentTypes* This,VARIANT Index,IComponentType **ComponentType) {
    return This->lpVtbl->get_Item(This,Index,ComponentType);
}
static FORCEINLINE HRESULT IComponentTypes_put_Item(IComponentTypes* This,VARIANT Index,IComponentType *ComponentType) {
    return This->lpVtbl->put_Item(This,Index,ComponentType);
}
static FORCEINLINE HRESULT IComponentTypes_Add(IComponentTypes* This,IComponentType *ComponentType,VARIANT *NewIndex) {
    return This->lpVtbl->Add(This,ComponentType,NewIndex);
}
static FORCEINLINE HRESULT IComponentTypes_Remove(IComponentTypes* This,VARIANT Index) {
    return This->lpVtbl->Remove(This,Index);
}
static FORCEINLINE HRESULT IComponentTypes_Clone(IComponentTypes* This,IComponentTypes **NewList) {
    return This->lpVtbl->Clone(This,NewList);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IComponentTypes_get_Count_Proxy(
    IComponentTypes* This,
    LONG *Count);
void __RPC_STUB IComponentTypes_get_Count_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IComponentTypes_get__NewEnum_Proxy(
    IComponentTypes* This,
    IEnumVARIANT **ppNewEnum);
void __RPC_STUB IComponentTypes_get__NewEnum_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IComponentTypes_EnumComponentTypes_Proxy(
    IComponentTypes* This,
    IEnumComponentTypes **ppNewEnum);
void __RPC_STUB IComponentTypes_EnumComponentTypes_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IComponentTypes_get_Item_Proxy(
    IComponentTypes* This,
    VARIANT Index,
    IComponentType **ComponentType);
void __RPC_STUB IComponentTypes_get_Item_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IComponentTypes_put_Item_Proxy(
    IComponentTypes* This,
    VARIANT Index,
    IComponentType *ComponentType);
void __RPC_STUB IComponentTypes_put_Item_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IComponentTypes_Add_Proxy(
    IComponentTypes* This,
    IComponentType *ComponentType,
    VARIANT *NewIndex);
void __RPC_STUB IComponentTypes_Add_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IComponentTypes_Remove_Proxy(
    IComponentTypes* This,
    VARIANT Index);
void __RPC_STUB IComponentTypes_Remove_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IComponentTypes_Clone_Proxy(
    IComponentTypes* This,
    IComponentTypes **NewList);
void __RPC_STUB IComponentTypes_Clone_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IComponentTypes_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IComponent interface
 */
#ifndef __IComponent_INTERFACE_DEFINED__
#define __IComponent_INTERFACE_DEFINED__

DEFINE_GUID(IID_IComponent, 0x1a5576fc, 0x0e19, 0x11d3, 0x9d,0x8e, 0x00,0xc0,0x4f,0x72,0xd9,0x80);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("1a5576fc-0e19-11d3-9d8e-00c04f72d980")
IComponent : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Type(
        IComponentType **CT) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Type(
        IComponentType *CT) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_DescLangID(
        LONG *LangID) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_DescLangID(
        LONG LangID) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Status(
        ComponentStatus *Status) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Status(
        ComponentStatus Status) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Description(
        BSTR *Description) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Description(
        BSTR Description) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IComponent **NewComponent) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IComponent, 0x1a5576fc, 0x0e19, 0x11d3, 0x9d,0x8e, 0x00,0xc0,0x4f,0x72,0xd9,0x80)
#endif
#else
typedef struct IComponentVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IComponent* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IComponent* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IComponent* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IComponent* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IComponent methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Type)(
        IComponent* This,
        IComponentType **CT);

    HRESULT (STDMETHODCALLTYPE *put_Type)(
        IComponent* This,
        IComponentType *CT);

    HRESULT (STDMETHODCALLTYPE *get_DescLangID)(
        IComponent* This,
        LONG *LangID);

    HRESULT (STDMETHODCALLTYPE *put_DescLangID)(
        IComponent* This,
        LONG LangID);

    HRESULT (STDMETHODCALLTYPE *get_Status)(
        IComponent* This,
        ComponentStatus *Status);

    HRESULT (STDMETHODCALLTYPE *put_Status)(
        IComponent* This,
        ComponentStatus Status);

    HRESULT (STDMETHODCALLTYPE *get_Description)(
        IComponent* This,
        BSTR *Description);

    HRESULT (STDMETHODCALLTYPE *put_Description)(
        IComponent* This,
        BSTR Description);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IComponent* This,
        IComponent **NewComponent);

    END_INTERFACE
} IComponentVtbl;
interface IComponent {
    CONST_VTBL IComponentVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IComponent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IComponent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IComponent_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IComponent_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IComponent_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IComponent_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IComponent_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IComponent methods ***/
#define IComponent_get_Type(This,CT) (This)->lpVtbl->get_Type(This,CT)
#define IComponent_put_Type(This,CT) (This)->lpVtbl->put_Type(This,CT)
#define IComponent_get_DescLangID(This,LangID) (This)->lpVtbl->get_DescLangID(This,LangID)
#define IComponent_put_DescLangID(This,LangID) (This)->lpVtbl->put_DescLangID(This,LangID)
#define IComponent_get_Status(This,Status) (This)->lpVtbl->get_Status(This,Status)
#define IComponent_put_Status(This,Status) (This)->lpVtbl->put_Status(This,Status)
#define IComponent_get_Description(This,Description) (This)->lpVtbl->get_Description(This,Description)
#define IComponent_put_Description(This,Description) (This)->lpVtbl->put_Description(This,Description)
#define IComponent_Clone(This,NewComponent) (This)->lpVtbl->Clone(This,NewComponent)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IComponent_QueryInterface(IComponent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IComponent_AddRef(IComponent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IComponent_Release(IComponent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IComponent_GetTypeInfoCount(IComponent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IComponent_GetTypeInfo(IComponent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IComponent_GetIDsOfNames(IComponent* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IComponent_Invoke(IComponent* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IComponent methods ***/
static FORCEINLINE HRESULT IComponent_get_Type(IComponent* This,IComponentType **CT) {
    return This->lpVtbl->get_Type(This,CT);
}
static FORCEINLINE HRESULT IComponent_put_Type(IComponent* This,IComponentType *CT) {
    return This->lpVtbl->put_Type(This,CT);
}
static FORCEINLINE HRESULT IComponent_get_DescLangID(IComponent* This,LONG *LangID) {
    return This->lpVtbl->get_DescLangID(This,LangID);
}
static FORCEINLINE HRESULT IComponent_put_DescLangID(IComponent* This,LONG LangID) {
    return This->lpVtbl->put_DescLangID(This,LangID);
}
static FORCEINLINE HRESULT IComponent_get_Status(IComponent* This,ComponentStatus *Status) {
    return This->lpVtbl->get_Status(This,Status);
}
static FORCEINLINE HRESULT IComponent_put_Status(IComponent* This,ComponentStatus Status) {
    return This->lpVtbl->put_Status(This,Status);
}
static FORCEINLINE HRESULT IComponent_get_Description(IComponent* This,BSTR *Description) {
    return This->lpVtbl->get_Description(This,Description);
}
static FORCEINLINE HRESULT IComponent_put_Description(IComponent* This,BSTR Description) {
    return This->lpVtbl->put_Description(This,Description);
}
static FORCEINLINE HRESULT IComponent_Clone(IComponent* This,IComponent **NewComponent) {
    return This->lpVtbl->Clone(This,NewComponent);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IComponent_get_Type_Proxy(
    IComponent* This,
    IComponentType **CT);
void __RPC_STUB IComponent_get_Type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IComponent_put_Type_Proxy(
    IComponent* This,
    IComponentType *CT);
void __RPC_STUB IComponent_put_Type_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IComponent_get_DescLangID_Proxy(
    IComponent* This,
    LONG *LangID);
void __RPC_STUB IComponent_get_DescLangID_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IComponent_put_DescLangID_Proxy(
    IComponent* This,
    LONG LangID);
void __RPC_STUB IComponent_put_DescLangID_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IComponent_get_Status_Proxy(
    IComponent* This,
    ComponentStatus *Status);
void __RPC_STUB IComponent_get_Status_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IComponent_put_Status_Proxy(
    IComponent* This,
    ComponentStatus Status);
void __RPC_STUB IComponent_put_Status_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IComponent_get_Description_Proxy(
    IComponent* This,
    BSTR *Description);
void __RPC_STUB IComponent_get_Description_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IComponent_put_Description_Proxy(
    IComponent* This,
    BSTR Description);
void __RPC_STUB IComponent_put_Description_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IComponent_Clone_Proxy(
    IComponent* This,
    IComponent **NewComponent);
void __RPC_STUB IComponent_Clone_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IComponent_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAnalogAudioComponentType interface
 */
#ifndef __IAnalogAudioComponentType_INTERFACE_DEFINED__
#define __IAnalogAudioComponentType_INTERFACE_DEFINED__

DEFINE_GUID(IID_IAnalogAudioComponentType, 0x2cfeb2a8, 0x1787, 0x4a24, 0xa9,0x41, 0xc6,0xea,0xec,0x39,0xc8,0x42);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2cfeb2a8-1787-4a24-a941-c6eaec39c842")
IAnalogAudioComponentType : public IComponentType
{
    virtual HRESULT STDMETHODCALLTYPE get_AnalogAudioMode(
        TVAudioMode *Mode) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_AnalogAudioMode(
        TVAudioMode Mode) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IAnalogAudioComponentType, 0x2cfeb2a8, 0x1787, 0x4a24, 0xa9,0x41, 0xc6,0xea,0xec,0x39,0xc8,0x42)
#endif
#else
typedef struct IAnalogAudioComponentTypeVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IAnalogAudioComponentType* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IAnalogAudioComponentType* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IAnalogAudioComponentType* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IAnalogAudioComponentType* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IComponentType methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Category)(
        IAnalogAudioComponentType* This,
        ComponentCategory *Category);

    HRESULT (STDMETHODCALLTYPE *put_Category)(
        IAnalogAudioComponentType* This,
        ComponentCategory Category);

    HRESULT (STDMETHODCALLTYPE *get_MediaMajorType)(
        IAnalogAudioComponentType* This,
        BSTR *MediaMajorType);

    HRESULT (STDMETHODCALLTYPE *put_MediaMajorType)(
        IAnalogAudioComponentType* This,
        BSTR MediaMajorType);

    HRESULT (STDMETHODCALLTYPE *get__MediaMajorType)(
        IAnalogAudioComponentType* This,
        GUID *MediaMajorTypeGuid);

    HRESULT (STDMETHODCALLTYPE *put__MediaMajorType)(
        IAnalogAudioComponentType* This,
        REFCLSID MediaMajorTypeGuid);

    HRESULT (STDMETHODCALLTYPE *get_MediaSubType)(
        IAnalogAudioComponentType* This,
        BSTR *MediaSubType);

    HRESULT (STDMETHODCALLTYPE *put_MediaSubType)(
        IAnalogAudioComponentType* This,
        BSTR MediaSubType);

    HRESULT (STDMETHODCALLTYPE *get__MediaSubType)(
        IAnalogAudioComponentType* This,
        GUID *MediaSubTypeGuid);

    HRESULT (STDMETHODCALLTYPE *put__MediaSubType)(
        IAnalogAudioComponentType* This,
        REFCLSID MediaSubTypeGuid);

    HRESULT (STDMETHODCALLTYPE *get_MediaFormatType)(
        IAnalogAudioComponentType* This,
        BSTR *MediaFormatType);

    HRESULT (STDMETHODCALLTYPE *put_MediaFormatType)(
        IAnalogAudioComponentType* This,
        BSTR MediaFormatType);

    HRESULT (STDMETHODCALLTYPE *get__MediaFormatType)(
        IAnalogAudioComponentType* This,
        GUID *MediaFormatTypeGuid);

    HRESULT (STDMETHODCALLTYPE *put__MediaFormatType)(
        IAnalogAudioComponentType* This,
        REFCLSID MediaFormatTypeGuid);

    HRESULT (STDMETHODCALLTYPE *get_MediaType)(
        IAnalogAudioComponentType* This,
        AM_MEDIA_TYPE *MediaType);

    HRESULT (STDMETHODCALLTYPE *put_MediaType)(
        IAnalogAudioComponentType* This,
        AM_MEDIA_TYPE *MediaType);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IAnalogAudioComponentType* This,
        IComponentType **NewCT);

    /*** IAnalogAudioComponentType methods ***/
    HRESULT (STDMETHODCALLTYPE *get_AnalogAudioMode)(
        IAnalogAudioComponentType* This,
        TVAudioMode *Mode);

    HRESULT (STDMETHODCALLTYPE *put_AnalogAudioMode)(
        IAnalogAudioComponentType* This,
        TVAudioMode Mode);

    END_INTERFACE
} IAnalogAudioComponentTypeVtbl;
interface IAnalogAudioComponentType {
    CONST_VTBL IAnalogAudioComponentTypeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IAnalogAudioComponentType_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IAnalogAudioComponentType_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IAnalogAudioComponentType_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IAnalogAudioComponentType_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IAnalogAudioComponentType_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IAnalogAudioComponentType_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IAnalogAudioComponentType_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IComponentType methods ***/
#define IAnalogAudioComponentType_get_Category(This,Category) (This)->lpVtbl->get_Category(This,Category)
#define IAnalogAudioComponentType_put_Category(This,Category) (This)->lpVtbl->put_Category(This,Category)
#define IAnalogAudioComponentType_get_MediaMajorType(This,MediaMajorType) (This)->lpVtbl->get_MediaMajorType(This,MediaMajorType)
#define IAnalogAudioComponentType_put_MediaMajorType(This,MediaMajorType) (This)->lpVtbl->put_MediaMajorType(This,MediaMajorType)
#define IAnalogAudioComponentType_get__MediaMajorType(This,MediaMajorTypeGuid) (This)->lpVtbl->get__MediaMajorType(This,MediaMajorTypeGuid)
#define IAnalogAudioComponentType_put__MediaMajorType(This,MediaMajorTypeGuid) (This)->lpVtbl->put__MediaMajorType(This,MediaMajorTypeGuid)
#define IAnalogAudioComponentType_get_MediaSubType(This,MediaSubType) (This)->lpVtbl->get_MediaSubType(This,MediaSubType)
#define IAnalogAudioComponentType_put_MediaSubType(This,MediaSubType) (This)->lpVtbl->put_MediaSubType(This,MediaSubType)
#define IAnalogAudioComponentType_get__MediaSubType(This,MediaSubTypeGuid) (This)->lpVtbl->get__MediaSubType(This,MediaSubTypeGuid)
#define IAnalogAudioComponentType_put__MediaSubType(This,MediaSubTypeGuid) (This)->lpVtbl->put__MediaSubType(This,MediaSubTypeGuid)
#define IAnalogAudioComponentType_get_MediaFormatType(This,MediaFormatType) (This)->lpVtbl->get_MediaFormatType(This,MediaFormatType)
#define IAnalogAudioComponentType_put_MediaFormatType(This,MediaFormatType) (This)->lpVtbl->put_MediaFormatType(This,MediaFormatType)
#define IAnalogAudioComponentType_get__MediaFormatType(This,MediaFormatTypeGuid) (This)->lpVtbl->get__MediaFormatType(This,MediaFormatTypeGuid)
#define IAnalogAudioComponentType_put__MediaFormatType(This,MediaFormatTypeGuid) (This)->lpVtbl->put__MediaFormatType(This,MediaFormatTypeGuid)
#define IAnalogAudioComponentType_get_MediaType(This,MediaType) (This)->lpVtbl->get_MediaType(This,MediaType)
#define IAnalogAudioComponentType_put_MediaType(This,MediaType) (This)->lpVtbl->put_MediaType(This,MediaType)
#define IAnalogAudioComponentType_Clone(This,NewCT) (This)->lpVtbl->Clone(This,NewCT)
/*** IAnalogAudioComponentType methods ***/
#define IAnalogAudioComponentType_get_AnalogAudioMode(This,Mode) (This)->lpVtbl->get_AnalogAudioMode(This,Mode)
#define IAnalogAudioComponentType_put_AnalogAudioMode(This,Mode) (This)->lpVtbl->put_AnalogAudioMode(This,Mode)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IAnalogAudioComponentType_QueryInterface(IAnalogAudioComponentType* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IAnalogAudioComponentType_AddRef(IAnalogAudioComponentType* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IAnalogAudioComponentType_Release(IAnalogAudioComponentType* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IAnalogAudioComponentType_GetTypeInfoCount(IAnalogAudioComponentType* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IAnalogAudioComponentType_GetTypeInfo(IAnalogAudioComponentType* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IAnalogAudioComponentType_GetIDsOfNames(IAnalogAudioComponentType* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IAnalogAudioComponentType_Invoke(IAnalogAudioComponentType* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IComponentType methods ***/
static FORCEINLINE HRESULT IAnalogAudioComponentType_get_Category(IAnalogAudioComponentType* This,ComponentCategory *Category) {
    return This->lpVtbl->get_Category(This,Category);
}
static FORCEINLINE HRESULT IAnalogAudioComponentType_put_Category(IAnalogAudioComponentType* This,ComponentCategory Category) {
    return This->lpVtbl->put_Category(This,Category);
}
static FORCEINLINE HRESULT IAnalogAudioComponentType_get_MediaMajorType(IAnalogAudioComponentType* This,BSTR *MediaMajorType) {
    return This->lpVtbl->get_MediaMajorType(This,MediaMajorType);
}
static FORCEINLINE HRESULT IAnalogAudioComponentType_put_MediaMajorType(IAnalogAudioComponentType* This,BSTR MediaMajorType) {
    return This->lpVtbl->put_MediaMajorType(This,MediaMajorType);
}
static FORCEINLINE HRESULT IAnalogAudioComponentType_get__MediaMajorType(IAnalogAudioComponentType* This,GUID *MediaMajorTypeGuid) {
    return This->lpVtbl->get__MediaMajorType(This,MediaMajorTypeGuid);
}
static FORCEINLINE HRESULT IAnalogAudioComponentType_put__MediaMajorType(IAnalogAudioComponentType* This,REFCLSID MediaMajorTypeGuid) {
    return This->lpVtbl->put__MediaMajorType(This,MediaMajorTypeGuid);
}
static FORCEINLINE HRESULT IAnalogAudioComponentType_get_MediaSubType(IAnalogAudioComponentType* This,BSTR *MediaSubType) {
    return This->lpVtbl->get_MediaSubType(This,MediaSubType);
}
static FORCEINLINE HRESULT IAnalogAudioComponentType_put_MediaSubType(IAnalogAudioComponentType* This,BSTR MediaSubType) {
    return This->lpVtbl->put_MediaSubType(This,MediaSubType);
}
static FORCEINLINE HRESULT IAnalogAudioComponentType_get__MediaSubType(IAnalogAudioComponentType* This,GUID *MediaSubTypeGuid) {
    return This->lpVtbl->get__MediaSubType(This,MediaSubTypeGuid);
}
static FORCEINLINE HRESULT IAnalogAudioComponentType_put__MediaSubType(IAnalogAudioComponentType* This,REFCLSID MediaSubTypeGuid) {
    return This->lpVtbl->put__MediaSubType(This,MediaSubTypeGuid);
}
static FORCEINLINE HRESULT IAnalogAudioComponentType_get_MediaFormatType(IAnalogAudioComponentType* This,BSTR *MediaFormatType) {
    return This->lpVtbl->get_MediaFormatType(This,MediaFormatType);
}
static FORCEINLINE HRESULT IAnalogAudioComponentType_put_MediaFormatType(IAnalogAudioComponentType* This,BSTR MediaFormatType) {
    return This->lpVtbl->put_MediaFormatType(This,MediaFormatType);
}
static FORCEINLINE HRESULT IAnalogAudioComponentType_get__MediaFormatType(IAnalogAudioComponentType* This,GUID *MediaFormatTypeGuid) {
    return This->lpVtbl->get__MediaFormatType(This,MediaFormatTypeGuid);
}
static FORCEINLINE HRESULT IAnalogAudioComponentType_put__MediaFormatType(IAnalogAudioComponentType* This,REFCLSID MediaFormatTypeGuid) {
    return This->lpVtbl->put__MediaFormatType(This,MediaFormatTypeGuid);
}
static FORCEINLINE HRESULT IAnalogAudioComponentType_get_MediaType(IAnalogAudioComponentType* This,AM_MEDIA_TYPE *MediaType) {
    return This->lpVtbl->get_MediaType(This,MediaType);
}
static FORCEINLINE HRESULT IAnalogAudioComponentType_put_MediaType(IAnalogAudioComponentType* This,AM_MEDIA_TYPE *MediaType) {
    return This->lpVtbl->put_MediaType(This,MediaType);
}
static FORCEINLINE HRESULT IAnalogAudioComponentType_Clone(IAnalogAudioComponentType* This,IComponentType **NewCT) {
    return This->lpVtbl->Clone(This,NewCT);
}
/*** IAnalogAudioComponentType methods ***/
static FORCEINLINE HRESULT IAnalogAudioComponentType_get_AnalogAudioMode(IAnalogAudioComponentType* This,TVAudioMode *Mode) {
    return This->lpVtbl->get_AnalogAudioMode(This,Mode);
}
static FORCEINLINE HRESULT IAnalogAudioComponentType_put_AnalogAudioMode(IAnalogAudioComponentType* This,TVAudioMode Mode) {
    return This->lpVtbl->put_AnalogAudioMode(This,Mode);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IAnalogAudioComponentType_get_AnalogAudioMode_Proxy(
    IAnalogAudioComponentType* This,
    TVAudioMode *Mode);
void __RPC_STUB IAnalogAudioComponentType_get_AnalogAudioMode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAnalogAudioComponentType_put_AnalogAudioMode_Proxy(
    IAnalogAudioComponentType* This,
    TVAudioMode Mode);
void __RPC_STUB IAnalogAudioComponentType_put_AnalogAudioMode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IAnalogAudioComponentType_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMPEG2Component interface
 */
#ifndef __IMPEG2Component_INTERFACE_DEFINED__
#define __IMPEG2Component_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMPEG2Component, 0x1493e353, 0x1eb6, 0x473c, 0x80,0x2d, 0x8e,0x6b,0x8e,0xc9,0xd2,0xa9);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("1493e353-1eb6-473c-802d-8e6b8ec9d2a9")
IMPEG2Component : public IComponent
{
    virtual HRESULT STDMETHODCALLTYPE get_PID(
        LONG *PID) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_PID(
        LONG PID) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_PCRPID(
        LONG *PCRPID) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_PCRPID(
        LONG PCRPID) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ProgramNumber(
        LONG *ProgramNumber) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ProgramNumber(
        LONG ProgramNumber) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMPEG2Component, 0x1493e353, 0x1eb6, 0x473c, 0x80,0x2d, 0x8e,0x6b,0x8e,0xc9,0xd2,0xa9)
#endif
#else
typedef struct IMPEG2ComponentVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IMPEG2Component* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IMPEG2Component* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IMPEG2Component* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IMPEG2Component* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IComponent methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Type)(
        IMPEG2Component* This,
        IComponentType **CT);

    HRESULT (STDMETHODCALLTYPE *put_Type)(
        IMPEG2Component* This,
        IComponentType *CT);

    HRESULT (STDMETHODCALLTYPE *get_DescLangID)(
        IMPEG2Component* This,
        LONG *LangID);

    HRESULT (STDMETHODCALLTYPE *put_DescLangID)(
        IMPEG2Component* This,
        LONG LangID);

    HRESULT (STDMETHODCALLTYPE *get_Status)(
        IMPEG2Component* This,
        ComponentStatus *Status);

    HRESULT (STDMETHODCALLTYPE *put_Status)(
        IMPEG2Component* This,
        ComponentStatus Status);

    HRESULT (STDMETHODCALLTYPE *get_Description)(
        IMPEG2Component* This,
        BSTR *Description);

    HRESULT (STDMETHODCALLTYPE *put_Description)(
        IMPEG2Component* This,
        BSTR Description);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IMPEG2Component* This,
        IComponent **NewComponent);

    /*** IMPEG2Component methods ***/
    HRESULT (STDMETHODCALLTYPE *get_PID)(
        IMPEG2Component* This,
        LONG *PID);

    HRESULT (STDMETHODCALLTYPE *put_PID)(
        IMPEG2Component* This,
        LONG PID);

    HRESULT (STDMETHODCALLTYPE *get_PCRPID)(
        IMPEG2Component* This,
        LONG *PCRPID);

    HRESULT (STDMETHODCALLTYPE *put_PCRPID)(
        IMPEG2Component* This,
        LONG PCRPID);

    HRESULT (STDMETHODCALLTYPE *get_ProgramNumber)(
        IMPEG2Component* This,
        LONG *ProgramNumber);

    HRESULT (STDMETHODCALLTYPE *put_ProgramNumber)(
        IMPEG2Component* This,
        LONG ProgramNumber);

    END_INTERFACE
} IMPEG2ComponentVtbl;
interface IMPEG2Component {
    CONST_VTBL IMPEG2ComponentVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMPEG2Component_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMPEG2Component_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMPEG2Component_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IMPEG2Component_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IMPEG2Component_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IMPEG2Component_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IMPEG2Component_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IComponent methods ***/
#define IMPEG2Component_get_Type(This,CT) (This)->lpVtbl->get_Type(This,CT)
#define IMPEG2Component_put_Type(This,CT) (This)->lpVtbl->put_Type(This,CT)
#define IMPEG2Component_get_DescLangID(This,LangID) (This)->lpVtbl->get_DescLangID(This,LangID)
#define IMPEG2Component_put_DescLangID(This,LangID) (This)->lpVtbl->put_DescLangID(This,LangID)
#define IMPEG2Component_get_Status(This,Status) (This)->lpVtbl->get_Status(This,Status)
#define IMPEG2Component_put_Status(This,Status) (This)->lpVtbl->put_Status(This,Status)
#define IMPEG2Component_get_Description(This,Description) (This)->lpVtbl->get_Description(This,Description)
#define IMPEG2Component_put_Description(This,Description) (This)->lpVtbl->put_Description(This,Description)
#define IMPEG2Component_Clone(This,NewComponent) (This)->lpVtbl->Clone(This,NewComponent)
/*** IMPEG2Component methods ***/
#define IMPEG2Component_get_PID(This,PID) (This)->lpVtbl->get_PID(This,PID)
#define IMPEG2Component_put_PID(This,PID) (This)->lpVtbl->put_PID(This,PID)
#define IMPEG2Component_get_PCRPID(This,PCRPID) (This)->lpVtbl->get_PCRPID(This,PCRPID)
#define IMPEG2Component_put_PCRPID(This,PCRPID) (This)->lpVtbl->put_PCRPID(This,PCRPID)
#define IMPEG2Component_get_ProgramNumber(This,ProgramNumber) (This)->lpVtbl->get_ProgramNumber(This,ProgramNumber)
#define IMPEG2Component_put_ProgramNumber(This,ProgramNumber) (This)->lpVtbl->put_ProgramNumber(This,ProgramNumber)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IMPEG2Component_QueryInterface(IMPEG2Component* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IMPEG2Component_AddRef(IMPEG2Component* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IMPEG2Component_Release(IMPEG2Component* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IMPEG2Component_GetTypeInfoCount(IMPEG2Component* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IMPEG2Component_GetTypeInfo(IMPEG2Component* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IMPEG2Component_GetIDsOfNames(IMPEG2Component* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IMPEG2Component_Invoke(IMPEG2Component* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IComponent methods ***/
static FORCEINLINE HRESULT IMPEG2Component_get_Type(IMPEG2Component* This,IComponentType **CT) {
    return This->lpVtbl->get_Type(This,CT);
}
static FORCEINLINE HRESULT IMPEG2Component_put_Type(IMPEG2Component* This,IComponentType *CT) {
    return This->lpVtbl->put_Type(This,CT);
}
static FORCEINLINE HRESULT IMPEG2Component_get_DescLangID(IMPEG2Component* This,LONG *LangID) {
    return This->lpVtbl->get_DescLangID(This,LangID);
}
static FORCEINLINE HRESULT IMPEG2Component_put_DescLangID(IMPEG2Component* This,LONG LangID) {
    return This->lpVtbl->put_DescLangID(This,LangID);
}
static FORCEINLINE HRESULT IMPEG2Component_get_Status(IMPEG2Component* This,ComponentStatus *Status) {
    return This->lpVtbl->get_Status(This,Status);
}
static FORCEINLINE HRESULT IMPEG2Component_put_Status(IMPEG2Component* This,ComponentStatus Status) {
    return This->lpVtbl->put_Status(This,Status);
}
static FORCEINLINE HRESULT IMPEG2Component_get_Description(IMPEG2Component* This,BSTR *Description) {
    return This->lpVtbl->get_Description(This,Description);
}
static FORCEINLINE HRESULT IMPEG2Component_put_Description(IMPEG2Component* This,BSTR Description) {
    return This->lpVtbl->put_Description(This,Description);
}
static FORCEINLINE HRESULT IMPEG2Component_Clone(IMPEG2Component* This,IComponent **NewComponent) {
    return This->lpVtbl->Clone(This,NewComponent);
}
/*** IMPEG2Component methods ***/
static FORCEINLINE HRESULT IMPEG2Component_get_PID(IMPEG2Component* This,LONG *PID) {
    return This->lpVtbl->get_PID(This,PID);
}
static FORCEINLINE HRESULT IMPEG2Component_put_PID(IMPEG2Component* This,LONG PID) {
    return This->lpVtbl->put_PID(This,PID);
}
static FORCEINLINE HRESULT IMPEG2Component_get_PCRPID(IMPEG2Component* This,LONG *PCRPID) {
    return This->lpVtbl->get_PCRPID(This,PCRPID);
}
static FORCEINLINE HRESULT IMPEG2Component_put_PCRPID(IMPEG2Component* This,LONG PCRPID) {
    return This->lpVtbl->put_PCRPID(This,PCRPID);
}
static FORCEINLINE HRESULT IMPEG2Component_get_ProgramNumber(IMPEG2Component* This,LONG *ProgramNumber) {
    return This->lpVtbl->get_ProgramNumber(This,ProgramNumber);
}
static FORCEINLINE HRESULT IMPEG2Component_put_ProgramNumber(IMPEG2Component* This,LONG ProgramNumber) {
    return This->lpVtbl->put_ProgramNumber(This,ProgramNumber);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IMPEG2Component_get_PID_Proxy(
    IMPEG2Component* This,
    LONG *PID);
void __RPC_STUB IMPEG2Component_get_PID_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMPEG2Component_put_PID_Proxy(
    IMPEG2Component* This,
    LONG PID);
void __RPC_STUB IMPEG2Component_put_PID_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMPEG2Component_get_PCRPID_Proxy(
    IMPEG2Component* This,
    LONG *PCRPID);
void __RPC_STUB IMPEG2Component_get_PCRPID_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMPEG2Component_put_PCRPID_Proxy(
    IMPEG2Component* This,
    LONG PCRPID);
void __RPC_STUB IMPEG2Component_put_PCRPID_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMPEG2Component_get_ProgramNumber_Proxy(
    IMPEG2Component* This,
    LONG *ProgramNumber);
void __RPC_STUB IMPEG2Component_get_ProgramNumber_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IMPEG2Component_put_ProgramNumber_Proxy(
    IMPEG2Component* This,
    LONG ProgramNumber);
void __RPC_STUB IMPEG2Component_put_ProgramNumber_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IMPEG2Component_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IEnumComponents interface
 */
#ifndef __IEnumComponents_INTERFACE_DEFINED__
#define __IEnumComponents_INTERFACE_DEFINED__

DEFINE_GUID(IID_IEnumComponents, 0x2a6e2939, 0x2595, 0x11d3, 0xb6,0x4c, 0x00,0xc0,0x4f,0x79,0x49,0x8e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2a6e2939-2595-11d3-b64c-00c04f79498e")
IEnumComponents : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Next(
        ULONG celt,
        IComponent **rgelt,
        ULONG *pceltFetched) = 0;

    virtual HRESULT STDMETHODCALLTYPE Skip(
        ULONG celt) = 0;

    virtual HRESULT STDMETHODCALLTYPE Reset(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IEnumComponents **ppEnum) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IEnumComponents, 0x2a6e2939, 0x2595, 0x11d3, 0xb6,0x4c, 0x00,0xc0,0x4f,0x79,0x49,0x8e)
#endif
#else
typedef struct IEnumComponentsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IEnumComponents methods ***/
    HRESULT (STDMETHODCALLTYPE *Next)(
        IEnumComponents* This,
        ULONG celt,
        IComponent **rgelt,
        ULONG *pceltFetched);

    HRESULT (STDMETHODCALLTYPE *Skip)(
        IEnumComponents* This,
        ULONG celt);

    HRESULT (STDMETHODCALLTYPE *Reset)(
        IEnumComponents* This);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IEnumComponents* This,
        IEnumComponents **ppEnum);

    END_INTERFACE
} IEnumComponentsVtbl;
interface IEnumComponents {
    CONST_VTBL IEnumComponentsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IEnumComponents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IEnumComponents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IEnumComponents_Release(This) (This)->lpVtbl->Release(This)
/*** IEnumComponents methods ***/
#define IEnumComponents_Next(This,celt,rgelt,pceltFetched) (This)->lpVtbl->Next(This,celt,rgelt,pceltFetched)
#define IEnumComponents_Skip(This,celt) (This)->lpVtbl->Skip(This,celt)
#define IEnumComponents_Reset(This) (This)->lpVtbl->Reset(This)
#define IEnumComponents_Clone(This,ppEnum) (This)->lpVtbl->Clone(This,ppEnum)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IEnumComponents_QueryInterface(IEnumComponents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IEnumComponents_AddRef(IEnumComponents* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IEnumComponents_Release(IEnumComponents* This) {
    return This->lpVtbl->Release(This);
}
/*** IEnumComponents methods ***/
static FORCEINLINE HRESULT IEnumComponents_Next(IEnumComponents* This,ULONG celt,IComponent **rgelt,ULONG *pceltFetched) {
    return This->lpVtbl->Next(This,celt,rgelt,pceltFetched);
}
static FORCEINLINE HRESULT IEnumComponents_Skip(IEnumComponents* This,ULONG celt) {
    return This->lpVtbl->Skip(This,celt);
}
static FORCEINLINE HRESULT IEnumComponents_Reset(IEnumComponents* This) {
    return This->lpVtbl->Reset(This);
}
static FORCEINLINE HRESULT IEnumComponents_Clone(IEnumComponents* This,IEnumComponents **ppEnum) {
    return This->lpVtbl->Clone(This,ppEnum);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IEnumComponents_Next_Proxy(
    IEnumComponents* This,
    ULONG celt,
    IComponent **rgelt,
    ULONG *pceltFetched);
void __RPC_STUB IEnumComponents_Next_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IEnumComponents_Skip_Proxy(
    IEnumComponents* This,
    ULONG celt);
void __RPC_STUB IEnumComponents_Skip_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IEnumComponents_Reset_Proxy(
    IEnumComponents* This);
void __RPC_STUB IEnumComponents_Reset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IEnumComponents_Clone_Proxy(
    IEnumComponents* This,
    IEnumComponents **ppEnum);
void __RPC_STUB IEnumComponents_Clone_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IEnumComponents_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IComponents interface
 */
#ifndef __IComponents_INTERFACE_DEFINED__
#define __IComponents_INTERFACE_DEFINED__

DEFINE_GUID(IID_IComponents, 0x39a48091, 0xfffe, 0x4182, 0xa1,0x61, 0x3f,0xf8,0x02,0x64,0x0e,0x26);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("39a48091-fffe-4182-a161-3ff802640e26")
IComponents : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Count(
        LONG *Count) = 0;

    virtual HRESULT STDMETHODCALLTYPE get__NewEnum(
        IEnumVARIANT **ppNewEnum) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumComponents(
        IEnumComponents **ppNewEnum) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Item(
        VARIANT Index,
        IComponent **ppComponent) = 0;

    virtual HRESULT STDMETHODCALLTYPE Add(
        IComponent *Component,
        VARIANT *NewIndex) = 0;

    virtual HRESULT STDMETHODCALLTYPE Remove(
        VARIANT Index) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IComponents **NewList) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Item(
        VARIANT Index,
        IComponent *ppComponent) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IComponents, 0x39a48091, 0xfffe, 0x4182, 0xa1,0x61, 0x3f,0xf8,0x02,0x64,0x0e,0x26)
#endif
#else
typedef struct IComponentsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IComponents* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IComponents* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IComponents* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IComponents* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IComponents methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Count)(
        IComponents* This,
        LONG *Count);

    HRESULT (STDMETHODCALLTYPE *get__NewEnum)(
        IComponents* This,
        IEnumVARIANT **ppNewEnum);

    HRESULT (STDMETHODCALLTYPE *EnumComponents)(
        IComponents* This,
        IEnumComponents **ppNewEnum);

    HRESULT (STDMETHODCALLTYPE *get_Item)(
        IComponents* This,
        VARIANT Index,
        IComponent **ppComponent);

    HRESULT (STDMETHODCALLTYPE *Add)(
        IComponents* This,
        IComponent *Component,
        VARIANT *NewIndex);

    HRESULT (STDMETHODCALLTYPE *Remove)(
        IComponents* This,
        VARIANT Index);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IComponents* This,
        IComponents **NewList);

    HRESULT (STDMETHODCALLTYPE *put_Item)(
        IComponents* This,
        VARIANT Index,
        IComponent *ppComponent);

    END_INTERFACE
} IComponentsVtbl;
interface IComponents {
    CONST_VTBL IComponentsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IComponents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IComponents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IComponents_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IComponents_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IComponents_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IComponents_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IComponents_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IComponents methods ***/
#define IComponents_get_Count(This,Count) (This)->lpVtbl->get_Count(This,Count)
#define IComponents_get__NewEnum(This,ppNewEnum) (This)->lpVtbl->get__NewEnum(This,ppNewEnum)
#define IComponents_EnumComponents(This,ppNewEnum) (This)->lpVtbl->EnumComponents(This,ppNewEnum)
#define IComponents_get_Item(This,Index,ppComponent) (This)->lpVtbl->get_Item(This,Index,ppComponent)
#define IComponents_Add(This,Component,NewIndex) (This)->lpVtbl->Add(This,Component,NewIndex)
#define IComponents_Remove(This,Index) (This)->lpVtbl->Remove(This,Index)
#define IComponents_Clone(This,NewList) (This)->lpVtbl->Clone(This,NewList)
#define IComponents_put_Item(This,Index,ppComponent) (This)->lpVtbl->put_Item(This,Index,ppComponent)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IComponents_QueryInterface(IComponents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IComponents_AddRef(IComponents* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IComponents_Release(IComponents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IComponents_GetTypeInfoCount(IComponents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IComponents_GetTypeInfo(IComponents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IComponents_GetIDsOfNames(IComponents* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IComponents_Invoke(IComponents* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IComponents methods ***/
static FORCEINLINE HRESULT IComponents_get_Count(IComponents* This,LONG *Count) {
    return This->lpVtbl->get_Count(This,Count);
}
static FORCEINLINE HRESULT IComponents_get__NewEnum(IComponents* This,IEnumVARIANT **ppNewEnum) {
    return This->lpVtbl->get__NewEnum(This,ppNewEnum);
}
static FORCEINLINE HRESULT IComponents_EnumComponents(IComponents* This,IEnumComponents **ppNewEnum) {
    return This->lpVtbl->EnumComponents(This,ppNewEnum);
}
static FORCEINLINE HRESULT IComponents_get_Item(IComponents* This,VARIANT Index,IComponent **ppComponent) {
    return This->lpVtbl->get_Item(This,Index,ppComponent);
}
static FORCEINLINE HRESULT IComponents_Add(IComponents* This,IComponent *Component,VARIANT *NewIndex) {
    return This->lpVtbl->Add(This,Component,NewIndex);
}
static FORCEINLINE HRESULT IComponents_Remove(IComponents* This,VARIANT Index) {
    return This->lpVtbl->Remove(This,Index);
}
static FORCEINLINE HRESULT IComponents_Clone(IComponents* This,IComponents **NewList) {
    return This->lpVtbl->Clone(This,NewList);
}
static FORCEINLINE HRESULT IComponents_put_Item(IComponents* This,VARIANT Index,IComponent *ppComponent) {
    return This->lpVtbl->put_Item(This,Index,ppComponent);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IComponents_get_Count_Proxy(
    IComponents* This,
    LONG *Count);
void __RPC_STUB IComponents_get_Count_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IComponents_get__NewEnum_Proxy(
    IComponents* This,
    IEnumVARIANT **ppNewEnum);
void __RPC_STUB IComponents_get__NewEnum_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IComponents_EnumComponents_Proxy(
    IComponents* This,
    IEnumComponents **ppNewEnum);
void __RPC_STUB IComponents_EnumComponents_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IComponents_get_Item_Proxy(
    IComponents* This,
    VARIANT Index,
    IComponent **ppComponent);
void __RPC_STUB IComponents_get_Item_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IComponents_Add_Proxy(
    IComponents* This,
    IComponent *Component,
    VARIANT *NewIndex);
void __RPC_STUB IComponents_Add_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IComponents_Remove_Proxy(
    IComponents* This,
    VARIANT Index);
void __RPC_STUB IComponents_Remove_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IComponents_Clone_Proxy(
    IComponents* This,
    IComponents **NewList);
void __RPC_STUB IComponents_Clone_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IComponents_put_Item_Proxy(
    IComponents* This,
    VARIANT Index,
    IComponent *ppComponent);
void __RPC_STUB IComponents_put_Item_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IComponents_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IComponentsOld interface
 */
#ifndef __IComponentsOld_INTERFACE_DEFINED__
#define __IComponentsOld_INTERFACE_DEFINED__

DEFINE_GUID(IID_IComponentsOld, 0xfcd01846, 0x0e19, 0x11d3, 0x9d,0x8e, 0x00,0xc0,0x4f,0x72,0xd9,0x80);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("fcd01846-0e19-11d3-9d8e-00c04f72d980")
IComponentsOld : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Count(
        LONG *Count) = 0;

    virtual HRESULT STDMETHODCALLTYPE get__NewEnum(
        IEnumVARIANT **ppNewEnum) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnumComponents(
        IEnumComponents **ppNewEnum) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Item(
        VARIANT Index,
        IComponent **ppComponent) = 0;

    virtual HRESULT STDMETHODCALLTYPE Add(
        IComponent *Component,
        VARIANT *NewIndex) = 0;

    virtual HRESULT STDMETHODCALLTYPE Remove(
        VARIANT Index) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IComponents **NewList) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IComponentsOld, 0xfcd01846, 0x0e19, 0x11d3, 0x9d,0x8e, 0x00,0xc0,0x4f,0x72,0xd9,0x80)
#endif
#else
typedef struct IComponentsOldVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IComponentsOld* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IComponentsOld* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IComponentsOld* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IComponentsOld* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IComponentsOld methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Count)(
        IComponentsOld* This,
        LONG *Count);

    HRESULT (STDMETHODCALLTYPE *get__NewEnum)(
        IComponentsOld* This,
        IEnumVARIANT **ppNewEnum);

    HRESULT (STDMETHODCALLTYPE *EnumComponents)(
        IComponentsOld* This,
        IEnumComponents **ppNewEnum);

    HRESULT (STDMETHODCALLTYPE *get_Item)(
        IComponentsOld* This,
        VARIANT Index,
        IComponent **ppComponent);

    HRESULT (STDMETHODCALLTYPE *Add)(
        IComponentsOld* This,
        IComponent *Component,
        VARIANT *NewIndex);

    HRESULT (STDMETHODCALLTYPE *Remove)(
        IComponentsOld* This,
        VARIANT Index);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IComponentsOld* This,
        IComponents **NewList);

    END_INTERFACE
} IComponentsOldVtbl;
interface IComponentsOld {
    CONST_VTBL IComponentsOldVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IComponentsOld_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IComponentsOld_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IComponentsOld_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IComponentsOld_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IComponentsOld_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IComponentsOld_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IComponentsOld_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IComponentsOld methods ***/
#define IComponentsOld_get_Count(This,Count) (This)->lpVtbl->get_Count(This,Count)
#define IComponentsOld_get__NewEnum(This,ppNewEnum) (This)->lpVtbl->get__NewEnum(This,ppNewEnum)
#define IComponentsOld_EnumComponents(This,ppNewEnum) (This)->lpVtbl->EnumComponents(This,ppNewEnum)
#define IComponentsOld_get_Item(This,Index,ppComponent) (This)->lpVtbl->get_Item(This,Index,ppComponent)
#define IComponentsOld_Add(This,Component,NewIndex) (This)->lpVtbl->Add(This,Component,NewIndex)
#define IComponentsOld_Remove(This,Index) (This)->lpVtbl->Remove(This,Index)
#define IComponentsOld_Clone(This,NewList) (This)->lpVtbl->Clone(This,NewList)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IComponentsOld_QueryInterface(IComponentsOld* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IComponentsOld_AddRef(IComponentsOld* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IComponentsOld_Release(IComponentsOld* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IComponentsOld_GetTypeInfoCount(IComponentsOld* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IComponentsOld_GetTypeInfo(IComponentsOld* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IComponentsOld_GetIDsOfNames(IComponentsOld* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IComponentsOld_Invoke(IComponentsOld* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IComponentsOld methods ***/
static FORCEINLINE HRESULT IComponentsOld_get_Count(IComponentsOld* This,LONG *Count) {
    return This->lpVtbl->get_Count(This,Count);
}
static FORCEINLINE HRESULT IComponentsOld_get__NewEnum(IComponentsOld* This,IEnumVARIANT **ppNewEnum) {
    return This->lpVtbl->get__NewEnum(This,ppNewEnum);
}
static FORCEINLINE HRESULT IComponentsOld_EnumComponents(IComponentsOld* This,IEnumComponents **ppNewEnum) {
    return This->lpVtbl->EnumComponents(This,ppNewEnum);
}
static FORCEINLINE HRESULT IComponentsOld_get_Item(IComponentsOld* This,VARIANT Index,IComponent **ppComponent) {
    return This->lpVtbl->get_Item(This,Index,ppComponent);
}
static FORCEINLINE HRESULT IComponentsOld_Add(IComponentsOld* This,IComponent *Component,VARIANT *NewIndex) {
    return This->lpVtbl->Add(This,Component,NewIndex);
}
static FORCEINLINE HRESULT IComponentsOld_Remove(IComponentsOld* This,VARIANT Index) {
    return This->lpVtbl->Remove(This,Index);
}
static FORCEINLINE HRESULT IComponentsOld_Clone(IComponentsOld* This,IComponents **NewList) {
    return This->lpVtbl->Clone(This,NewList);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IComponentsOld_get_Count_Proxy(
    IComponentsOld* This,
    LONG *Count);
void __RPC_STUB IComponentsOld_get_Count_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IComponentsOld_get__NewEnum_Proxy(
    IComponentsOld* This,
    IEnumVARIANT **ppNewEnum);
void __RPC_STUB IComponentsOld_get__NewEnum_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IComponentsOld_EnumComponents_Proxy(
    IComponentsOld* This,
    IEnumComponents **ppNewEnum);
void __RPC_STUB IComponentsOld_EnumComponents_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IComponentsOld_get_Item_Proxy(
    IComponentsOld* This,
    VARIANT Index,
    IComponent **ppComponent);
void __RPC_STUB IComponentsOld_get_Item_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IComponentsOld_Add_Proxy(
    IComponentsOld* This,
    IComponent *Component,
    VARIANT *NewIndex);
void __RPC_STUB IComponentsOld_Add_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IComponentsOld_Remove_Proxy(
    IComponentsOld* This,
    VARIANT Index);
void __RPC_STUB IComponentsOld_Remove_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IComponentsOld_Clone_Proxy(
    IComponentsOld* This,
    IComponents **NewList);
void __RPC_STUB IComponentsOld_Clone_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IComponentsOld_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ILocator interface
 */
#ifndef __ILocator_INTERFACE_DEFINED__
#define __ILocator_INTERFACE_DEFINED__

DEFINE_GUID(IID_ILocator, 0x286d7f89, 0x760c, 0x4f89, 0x80,0xc4, 0x66,0x84,0x1d,0x25,0x07,0xaa);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("286d7f89-760c-4f89-80c4-66841d2507aa")
ILocator : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_CarrierFrequency(
        LONG *Frequency) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_CarrierFrequency(
        LONG Frequency) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_InnerFEC(
        FECMethod *FEC) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_InnerFEC(
        FECMethod FEC) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_InnerFECRate(
        BinaryConvolutionCodeRate *FEC) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_InnerFECRate(
        BinaryConvolutionCodeRate FEC) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_OuterFEC(
        FECMethod *FEC) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_OuterFEC(
        FECMethod FEC) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_OuterFECRate(
        BinaryConvolutionCodeRate *FEC) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_OuterFECRate(
        BinaryConvolutionCodeRate FEC) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Modulation(
        ModulationType *Modulation) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Modulation(
        ModulationType Modulation) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_SymbolRate(
        LONG *Rate) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_SymbolRate(
        LONG Rate) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        ILocator **NewLocator) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ILocator, 0x286d7f89, 0x760c, 0x4f89, 0x80,0xc4, 0x66,0x84,0x1d,0x25,0x07,0xaa)
#endif
#else
typedef struct ILocatorVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ILocator* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ILocator* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ILocator* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ILocator* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ILocator methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CarrierFrequency)(
        ILocator* This,
        LONG *Frequency);

    HRESULT (STDMETHODCALLTYPE *put_CarrierFrequency)(
        ILocator* This,
        LONG Frequency);

    HRESULT (STDMETHODCALLTYPE *get_InnerFEC)(
        ILocator* This,
        FECMethod *FEC);

    HRESULT (STDMETHODCALLTYPE *put_InnerFEC)(
        ILocator* This,
        FECMethod FEC);

    HRESULT (STDMETHODCALLTYPE *get_InnerFECRate)(
        ILocator* This,
        BinaryConvolutionCodeRate *FEC);

    HRESULT (STDMETHODCALLTYPE *put_InnerFECRate)(
        ILocator* This,
        BinaryConvolutionCodeRate FEC);

    HRESULT (STDMETHODCALLTYPE *get_OuterFEC)(
        ILocator* This,
        FECMethod *FEC);

    HRESULT (STDMETHODCALLTYPE *put_OuterFEC)(
        ILocator* This,
        FECMethod FEC);

    HRESULT (STDMETHODCALLTYPE *get_OuterFECRate)(
        ILocator* This,
        BinaryConvolutionCodeRate *FEC);

    HRESULT (STDMETHODCALLTYPE *put_OuterFECRate)(
        ILocator* This,
        BinaryConvolutionCodeRate FEC);

    HRESULT (STDMETHODCALLTYPE *get_Modulation)(
        ILocator* This,
        ModulationType *Modulation);

    HRESULT (STDMETHODCALLTYPE *put_Modulation)(
        ILocator* This,
        ModulationType Modulation);

    HRESULT (STDMETHODCALLTYPE *get_SymbolRate)(
        ILocator* This,
        LONG *Rate);

    HRESULT (STDMETHODCALLTYPE *put_SymbolRate)(
        ILocator* This,
        LONG Rate);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        ILocator* This,
        ILocator **NewLocator);

    END_INTERFACE
} ILocatorVtbl;
interface ILocator {
    CONST_VTBL ILocatorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ILocator_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ILocator_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ILocator_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ILocator_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ILocator_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ILocator_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ILocator_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ILocator methods ***/
#define ILocator_get_CarrierFrequency(This,Frequency) (This)->lpVtbl->get_CarrierFrequency(This,Frequency)
#define ILocator_put_CarrierFrequency(This,Frequency) (This)->lpVtbl->put_CarrierFrequency(This,Frequency)
#define ILocator_get_InnerFEC(This,FEC) (This)->lpVtbl->get_InnerFEC(This,FEC)
#define ILocator_put_InnerFEC(This,FEC) (This)->lpVtbl->put_InnerFEC(This,FEC)
#define ILocator_get_InnerFECRate(This,FEC) (This)->lpVtbl->get_InnerFECRate(This,FEC)
#define ILocator_put_InnerFECRate(This,FEC) (This)->lpVtbl->put_InnerFECRate(This,FEC)
#define ILocator_get_OuterFEC(This,FEC) (This)->lpVtbl->get_OuterFEC(This,FEC)
#define ILocator_put_OuterFEC(This,FEC) (This)->lpVtbl->put_OuterFEC(This,FEC)
#define ILocator_get_OuterFECRate(This,FEC) (This)->lpVtbl->get_OuterFECRate(This,FEC)
#define ILocator_put_OuterFECRate(This,FEC) (This)->lpVtbl->put_OuterFECRate(This,FEC)
#define ILocator_get_Modulation(This,Modulation) (This)->lpVtbl->get_Modulation(This,Modulation)
#define ILocator_put_Modulation(This,Modulation) (This)->lpVtbl->put_Modulation(This,Modulation)
#define ILocator_get_SymbolRate(This,Rate) (This)->lpVtbl->get_SymbolRate(This,Rate)
#define ILocator_put_SymbolRate(This,Rate) (This)->lpVtbl->put_SymbolRate(This,Rate)
#define ILocator_Clone(This,NewLocator) (This)->lpVtbl->Clone(This,NewLocator)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ILocator_QueryInterface(ILocator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ILocator_AddRef(ILocator* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ILocator_Release(ILocator* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ILocator_GetTypeInfoCount(ILocator* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ILocator_GetTypeInfo(ILocator* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ILocator_GetIDsOfNames(ILocator* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ILocator_Invoke(ILocator* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ILocator methods ***/
static FORCEINLINE HRESULT ILocator_get_CarrierFrequency(ILocator* This,LONG *Frequency) {
    return This->lpVtbl->get_CarrierFrequency(This,Frequency);
}
static FORCEINLINE HRESULT ILocator_put_CarrierFrequency(ILocator* This,LONG Frequency) {
    return This->lpVtbl->put_CarrierFrequency(This,Frequency);
}
static FORCEINLINE HRESULT ILocator_get_InnerFEC(ILocator* This,FECMethod *FEC) {
    return This->lpVtbl->get_InnerFEC(This,FEC);
}
static FORCEINLINE HRESULT ILocator_put_InnerFEC(ILocator* This,FECMethod FEC) {
    return This->lpVtbl->put_InnerFEC(This,FEC);
}
static FORCEINLINE HRESULT ILocator_get_InnerFECRate(ILocator* This,BinaryConvolutionCodeRate *FEC) {
    return This->lpVtbl->get_InnerFECRate(This,FEC);
}
static FORCEINLINE HRESULT ILocator_put_InnerFECRate(ILocator* This,BinaryConvolutionCodeRate FEC) {
    return This->lpVtbl->put_InnerFECRate(This,FEC);
}
static FORCEINLINE HRESULT ILocator_get_OuterFEC(ILocator* This,FECMethod *FEC) {
    return This->lpVtbl->get_OuterFEC(This,FEC);
}
static FORCEINLINE HRESULT ILocator_put_OuterFEC(ILocator* This,FECMethod FEC) {
    return This->lpVtbl->put_OuterFEC(This,FEC);
}
static FORCEINLINE HRESULT ILocator_get_OuterFECRate(ILocator* This,BinaryConvolutionCodeRate *FEC) {
    return This->lpVtbl->get_OuterFECRate(This,FEC);
}
static FORCEINLINE HRESULT ILocator_put_OuterFECRate(ILocator* This,BinaryConvolutionCodeRate FEC) {
    return This->lpVtbl->put_OuterFECRate(This,FEC);
}
static FORCEINLINE HRESULT ILocator_get_Modulation(ILocator* This,ModulationType *Modulation) {
    return This->lpVtbl->get_Modulation(This,Modulation);
}
static FORCEINLINE HRESULT ILocator_put_Modulation(ILocator* This,ModulationType Modulation) {
    return This->lpVtbl->put_Modulation(This,Modulation);
}
static FORCEINLINE HRESULT ILocator_get_SymbolRate(ILocator* This,LONG *Rate) {
    return This->lpVtbl->get_SymbolRate(This,Rate);
}
static FORCEINLINE HRESULT ILocator_put_SymbolRate(ILocator* This,LONG Rate) {
    return This->lpVtbl->put_SymbolRate(This,Rate);
}
static FORCEINLINE HRESULT ILocator_Clone(ILocator* This,ILocator **NewLocator) {
    return This->lpVtbl->Clone(This,NewLocator);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ILocator_get_CarrierFrequency_Proxy(
    ILocator* This,
    LONG *Frequency);
void __RPC_STUB ILocator_get_CarrierFrequency_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ILocator_put_CarrierFrequency_Proxy(
    ILocator* This,
    LONG Frequency);
void __RPC_STUB ILocator_put_CarrierFrequency_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ILocator_get_InnerFEC_Proxy(
    ILocator* This,
    FECMethod *FEC);
void __RPC_STUB ILocator_get_InnerFEC_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ILocator_put_InnerFEC_Proxy(
    ILocator* This,
    FECMethod FEC);
void __RPC_STUB ILocator_put_InnerFEC_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ILocator_get_InnerFECRate_Proxy(
    ILocator* This,
    BinaryConvolutionCodeRate *FEC);
void __RPC_STUB ILocator_get_InnerFECRate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ILocator_put_InnerFECRate_Proxy(
    ILocator* This,
    BinaryConvolutionCodeRate FEC);
void __RPC_STUB ILocator_put_InnerFECRate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ILocator_get_OuterFEC_Proxy(
    ILocator* This,
    FECMethod *FEC);
void __RPC_STUB ILocator_get_OuterFEC_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ILocator_put_OuterFEC_Proxy(
    ILocator* This,
    FECMethod FEC);
void __RPC_STUB ILocator_put_OuterFEC_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ILocator_get_OuterFECRate_Proxy(
    ILocator* This,
    BinaryConvolutionCodeRate *FEC);
void __RPC_STUB ILocator_get_OuterFECRate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ILocator_put_OuterFECRate_Proxy(
    ILocator* This,
    BinaryConvolutionCodeRate FEC);
void __RPC_STUB ILocator_put_OuterFECRate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ILocator_get_Modulation_Proxy(
    ILocator* This,
    ModulationType *Modulation);
void __RPC_STUB ILocator_get_Modulation_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ILocator_put_Modulation_Proxy(
    ILocator* This,
    ModulationType Modulation);
void __RPC_STUB ILocator_put_Modulation_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ILocator_get_SymbolRate_Proxy(
    ILocator* This,
    LONG *Rate);
void __RPC_STUB ILocator_get_SymbolRate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ILocator_put_SymbolRate_Proxy(
    ILocator* This,
    LONG Rate);
void __RPC_STUB ILocator_put_SymbolRate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ILocator_Clone_Proxy(
    ILocator* This,
    ILocator **NewLocator);
void __RPC_STUB ILocator_Clone_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ILocator_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAnalogLocator interface
 */
#ifndef __IAnalogLocator_INTERFACE_DEFINED__
#define __IAnalogLocator_INTERFACE_DEFINED__

DEFINE_GUID(IID_IAnalogLocator, 0x34d1f26b, 0xe339, 0x430d, 0xab,0xce, 0x73,0x8c,0xb4,0x89,0x84,0xdc);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("34d1f26b-e339-430d-abce-738cb48984dc")
IAnalogLocator : public ILocator
{
    virtual HRESULT STDMETHODCALLTYPE get_VideoStandard(
        AnalogVideoStandard *AVS) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_VideoStandard(
        AnalogVideoStandard AVS) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IAnalogLocator, 0x34d1f26b, 0xe339, 0x430d, 0xab,0xce, 0x73,0x8c,0xb4,0x89,0x84,0xdc)
#endif
#else
typedef struct IAnalogLocatorVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IAnalogLocator* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IAnalogLocator* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IAnalogLocator* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IAnalogLocator* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ILocator methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CarrierFrequency)(
        IAnalogLocator* This,
        LONG *Frequency);

    HRESULT (STDMETHODCALLTYPE *put_CarrierFrequency)(
        IAnalogLocator* This,
        LONG Frequency);

    HRESULT (STDMETHODCALLTYPE *get_InnerFEC)(
        IAnalogLocator* This,
        FECMethod *FEC);

    HRESULT (STDMETHODCALLTYPE *put_InnerFEC)(
        IAnalogLocator* This,
        FECMethod FEC);

    HRESULT (STDMETHODCALLTYPE *get_InnerFECRate)(
        IAnalogLocator* This,
        BinaryConvolutionCodeRate *FEC);

    HRESULT (STDMETHODCALLTYPE *put_InnerFECRate)(
        IAnalogLocator* This,
        BinaryConvolutionCodeRate FEC);

    HRESULT (STDMETHODCALLTYPE *get_OuterFEC)(
        IAnalogLocator* This,
        FECMethod *FEC);

    HRESULT (STDMETHODCALLTYPE *put_OuterFEC)(
        IAnalogLocator* This,
        FECMethod FEC);

    HRESULT (STDMETHODCALLTYPE *get_OuterFECRate)(
        IAnalogLocator* This,
        BinaryConvolutionCodeRate *FEC);

    HRESULT (STDMETHODCALLTYPE *put_OuterFECRate)(
        IAnalogLocator* This,
        BinaryConvolutionCodeRate FEC);

    HRESULT (STDMETHODCALLTYPE *get_Modulation)(
        IAnalogLocator* This,
        ModulationType *Modulation);

    HRESULT (STDMETHODCALLTYPE *put_Modulation)(
        IAnalogLocator* This,
        ModulationType Modulation);

    HRESULT (STDMETHODCALLTYPE *get_SymbolRate)(
        IAnalogLocator* This,
        LONG *Rate);

    HRESULT (STDMETHODCALLTYPE *put_SymbolRate)(
        IAnalogLocator* This,
        LONG Rate);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IAnalogLocator* This,
        ILocator **NewLocator);

    /*** IAnalogLocator methods ***/
    HRESULT (STDMETHODCALLTYPE *get_VideoStandard)(
        IAnalogLocator* This,
        AnalogVideoStandard *AVS);

    HRESULT (STDMETHODCALLTYPE *put_VideoStandard)(
        IAnalogLocator* This,
        AnalogVideoStandard AVS);

    END_INTERFACE
} IAnalogLocatorVtbl;
interface IAnalogLocator {
    CONST_VTBL IAnalogLocatorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IAnalogLocator_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IAnalogLocator_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IAnalogLocator_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IAnalogLocator_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IAnalogLocator_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IAnalogLocator_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IAnalogLocator_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ILocator methods ***/
#define IAnalogLocator_get_CarrierFrequency(This,Frequency) (This)->lpVtbl->get_CarrierFrequency(This,Frequency)
#define IAnalogLocator_put_CarrierFrequency(This,Frequency) (This)->lpVtbl->put_CarrierFrequency(This,Frequency)
#define IAnalogLocator_get_InnerFEC(This,FEC) (This)->lpVtbl->get_InnerFEC(This,FEC)
#define IAnalogLocator_put_InnerFEC(This,FEC) (This)->lpVtbl->put_InnerFEC(This,FEC)
#define IAnalogLocator_get_InnerFECRate(This,FEC) (This)->lpVtbl->get_InnerFECRate(This,FEC)
#define IAnalogLocator_put_InnerFECRate(This,FEC) (This)->lpVtbl->put_InnerFECRate(This,FEC)
#define IAnalogLocator_get_OuterFEC(This,FEC) (This)->lpVtbl->get_OuterFEC(This,FEC)
#define IAnalogLocator_put_OuterFEC(This,FEC) (This)->lpVtbl->put_OuterFEC(This,FEC)
#define IAnalogLocator_get_OuterFECRate(This,FEC) (This)->lpVtbl->get_OuterFECRate(This,FEC)
#define IAnalogLocator_put_OuterFECRate(This,FEC) (This)->lpVtbl->put_OuterFECRate(This,FEC)
#define IAnalogLocator_get_Modulation(This,Modulation) (This)->lpVtbl->get_Modulation(This,Modulation)
#define IAnalogLocator_put_Modulation(This,Modulation) (This)->lpVtbl->put_Modulation(This,Modulation)
#define IAnalogLocator_get_SymbolRate(This,Rate) (This)->lpVtbl->get_SymbolRate(This,Rate)
#define IAnalogLocator_put_SymbolRate(This,Rate) (This)->lpVtbl->put_SymbolRate(This,Rate)
#define IAnalogLocator_Clone(This,NewLocator) (This)->lpVtbl->Clone(This,NewLocator)
/*** IAnalogLocator methods ***/
#define IAnalogLocator_get_VideoStandard(This,AVS) (This)->lpVtbl->get_VideoStandard(This,AVS)
#define IAnalogLocator_put_VideoStandard(This,AVS) (This)->lpVtbl->put_VideoStandard(This,AVS)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IAnalogLocator_QueryInterface(IAnalogLocator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IAnalogLocator_AddRef(IAnalogLocator* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IAnalogLocator_Release(IAnalogLocator* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IAnalogLocator_GetTypeInfoCount(IAnalogLocator* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IAnalogLocator_GetTypeInfo(IAnalogLocator* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IAnalogLocator_GetIDsOfNames(IAnalogLocator* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IAnalogLocator_Invoke(IAnalogLocator* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ILocator methods ***/
static FORCEINLINE HRESULT IAnalogLocator_get_CarrierFrequency(IAnalogLocator* This,LONG *Frequency) {
    return This->lpVtbl->get_CarrierFrequency(This,Frequency);
}
static FORCEINLINE HRESULT IAnalogLocator_put_CarrierFrequency(IAnalogLocator* This,LONG Frequency) {
    return This->lpVtbl->put_CarrierFrequency(This,Frequency);
}
static FORCEINLINE HRESULT IAnalogLocator_get_InnerFEC(IAnalogLocator* This,FECMethod *FEC) {
    return This->lpVtbl->get_InnerFEC(This,FEC);
}
static FORCEINLINE HRESULT IAnalogLocator_put_InnerFEC(IAnalogLocator* This,FECMethod FEC) {
    return This->lpVtbl->put_InnerFEC(This,FEC);
}
static FORCEINLINE HRESULT IAnalogLocator_get_InnerFECRate(IAnalogLocator* This,BinaryConvolutionCodeRate *FEC) {
    return This->lpVtbl->get_InnerFECRate(This,FEC);
}
static FORCEINLINE HRESULT IAnalogLocator_put_InnerFECRate(IAnalogLocator* This,BinaryConvolutionCodeRate FEC) {
    return This->lpVtbl->put_InnerFECRate(This,FEC);
}
static FORCEINLINE HRESULT IAnalogLocator_get_OuterFEC(IAnalogLocator* This,FECMethod *FEC) {
    return This->lpVtbl->get_OuterFEC(This,FEC);
}
static FORCEINLINE HRESULT IAnalogLocator_put_OuterFEC(IAnalogLocator* This,FECMethod FEC) {
    return This->lpVtbl->put_OuterFEC(This,FEC);
}
static FORCEINLINE HRESULT IAnalogLocator_get_OuterFECRate(IAnalogLocator* This,BinaryConvolutionCodeRate *FEC) {
    return This->lpVtbl->get_OuterFECRate(This,FEC);
}
static FORCEINLINE HRESULT IAnalogLocator_put_OuterFECRate(IAnalogLocator* This,BinaryConvolutionCodeRate FEC) {
    return This->lpVtbl->put_OuterFECRate(This,FEC);
}
static FORCEINLINE HRESULT IAnalogLocator_get_Modulation(IAnalogLocator* This,ModulationType *Modulation) {
    return This->lpVtbl->get_Modulation(This,Modulation);
}
static FORCEINLINE HRESULT IAnalogLocator_put_Modulation(IAnalogLocator* This,ModulationType Modulation) {
    return This->lpVtbl->put_Modulation(This,Modulation);
}
static FORCEINLINE HRESULT IAnalogLocator_get_SymbolRate(IAnalogLocator* This,LONG *Rate) {
    return This->lpVtbl->get_SymbolRate(This,Rate);
}
static FORCEINLINE HRESULT IAnalogLocator_put_SymbolRate(IAnalogLocator* This,LONG Rate) {
    return This->lpVtbl->put_SymbolRate(This,Rate);
}
static FORCEINLINE HRESULT IAnalogLocator_Clone(IAnalogLocator* This,ILocator **NewLocator) {
    return This->lpVtbl->Clone(This,NewLocator);
}
/*** IAnalogLocator methods ***/
static FORCEINLINE HRESULT IAnalogLocator_get_VideoStandard(IAnalogLocator* This,AnalogVideoStandard *AVS) {
    return This->lpVtbl->get_VideoStandard(This,AVS);
}
static FORCEINLINE HRESULT IAnalogLocator_put_VideoStandard(IAnalogLocator* This,AnalogVideoStandard AVS) {
    return This->lpVtbl->put_VideoStandard(This,AVS);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IAnalogLocator_get_VideoStandard_Proxy(
    IAnalogLocator* This,
    AnalogVideoStandard *AVS);
void __RPC_STUB IAnalogLocator_get_VideoStandard_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IAnalogLocator_put_VideoStandard_Proxy(
    IAnalogLocator* This,
    AnalogVideoStandard AVS);
void __RPC_STUB IAnalogLocator_put_VideoStandard_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IAnalogLocator_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDigitalLocator interface
 */
#ifndef __IDigitalLocator_INTERFACE_DEFINED__
#define __IDigitalLocator_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDigitalLocator, 0x19b595d8, 0x839a, 0x47f0, 0x96,0xdf, 0x4f,0x19,0x4f,0x3c,0x76,0x8c);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("19b595d8-839a-47f0-96df-4f194f3c768c")
IDigitalLocator : public ILocator
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDigitalLocator, 0x19b595d8, 0x839a, 0x47f0, 0x96,0xdf, 0x4f,0x19,0x4f,0x3c,0x76,0x8c)
#endif
#else
typedef struct IDigitalLocatorVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IDigitalLocator* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IDigitalLocator* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IDigitalLocator* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IDigitalLocator* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ILocator methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CarrierFrequency)(
        IDigitalLocator* This,
        LONG *Frequency);

    HRESULT (STDMETHODCALLTYPE *put_CarrierFrequency)(
        IDigitalLocator* This,
        LONG Frequency);

    HRESULT (STDMETHODCALLTYPE *get_InnerFEC)(
        IDigitalLocator* This,
        FECMethod *FEC);

    HRESULT (STDMETHODCALLTYPE *put_InnerFEC)(
        IDigitalLocator* This,
        FECMethod FEC);

    HRESULT (STDMETHODCALLTYPE *get_InnerFECRate)(
        IDigitalLocator* This,
        BinaryConvolutionCodeRate *FEC);

    HRESULT (STDMETHODCALLTYPE *put_InnerFECRate)(
        IDigitalLocator* This,
        BinaryConvolutionCodeRate FEC);

    HRESULT (STDMETHODCALLTYPE *get_OuterFEC)(
        IDigitalLocator* This,
        FECMethod *FEC);

    HRESULT (STDMETHODCALLTYPE *put_OuterFEC)(
        IDigitalLocator* This,
        FECMethod FEC);

    HRESULT (STDMETHODCALLTYPE *get_OuterFECRate)(
        IDigitalLocator* This,
        BinaryConvolutionCodeRate *FEC);

    HRESULT (STDMETHODCALLTYPE *put_OuterFECRate)(
        IDigitalLocator* This,
        BinaryConvolutionCodeRate FEC);

    HRESULT (STDMETHODCALLTYPE *get_Modulation)(
        IDigitalLocator* This,
        ModulationType *Modulation);

    HRESULT (STDMETHODCALLTYPE *put_Modulation)(
        IDigitalLocator* This,
        ModulationType Modulation);

    HRESULT (STDMETHODCALLTYPE *get_SymbolRate)(
        IDigitalLocator* This,
        LONG *Rate);

    HRESULT (STDMETHODCALLTYPE *put_SymbolRate)(
        IDigitalLocator* This,
        LONG Rate);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IDigitalLocator* This,
        ILocator **NewLocator);

    END_INTERFACE
} IDigitalLocatorVtbl;
interface IDigitalLocator {
    CONST_VTBL IDigitalLocatorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDigitalLocator_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDigitalLocator_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDigitalLocator_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IDigitalLocator_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IDigitalLocator_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IDigitalLocator_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IDigitalLocator_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ILocator methods ***/
#define IDigitalLocator_get_CarrierFrequency(This,Frequency) (This)->lpVtbl->get_CarrierFrequency(This,Frequency)
#define IDigitalLocator_put_CarrierFrequency(This,Frequency) (This)->lpVtbl->put_CarrierFrequency(This,Frequency)
#define IDigitalLocator_get_InnerFEC(This,FEC) (This)->lpVtbl->get_InnerFEC(This,FEC)
#define IDigitalLocator_put_InnerFEC(This,FEC) (This)->lpVtbl->put_InnerFEC(This,FEC)
#define IDigitalLocator_get_InnerFECRate(This,FEC) (This)->lpVtbl->get_InnerFECRate(This,FEC)
#define IDigitalLocator_put_InnerFECRate(This,FEC) (This)->lpVtbl->put_InnerFECRate(This,FEC)
#define IDigitalLocator_get_OuterFEC(This,FEC) (This)->lpVtbl->get_OuterFEC(This,FEC)
#define IDigitalLocator_put_OuterFEC(This,FEC) (This)->lpVtbl->put_OuterFEC(This,FEC)
#define IDigitalLocator_get_OuterFECRate(This,FEC) (This)->lpVtbl->get_OuterFECRate(This,FEC)
#define IDigitalLocator_put_OuterFECRate(This,FEC) (This)->lpVtbl->put_OuterFECRate(This,FEC)
#define IDigitalLocator_get_Modulation(This,Modulation) (This)->lpVtbl->get_Modulation(This,Modulation)
#define IDigitalLocator_put_Modulation(This,Modulation) (This)->lpVtbl->put_Modulation(This,Modulation)
#define IDigitalLocator_get_SymbolRate(This,Rate) (This)->lpVtbl->get_SymbolRate(This,Rate)
#define IDigitalLocator_put_SymbolRate(This,Rate) (This)->lpVtbl->put_SymbolRate(This,Rate)
#define IDigitalLocator_Clone(This,NewLocator) (This)->lpVtbl->Clone(This,NewLocator)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDigitalLocator_QueryInterface(IDigitalLocator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDigitalLocator_AddRef(IDigitalLocator* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDigitalLocator_Release(IDigitalLocator* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IDigitalLocator_GetTypeInfoCount(IDigitalLocator* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IDigitalLocator_GetTypeInfo(IDigitalLocator* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IDigitalLocator_GetIDsOfNames(IDigitalLocator* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IDigitalLocator_Invoke(IDigitalLocator* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ILocator methods ***/
static FORCEINLINE HRESULT IDigitalLocator_get_CarrierFrequency(IDigitalLocator* This,LONG *Frequency) {
    return This->lpVtbl->get_CarrierFrequency(This,Frequency);
}
static FORCEINLINE HRESULT IDigitalLocator_put_CarrierFrequency(IDigitalLocator* This,LONG Frequency) {
    return This->lpVtbl->put_CarrierFrequency(This,Frequency);
}
static FORCEINLINE HRESULT IDigitalLocator_get_InnerFEC(IDigitalLocator* This,FECMethod *FEC) {
    return This->lpVtbl->get_InnerFEC(This,FEC);
}
static FORCEINLINE HRESULT IDigitalLocator_put_InnerFEC(IDigitalLocator* This,FECMethod FEC) {
    return This->lpVtbl->put_InnerFEC(This,FEC);
}
static FORCEINLINE HRESULT IDigitalLocator_get_InnerFECRate(IDigitalLocator* This,BinaryConvolutionCodeRate *FEC) {
    return This->lpVtbl->get_InnerFECRate(This,FEC);
}
static FORCEINLINE HRESULT IDigitalLocator_put_InnerFECRate(IDigitalLocator* This,BinaryConvolutionCodeRate FEC) {
    return This->lpVtbl->put_InnerFECRate(This,FEC);
}
static FORCEINLINE HRESULT IDigitalLocator_get_OuterFEC(IDigitalLocator* This,FECMethod *FEC) {
    return This->lpVtbl->get_OuterFEC(This,FEC);
}
static FORCEINLINE HRESULT IDigitalLocator_put_OuterFEC(IDigitalLocator* This,FECMethod FEC) {
    return This->lpVtbl->put_OuterFEC(This,FEC);
}
static FORCEINLINE HRESULT IDigitalLocator_get_OuterFECRate(IDigitalLocator* This,BinaryConvolutionCodeRate *FEC) {
    return This->lpVtbl->get_OuterFECRate(This,FEC);
}
static FORCEINLINE HRESULT IDigitalLocator_put_OuterFECRate(IDigitalLocator* This,BinaryConvolutionCodeRate FEC) {
    return This->lpVtbl->put_OuterFECRate(This,FEC);
}
static FORCEINLINE HRESULT IDigitalLocator_get_Modulation(IDigitalLocator* This,ModulationType *Modulation) {
    return This->lpVtbl->get_Modulation(This,Modulation);
}
static FORCEINLINE HRESULT IDigitalLocator_put_Modulation(IDigitalLocator* This,ModulationType Modulation) {
    return This->lpVtbl->put_Modulation(This,Modulation);
}
static FORCEINLINE HRESULT IDigitalLocator_get_SymbolRate(IDigitalLocator* This,LONG *Rate) {
    return This->lpVtbl->get_SymbolRate(This,Rate);
}
static FORCEINLINE HRESULT IDigitalLocator_put_SymbolRate(IDigitalLocator* This,LONG Rate) {
    return This->lpVtbl->put_SymbolRate(This,Rate);
}
static FORCEINLINE HRESULT IDigitalLocator_Clone(IDigitalLocator* This,ILocator **NewLocator) {
    return This->lpVtbl->Clone(This,NewLocator);
}
#endif
#endif

#endif


#endif  /* __IDigitalLocator_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IATSCLocator interface
 */
#ifndef __IATSCLocator_INTERFACE_DEFINED__
#define __IATSCLocator_INTERFACE_DEFINED__

DEFINE_GUID(IID_IATSCLocator, 0xbf8d986f, 0x8c2b, 0x4131, 0x94,0xd7, 0x4d,0x3d,0x9f,0xcc,0x21,0xef);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("bf8d986f-8c2b-4131-94d7-4d3d9fcc21ef")
IATSCLocator : public IDigitalLocator
{
    virtual HRESULT STDMETHODCALLTYPE get_PhysicalChannel(
        LONG *PhysicalChannel) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_PhysicalChannel(
        LONG PhysicalChannel) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_TSID(
        LONG *TSID) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_TSID(
        LONG TSID) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IATSCLocator, 0xbf8d986f, 0x8c2b, 0x4131, 0x94,0xd7, 0x4d,0x3d,0x9f,0xcc,0x21,0xef)
#endif
#else
typedef struct IATSCLocatorVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IATSCLocator* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IATSCLocator* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IATSCLocator* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IATSCLocator* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ILocator methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CarrierFrequency)(
        IATSCLocator* This,
        LONG *Frequency);

    HRESULT (STDMETHODCALLTYPE *put_CarrierFrequency)(
        IATSCLocator* This,
        LONG Frequency);

    HRESULT (STDMETHODCALLTYPE *get_InnerFEC)(
        IATSCLocator* This,
        FECMethod *FEC);

    HRESULT (STDMETHODCALLTYPE *put_InnerFEC)(
        IATSCLocator* This,
        FECMethod FEC);

    HRESULT (STDMETHODCALLTYPE *get_InnerFECRate)(
        IATSCLocator* This,
        BinaryConvolutionCodeRate *FEC);

    HRESULT (STDMETHODCALLTYPE *put_InnerFECRate)(
        IATSCLocator* This,
        BinaryConvolutionCodeRate FEC);

    HRESULT (STDMETHODCALLTYPE *get_OuterFEC)(
        IATSCLocator* This,
        FECMethod *FEC);

    HRESULT (STDMETHODCALLTYPE *put_OuterFEC)(
        IATSCLocator* This,
        FECMethod FEC);

    HRESULT (STDMETHODCALLTYPE *get_OuterFECRate)(
        IATSCLocator* This,
        BinaryConvolutionCodeRate *FEC);

    HRESULT (STDMETHODCALLTYPE *put_OuterFECRate)(
        IATSCLocator* This,
        BinaryConvolutionCodeRate FEC);

    HRESULT (STDMETHODCALLTYPE *get_Modulation)(
        IATSCLocator* This,
        ModulationType *Modulation);

    HRESULT (STDMETHODCALLTYPE *put_Modulation)(
        IATSCLocator* This,
        ModulationType Modulation);

    HRESULT (STDMETHODCALLTYPE *get_SymbolRate)(
        IATSCLocator* This,
        LONG *Rate);

    HRESULT (STDMETHODCALLTYPE *put_SymbolRate)(
        IATSCLocator* This,
        LONG Rate);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IATSCLocator* This,
        ILocator **NewLocator);

    /*** IATSCLocator methods ***/
    HRESULT (STDMETHODCALLTYPE *get_PhysicalChannel)(
        IATSCLocator* This,
        LONG *PhysicalChannel);

    HRESULT (STDMETHODCALLTYPE *put_PhysicalChannel)(
        IATSCLocator* This,
        LONG PhysicalChannel);

    HRESULT (STDMETHODCALLTYPE *get_TSID)(
        IATSCLocator* This,
        LONG *TSID);

    HRESULT (STDMETHODCALLTYPE *put_TSID)(
        IATSCLocator* This,
        LONG TSID);

    END_INTERFACE
} IATSCLocatorVtbl;
interface IATSCLocator {
    CONST_VTBL IATSCLocatorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IATSCLocator_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IATSCLocator_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IATSCLocator_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IATSCLocator_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IATSCLocator_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IATSCLocator_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IATSCLocator_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ILocator methods ***/
#define IATSCLocator_get_CarrierFrequency(This,Frequency) (This)->lpVtbl->get_CarrierFrequency(This,Frequency)
#define IATSCLocator_put_CarrierFrequency(This,Frequency) (This)->lpVtbl->put_CarrierFrequency(This,Frequency)
#define IATSCLocator_get_InnerFEC(This,FEC) (This)->lpVtbl->get_InnerFEC(This,FEC)
#define IATSCLocator_put_InnerFEC(This,FEC) (This)->lpVtbl->put_InnerFEC(This,FEC)
#define IATSCLocator_get_InnerFECRate(This,FEC) (This)->lpVtbl->get_InnerFECRate(This,FEC)
#define IATSCLocator_put_InnerFECRate(This,FEC) (This)->lpVtbl->put_InnerFECRate(This,FEC)
#define IATSCLocator_get_OuterFEC(This,FEC) (This)->lpVtbl->get_OuterFEC(This,FEC)
#define IATSCLocator_put_OuterFEC(This,FEC) (This)->lpVtbl->put_OuterFEC(This,FEC)
#define IATSCLocator_get_OuterFECRate(This,FEC) (This)->lpVtbl->get_OuterFECRate(This,FEC)
#define IATSCLocator_put_OuterFECRate(This,FEC) (This)->lpVtbl->put_OuterFECRate(This,FEC)
#define IATSCLocator_get_Modulation(This,Modulation) (This)->lpVtbl->get_Modulation(This,Modulation)
#define IATSCLocator_put_Modulation(This,Modulation) (This)->lpVtbl->put_Modulation(This,Modulation)
#define IATSCLocator_get_SymbolRate(This,Rate) (This)->lpVtbl->get_SymbolRate(This,Rate)
#define IATSCLocator_put_SymbolRate(This,Rate) (This)->lpVtbl->put_SymbolRate(This,Rate)
#define IATSCLocator_Clone(This,NewLocator) (This)->lpVtbl->Clone(This,NewLocator)
/*** IATSCLocator methods ***/
#define IATSCLocator_get_PhysicalChannel(This,PhysicalChannel) (This)->lpVtbl->get_PhysicalChannel(This,PhysicalChannel)
#define IATSCLocator_put_PhysicalChannel(This,PhysicalChannel) (This)->lpVtbl->put_PhysicalChannel(This,PhysicalChannel)
#define IATSCLocator_get_TSID(This,TSID) (This)->lpVtbl->get_TSID(This,TSID)
#define IATSCLocator_put_TSID(This,TSID) (This)->lpVtbl->put_TSID(This,TSID)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IATSCLocator_QueryInterface(IATSCLocator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IATSCLocator_AddRef(IATSCLocator* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IATSCLocator_Release(IATSCLocator* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IATSCLocator_GetTypeInfoCount(IATSCLocator* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IATSCLocator_GetTypeInfo(IATSCLocator* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IATSCLocator_GetIDsOfNames(IATSCLocator* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IATSCLocator_Invoke(IATSCLocator* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ILocator methods ***/
static FORCEINLINE HRESULT IATSCLocator_get_CarrierFrequency(IATSCLocator* This,LONG *Frequency) {
    return This->lpVtbl->get_CarrierFrequency(This,Frequency);
}
static FORCEINLINE HRESULT IATSCLocator_put_CarrierFrequency(IATSCLocator* This,LONG Frequency) {
    return This->lpVtbl->put_CarrierFrequency(This,Frequency);
}
static FORCEINLINE HRESULT IATSCLocator_get_InnerFEC(IATSCLocator* This,FECMethod *FEC) {
    return This->lpVtbl->get_InnerFEC(This,FEC);
}
static FORCEINLINE HRESULT IATSCLocator_put_InnerFEC(IATSCLocator* This,FECMethod FEC) {
    return This->lpVtbl->put_InnerFEC(This,FEC);
}
static FORCEINLINE HRESULT IATSCLocator_get_InnerFECRate(IATSCLocator* This,BinaryConvolutionCodeRate *FEC) {
    return This->lpVtbl->get_InnerFECRate(This,FEC);
}
static FORCEINLINE HRESULT IATSCLocator_put_InnerFECRate(IATSCLocator* This,BinaryConvolutionCodeRate FEC) {
    return This->lpVtbl->put_InnerFECRate(This,FEC);
}
static FORCEINLINE HRESULT IATSCLocator_get_OuterFEC(IATSCLocator* This,FECMethod *FEC) {
    return This->lpVtbl->get_OuterFEC(This,FEC);
}
static FORCEINLINE HRESULT IATSCLocator_put_OuterFEC(IATSCLocator* This,FECMethod FEC) {
    return This->lpVtbl->put_OuterFEC(This,FEC);
}
static FORCEINLINE HRESULT IATSCLocator_get_OuterFECRate(IATSCLocator* This,BinaryConvolutionCodeRate *FEC) {
    return This->lpVtbl->get_OuterFECRate(This,FEC);
}
static FORCEINLINE HRESULT IATSCLocator_put_OuterFECRate(IATSCLocator* This,BinaryConvolutionCodeRate FEC) {
    return This->lpVtbl->put_OuterFECRate(This,FEC);
}
static FORCEINLINE HRESULT IATSCLocator_get_Modulation(IATSCLocator* This,ModulationType *Modulation) {
    return This->lpVtbl->get_Modulation(This,Modulation);
}
static FORCEINLINE HRESULT IATSCLocator_put_Modulation(IATSCLocator* This,ModulationType Modulation) {
    return This->lpVtbl->put_Modulation(This,Modulation);
}
static FORCEINLINE HRESULT IATSCLocator_get_SymbolRate(IATSCLocator* This,LONG *Rate) {
    return This->lpVtbl->get_SymbolRate(This,Rate);
}
static FORCEINLINE HRESULT IATSCLocator_put_SymbolRate(IATSCLocator* This,LONG Rate) {
    return This->lpVtbl->put_SymbolRate(This,Rate);
}
static FORCEINLINE HRESULT IATSCLocator_Clone(IATSCLocator* This,ILocator **NewLocator) {
    return This->lpVtbl->Clone(This,NewLocator);
}
/*** IATSCLocator methods ***/
static FORCEINLINE HRESULT IATSCLocator_get_PhysicalChannel(IATSCLocator* This,LONG *PhysicalChannel) {
    return This->lpVtbl->get_PhysicalChannel(This,PhysicalChannel);
}
static FORCEINLINE HRESULT IATSCLocator_put_PhysicalChannel(IATSCLocator* This,LONG PhysicalChannel) {
    return This->lpVtbl->put_PhysicalChannel(This,PhysicalChannel);
}
static FORCEINLINE HRESULT IATSCLocator_get_TSID(IATSCLocator* This,LONG *TSID) {
    return This->lpVtbl->get_TSID(This,TSID);
}
static FORCEINLINE HRESULT IATSCLocator_put_TSID(IATSCLocator* This,LONG TSID) {
    return This->lpVtbl->put_TSID(This,TSID);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IATSCLocator_get_PhysicalChannel_Proxy(
    IATSCLocator* This,
    LONG *PhysicalChannel);
void __RPC_STUB IATSCLocator_get_PhysicalChannel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IATSCLocator_put_PhysicalChannel_Proxy(
    IATSCLocator* This,
    LONG PhysicalChannel);
void __RPC_STUB IATSCLocator_put_PhysicalChannel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IATSCLocator_get_TSID_Proxy(
    IATSCLocator* This,
    LONG *TSID);
void __RPC_STUB IATSCLocator_get_TSID_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IATSCLocator_put_TSID_Proxy(
    IATSCLocator* This,
    LONG TSID);
void __RPC_STUB IATSCLocator_put_TSID_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IATSCLocator_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IATSCLocator2 interface
 */
#ifndef __IATSCLocator2_INTERFACE_DEFINED__
#define __IATSCLocator2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IATSCLocator2, 0x612aa885, 0x66cf, 0x4090, 0xba,0x0a, 0x56,0x6f,0x53,0x12,0xe4,0xca);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("612aa885-66cf-4090-ba0a-566f5312e4ca")
IATSCLocator2 : public IATSCLocator
{
    virtual HRESULT STDMETHODCALLTYPE get_ProgramNumber(
        LONG *ProgramNumber) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ProgramNumber(
        LONG ProgramNumber) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IATSCLocator2, 0x612aa885, 0x66cf, 0x4090, 0xba,0x0a, 0x56,0x6f,0x53,0x12,0xe4,0xca)
#endif
#else
typedef struct IATSCLocator2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IATSCLocator2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IATSCLocator2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IATSCLocator2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IATSCLocator2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ILocator methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CarrierFrequency)(
        IATSCLocator2* This,
        LONG *Frequency);

    HRESULT (STDMETHODCALLTYPE *put_CarrierFrequency)(
        IATSCLocator2* This,
        LONG Frequency);

    HRESULT (STDMETHODCALLTYPE *get_InnerFEC)(
        IATSCLocator2* This,
        FECMethod *FEC);

    HRESULT (STDMETHODCALLTYPE *put_InnerFEC)(
        IATSCLocator2* This,
        FECMethod FEC);

    HRESULT (STDMETHODCALLTYPE *get_InnerFECRate)(
        IATSCLocator2* This,
        BinaryConvolutionCodeRate *FEC);

    HRESULT (STDMETHODCALLTYPE *put_InnerFECRate)(
        IATSCLocator2* This,
        BinaryConvolutionCodeRate FEC);

    HRESULT (STDMETHODCALLTYPE *get_OuterFEC)(
        IATSCLocator2* This,
        FECMethod *FEC);

    HRESULT (STDMETHODCALLTYPE *put_OuterFEC)(
        IATSCLocator2* This,
        FECMethod FEC);

    HRESULT (STDMETHODCALLTYPE *get_OuterFECRate)(
        IATSCLocator2* This,
        BinaryConvolutionCodeRate *FEC);

    HRESULT (STDMETHODCALLTYPE *put_OuterFECRate)(
        IATSCLocator2* This,
        BinaryConvolutionCodeRate FEC);

    HRESULT (STDMETHODCALLTYPE *get_Modulation)(
        IATSCLocator2* This,
        ModulationType *Modulation);

    HRESULT (STDMETHODCALLTYPE *put_Modulation)(
        IATSCLocator2* This,
        ModulationType Modulation);

    HRESULT (STDMETHODCALLTYPE *get_SymbolRate)(
        IATSCLocator2* This,
        LONG *Rate);

    HRESULT (STDMETHODCALLTYPE *put_SymbolRate)(
        IATSCLocator2* This,
        LONG Rate);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IATSCLocator2* This,
        ILocator **NewLocator);

    /*** IATSCLocator methods ***/
    HRESULT (STDMETHODCALLTYPE *get_PhysicalChannel)(
        IATSCLocator2* This,
        LONG *PhysicalChannel);

    HRESULT (STDMETHODCALLTYPE *put_PhysicalChannel)(
        IATSCLocator2* This,
        LONG PhysicalChannel);

    HRESULT (STDMETHODCALLTYPE *get_TSID)(
        IATSCLocator2* This,
        LONG *TSID);

    HRESULT (STDMETHODCALLTYPE *put_TSID)(
        IATSCLocator2* This,
        LONG TSID);

    /*** IATSCLocator2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ProgramNumber)(
        IATSCLocator2* This,
        LONG *ProgramNumber);

    HRESULT (STDMETHODCALLTYPE *put_ProgramNumber)(
        IATSCLocator2* This,
        LONG ProgramNumber);

    END_INTERFACE
} IATSCLocator2Vtbl;
interface IATSCLocator2 {
    CONST_VTBL IATSCLocator2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IATSCLocator2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IATSCLocator2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IATSCLocator2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IATSCLocator2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IATSCLocator2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IATSCLocator2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IATSCLocator2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ILocator methods ***/
#define IATSCLocator2_get_CarrierFrequency(This,Frequency) (This)->lpVtbl->get_CarrierFrequency(This,Frequency)
#define IATSCLocator2_put_CarrierFrequency(This,Frequency) (This)->lpVtbl->put_CarrierFrequency(This,Frequency)
#define IATSCLocator2_get_InnerFEC(This,FEC) (This)->lpVtbl->get_InnerFEC(This,FEC)
#define IATSCLocator2_put_InnerFEC(This,FEC) (This)->lpVtbl->put_InnerFEC(This,FEC)
#define IATSCLocator2_get_InnerFECRate(This,FEC) (This)->lpVtbl->get_InnerFECRate(This,FEC)
#define IATSCLocator2_put_InnerFECRate(This,FEC) (This)->lpVtbl->put_InnerFECRate(This,FEC)
#define IATSCLocator2_get_OuterFEC(This,FEC) (This)->lpVtbl->get_OuterFEC(This,FEC)
#define IATSCLocator2_put_OuterFEC(This,FEC) (This)->lpVtbl->put_OuterFEC(This,FEC)
#define IATSCLocator2_get_OuterFECRate(This,FEC) (This)->lpVtbl->get_OuterFECRate(This,FEC)
#define IATSCLocator2_put_OuterFECRate(This,FEC) (This)->lpVtbl->put_OuterFECRate(This,FEC)
#define IATSCLocator2_get_Modulation(This,Modulation) (This)->lpVtbl->get_Modulation(This,Modulation)
#define IATSCLocator2_put_Modulation(This,Modulation) (This)->lpVtbl->put_Modulation(This,Modulation)
#define IATSCLocator2_get_SymbolRate(This,Rate) (This)->lpVtbl->get_SymbolRate(This,Rate)
#define IATSCLocator2_put_SymbolRate(This,Rate) (This)->lpVtbl->put_SymbolRate(This,Rate)
#define IATSCLocator2_Clone(This,NewLocator) (This)->lpVtbl->Clone(This,NewLocator)
/*** IATSCLocator methods ***/
#define IATSCLocator2_get_PhysicalChannel(This,PhysicalChannel) (This)->lpVtbl->get_PhysicalChannel(This,PhysicalChannel)
#define IATSCLocator2_put_PhysicalChannel(This,PhysicalChannel) (This)->lpVtbl->put_PhysicalChannel(This,PhysicalChannel)
#define IATSCLocator2_get_TSID(This,TSID) (This)->lpVtbl->get_TSID(This,TSID)
#define IATSCLocator2_put_TSID(This,TSID) (This)->lpVtbl->put_TSID(This,TSID)
/*** IATSCLocator2 methods ***/
#define IATSCLocator2_get_ProgramNumber(This,ProgramNumber) (This)->lpVtbl->get_ProgramNumber(This,ProgramNumber)
#define IATSCLocator2_put_ProgramNumber(This,ProgramNumber) (This)->lpVtbl->put_ProgramNumber(This,ProgramNumber)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IATSCLocator2_QueryInterface(IATSCLocator2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IATSCLocator2_AddRef(IATSCLocator2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IATSCLocator2_Release(IATSCLocator2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IATSCLocator2_GetTypeInfoCount(IATSCLocator2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IATSCLocator2_GetTypeInfo(IATSCLocator2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IATSCLocator2_GetIDsOfNames(IATSCLocator2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IATSCLocator2_Invoke(IATSCLocator2* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ILocator methods ***/
static FORCEINLINE HRESULT IATSCLocator2_get_CarrierFrequency(IATSCLocator2* This,LONG *Frequency) {
    return This->lpVtbl->get_CarrierFrequency(This,Frequency);
}
static FORCEINLINE HRESULT IATSCLocator2_put_CarrierFrequency(IATSCLocator2* This,LONG Frequency) {
    return This->lpVtbl->put_CarrierFrequency(This,Frequency);
}
static FORCEINLINE HRESULT IATSCLocator2_get_InnerFEC(IATSCLocator2* This,FECMethod *FEC) {
    return This->lpVtbl->get_InnerFEC(This,FEC);
}
static FORCEINLINE HRESULT IATSCLocator2_put_InnerFEC(IATSCLocator2* This,FECMethod FEC) {
    return This->lpVtbl->put_InnerFEC(This,FEC);
}
static FORCEINLINE HRESULT IATSCLocator2_get_InnerFECRate(IATSCLocator2* This,BinaryConvolutionCodeRate *FEC) {
    return This->lpVtbl->get_InnerFECRate(This,FEC);
}
static FORCEINLINE HRESULT IATSCLocator2_put_InnerFECRate(IATSCLocator2* This,BinaryConvolutionCodeRate FEC) {
    return This->lpVtbl->put_InnerFECRate(This,FEC);
}
static FORCEINLINE HRESULT IATSCLocator2_get_OuterFEC(IATSCLocator2* This,FECMethod *FEC) {
    return This->lpVtbl->get_OuterFEC(This,FEC);
}
static FORCEINLINE HRESULT IATSCLocator2_put_OuterFEC(IATSCLocator2* This,FECMethod FEC) {
    return This->lpVtbl->put_OuterFEC(This,FEC);
}
static FORCEINLINE HRESULT IATSCLocator2_get_OuterFECRate(IATSCLocator2* This,BinaryConvolutionCodeRate *FEC) {
    return This->lpVtbl->get_OuterFECRate(This,FEC);
}
static FORCEINLINE HRESULT IATSCLocator2_put_OuterFECRate(IATSCLocator2* This,BinaryConvolutionCodeRate FEC) {
    return This->lpVtbl->put_OuterFECRate(This,FEC);
}
static FORCEINLINE HRESULT IATSCLocator2_get_Modulation(IATSCLocator2* This,ModulationType *Modulation) {
    return This->lpVtbl->get_Modulation(This,Modulation);
}
static FORCEINLINE HRESULT IATSCLocator2_put_Modulation(IATSCLocator2* This,ModulationType Modulation) {
    return This->lpVtbl->put_Modulation(This,Modulation);
}
static FORCEINLINE HRESULT IATSCLocator2_get_SymbolRate(IATSCLocator2* This,LONG *Rate) {
    return This->lpVtbl->get_SymbolRate(This,Rate);
}
static FORCEINLINE HRESULT IATSCLocator2_put_SymbolRate(IATSCLocator2* This,LONG Rate) {
    return This->lpVtbl->put_SymbolRate(This,Rate);
}
static FORCEINLINE HRESULT IATSCLocator2_Clone(IATSCLocator2* This,ILocator **NewLocator) {
    return This->lpVtbl->Clone(This,NewLocator);
}
/*** IATSCLocator methods ***/
static FORCEINLINE HRESULT IATSCLocator2_get_PhysicalChannel(IATSCLocator2* This,LONG *PhysicalChannel) {
    return This->lpVtbl->get_PhysicalChannel(This,PhysicalChannel);
}
static FORCEINLINE HRESULT IATSCLocator2_put_PhysicalChannel(IATSCLocator2* This,LONG PhysicalChannel) {
    return This->lpVtbl->put_PhysicalChannel(This,PhysicalChannel);
}
static FORCEINLINE HRESULT IATSCLocator2_get_TSID(IATSCLocator2* This,LONG *TSID) {
    return This->lpVtbl->get_TSID(This,TSID);
}
static FORCEINLINE HRESULT IATSCLocator2_put_TSID(IATSCLocator2* This,LONG TSID) {
    return This->lpVtbl->put_TSID(This,TSID);
}
/*** IATSCLocator2 methods ***/
static FORCEINLINE HRESULT IATSCLocator2_get_ProgramNumber(IATSCLocator2* This,LONG *ProgramNumber) {
    return This->lpVtbl->get_ProgramNumber(This,ProgramNumber);
}
static FORCEINLINE HRESULT IATSCLocator2_put_ProgramNumber(IATSCLocator2* This,LONG ProgramNumber) {
    return This->lpVtbl->put_ProgramNumber(This,ProgramNumber);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IATSCLocator2_get_ProgramNumber_Proxy(
    IATSCLocator2* This,
    LONG *ProgramNumber);
void __RPC_STUB IATSCLocator2_get_ProgramNumber_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IATSCLocator2_put_ProgramNumber_Proxy(
    IATSCLocator2* This,
    LONG ProgramNumber);
void __RPC_STUB IATSCLocator2_put_ProgramNumber_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IATSCLocator2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDigitalCableLocator interface
 */
#ifndef __IDigitalCableLocator_INTERFACE_DEFINED__
#define __IDigitalCableLocator_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDigitalCableLocator, 0x48f66a11, 0x171a, 0x419a, 0x95,0x25, 0xbe,0xee,0xcd,0x51,0x58,0x4c);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("48f66a11-171a-419a-9525-beeecd51584c")
IDigitalCableLocator : public IATSCLocator2
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDigitalCableLocator, 0x48f66a11, 0x171a, 0x419a, 0x95,0x25, 0xbe,0xee,0xcd,0x51,0x58,0x4c)
#endif
#else
typedef struct IDigitalCableLocatorVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IDigitalCableLocator* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IDigitalCableLocator* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IDigitalCableLocator* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IDigitalCableLocator* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ILocator methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CarrierFrequency)(
        IDigitalCableLocator* This,
        LONG *Frequency);

    HRESULT (STDMETHODCALLTYPE *put_CarrierFrequency)(
        IDigitalCableLocator* This,
        LONG Frequency);

    HRESULT (STDMETHODCALLTYPE *get_InnerFEC)(
        IDigitalCableLocator* This,
        FECMethod *FEC);

    HRESULT (STDMETHODCALLTYPE *put_InnerFEC)(
        IDigitalCableLocator* This,
        FECMethod FEC);

    HRESULT (STDMETHODCALLTYPE *get_InnerFECRate)(
        IDigitalCableLocator* This,
        BinaryConvolutionCodeRate *FEC);

    HRESULT (STDMETHODCALLTYPE *put_InnerFECRate)(
        IDigitalCableLocator* This,
        BinaryConvolutionCodeRate FEC);

    HRESULT (STDMETHODCALLTYPE *get_OuterFEC)(
        IDigitalCableLocator* This,
        FECMethod *FEC);

    HRESULT (STDMETHODCALLTYPE *put_OuterFEC)(
        IDigitalCableLocator* This,
        FECMethod FEC);

    HRESULT (STDMETHODCALLTYPE *get_OuterFECRate)(
        IDigitalCableLocator* This,
        BinaryConvolutionCodeRate *FEC);

    HRESULT (STDMETHODCALLTYPE *put_OuterFECRate)(
        IDigitalCableLocator* This,
        BinaryConvolutionCodeRate FEC);

    HRESULT (STDMETHODCALLTYPE *get_Modulation)(
        IDigitalCableLocator* This,
        ModulationType *Modulation);

    HRESULT (STDMETHODCALLTYPE *put_Modulation)(
        IDigitalCableLocator* This,
        ModulationType Modulation);

    HRESULT (STDMETHODCALLTYPE *get_SymbolRate)(
        IDigitalCableLocator* This,
        LONG *Rate);

    HRESULT (STDMETHODCALLTYPE *put_SymbolRate)(
        IDigitalCableLocator* This,
        LONG Rate);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IDigitalCableLocator* This,
        ILocator **NewLocator);

    /*** IATSCLocator methods ***/
    HRESULT (STDMETHODCALLTYPE *get_PhysicalChannel)(
        IDigitalCableLocator* This,
        LONG *PhysicalChannel);

    HRESULT (STDMETHODCALLTYPE *put_PhysicalChannel)(
        IDigitalCableLocator* This,
        LONG PhysicalChannel);

    HRESULT (STDMETHODCALLTYPE *get_TSID)(
        IDigitalCableLocator* This,
        LONG *TSID);

    HRESULT (STDMETHODCALLTYPE *put_TSID)(
        IDigitalCableLocator* This,
        LONG TSID);

    /*** IATSCLocator2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ProgramNumber)(
        IDigitalCableLocator* This,
        LONG *ProgramNumber);

    HRESULT (STDMETHODCALLTYPE *put_ProgramNumber)(
        IDigitalCableLocator* This,
        LONG ProgramNumber);

    END_INTERFACE
} IDigitalCableLocatorVtbl;
interface IDigitalCableLocator {
    CONST_VTBL IDigitalCableLocatorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDigitalCableLocator_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDigitalCableLocator_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDigitalCableLocator_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IDigitalCableLocator_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IDigitalCableLocator_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IDigitalCableLocator_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IDigitalCableLocator_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ILocator methods ***/
#define IDigitalCableLocator_get_CarrierFrequency(This,Frequency) (This)->lpVtbl->get_CarrierFrequency(This,Frequency)
#define IDigitalCableLocator_put_CarrierFrequency(This,Frequency) (This)->lpVtbl->put_CarrierFrequency(This,Frequency)
#define IDigitalCableLocator_get_InnerFEC(This,FEC) (This)->lpVtbl->get_InnerFEC(This,FEC)
#define IDigitalCableLocator_put_InnerFEC(This,FEC) (This)->lpVtbl->put_InnerFEC(This,FEC)
#define IDigitalCableLocator_get_InnerFECRate(This,FEC) (This)->lpVtbl->get_InnerFECRate(This,FEC)
#define IDigitalCableLocator_put_InnerFECRate(This,FEC) (This)->lpVtbl->put_InnerFECRate(This,FEC)
#define IDigitalCableLocator_get_OuterFEC(This,FEC) (This)->lpVtbl->get_OuterFEC(This,FEC)
#define IDigitalCableLocator_put_OuterFEC(This,FEC) (This)->lpVtbl->put_OuterFEC(This,FEC)
#define IDigitalCableLocator_get_OuterFECRate(This,FEC) (This)->lpVtbl->get_OuterFECRate(This,FEC)
#define IDigitalCableLocator_put_OuterFECRate(This,FEC) (This)->lpVtbl->put_OuterFECRate(This,FEC)
#define IDigitalCableLocator_get_Modulation(This,Modulation) (This)->lpVtbl->get_Modulation(This,Modulation)
#define IDigitalCableLocator_put_Modulation(This,Modulation) (This)->lpVtbl->put_Modulation(This,Modulation)
#define IDigitalCableLocator_get_SymbolRate(This,Rate) (This)->lpVtbl->get_SymbolRate(This,Rate)
#define IDigitalCableLocator_put_SymbolRate(This,Rate) (This)->lpVtbl->put_SymbolRate(This,Rate)
#define IDigitalCableLocator_Clone(This,NewLocator) (This)->lpVtbl->Clone(This,NewLocator)
/*** IATSCLocator methods ***/
#define IDigitalCableLocator_get_PhysicalChannel(This,PhysicalChannel) (This)->lpVtbl->get_PhysicalChannel(This,PhysicalChannel)
#define IDigitalCableLocator_put_PhysicalChannel(This,PhysicalChannel) (This)->lpVtbl->put_PhysicalChannel(This,PhysicalChannel)
#define IDigitalCableLocator_get_TSID(This,TSID) (This)->lpVtbl->get_TSID(This,TSID)
#define IDigitalCableLocator_put_TSID(This,TSID) (This)->lpVtbl->put_TSID(This,TSID)
/*** IATSCLocator2 methods ***/
#define IDigitalCableLocator_get_ProgramNumber(This,ProgramNumber) (This)->lpVtbl->get_ProgramNumber(This,ProgramNumber)
#define IDigitalCableLocator_put_ProgramNumber(This,ProgramNumber) (This)->lpVtbl->put_ProgramNumber(This,ProgramNumber)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDigitalCableLocator_QueryInterface(IDigitalCableLocator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDigitalCableLocator_AddRef(IDigitalCableLocator* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDigitalCableLocator_Release(IDigitalCableLocator* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IDigitalCableLocator_GetTypeInfoCount(IDigitalCableLocator* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IDigitalCableLocator_GetTypeInfo(IDigitalCableLocator* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IDigitalCableLocator_GetIDsOfNames(IDigitalCableLocator* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IDigitalCableLocator_Invoke(IDigitalCableLocator* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ILocator methods ***/
static FORCEINLINE HRESULT IDigitalCableLocator_get_CarrierFrequency(IDigitalCableLocator* This,LONG *Frequency) {
    return This->lpVtbl->get_CarrierFrequency(This,Frequency);
}
static FORCEINLINE HRESULT IDigitalCableLocator_put_CarrierFrequency(IDigitalCableLocator* This,LONG Frequency) {
    return This->lpVtbl->put_CarrierFrequency(This,Frequency);
}
static FORCEINLINE HRESULT IDigitalCableLocator_get_InnerFEC(IDigitalCableLocator* This,FECMethod *FEC) {
    return This->lpVtbl->get_InnerFEC(This,FEC);
}
static FORCEINLINE HRESULT IDigitalCableLocator_put_InnerFEC(IDigitalCableLocator* This,FECMethod FEC) {
    return This->lpVtbl->put_InnerFEC(This,FEC);
}
static FORCEINLINE HRESULT IDigitalCableLocator_get_InnerFECRate(IDigitalCableLocator* This,BinaryConvolutionCodeRate *FEC) {
    return This->lpVtbl->get_InnerFECRate(This,FEC);
}
static FORCEINLINE HRESULT IDigitalCableLocator_put_InnerFECRate(IDigitalCableLocator* This,BinaryConvolutionCodeRate FEC) {
    return This->lpVtbl->put_InnerFECRate(This,FEC);
}
static FORCEINLINE HRESULT IDigitalCableLocator_get_OuterFEC(IDigitalCableLocator* This,FECMethod *FEC) {
    return This->lpVtbl->get_OuterFEC(This,FEC);
}
static FORCEINLINE HRESULT IDigitalCableLocator_put_OuterFEC(IDigitalCableLocator* This,FECMethod FEC) {
    return This->lpVtbl->put_OuterFEC(This,FEC);
}
static FORCEINLINE HRESULT IDigitalCableLocator_get_OuterFECRate(IDigitalCableLocator* This,BinaryConvolutionCodeRate *FEC) {
    return This->lpVtbl->get_OuterFECRate(This,FEC);
}
static FORCEINLINE HRESULT IDigitalCableLocator_put_OuterFECRate(IDigitalCableLocator* This,BinaryConvolutionCodeRate FEC) {
    return This->lpVtbl->put_OuterFECRate(This,FEC);
}
static FORCEINLINE HRESULT IDigitalCableLocator_get_Modulation(IDigitalCableLocator* This,ModulationType *Modulation) {
    return This->lpVtbl->get_Modulation(This,Modulation);
}
static FORCEINLINE HRESULT IDigitalCableLocator_put_Modulation(IDigitalCableLocator* This,ModulationType Modulation) {
    return This->lpVtbl->put_Modulation(This,Modulation);
}
static FORCEINLINE HRESULT IDigitalCableLocator_get_SymbolRate(IDigitalCableLocator* This,LONG *Rate) {
    return This->lpVtbl->get_SymbolRate(This,Rate);
}
static FORCEINLINE HRESULT IDigitalCableLocator_put_SymbolRate(IDigitalCableLocator* This,LONG Rate) {
    return This->lpVtbl->put_SymbolRate(This,Rate);
}
static FORCEINLINE HRESULT IDigitalCableLocator_Clone(IDigitalCableLocator* This,ILocator **NewLocator) {
    return This->lpVtbl->Clone(This,NewLocator);
}
/*** IATSCLocator methods ***/
static FORCEINLINE HRESULT IDigitalCableLocator_get_PhysicalChannel(IDigitalCableLocator* This,LONG *PhysicalChannel) {
    return This->lpVtbl->get_PhysicalChannel(This,PhysicalChannel);
}
static FORCEINLINE HRESULT IDigitalCableLocator_put_PhysicalChannel(IDigitalCableLocator* This,LONG PhysicalChannel) {
    return This->lpVtbl->put_PhysicalChannel(This,PhysicalChannel);
}
static FORCEINLINE HRESULT IDigitalCableLocator_get_TSID(IDigitalCableLocator* This,LONG *TSID) {
    return This->lpVtbl->get_TSID(This,TSID);
}
static FORCEINLINE HRESULT IDigitalCableLocator_put_TSID(IDigitalCableLocator* This,LONG TSID) {
    return This->lpVtbl->put_TSID(This,TSID);
}
/*** IATSCLocator2 methods ***/
static FORCEINLINE HRESULT IDigitalCableLocator_get_ProgramNumber(IDigitalCableLocator* This,LONG *ProgramNumber) {
    return This->lpVtbl->get_ProgramNumber(This,ProgramNumber);
}
static FORCEINLINE HRESULT IDigitalCableLocator_put_ProgramNumber(IDigitalCableLocator* This,LONG ProgramNumber) {
    return This->lpVtbl->put_ProgramNumber(This,ProgramNumber);
}
#endif
#endif

#endif


#endif  /* __IDigitalCableLocator_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDVBTLocator interface
 */
#ifndef __IDVBTLocator_INTERFACE_DEFINED__
#define __IDVBTLocator_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDVBTLocator, 0x8664da16, 0xdda2, 0x42ac, 0x92,0x6a, 0xc1,0x8f,0x91,0x27,0xc3,0x02);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("8664da16-dda2-42ac-926a-c18f9127c302")
IDVBTLocator : public IDigitalLocator
{
    virtual HRESULT STDMETHODCALLTYPE get_Bandwidth(
        LONG *BandWidthVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Bandwidth(
        LONG BandwidthVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_LPInnerFEC(
        FECMethod *FEC) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_LPInnerFEC(
        FECMethod FEC) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_LPInnerFECRate(
        BinaryConvolutionCodeRate *FEC) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_LPInnerFECRate(
        BinaryConvolutionCodeRate FEC) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HAlpha(
        HierarchyAlpha *Alpha) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_HAlpha(
        HierarchyAlpha Alpha) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Guard(
        GuardInterval *GI) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Guard(
        GuardInterval GI) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Mode(
        TransmissionMode *mode) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Mode(
        TransmissionMode mode) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_OtherFrequencyInUse(
        VARIANT_BOOL *OtherFrequencyInUseVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_OtherFrequencyInUse(
        VARIANT_BOOL OtherFrequencyInUseVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDVBTLocator, 0x8664da16, 0xdda2, 0x42ac, 0x92,0x6a, 0xc1,0x8f,0x91,0x27,0xc3,0x02)
#endif
#else
typedef struct IDVBTLocatorVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IDVBTLocator* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IDVBTLocator* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IDVBTLocator* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IDVBTLocator* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ILocator methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CarrierFrequency)(
        IDVBTLocator* This,
        LONG *Frequency);

    HRESULT (STDMETHODCALLTYPE *put_CarrierFrequency)(
        IDVBTLocator* This,
        LONG Frequency);

    HRESULT (STDMETHODCALLTYPE *get_InnerFEC)(
        IDVBTLocator* This,
        FECMethod *FEC);

    HRESULT (STDMETHODCALLTYPE *put_InnerFEC)(
        IDVBTLocator* This,
        FECMethod FEC);

    HRESULT (STDMETHODCALLTYPE *get_InnerFECRate)(
        IDVBTLocator* This,
        BinaryConvolutionCodeRate *FEC);

    HRESULT (STDMETHODCALLTYPE *put_InnerFECRate)(
        IDVBTLocator* This,
        BinaryConvolutionCodeRate FEC);

    HRESULT (STDMETHODCALLTYPE *get_OuterFEC)(
        IDVBTLocator* This,
        FECMethod *FEC);

    HRESULT (STDMETHODCALLTYPE *put_OuterFEC)(
        IDVBTLocator* This,
        FECMethod FEC);

    HRESULT (STDMETHODCALLTYPE *get_OuterFECRate)(
        IDVBTLocator* This,
        BinaryConvolutionCodeRate *FEC);

    HRESULT (STDMETHODCALLTYPE *put_OuterFECRate)(
        IDVBTLocator* This,
        BinaryConvolutionCodeRate FEC);

    HRESULT (STDMETHODCALLTYPE *get_Modulation)(
        IDVBTLocator* This,
        ModulationType *Modulation);

    HRESULT (STDMETHODCALLTYPE *put_Modulation)(
        IDVBTLocator* This,
        ModulationType Modulation);

    HRESULT (STDMETHODCALLTYPE *get_SymbolRate)(
        IDVBTLocator* This,
        LONG *Rate);

    HRESULT (STDMETHODCALLTYPE *put_SymbolRate)(
        IDVBTLocator* This,
        LONG Rate);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IDVBTLocator* This,
        ILocator **NewLocator);

    /*** IDVBTLocator methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Bandwidth)(
        IDVBTLocator* This,
        LONG *BandWidthVal);

    HRESULT (STDMETHODCALLTYPE *put_Bandwidth)(
        IDVBTLocator* This,
        LONG BandwidthVal);

    HRESULT (STDMETHODCALLTYPE *get_LPInnerFEC)(
        IDVBTLocator* This,
        FECMethod *FEC);

    HRESULT (STDMETHODCALLTYPE *put_LPInnerFEC)(
        IDVBTLocator* This,
        FECMethod FEC);

    HRESULT (STDMETHODCALLTYPE *get_LPInnerFECRate)(
        IDVBTLocator* This,
        BinaryConvolutionCodeRate *FEC);

    HRESULT (STDMETHODCALLTYPE *put_LPInnerFECRate)(
        IDVBTLocator* This,
        BinaryConvolutionCodeRate FEC);

    HRESULT (STDMETHODCALLTYPE *get_HAlpha)(
        IDVBTLocator* This,
        HierarchyAlpha *Alpha);

    HRESULT (STDMETHODCALLTYPE *put_HAlpha)(
        IDVBTLocator* This,
        HierarchyAlpha Alpha);

    HRESULT (STDMETHODCALLTYPE *get_Guard)(
        IDVBTLocator* This,
        GuardInterval *GI);

    HRESULT (STDMETHODCALLTYPE *put_Guard)(
        IDVBTLocator* This,
        GuardInterval GI);

    HRESULT (STDMETHODCALLTYPE *get_Mode)(
        IDVBTLocator* This,
        TransmissionMode *mode);

    HRESULT (STDMETHODCALLTYPE *put_Mode)(
        IDVBTLocator* This,
        TransmissionMode mode);

    HRESULT (STDMETHODCALLTYPE *get_OtherFrequencyInUse)(
        IDVBTLocator* This,
        VARIANT_BOOL *OtherFrequencyInUseVal);

    HRESULT (STDMETHODCALLTYPE *put_OtherFrequencyInUse)(
        IDVBTLocator* This,
        VARIANT_BOOL OtherFrequencyInUseVal);

    END_INTERFACE
} IDVBTLocatorVtbl;
interface IDVBTLocator {
    CONST_VTBL IDVBTLocatorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDVBTLocator_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDVBTLocator_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDVBTLocator_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IDVBTLocator_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IDVBTLocator_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IDVBTLocator_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IDVBTLocator_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ILocator methods ***/
#define IDVBTLocator_get_CarrierFrequency(This,Frequency) (This)->lpVtbl->get_CarrierFrequency(This,Frequency)
#define IDVBTLocator_put_CarrierFrequency(This,Frequency) (This)->lpVtbl->put_CarrierFrequency(This,Frequency)
#define IDVBTLocator_get_InnerFEC(This,FEC) (This)->lpVtbl->get_InnerFEC(This,FEC)
#define IDVBTLocator_put_InnerFEC(This,FEC) (This)->lpVtbl->put_InnerFEC(This,FEC)
#define IDVBTLocator_get_InnerFECRate(This,FEC) (This)->lpVtbl->get_InnerFECRate(This,FEC)
#define IDVBTLocator_put_InnerFECRate(This,FEC) (This)->lpVtbl->put_InnerFECRate(This,FEC)
#define IDVBTLocator_get_OuterFEC(This,FEC) (This)->lpVtbl->get_OuterFEC(This,FEC)
#define IDVBTLocator_put_OuterFEC(This,FEC) (This)->lpVtbl->put_OuterFEC(This,FEC)
#define IDVBTLocator_get_OuterFECRate(This,FEC) (This)->lpVtbl->get_OuterFECRate(This,FEC)
#define IDVBTLocator_put_OuterFECRate(This,FEC) (This)->lpVtbl->put_OuterFECRate(This,FEC)
#define IDVBTLocator_get_Modulation(This,Modulation) (This)->lpVtbl->get_Modulation(This,Modulation)
#define IDVBTLocator_put_Modulation(This,Modulation) (This)->lpVtbl->put_Modulation(This,Modulation)
#define IDVBTLocator_get_SymbolRate(This,Rate) (This)->lpVtbl->get_SymbolRate(This,Rate)
#define IDVBTLocator_put_SymbolRate(This,Rate) (This)->lpVtbl->put_SymbolRate(This,Rate)
#define IDVBTLocator_Clone(This,NewLocator) (This)->lpVtbl->Clone(This,NewLocator)
/*** IDVBTLocator methods ***/
#define IDVBTLocator_get_Bandwidth(This,BandWidthVal) (This)->lpVtbl->get_Bandwidth(This,BandWidthVal)
#define IDVBTLocator_put_Bandwidth(This,BandwidthVal) (This)->lpVtbl->put_Bandwidth(This,BandwidthVal)
#define IDVBTLocator_get_LPInnerFEC(This,FEC) (This)->lpVtbl->get_LPInnerFEC(This,FEC)
#define IDVBTLocator_put_LPInnerFEC(This,FEC) (This)->lpVtbl->put_LPInnerFEC(This,FEC)
#define IDVBTLocator_get_LPInnerFECRate(This,FEC) (This)->lpVtbl->get_LPInnerFECRate(This,FEC)
#define IDVBTLocator_put_LPInnerFECRate(This,FEC) (This)->lpVtbl->put_LPInnerFECRate(This,FEC)
#define IDVBTLocator_get_HAlpha(This,Alpha) (This)->lpVtbl->get_HAlpha(This,Alpha)
#define IDVBTLocator_put_HAlpha(This,Alpha) (This)->lpVtbl->put_HAlpha(This,Alpha)
#define IDVBTLocator_get_Guard(This,GI) (This)->lpVtbl->get_Guard(This,GI)
#define IDVBTLocator_put_Guard(This,GI) (This)->lpVtbl->put_Guard(This,GI)
#define IDVBTLocator_get_Mode(This,mode) (This)->lpVtbl->get_Mode(This,mode)
#define IDVBTLocator_put_Mode(This,mode) (This)->lpVtbl->put_Mode(This,mode)
#define IDVBTLocator_get_OtherFrequencyInUse(This,OtherFrequencyInUseVal) (This)->lpVtbl->get_OtherFrequencyInUse(This,OtherFrequencyInUseVal)
#define IDVBTLocator_put_OtherFrequencyInUse(This,OtherFrequencyInUseVal) (This)->lpVtbl->put_OtherFrequencyInUse(This,OtherFrequencyInUseVal)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDVBTLocator_QueryInterface(IDVBTLocator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDVBTLocator_AddRef(IDVBTLocator* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDVBTLocator_Release(IDVBTLocator* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IDVBTLocator_GetTypeInfoCount(IDVBTLocator* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IDVBTLocator_GetTypeInfo(IDVBTLocator* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IDVBTLocator_GetIDsOfNames(IDVBTLocator* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IDVBTLocator_Invoke(IDVBTLocator* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ILocator methods ***/
static FORCEINLINE HRESULT IDVBTLocator_get_CarrierFrequency(IDVBTLocator* This,LONG *Frequency) {
    return This->lpVtbl->get_CarrierFrequency(This,Frequency);
}
static FORCEINLINE HRESULT IDVBTLocator_put_CarrierFrequency(IDVBTLocator* This,LONG Frequency) {
    return This->lpVtbl->put_CarrierFrequency(This,Frequency);
}
static FORCEINLINE HRESULT IDVBTLocator_get_InnerFEC(IDVBTLocator* This,FECMethod *FEC) {
    return This->lpVtbl->get_InnerFEC(This,FEC);
}
static FORCEINLINE HRESULT IDVBTLocator_put_InnerFEC(IDVBTLocator* This,FECMethod FEC) {
    return This->lpVtbl->put_InnerFEC(This,FEC);
}
static FORCEINLINE HRESULT IDVBTLocator_get_InnerFECRate(IDVBTLocator* This,BinaryConvolutionCodeRate *FEC) {
    return This->lpVtbl->get_InnerFECRate(This,FEC);
}
static FORCEINLINE HRESULT IDVBTLocator_put_InnerFECRate(IDVBTLocator* This,BinaryConvolutionCodeRate FEC) {
    return This->lpVtbl->put_InnerFECRate(This,FEC);
}
static FORCEINLINE HRESULT IDVBTLocator_get_OuterFEC(IDVBTLocator* This,FECMethod *FEC) {
    return This->lpVtbl->get_OuterFEC(This,FEC);
}
static FORCEINLINE HRESULT IDVBTLocator_put_OuterFEC(IDVBTLocator* This,FECMethod FEC) {
    return This->lpVtbl->put_OuterFEC(This,FEC);
}
static FORCEINLINE HRESULT IDVBTLocator_get_OuterFECRate(IDVBTLocator* This,BinaryConvolutionCodeRate *FEC) {
    return This->lpVtbl->get_OuterFECRate(This,FEC);
}
static FORCEINLINE HRESULT IDVBTLocator_put_OuterFECRate(IDVBTLocator* This,BinaryConvolutionCodeRate FEC) {
    return This->lpVtbl->put_OuterFECRate(This,FEC);
}
static FORCEINLINE HRESULT IDVBTLocator_get_Modulation(IDVBTLocator* This,ModulationType *Modulation) {
    return This->lpVtbl->get_Modulation(This,Modulation);
}
static FORCEINLINE HRESULT IDVBTLocator_put_Modulation(IDVBTLocator* This,ModulationType Modulation) {
    return This->lpVtbl->put_Modulation(This,Modulation);
}
static FORCEINLINE HRESULT IDVBTLocator_get_SymbolRate(IDVBTLocator* This,LONG *Rate) {
    return This->lpVtbl->get_SymbolRate(This,Rate);
}
static FORCEINLINE HRESULT IDVBTLocator_put_SymbolRate(IDVBTLocator* This,LONG Rate) {
    return This->lpVtbl->put_SymbolRate(This,Rate);
}
static FORCEINLINE HRESULT IDVBTLocator_Clone(IDVBTLocator* This,ILocator **NewLocator) {
    return This->lpVtbl->Clone(This,NewLocator);
}
/*** IDVBTLocator methods ***/
static FORCEINLINE HRESULT IDVBTLocator_get_Bandwidth(IDVBTLocator* This,LONG *BandWidthVal) {
    return This->lpVtbl->get_Bandwidth(This,BandWidthVal);
}
static FORCEINLINE HRESULT IDVBTLocator_put_Bandwidth(IDVBTLocator* This,LONG BandwidthVal) {
    return This->lpVtbl->put_Bandwidth(This,BandwidthVal);
}
static FORCEINLINE HRESULT IDVBTLocator_get_LPInnerFEC(IDVBTLocator* This,FECMethod *FEC) {
    return This->lpVtbl->get_LPInnerFEC(This,FEC);
}
static FORCEINLINE HRESULT IDVBTLocator_put_LPInnerFEC(IDVBTLocator* This,FECMethod FEC) {
    return This->lpVtbl->put_LPInnerFEC(This,FEC);
}
static FORCEINLINE HRESULT IDVBTLocator_get_LPInnerFECRate(IDVBTLocator* This,BinaryConvolutionCodeRate *FEC) {
    return This->lpVtbl->get_LPInnerFECRate(This,FEC);
}
static FORCEINLINE HRESULT IDVBTLocator_put_LPInnerFECRate(IDVBTLocator* This,BinaryConvolutionCodeRate FEC) {
    return This->lpVtbl->put_LPInnerFECRate(This,FEC);
}
static FORCEINLINE HRESULT IDVBTLocator_get_HAlpha(IDVBTLocator* This,HierarchyAlpha *Alpha) {
    return This->lpVtbl->get_HAlpha(This,Alpha);
}
static FORCEINLINE HRESULT IDVBTLocator_put_HAlpha(IDVBTLocator* This,HierarchyAlpha Alpha) {
    return This->lpVtbl->put_HAlpha(This,Alpha);
}
static FORCEINLINE HRESULT IDVBTLocator_get_Guard(IDVBTLocator* This,GuardInterval *GI) {
    return This->lpVtbl->get_Guard(This,GI);
}
static FORCEINLINE HRESULT IDVBTLocator_put_Guard(IDVBTLocator* This,GuardInterval GI) {
    return This->lpVtbl->put_Guard(This,GI);
}
static FORCEINLINE HRESULT IDVBTLocator_get_Mode(IDVBTLocator* This,TransmissionMode *mode) {
    return This->lpVtbl->get_Mode(This,mode);
}
static FORCEINLINE HRESULT IDVBTLocator_put_Mode(IDVBTLocator* This,TransmissionMode mode) {
    return This->lpVtbl->put_Mode(This,mode);
}
static FORCEINLINE HRESULT IDVBTLocator_get_OtherFrequencyInUse(IDVBTLocator* This,VARIANT_BOOL *OtherFrequencyInUseVal) {
    return This->lpVtbl->get_OtherFrequencyInUse(This,OtherFrequencyInUseVal);
}
static FORCEINLINE HRESULT IDVBTLocator_put_OtherFrequencyInUse(IDVBTLocator* This,VARIANT_BOOL OtherFrequencyInUseVal) {
    return This->lpVtbl->put_OtherFrequencyInUse(This,OtherFrequencyInUseVal);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IDVBTLocator_get_Bandwidth_Proxy(
    IDVBTLocator* This,
    LONG *BandWidthVal);
void __RPC_STUB IDVBTLocator_get_Bandwidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDVBTLocator_put_Bandwidth_Proxy(
    IDVBTLocator* This,
    LONG BandwidthVal);
void __RPC_STUB IDVBTLocator_put_Bandwidth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDVBTLocator_get_LPInnerFEC_Proxy(
    IDVBTLocator* This,
    FECMethod *FEC);
void __RPC_STUB IDVBTLocator_get_LPInnerFEC_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDVBTLocator_put_LPInnerFEC_Proxy(
    IDVBTLocator* This,
    FECMethod FEC);
void __RPC_STUB IDVBTLocator_put_LPInnerFEC_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDVBTLocator_get_LPInnerFECRate_Proxy(
    IDVBTLocator* This,
    BinaryConvolutionCodeRate *FEC);
void __RPC_STUB IDVBTLocator_get_LPInnerFECRate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDVBTLocator_put_LPInnerFECRate_Proxy(
    IDVBTLocator* This,
    BinaryConvolutionCodeRate FEC);
void __RPC_STUB IDVBTLocator_put_LPInnerFECRate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDVBTLocator_get_HAlpha_Proxy(
    IDVBTLocator* This,
    HierarchyAlpha *Alpha);
void __RPC_STUB IDVBTLocator_get_HAlpha_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDVBTLocator_put_HAlpha_Proxy(
    IDVBTLocator* This,
    HierarchyAlpha Alpha);
void __RPC_STUB IDVBTLocator_put_HAlpha_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDVBTLocator_get_Guard_Proxy(
    IDVBTLocator* This,
    GuardInterval *GI);
void __RPC_STUB IDVBTLocator_get_Guard_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDVBTLocator_put_Guard_Proxy(
    IDVBTLocator* This,
    GuardInterval GI);
void __RPC_STUB IDVBTLocator_put_Guard_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDVBTLocator_get_Mode_Proxy(
    IDVBTLocator* This,
    TransmissionMode *mode);
void __RPC_STUB IDVBTLocator_get_Mode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDVBTLocator_put_Mode_Proxy(
    IDVBTLocator* This,
    TransmissionMode mode);
void __RPC_STUB IDVBTLocator_put_Mode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDVBTLocator_get_OtherFrequencyInUse_Proxy(
    IDVBTLocator* This,
    VARIANT_BOOL *OtherFrequencyInUseVal);
void __RPC_STUB IDVBTLocator_get_OtherFrequencyInUse_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDVBTLocator_put_OtherFrequencyInUse_Proxy(
    IDVBTLocator* This,
    VARIANT_BOOL OtherFrequencyInUseVal);
void __RPC_STUB IDVBTLocator_put_OtherFrequencyInUse_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IDVBTLocator_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDVBTLocator2 interface
 */
#ifndef __IDVBTLocator2_INTERFACE_DEFINED__
#define __IDVBTLocator2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDVBTLocator2, 0x448a2edf, 0xae95, 0x4b43, 0xa3,0xcc, 0x74,0x78,0x43,0xc4,0x53,0xd4);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("448a2edf-ae95-4b43-a3cc-747843c453d4")
IDVBTLocator2 : public IDVBTLocator
{
    virtual HRESULT STDMETHODCALLTYPE get_PhysicalLayerPipeId(
        LONG *PhysicalLayerPipeIdVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_PhysicalLayerPipeId(
        LONG PhysicalLayerPipeIdVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDVBTLocator2, 0x448a2edf, 0xae95, 0x4b43, 0xa3,0xcc, 0x74,0x78,0x43,0xc4,0x53,0xd4)
#endif
#else
typedef struct IDVBTLocator2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IDVBTLocator2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IDVBTLocator2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IDVBTLocator2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IDVBTLocator2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ILocator methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CarrierFrequency)(
        IDVBTLocator2* This,
        LONG *Frequency);

    HRESULT (STDMETHODCALLTYPE *put_CarrierFrequency)(
        IDVBTLocator2* This,
        LONG Frequency);

    HRESULT (STDMETHODCALLTYPE *get_InnerFEC)(
        IDVBTLocator2* This,
        FECMethod *FEC);

    HRESULT (STDMETHODCALLTYPE *put_InnerFEC)(
        IDVBTLocator2* This,
        FECMethod FEC);

    HRESULT (STDMETHODCALLTYPE *get_InnerFECRate)(
        IDVBTLocator2* This,
        BinaryConvolutionCodeRate *FEC);

    HRESULT (STDMETHODCALLTYPE *put_InnerFECRate)(
        IDVBTLocator2* This,
        BinaryConvolutionCodeRate FEC);

    HRESULT (STDMETHODCALLTYPE *get_OuterFEC)(
        IDVBTLocator2* This,
        FECMethod *FEC);

    HRESULT (STDMETHODCALLTYPE *put_OuterFEC)(
        IDVBTLocator2* This,
        FECMethod FEC);

    HRESULT (STDMETHODCALLTYPE *get_OuterFECRate)(
        IDVBTLocator2* This,
        BinaryConvolutionCodeRate *FEC);

    HRESULT (STDMETHODCALLTYPE *put_OuterFECRate)(
        IDVBTLocator2* This,
        BinaryConvolutionCodeRate FEC);

    HRESULT (STDMETHODCALLTYPE *get_Modulation)(
        IDVBTLocator2* This,
        ModulationType *Modulation);

    HRESULT (STDMETHODCALLTYPE *put_Modulation)(
        IDVBTLocator2* This,
        ModulationType Modulation);

    HRESULT (STDMETHODCALLTYPE *get_SymbolRate)(
        IDVBTLocator2* This,
        LONG *Rate);

    HRESULT (STDMETHODCALLTYPE *put_SymbolRate)(
        IDVBTLocator2* This,
        LONG Rate);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IDVBTLocator2* This,
        ILocator **NewLocator);

    /*** IDVBTLocator methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Bandwidth)(
        IDVBTLocator2* This,
        LONG *BandWidthVal);

    HRESULT (STDMETHODCALLTYPE *put_Bandwidth)(
        IDVBTLocator2* This,
        LONG BandwidthVal);

    HRESULT (STDMETHODCALLTYPE *get_LPInnerFEC)(
        IDVBTLocator2* This,
        FECMethod *FEC);

    HRESULT (STDMETHODCALLTYPE *put_LPInnerFEC)(
        IDVBTLocator2* This,
        FECMethod FEC);

    HRESULT (STDMETHODCALLTYPE *get_LPInnerFECRate)(
        IDVBTLocator2* This,
        BinaryConvolutionCodeRate *FEC);

    HRESULT (STDMETHODCALLTYPE *put_LPInnerFECRate)(
        IDVBTLocator2* This,
        BinaryConvolutionCodeRate FEC);

    HRESULT (STDMETHODCALLTYPE *get_HAlpha)(
        IDVBTLocator2* This,
        HierarchyAlpha *Alpha);

    HRESULT (STDMETHODCALLTYPE *put_HAlpha)(
        IDVBTLocator2* This,
        HierarchyAlpha Alpha);

    HRESULT (STDMETHODCALLTYPE *get_Guard)(
        IDVBTLocator2* This,
        GuardInterval *GI);

    HRESULT (STDMETHODCALLTYPE *put_Guard)(
        IDVBTLocator2* This,
        GuardInterval GI);

    HRESULT (STDMETHODCALLTYPE *get_Mode)(
        IDVBTLocator2* This,
        TransmissionMode *mode);

    HRESULT (STDMETHODCALLTYPE *put_Mode)(
        IDVBTLocator2* This,
        TransmissionMode mode);

    HRESULT (STDMETHODCALLTYPE *get_OtherFrequencyInUse)(
        IDVBTLocator2* This,
        VARIANT_BOOL *OtherFrequencyInUseVal);

    HRESULT (STDMETHODCALLTYPE *put_OtherFrequencyInUse)(
        IDVBTLocator2* This,
        VARIANT_BOOL OtherFrequencyInUseVal);

    /*** IDVBTLocator2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_PhysicalLayerPipeId)(
        IDVBTLocator2* This,
        LONG *PhysicalLayerPipeIdVal);

    HRESULT (STDMETHODCALLTYPE *put_PhysicalLayerPipeId)(
        IDVBTLocator2* This,
        LONG PhysicalLayerPipeIdVal);

    END_INTERFACE
} IDVBTLocator2Vtbl;
interface IDVBTLocator2 {
    CONST_VTBL IDVBTLocator2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDVBTLocator2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDVBTLocator2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDVBTLocator2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IDVBTLocator2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IDVBTLocator2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IDVBTLocator2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IDVBTLocator2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ILocator methods ***/
#define IDVBTLocator2_get_CarrierFrequency(This,Frequency) (This)->lpVtbl->get_CarrierFrequency(This,Frequency)
#define IDVBTLocator2_put_CarrierFrequency(This,Frequency) (This)->lpVtbl->put_CarrierFrequency(This,Frequency)
#define IDVBTLocator2_get_InnerFEC(This,FEC) (This)->lpVtbl->get_InnerFEC(This,FEC)
#define IDVBTLocator2_put_InnerFEC(This,FEC) (This)->lpVtbl->put_InnerFEC(This,FEC)
#define IDVBTLocator2_get_InnerFECRate(This,FEC) (This)->lpVtbl->get_InnerFECRate(This,FEC)
#define IDVBTLocator2_put_InnerFECRate(This,FEC) (This)->lpVtbl->put_InnerFECRate(This,FEC)
#define IDVBTLocator2_get_OuterFEC(This,FEC) (This)->lpVtbl->get_OuterFEC(This,FEC)
#define IDVBTLocator2_put_OuterFEC(This,FEC) (This)->lpVtbl->put_OuterFEC(This,FEC)
#define IDVBTLocator2_get_OuterFECRate(This,FEC) (This)->lpVtbl->get_OuterFECRate(This,FEC)
#define IDVBTLocator2_put_OuterFECRate(This,FEC) (This)->lpVtbl->put_OuterFECRate(This,FEC)
#define IDVBTLocator2_get_Modulation(This,Modulation) (This)->lpVtbl->get_Modulation(This,Modulation)
#define IDVBTLocator2_put_Modulation(This,Modulation) (This)->lpVtbl->put_Modulation(This,Modulation)
#define IDVBTLocator2_get_SymbolRate(This,Rate) (This)->lpVtbl->get_SymbolRate(This,Rate)
#define IDVBTLocator2_put_SymbolRate(This,Rate) (This)->lpVtbl->put_SymbolRate(This,Rate)
#define IDVBTLocator2_Clone(This,NewLocator) (This)->lpVtbl->Clone(This,NewLocator)
/*** IDVBTLocator methods ***/
#define IDVBTLocator2_get_Bandwidth(This,BandWidthVal) (This)->lpVtbl->get_Bandwidth(This,BandWidthVal)
#define IDVBTLocator2_put_Bandwidth(This,BandwidthVal) (This)->lpVtbl->put_Bandwidth(This,BandwidthVal)
#define IDVBTLocator2_get_LPInnerFEC(This,FEC) (This)->lpVtbl->get_LPInnerFEC(This,FEC)
#define IDVBTLocator2_put_LPInnerFEC(This,FEC) (This)->lpVtbl->put_LPInnerFEC(This,FEC)
#define IDVBTLocator2_get_LPInnerFECRate(This,FEC) (This)->lpVtbl->get_LPInnerFECRate(This,FEC)
#define IDVBTLocator2_put_LPInnerFECRate(This,FEC) (This)->lpVtbl->put_LPInnerFECRate(This,FEC)
#define IDVBTLocator2_get_HAlpha(This,Alpha) (This)->lpVtbl->get_HAlpha(This,Alpha)
#define IDVBTLocator2_put_HAlpha(This,Alpha) (This)->lpVtbl->put_HAlpha(This,Alpha)
#define IDVBTLocator2_get_Guard(This,GI) (This)->lpVtbl->get_Guard(This,GI)
#define IDVBTLocator2_put_Guard(This,GI) (This)->lpVtbl->put_Guard(This,GI)
#define IDVBTLocator2_get_Mode(This,mode) (This)->lpVtbl->get_Mode(This,mode)
#define IDVBTLocator2_put_Mode(This,mode) (This)->lpVtbl->put_Mode(This,mode)
#define IDVBTLocator2_get_OtherFrequencyInUse(This,OtherFrequencyInUseVal) (This)->lpVtbl->get_OtherFrequencyInUse(This,OtherFrequencyInUseVal)
#define IDVBTLocator2_put_OtherFrequencyInUse(This,OtherFrequencyInUseVal) (This)->lpVtbl->put_OtherFrequencyInUse(This,OtherFrequencyInUseVal)
/*** IDVBTLocator2 methods ***/
#define IDVBTLocator2_get_PhysicalLayerPipeId(This,PhysicalLayerPipeIdVal) (This)->lpVtbl->get_PhysicalLayerPipeId(This,PhysicalLayerPipeIdVal)
#define IDVBTLocator2_put_PhysicalLayerPipeId(This,PhysicalLayerPipeIdVal) (This)->lpVtbl->put_PhysicalLayerPipeId(This,PhysicalLayerPipeIdVal)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDVBTLocator2_QueryInterface(IDVBTLocator2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDVBTLocator2_AddRef(IDVBTLocator2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDVBTLocator2_Release(IDVBTLocator2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IDVBTLocator2_GetTypeInfoCount(IDVBTLocator2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IDVBTLocator2_GetTypeInfo(IDVBTLocator2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IDVBTLocator2_GetIDsOfNames(IDVBTLocator2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IDVBTLocator2_Invoke(IDVBTLocator2* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ILocator methods ***/
static FORCEINLINE HRESULT IDVBTLocator2_get_CarrierFrequency(IDVBTLocator2* This,LONG *Frequency) {
    return This->lpVtbl->get_CarrierFrequency(This,Frequency);
}
static FORCEINLINE HRESULT IDVBTLocator2_put_CarrierFrequency(IDVBTLocator2* This,LONG Frequency) {
    return This->lpVtbl->put_CarrierFrequency(This,Frequency);
}
static FORCEINLINE HRESULT IDVBTLocator2_get_InnerFEC(IDVBTLocator2* This,FECMethod *FEC) {
    return This->lpVtbl->get_InnerFEC(This,FEC);
}
static FORCEINLINE HRESULT IDVBTLocator2_put_InnerFEC(IDVBTLocator2* This,FECMethod FEC) {
    return This->lpVtbl->put_InnerFEC(This,FEC);
}
static FORCEINLINE HRESULT IDVBTLocator2_get_InnerFECRate(IDVBTLocator2* This,BinaryConvolutionCodeRate *FEC) {
    return This->lpVtbl->get_InnerFECRate(This,FEC);
}
static FORCEINLINE HRESULT IDVBTLocator2_put_InnerFECRate(IDVBTLocator2* This,BinaryConvolutionCodeRate FEC) {
    return This->lpVtbl->put_InnerFECRate(This,FEC);
}
static FORCEINLINE HRESULT IDVBTLocator2_get_OuterFEC(IDVBTLocator2* This,FECMethod *FEC) {
    return This->lpVtbl->get_OuterFEC(This,FEC);
}
static FORCEINLINE HRESULT IDVBTLocator2_put_OuterFEC(IDVBTLocator2* This,FECMethod FEC) {
    return This->lpVtbl->put_OuterFEC(This,FEC);
}
static FORCEINLINE HRESULT IDVBTLocator2_get_OuterFECRate(IDVBTLocator2* This,BinaryConvolutionCodeRate *FEC) {
    return This->lpVtbl->get_OuterFECRate(This,FEC);
}
static FORCEINLINE HRESULT IDVBTLocator2_put_OuterFECRate(IDVBTLocator2* This,BinaryConvolutionCodeRate FEC) {
    return This->lpVtbl->put_OuterFECRate(This,FEC);
}
static FORCEINLINE HRESULT IDVBTLocator2_get_Modulation(IDVBTLocator2* This,ModulationType *Modulation) {
    return This->lpVtbl->get_Modulation(This,Modulation);
}
static FORCEINLINE HRESULT IDVBTLocator2_put_Modulation(IDVBTLocator2* This,ModulationType Modulation) {
    return This->lpVtbl->put_Modulation(This,Modulation);
}
static FORCEINLINE HRESULT IDVBTLocator2_get_SymbolRate(IDVBTLocator2* This,LONG *Rate) {
    return This->lpVtbl->get_SymbolRate(This,Rate);
}
static FORCEINLINE HRESULT IDVBTLocator2_put_SymbolRate(IDVBTLocator2* This,LONG Rate) {
    return This->lpVtbl->put_SymbolRate(This,Rate);
}
static FORCEINLINE HRESULT IDVBTLocator2_Clone(IDVBTLocator2* This,ILocator **NewLocator) {
    return This->lpVtbl->Clone(This,NewLocator);
}
/*** IDVBTLocator methods ***/
static FORCEINLINE HRESULT IDVBTLocator2_get_Bandwidth(IDVBTLocator2* This,LONG *BandWidthVal) {
    return This->lpVtbl->get_Bandwidth(This,BandWidthVal);
}
static FORCEINLINE HRESULT IDVBTLocator2_put_Bandwidth(IDVBTLocator2* This,LONG BandwidthVal) {
    return This->lpVtbl->put_Bandwidth(This,BandwidthVal);
}
static FORCEINLINE HRESULT IDVBTLocator2_get_LPInnerFEC(IDVBTLocator2* This,FECMethod *FEC) {
    return This->lpVtbl->get_LPInnerFEC(This,FEC);
}
static FORCEINLINE HRESULT IDVBTLocator2_put_LPInnerFEC(IDVBTLocator2* This,FECMethod FEC) {
    return This->lpVtbl->put_LPInnerFEC(This,FEC);
}
static FORCEINLINE HRESULT IDVBTLocator2_get_LPInnerFECRate(IDVBTLocator2* This,BinaryConvolutionCodeRate *FEC) {
    return This->lpVtbl->get_LPInnerFECRate(This,FEC);
}
static FORCEINLINE HRESULT IDVBTLocator2_put_LPInnerFECRate(IDVBTLocator2* This,BinaryConvolutionCodeRate FEC) {
    return This->lpVtbl->put_LPInnerFECRate(This,FEC);
}
static FORCEINLINE HRESULT IDVBTLocator2_get_HAlpha(IDVBTLocator2* This,HierarchyAlpha *Alpha) {
    return This->lpVtbl->get_HAlpha(This,Alpha);
}
static FORCEINLINE HRESULT IDVBTLocator2_put_HAlpha(IDVBTLocator2* This,HierarchyAlpha Alpha) {
    return This->lpVtbl->put_HAlpha(This,Alpha);
}
static FORCEINLINE HRESULT IDVBTLocator2_get_Guard(IDVBTLocator2* This,GuardInterval *GI) {
    return This->lpVtbl->get_Guard(This,GI);
}
static FORCEINLINE HRESULT IDVBTLocator2_put_Guard(IDVBTLocator2* This,GuardInterval GI) {
    return This->lpVtbl->put_Guard(This,GI);
}
static FORCEINLINE HRESULT IDVBTLocator2_get_Mode(IDVBTLocator2* This,TransmissionMode *mode) {
    return This->lpVtbl->get_Mode(This,mode);
}
static FORCEINLINE HRESULT IDVBTLocator2_put_Mode(IDVBTLocator2* This,TransmissionMode mode) {
    return This->lpVtbl->put_Mode(This,mode);
}
static FORCEINLINE HRESULT IDVBTLocator2_get_OtherFrequencyInUse(IDVBTLocator2* This,VARIANT_BOOL *OtherFrequencyInUseVal) {
    return This->lpVtbl->get_OtherFrequencyInUse(This,OtherFrequencyInUseVal);
}
static FORCEINLINE HRESULT IDVBTLocator2_put_OtherFrequencyInUse(IDVBTLocator2* This,VARIANT_BOOL OtherFrequencyInUseVal) {
    return This->lpVtbl->put_OtherFrequencyInUse(This,OtherFrequencyInUseVal);
}
/*** IDVBTLocator2 methods ***/
static FORCEINLINE HRESULT IDVBTLocator2_get_PhysicalLayerPipeId(IDVBTLocator2* This,LONG *PhysicalLayerPipeIdVal) {
    return This->lpVtbl->get_PhysicalLayerPipeId(This,PhysicalLayerPipeIdVal);
}
static FORCEINLINE HRESULT IDVBTLocator2_put_PhysicalLayerPipeId(IDVBTLocator2* This,LONG PhysicalLayerPipeIdVal) {
    return This->lpVtbl->put_PhysicalLayerPipeId(This,PhysicalLayerPipeIdVal);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IDVBTLocator2_get_PhysicalLayerPipeId_Proxy(
    IDVBTLocator2* This,
    LONG *PhysicalLayerPipeIdVal);
void __RPC_STUB IDVBTLocator2_get_PhysicalLayerPipeId_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDVBTLocator2_put_PhysicalLayerPipeId_Proxy(
    IDVBTLocator2* This,
    LONG PhysicalLayerPipeIdVal);
void __RPC_STUB IDVBTLocator2_put_PhysicalLayerPipeId_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IDVBTLocator2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDVBSLocator interface
 */
#ifndef __IDVBSLocator_INTERFACE_DEFINED__
#define __IDVBSLocator_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDVBSLocator, 0x3d7c353c, 0x0d04, 0x45f1, 0xa7,0x42, 0xf9,0x7c,0xc1,0x18,0x8d,0xc8);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3d7c353c-0d04-45f1-a742-f97cc1188dc8")
IDVBSLocator : public IDigitalLocator
{
    virtual HRESULT STDMETHODCALLTYPE get_SignalPolarisation(
        Polarisation *PolarisationVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_SignalPolarisation(
        Polarisation PolarisationVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_WestPosition(
        VARIANT_BOOL *WestLongitude) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_WestPosition(
        VARIANT_BOOL WestLongitude) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_OrbitalPosition(
        LONG *longitude) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_OrbitalPosition(
        LONG longitude) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Azimuth(
        LONG *Azimuth) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Azimuth(
        LONG Azimuth) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Elevation(
        LONG *Elevation) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Elevation(
        LONG Elevation) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDVBSLocator, 0x3d7c353c, 0x0d04, 0x45f1, 0xa7,0x42, 0xf9,0x7c,0xc1,0x18,0x8d,0xc8)
#endif
#else
typedef struct IDVBSLocatorVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IDVBSLocator* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IDVBSLocator* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IDVBSLocator* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IDVBSLocator* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ILocator methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CarrierFrequency)(
        IDVBSLocator* This,
        LONG *Frequency);

    HRESULT (STDMETHODCALLTYPE *put_CarrierFrequency)(
        IDVBSLocator* This,
        LONG Frequency);

    HRESULT (STDMETHODCALLTYPE *get_InnerFEC)(
        IDVBSLocator* This,
        FECMethod *FEC);

    HRESULT (STDMETHODCALLTYPE *put_InnerFEC)(
        IDVBSLocator* This,
        FECMethod FEC);

    HRESULT (STDMETHODCALLTYPE *get_InnerFECRate)(
        IDVBSLocator* This,
        BinaryConvolutionCodeRate *FEC);

    HRESULT (STDMETHODCALLTYPE *put_InnerFECRate)(
        IDVBSLocator* This,
        BinaryConvolutionCodeRate FEC);

    HRESULT (STDMETHODCALLTYPE *get_OuterFEC)(
        IDVBSLocator* This,
        FECMethod *FEC);

    HRESULT (STDMETHODCALLTYPE *put_OuterFEC)(
        IDVBSLocator* This,
        FECMethod FEC);

    HRESULT (STDMETHODCALLTYPE *get_OuterFECRate)(
        IDVBSLocator* This,
        BinaryConvolutionCodeRate *FEC);

    HRESULT (STDMETHODCALLTYPE *put_OuterFECRate)(
        IDVBSLocator* This,
        BinaryConvolutionCodeRate FEC);

    HRESULT (STDMETHODCALLTYPE *get_Modulation)(
        IDVBSLocator* This,
        ModulationType *Modulation);

    HRESULT (STDMETHODCALLTYPE *put_Modulation)(
        IDVBSLocator* This,
        ModulationType Modulation);

    HRESULT (STDMETHODCALLTYPE *get_SymbolRate)(
        IDVBSLocator* This,
        LONG *Rate);

    HRESULT (STDMETHODCALLTYPE *put_SymbolRate)(
        IDVBSLocator* This,
        LONG Rate);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IDVBSLocator* This,
        ILocator **NewLocator);

    /*** IDVBSLocator methods ***/
    HRESULT (STDMETHODCALLTYPE *get_SignalPolarisation)(
        IDVBSLocator* This,
        Polarisation *PolarisationVal);

    HRESULT (STDMETHODCALLTYPE *put_SignalPolarisation)(
        IDVBSLocator* This,
        Polarisation PolarisationVal);

    HRESULT (STDMETHODCALLTYPE *get_WestPosition)(
        IDVBSLocator* This,
        VARIANT_BOOL *WestLongitude);

    HRESULT (STDMETHODCALLTYPE *put_WestPosition)(
        IDVBSLocator* This,
        VARIANT_BOOL WestLongitude);

    HRESULT (STDMETHODCALLTYPE *get_OrbitalPosition)(
        IDVBSLocator* This,
        LONG *longitude);

    HRESULT (STDMETHODCALLTYPE *put_OrbitalPosition)(
        IDVBSLocator* This,
        LONG longitude);

    HRESULT (STDMETHODCALLTYPE *get_Azimuth)(
        IDVBSLocator* This,
        LONG *Azimuth);

    HRESULT (STDMETHODCALLTYPE *put_Azimuth)(
        IDVBSLocator* This,
        LONG Azimuth);

    HRESULT (STDMETHODCALLTYPE *get_Elevation)(
        IDVBSLocator* This,
        LONG *Elevation);

    HRESULT (STDMETHODCALLTYPE *put_Elevation)(
        IDVBSLocator* This,
        LONG Elevation);

    END_INTERFACE
} IDVBSLocatorVtbl;
interface IDVBSLocator {
    CONST_VTBL IDVBSLocatorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDVBSLocator_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDVBSLocator_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDVBSLocator_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IDVBSLocator_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IDVBSLocator_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IDVBSLocator_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IDVBSLocator_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ILocator methods ***/
#define IDVBSLocator_get_CarrierFrequency(This,Frequency) (This)->lpVtbl->get_CarrierFrequency(This,Frequency)
#define IDVBSLocator_put_CarrierFrequency(This,Frequency) (This)->lpVtbl->put_CarrierFrequency(This,Frequency)
#define IDVBSLocator_get_InnerFEC(This,FEC) (This)->lpVtbl->get_InnerFEC(This,FEC)
#define IDVBSLocator_put_InnerFEC(This,FEC) (This)->lpVtbl->put_InnerFEC(This,FEC)
#define IDVBSLocator_get_InnerFECRate(This,FEC) (This)->lpVtbl->get_InnerFECRate(This,FEC)
#define IDVBSLocator_put_InnerFECRate(This,FEC) (This)->lpVtbl->put_InnerFECRate(This,FEC)
#define IDVBSLocator_get_OuterFEC(This,FEC) (This)->lpVtbl->get_OuterFEC(This,FEC)
#define IDVBSLocator_put_OuterFEC(This,FEC) (This)->lpVtbl->put_OuterFEC(This,FEC)
#define IDVBSLocator_get_OuterFECRate(This,FEC) (This)->lpVtbl->get_OuterFECRate(This,FEC)
#define IDVBSLocator_put_OuterFECRate(This,FEC) (This)->lpVtbl->put_OuterFECRate(This,FEC)
#define IDVBSLocator_get_Modulation(This,Modulation) (This)->lpVtbl->get_Modulation(This,Modulation)
#define IDVBSLocator_put_Modulation(This,Modulation) (This)->lpVtbl->put_Modulation(This,Modulation)
#define IDVBSLocator_get_SymbolRate(This,Rate) (This)->lpVtbl->get_SymbolRate(This,Rate)
#define IDVBSLocator_put_SymbolRate(This,Rate) (This)->lpVtbl->put_SymbolRate(This,Rate)
#define IDVBSLocator_Clone(This,NewLocator) (This)->lpVtbl->Clone(This,NewLocator)
/*** IDVBSLocator methods ***/
#define IDVBSLocator_get_SignalPolarisation(This,PolarisationVal) (This)->lpVtbl->get_SignalPolarisation(This,PolarisationVal)
#define IDVBSLocator_put_SignalPolarisation(This,PolarisationVal) (This)->lpVtbl->put_SignalPolarisation(This,PolarisationVal)
#define IDVBSLocator_get_WestPosition(This,WestLongitude) (This)->lpVtbl->get_WestPosition(This,WestLongitude)
#define IDVBSLocator_put_WestPosition(This,WestLongitude) (This)->lpVtbl->put_WestPosition(This,WestLongitude)
#define IDVBSLocator_get_OrbitalPosition(This,longitude) (This)->lpVtbl->get_OrbitalPosition(This,longitude)
#define IDVBSLocator_put_OrbitalPosition(This,longitude) (This)->lpVtbl->put_OrbitalPosition(This,longitude)
#define IDVBSLocator_get_Azimuth(This,Azimuth) (This)->lpVtbl->get_Azimuth(This,Azimuth)
#define IDVBSLocator_put_Azimuth(This,Azimuth) (This)->lpVtbl->put_Azimuth(This,Azimuth)
#define IDVBSLocator_get_Elevation(This,Elevation) (This)->lpVtbl->get_Elevation(This,Elevation)
#define IDVBSLocator_put_Elevation(This,Elevation) (This)->lpVtbl->put_Elevation(This,Elevation)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDVBSLocator_QueryInterface(IDVBSLocator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDVBSLocator_AddRef(IDVBSLocator* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDVBSLocator_Release(IDVBSLocator* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IDVBSLocator_GetTypeInfoCount(IDVBSLocator* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IDVBSLocator_GetTypeInfo(IDVBSLocator* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IDVBSLocator_GetIDsOfNames(IDVBSLocator* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IDVBSLocator_Invoke(IDVBSLocator* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ILocator methods ***/
static FORCEINLINE HRESULT IDVBSLocator_get_CarrierFrequency(IDVBSLocator* This,LONG *Frequency) {
    return This->lpVtbl->get_CarrierFrequency(This,Frequency);
}
static FORCEINLINE HRESULT IDVBSLocator_put_CarrierFrequency(IDVBSLocator* This,LONG Frequency) {
    return This->lpVtbl->put_CarrierFrequency(This,Frequency);
}
static FORCEINLINE HRESULT IDVBSLocator_get_InnerFEC(IDVBSLocator* This,FECMethod *FEC) {
    return This->lpVtbl->get_InnerFEC(This,FEC);
}
static FORCEINLINE HRESULT IDVBSLocator_put_InnerFEC(IDVBSLocator* This,FECMethod FEC) {
    return This->lpVtbl->put_InnerFEC(This,FEC);
}
static FORCEINLINE HRESULT IDVBSLocator_get_InnerFECRate(IDVBSLocator* This,BinaryConvolutionCodeRate *FEC) {
    return This->lpVtbl->get_InnerFECRate(This,FEC);
}
static FORCEINLINE HRESULT IDVBSLocator_put_InnerFECRate(IDVBSLocator* This,BinaryConvolutionCodeRate FEC) {
    return This->lpVtbl->put_InnerFECRate(This,FEC);
}
static FORCEINLINE HRESULT IDVBSLocator_get_OuterFEC(IDVBSLocator* This,FECMethod *FEC) {
    return This->lpVtbl->get_OuterFEC(This,FEC);
}
static FORCEINLINE HRESULT IDVBSLocator_put_OuterFEC(IDVBSLocator* This,FECMethod FEC) {
    return This->lpVtbl->put_OuterFEC(This,FEC);
}
static FORCEINLINE HRESULT IDVBSLocator_get_OuterFECRate(IDVBSLocator* This,BinaryConvolutionCodeRate *FEC) {
    return This->lpVtbl->get_OuterFECRate(This,FEC);
}
static FORCEINLINE HRESULT IDVBSLocator_put_OuterFECRate(IDVBSLocator* This,BinaryConvolutionCodeRate FEC) {
    return This->lpVtbl->put_OuterFECRate(This,FEC);
}
static FORCEINLINE HRESULT IDVBSLocator_get_Modulation(IDVBSLocator* This,ModulationType *Modulation) {
    return This->lpVtbl->get_Modulation(This,Modulation);
}
static FORCEINLINE HRESULT IDVBSLocator_put_Modulation(IDVBSLocator* This,ModulationType Modulation) {
    return This->lpVtbl->put_Modulation(This,Modulation);
}
static FORCEINLINE HRESULT IDVBSLocator_get_SymbolRate(IDVBSLocator* This,LONG *Rate) {
    return This->lpVtbl->get_SymbolRate(This,Rate);
}
static FORCEINLINE HRESULT IDVBSLocator_put_SymbolRate(IDVBSLocator* This,LONG Rate) {
    return This->lpVtbl->put_SymbolRate(This,Rate);
}
static FORCEINLINE HRESULT IDVBSLocator_Clone(IDVBSLocator* This,ILocator **NewLocator) {
    return This->lpVtbl->Clone(This,NewLocator);
}
/*** IDVBSLocator methods ***/
static FORCEINLINE HRESULT IDVBSLocator_get_SignalPolarisation(IDVBSLocator* This,Polarisation *PolarisationVal) {
    return This->lpVtbl->get_SignalPolarisation(This,PolarisationVal);
}
static FORCEINLINE HRESULT IDVBSLocator_put_SignalPolarisation(IDVBSLocator* This,Polarisation PolarisationVal) {
    return This->lpVtbl->put_SignalPolarisation(This,PolarisationVal);
}
static FORCEINLINE HRESULT IDVBSLocator_get_WestPosition(IDVBSLocator* This,VARIANT_BOOL *WestLongitude) {
    return This->lpVtbl->get_WestPosition(This,WestLongitude);
}
static FORCEINLINE HRESULT IDVBSLocator_put_WestPosition(IDVBSLocator* This,VARIANT_BOOL WestLongitude) {
    return This->lpVtbl->put_WestPosition(This,WestLongitude);
}
static FORCEINLINE HRESULT IDVBSLocator_get_OrbitalPosition(IDVBSLocator* This,LONG *longitude) {
    return This->lpVtbl->get_OrbitalPosition(This,longitude);
}
static FORCEINLINE HRESULT IDVBSLocator_put_OrbitalPosition(IDVBSLocator* This,LONG longitude) {
    return This->lpVtbl->put_OrbitalPosition(This,longitude);
}
static FORCEINLINE HRESULT IDVBSLocator_get_Azimuth(IDVBSLocator* This,LONG *Azimuth) {
    return This->lpVtbl->get_Azimuth(This,Azimuth);
}
static FORCEINLINE HRESULT IDVBSLocator_put_Azimuth(IDVBSLocator* This,LONG Azimuth) {
    return This->lpVtbl->put_Azimuth(This,Azimuth);
}
static FORCEINLINE HRESULT IDVBSLocator_get_Elevation(IDVBSLocator* This,LONG *Elevation) {
    return This->lpVtbl->get_Elevation(This,Elevation);
}
static FORCEINLINE HRESULT IDVBSLocator_put_Elevation(IDVBSLocator* This,LONG Elevation) {
    return This->lpVtbl->put_Elevation(This,Elevation);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IDVBSLocator_get_SignalPolarisation_Proxy(
    IDVBSLocator* This,
    Polarisation *PolarisationVal);
void __RPC_STUB IDVBSLocator_get_SignalPolarisation_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDVBSLocator_put_SignalPolarisation_Proxy(
    IDVBSLocator* This,
    Polarisation PolarisationVal);
void __RPC_STUB IDVBSLocator_put_SignalPolarisation_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDVBSLocator_get_WestPosition_Proxy(
    IDVBSLocator* This,
    VARIANT_BOOL *WestLongitude);
void __RPC_STUB IDVBSLocator_get_WestPosition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDVBSLocator_put_WestPosition_Proxy(
    IDVBSLocator* This,
    VARIANT_BOOL WestLongitude);
void __RPC_STUB IDVBSLocator_put_WestPosition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDVBSLocator_get_OrbitalPosition_Proxy(
    IDVBSLocator* This,
    LONG *longitude);
void __RPC_STUB IDVBSLocator_get_OrbitalPosition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDVBSLocator_put_OrbitalPosition_Proxy(
    IDVBSLocator* This,
    LONG longitude);
void __RPC_STUB IDVBSLocator_put_OrbitalPosition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDVBSLocator_get_Azimuth_Proxy(
    IDVBSLocator* This,
    LONG *Azimuth);
void __RPC_STUB IDVBSLocator_get_Azimuth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDVBSLocator_put_Azimuth_Proxy(
    IDVBSLocator* This,
    LONG Azimuth);
void __RPC_STUB IDVBSLocator_put_Azimuth_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDVBSLocator_get_Elevation_Proxy(
    IDVBSLocator* This,
    LONG *Elevation);
void __RPC_STUB IDVBSLocator_get_Elevation_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDVBSLocator_put_Elevation_Proxy(
    IDVBSLocator* This,
    LONG Elevation);
void __RPC_STUB IDVBSLocator_put_Elevation_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IDVBSLocator_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDVBSLocator2 interface
 */
#ifndef __IDVBSLocator2_INTERFACE_DEFINED__
#define __IDVBSLocator2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDVBSLocator2, 0x6044634a, 0x1733, 0x4f99, 0xb9,0x82, 0x5f,0xb1,0x2a,0xfc,0xe4,0xf0);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("6044634a-1733-4f99-b982-5fb12afce4f0")
IDVBSLocator2 : public IDVBSLocator
{
    virtual HRESULT STDMETHODCALLTYPE get_DiseqLNBSource(
        LNB_Source *DiseqLNBSourceVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_DiseqLNBSource(
        LNB_Source DiseqLNBSourceVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_LocalOscillatorOverrideLow(
        LONG *LocalOscillatorOverrideLowVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_LocalOscillatorOverrideLow(
        LONG LocalOscillatorOverrideLowVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_LocalOscillatorOverrideHigh(
        LONG *LocalOscillatorOverrideHighVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_LocalOscillatorOverrideHigh(
        LONG LocalOscillatorOverrideHighVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_LocalLNBSwitchOverride(
        LONG *LocalLNBSwitchOverrideVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_LocalLNBSwitchOverride(
        LONG LocalLNBSwitchOverrideVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_LocalSpectralInversionOverride(
        SpectralInversion *LocalSpectralInversionOverrideVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_LocalSpectralInversionOverride(
        SpectralInversion LocalSpectralInversionOverrideVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_SignalRollOff(
        RollOff *RollOffVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_SignalRollOff(
        RollOff RollOffVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_SignalPilot(
        Pilot *PilotVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_SignalPilot(
        Pilot PilotVal) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDVBSLocator2, 0x6044634a, 0x1733, 0x4f99, 0xb9,0x82, 0x5f,0xb1,0x2a,0xfc,0xe4,0xf0)
#endif
#else
typedef struct IDVBSLocator2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IDVBSLocator2* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IDVBSLocator2* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IDVBSLocator2* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IDVBSLocator2* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ILocator methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CarrierFrequency)(
        IDVBSLocator2* This,
        LONG *Frequency);

    HRESULT (STDMETHODCALLTYPE *put_CarrierFrequency)(
        IDVBSLocator2* This,
        LONG Frequency);

    HRESULT (STDMETHODCALLTYPE *get_InnerFEC)(
        IDVBSLocator2* This,
        FECMethod *FEC);

    HRESULT (STDMETHODCALLTYPE *put_InnerFEC)(
        IDVBSLocator2* This,
        FECMethod FEC);

    HRESULT (STDMETHODCALLTYPE *get_InnerFECRate)(
        IDVBSLocator2* This,
        BinaryConvolutionCodeRate *FEC);

    HRESULT (STDMETHODCALLTYPE *put_InnerFECRate)(
        IDVBSLocator2* This,
        BinaryConvolutionCodeRate FEC);

    HRESULT (STDMETHODCALLTYPE *get_OuterFEC)(
        IDVBSLocator2* This,
        FECMethod *FEC);

    HRESULT (STDMETHODCALLTYPE *put_OuterFEC)(
        IDVBSLocator2* This,
        FECMethod FEC);

    HRESULT (STDMETHODCALLTYPE *get_OuterFECRate)(
        IDVBSLocator2* This,
        BinaryConvolutionCodeRate *FEC);

    HRESULT (STDMETHODCALLTYPE *put_OuterFECRate)(
        IDVBSLocator2* This,
        BinaryConvolutionCodeRate FEC);

    HRESULT (STDMETHODCALLTYPE *get_Modulation)(
        IDVBSLocator2* This,
        ModulationType *Modulation);

    HRESULT (STDMETHODCALLTYPE *put_Modulation)(
        IDVBSLocator2* This,
        ModulationType Modulation);

    HRESULT (STDMETHODCALLTYPE *get_SymbolRate)(
        IDVBSLocator2* This,
        LONG *Rate);

    HRESULT (STDMETHODCALLTYPE *put_SymbolRate)(
        IDVBSLocator2* This,
        LONG Rate);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IDVBSLocator2* This,
        ILocator **NewLocator);

    /*** IDVBSLocator methods ***/
    HRESULT (STDMETHODCALLTYPE *get_SignalPolarisation)(
        IDVBSLocator2* This,
        Polarisation *PolarisationVal);

    HRESULT (STDMETHODCALLTYPE *put_SignalPolarisation)(
        IDVBSLocator2* This,
        Polarisation PolarisationVal);

    HRESULT (STDMETHODCALLTYPE *get_WestPosition)(
        IDVBSLocator2* This,
        VARIANT_BOOL *WestLongitude);

    HRESULT (STDMETHODCALLTYPE *put_WestPosition)(
        IDVBSLocator2* This,
        VARIANT_BOOL WestLongitude);

    HRESULT (STDMETHODCALLTYPE *get_OrbitalPosition)(
        IDVBSLocator2* This,
        LONG *longitude);

    HRESULT (STDMETHODCALLTYPE *put_OrbitalPosition)(
        IDVBSLocator2* This,
        LONG longitude);

    HRESULT (STDMETHODCALLTYPE *get_Azimuth)(
        IDVBSLocator2* This,
        LONG *Azimuth);

    HRESULT (STDMETHODCALLTYPE *put_Azimuth)(
        IDVBSLocator2* This,
        LONG Azimuth);

    HRESULT (STDMETHODCALLTYPE *get_Elevation)(
        IDVBSLocator2* This,
        LONG *Elevation);

    HRESULT (STDMETHODCALLTYPE *put_Elevation)(
        IDVBSLocator2* This,
        LONG Elevation);

    /*** IDVBSLocator2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_DiseqLNBSource)(
        IDVBSLocator2* This,
        LNB_Source *DiseqLNBSourceVal);

    HRESULT (STDMETHODCALLTYPE *put_DiseqLNBSource)(
        IDVBSLocator2* This,
        LNB_Source DiseqLNBSourceVal);

    HRESULT (STDMETHODCALLTYPE *get_LocalOscillatorOverrideLow)(
        IDVBSLocator2* This,
        LONG *LocalOscillatorOverrideLowVal);

    HRESULT (STDMETHODCALLTYPE *put_LocalOscillatorOverrideLow)(
        IDVBSLocator2* This,
        LONG LocalOscillatorOverrideLowVal);

    HRESULT (STDMETHODCALLTYPE *get_LocalOscillatorOverrideHigh)(
        IDVBSLocator2* This,
        LONG *LocalOscillatorOverrideHighVal);

    HRESULT (STDMETHODCALLTYPE *put_LocalOscillatorOverrideHigh)(
        IDVBSLocator2* This,
        LONG LocalOscillatorOverrideHighVal);

    HRESULT (STDMETHODCALLTYPE *get_LocalLNBSwitchOverride)(
        IDVBSLocator2* This,
        LONG *LocalLNBSwitchOverrideVal);

    HRESULT (STDMETHODCALLTYPE *put_LocalLNBSwitchOverride)(
        IDVBSLocator2* This,
        LONG LocalLNBSwitchOverrideVal);

    HRESULT (STDMETHODCALLTYPE *get_LocalSpectralInversionOverride)(
        IDVBSLocator2* This,
        SpectralInversion *LocalSpectralInversionOverrideVal);

    HRESULT (STDMETHODCALLTYPE *put_LocalSpectralInversionOverride)(
        IDVBSLocator2* This,
        SpectralInversion LocalSpectralInversionOverrideVal);

    HRESULT (STDMETHODCALLTYPE *get_SignalRollOff)(
        IDVBSLocator2* This,
        RollOff *RollOffVal);

    HRESULT (STDMETHODCALLTYPE *put_SignalRollOff)(
        IDVBSLocator2* This,
        RollOff RollOffVal);

    HRESULT (STDMETHODCALLTYPE *get_SignalPilot)(
        IDVBSLocator2* This,
        Pilot *PilotVal);

    HRESULT (STDMETHODCALLTYPE *put_SignalPilot)(
        IDVBSLocator2* This,
        Pilot PilotVal);

    END_INTERFACE
} IDVBSLocator2Vtbl;
interface IDVBSLocator2 {
    CONST_VTBL IDVBSLocator2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDVBSLocator2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDVBSLocator2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDVBSLocator2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IDVBSLocator2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IDVBSLocator2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IDVBSLocator2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IDVBSLocator2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ILocator methods ***/
#define IDVBSLocator2_get_CarrierFrequency(This,Frequency) (This)->lpVtbl->get_CarrierFrequency(This,Frequency)
#define IDVBSLocator2_put_CarrierFrequency(This,Frequency) (This)->lpVtbl->put_CarrierFrequency(This,Frequency)
#define IDVBSLocator2_get_InnerFEC(This,FEC) (This)->lpVtbl->get_InnerFEC(This,FEC)
#define IDVBSLocator2_put_InnerFEC(This,FEC) (This)->lpVtbl->put_InnerFEC(This,FEC)
#define IDVBSLocator2_get_InnerFECRate(This,FEC) (This)->lpVtbl->get_InnerFECRate(This,FEC)
#define IDVBSLocator2_put_InnerFECRate(This,FEC) (This)->lpVtbl->put_InnerFECRate(This,FEC)
#define IDVBSLocator2_get_OuterFEC(This,FEC) (This)->lpVtbl->get_OuterFEC(This,FEC)
#define IDVBSLocator2_put_OuterFEC(This,FEC) (This)->lpVtbl->put_OuterFEC(This,FEC)
#define IDVBSLocator2_get_OuterFECRate(This,FEC) (This)->lpVtbl->get_OuterFECRate(This,FEC)
#define IDVBSLocator2_put_OuterFECRate(This,FEC) (This)->lpVtbl->put_OuterFECRate(This,FEC)
#define IDVBSLocator2_get_Modulation(This,Modulation) (This)->lpVtbl->get_Modulation(This,Modulation)
#define IDVBSLocator2_put_Modulation(This,Modulation) (This)->lpVtbl->put_Modulation(This,Modulation)
#define IDVBSLocator2_get_SymbolRate(This,Rate) (This)->lpVtbl->get_SymbolRate(This,Rate)
#define IDVBSLocator2_put_SymbolRate(This,Rate) (This)->lpVtbl->put_SymbolRate(This,Rate)
#define IDVBSLocator2_Clone(This,NewLocator) (This)->lpVtbl->Clone(This,NewLocator)
/*** IDVBSLocator methods ***/
#define IDVBSLocator2_get_SignalPolarisation(This,PolarisationVal) (This)->lpVtbl->get_SignalPolarisation(This,PolarisationVal)
#define IDVBSLocator2_put_SignalPolarisation(This,PolarisationVal) (This)->lpVtbl->put_SignalPolarisation(This,PolarisationVal)
#define IDVBSLocator2_get_WestPosition(This,WestLongitude) (This)->lpVtbl->get_WestPosition(This,WestLongitude)
#define IDVBSLocator2_put_WestPosition(This,WestLongitude) (This)->lpVtbl->put_WestPosition(This,WestLongitude)
#define IDVBSLocator2_get_OrbitalPosition(This,longitude) (This)->lpVtbl->get_OrbitalPosition(This,longitude)
#define IDVBSLocator2_put_OrbitalPosition(This,longitude) (This)->lpVtbl->put_OrbitalPosition(This,longitude)
#define IDVBSLocator2_get_Azimuth(This,Azimuth) (This)->lpVtbl->get_Azimuth(This,Azimuth)
#define IDVBSLocator2_put_Azimuth(This,Azimuth) (This)->lpVtbl->put_Azimuth(This,Azimuth)
#define IDVBSLocator2_get_Elevation(This,Elevation) (This)->lpVtbl->get_Elevation(This,Elevation)
#define IDVBSLocator2_put_Elevation(This,Elevation) (This)->lpVtbl->put_Elevation(This,Elevation)
/*** IDVBSLocator2 methods ***/
#define IDVBSLocator2_get_DiseqLNBSource(This,DiseqLNBSourceVal) (This)->lpVtbl->get_DiseqLNBSource(This,DiseqLNBSourceVal)
#define IDVBSLocator2_put_DiseqLNBSource(This,DiseqLNBSourceVal) (This)->lpVtbl->put_DiseqLNBSource(This,DiseqLNBSourceVal)
#define IDVBSLocator2_get_LocalOscillatorOverrideLow(This,LocalOscillatorOverrideLowVal) (This)->lpVtbl->get_LocalOscillatorOverrideLow(This,LocalOscillatorOverrideLowVal)
#define IDVBSLocator2_put_LocalOscillatorOverrideLow(This,LocalOscillatorOverrideLowVal) (This)->lpVtbl->put_LocalOscillatorOverrideLow(This,LocalOscillatorOverrideLowVal)
#define IDVBSLocator2_get_LocalOscillatorOverrideHigh(This,LocalOscillatorOverrideHighVal) (This)->lpVtbl->get_LocalOscillatorOverrideHigh(This,LocalOscillatorOverrideHighVal)
#define IDVBSLocator2_put_LocalOscillatorOverrideHigh(This,LocalOscillatorOverrideHighVal) (This)->lpVtbl->put_LocalOscillatorOverrideHigh(This,LocalOscillatorOverrideHighVal)
#define IDVBSLocator2_get_LocalLNBSwitchOverride(This,LocalLNBSwitchOverrideVal) (This)->lpVtbl->get_LocalLNBSwitchOverride(This,LocalLNBSwitchOverrideVal)
#define IDVBSLocator2_put_LocalLNBSwitchOverride(This,LocalLNBSwitchOverrideVal) (This)->lpVtbl->put_LocalLNBSwitchOverride(This,LocalLNBSwitchOverrideVal)
#define IDVBSLocator2_get_LocalSpectralInversionOverride(This,LocalSpectralInversionOverrideVal) (This)->lpVtbl->get_LocalSpectralInversionOverride(This,LocalSpectralInversionOverrideVal)
#define IDVBSLocator2_put_LocalSpectralInversionOverride(This,LocalSpectralInversionOverrideVal) (This)->lpVtbl->put_LocalSpectralInversionOverride(This,LocalSpectralInversionOverrideVal)
#define IDVBSLocator2_get_SignalRollOff(This,RollOffVal) (This)->lpVtbl->get_SignalRollOff(This,RollOffVal)
#define IDVBSLocator2_put_SignalRollOff(This,RollOffVal) (This)->lpVtbl->put_SignalRollOff(This,RollOffVal)
#define IDVBSLocator2_get_SignalPilot(This,PilotVal) (This)->lpVtbl->get_SignalPilot(This,PilotVal)
#define IDVBSLocator2_put_SignalPilot(This,PilotVal) (This)->lpVtbl->put_SignalPilot(This,PilotVal)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDVBSLocator2_QueryInterface(IDVBSLocator2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDVBSLocator2_AddRef(IDVBSLocator2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDVBSLocator2_Release(IDVBSLocator2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IDVBSLocator2_GetTypeInfoCount(IDVBSLocator2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IDVBSLocator2_GetTypeInfo(IDVBSLocator2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IDVBSLocator2_GetIDsOfNames(IDVBSLocator2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IDVBSLocator2_Invoke(IDVBSLocator2* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ILocator methods ***/
static FORCEINLINE HRESULT IDVBSLocator2_get_CarrierFrequency(IDVBSLocator2* This,LONG *Frequency) {
    return This->lpVtbl->get_CarrierFrequency(This,Frequency);
}
static FORCEINLINE HRESULT IDVBSLocator2_put_CarrierFrequency(IDVBSLocator2* This,LONG Frequency) {
    return This->lpVtbl->put_CarrierFrequency(This,Frequency);
}
static FORCEINLINE HRESULT IDVBSLocator2_get_InnerFEC(IDVBSLocator2* This,FECMethod *FEC) {
    return This->lpVtbl->get_InnerFEC(This,FEC);
}
static FORCEINLINE HRESULT IDVBSLocator2_put_InnerFEC(IDVBSLocator2* This,FECMethod FEC) {
    return This->lpVtbl->put_InnerFEC(This,FEC);
}
static FORCEINLINE HRESULT IDVBSLocator2_get_InnerFECRate(IDVBSLocator2* This,BinaryConvolutionCodeRate *FEC) {
    return This->lpVtbl->get_InnerFECRate(This,FEC);
}
static FORCEINLINE HRESULT IDVBSLocator2_put_InnerFECRate(IDVBSLocator2* This,BinaryConvolutionCodeRate FEC) {
    return This->lpVtbl->put_InnerFECRate(This,FEC);
}
static FORCEINLINE HRESULT IDVBSLocator2_get_OuterFEC(IDVBSLocator2* This,FECMethod *FEC) {
    return This->lpVtbl->get_OuterFEC(This,FEC);
}
static FORCEINLINE HRESULT IDVBSLocator2_put_OuterFEC(IDVBSLocator2* This,FECMethod FEC) {
    return This->lpVtbl->put_OuterFEC(This,FEC);
}
static FORCEINLINE HRESULT IDVBSLocator2_get_OuterFECRate(IDVBSLocator2* This,BinaryConvolutionCodeRate *FEC) {
    return This->lpVtbl->get_OuterFECRate(This,FEC);
}
static FORCEINLINE HRESULT IDVBSLocator2_put_OuterFECRate(IDVBSLocator2* This,BinaryConvolutionCodeRate FEC) {
    return This->lpVtbl->put_OuterFECRate(This,FEC);
}
static FORCEINLINE HRESULT IDVBSLocator2_get_Modulation(IDVBSLocator2* This,ModulationType *Modulation) {
    return This->lpVtbl->get_Modulation(This,Modulation);
}
static FORCEINLINE HRESULT IDVBSLocator2_put_Modulation(IDVBSLocator2* This,ModulationType Modulation) {
    return This->lpVtbl->put_Modulation(This,Modulation);
}
static FORCEINLINE HRESULT IDVBSLocator2_get_SymbolRate(IDVBSLocator2* This,LONG *Rate) {
    return This->lpVtbl->get_SymbolRate(This,Rate);
}
static FORCEINLINE HRESULT IDVBSLocator2_put_SymbolRate(IDVBSLocator2* This,LONG Rate) {
    return This->lpVtbl->put_SymbolRate(This,Rate);
}
static FORCEINLINE HRESULT IDVBSLocator2_Clone(IDVBSLocator2* This,ILocator **NewLocator) {
    return This->lpVtbl->Clone(This,NewLocator);
}
/*** IDVBSLocator methods ***/
static FORCEINLINE HRESULT IDVBSLocator2_get_SignalPolarisation(IDVBSLocator2* This,Polarisation *PolarisationVal) {
    return This->lpVtbl->get_SignalPolarisation(This,PolarisationVal);
}
static FORCEINLINE HRESULT IDVBSLocator2_put_SignalPolarisation(IDVBSLocator2* This,Polarisation PolarisationVal) {
    return This->lpVtbl->put_SignalPolarisation(This,PolarisationVal);
}
static FORCEINLINE HRESULT IDVBSLocator2_get_WestPosition(IDVBSLocator2* This,VARIANT_BOOL *WestLongitude) {
    return This->lpVtbl->get_WestPosition(This,WestLongitude);
}
static FORCEINLINE HRESULT IDVBSLocator2_put_WestPosition(IDVBSLocator2* This,VARIANT_BOOL WestLongitude) {
    return This->lpVtbl->put_WestPosition(This,WestLongitude);
}
static FORCEINLINE HRESULT IDVBSLocator2_get_OrbitalPosition(IDVBSLocator2* This,LONG *longitude) {
    return This->lpVtbl->get_OrbitalPosition(This,longitude);
}
static FORCEINLINE HRESULT IDVBSLocator2_put_OrbitalPosition(IDVBSLocator2* This,LONG longitude) {
    return This->lpVtbl->put_OrbitalPosition(This,longitude);
}
static FORCEINLINE HRESULT IDVBSLocator2_get_Azimuth(IDVBSLocator2* This,LONG *Azimuth) {
    return This->lpVtbl->get_Azimuth(This,Azimuth);
}
static FORCEINLINE HRESULT IDVBSLocator2_put_Azimuth(IDVBSLocator2* This,LONG Azimuth) {
    return This->lpVtbl->put_Azimuth(This,Azimuth);
}
static FORCEINLINE HRESULT IDVBSLocator2_get_Elevation(IDVBSLocator2* This,LONG *Elevation) {
    return This->lpVtbl->get_Elevation(This,Elevation);
}
static FORCEINLINE HRESULT IDVBSLocator2_put_Elevation(IDVBSLocator2* This,LONG Elevation) {
    return This->lpVtbl->put_Elevation(This,Elevation);
}
/*** IDVBSLocator2 methods ***/
static FORCEINLINE HRESULT IDVBSLocator2_get_DiseqLNBSource(IDVBSLocator2* This,LNB_Source *DiseqLNBSourceVal) {
    return This->lpVtbl->get_DiseqLNBSource(This,DiseqLNBSourceVal);
}
static FORCEINLINE HRESULT IDVBSLocator2_put_DiseqLNBSource(IDVBSLocator2* This,LNB_Source DiseqLNBSourceVal) {
    return This->lpVtbl->put_DiseqLNBSource(This,DiseqLNBSourceVal);
}
static FORCEINLINE HRESULT IDVBSLocator2_get_LocalOscillatorOverrideLow(IDVBSLocator2* This,LONG *LocalOscillatorOverrideLowVal) {
    return This->lpVtbl->get_LocalOscillatorOverrideLow(This,LocalOscillatorOverrideLowVal);
}
static FORCEINLINE HRESULT IDVBSLocator2_put_LocalOscillatorOverrideLow(IDVBSLocator2* This,LONG LocalOscillatorOverrideLowVal) {
    return This->lpVtbl->put_LocalOscillatorOverrideLow(This,LocalOscillatorOverrideLowVal);
}
static FORCEINLINE HRESULT IDVBSLocator2_get_LocalOscillatorOverrideHigh(IDVBSLocator2* This,LONG *LocalOscillatorOverrideHighVal) {
    return This->lpVtbl->get_LocalOscillatorOverrideHigh(This,LocalOscillatorOverrideHighVal);
}
static FORCEINLINE HRESULT IDVBSLocator2_put_LocalOscillatorOverrideHigh(IDVBSLocator2* This,LONG LocalOscillatorOverrideHighVal) {
    return This->lpVtbl->put_LocalOscillatorOverrideHigh(This,LocalOscillatorOverrideHighVal);
}
static FORCEINLINE HRESULT IDVBSLocator2_get_LocalLNBSwitchOverride(IDVBSLocator2* This,LONG *LocalLNBSwitchOverrideVal) {
    return This->lpVtbl->get_LocalLNBSwitchOverride(This,LocalLNBSwitchOverrideVal);
}
static FORCEINLINE HRESULT IDVBSLocator2_put_LocalLNBSwitchOverride(IDVBSLocator2* This,LONG LocalLNBSwitchOverrideVal) {
    return This->lpVtbl->put_LocalLNBSwitchOverride(This,LocalLNBSwitchOverrideVal);
}
static FORCEINLINE HRESULT IDVBSLocator2_get_LocalSpectralInversionOverride(IDVBSLocator2* This,SpectralInversion *LocalSpectralInversionOverrideVal) {
    return This->lpVtbl->get_LocalSpectralInversionOverride(This,LocalSpectralInversionOverrideVal);
}
static FORCEINLINE HRESULT IDVBSLocator2_put_LocalSpectralInversionOverride(IDVBSLocator2* This,SpectralInversion LocalSpectralInversionOverrideVal) {
    return This->lpVtbl->put_LocalSpectralInversionOverride(This,LocalSpectralInversionOverrideVal);
}
static FORCEINLINE HRESULT IDVBSLocator2_get_SignalRollOff(IDVBSLocator2* This,RollOff *RollOffVal) {
    return This->lpVtbl->get_SignalRollOff(This,RollOffVal);
}
static FORCEINLINE HRESULT IDVBSLocator2_put_SignalRollOff(IDVBSLocator2* This,RollOff RollOffVal) {
    return This->lpVtbl->put_SignalRollOff(This,RollOffVal);
}
static FORCEINLINE HRESULT IDVBSLocator2_get_SignalPilot(IDVBSLocator2* This,Pilot *PilotVal) {
    return This->lpVtbl->get_SignalPilot(This,PilotVal);
}
static FORCEINLINE HRESULT IDVBSLocator2_put_SignalPilot(IDVBSLocator2* This,Pilot PilotVal) {
    return This->lpVtbl->put_SignalPilot(This,PilotVal);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IDVBSLocator2_get_DiseqLNBSource_Proxy(
    IDVBSLocator2* This,
    LNB_Source *DiseqLNBSourceVal);
void __RPC_STUB IDVBSLocator2_get_DiseqLNBSource_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDVBSLocator2_put_DiseqLNBSource_Proxy(
    IDVBSLocator2* This,
    LNB_Source DiseqLNBSourceVal);
void __RPC_STUB IDVBSLocator2_put_DiseqLNBSource_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDVBSLocator2_get_LocalOscillatorOverrideLow_Proxy(
    IDVBSLocator2* This,
    LONG *LocalOscillatorOverrideLowVal);
void __RPC_STUB IDVBSLocator2_get_LocalOscillatorOverrideLow_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDVBSLocator2_put_LocalOscillatorOverrideLow_Proxy(
    IDVBSLocator2* This,
    LONG LocalOscillatorOverrideLowVal);
void __RPC_STUB IDVBSLocator2_put_LocalOscillatorOverrideLow_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDVBSLocator2_get_LocalOscillatorOverrideHigh_Proxy(
    IDVBSLocator2* This,
    LONG *LocalOscillatorOverrideHighVal);
void __RPC_STUB IDVBSLocator2_get_LocalOscillatorOverrideHigh_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDVBSLocator2_put_LocalOscillatorOverrideHigh_Proxy(
    IDVBSLocator2* This,
    LONG LocalOscillatorOverrideHighVal);
void __RPC_STUB IDVBSLocator2_put_LocalOscillatorOverrideHigh_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDVBSLocator2_get_LocalLNBSwitchOverride_Proxy(
    IDVBSLocator2* This,
    LONG *LocalLNBSwitchOverrideVal);
void __RPC_STUB IDVBSLocator2_get_LocalLNBSwitchOverride_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDVBSLocator2_put_LocalLNBSwitchOverride_Proxy(
    IDVBSLocator2* This,
    LONG LocalLNBSwitchOverrideVal);
void __RPC_STUB IDVBSLocator2_put_LocalLNBSwitchOverride_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDVBSLocator2_get_LocalSpectralInversionOverride_Proxy(
    IDVBSLocator2* This,
    SpectralInversion *LocalSpectralInversionOverrideVal);
void __RPC_STUB IDVBSLocator2_get_LocalSpectralInversionOverride_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDVBSLocator2_put_LocalSpectralInversionOverride_Proxy(
    IDVBSLocator2* This,
    SpectralInversion LocalSpectralInversionOverrideVal);
void __RPC_STUB IDVBSLocator2_put_LocalSpectralInversionOverride_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDVBSLocator2_get_SignalRollOff_Proxy(
    IDVBSLocator2* This,
    RollOff *RollOffVal);
void __RPC_STUB IDVBSLocator2_get_SignalRollOff_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDVBSLocator2_put_SignalRollOff_Proxy(
    IDVBSLocator2* This,
    RollOff RollOffVal);
void __RPC_STUB IDVBSLocator2_put_SignalRollOff_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDVBSLocator2_get_SignalPilot_Proxy(
    IDVBSLocator2* This,
    Pilot *PilotVal);
void __RPC_STUB IDVBSLocator2_get_SignalPilot_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDVBSLocator2_put_SignalPilot_Proxy(
    IDVBSLocator2* This,
    Pilot PilotVal);
void __RPC_STUB IDVBSLocator2_put_SignalPilot_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IDVBSLocator2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDVBCLocator interface
 */
#ifndef __IDVBCLocator_INTERFACE_DEFINED__
#define __IDVBCLocator_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDVBCLocator, 0x6e42f36e, 0x1dd2, 0x43c4, 0x9f,0x78, 0x69,0xd2,0x5a,0xe3,0x90,0x34);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("6e42f36e-1dd2-43c4-9f78-69d25ae39034")
IDVBCLocator : public IDigitalLocator
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDVBCLocator, 0x6e42f36e, 0x1dd2, 0x43c4, 0x9f,0x78, 0x69,0xd2,0x5a,0xe3,0x90,0x34)
#endif
#else
typedef struct IDVBCLocatorVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IDVBCLocator* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IDVBCLocator* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IDVBCLocator* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IDVBCLocator* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ILocator methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CarrierFrequency)(
        IDVBCLocator* This,
        LONG *Frequency);

    HRESULT (STDMETHODCALLTYPE *put_CarrierFrequency)(
        IDVBCLocator* This,
        LONG Frequency);

    HRESULT (STDMETHODCALLTYPE *get_InnerFEC)(
        IDVBCLocator* This,
        FECMethod *FEC);

    HRESULT (STDMETHODCALLTYPE *put_InnerFEC)(
        IDVBCLocator* This,
        FECMethod FEC);

    HRESULT (STDMETHODCALLTYPE *get_InnerFECRate)(
        IDVBCLocator* This,
        BinaryConvolutionCodeRate *FEC);

    HRESULT (STDMETHODCALLTYPE *put_InnerFECRate)(
        IDVBCLocator* This,
        BinaryConvolutionCodeRate FEC);

    HRESULT (STDMETHODCALLTYPE *get_OuterFEC)(
        IDVBCLocator* This,
        FECMethod *FEC);

    HRESULT (STDMETHODCALLTYPE *put_OuterFEC)(
        IDVBCLocator* This,
        FECMethod FEC);

    HRESULT (STDMETHODCALLTYPE *get_OuterFECRate)(
        IDVBCLocator* This,
        BinaryConvolutionCodeRate *FEC);

    HRESULT (STDMETHODCALLTYPE *put_OuterFECRate)(
        IDVBCLocator* This,
        BinaryConvolutionCodeRate FEC);

    HRESULT (STDMETHODCALLTYPE *get_Modulation)(
        IDVBCLocator* This,
        ModulationType *Modulation);

    HRESULT (STDMETHODCALLTYPE *put_Modulation)(
        IDVBCLocator* This,
        ModulationType Modulation);

    HRESULT (STDMETHODCALLTYPE *get_SymbolRate)(
        IDVBCLocator* This,
        LONG *Rate);

    HRESULT (STDMETHODCALLTYPE *put_SymbolRate)(
        IDVBCLocator* This,
        LONG Rate);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IDVBCLocator* This,
        ILocator **NewLocator);

    END_INTERFACE
} IDVBCLocatorVtbl;
interface IDVBCLocator {
    CONST_VTBL IDVBCLocatorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDVBCLocator_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDVBCLocator_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDVBCLocator_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IDVBCLocator_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IDVBCLocator_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IDVBCLocator_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IDVBCLocator_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ILocator methods ***/
#define IDVBCLocator_get_CarrierFrequency(This,Frequency) (This)->lpVtbl->get_CarrierFrequency(This,Frequency)
#define IDVBCLocator_put_CarrierFrequency(This,Frequency) (This)->lpVtbl->put_CarrierFrequency(This,Frequency)
#define IDVBCLocator_get_InnerFEC(This,FEC) (This)->lpVtbl->get_InnerFEC(This,FEC)
#define IDVBCLocator_put_InnerFEC(This,FEC) (This)->lpVtbl->put_InnerFEC(This,FEC)
#define IDVBCLocator_get_InnerFECRate(This,FEC) (This)->lpVtbl->get_InnerFECRate(This,FEC)
#define IDVBCLocator_put_InnerFECRate(This,FEC) (This)->lpVtbl->put_InnerFECRate(This,FEC)
#define IDVBCLocator_get_OuterFEC(This,FEC) (This)->lpVtbl->get_OuterFEC(This,FEC)
#define IDVBCLocator_put_OuterFEC(This,FEC) (This)->lpVtbl->put_OuterFEC(This,FEC)
#define IDVBCLocator_get_OuterFECRate(This,FEC) (This)->lpVtbl->get_OuterFECRate(This,FEC)
#define IDVBCLocator_put_OuterFECRate(This,FEC) (This)->lpVtbl->put_OuterFECRate(This,FEC)
#define IDVBCLocator_get_Modulation(This,Modulation) (This)->lpVtbl->get_Modulation(This,Modulation)
#define IDVBCLocator_put_Modulation(This,Modulation) (This)->lpVtbl->put_Modulation(This,Modulation)
#define IDVBCLocator_get_SymbolRate(This,Rate) (This)->lpVtbl->get_SymbolRate(This,Rate)
#define IDVBCLocator_put_SymbolRate(This,Rate) (This)->lpVtbl->put_SymbolRate(This,Rate)
#define IDVBCLocator_Clone(This,NewLocator) (This)->lpVtbl->Clone(This,NewLocator)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDVBCLocator_QueryInterface(IDVBCLocator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDVBCLocator_AddRef(IDVBCLocator* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDVBCLocator_Release(IDVBCLocator* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IDVBCLocator_GetTypeInfoCount(IDVBCLocator* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IDVBCLocator_GetTypeInfo(IDVBCLocator* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IDVBCLocator_GetIDsOfNames(IDVBCLocator* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IDVBCLocator_Invoke(IDVBCLocator* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ILocator methods ***/
static FORCEINLINE HRESULT IDVBCLocator_get_CarrierFrequency(IDVBCLocator* This,LONG *Frequency) {
    return This->lpVtbl->get_CarrierFrequency(This,Frequency);
}
static FORCEINLINE HRESULT IDVBCLocator_put_CarrierFrequency(IDVBCLocator* This,LONG Frequency) {
    return This->lpVtbl->put_CarrierFrequency(This,Frequency);
}
static FORCEINLINE HRESULT IDVBCLocator_get_InnerFEC(IDVBCLocator* This,FECMethod *FEC) {
    return This->lpVtbl->get_InnerFEC(This,FEC);
}
static FORCEINLINE HRESULT IDVBCLocator_put_InnerFEC(IDVBCLocator* This,FECMethod FEC) {
    return This->lpVtbl->put_InnerFEC(This,FEC);
}
static FORCEINLINE HRESULT IDVBCLocator_get_InnerFECRate(IDVBCLocator* This,BinaryConvolutionCodeRate *FEC) {
    return This->lpVtbl->get_InnerFECRate(This,FEC);
}
static FORCEINLINE HRESULT IDVBCLocator_put_InnerFECRate(IDVBCLocator* This,BinaryConvolutionCodeRate FEC) {
    return This->lpVtbl->put_InnerFECRate(This,FEC);
}
static FORCEINLINE HRESULT IDVBCLocator_get_OuterFEC(IDVBCLocator* This,FECMethod *FEC) {
    return This->lpVtbl->get_OuterFEC(This,FEC);
}
static FORCEINLINE HRESULT IDVBCLocator_put_OuterFEC(IDVBCLocator* This,FECMethod FEC) {
    return This->lpVtbl->put_OuterFEC(This,FEC);
}
static FORCEINLINE HRESULT IDVBCLocator_get_OuterFECRate(IDVBCLocator* This,BinaryConvolutionCodeRate *FEC) {
    return This->lpVtbl->get_OuterFECRate(This,FEC);
}
static FORCEINLINE HRESULT IDVBCLocator_put_OuterFECRate(IDVBCLocator* This,BinaryConvolutionCodeRate FEC) {
    return This->lpVtbl->put_OuterFECRate(This,FEC);
}
static FORCEINLINE HRESULT IDVBCLocator_get_Modulation(IDVBCLocator* This,ModulationType *Modulation) {
    return This->lpVtbl->get_Modulation(This,Modulation);
}
static FORCEINLINE HRESULT IDVBCLocator_put_Modulation(IDVBCLocator* This,ModulationType Modulation) {
    return This->lpVtbl->put_Modulation(This,Modulation);
}
static FORCEINLINE HRESULT IDVBCLocator_get_SymbolRate(IDVBCLocator* This,LONG *Rate) {
    return This->lpVtbl->get_SymbolRate(This,Rate);
}
static FORCEINLINE HRESULT IDVBCLocator_put_SymbolRate(IDVBCLocator* This,LONG Rate) {
    return This->lpVtbl->put_SymbolRate(This,Rate);
}
static FORCEINLINE HRESULT IDVBCLocator_Clone(IDVBCLocator* This,ILocator **NewLocator) {
    return This->lpVtbl->Clone(This,NewLocator);
}
#endif
#endif

#endif


#endif  /* __IDVBCLocator_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IISDBSLocator interface
 */
#ifndef __IISDBSLocator_INTERFACE_DEFINED__
#define __IISDBSLocator_INTERFACE_DEFINED__

DEFINE_GUID(IID_IISDBSLocator, 0xc9897087, 0xe29c, 0x473f, 0x9e,0x4b, 0x70,0x72,0x12,0x3d,0xea,0x14);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c9897087-e29c-473f-9e4b-7072123dea14")
IISDBSLocator : public IDVBSLocator
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IISDBSLocator, 0xc9897087, 0xe29c, 0x473f, 0x9e,0x4b, 0x70,0x72,0x12,0x3d,0xea,0x14)
#endif
#else
typedef struct IISDBSLocatorVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IISDBSLocator* This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IISDBSLocator* This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IISDBSLocator* This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IISDBSLocator* This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ILocator methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CarrierFrequency)(
        IISDBSLocator* This,
        LONG *Frequency);

    HRESULT (STDMETHODCALLTYPE *put_CarrierFrequency)(
        IISDBSLocator* This,
        LONG Frequency);

    HRESULT (STDMETHODCALLTYPE *get_InnerFEC)(
        IISDBSLocator* This,
        FECMethod *FEC);

    HRESULT (STDMETHODCALLTYPE *put_InnerFEC)(
        IISDBSLocator* This,
        FECMethod FEC);

    HRESULT (STDMETHODCALLTYPE *get_InnerFECRate)(
        IISDBSLocator* This,
        BinaryConvolutionCodeRate *FEC);

    HRESULT (STDMETHODCALLTYPE *put_InnerFECRate)(
        IISDBSLocator* This,
        BinaryConvolutionCodeRate FEC);

    HRESULT (STDMETHODCALLTYPE *get_OuterFEC)(
        IISDBSLocator* This,
        FECMethod *FEC);

    HRESULT (STDMETHODCALLTYPE *put_OuterFEC)(
        IISDBSLocator* This,
        FECMethod FEC);

    HRESULT (STDMETHODCALLTYPE *get_OuterFECRate)(
        IISDBSLocator* This,
        BinaryConvolutionCodeRate *FEC);

    HRESULT (STDMETHODCALLTYPE *put_OuterFECRate)(
        IISDBSLocator* This,
        BinaryConvolutionCodeRate FEC);

    HRESULT (STDMETHODCALLTYPE *get_Modulation)(
        IISDBSLocator* This,
        ModulationType *Modulation);

    HRESULT (STDMETHODCALLTYPE *put_Modulation)(
        IISDBSLocator* This,
        ModulationType Modulation);

    HRESULT (STDMETHODCALLTYPE *get_SymbolRate)(
        IISDBSLocator* This,
        LONG *Rate);

    HRESULT (STDMETHODCALLTYPE *put_SymbolRate)(
        IISDBSLocator* This,
        LONG Rate);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IISDBSLocator* This,
        ILocator **NewLocator);

    /*** IDVBSLocator methods ***/
    HRESULT (STDMETHODCALLTYPE *get_SignalPolarisation)(
        IISDBSLocator* This,
        Polarisation *PolarisationVal);

    HRESULT (STDMETHODCALLTYPE *put_SignalPolarisation)(
        IISDBSLocator* This,
        Polarisation PolarisationVal);

    HRESULT (STDMETHODCALLTYPE *get_WestPosition)(
        IISDBSLocator* This,
        VARIANT_BOOL *WestLongitude);

    HRESULT (STDMETHODCALLTYPE *put_WestPosition)(
        IISDBSLocator* This,
        VARIANT_BOOL WestLongitude);

    HRESULT (STDMETHODCALLTYPE *get_OrbitalPosition)(
        IISDBSLocator* This,
        LONG *longitude);

    HRESULT (STDMETHODCALLTYPE *put_OrbitalPosition)(
        IISDBSLocator* This,
        LONG longitude);

    HRESULT (STDMETHODCALLTYPE *get_Azimuth)(
        IISDBSLocator* This,
        LONG *Azimuth);

    HRESULT (STDMETHODCALLTYPE *put_Azimuth)(
        IISDBSLocator* This,
        LONG Azimuth);

    HRESULT (STDMETHODCALLTYPE *get_Elevation)(
        IISDBSLocator* This,
        LONG *Elevation);

    HRESULT (STDMETHODCALLTYPE *put_Elevation)(
        IISDBSLocator* This,
        LONG Elevation);

    END_INTERFACE
} IISDBSLocatorVtbl;
interface IISDBSLocator {
    CONST_VTBL IISDBSLocatorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IISDBSLocator_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IISDBSLocator_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IISDBSLocator_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IISDBSLocator_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IISDBSLocator_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IISDBSLocator_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IISDBSLocator_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ILocator methods ***/
#define IISDBSLocator_get_CarrierFrequency(This,Frequency) (This)->lpVtbl->get_CarrierFrequency(This,Frequency)
#define IISDBSLocator_put_CarrierFrequency(This,Frequency) (This)->lpVtbl->put_CarrierFrequency(This,Frequency)
#define IISDBSLocator_get_InnerFEC(This,FEC) (This)->lpVtbl->get_InnerFEC(This,FEC)
#define IISDBSLocator_put_InnerFEC(This,FEC) (This)->lpVtbl->put_InnerFEC(This,FEC)
#define IISDBSLocator_get_InnerFECRate(This,FEC) (This)->lpVtbl->get_InnerFECRate(This,FEC)
#define IISDBSLocator_put_InnerFECRate(This,FEC) (This)->lpVtbl->put_InnerFECRate(This,FEC)
#define IISDBSLocator_get_OuterFEC(This,FEC) (This)->lpVtbl->get_OuterFEC(This,FEC)
#define IISDBSLocator_put_OuterFEC(This,FEC) (This)->lpVtbl->put_OuterFEC(This,FEC)
#define IISDBSLocator_get_OuterFECRate(This,FEC) (This)->lpVtbl->get_OuterFECRate(This,FEC)
#define IISDBSLocator_put_OuterFECRate(This,FEC) (This)->lpVtbl->put_OuterFECRate(This,FEC)
#define IISDBSLocator_get_Modulation(This,Modulation) (This)->lpVtbl->get_Modulation(This,Modulation)
#define IISDBSLocator_put_Modulation(This,Modulation) (This)->lpVtbl->put_Modulation(This,Modulation)
#define IISDBSLocator_get_SymbolRate(This,Rate) (This)->lpVtbl->get_SymbolRate(This,Rate)
#define IISDBSLocator_put_SymbolRate(This,Rate) (This)->lpVtbl->put_SymbolRate(This,Rate)
#define IISDBSLocator_Clone(This,NewLocator) (This)->lpVtbl->Clone(This,NewLocator)
/*** IDVBSLocator methods ***/
#define IISDBSLocator_get_SignalPolarisation(This,PolarisationVal) (This)->lpVtbl->get_SignalPolarisation(This,PolarisationVal)
#define IISDBSLocator_put_SignalPolarisation(This,PolarisationVal) (This)->lpVtbl->put_SignalPolarisation(This,PolarisationVal)
#define IISDBSLocator_get_WestPosition(This,WestLongitude) (This)->lpVtbl->get_WestPosition(This,WestLongitude)
#define IISDBSLocator_put_WestPosition(This,WestLongitude) (This)->lpVtbl->put_WestPosition(This,WestLongitude)
#define IISDBSLocator_get_OrbitalPosition(This,longitude) (This)->lpVtbl->get_OrbitalPosition(This,longitude)
#define IISDBSLocator_put_OrbitalPosition(This,longitude) (This)->lpVtbl->put_OrbitalPosition(This,longitude)
#define IISDBSLocator_get_Azimuth(This,Azimuth) (This)->lpVtbl->get_Azimuth(This,Azimuth)
#define IISDBSLocator_put_Azimuth(This,Azimuth) (This)->lpVtbl->put_Azimuth(This,Azimuth)
#define IISDBSLocator_get_Elevation(This,Elevation) (This)->lpVtbl->get_Elevation(This,Elevation)
#define IISDBSLocator_put_Elevation(This,Elevation) (This)->lpVtbl->put_Elevation(This,Elevation)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IISDBSLocator_QueryInterface(IISDBSLocator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IISDBSLocator_AddRef(IISDBSLocator* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IISDBSLocator_Release(IISDBSLocator* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IISDBSLocator_GetTypeInfoCount(IISDBSLocator* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IISDBSLocator_GetTypeInfo(IISDBSLocator* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IISDBSLocator_GetIDsOfNames(IISDBSLocator* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IISDBSLocator_Invoke(IISDBSLocator* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ILocator methods ***/
static FORCEINLINE HRESULT IISDBSLocator_get_CarrierFrequency(IISDBSLocator* This,LONG *Frequency) {
    return This->lpVtbl->get_CarrierFrequency(This,Frequency);
}
static FORCEINLINE HRESULT IISDBSLocator_put_CarrierFrequency(IISDBSLocator* This,LONG Frequency) {
    return This->lpVtbl->put_CarrierFrequency(This,Frequency);
}
static FORCEINLINE HRESULT IISDBSLocator_get_InnerFEC(IISDBSLocator* This,FECMethod *FEC) {
    return This->lpVtbl->get_InnerFEC(This,FEC);
}
static FORCEINLINE HRESULT IISDBSLocator_put_InnerFEC(IISDBSLocator* This,FECMethod FEC) {
    return This->lpVtbl->put_InnerFEC(This,FEC);
}
static FORCEINLINE HRESULT IISDBSLocator_get_InnerFECRate(IISDBSLocator* This,BinaryConvolutionCodeRate *FEC) {
    return This->lpVtbl->get_InnerFECRate(This,FEC);
}
static FORCEINLINE HRESULT IISDBSLocator_put_InnerFECRate(IISDBSLocator* This,BinaryConvolutionCodeRate FEC) {
    return This->lpVtbl->put_InnerFECRate(This,FEC);
}
static FORCEINLINE HRESULT IISDBSLocator_get_OuterFEC(IISDBSLocator* This,FECMethod *FEC) {
    return This->lpVtbl->get_OuterFEC(This,FEC);
}
static FORCEINLINE HRESULT IISDBSLocator_put_OuterFEC(IISDBSLocator* This,FECMethod FEC) {
    return This->lpVtbl->put_OuterFEC(This,FEC);
}
static FORCEINLINE HRESULT IISDBSLocator_get_OuterFECRate(IISDBSLocator* This,BinaryConvolutionCodeRate *FEC) {
    return This->lpVtbl->get_OuterFECRate(This,FEC);
}
static FORCEINLINE HRESULT IISDBSLocator_put_OuterFECRate(IISDBSLocator* This,BinaryConvolutionCodeRate FEC) {
    return This->lpVtbl->put_OuterFECRate(This,FEC);
}
static FORCEINLINE HRESULT IISDBSLocator_get_Modulation(IISDBSLocator* This,ModulationType *Modulation) {
    return This->lpVtbl->get_Modulation(This,Modulation);
}
static FORCEINLINE HRESULT IISDBSLocator_put_Modulation(IISDBSLocator* This,ModulationType Modulation) {
    return This->lpVtbl->put_Modulation(This,Modulation);
}
static FORCEINLINE HRESULT IISDBSLocator_get_SymbolRate(IISDBSLocator* This,LONG *Rate) {
    return This->lpVtbl->get_SymbolRate(This,Rate);
}
static FORCEINLINE HRESULT IISDBSLocator_put_SymbolRate(IISDBSLocator* This,LONG Rate) {
    return This->lpVtbl->put_SymbolRate(This,Rate);
}
static FORCEINLINE HRESULT IISDBSLocator_Clone(IISDBSLocator* This,ILocator **NewLocator) {
    return This->lpVtbl->Clone(This,NewLocator);
}
/*** IDVBSLocator methods ***/
static FORCEINLINE HRESULT IISDBSLocator_get_SignalPolarisation(IISDBSLocator* This,Polarisation *PolarisationVal) {
    return This->lpVtbl->get_SignalPolarisation(This,PolarisationVal);
}
static FORCEINLINE HRESULT IISDBSLocator_put_SignalPolarisation(IISDBSLocator* This,Polarisation PolarisationVal) {
    return This->lpVtbl->put_SignalPolarisation(This,PolarisationVal);
}
static FORCEINLINE HRESULT IISDBSLocator_get_WestPosition(IISDBSLocator* This,VARIANT_BOOL *WestLongitude) {
    return This->lpVtbl->get_WestPosition(This,WestLongitude);
}
static FORCEINLINE HRESULT IISDBSLocator_put_WestPosition(IISDBSLocator* This,VARIANT_BOOL WestLongitude) {
    return This->lpVtbl->put_WestPosition(This,WestLongitude);
}
static FORCEINLINE HRESULT IISDBSLocator_get_OrbitalPosition(IISDBSLocator* This,LONG *longitude) {
    return This->lpVtbl->get_OrbitalPosition(This,longitude);
}
static FORCEINLINE HRESULT IISDBSLocator_put_OrbitalPosition(IISDBSLocator* This,LONG longitude) {
    return This->lpVtbl->put_OrbitalPosition(This,longitude);
}
static FORCEINLINE HRESULT IISDBSLocator_get_Azimuth(IISDBSLocator* This,LONG *Azimuth) {
    return This->lpVtbl->get_Azimuth(This,Azimuth);
}
static FORCEINLINE HRESULT IISDBSLocator_put_Azimuth(IISDBSLocator* This,LONG Azimuth) {
    return This->lpVtbl->put_Azimuth(This,Azimuth);
}
static FORCEINLINE HRESULT IISDBSLocator_get_Elevation(IISDBSLocator* This,LONG *Elevation) {
    return This->lpVtbl->get_Elevation(This,Elevation);
}
static FORCEINLINE HRESULT IISDBSLocator_put_Elevation(IISDBSLocator* This,LONG Elevation) {
    return This->lpVtbl->put_Elevation(This,Elevation);
}
#endif
#endif

#endif


#endif  /* __IISDBSLocator_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IESEvent interface
 */
#ifndef __IESEvent_INTERFACE_DEFINED__
#define __IESEvent_INTERFACE_DEFINED__

DEFINE_GUID(IID_IESEvent, 0x1f0e5357, 0xaf43, 0x44e6, 0x85,0x47, 0x65,0x4c,0x64,0x51,0x45,0xd2);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("1f0e5357-af43-44e6-8547-654c645145d2")
IESEvent : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetEventId(
        DWORD *pdwEventId) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetEventType(
        GUID *pguidEventType) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetCompletionStatus(
        DWORD dwResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetData(
        SAFEARRAY **pbData) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStringData(
        BSTR *pbstrData) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IESEvent, 0x1f0e5357, 0xaf43, 0x44e6, 0x85,0x47, 0x65,0x4c,0x64,0x51,0x45,0xd2)
#endif
#else
typedef struct IESEventVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IESEvent methods ***/
    HRESULT (STDMETHODCALLTYPE *GetEventId)(
        IESEvent* This,
        DWORD *pdwEventId);

    HRESULT (STDMETHODCALLTYPE *GetEventType)(
        IESEvent* This,
        GUID *pguidEventType);

    HRESULT (STDMETHODCALLTYPE *SetCompletionStatus)(
        IESEvent* This,
        DWORD dwResult);

    HRESULT (STDMETHODCALLTYPE *GetData)(
        IESEvent* This,
        SAFEARRAY **pbData);

    HRESULT (STDMETHODCALLTYPE *GetStringData)(
        IESEvent* This,
        BSTR *pbstrData);

    END_INTERFACE
} IESEventVtbl;
interface IESEvent {
    CONST_VTBL IESEventVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IESEvent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IESEvent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IESEvent_Release(This) (This)->lpVtbl->Release(This)
/*** IESEvent methods ***/
#define IESEvent_GetEventId(This,pdwEventId) (This)->lpVtbl->GetEventId(This,pdwEventId)
#define IESEvent_GetEventType(This,pguidEventType) (This)->lpVtbl->GetEventType(This,pguidEventType)
#define IESEvent_SetCompletionStatus(This,dwResult) (This)->lpVtbl->SetCompletionStatus(This,dwResult)
#define IESEvent_GetData(This,pbData) (This)->lpVtbl->GetData(This,pbData)
#define IESEvent_GetStringData(This,pbstrData) (This)->lpVtbl->GetStringData(This,pbstrData)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IESEvent_QueryInterface(IESEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IESEvent_AddRef(IESEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IESEvent_Release(IESEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IESEvent methods ***/
static FORCEINLINE HRESULT IESEvent_GetEventId(IESEvent* This,DWORD *pdwEventId) {
    return This->lpVtbl->GetEventId(This,pdwEventId);
}
static FORCEINLINE HRESULT IESEvent_GetEventType(IESEvent* This,GUID *pguidEventType) {
    return This->lpVtbl->GetEventType(This,pguidEventType);
}
static FORCEINLINE HRESULT IESEvent_SetCompletionStatus(IESEvent* This,DWORD dwResult) {
    return This->lpVtbl->SetCompletionStatus(This,dwResult);
}
static FORCEINLINE HRESULT IESEvent_GetData(IESEvent* This,SAFEARRAY **pbData) {
    return This->lpVtbl->GetData(This,pbData);
}
static FORCEINLINE HRESULT IESEvent_GetStringData(IESEvent* This,BSTR *pbstrData) {
    return This->lpVtbl->GetStringData(This,pbstrData);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IESEvent_GetEventId_Proxy(
    IESEvent* This,
    DWORD *pdwEventId);
void __RPC_STUB IESEvent_GetEventId_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IESEvent_GetEventType_Proxy(
    IESEvent* This,
    GUID *pguidEventType);
void __RPC_STUB IESEvent_GetEventType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IESEvent_SetCompletionStatus_Proxy(
    IESEvent* This,
    DWORD dwResult);
void __RPC_STUB IESEvent_SetCompletionStatus_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IESEvent_GetData_Proxy(
    IESEvent* This,
    SAFEARRAY **pbData);
void __RPC_STUB IESEvent_GetData_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IESEvent_GetStringData_Proxy(
    IESEvent* This,
    BSTR *pbstrData);
void __RPC_STUB IESEvent_GetStringData_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IESEvent_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IESOpenMmiEvent interface
 */
#ifndef __IESOpenMmiEvent_INTERFACE_DEFINED__
#define __IESOpenMmiEvent_INTERFACE_DEFINED__

DEFINE_GUID(IID_IESOpenMmiEvent, 0xba4b6526, 0x1a35, 0x4635, 0x8b,0x56, 0x3e,0xc6,0x12,0x74,0x6a,0x8c);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("ba4b6526-1a35-4635-8b56-3ec612746a8c")
IESOpenMmiEvent : public IESEvent
{
    virtual HRESULT STDMETHODCALLTYPE GetDialogNumber(
        DWORD *pDialogRequest,
        DWORD *pDialogNumber) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDialogType(
        GUID *guidDialogType) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDialogData(
        SAFEARRAY **pbData) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDialogStringData(
        BSTR *pbstrBaseUrl,
        BSTR *pbstrData) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IESOpenMmiEvent, 0xba4b6526, 0x1a35, 0x4635, 0x8b,0x56, 0x3e,0xc6,0x12,0x74,0x6a,0x8c)
#endif
#else
typedef struct IESOpenMmiEventVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IESEvent methods ***/
    HRESULT (STDMETHODCALLTYPE *GetEventId)(
        IESOpenMmiEvent* This,
        DWORD *pdwEventId);

    HRESULT (STDMETHODCALLTYPE *GetEventType)(
        IESOpenMmiEvent* This,
        GUID *pguidEventType);

    HRESULT (STDMETHODCALLTYPE *SetCompletionStatus)(
        IESOpenMmiEvent* This,
        DWORD dwResult);

    HRESULT (STDMETHODCALLTYPE *GetData)(
        IESOpenMmiEvent* This,
        SAFEARRAY **pbData);

    HRESULT (STDMETHODCALLTYPE *GetStringData)(
        IESOpenMmiEvent* This,
        BSTR *pbstrData);

    /*** IESOpenMmiEvent methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDialogNumber)(
        IESOpenMmiEvent* This,
        DWORD *pDialogRequest,
        DWORD *pDialogNumber);

    HRESULT (STDMETHODCALLTYPE *GetDialogType)(
        IESOpenMmiEvent* This,
        GUID *guidDialogType);

    HRESULT (STDMETHODCALLTYPE *GetDialogData)(
        IESOpenMmiEvent* This,
        SAFEARRAY **pbData);

    HRESULT (STDMETHODCALLTYPE *GetDialogStringData)(
        IESOpenMmiEvent* This,
        BSTR *pbstrBaseUrl,
        BSTR *pbstrData);

    END_INTERFACE
} IESOpenMmiEventVtbl;
interface IESOpenMmiEvent {
    CONST_VTBL IESOpenMmiEventVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IESOpenMmiEvent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IESOpenMmiEvent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IESOpenMmiEvent_Release(This) (This)->lpVtbl->Release(This)
/*** IESEvent methods ***/
#define IESOpenMmiEvent_GetEventId(This,pdwEventId) (This)->lpVtbl->GetEventId(This,pdwEventId)
#define IESOpenMmiEvent_GetEventType(This,pguidEventType) (This)->lpVtbl->GetEventType(This,pguidEventType)
#define IESOpenMmiEvent_SetCompletionStatus(This,dwResult) (This)->lpVtbl->SetCompletionStatus(This,dwResult)
#define IESOpenMmiEvent_GetData(This,pbData) (This)->lpVtbl->GetData(This,pbData)
#define IESOpenMmiEvent_GetStringData(This,pbstrData) (This)->lpVtbl->GetStringData(This,pbstrData)
/*** IESOpenMmiEvent methods ***/
#define IESOpenMmiEvent_GetDialogNumber(This,pDialogRequest,pDialogNumber) (This)->lpVtbl->GetDialogNumber(This,pDialogRequest,pDialogNumber)
#define IESOpenMmiEvent_GetDialogType(This,guidDialogType) (This)->lpVtbl->GetDialogType(This,guidDialogType)
#define IESOpenMmiEvent_GetDialogData(This,pbData) (This)->lpVtbl->GetDialogData(This,pbData)
#define IESOpenMmiEvent_GetDialogStringData(This,pbstrBaseUrl,pbstrData) (This)->lpVtbl->GetDialogStringData(This,pbstrBaseUrl,pbstrData)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IESOpenMmiEvent_QueryInterface(IESOpenMmiEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IESOpenMmiEvent_AddRef(IESOpenMmiEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IESOpenMmiEvent_Release(IESOpenMmiEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IESEvent methods ***/
static FORCEINLINE HRESULT IESOpenMmiEvent_GetEventId(IESOpenMmiEvent* This,DWORD *pdwEventId) {
    return This->lpVtbl->GetEventId(This,pdwEventId);
}
static FORCEINLINE HRESULT IESOpenMmiEvent_GetEventType(IESOpenMmiEvent* This,GUID *pguidEventType) {
    return This->lpVtbl->GetEventType(This,pguidEventType);
}
static FORCEINLINE HRESULT IESOpenMmiEvent_SetCompletionStatus(IESOpenMmiEvent* This,DWORD dwResult) {
    return This->lpVtbl->SetCompletionStatus(This,dwResult);
}
static FORCEINLINE HRESULT IESOpenMmiEvent_GetData(IESOpenMmiEvent* This,SAFEARRAY **pbData) {
    return This->lpVtbl->GetData(This,pbData);
}
static FORCEINLINE HRESULT IESOpenMmiEvent_GetStringData(IESOpenMmiEvent* This,BSTR *pbstrData) {
    return This->lpVtbl->GetStringData(This,pbstrData);
}
/*** IESOpenMmiEvent methods ***/
static FORCEINLINE HRESULT IESOpenMmiEvent_GetDialogNumber(IESOpenMmiEvent* This,DWORD *pDialogRequest,DWORD *pDialogNumber) {
    return This->lpVtbl->GetDialogNumber(This,pDialogRequest,pDialogNumber);
}
static FORCEINLINE HRESULT IESOpenMmiEvent_GetDialogType(IESOpenMmiEvent* This,GUID *guidDialogType) {
    return This->lpVtbl->GetDialogType(This,guidDialogType);
}
static FORCEINLINE HRESULT IESOpenMmiEvent_GetDialogData(IESOpenMmiEvent* This,SAFEARRAY **pbData) {
    return This->lpVtbl->GetDialogData(This,pbData);
}
static FORCEINLINE HRESULT IESOpenMmiEvent_GetDialogStringData(IESOpenMmiEvent* This,BSTR *pbstrBaseUrl,BSTR *pbstrData) {
    return This->lpVtbl->GetDialogStringData(This,pbstrBaseUrl,pbstrData);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IESOpenMmiEvent_GetDialogNumber_Proxy(
    IESOpenMmiEvent* This,
    DWORD *pDialogRequest,
    DWORD *pDialogNumber);
void __RPC_STUB IESOpenMmiEvent_GetDialogNumber_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IESOpenMmiEvent_GetDialogType_Proxy(
    IESOpenMmiEvent* This,
    GUID *guidDialogType);
void __RPC_STUB IESOpenMmiEvent_GetDialogType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IESOpenMmiEvent_GetDialogData_Proxy(
    IESOpenMmiEvent* This,
    SAFEARRAY **pbData);
void __RPC_STUB IESOpenMmiEvent_GetDialogData_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IESOpenMmiEvent_GetDialogStringData_Proxy(
    IESOpenMmiEvent* This,
    BSTR *pbstrBaseUrl,
    BSTR *pbstrData);
void __RPC_STUB IESOpenMmiEvent_GetDialogStringData_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IESOpenMmiEvent_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IESCloseMmiEvent interface
 */
#ifndef __IESCloseMmiEvent_INTERFACE_DEFINED__
#define __IESCloseMmiEvent_INTERFACE_DEFINED__

DEFINE_GUID(IID_IESCloseMmiEvent, 0x6b80e96f, 0x55e2, 0x45aa, 0xb7,0x54, 0x0c,0x23,0xc8,0xe7,0xd5,0xc1);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("6b80e96f-55e2-45aa-b754-0c23c8e7d5c1")
IESCloseMmiEvent : public IESEvent
{
    virtual HRESULT STDMETHODCALLTYPE GetDialogNumber(
        DWORD *pDialogNumber) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IESCloseMmiEvent, 0x6b80e96f, 0x55e2, 0x45aa, 0xb7,0x54, 0x0c,0x23,0xc8,0xe7,0xd5,0xc1)
#endif
#else
typedef struct IESCloseMmiEventVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IESEvent methods ***/
    HRESULT (STDMETHODCALLTYPE *GetEventId)(
        IESCloseMmiEvent* This,
        DWORD *pdwEventId);

    HRESULT (STDMETHODCALLTYPE *GetEventType)(
        IESCloseMmiEvent* This,
        GUID *pguidEventType);

    HRESULT (STDMETHODCALLTYPE *SetCompletionStatus)(
        IESCloseMmiEvent* This,
        DWORD dwResult);

    HRESULT (STDMETHODCALLTYPE *GetData)(
        IESCloseMmiEvent* This,
        SAFEARRAY **pbData);

    HRESULT (STDMETHODCALLTYPE *GetStringData)(
        IESCloseMmiEvent* This,
        BSTR *pbstrData);

    /*** IESCloseMmiEvent methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDialogNumber)(
        IESCloseMmiEvent* This,
        DWORD *pDialogNumber);

    END_INTERFACE
} IESCloseMmiEventVtbl;
interface IESCloseMmiEvent {
    CONST_VTBL IESCloseMmiEventVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IESCloseMmiEvent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IESCloseMmiEvent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IESCloseMmiEvent_Release(This) (This)->lpVtbl->Release(This)
/*** IESEvent methods ***/
#define IESCloseMmiEvent_GetEventId(This,pdwEventId) (This)->lpVtbl->GetEventId(This,pdwEventId)
#define IESCloseMmiEvent_GetEventType(This,pguidEventType) (This)->lpVtbl->GetEventType(This,pguidEventType)
#define IESCloseMmiEvent_SetCompletionStatus(This,dwResult) (This)->lpVtbl->SetCompletionStatus(This,dwResult)
#define IESCloseMmiEvent_GetData(This,pbData) (This)->lpVtbl->GetData(This,pbData)
#define IESCloseMmiEvent_GetStringData(This,pbstrData) (This)->lpVtbl->GetStringData(This,pbstrData)
/*** IESCloseMmiEvent methods ***/
#define IESCloseMmiEvent_GetDialogNumber(This,pDialogNumber) (This)->lpVtbl->GetDialogNumber(This,pDialogNumber)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IESCloseMmiEvent_QueryInterface(IESCloseMmiEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IESCloseMmiEvent_AddRef(IESCloseMmiEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IESCloseMmiEvent_Release(IESCloseMmiEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IESEvent methods ***/
static FORCEINLINE HRESULT IESCloseMmiEvent_GetEventId(IESCloseMmiEvent* This,DWORD *pdwEventId) {
    return This->lpVtbl->GetEventId(This,pdwEventId);
}
static FORCEINLINE HRESULT IESCloseMmiEvent_GetEventType(IESCloseMmiEvent* This,GUID *pguidEventType) {
    return This->lpVtbl->GetEventType(This,pguidEventType);
}
static FORCEINLINE HRESULT IESCloseMmiEvent_SetCompletionStatus(IESCloseMmiEvent* This,DWORD dwResult) {
    return This->lpVtbl->SetCompletionStatus(This,dwResult);
}
static FORCEINLINE HRESULT IESCloseMmiEvent_GetData(IESCloseMmiEvent* This,SAFEARRAY **pbData) {
    return This->lpVtbl->GetData(This,pbData);
}
static FORCEINLINE HRESULT IESCloseMmiEvent_GetStringData(IESCloseMmiEvent* This,BSTR *pbstrData) {
    return This->lpVtbl->GetStringData(This,pbstrData);
}
/*** IESCloseMmiEvent methods ***/
static FORCEINLINE HRESULT IESCloseMmiEvent_GetDialogNumber(IESCloseMmiEvent* This,DWORD *pDialogNumber) {
    return This->lpVtbl->GetDialogNumber(This,pDialogNumber);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IESCloseMmiEvent_GetDialogNumber_Proxy(
    IESCloseMmiEvent* This,
    DWORD *pDialogNumber);
void __RPC_STUB IESCloseMmiEvent_GetDialogNumber_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IESCloseMmiEvent_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IESValueUpdatedEvent interface
 */
#ifndef __IESValueUpdatedEvent_INTERFACE_DEFINED__
#define __IESValueUpdatedEvent_INTERFACE_DEFINED__

DEFINE_GUID(IID_IESValueUpdatedEvent, 0x8a24c46e, 0xbb63, 0x4664, 0x86,0x02, 0x5d,0x9c,0x71,0x8c,0x14,0x6d);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("8a24c46e-bb63-4664-8602-5d9c718c146d")
IESValueUpdatedEvent : public IESEvent
{
    virtual HRESULT STDMETHODCALLTYPE GetValueNames(
        SAFEARRAY **pbstrNames) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IESValueUpdatedEvent, 0x8a24c46e, 0xbb63, 0x4664, 0x86,0x02, 0x5d,0x9c,0x71,0x8c,0x14,0x6d)
#endif
#else
typedef struct IESValueUpdatedEventVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IESEvent methods ***/
    HRESULT (STDMETHODCALLTYPE *GetEventId)(
        IESValueUpdatedEvent* This,
        DWORD *pdwEventId);

    HRESULT (STDMETHODCALLTYPE *GetEventType)(
        IESValueUpdatedEvent* This,
        GUID *pguidEventType);

    HRESULT (STDMETHODCALLTYPE *SetCompletionStatus)(
        IESValueUpdatedEvent* This,
        DWORD dwResult);

    HRESULT (STDMETHODCALLTYPE *GetData)(
        IESValueUpdatedEvent* This,
        SAFEARRAY **pbData);

    HRESULT (STDMETHODCALLTYPE *GetStringData)(
        IESValueUpdatedEvent* This,
        BSTR *pbstrData);

    /*** IESValueUpdatedEvent methods ***/
    HRESULT (STDMETHODCALLTYPE *GetValueNames)(
        IESValueUpdatedEvent* This,
        SAFEARRAY **pbstrNames);

    END_INTERFACE
} IESValueUpdatedEventVtbl;
interface IESValueUpdatedEvent {
    CONST_VTBL IESValueUpdatedEventVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IESValueUpdatedEvent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IESValueUpdatedEvent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IESValueUpdatedEvent_Release(This) (This)->lpVtbl->Release(This)
/*** IESEvent methods ***/
#define IESValueUpdatedEvent_GetEventId(This,pdwEventId) (This)->lpVtbl->GetEventId(This,pdwEventId)
#define IESValueUpdatedEvent_GetEventType(This,pguidEventType) (This)->lpVtbl->GetEventType(This,pguidEventType)
#define IESValueUpdatedEvent_SetCompletionStatus(This,dwResult) (This)->lpVtbl->SetCompletionStatus(This,dwResult)
#define IESValueUpdatedEvent_GetData(This,pbData) (This)->lpVtbl->GetData(This,pbData)
#define IESValueUpdatedEvent_GetStringData(This,pbstrData) (This)->lpVtbl->GetStringData(This,pbstrData)
/*** IESValueUpdatedEvent methods ***/
#define IESValueUpdatedEvent_GetValueNames(This,pbstrNames) (This)->lpVtbl->GetValueNames(This,pbstrNames)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IESValueUpdatedEvent_QueryInterface(IESValueUpdatedEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IESValueUpdatedEvent_AddRef(IESValueUpdatedEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IESValueUpdatedEvent_Release(IESValueUpdatedEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IESEvent methods ***/
static FORCEINLINE HRESULT IESValueUpdatedEvent_GetEventId(IESValueUpdatedEvent* This,DWORD *pdwEventId) {
    return This->lpVtbl->GetEventId(This,pdwEventId);
}
static FORCEINLINE HRESULT IESValueUpdatedEvent_GetEventType(IESValueUpdatedEvent* This,GUID *pguidEventType) {
    return This->lpVtbl->GetEventType(This,pguidEventType);
}
static FORCEINLINE HRESULT IESValueUpdatedEvent_SetCompletionStatus(IESValueUpdatedEvent* This,DWORD dwResult) {
    return This->lpVtbl->SetCompletionStatus(This,dwResult);
}
static FORCEINLINE HRESULT IESValueUpdatedEvent_GetData(IESValueUpdatedEvent* This,SAFEARRAY **pbData) {
    return This->lpVtbl->GetData(This,pbData);
}
static FORCEINLINE HRESULT IESValueUpdatedEvent_GetStringData(IESValueUpdatedEvent* This,BSTR *pbstrData) {
    return This->lpVtbl->GetStringData(This,pbstrData);
}
/*** IESValueUpdatedEvent methods ***/
static FORCEINLINE HRESULT IESValueUpdatedEvent_GetValueNames(IESValueUpdatedEvent* This,SAFEARRAY **pbstrNames) {
    return This->lpVtbl->GetValueNames(This,pbstrNames);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IESValueUpdatedEvent_GetValueNames_Proxy(
    IESValueUpdatedEvent* This,
    SAFEARRAY **pbstrNames);
void __RPC_STUB IESValueUpdatedEvent_GetValueNames_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IESValueUpdatedEvent_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IESRequestTunerEvent interface
 */
#ifndef __IESRequestTunerEvent_INTERFACE_DEFINED__
#define __IESRequestTunerEvent_INTERFACE_DEFINED__

DEFINE_GUID(IID_IESRequestTunerEvent, 0x54c7a5e8, 0xc3bb, 0x4f51, 0xaf,0x14, 0xe0,0xe2,0xc0,0xe3,0x4c,0x6d);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("54c7a5e8-c3bb-4f51-af14-e0e2c0e34c6d")
IESRequestTunerEvent : public IESEvent
{
    virtual HRESULT STDMETHODCALLTYPE GetPriority(
        BYTE *pbyPriority) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetReason(
        BYTE *pbyReason) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetConsequences(
        BYTE *pbyConsequences) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetEstimatedTime(
        DWORD *pdwEstimatedTime) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IESRequestTunerEvent, 0x54c7a5e8, 0xc3bb, 0x4f51, 0xaf,0x14, 0xe0,0xe2,0xc0,0xe3,0x4c,0x6d)
#endif
#else
typedef struct IESRequestTunerEventVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IESEvent methods ***/
    HRESULT (STDMETHODCALLTYPE *GetEventId)(
        IESRequestTunerEvent* This,
        DWORD *pdwEventId);

    HRESULT (STDMETHODCALLTYPE *GetEventType)(
        IESRequestTunerEvent* This,
        GUID *pguidEventType);

    HRESULT (STDMETHODCALLTYPE *SetCompletionStatus)(
        IESRequestTunerEvent* This,
        DWORD dwResult);

    HRESULT (STDMETHODCALLTYPE *GetData)(
        IESRequestTunerEvent* This,
        SAFEARRAY **pbData);

    HRESULT (STDMETHODCALLTYPE *GetStringData)(
        IESRequestTunerEvent* This,
        BSTR *pbstrData);

    /*** IESRequestTunerEvent methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPriority)(
        IESRequestTunerEvent* This,
        BYTE *pbyPriority);

    HRESULT (STDMETHODCALLTYPE *GetReason)(
        IESRequestTunerEvent* This,
        BYTE *pbyReason);

    HRESULT (STDMETHODCALLTYPE *GetConsequences)(
        IESRequestTunerEvent* This,
        BYTE *pbyConsequences);

    HRESULT (STDMETHODCALLTYPE *GetEstimatedTime)(
        IESRequestTunerEvent* This,
        DWORD *pdwEstimatedTime);

    END_INTERFACE
} IESRequestTunerEventVtbl;
interface IESRequestTunerEvent {
    CONST_VTBL IESRequestTunerEventVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IESRequestTunerEvent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IESRequestTunerEvent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IESRequestTunerEvent_Release(This) (This)->lpVtbl->Release(This)
/*** IESEvent methods ***/
#define IESRequestTunerEvent_GetEventId(This,pdwEventId) (This)->lpVtbl->GetEventId(This,pdwEventId)
#define IESRequestTunerEvent_GetEventType(This,pguidEventType) (This)->lpVtbl->GetEventType(This,pguidEventType)
#define IESRequestTunerEvent_SetCompletionStatus(This,dwResult) (This)->lpVtbl->SetCompletionStatus(This,dwResult)
#define IESRequestTunerEvent_GetData(This,pbData) (This)->lpVtbl->GetData(This,pbData)
#define IESRequestTunerEvent_GetStringData(This,pbstrData) (This)->lpVtbl->GetStringData(This,pbstrData)
/*** IESRequestTunerEvent methods ***/
#define IESRequestTunerEvent_GetPriority(This,pbyPriority) (This)->lpVtbl->GetPriority(This,pbyPriority)
#define IESRequestTunerEvent_GetReason(This,pbyReason) (This)->lpVtbl->GetReason(This,pbyReason)
#define IESRequestTunerEvent_GetConsequences(This,pbyConsequences) (This)->lpVtbl->GetConsequences(This,pbyConsequences)
#define IESRequestTunerEvent_GetEstimatedTime(This,pdwEstimatedTime) (This)->lpVtbl->GetEstimatedTime(This,pdwEstimatedTime)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IESRequestTunerEvent_QueryInterface(IESRequestTunerEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IESRequestTunerEvent_AddRef(IESRequestTunerEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IESRequestTunerEvent_Release(IESRequestTunerEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IESEvent methods ***/
static FORCEINLINE HRESULT IESRequestTunerEvent_GetEventId(IESRequestTunerEvent* This,DWORD *pdwEventId) {
    return This->lpVtbl->GetEventId(This,pdwEventId);
}
static FORCEINLINE HRESULT IESRequestTunerEvent_GetEventType(IESRequestTunerEvent* This,GUID *pguidEventType) {
    return This->lpVtbl->GetEventType(This,pguidEventType);
}
static FORCEINLINE HRESULT IESRequestTunerEvent_SetCompletionStatus(IESRequestTunerEvent* This,DWORD dwResult) {
    return This->lpVtbl->SetCompletionStatus(This,dwResult);
}
static FORCEINLINE HRESULT IESRequestTunerEvent_GetData(IESRequestTunerEvent* This,SAFEARRAY **pbData) {
    return This->lpVtbl->GetData(This,pbData);
}
static FORCEINLINE HRESULT IESRequestTunerEvent_GetStringData(IESRequestTunerEvent* This,BSTR *pbstrData) {
    return This->lpVtbl->GetStringData(This,pbstrData);
}
/*** IESRequestTunerEvent methods ***/
static FORCEINLINE HRESULT IESRequestTunerEvent_GetPriority(IESRequestTunerEvent* This,BYTE *pbyPriority) {
    return This->lpVtbl->GetPriority(This,pbyPriority);
}
static FORCEINLINE HRESULT IESRequestTunerEvent_GetReason(IESRequestTunerEvent* This,BYTE *pbyReason) {
    return This->lpVtbl->GetReason(This,pbyReason);
}
static FORCEINLINE HRESULT IESRequestTunerEvent_GetConsequences(IESRequestTunerEvent* This,BYTE *pbyConsequences) {
    return This->lpVtbl->GetConsequences(This,pbyConsequences);
}
static FORCEINLINE HRESULT IESRequestTunerEvent_GetEstimatedTime(IESRequestTunerEvent* This,DWORD *pdwEstimatedTime) {
    return This->lpVtbl->GetEstimatedTime(This,pdwEstimatedTime);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IESRequestTunerEvent_GetPriority_Proxy(
    IESRequestTunerEvent* This,
    BYTE *pbyPriority);
void __RPC_STUB IESRequestTunerEvent_GetPriority_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IESRequestTunerEvent_GetReason_Proxy(
    IESRequestTunerEvent* This,
    BYTE *pbyReason);
void __RPC_STUB IESRequestTunerEvent_GetReason_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IESRequestTunerEvent_GetConsequences_Proxy(
    IESRequestTunerEvent* This,
    BYTE *pbyConsequences);
void __RPC_STUB IESRequestTunerEvent_GetConsequences_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IESRequestTunerEvent_GetEstimatedTime_Proxy(
    IESRequestTunerEvent* This,
    DWORD *pdwEstimatedTime);
void __RPC_STUB IESRequestTunerEvent_GetEstimatedTime_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IESRequestTunerEvent_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IESIsdbCasResponseEvent interface
 */
#ifndef __IESIsdbCasResponseEvent_INTERFACE_DEFINED__
#define __IESIsdbCasResponseEvent_INTERFACE_DEFINED__

DEFINE_GUID(IID_IESIsdbCasResponseEvent, 0x2017cb03, 0xdc0f, 0x4c24, 0x83,0xca, 0x36,0x30,0x7b,0x2c,0xd1,0x9f);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2017cb03-dc0f-4c24-83ca-36307b2cd19f")
IESIsdbCasResponseEvent : public IESEvent
{
    virtual HRESULT STDMETHODCALLTYPE GetRequestId(
        DWORD *pRequestId) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStatus(
        DWORD *pStatus) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDataLength(
        DWORD *pRequestLength) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetResponseData(
        SAFEARRAY **pbData) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IESIsdbCasResponseEvent, 0x2017cb03, 0xdc0f, 0x4c24, 0x83,0xca, 0x36,0x30,0x7b,0x2c,0xd1,0x9f)
#endif
#else
typedef struct IESIsdbCasResponseEventVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IESEvent methods ***/
    HRESULT (STDMETHODCALLTYPE *GetEventId)(
        IESIsdbCasResponseEvent* This,
        DWORD *pdwEventId);

    HRESULT (STDMETHODCALLTYPE *GetEventType)(
        IESIsdbCasResponseEvent* This,
        GUID *pguidEventType);

    HRESULT (STDMETHODCALLTYPE *SetCompletionStatus)(
        IESIsdbCasResponseEvent* This,
        DWORD dwResult);

    HRESULT (STDMETHODCALLTYPE *GetData)(
        IESIsdbCasResponseEvent* This,
        SAFEARRAY **pbData);

    HRESULT (STDMETHODCALLTYPE *GetStringData)(
        IESIsdbCasResponseEvent* This,
        BSTR *pbstrData);

    /*** IESIsdbCasResponseEvent methods ***/
    HRESULT (STDMETHODCALLTYPE *GetRequestId)(
        IESIsdbCasResponseEvent* This,
        DWORD *pRequestId);

    HRESULT (STDMETHODCALLTYPE *GetStatus)(
        IESIsdbCasResponseEvent* This,
        DWORD *pStatus);

    HRESULT (STDMETHODCALLTYPE *GetDataLength)(
        IESIsdbCasResponseEvent* This,
        DWORD *pRequestLength);

    HRESULT (STDMETHODCALLTYPE *GetResponseData)(
        IESIsdbCasResponseEvent* This,
        SAFEARRAY **pbData);

    END_INTERFACE
} IESIsdbCasResponseEventVtbl;
interface IESIsdbCasResponseEvent {
    CONST_VTBL IESIsdbCasResponseEventVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IESIsdbCasResponseEvent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IESIsdbCasResponseEvent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IESIsdbCasResponseEvent_Release(This) (This)->lpVtbl->Release(This)
/*** IESEvent methods ***/
#define IESIsdbCasResponseEvent_GetEventId(This,pdwEventId) (This)->lpVtbl->GetEventId(This,pdwEventId)
#define IESIsdbCasResponseEvent_GetEventType(This,pguidEventType) (This)->lpVtbl->GetEventType(This,pguidEventType)
#define IESIsdbCasResponseEvent_SetCompletionStatus(This,dwResult) (This)->lpVtbl->SetCompletionStatus(This,dwResult)
#define IESIsdbCasResponseEvent_GetData(This,pbData) (This)->lpVtbl->GetData(This,pbData)
#define IESIsdbCasResponseEvent_GetStringData(This,pbstrData) (This)->lpVtbl->GetStringData(This,pbstrData)
/*** IESIsdbCasResponseEvent methods ***/
#define IESIsdbCasResponseEvent_GetRequestId(This,pRequestId) (This)->lpVtbl->GetRequestId(This,pRequestId)
#define IESIsdbCasResponseEvent_GetStatus(This,pStatus) (This)->lpVtbl->GetStatus(This,pStatus)
#define IESIsdbCasResponseEvent_GetDataLength(This,pRequestLength) (This)->lpVtbl->GetDataLength(This,pRequestLength)
#define IESIsdbCasResponseEvent_GetResponseData(This,pbData) (This)->lpVtbl->GetResponseData(This,pbData)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IESIsdbCasResponseEvent_QueryInterface(IESIsdbCasResponseEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IESIsdbCasResponseEvent_AddRef(IESIsdbCasResponseEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IESIsdbCasResponseEvent_Release(IESIsdbCasResponseEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IESEvent methods ***/
static FORCEINLINE HRESULT IESIsdbCasResponseEvent_GetEventId(IESIsdbCasResponseEvent* This,DWORD *pdwEventId) {
    return This->lpVtbl->GetEventId(This,pdwEventId);
}
static FORCEINLINE HRESULT IESIsdbCasResponseEvent_GetEventType(IESIsdbCasResponseEvent* This,GUID *pguidEventType) {
    return This->lpVtbl->GetEventType(This,pguidEventType);
}
static FORCEINLINE HRESULT IESIsdbCasResponseEvent_SetCompletionStatus(IESIsdbCasResponseEvent* This,DWORD dwResult) {
    return This->lpVtbl->SetCompletionStatus(This,dwResult);
}
static FORCEINLINE HRESULT IESIsdbCasResponseEvent_GetData(IESIsdbCasResponseEvent* This,SAFEARRAY **pbData) {
    return This->lpVtbl->GetData(This,pbData);
}
static FORCEINLINE HRESULT IESIsdbCasResponseEvent_GetStringData(IESIsdbCasResponseEvent* This,BSTR *pbstrData) {
    return This->lpVtbl->GetStringData(This,pbstrData);
}
/*** IESIsdbCasResponseEvent methods ***/
static FORCEINLINE HRESULT IESIsdbCasResponseEvent_GetRequestId(IESIsdbCasResponseEvent* This,DWORD *pRequestId) {
    return This->lpVtbl->GetRequestId(This,pRequestId);
}
static FORCEINLINE HRESULT IESIsdbCasResponseEvent_GetStatus(IESIsdbCasResponseEvent* This,DWORD *pStatus) {
    return This->lpVtbl->GetStatus(This,pStatus);
}
static FORCEINLINE HRESULT IESIsdbCasResponseEvent_GetDataLength(IESIsdbCasResponseEvent* This,DWORD *pRequestLength) {
    return This->lpVtbl->GetDataLength(This,pRequestLength);
}
static FORCEINLINE HRESULT IESIsdbCasResponseEvent_GetResponseData(IESIsdbCasResponseEvent* This,SAFEARRAY **pbData) {
    return This->lpVtbl->GetResponseData(This,pbData);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IESIsdbCasResponseEvent_GetRequestId_Proxy(
    IESIsdbCasResponseEvent* This,
    DWORD *pRequestId);
void __RPC_STUB IESIsdbCasResponseEvent_GetRequestId_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IESIsdbCasResponseEvent_GetStatus_Proxy(
    IESIsdbCasResponseEvent* This,
    DWORD *pStatus);
void __RPC_STUB IESIsdbCasResponseEvent_GetStatus_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IESIsdbCasResponseEvent_GetDataLength_Proxy(
    IESIsdbCasResponseEvent* This,
    DWORD *pRequestLength);
void __RPC_STUB IESIsdbCasResponseEvent_GetDataLength_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IESIsdbCasResponseEvent_GetResponseData_Proxy(
    IESIsdbCasResponseEvent* This,
    SAFEARRAY **pbData);
void __RPC_STUB IESIsdbCasResponseEvent_GetResponseData_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IESIsdbCasResponseEvent_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IGpnvsCommonBase interface
 */
#ifndef __IGpnvsCommonBase_INTERFACE_DEFINED__
#define __IGpnvsCommonBase_INTERFACE_DEFINED__

DEFINE_GUID(IID_IGpnvsCommonBase, 0x907e0b5c, 0xe42d, 0x4f04, 0x91,0xf0, 0x26,0xf4,0x01,0xf3,0x69,0x07);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("907e0b5c-e42d-4f04-91f0-26f401f36907")
IGpnvsCommonBase : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetValueUpdateName(
        BSTR *pbstrName) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IGpnvsCommonBase, 0x907e0b5c, 0xe42d, 0x4f04, 0x91,0xf0, 0x26,0xf4,0x01,0xf3,0x69,0x07)
#endif
#else
typedef struct IGpnvsCommonBaseVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IGpnvsCommonBase methods ***/
    HRESULT (STDMETHODCALLTYPE *GetValueUpdateName)(
        IGpnvsCommonBase* This,
        BSTR *pbstrName);

    END_INTERFACE
} IGpnvsCommonBaseVtbl;
interface IGpnvsCommonBase {
    CONST_VTBL IGpnvsCommonBaseVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IGpnvsCommonBase_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IGpnvsCommonBase_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IGpnvsCommonBase_Release(This) (This)->lpVtbl->Release(This)
/*** IGpnvsCommonBase methods ***/
#define IGpnvsCommonBase_GetValueUpdateName(This,pbstrName) (This)->lpVtbl->GetValueUpdateName(This,pbstrName)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IGpnvsCommonBase_QueryInterface(IGpnvsCommonBase* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IGpnvsCommonBase_AddRef(IGpnvsCommonBase* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IGpnvsCommonBase_Release(IGpnvsCommonBase* This) {
    return This->lpVtbl->Release(This);
}
/*** IGpnvsCommonBase methods ***/
static FORCEINLINE HRESULT IGpnvsCommonBase_GetValueUpdateName(IGpnvsCommonBase* This,BSTR *pbstrName) {
    return This->lpVtbl->GetValueUpdateName(This,pbstrName);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IGpnvsCommonBase_GetValueUpdateName_Proxy(
    IGpnvsCommonBase* This,
    BSTR *pbstrName);
void __RPC_STUB IGpnvsCommonBase_GetValueUpdateName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IGpnvsCommonBase_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IESEventFactory interface
 */
#ifndef __IESEventFactory_INTERFACE_DEFINED__
#define __IESEventFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID_IESEventFactory, 0x506a09b8, 0x7f86, 0x4e04, 0xac,0x05, 0x33,0x03,0xbf,0xe8,0xfc,0x49);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("506a09b8-7f86-4e04-ac05-3303bfe8fc49")
IESEventFactory : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE CreateESEvent(
        IUnknown *pServiceProvider,
        DWORD dwEventId,
        GUID guidEventType,
        DWORD dwEventDataLength,
        BYTE *pEventData,
        BSTR bstrBaseUrl,
        IUnknown *pInitContext,
        IESEvent **ppESEvent) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IESEventFactory, 0x506a09b8, 0x7f86, 0x4e04, 0xac,0x05, 0x33,0x03,0xbf,0xe8,0xfc,0x49)
#endif
#else
typedef struct IESEventFactoryVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IESEventFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateESEvent)(
        IESEventFactory* This,
        IUnknown *pServiceProvider,
        DWORD dwEventId,
        GUID guidEventType,
        DWORD dwEventDataLength,
        BYTE *pEventData,
        BSTR bstrBaseUrl,
        IUnknown *pInitContext,
        IESEvent **ppESEvent);

    END_INTERFACE
} IESEventFactoryVtbl;
interface IESEventFactory {
    CONST_VTBL IESEventFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IESEventFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IESEventFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IESEventFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IESEventFactory methods ***/
#define IESEventFactory_CreateESEvent(This,pServiceProvider,dwEventId,guidEventType,dwEventDataLength,pEventData,bstrBaseUrl,pInitContext,ppESEvent) (This)->lpVtbl->CreateESEvent(This,pServiceProvider,dwEventId,guidEventType,dwEventDataLength,pEventData,bstrBaseUrl,pInitContext,ppESEvent)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IESEventFactory_QueryInterface(IESEventFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IESEventFactory_AddRef(IESEventFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IESEventFactory_Release(IESEventFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IESEventFactory methods ***/
static FORCEINLINE HRESULT IESEventFactory_CreateESEvent(IESEventFactory* This,IUnknown *pServiceProvider,DWORD dwEventId,GUID guidEventType,DWORD dwEventDataLength,BYTE *pEventData,BSTR bstrBaseUrl,IUnknown *pInitContext,IESEvent **ppESEvent) {
    return This->lpVtbl->CreateESEvent(This,pServiceProvider,dwEventId,guidEventType,dwEventDataLength,pEventData,bstrBaseUrl,pInitContext,ppESEvent);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IESEventFactory_CreateESEvent_Proxy(
    IESEventFactory* This,
    IUnknown *pServiceProvider,
    DWORD dwEventId,
    GUID guidEventType,
    DWORD dwEventDataLength,
    BYTE *pEventData,
    BSTR bstrBaseUrl,
    IUnknown *pInitContext,
    IESEvent **ppESEvent);
void __RPC_STUB IESEventFactory_CreateESEvent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IESEventFactory_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IESLicenseRenewalResultEvent interface
 */
#ifndef __IESLicenseRenewalResultEvent_INTERFACE_DEFINED__
#define __IESLicenseRenewalResultEvent_INTERFACE_DEFINED__

DEFINE_GUID(IID_IESLicenseRenewalResultEvent, 0xd5a48ef5, 0xa81b, 0x4df0, 0xac,0xaa, 0x5e,0x35,0xe7,0xea,0x45,0xd4);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d5a48ef5-a81b-4df0-acaa-5e35e7ea45d4")
IESLicenseRenewalResultEvent : public IESEvent
{
    virtual HRESULT STDMETHODCALLTYPE GetCallersId(
        DWORD *pdwCallersId) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFileName(
        BSTR *pbstrFilename) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsRenewalSuccessful(
        WINBOOL *pfRenewalSuccessful) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsCheckEntitlementCallRequired(
        WINBOOL *pfCheckEntTokenCallNeeded) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDescrambledStatus(
        DWORD *pDescrambledStatus) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRenewalResultCode(
        DWORD *pdwRenewalResultCode) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCASFailureCode(
        DWORD *pdwCASFailureCode) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRenewalHResult(
        HRESULT *phr) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetEntitlementTokenLength(
        DWORD *pdwLength) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetEntitlementToken(
        SAFEARRAY **pbData) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetExpiryDate(
        DWORD64 *pqwExpiryDate) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IESLicenseRenewalResultEvent, 0xd5a48ef5, 0xa81b, 0x4df0, 0xac,0xaa, 0x5e,0x35,0xe7,0xea,0x45,0xd4)
#endif
#else
typedef struct IESLicenseRenewalResultEventVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IESEvent methods ***/
    HRESULT (STDMETHODCALLTYPE *GetEventId)(
        IESLicenseRenewalResultEvent* This,
        DWORD *pdwEventId);

    HRESULT (STDMETHODCALLTYPE *GetEventType)(
        IESLicenseRenewalResultEvent* This,
        GUID *pguidEventType);

    HRESULT (STDMETHODCALLTYPE *SetCompletionStatus)(
        IESLicenseRenewalResultEvent* This,
        DWORD dwResult);

    HRESULT (STDMETHODCALLTYPE *GetData)(
        IESLicenseRenewalResultEvent* This,
        SAFEARRAY **pbData);

    HRESULT (STDMETHODCALLTYPE *GetStringData)(
        IESLicenseRenewalResultEvent* This,
        BSTR *pbstrData);

    /*** IESLicenseRenewalResultEvent methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCallersId)(
        IESLicenseRenewalResultEvent* This,
        DWORD *pdwCallersId);

    HRESULT (STDMETHODCALLTYPE *GetFileName)(
        IESLicenseRenewalResultEvent* This,
        BSTR *pbstrFilename);

    HRESULT (STDMETHODCALLTYPE *IsRenewalSuccessful)(
        IESLicenseRenewalResultEvent* This,
        WINBOOL *pfRenewalSuccessful);

    HRESULT (STDMETHODCALLTYPE *IsCheckEntitlementCallRequired)(
        IESLicenseRenewalResultEvent* This,
        WINBOOL *pfCheckEntTokenCallNeeded);

    HRESULT (STDMETHODCALLTYPE *GetDescrambledStatus)(
        IESLicenseRenewalResultEvent* This,
        DWORD *pDescrambledStatus);

    HRESULT (STDMETHODCALLTYPE *GetRenewalResultCode)(
        IESLicenseRenewalResultEvent* This,
        DWORD *pdwRenewalResultCode);

    HRESULT (STDMETHODCALLTYPE *GetCASFailureCode)(
        IESLicenseRenewalResultEvent* This,
        DWORD *pdwCASFailureCode);

    HRESULT (STDMETHODCALLTYPE *GetRenewalHResult)(
        IESLicenseRenewalResultEvent* This,
        HRESULT *phr);

    HRESULT (STDMETHODCALLTYPE *GetEntitlementTokenLength)(
        IESLicenseRenewalResultEvent* This,
        DWORD *pdwLength);

    HRESULT (STDMETHODCALLTYPE *GetEntitlementToken)(
        IESLicenseRenewalResultEvent* This,
        SAFEARRAY **pbData);

    HRESULT (STDMETHODCALLTYPE *GetExpiryDate)(
        IESLicenseRenewalResultEvent* This,
        DWORD64 *pqwExpiryDate);

    END_INTERFACE
} IESLicenseRenewalResultEventVtbl;
interface IESLicenseRenewalResultEvent {
    CONST_VTBL IESLicenseRenewalResultEventVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IESLicenseRenewalResultEvent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IESLicenseRenewalResultEvent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IESLicenseRenewalResultEvent_Release(This) (This)->lpVtbl->Release(This)
/*** IESEvent methods ***/
#define IESLicenseRenewalResultEvent_GetEventId(This,pdwEventId) (This)->lpVtbl->GetEventId(This,pdwEventId)
#define IESLicenseRenewalResultEvent_GetEventType(This,pguidEventType) (This)->lpVtbl->GetEventType(This,pguidEventType)
#define IESLicenseRenewalResultEvent_SetCompletionStatus(This,dwResult) (This)->lpVtbl->SetCompletionStatus(This,dwResult)
#define IESLicenseRenewalResultEvent_GetData(This,pbData) (This)->lpVtbl->GetData(This,pbData)
#define IESLicenseRenewalResultEvent_GetStringData(This,pbstrData) (This)->lpVtbl->GetStringData(This,pbstrData)
/*** IESLicenseRenewalResultEvent methods ***/
#define IESLicenseRenewalResultEvent_GetCallersId(This,pdwCallersId) (This)->lpVtbl->GetCallersId(This,pdwCallersId)
#define IESLicenseRenewalResultEvent_GetFileName(This,pbstrFilename) (This)->lpVtbl->GetFileName(This,pbstrFilename)
#define IESLicenseRenewalResultEvent_IsRenewalSuccessful(This,pfRenewalSuccessful) (This)->lpVtbl->IsRenewalSuccessful(This,pfRenewalSuccessful)
#define IESLicenseRenewalResultEvent_IsCheckEntitlementCallRequired(This,pfCheckEntTokenCallNeeded) (This)->lpVtbl->IsCheckEntitlementCallRequired(This,pfCheckEntTokenCallNeeded)
#define IESLicenseRenewalResultEvent_GetDescrambledStatus(This,pDescrambledStatus) (This)->lpVtbl->GetDescrambledStatus(This,pDescrambledStatus)
#define IESLicenseRenewalResultEvent_GetRenewalResultCode(This,pdwRenewalResultCode) (This)->lpVtbl->GetRenewalResultCode(This,pdwRenewalResultCode)
#define IESLicenseRenewalResultEvent_GetCASFailureCode(This,pdwCASFailureCode) (This)->lpVtbl->GetCASFailureCode(This,pdwCASFailureCode)
#define IESLicenseRenewalResultEvent_GetRenewalHResult(This,phr) (This)->lpVtbl->GetRenewalHResult(This,phr)
#define IESLicenseRenewalResultEvent_GetEntitlementTokenLength(This,pdwLength) (This)->lpVtbl->GetEntitlementTokenLength(This,pdwLength)
#define IESLicenseRenewalResultEvent_GetEntitlementToken(This,pbData) (This)->lpVtbl->GetEntitlementToken(This,pbData)
#define IESLicenseRenewalResultEvent_GetExpiryDate(This,pqwExpiryDate) (This)->lpVtbl->GetExpiryDate(This,pqwExpiryDate)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IESLicenseRenewalResultEvent_QueryInterface(IESLicenseRenewalResultEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IESLicenseRenewalResultEvent_AddRef(IESLicenseRenewalResultEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IESLicenseRenewalResultEvent_Release(IESLicenseRenewalResultEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IESEvent methods ***/
static FORCEINLINE HRESULT IESLicenseRenewalResultEvent_GetEventId(IESLicenseRenewalResultEvent* This,DWORD *pdwEventId) {
    return This->lpVtbl->GetEventId(This,pdwEventId);
}
static FORCEINLINE HRESULT IESLicenseRenewalResultEvent_GetEventType(IESLicenseRenewalResultEvent* This,GUID *pguidEventType) {
    return This->lpVtbl->GetEventType(This,pguidEventType);
}
static FORCEINLINE HRESULT IESLicenseRenewalResultEvent_SetCompletionStatus(IESLicenseRenewalResultEvent* This,DWORD dwResult) {
    return This->lpVtbl->SetCompletionStatus(This,dwResult);
}
static FORCEINLINE HRESULT IESLicenseRenewalResultEvent_GetData(IESLicenseRenewalResultEvent* This,SAFEARRAY **pbData) {
    return This->lpVtbl->GetData(This,pbData);
}
static FORCEINLINE HRESULT IESLicenseRenewalResultEvent_GetStringData(IESLicenseRenewalResultEvent* This,BSTR *pbstrData) {
    return This->lpVtbl->GetStringData(This,pbstrData);
}
/*** IESLicenseRenewalResultEvent methods ***/
static FORCEINLINE HRESULT IESLicenseRenewalResultEvent_GetCallersId(IESLicenseRenewalResultEvent* This,DWORD *pdwCallersId) {
    return This->lpVtbl->GetCallersId(This,pdwCallersId);
}
static FORCEINLINE HRESULT IESLicenseRenewalResultEvent_GetFileName(IESLicenseRenewalResultEvent* This,BSTR *pbstrFilename) {
    return This->lpVtbl->GetFileName(This,pbstrFilename);
}
static FORCEINLINE HRESULT IESLicenseRenewalResultEvent_IsRenewalSuccessful(IESLicenseRenewalResultEvent* This,WINBOOL *pfRenewalSuccessful) {
    return This->lpVtbl->IsRenewalSuccessful(This,pfRenewalSuccessful);
}
static FORCEINLINE HRESULT IESLicenseRenewalResultEvent_IsCheckEntitlementCallRequired(IESLicenseRenewalResultEvent* This,WINBOOL *pfCheckEntTokenCallNeeded) {
    return This->lpVtbl->IsCheckEntitlementCallRequired(This,pfCheckEntTokenCallNeeded);
}
static FORCEINLINE HRESULT IESLicenseRenewalResultEvent_GetDescrambledStatus(IESLicenseRenewalResultEvent* This,DWORD *pDescrambledStatus) {
    return This->lpVtbl->GetDescrambledStatus(This,pDescrambledStatus);
}
static FORCEINLINE HRESULT IESLicenseRenewalResultEvent_GetRenewalResultCode(IESLicenseRenewalResultEvent* This,DWORD *pdwRenewalResultCode) {
    return This->lpVtbl->GetRenewalResultCode(This,pdwRenewalResultCode);
}
static FORCEINLINE HRESULT IESLicenseRenewalResultEvent_GetCASFailureCode(IESLicenseRenewalResultEvent* This,DWORD *pdwCASFailureCode) {
    return This->lpVtbl->GetCASFailureCode(This,pdwCASFailureCode);
}
static FORCEINLINE HRESULT IESLicenseRenewalResultEvent_GetRenewalHResult(IESLicenseRenewalResultEvent* This,HRESULT *phr) {
    return This->lpVtbl->GetRenewalHResult(This,phr);
}
static FORCEINLINE HRESULT IESLicenseRenewalResultEvent_GetEntitlementTokenLength(IESLicenseRenewalResultEvent* This,DWORD *pdwLength) {
    return This->lpVtbl->GetEntitlementTokenLength(This,pdwLength);
}
static FORCEINLINE HRESULT IESLicenseRenewalResultEvent_GetEntitlementToken(IESLicenseRenewalResultEvent* This,SAFEARRAY **pbData) {
    return This->lpVtbl->GetEntitlementToken(This,pbData);
}
static FORCEINLINE HRESULT IESLicenseRenewalResultEvent_GetExpiryDate(IESLicenseRenewalResultEvent* This,DWORD64 *pqwExpiryDate) {
    return This->lpVtbl->GetExpiryDate(This,pqwExpiryDate);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IESLicenseRenewalResultEvent_GetCallersId_Proxy(
    IESLicenseRenewalResultEvent* This,
    DWORD *pdwCallersId);
void __RPC_STUB IESLicenseRenewalResultEvent_GetCallersId_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IESLicenseRenewalResultEvent_GetFileName_Proxy(
    IESLicenseRenewalResultEvent* This,
    BSTR *pbstrFilename);
void __RPC_STUB IESLicenseRenewalResultEvent_GetFileName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IESLicenseRenewalResultEvent_IsRenewalSuccessful_Proxy(
    IESLicenseRenewalResultEvent* This,
    WINBOOL *pfRenewalSuccessful);
void __RPC_STUB IESLicenseRenewalResultEvent_IsRenewalSuccessful_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IESLicenseRenewalResultEvent_IsCheckEntitlementCallRequired_Proxy(
    IESLicenseRenewalResultEvent* This,
    WINBOOL *pfCheckEntTokenCallNeeded);
void __RPC_STUB IESLicenseRenewalResultEvent_IsCheckEntitlementCallRequired_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IESLicenseRenewalResultEvent_GetDescrambledStatus_Proxy(
    IESLicenseRenewalResultEvent* This,
    DWORD *pDescrambledStatus);
void __RPC_STUB IESLicenseRenewalResultEvent_GetDescrambledStatus_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IESLicenseRenewalResultEvent_GetRenewalResultCode_Proxy(
    IESLicenseRenewalResultEvent* This,
    DWORD *pdwRenewalResultCode);
void __RPC_STUB IESLicenseRenewalResultEvent_GetRenewalResultCode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IESLicenseRenewalResultEvent_GetCASFailureCode_Proxy(
    IESLicenseRenewalResultEvent* This,
    DWORD *pdwCASFailureCode);
void __RPC_STUB IESLicenseRenewalResultEvent_GetCASFailureCode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IESLicenseRenewalResultEvent_GetRenewalHResult_Proxy(
    IESLicenseRenewalResultEvent* This,
    HRESULT *phr);
void __RPC_STUB IESLicenseRenewalResultEvent_GetRenewalHResult_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IESLicenseRenewalResultEvent_GetEntitlementTokenLength_Proxy(
    IESLicenseRenewalResultEvent* This,
    DWORD *pdwLength);
void __RPC_STUB IESLicenseRenewalResultEvent_GetEntitlementTokenLength_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IESLicenseRenewalResultEvent_GetEntitlementToken_Proxy(
    IESLicenseRenewalResultEvent* This,
    SAFEARRAY **pbData);
void __RPC_STUB IESLicenseRenewalResultEvent_GetEntitlementToken_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IESLicenseRenewalResultEvent_GetExpiryDate_Proxy(
    IESLicenseRenewalResultEvent* This,
    DWORD64 *pqwExpiryDate);
void __RPC_STUB IESLicenseRenewalResultEvent_GetExpiryDate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IESLicenseRenewalResultEvent_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IESFileExpiryDateEvent interface
 */
#ifndef __IESFileExpiryDateEvent_INTERFACE_DEFINED__
#define __IESFileExpiryDateEvent_INTERFACE_DEFINED__

DEFINE_GUID(IID_IESFileExpiryDateEvent, 0xba9edcb6, 0x4d36, 0x4cfe, 0x8c,0x56, 0x87,0xa6,0xb0,0xca,0x48,0xe1);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("ba9edcb6-4d36-4cfe-8c56-87a6b0ca48e1")
IESFileExpiryDateEvent : public IESEvent
{
    virtual HRESULT STDMETHODCALLTYPE GetTunerId(
        GUID *pguidTunerId) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetExpiryDate(
        DWORD64 *pqwExpiryDate) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFinalExpiryDate(
        DWORD64 *pqwExpiryDate) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMaxRenewalCount(
        DWORD *dwMaxRenewalCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsEntitlementTokenPresent(
        WINBOOL *pfEntTokenPresent) = 0;

    virtual HRESULT STDMETHODCALLTYPE DoesExpireAfterFirstUse(
        WINBOOL *pfExpireAfterFirstUse) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IESFileExpiryDateEvent, 0xba9edcb6, 0x4d36, 0x4cfe, 0x8c,0x56, 0x87,0xa6,0xb0,0xca,0x48,0xe1)
#endif
#else
typedef struct IESFileExpiryDateEventVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IESEvent methods ***/
    HRESULT (STDMETHODCALLTYPE *GetEventId)(
        IESFileExpiryDateEvent* This,
        DWORD *pdwEventId);

    HRESULT (STDMETHODCALLTYPE *GetEventType)(
        IESFileExpiryDateEvent* This,
        GUID *pguidEventType);

    HRESULT (STDMETHODCALLTYPE *SetCompletionStatus)(
        IESFileExpiryDateEvent* This,
        DWORD dwResult);

    HRESULT (STDMETHODCALLTYPE *GetData)(
        IESFileExpiryDateEvent* This,
        SAFEARRAY **pbData);

    HRESULT (STDMETHODCALLTYPE *GetStringData)(
        IESFileExpiryDateEvent* This,
        BSTR *pbstrData);

    /*** IESFileExpiryDateEvent methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTunerId)(
        IESFileExpiryDateEvent* This,
        GUID *pguidTunerId);

    HRESULT (STDMETHODCALLTYPE *GetExpiryDate)(
        IESFileExpiryDateEvent* This,
        DWORD64 *pqwExpiryDate);

    HRESULT (STDMETHODCALLTYPE *GetFinalExpiryDate)(
        IESFileExpiryDateEvent* This,
        DWORD64 *pqwExpiryDate);

    HRESULT (STDMETHODCALLTYPE *GetMaxRenewalCount)(
        IESFileExpiryDateEvent* This,
        DWORD *dwMaxRenewalCount);

    HRESULT (STDMETHODCALLTYPE *IsEntitlementTokenPresent)(
        IESFileExpiryDateEvent* This,
        WINBOOL *pfEntTokenPresent);

    HRESULT (STDMETHODCALLTYPE *DoesExpireAfterFirstUse)(
        IESFileExpiryDateEvent* This,
        WINBOOL *pfExpireAfterFirstUse);

    END_INTERFACE
} IESFileExpiryDateEventVtbl;
interface IESFileExpiryDateEvent {
    CONST_VTBL IESFileExpiryDateEventVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IESFileExpiryDateEvent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IESFileExpiryDateEvent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IESFileExpiryDateEvent_Release(This) (This)->lpVtbl->Release(This)
/*** IESEvent methods ***/
#define IESFileExpiryDateEvent_GetEventId(This,pdwEventId) (This)->lpVtbl->GetEventId(This,pdwEventId)
#define IESFileExpiryDateEvent_GetEventType(This,pguidEventType) (This)->lpVtbl->GetEventType(This,pguidEventType)
#define IESFileExpiryDateEvent_SetCompletionStatus(This,dwResult) (This)->lpVtbl->SetCompletionStatus(This,dwResult)
#define IESFileExpiryDateEvent_GetData(This,pbData) (This)->lpVtbl->GetData(This,pbData)
#define IESFileExpiryDateEvent_GetStringData(This,pbstrData) (This)->lpVtbl->GetStringData(This,pbstrData)
/*** IESFileExpiryDateEvent methods ***/
#define IESFileExpiryDateEvent_GetTunerId(This,pguidTunerId) (This)->lpVtbl->GetTunerId(This,pguidTunerId)
#define IESFileExpiryDateEvent_GetExpiryDate(This,pqwExpiryDate) (This)->lpVtbl->GetExpiryDate(This,pqwExpiryDate)
#define IESFileExpiryDateEvent_GetFinalExpiryDate(This,pqwExpiryDate) (This)->lpVtbl->GetFinalExpiryDate(This,pqwExpiryDate)
#define IESFileExpiryDateEvent_GetMaxRenewalCount(This,dwMaxRenewalCount) (This)->lpVtbl->GetMaxRenewalCount(This,dwMaxRenewalCount)
#define IESFileExpiryDateEvent_IsEntitlementTokenPresent(This,pfEntTokenPresent) (This)->lpVtbl->IsEntitlementTokenPresent(This,pfEntTokenPresent)
#define IESFileExpiryDateEvent_DoesExpireAfterFirstUse(This,pfExpireAfterFirstUse) (This)->lpVtbl->DoesExpireAfterFirstUse(This,pfExpireAfterFirstUse)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IESFileExpiryDateEvent_QueryInterface(IESFileExpiryDateEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IESFileExpiryDateEvent_AddRef(IESFileExpiryDateEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IESFileExpiryDateEvent_Release(IESFileExpiryDateEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IESEvent methods ***/
static FORCEINLINE HRESULT IESFileExpiryDateEvent_GetEventId(IESFileExpiryDateEvent* This,DWORD *pdwEventId) {
    return This->lpVtbl->GetEventId(This,pdwEventId);
}
static FORCEINLINE HRESULT IESFileExpiryDateEvent_GetEventType(IESFileExpiryDateEvent* This,GUID *pguidEventType) {
    return This->lpVtbl->GetEventType(This,pguidEventType);
}
static FORCEINLINE HRESULT IESFileExpiryDateEvent_SetCompletionStatus(IESFileExpiryDateEvent* This,DWORD dwResult) {
    return This->lpVtbl->SetCompletionStatus(This,dwResult);
}
static FORCEINLINE HRESULT IESFileExpiryDateEvent_GetData(IESFileExpiryDateEvent* This,SAFEARRAY **pbData) {
    return This->lpVtbl->GetData(This,pbData);
}
static FORCEINLINE HRESULT IESFileExpiryDateEvent_GetStringData(IESFileExpiryDateEvent* This,BSTR *pbstrData) {
    return This->lpVtbl->GetStringData(This,pbstrData);
}
/*** IESFileExpiryDateEvent methods ***/
static FORCEINLINE HRESULT IESFileExpiryDateEvent_GetTunerId(IESFileExpiryDateEvent* This,GUID *pguidTunerId) {
    return This->lpVtbl->GetTunerId(This,pguidTunerId);
}
static FORCEINLINE HRESULT IESFileExpiryDateEvent_GetExpiryDate(IESFileExpiryDateEvent* This,DWORD64 *pqwExpiryDate) {
    return This->lpVtbl->GetExpiryDate(This,pqwExpiryDate);
}
static FORCEINLINE HRESULT IESFileExpiryDateEvent_GetFinalExpiryDate(IESFileExpiryDateEvent* This,DWORD64 *pqwExpiryDate) {
    return This->lpVtbl->GetFinalExpiryDate(This,pqwExpiryDate);
}
static FORCEINLINE HRESULT IESFileExpiryDateEvent_GetMaxRenewalCount(IESFileExpiryDateEvent* This,DWORD *dwMaxRenewalCount) {
    return This->lpVtbl->GetMaxRenewalCount(This,dwMaxRenewalCount);
}
static FORCEINLINE HRESULT IESFileExpiryDateEvent_IsEntitlementTokenPresent(IESFileExpiryDateEvent* This,WINBOOL *pfEntTokenPresent) {
    return This->lpVtbl->IsEntitlementTokenPresent(This,pfEntTokenPresent);
}
static FORCEINLINE HRESULT IESFileExpiryDateEvent_DoesExpireAfterFirstUse(IESFileExpiryDateEvent* This,WINBOOL *pfExpireAfterFirstUse) {
    return This->lpVtbl->DoesExpireAfterFirstUse(This,pfExpireAfterFirstUse);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IESFileExpiryDateEvent_GetTunerId_Proxy(
    IESFileExpiryDateEvent* This,
    GUID *pguidTunerId);
void __RPC_STUB IESFileExpiryDateEvent_GetTunerId_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IESFileExpiryDateEvent_GetExpiryDate_Proxy(
    IESFileExpiryDateEvent* This,
    DWORD64 *pqwExpiryDate);
void __RPC_STUB IESFileExpiryDateEvent_GetExpiryDate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IESFileExpiryDateEvent_GetFinalExpiryDate_Proxy(
    IESFileExpiryDateEvent* This,
    DWORD64 *pqwExpiryDate);
void __RPC_STUB IESFileExpiryDateEvent_GetFinalExpiryDate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IESFileExpiryDateEvent_GetMaxRenewalCount_Proxy(
    IESFileExpiryDateEvent* This,
    DWORD *dwMaxRenewalCount);
void __RPC_STUB IESFileExpiryDateEvent_GetMaxRenewalCount_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IESFileExpiryDateEvent_IsEntitlementTokenPresent_Proxy(
    IESFileExpiryDateEvent* This,
    WINBOOL *pfEntTokenPresent);
void __RPC_STUB IESFileExpiryDateEvent_IsEntitlementTokenPresent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IESFileExpiryDateEvent_DoesExpireAfterFirstUse_Proxy(
    IESFileExpiryDateEvent* This,
    WINBOOL *pfExpireAfterFirstUse);
void __RPC_STUB IESFileExpiryDateEvent_DoesExpireAfterFirstUse_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IESFileExpiryDateEvent_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IESEvents interface
 */
#ifndef __IESEvents_INTERFACE_DEFINED__
#define __IESEvents_INTERFACE_DEFINED__

DEFINE_GUID(IID_IESEvents, 0xabd414bf, 0xcfe5, 0x4e5e, 0xaf,0x5b, 0x4b,0x4e,0x49,0xc5,0xbf,0xeb);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("abd414bf-cfe5-4e5e-af5b-4b4e49c5bfeb")
IESEvents : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnESEventReceived(
        GUID guidEventType,
        IESEvent *pESEvent) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IESEvents, 0xabd414bf, 0xcfe5, 0x4e5e, 0xaf,0x5b, 0x4b,0x4e,0x49,0xc5,0xbf,0xeb)
#endif
#else
typedef struct IESEventsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IESEvents methods ***/
    HRESULT (STDMETHODCALLTYPE *OnESEventReceived)(
        IESEvents* This,
        GUID guidEventType,
        IESEvent *pESEvent);

    END_INTERFACE
} IESEventsVtbl;
interface IESEvents {
    CONST_VTBL IESEventsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IESEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IESEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IESEvents_Release(This) (This)->lpVtbl->Release(This)
/*** IESEvents methods ***/
#define IESEvents_OnESEventReceived(This,guidEventType,pESEvent) (This)->lpVtbl->OnESEventReceived(This,guidEventType,pESEvent)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IESEvents_QueryInterface(IESEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IESEvents_AddRef(IESEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IESEvents_Release(IESEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IESEvents methods ***/
static FORCEINLINE HRESULT IESEvents_OnESEventReceived(IESEvents* This,GUID guidEventType,IESEvent *pESEvent) {
    return This->lpVtbl->OnESEventReceived(This,guidEventType,pESEvent);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IESEvents_OnESEventReceived_Proxy(
    IESEvents* This,
    GUID guidEventType,
    IESEvent *pESEvent);
void __RPC_STUB IESEvents_OnESEventReceived_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IESEvents_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IESEventService interface
 */
#ifndef __IESEventService_INTERFACE_DEFINED__
#define __IESEventService_INTERFACE_DEFINED__

DEFINE_GUID(IID_IESEventService, 0xed89a619, 0x4c06, 0x4b2f, 0x99,0xeb, 0xc7,0x66,0x9b,0x13,0x04,0x7c);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("ed89a619-4c06-4b2f-99eb-c7669b13047c")
IESEventService : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE FireESEvent(
        IESEvent *pESEvent) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IESEventService, 0xed89a619, 0x4c06, 0x4b2f, 0x99,0xeb, 0xc7,0x66,0x9b,0x13,0x04,0x7c)
#endif
#else
typedef struct IESEventServiceVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IESEventService methods ***/
    HRESULT (STDMETHODCALLTYPE *FireESEvent)(
        IESEventService* This,
        IESEvent *pESEvent);

    END_INTERFACE
} IESEventServiceVtbl;
interface IESEventService {
    CONST_VTBL IESEventServiceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IESEventService_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IESEventService_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IESEventService_Release(This) (This)->lpVtbl->Release(This)
/*** IESEventService methods ***/
#define IESEventService_FireESEvent(This,pESEvent) (This)->lpVtbl->FireESEvent(This,pESEvent)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IESEventService_QueryInterface(IESEventService* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IESEventService_AddRef(IESEventService* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IESEventService_Release(IESEventService* This) {
    return This->lpVtbl->Release(This);
}
/*** IESEventService methods ***/
static FORCEINLINE HRESULT IESEventService_FireESEvent(IESEventService* This,IESEvent *pESEvent) {
    return This->lpVtbl->FireESEvent(This,pESEvent);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IESEventService_FireESEvent_Proxy(
    IESEventService* This,
    IESEvent *pESEvent);
void __RPC_STUB IESEventService_FireESEvent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IESEventService_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IESEventServiceConfiguration interface
 */
#ifndef __IESEventServiceConfiguration_INTERFACE_DEFINED__
#define __IESEventServiceConfiguration_INTERFACE_DEFINED__

DEFINE_GUID(IID_IESEventServiceConfiguration, 0x33b9daae, 0x9309, 0x491d, 0xa0,0x51, 0xbc,0xad,0x2a,0x70,0xcd,0x66);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("33b9daae-9309-491d-a051-bcad2a70cd66")
IESEventServiceConfiguration : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetParent(
        IESEventService *pEventService) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveParent(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetOwner(
        IESEvents *pESEvents) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveOwner(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetGraph(
        IFilterGraph *pGraph) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveGraph(
        IFilterGraph *pGraph) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IESEventServiceConfiguration, 0x33b9daae, 0x9309, 0x491d, 0xa0,0x51, 0xbc,0xad,0x2a,0x70,0xcd,0x66)
#endif
#else
typedef struct IESEventServiceConfigurationVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IESEventServiceConfiguration methods ***/
    HRESULT (STDMETHODCALLTYPE *SetParent)(
        IESEventServiceConfiguration* This,
        IESEventService *pEventService);

    HRESULT (STDMETHODCALLTYPE *RemoveParent)(
        IESEventServiceConfiguration* This);

    HRESULT (STDMETHODCALLTYPE *SetOwner)(
        IESEventServiceConfiguration* This,
        IESEvents *pESEvents);

    HRESULT (STDMETHODCALLTYPE *RemoveOwner)(
        IESEventServiceConfiguration* This);

    HRESULT (STDMETHODCALLTYPE *SetGraph)(
        IESEventServiceConfiguration* This,
        IFilterGraph *pGraph);

    HRESULT (STDMETHODCALLTYPE *RemoveGraph)(
        IESEventServiceConfiguration* This,
        IFilterGraph *pGraph);

    END_INTERFACE
} IESEventServiceConfigurationVtbl;
interface IESEventServiceConfiguration {
    CONST_VTBL IESEventServiceConfigurationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IESEventServiceConfiguration_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IESEventServiceConfiguration_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IESEventServiceConfiguration_Release(This) (This)->lpVtbl->Release(This)
/*** IESEventServiceConfiguration methods ***/
#define IESEventServiceConfiguration_SetParent(This,pEventService) (This)->lpVtbl->SetParent(This,pEventService)
#define IESEventServiceConfiguration_RemoveParent(This) (This)->lpVtbl->RemoveParent(This)
#define IESEventServiceConfiguration_SetOwner(This,pESEvents) (This)->lpVtbl->SetOwner(This,pESEvents)
#define IESEventServiceConfiguration_RemoveOwner(This) (This)->lpVtbl->RemoveOwner(This)
#define IESEventServiceConfiguration_SetGraph(This,pGraph) (This)->lpVtbl->SetGraph(This,pGraph)
#define IESEventServiceConfiguration_RemoveGraph(This,pGraph) (This)->lpVtbl->RemoveGraph(This,pGraph)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IESEventServiceConfiguration_QueryInterface(IESEventServiceConfiguration* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IESEventServiceConfiguration_AddRef(IESEventServiceConfiguration* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IESEventServiceConfiguration_Release(IESEventServiceConfiguration* This) {
    return This->lpVtbl->Release(This);
}
/*** IESEventServiceConfiguration methods ***/
static FORCEINLINE HRESULT IESEventServiceConfiguration_SetParent(IESEventServiceConfiguration* This,IESEventService *pEventService) {
    return This->lpVtbl->SetParent(This,pEventService);
}
static FORCEINLINE HRESULT IESEventServiceConfiguration_RemoveParent(IESEventServiceConfiguration* This) {
    return This->lpVtbl->RemoveParent(This);
}
static FORCEINLINE HRESULT IESEventServiceConfiguration_SetOwner(IESEventServiceConfiguration* This,IESEvents *pESEvents) {
    return This->lpVtbl->SetOwner(This,pESEvents);
}
static FORCEINLINE HRESULT IESEventServiceConfiguration_RemoveOwner(IESEventServiceConfiguration* This) {
    return This->lpVtbl->RemoveOwner(This);
}
static FORCEINLINE HRESULT IESEventServiceConfiguration_SetGraph(IESEventServiceConfiguration* This,IFilterGraph *pGraph) {
    return This->lpVtbl->SetGraph(This,pGraph);
}
static FORCEINLINE HRESULT IESEventServiceConfiguration_RemoveGraph(IESEventServiceConfiguration* This,IFilterGraph *pGraph) {
    return This->lpVtbl->RemoveGraph(This,pGraph);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IESEventServiceConfiguration_SetParent_Proxy(
    IESEventServiceConfiguration* This,
    IESEventService *pEventService);
void __RPC_STUB IESEventServiceConfiguration_SetParent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IESEventServiceConfiguration_RemoveParent_Proxy(
    IESEventServiceConfiguration* This);
void __RPC_STUB IESEventServiceConfiguration_RemoveParent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IESEventServiceConfiguration_SetOwner_Proxy(
    IESEventServiceConfiguration* This,
    IESEvents *pESEvents);
void __RPC_STUB IESEventServiceConfiguration_SetOwner_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IESEventServiceConfiguration_RemoveOwner_Proxy(
    IESEventServiceConfiguration* This);
void __RPC_STUB IESEventServiceConfiguration_RemoveOwner_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IESEventServiceConfiguration_SetGraph_Proxy(
    IESEventServiceConfiguration* This,
    IFilterGraph *pGraph);
void __RPC_STUB IESEventServiceConfiguration_SetGraph_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IESEventServiceConfiguration_RemoveGraph_Proxy(
    IESEventServiceConfiguration* This,
    IFilterGraph *pGraph);
void __RPC_STUB IESEventServiceConfiguration_RemoveGraph_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IESEventServiceConfiguration_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IBroadcastEvent interface
 */
#ifndef __IBroadcastEvent_INTERFACE_DEFINED__
#define __IBroadcastEvent_INTERFACE_DEFINED__

DEFINE_GUID(IID_IBroadcastEvent, 0x3b21263f, 0x26e8, 0x489d, 0xaa,0xc4, 0x92,0x4f,0x7e,0xfd,0x95,0x11);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3b21263f-26e8-489d-aac4-924f7efd9511")
IBroadcastEvent : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Fire(
        GUID EventID) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IBroadcastEvent, 0x3b21263f, 0x26e8, 0x489d, 0xaa,0xc4, 0x92,0x4f,0x7e,0xfd,0x95,0x11)
#endif
#else
typedef struct IBroadcastEventVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IBroadcastEvent methods ***/
    HRESULT (STDMETHODCALLTYPE *Fire)(
        IBroadcastEvent* This,
        GUID EventID);

    END_INTERFACE
} IBroadcastEventVtbl;
interface IBroadcastEvent {
    CONST_VTBL IBroadcastEventVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IBroadcastEvent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IBroadcastEvent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IBroadcastEvent_Release(This) (This)->lpVtbl->Release(This)
/*** IBroadcastEvent methods ***/
#define IBroadcastEvent_Fire(This,EventID) (This)->lpVtbl->Fire(This,EventID)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IBroadcastEvent_QueryInterface(IBroadcastEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IBroadcastEvent_AddRef(IBroadcastEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IBroadcastEvent_Release(IBroadcastEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IBroadcastEvent methods ***/
static FORCEINLINE HRESULT IBroadcastEvent_Fire(IBroadcastEvent* This,GUID EventID) {
    return This->lpVtbl->Fire(This,EventID);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IBroadcastEvent_Fire_Proxy(
    IBroadcastEvent* This,
    GUID EventID);
void __RPC_STUB IBroadcastEvent_Fire_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IBroadcastEvent_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IBroadcastEventEx interface
 */
#ifndef __IBroadcastEventEx_INTERFACE_DEFINED__
#define __IBroadcastEventEx_INTERFACE_DEFINED__

DEFINE_GUID(IID_IBroadcastEventEx, 0x3d9e3887, 0x1929, 0x423f, 0x80,0x21, 0x43,0x68,0x2d,0xe9,0x54,0x48);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3d9e3887-1929-423f-8021-43682de95448")
IBroadcastEventEx : public IBroadcastEvent
{
    virtual HRESULT STDMETHODCALLTYPE FireEx(
        GUID EventID,
        ULONG Param1,
        ULONG Param2,
        ULONG Param3,
        ULONG Param4) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IBroadcastEventEx, 0x3d9e3887, 0x1929, 0x423f, 0x80,0x21, 0x43,0x68,0x2d,0xe9,0x54,0x48)
#endif
#else
typedef struct IBroadcastEventExVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IBroadcastEvent methods ***/
    HRESULT (STDMETHODCALLTYPE *Fire)(
        IBroadcastEventEx* This,
        GUID EventID);

    /*** IBroadcastEventEx methods ***/
    HRESULT (STDMETHODCALLTYPE *FireEx)(
        IBroadcastEventEx* This,
        GUID EventID,
        ULONG Param1,
        ULONG Param2,
        ULONG Param3,
        ULONG Param4);

    END_INTERFACE
} IBroadcastEventExVtbl;
interface IBroadcastEventEx {
    CONST_VTBL IBroadcastEventExVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IBroadcastEventEx_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IBroadcastEventEx_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IBroadcastEventEx_Release(This) (This)->lpVtbl->Release(This)
/*** IBroadcastEvent methods ***/
#define IBroadcastEventEx_Fire(This,EventID) (This)->lpVtbl->Fire(This,EventID)
/*** IBroadcastEventEx methods ***/
#define IBroadcastEventEx_FireEx(This,EventID,Param1,Param2,Param3,Param4) (This)->lpVtbl->FireEx(This,EventID,Param1,Param2,Param3,Param4)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IBroadcastEventEx_QueryInterface(IBroadcastEventEx* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IBroadcastEventEx_AddRef(IBroadcastEventEx* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IBroadcastEventEx_Release(IBroadcastEventEx* This) {
    return This->lpVtbl->Release(This);
}
/*** IBroadcastEvent methods ***/
static FORCEINLINE HRESULT IBroadcastEventEx_Fire(IBroadcastEventEx* This,GUID EventID) {
    return This->lpVtbl->Fire(This,EventID);
}
/*** IBroadcastEventEx methods ***/
static FORCEINLINE HRESULT IBroadcastEventEx_FireEx(IBroadcastEventEx* This,GUID EventID,ULONG Param1,ULONG Param2,ULONG Param3,ULONG Param4) {
    return This->lpVtbl->FireEx(This,EventID,Param1,Param2,Param3,Param4);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IBroadcastEventEx_FireEx_Proxy(
    IBroadcastEventEx* This,
    GUID EventID,
    ULONG Param1,
    ULONG Param2,
    ULONG Param3,
    ULONG Param4);
void __RPC_STUB IBroadcastEventEx_FireEx_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IBroadcastEventEx_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IRegisterTuner interface
 */
#ifndef __IRegisterTuner_INTERFACE_DEFINED__
#define __IRegisterTuner_INTERFACE_DEFINED__

DEFINE_GUID(IID_IRegisterTuner, 0x359b3901, 0x572c, 0x4854, 0xbb,0x49, 0xcd,0xef,0x66,0x60,0x6a,0x25);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("359b3901-572c-4854-bb49-cdef66606a25")
IRegisterTuner : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Register(
        ITuner *pTuner,
        IGraphBuilder *pGraph) = 0;

    virtual HRESULT STDMETHODCALLTYPE Unregister(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IRegisterTuner, 0x359b3901, 0x572c, 0x4854, 0xbb,0x49, 0xcd,0xef,0x66,0x60,0x6a,0x25)
#endif
#else
typedef struct IRegisterTunerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IRegisterTuner methods ***/
    HRESULT (STDMETHODCALLTYPE *Register)(
        IRegisterTuner* This,
        ITuner *pTuner,
        IGraphBuilder *pGraph);

    HRESULT (STDMETHODCALLTYPE *Unregister)(
        IRegisterTuner* This);

    END_INTERFACE
} IRegisterTunerVtbl;
interface IRegisterTuner {
    CONST_VTBL IRegisterTunerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IRegisterTuner_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRegisterTuner_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRegisterTuner_Release(This) (This)->lpVtbl->Release(This)
/*** IRegisterTuner methods ***/
#define IRegisterTuner_Register(This,pTuner,pGraph) (This)->lpVtbl->Register(This,pTuner,pGraph)
#define IRegisterTuner_Unregister(This) (This)->lpVtbl->Unregister(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IRegisterTuner_QueryInterface(IRegisterTuner* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IRegisterTuner_AddRef(IRegisterTuner* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IRegisterTuner_Release(IRegisterTuner* This) {
    return This->lpVtbl->Release(This);
}
/*** IRegisterTuner methods ***/
static FORCEINLINE HRESULT IRegisterTuner_Register(IRegisterTuner* This,ITuner *pTuner,IGraphBuilder *pGraph) {
    return This->lpVtbl->Register(This,pTuner,pGraph);
}
static FORCEINLINE HRESULT IRegisterTuner_Unregister(IRegisterTuner* This) {
    return This->lpVtbl->Unregister(This);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IRegisterTuner_Register_Proxy(
    IRegisterTuner* This,
    ITuner *pTuner,
    IGraphBuilder *pGraph);
void __RPC_STUB IRegisterTuner_Register_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IRegisterTuner_Unregister_Proxy(
    IRegisterTuner* This);
void __RPC_STUB IRegisterTuner_Unregister_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IRegisterTuner_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IBDAComparable interface
 */
#ifndef __IBDAComparable_INTERFACE_DEFINED__
#define __IBDAComparable_INTERFACE_DEFINED__

DEFINE_GUID(IID_IBDAComparable, 0xb34505e0, 0x2f0e, 0x497b, 0x80,0xbc, 0xd4,0x3f,0x3b,0x24,0xed,0x7f);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("b34505e0-2f0e-497b-80bc-d43f3b24ed7f")
IBDAComparable : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE CompareExact(
        IDispatch *CompareTo,
        LONG *Result) = 0;

    virtual HRESULT STDMETHODCALLTYPE CompareEquivalent(
        IDispatch *CompareTo,
        DWORD dwFlags,
        LONG *Result) = 0;

    virtual HRESULT STDMETHODCALLTYPE HashExact(
        INT64 *Result) = 0;

    virtual HRESULT STDMETHODCALLTYPE HashExactIncremental(
        INT64 PartialResult,
        INT64 *Result) = 0;

    virtual HRESULT STDMETHODCALLTYPE HashEquivalent(
        DWORD dwFlags,
        INT64 *Result) = 0;

    virtual HRESULT STDMETHODCALLTYPE HashEquivalentIncremental(
        INT64 PartialResult,
        DWORD dwFlags,
        INT64 *Result) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IBDAComparable, 0xb34505e0, 0x2f0e, 0x497b, 0x80,0xbc, 0xd4,0x3f,0x3b,0x24,0xed,0x7f)
#endif
#else
typedef struct IBDAComparableVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IBDAComparable methods ***/
    HRESULT (STDMETHODCALLTYPE *CompareExact)(
        IBDAComparable* This,
        IDispatch *CompareTo,
        LONG *Result);

    HRESULT (STDMETHODCALLTYPE *CompareEquivalent)(
        IBDAComparable* This,
        IDispatch *CompareTo,
        DWORD dwFlags,
        LONG *Result);

    HRESULT (STDMETHODCALLTYPE *HashExact)(
        IBDAComparable* This,
        INT64 *Result);

    HRESULT (STDMETHODCALLTYPE *HashExactIncremental)(
        IBDAComparable* This,
        INT64 PartialResult,
        INT64 *Result);

    HRESULT (STDMETHODCALLTYPE *HashEquivalent)(
        IBDAComparable* This,
        DWORD dwFlags,
        INT64 *Result);

    HRESULT (STDMETHODCALLTYPE *HashEquivalentIncremental)(
        IBDAComparable* This,
        INT64 PartialResult,
        DWORD dwFlags,
        INT64 *Result);

    END_INTERFACE
} IBDAComparableVtbl;
interface IBDAComparable {
    CONST_VTBL IBDAComparableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IBDAComparable_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IBDAComparable_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IBDAComparable_Release(This) (This)->lpVtbl->Release(This)
/*** IBDAComparable methods ***/
#define IBDAComparable_CompareExact(This,CompareTo,Result) (This)->lpVtbl->CompareExact(This,CompareTo,Result)
#define IBDAComparable_CompareEquivalent(This,CompareTo,dwFlags,Result) (This)->lpVtbl->CompareEquivalent(This,CompareTo,dwFlags,Result)
#define IBDAComparable_HashExact(This,Result) (This)->lpVtbl->HashExact(This,Result)
#define IBDAComparable_HashExactIncremental(This,PartialResult,Result) (This)->lpVtbl->HashExactIncremental(This,PartialResult,Result)
#define IBDAComparable_HashEquivalent(This,dwFlags,Result) (This)->lpVtbl->HashEquivalent(This,dwFlags,Result)
#define IBDAComparable_HashEquivalentIncremental(This,PartialResult,dwFlags,Result) (This)->lpVtbl->HashEquivalentIncremental(This,PartialResult,dwFlags,Result)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IBDAComparable_QueryInterface(IBDAComparable* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IBDAComparable_AddRef(IBDAComparable* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IBDAComparable_Release(IBDAComparable* This) {
    return This->lpVtbl->Release(This);
}
/*** IBDAComparable methods ***/
static FORCEINLINE HRESULT IBDAComparable_CompareExact(IBDAComparable* This,IDispatch *CompareTo,LONG *Result) {
    return This->lpVtbl->CompareExact(This,CompareTo,Result);
}
static FORCEINLINE HRESULT IBDAComparable_CompareEquivalent(IBDAComparable* This,IDispatch *CompareTo,DWORD dwFlags,LONG *Result) {
    return This->lpVtbl->CompareEquivalent(This,CompareTo,dwFlags,Result);
}
static FORCEINLINE HRESULT IBDAComparable_HashExact(IBDAComparable* This,INT64 *Result) {
    return This->lpVtbl->HashExact(This,Result);
}
static FORCEINLINE HRESULT IBDAComparable_HashExactIncremental(IBDAComparable* This,INT64 PartialResult,INT64 *Result) {
    return This->lpVtbl->HashExactIncremental(This,PartialResult,Result);
}
static FORCEINLINE HRESULT IBDAComparable_HashEquivalent(IBDAComparable* This,DWORD dwFlags,INT64 *Result) {
    return This->lpVtbl->HashEquivalent(This,dwFlags,Result);
}
static FORCEINLINE HRESULT IBDAComparable_HashEquivalentIncremental(IBDAComparable* This,INT64 PartialResult,DWORD dwFlags,INT64 *Result) {
    return This->lpVtbl->HashEquivalentIncremental(This,PartialResult,dwFlags,Result);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IBDAComparable_CompareExact_Proxy(
    IBDAComparable* This,
    IDispatch *CompareTo,
    LONG *Result);
void __RPC_STUB IBDAComparable_CompareExact_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IBDAComparable_CompareEquivalent_Proxy(
    IBDAComparable* This,
    IDispatch *CompareTo,
    DWORD dwFlags,
    LONG *Result);
void __RPC_STUB IBDAComparable_CompareEquivalent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IBDAComparable_HashExact_Proxy(
    IBDAComparable* This,
    INT64 *Result);
void __RPC_STUB IBDAComparable_HashExact_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IBDAComparable_HashExactIncremental_Proxy(
    IBDAComparable* This,
    INT64 PartialResult,
    INT64 *Result);
void __RPC_STUB IBDAComparable_HashExactIncremental_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IBDAComparable_HashEquivalent_Proxy(
    IBDAComparable* This,
    DWORD dwFlags,
    INT64 *Result);
void __RPC_STUB IBDAComparable_HashEquivalent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IBDAComparable_HashEquivalentIncremental_Proxy(
    IBDAComparable* This,
    INT64 PartialResult,
    DWORD dwFlags,
    INT64 *Result);
void __RPC_STUB IBDAComparable_HashEquivalentIncremental_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IBDAComparable_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IPersistTuneXml interface
 */
#ifndef __IPersistTuneXml_INTERFACE_DEFINED__
#define __IPersistTuneXml_INTERFACE_DEFINED__

DEFINE_GUID(IID_IPersistTuneXml, 0x0754cd31, 0x8d15, 0x47a9, 0x82,0x15, 0xd2,0x00,0x64,0x15,0x72,0x44);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("0754cd31-8d15-47a9-8215-d20064157244")
IPersistTuneXml : public IPersist
{
    virtual HRESULT STDMETHODCALLTYPE InitNew(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Load(
        VARIANT varValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE Save(
        VARIANT *pvarFragment) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IPersistTuneXml, 0x0754cd31, 0x8d15, 0x47a9, 0x82,0x15, 0xd2,0x00,0x64,0x15,0x72,0x44)
#endif
#else
typedef struct IPersistTuneXmlVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IPersist methods ***/
    HRESULT (STDMETHODCALLTYPE *GetClassID)(
        IPersistTuneXml* This,
        CLSID *pClassID);

    /*** IPersistTuneXml methods ***/
    HRESULT (STDMETHODCALLTYPE *InitNew)(
        IPersistTuneXml* This);

    HRESULT (STDMETHODCALLTYPE *Load)(
        IPersistTuneXml* This,
        VARIANT varValue);

    HRESULT (STDMETHODCALLTYPE *Save)(
        IPersistTuneXml* This,
        VARIANT *pvarFragment);

    END_INTERFACE
} IPersistTuneXmlVtbl;
interface IPersistTuneXml {
    CONST_VTBL IPersistTuneXmlVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IPersistTuneXml_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPersistTuneXml_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPersistTuneXml_Release(This) (This)->lpVtbl->Release(This)
/*** IPersist methods ***/
#define IPersistTuneXml_GetClassID(This,pClassID) (This)->lpVtbl->GetClassID(This,pClassID)
/*** IPersistTuneXml methods ***/
#define IPersistTuneXml_InitNew(This) (This)->lpVtbl->InitNew(This)
#define IPersistTuneXml_Load(This,varValue) (This)->lpVtbl->Load(This,varValue)
#define IPersistTuneXml_Save(This,pvarFragment) (This)->lpVtbl->Save(This,pvarFragment)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IPersistTuneXml_QueryInterface(IPersistTuneXml* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IPersistTuneXml_AddRef(IPersistTuneXml* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IPersistTuneXml_Release(IPersistTuneXml* This) {
    return This->lpVtbl->Release(This);
}
/*** IPersist methods ***/
static FORCEINLINE HRESULT IPersistTuneXml_GetClassID(IPersistTuneXml* This,CLSID *pClassID) {
    return This->lpVtbl->GetClassID(This,pClassID);
}
/*** IPersistTuneXml methods ***/
static FORCEINLINE HRESULT IPersistTuneXml_InitNew(IPersistTuneXml* This) {
    return This->lpVtbl->InitNew(This);
}
static FORCEINLINE HRESULT IPersistTuneXml_Load(IPersistTuneXml* This,VARIANT varValue) {
    return This->lpVtbl->Load(This,varValue);
}
static FORCEINLINE HRESULT IPersistTuneXml_Save(IPersistTuneXml* This,VARIANT *pvarFragment) {
    return This->lpVtbl->Save(This,pvarFragment);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IPersistTuneXml_InitNew_Proxy(
    IPersistTuneXml* This);
void __RPC_STUB IPersistTuneXml_InitNew_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IPersistTuneXml_Load_Proxy(
    IPersistTuneXml* This,
    VARIANT varValue);
void __RPC_STUB IPersistTuneXml_Load_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IPersistTuneXml_Save_Proxy(
    IPersistTuneXml* This,
    VARIANT *pvarFragment);
void __RPC_STUB IPersistTuneXml_Save_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IPersistTuneXml_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IPersistTuneXmlUtility interface
 */
#ifndef __IPersistTuneXmlUtility_INTERFACE_DEFINED__
#define __IPersistTuneXmlUtility_INTERFACE_DEFINED__

DEFINE_GUID(IID_IPersistTuneXmlUtility, 0x990237ae, 0xac11, 0x4614, 0xbe,0x8f, 0xdd,0x21,0x7a,0x4c,0xb4,0xcb);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("990237ae-ac11-4614-be8f-dd217a4cb4cb")
IPersistTuneXmlUtility : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Deserialize(
        VARIANT varValue,
        IUnknown **ppObject) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IPersistTuneXmlUtility, 0x990237ae, 0xac11, 0x4614, 0xbe,0x8f, 0xdd,0x21,0x7a,0x4c,0xb4,0xcb)
#endif
#else
typedef struct IPersistTuneXmlUtilityVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IPersistTuneXmlUtility methods ***/
    HRESULT (STDMETHODCALLTYPE *Deserialize)(
        IPersistTuneXmlUtility* This,
        VARIANT varValue,
        IUnknown **ppObject);

    END_INTERFACE
} IPersistTuneXmlUtilityVtbl;
interface IPersistTuneXmlUtility {
    CONST_VTBL IPersistTuneXmlUtilityVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IPersistTuneXmlUtility_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPersistTuneXmlUtility_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPersistTuneXmlUtility_Release(This) (This)->lpVtbl->Release(This)
/*** IPersistTuneXmlUtility methods ***/
#define IPersistTuneXmlUtility_Deserialize(This,varValue,ppObject) (This)->lpVtbl->Deserialize(This,varValue,ppObject)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IPersistTuneXmlUtility_QueryInterface(IPersistTuneXmlUtility* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IPersistTuneXmlUtility_AddRef(IPersistTuneXmlUtility* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IPersistTuneXmlUtility_Release(IPersistTuneXmlUtility* This) {
    return This->lpVtbl->Release(This);
}
/*** IPersistTuneXmlUtility methods ***/
static FORCEINLINE HRESULT IPersistTuneXmlUtility_Deserialize(IPersistTuneXmlUtility* This,VARIANT varValue,IUnknown **ppObject) {
    return This->lpVtbl->Deserialize(This,varValue,ppObject);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IPersistTuneXmlUtility_Deserialize_Proxy(
    IPersistTuneXmlUtility* This,
    VARIANT varValue,
    IUnknown **ppObject);
void __RPC_STUB IPersistTuneXmlUtility_Deserialize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IPersistTuneXmlUtility_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IPersistTuneXmlUtility2 interface
 */
#ifndef __IPersistTuneXmlUtility2_INTERFACE_DEFINED__
#define __IPersistTuneXmlUtility2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IPersistTuneXmlUtility2, 0x992e165f, 0xea24, 0x4b2f, 0x9a,0x1d, 0x00,0x9d,0x92,0x12,0x04,0x51);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("992e165f-ea24-4b2f-9a1d-009d92120451")
IPersistTuneXmlUtility2 : public IPersistTuneXmlUtility
{
    virtual HRESULT STDMETHODCALLTYPE Serialize(
        ITuneRequest *piTuneRequest,
        BSTR *pString) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IPersistTuneXmlUtility2, 0x992e165f, 0xea24, 0x4b2f, 0x9a,0x1d, 0x00,0x9d,0x92,0x12,0x04,0x51)
#endif
#else
typedef struct IPersistTuneXmlUtility2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IPersistTuneXmlUtility methods ***/
    HRESULT (STDMETHODCALLTYPE *Deserialize)(
        IPersistTuneXmlUtility2* This,
        VARIANT varValue,
        IUnknown **ppObject);

    /*** IPersistTuneXmlUtility2 methods ***/
    HRESULT (STDMETHODCALLTYPE *Serialize)(
        IPersistTuneXmlUtility2* This,
        ITuneRequest *piTuneRequest,
        BSTR *pString);

    END_INTERFACE
} IPersistTuneXmlUtility2Vtbl;
interface IPersistTuneXmlUtility2 {
    CONST_VTBL IPersistTuneXmlUtility2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IPersistTuneXmlUtility2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IPersistTuneXmlUtility2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IPersistTuneXmlUtility2_Release(This) (This)->lpVtbl->Release(This)
/*** IPersistTuneXmlUtility methods ***/
#define IPersistTuneXmlUtility2_Deserialize(This,varValue,ppObject) (This)->lpVtbl->Deserialize(This,varValue,ppObject)
/*** IPersistTuneXmlUtility2 methods ***/
#define IPersistTuneXmlUtility2_Serialize(This,piTuneRequest,pString) (This)->lpVtbl->Serialize(This,piTuneRequest,pString)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IPersistTuneXmlUtility2_QueryInterface(IPersistTuneXmlUtility2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IPersistTuneXmlUtility2_AddRef(IPersistTuneXmlUtility2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IPersistTuneXmlUtility2_Release(IPersistTuneXmlUtility2* This) {
    return This->lpVtbl->Release(This);
}
/*** IPersistTuneXmlUtility methods ***/
static FORCEINLINE HRESULT IPersistTuneXmlUtility2_Deserialize(IPersistTuneXmlUtility2* This,VARIANT varValue,IUnknown **ppObject) {
    return This->lpVtbl->Deserialize(This,varValue,ppObject);
}
/*** IPersistTuneXmlUtility2 methods ***/
static FORCEINLINE HRESULT IPersistTuneXmlUtility2_Serialize(IPersistTuneXmlUtility2* This,ITuneRequest *piTuneRequest,BSTR *pString) {
    return This->lpVtbl->Serialize(This,piTuneRequest,pString);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IPersistTuneXmlUtility2_Serialize_Proxy(
    IPersistTuneXmlUtility2* This,
    ITuneRequest *piTuneRequest,
    BSTR *pString);
void __RPC_STUB IPersistTuneXmlUtility2_Serialize_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IPersistTuneXmlUtility2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IBDACreateTuneRequestEx interface
 */
#ifndef __IBDACreateTuneRequestEx_INTERFACE_DEFINED__
#define __IBDACreateTuneRequestEx_INTERFACE_DEFINED__

DEFINE_GUID(IID_IBDACreateTuneRequestEx, 0xc0a4a1d4, 0x2b3c, 0x491a, 0xba,0x22, 0x49,0x9f,0xba,0xdd,0x4d,0x12);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c0a4a1d4-2b3c-491a-ba22-499fbadd4d12")
IBDACreateTuneRequestEx : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE CreateTuneRequestEx(
        REFCLSID TuneRequestIID,
        ITuneRequest **TuneRequest) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IBDACreateTuneRequestEx, 0xc0a4a1d4, 0x2b3c, 0x491a, 0xba,0x22, 0x49,0x9f,0xba,0xdd,0x4d,0x12)
#endif
#else
typedef struct IBDACreateTuneRequestExVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IBDACreateTuneRequestEx methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateTuneRequestEx)(
        IBDACreateTuneRequestEx* This,
        REFCLSID TuneRequestIID,
        ITuneRequest **TuneRequest);

    END_INTERFACE
} IBDACreateTuneRequestExVtbl;
interface IBDACreateTuneRequestEx {
    CONST_VTBL IBDACreateTuneRequestExVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IBDACreateTuneRequestEx_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IBDACreateTuneRequestEx_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IBDACreateTuneRequestEx_Release(This) (This)->lpVtbl->Release(This)
/*** IBDACreateTuneRequestEx methods ***/
#define IBDACreateTuneRequestEx_CreateTuneRequestEx(This,TuneRequestIID,TuneRequest) (This)->lpVtbl->CreateTuneRequestEx(This,TuneRequestIID,TuneRequest)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IBDACreateTuneRequestEx_QueryInterface(IBDACreateTuneRequestEx* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IBDACreateTuneRequestEx_AddRef(IBDACreateTuneRequestEx* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IBDACreateTuneRequestEx_Release(IBDACreateTuneRequestEx* This) {
    return This->lpVtbl->Release(This);
}
/*** IBDACreateTuneRequestEx methods ***/
static FORCEINLINE HRESULT IBDACreateTuneRequestEx_CreateTuneRequestEx(IBDACreateTuneRequestEx* This,REFCLSID TuneRequestIID,ITuneRequest **TuneRequest) {
    return This->lpVtbl->CreateTuneRequestEx(This,TuneRequestIID,TuneRequest);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE IBDACreateTuneRequestEx_CreateTuneRequestEx_Proxy(
    IBDACreateTuneRequestEx* This,
    REFCLSID TuneRequestIID,
    ITuneRequest **TuneRequest);
void __RPC_STUB IBDACreateTuneRequestEx_CreateTuneRequestEx_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IBDACreateTuneRequestEx_INTERFACE_DEFINED__ */


DEFINE_GUID(LIBID_TunerLib, 0x9b085638, 0x018e, 0x11d3, 0x9d,0x8e, 0x00,0xc0,0x4f,0x72,0xd9,0x80);

/*****************************************************************************
 * SystemTuningSpaces coclass
 */

DEFINE_GUID(CLSID_SystemTuningSpaces, 0xd02aac50, 0x027e, 0x11d3, 0x9d,0x8e, 0x00,0xc0,0x4f,0x72,0xd9,0x80);

#ifdef __cplusplus
class DECLSPEC_UUID("d02aac50-027e-11d3-9d8e-00c04f72d980") SystemTuningSpaces;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SystemTuningSpaces, 0xd02aac50, 0x027e, 0x11d3, 0x9d,0x8e, 0x00,0xc0,0x4f,0x72,0xd9,0x80)
#endif
#endif

/*****************************************************************************
 * TuningSpace coclass
 */

DEFINE_GUID(CLSID_TuningSpace, 0x5ffdc5e6, 0xb83a, 0x4b55, 0xb6,0xe8, 0xc6,0x9e,0x76,0x5f,0xe9,0xdb);

#ifdef __cplusplus
class DECLSPEC_UUID("5ffdc5e6-b83a-4b55-b6e8-c69e765fe9db") TuningSpace;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(TuningSpace, 0x5ffdc5e6, 0xb83a, 0x4b55, 0xb6,0xe8, 0xc6,0x9e,0x76,0x5f,0xe9,0xdb)
#endif
#endif

/*****************************************************************************
 * ChannelIDTuningSpace coclass
 */

DEFINE_GUID(CLSID_ChannelIDTuningSpace, 0xcc829a2f, 0x3365, 0x463f, 0xaf,0x13, 0x81,0xdb,0xb6,0xf3,0xa5,0x55);

#ifdef __cplusplus
class DECLSPEC_UUID("cc829a2f-3365-463f-af13-81dbb6f3a555") ChannelIDTuningSpace;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ChannelIDTuningSpace, 0xcc829a2f, 0x3365, 0x463f, 0xaf,0x13, 0x81,0xdb,0xb6,0xf3,0xa5,0x55)
#endif
#endif

/*****************************************************************************
 * ATSCTuningSpace coclass
 */

DEFINE_GUID(CLSID_ATSCTuningSpace, 0xa2e30750, 0x6c3d, 0x11d3, 0xb6,0x53, 0x00,0xc0,0x4f,0x79,0x49,0x8e);

#ifdef __cplusplus
class DECLSPEC_UUID("a2e30750-6c3d-11d3-b653-00c04f79498e") ATSCTuningSpace;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ATSCTuningSpace, 0xa2e30750, 0x6c3d, 0x11d3, 0xb6,0x53, 0x00,0xc0,0x4f,0x79,0x49,0x8e)
#endif
#endif

/*****************************************************************************
 * DigitalCableTuningSpace coclass
 */

DEFINE_GUID(CLSID_DigitalCableTuningSpace, 0xd9bb4cee, 0xb87a, 0x47f1, 0xac,0x92, 0xb0,0x8d,0x9c,0x78,0x13,0xfc);

#ifdef __cplusplus
class DECLSPEC_UUID("d9bb4cee-b87a-47f1-ac92-b08d9c7813fc") DigitalCableTuningSpace;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DigitalCableTuningSpace, 0xd9bb4cee, 0xb87a, 0x47f1, 0xac,0x92, 0xb0,0x8d,0x9c,0x78,0x13,0xfc)
#endif
#endif

/*****************************************************************************
 * AnalogRadioTuningSpace coclass
 */

DEFINE_GUID(CLSID_AnalogRadioTuningSpace, 0x8a674b4c, 0x1f63, 0x11d3, 0xb6,0x4c, 0x00,0xc0,0x4f,0x79,0x49,0x8e);

#ifdef __cplusplus
class DECLSPEC_UUID("8a674b4c-1f63-11d3-b64c-00c04f79498e") AnalogRadioTuningSpace;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(AnalogRadioTuningSpace, 0x8a674b4c, 0x1f63, 0x11d3, 0xb6,0x4c, 0x00,0xc0,0x4f,0x79,0x49,0x8e)
#endif
#endif

/*****************************************************************************
 * AuxInTuningSpace coclass
 */

DEFINE_GUID(CLSID_AuxInTuningSpace, 0xf9769a06, 0x7aca, 0x4e39, 0x9c,0xfb, 0x97,0xbb,0x35,0xf0,0xe7,0x7e);

#ifdef __cplusplus
class DECLSPEC_UUID("f9769a06-7aca-4e39-9cfb-97bb35f0e77e") AuxInTuningSpace;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(AuxInTuningSpace, 0xf9769a06, 0x7aca, 0x4e39, 0x9c,0xfb, 0x97,0xbb,0x35,0xf0,0xe7,0x7e)
#endif
#endif

/*****************************************************************************
 * AnalogTVTuningSpace coclass
 */

DEFINE_GUID(CLSID_AnalogTVTuningSpace, 0x8a674b4d, 0x1f63, 0x11d3, 0xb6,0x4c, 0x00,0xc0,0x4f,0x79,0x49,0x8e);

#ifdef __cplusplus
class DECLSPEC_UUID("8a674b4d-1f63-11d3-b64c-00c04f79498e") AnalogTVTuningSpace;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(AnalogTVTuningSpace, 0x8a674b4d, 0x1f63, 0x11d3, 0xb6,0x4c, 0x00,0xc0,0x4f,0x79,0x49,0x8e)
#endif
#endif

/*****************************************************************************
 * DVBTuningSpace coclass
 */

DEFINE_GUID(CLSID_DVBTuningSpace, 0xc6b14b32, 0x76aa, 0x4a86, 0xa7,0xac, 0x5c,0x79,0xaa,0xf5,0x8d,0xa7);

#ifdef __cplusplus
class DECLSPEC_UUID("c6b14b32-76aa-4a86-a7ac-5c79aaf58da7") DVBTuningSpace;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DVBTuningSpace, 0xc6b14b32, 0x76aa, 0x4a86, 0xa7,0xac, 0x5c,0x79,0xaa,0xf5,0x8d,0xa7)
#endif
#endif

/*****************************************************************************
 * DVBSTuningSpace coclass
 */

DEFINE_GUID(CLSID_DVBSTuningSpace, 0xb64016f3, 0xc9a2, 0x4066, 0x96,0xf0, 0xbd,0x95,0x63,0x31,0x47,0x26);

#ifdef __cplusplus
class DECLSPEC_UUID("b64016f3-c9a2-4066-96f0-bd9563314726") DVBSTuningSpace;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DVBSTuningSpace, 0xb64016f3, 0xc9a2, 0x4066, 0x96,0xf0, 0xbd,0x95,0x63,0x31,0x47,0x26)
#endif
#endif

/*****************************************************************************
 * ComponentTypes coclass
 */

DEFINE_GUID(CLSID_ComponentTypes, 0xa1a2b1c4, 0x0e3a, 0x11d3, 0x9d,0x8e, 0x00,0xc0,0x4f,0x72,0xd9,0x80);

#ifdef __cplusplus
class DECLSPEC_UUID("a1a2b1c4-0e3a-11d3-9d8e-00c04f72d980") ComponentTypes;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ComponentTypes, 0xa1a2b1c4, 0x0e3a, 0x11d3, 0x9d,0x8e, 0x00,0xc0,0x4f,0x72,0xd9,0x80)
#endif
#endif

/*****************************************************************************
 * ComponentType coclass
 */

DEFINE_GUID(CLSID_ComponentType, 0x823535a0, 0x0318, 0x11d3, 0x9d,0x8e, 0x00,0xc0,0x4f,0x72,0xd9,0x80);

#ifdef __cplusplus
class DECLSPEC_UUID("823535a0-0318-11d3-9d8e-00c04f72d980") ComponentType;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ComponentType, 0x823535a0, 0x0318, 0x11d3, 0x9d,0x8e, 0x00,0xc0,0x4f,0x72,0xd9,0x80)
#endif
#endif

/*****************************************************************************
 * LanguageComponentType coclass
 */

DEFINE_GUID(CLSID_LanguageComponentType, 0x1be49f30, 0x0e1b, 0x11d3, 0x9d,0x8e, 0x00,0xc0,0x4f,0x72,0xd9,0x80);

#ifdef __cplusplus
class DECLSPEC_UUID("1be49f30-0e1b-11d3-9d8e-00c04f72d980") LanguageComponentType;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(LanguageComponentType, 0x1be49f30, 0x0e1b, 0x11d3, 0x9d,0x8e, 0x00,0xc0,0x4f,0x72,0xd9,0x80)
#endif
#endif

/*****************************************************************************
 * MPEG2ComponentType coclass
 */

DEFINE_GUID(CLSID_MPEG2ComponentType, 0x418008f3, 0xcf67, 0x4668, 0x96,0x28, 0x10,0xdc,0x52,0xbe,0x1d,0x08);

#ifdef __cplusplus
class DECLSPEC_UUID("418008f3-cf67-4668-9628-10dc52be1d08") MPEG2ComponentType;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(MPEG2ComponentType, 0x418008f3, 0xcf67, 0x4668, 0x96,0x28, 0x10,0xdc,0x52,0xbe,0x1d,0x08)
#endif
#endif

/*****************************************************************************
 * ATSCComponentType coclass
 */

DEFINE_GUID(CLSID_ATSCComponentType, 0xa8dcf3d5, 0x0780, 0x4ef4, 0x8a,0x83, 0x2c,0xff,0xaa,0xcb,0x8a,0xce);

#ifdef __cplusplus
class DECLSPEC_UUID("a8dcf3d5-0780-4ef4-8a83-2cffaacb8ace") ATSCComponentType;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ATSCComponentType, 0xa8dcf3d5, 0x0780, 0x4ef4, 0x8a,0x83, 0x2c,0xff,0xaa,0xcb,0x8a,0xce)
#endif
#endif

/*****************************************************************************
 * Components coclass
 */

DEFINE_GUID(CLSID_Components, 0x809b6661, 0x94c4, 0x49e6, 0xb6,0xec, 0x3f,0x0f,0x86,0x22,0x15,0xaa);

#ifdef __cplusplus
class DECLSPEC_UUID("809b6661-94c4-49e6-b6ec-3f0f862215aa") Components;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(Components, 0x809b6661, 0x94c4, 0x49e6, 0xb6,0xec, 0x3f,0x0f,0x86,0x22,0x15,0xaa)
#endif
#endif

/*****************************************************************************
 * Component coclass
 */

DEFINE_GUID(CLSID_Component, 0x59dc47a8, 0x116c, 0x11d3, 0x9d,0x8e, 0x00,0xc0,0x4f,0x72,0xd9,0x80);

#ifdef __cplusplus
class DECLSPEC_UUID("59dc47a8-116c-11d3-9d8e-00c04f72d980") Component;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(Component, 0x59dc47a8, 0x116c, 0x11d3, 0x9d,0x8e, 0x00,0xc0,0x4f,0x72,0xd9,0x80)
#endif
#endif

/*****************************************************************************
 * MPEG2Component coclass
 */

DEFINE_GUID(CLSID_MPEG2Component, 0x055cb2d7, 0x2969, 0x45cd, 0x91,0x4b, 0x76,0x89,0x07,0x22,0xf1,0x12);

#ifdef __cplusplus
class DECLSPEC_UUID("055cb2d7-2969-45cd-914b-76890722f112") MPEG2Component;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(MPEG2Component, 0x055cb2d7, 0x2969, 0x45cd, 0x91,0x4b, 0x76,0x89,0x07,0x22,0xf1,0x12)
#endif
#endif

/*****************************************************************************
 * AnalogAudioComponentType coclass
 */

DEFINE_GUID(CLSID_AnalogAudioComponentType, 0x28ab0005, 0xe845, 0x4ffa, 0xaa,0x9b, 0xf4,0x66,0x52,0x36,0x14,0x1c);

#ifdef __cplusplus
class DECLSPEC_UUID("28ab0005-e845-4ffa-aa9b-f4665236141c") AnalogAudioComponentType;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(AnalogAudioComponentType, 0x28ab0005, 0xe845, 0x4ffa, 0xaa,0x9b, 0xf4,0x66,0x52,0x36,0x14,0x1c)
#endif
#endif

/*****************************************************************************
 * TuneRequest coclass
 */

DEFINE_GUID(CLSID_TuneRequest, 0xb46e0d38, 0xab35, 0x4a06, 0xa1,0x37, 0x70,0x57,0x6b,0x01,0xb3,0x9f);

#ifdef __cplusplus
class DECLSPEC_UUID("b46e0d38-ab35-4a06-a137-70576b01b39f") TuneRequest;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(TuneRequest, 0xb46e0d38, 0xab35, 0x4a06, 0xa1,0x37, 0x70,0x57,0x6b,0x01,0xb3,0x9f)
#endif
#endif

/*****************************************************************************
 * ChannelIDTuneRequest coclass
 */

DEFINE_GUID(CLSID_ChannelIDTuneRequest, 0x3a9428a7, 0x31a4, 0x45e9, 0x9e,0xfb, 0xe0,0x55,0xbf,0x7b,0xb3,0xdb);

#ifdef __cplusplus
class DECLSPEC_UUID("3a9428a7-31a4-45e9-9efb-e055bf7bb3db") ChannelIDTuneRequest;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ChannelIDTuneRequest, 0x3a9428a7, 0x31a4, 0x45e9, 0x9e,0xfb, 0xe0,0x55,0xbf,0x7b,0xb3,0xdb)
#endif
#endif

/*****************************************************************************
 * ChannelTuneRequest coclass
 */

DEFINE_GUID(CLSID_ChannelTuneRequest, 0x0369b4e5, 0x45b6, 0x11d3, 0xb6,0x50, 0x00,0xc0,0x4f,0x79,0x49,0x8e);

#ifdef __cplusplus
class DECLSPEC_UUID("0369b4e5-45b6-11d3-b650-00c04f79498e") ChannelTuneRequest;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ChannelTuneRequest, 0x0369b4e5, 0x45b6, 0x11d3, 0xb6,0x50, 0x00,0xc0,0x4f,0x79,0x49,0x8e)
#endif
#endif

/*****************************************************************************
 * ATSCChannelTuneRequest coclass
 */

DEFINE_GUID(CLSID_ATSCChannelTuneRequest, 0x0369b4e6, 0x45b6, 0x11d3, 0xb6,0x50, 0x00,0xc0,0x4f,0x79,0x49,0x8e);

#ifdef __cplusplus
class DECLSPEC_UUID("0369b4e6-45b6-11d3-b650-00c04f79498e") ATSCChannelTuneRequest;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ATSCChannelTuneRequest, 0x0369b4e6, 0x45b6, 0x11d3, 0xb6,0x50, 0x00,0xc0,0x4f,0x79,0x49,0x8e)
#endif
#endif

/*****************************************************************************
 * DigitalCableTuneRequest coclass
 */

DEFINE_GUID(CLSID_DigitalCableTuneRequest, 0x26ec0b63, 0xaa90, 0x458a, 0x8d,0xf4, 0x56,0x59,0xf2,0xc8,0xa1,0x8a);

#ifdef __cplusplus
class DECLSPEC_UUID("26ec0b63-aa90-458a-8df4-5659f2c8a18a") DigitalCableTuneRequest;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DigitalCableTuneRequest, 0x26ec0b63, 0xaa90, 0x458a, 0x8d,0xf4, 0x56,0x59,0xf2,0xc8,0xa1,0x8a)
#endif
#endif

/*****************************************************************************
 * MPEG2TuneRequest coclass
 */

DEFINE_GUID(CLSID_MPEG2TuneRequest, 0x0955ac62, 0xbf2e, 0x4cba, 0xa2,0xb9, 0xa6,0x3f,0x77,0x2d,0x46,0xcf);

#ifdef __cplusplus
class DECLSPEC_UUID("0955ac62-bf2e-4cba-a2b9-a63f772d46cf") MPEG2TuneRequest;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(MPEG2TuneRequest, 0x0955ac62, 0xbf2e, 0x4cba, 0xa2,0xb9, 0xa6,0x3f,0x77,0x2d,0x46,0xcf)
#endif
#endif

/*****************************************************************************
 * MPEG2TuneRequestFactory coclass
 */

DEFINE_GUID(CLSID_MPEG2TuneRequestFactory, 0x2c63e4eb, 0x4cea, 0x41b8, 0x91,0x9c, 0xe9,0x47,0xea,0x19,0xa7,0x7c);

#ifdef __cplusplus
class DECLSPEC_UUID("2c63e4eb-4cea-41b8-919c-e947ea19a77c") MPEG2TuneRequestFactory;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(MPEG2TuneRequestFactory, 0x2c63e4eb, 0x4cea, 0x41b8, 0x91,0x9c, 0xe9,0x47,0xea,0x19,0xa7,0x7c)
#endif
#endif

/*****************************************************************************
 * Locator coclass
 */

DEFINE_GUID(CLSID_Locator, 0x0888c883, 0xac4f, 0x4943, 0xb5,0x16, 0x2c,0x38,0xd9,0xb3,0x45,0x62);

#ifdef __cplusplus
class DECLSPEC_UUID("0888c883-ac4f-4943-b516-2c38d9b34562") Locator;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(Locator, 0x0888c883, 0xac4f, 0x4943, 0xb5,0x16, 0x2c,0x38,0xd9,0xb3,0x45,0x62)
#endif
#endif

/*****************************************************************************
 * DigitalLocator coclass
 */

DEFINE_GUID(CLSID_DigitalLocator, 0x6e50cc0d, 0xc19b, 0x4bf6, 0x81,0x0b, 0x5b,0xd6,0x07,0x61,0xf5,0xcc);

#ifdef __cplusplus
class DECLSPEC_UUID("6e50cc0d-c19b-4bf6-810b-5bd60761f5cc") DigitalLocator;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DigitalLocator, 0x6e50cc0d, 0xc19b, 0x4bf6, 0x81,0x0b, 0x5b,0xd6,0x07,0x61,0xf5,0xcc)
#endif
#endif

/*****************************************************************************
 * AnalogLocator coclass
 */

DEFINE_GUID(CLSID_AnalogLocator, 0x49638b91, 0x48ab, 0x48b7, 0xa4,0x7a, 0x7d,0x0e,0x75,0xa0,0x8e,0xde);

#ifdef __cplusplus
class DECLSPEC_UUID("49638b91-48ab-48b7-a47a-7d0e75a08ede") AnalogLocator;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(AnalogLocator, 0x49638b91, 0x48ab, 0x48b7, 0xa4,0x7a, 0x7d,0x0e,0x75,0xa0,0x8e,0xde)
#endif
#endif

/*****************************************************************************
 * ATSCLocator coclass
 */

DEFINE_GUID(CLSID_ATSCLocator, 0x8872ff1b, 0x98fa, 0x4d7a, 0x8d,0x93, 0xc9,0xf1,0x05,0x5f,0x85,0xbb);

#ifdef __cplusplus
class DECLSPEC_UUID("8872ff1b-98fa-4d7a-8d93-c9f1055f85bb") ATSCLocator;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ATSCLocator, 0x8872ff1b, 0x98fa, 0x4d7a, 0x8d,0x93, 0xc9,0xf1,0x05,0x5f,0x85,0xbb)
#endif
#endif

/*****************************************************************************
 * DigitalCableLocator coclass
 */

DEFINE_GUID(CLSID_DigitalCableLocator, 0x03c06416, 0xd127, 0x407a, 0xab,0x4c, 0xfd,0xd2,0x79,0xab,0xbe,0x5d);

#ifdef __cplusplus
class DECLSPEC_UUID("03c06416-d127-407a-ab4c-fdd279abbe5d") DigitalCableLocator;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DigitalCableLocator, 0x03c06416, 0xd127, 0x407a, 0xab,0x4c, 0xfd,0xd2,0x79,0xab,0xbe,0x5d)
#endif
#endif

/*****************************************************************************
 * DVBTLocator coclass
 */

DEFINE_GUID(CLSID_DVBTLocator, 0x9cd64701, 0xbdf3, 0x4d14, 0x8e,0x03, 0xf1,0x29,0x83,0xd8,0x66,0x64);

#ifdef __cplusplus
class DECLSPEC_UUID("9cd64701-bdf3-4d14-8e03-f12983d86664") DVBTLocator;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DVBTLocator, 0x9cd64701, 0xbdf3, 0x4d14, 0x8e,0x03, 0xf1,0x29,0x83,0xd8,0x66,0x64)
#endif
#endif

/*****************************************************************************
 * DVBTLocator2 coclass
 */

DEFINE_GUID(CLSID_DVBTLocator2, 0xefe3fa02, 0x45d7, 0x4920, 0xbe,0x96, 0x53,0xfa,0x7f,0x35,0xb0,0xe6);

#ifdef __cplusplus
class DECLSPEC_UUID("efe3fa02-45d7-4920-be96-53fa7f35b0e6") DVBTLocator2;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DVBTLocator2, 0xefe3fa02, 0x45d7, 0x4920, 0xbe,0x96, 0x53,0xfa,0x7f,0x35,0xb0,0xe6)
#endif
#endif

/*****************************************************************************
 * DVBSLocator coclass
 */

DEFINE_GUID(CLSID_DVBSLocator, 0x1df7d126, 0x4050, 0x47f0, 0xa7,0xcf, 0x4c,0x4c,0xa9,0x24,0x13,0x33);

#ifdef __cplusplus
class DECLSPEC_UUID("1df7d126-4050-47f0-a7cf-4c4ca9241333") DVBSLocator;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DVBSLocator, 0x1df7d126, 0x4050, 0x47f0, 0xa7,0xcf, 0x4c,0x4c,0xa9,0x24,0x13,0x33)
#endif
#endif

/*****************************************************************************
 * DVBCLocator coclass
 */

DEFINE_GUID(CLSID_DVBCLocator, 0xc531d9fd, 0x9685, 0x4028, 0x8b,0x68, 0x6e,0x12,0x32,0x07,0x9f,0x1e);

#ifdef __cplusplus
class DECLSPEC_UUID("c531d9fd-9685-4028-8b68-6e1232079f1e") DVBCLocator;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DVBCLocator, 0xc531d9fd, 0x9685, 0x4028, 0x8b,0x68, 0x6e,0x12,0x32,0x07,0x9f,0x1e)
#endif
#endif

/*****************************************************************************
 * ISDBSLocator coclass
 */

DEFINE_GUID(CLSID_ISDBSLocator, 0x6504afed, 0xa629, 0x455c, 0xa7,0xf1, 0x04,0x96,0x4d,0xea,0x5c,0xc4);

#ifdef __cplusplus
class DECLSPEC_UUID("6504afed-a629-455c-a7f1-04964dea5cc4") ISDBSLocator;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISDBSLocator, 0x6504afed, 0xa629, 0x455c, 0xa7,0xf1, 0x04,0x96,0x4d,0xea,0x5c,0xc4)
#endif
#endif

/*****************************************************************************
 * DVBTuneRequest coclass
 */

DEFINE_GUID(CLSID_DVBTuneRequest, 0x15d6504a, 0x5494, 0x499c, 0x88,0x6c, 0x97,0x3c,0x9e,0x53,0xb9,0xf1);

#ifdef __cplusplus
class DECLSPEC_UUID("15d6504a-5494-499c-886c-973c9e53b9f1") DVBTuneRequest;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DVBTuneRequest, 0x15d6504a, 0x5494, 0x499c, 0x88,0x6c, 0x97,0x3c,0x9e,0x53,0xb9,0xf1)
#endif
#endif

/*****************************************************************************
 * CreatePropBagOnRegKey coclass
 */

DEFINE_GUID(CLSID_CreatePropBagOnRegKey, 0x8a674b49, 0x1f63, 0x11d3, 0xb6,0x4c, 0x00,0xc0,0x4f,0x79,0x49,0x8e);

#ifdef __cplusplus
class DECLSPEC_UUID("8a674b49-1f63-11d3-b64c-00c04f79498e") CreatePropBagOnRegKey;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(CreatePropBagOnRegKey, 0x8a674b49, 0x1f63, 0x11d3, 0xb6,0x4c, 0x00,0xc0,0x4f,0x79,0x49,0x8e)
#endif
#endif

/*****************************************************************************
 * BroadcastEventService coclass
 */

DEFINE_GUID(CLSID_BroadcastEventService, 0x0b3ffb92, 0x0919, 0x4934, 0x9d,0x5b, 0x61,0x9c,0x71,0x9d,0x02,0x02);

#ifdef __cplusplus
class DECLSPEC_UUID("0b3ffb92-0919-4934-9d5b-619c719d0202") BroadcastEventService;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(BroadcastEventService, 0x0b3ffb92, 0x0919, 0x4934, 0x9d,0x5b, 0x61,0x9c,0x71,0x9d,0x02,0x02)
#endif
#endif

/*****************************************************************************
 * TunerMarshaler coclass
 */

DEFINE_GUID(CLSID_TunerMarshaler, 0x6438570b, 0x0c08, 0x4a25, 0x95,0x04, 0x80,0x12,0xbb,0x4d,0x50,0xcf);

#ifdef __cplusplus
class DECLSPEC_UUID("6438570b-0c08-4a25-9504-8012bb4d50cf") TunerMarshaler;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(TunerMarshaler, 0x6438570b, 0x0c08, 0x4a25, 0x95,0x04, 0x80,0x12,0xbb,0x4d,0x50,0xcf)
#endif
#endif

/*****************************************************************************
 * PersistTuneXmlUtility coclass
 */

DEFINE_GUID(CLSID_PersistTuneXmlUtility, 0xe77026b0, 0xb97f, 0x4cbb, 0xb7,0xfb, 0xf4,0xf0,0x3a,0xd6,0x9f,0x11);

#ifdef __cplusplus
class DECLSPEC_UUID("e77026b0-b97f-4cbb-b7fb-f4f03ad69f11") PersistTuneXmlUtility;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(PersistTuneXmlUtility, 0xe77026b0, 0xb97f, 0x4cbb, 0xb7,0xfb, 0xf4,0xf0,0x3a,0xd6,0x9f,0x11)
#endif
#endif

/*****************************************************************************
 * ESEventService coclass
 */

DEFINE_GUID(CLSID_ESEventService, 0xc20447fc, 0xec60, 0x475e, 0x81,0x3f, 0xd2,0xb0,0xa6,0xde,0xce,0xfe);

#ifdef __cplusplus
class DECLSPEC_UUID("c20447fc-ec60-475e-813f-d2b0a6decefe") ESEventService;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ESEventService, 0xc20447fc, 0xec60, 0x475e, 0x81,0x3f, 0xd2,0xb0,0xa6,0xde,0xce,0xfe)
#endif
#endif

/*****************************************************************************
 * ESEventFactory coclass
 */

DEFINE_GUID(CLSID_ESEventFactory, 0x8e8a07da, 0x71f8, 0x40c1, 0xa9,0x29, 0x5e,0x3a,0x86,0x8a,0xc2,0xc6);

#ifdef __cplusplus
class DECLSPEC_UUID("8e8a07da-71f8-40c1-a929-5e3a868ac2c6") ESEventFactory;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ESEventFactory, 0x8e8a07da, 0x71f8, 0x40c1, 0xa9,0x29, 0x5e,0x3a,0x86,0x8a,0xc2,0xc6)
#endif
#endif

#endif
/* Begin additional prototypes for all interfaces */

ULONG           __RPC_USER VARIANT_UserSize     (ULONG *, ULONG, VARIANT *);
unsigned char * __RPC_USER VARIANT_UserMarshal  (ULONG *, unsigned char *, VARIANT *);
unsigned char * __RPC_USER VARIANT_UserUnmarshal(ULONG *, unsigned char *, VARIANT *);
void            __RPC_USER VARIANT_UserFree     (ULONG *, VARIANT *);
ULONG           __RPC_USER BSTR_UserSize     (ULONG *, ULONG, BSTR *);
unsigned char * __RPC_USER BSTR_UserMarshal  (ULONG *, unsigned char *, BSTR *);
unsigned char * __RPC_USER BSTR_UserUnmarshal(ULONG *, unsigned char *, BSTR *);
void            __RPC_USER BSTR_UserFree     (ULONG *, BSTR *);

/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __tuner_h__ */
