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

#ifdef _WIN32
#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif
#include <rpc.h>
#include <rpcndr.h>
#endif

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

#ifndef __tuner_h__
#define __tuner_h__

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

/* Forward declarations */

#ifndef __ITuningSpaces_FWD_DEFINED__
#define __ITuningSpaces_FWD_DEFINED__
typedef interface ITuningSpaces ITuningSpaces;
#ifdef __cplusplus
interface ITuningSpaces;
#endif /* __cplusplus */
#endif

#ifndef __ITuningSpaceContainer_FWD_DEFINED__
#define __ITuningSpaceContainer_FWD_DEFINED__
typedef interface ITuningSpaceContainer ITuningSpaceContainer;
#ifdef __cplusplus
interface ITuningSpaceContainer;
#endif /* __cplusplus */
#endif

#ifndef __ITuningSpace_FWD_DEFINED__
#define __ITuningSpace_FWD_DEFINED__
typedef interface ITuningSpace ITuningSpace;
#ifdef __cplusplus
interface ITuningSpace;
#endif /* __cplusplus */
#endif

#ifndef __IEnumTuningSpaces_FWD_DEFINED__
#define __IEnumTuningSpaces_FWD_DEFINED__
typedef interface IEnumTuningSpaces IEnumTuningSpaces;
#ifdef __cplusplus
interface IEnumTuningSpaces;
#endif /* __cplusplus */
#endif

#ifndef __IDVBTuningSpace_FWD_DEFINED__
#define __IDVBTuningSpace_FWD_DEFINED__
typedef interface IDVBTuningSpace IDVBTuningSpace;
#ifdef __cplusplus
interface IDVBTuningSpace;
#endif /* __cplusplus */
#endif

#ifndef __IDVBTuningSpace2_FWD_DEFINED__
#define __IDVBTuningSpace2_FWD_DEFINED__
typedef interface IDVBTuningSpace2 IDVBTuningSpace2;
#ifdef __cplusplus
interface IDVBTuningSpace2;
#endif /* __cplusplus */
#endif

#ifndef __IDVBSTuningSpace_FWD_DEFINED__
#define __IDVBSTuningSpace_FWD_DEFINED__
typedef interface IDVBSTuningSpace IDVBSTuningSpace;
#ifdef __cplusplus
interface IDVBSTuningSpace;
#endif /* __cplusplus */
#endif

#ifndef __IAuxInTuningSpace_FWD_DEFINED__
#define __IAuxInTuningSpace_FWD_DEFINED__
typedef interface IAuxInTuningSpace IAuxInTuningSpace;
#ifdef __cplusplus
interface IAuxInTuningSpace;
#endif /* __cplusplus */
#endif

#ifndef __IAuxInTuningSpace2_FWD_DEFINED__
#define __IAuxInTuningSpace2_FWD_DEFINED__
typedef interface IAuxInTuningSpace2 IAuxInTuningSpace2;
#ifdef __cplusplus
interface IAuxInTuningSpace2;
#endif /* __cplusplus */
#endif

#ifndef __IAnalogTVTuningSpace_FWD_DEFINED__
#define __IAnalogTVTuningSpace_FWD_DEFINED__
typedef interface IAnalogTVTuningSpace IAnalogTVTuningSpace;
#ifdef __cplusplus
interface IAnalogTVTuningSpace;
#endif /* __cplusplus */
#endif

#ifndef __IATSCTuningSpace_FWD_DEFINED__
#define __IATSCTuningSpace_FWD_DEFINED__
typedef interface IATSCTuningSpace IATSCTuningSpace;
#ifdef __cplusplus
interface IATSCTuningSpace;
#endif /* __cplusplus */
#endif

#ifndef __IDigitalCableTuningSpace_FWD_DEFINED__
#define __IDigitalCableTuningSpace_FWD_DEFINED__
typedef interface IDigitalCableTuningSpace IDigitalCableTuningSpace;
#ifdef __cplusplus
interface IDigitalCableTuningSpace;
#endif /* __cplusplus */
#endif

#ifndef __IAnalogRadioTuningSpace_FWD_DEFINED__
#define __IAnalogRadioTuningSpace_FWD_DEFINED__
typedef interface IAnalogRadioTuningSpace IAnalogRadioTuningSpace;
#ifdef __cplusplus
interface IAnalogRadioTuningSpace;
#endif /* __cplusplus */
#endif

#ifndef __IAnalogRadioTuningSpace2_FWD_DEFINED__
#define __IAnalogRadioTuningSpace2_FWD_DEFINED__
typedef interface IAnalogRadioTuningSpace2 IAnalogRadioTuningSpace2;
#ifdef __cplusplus
interface IAnalogRadioTuningSpace2;
#endif /* __cplusplus */
#endif

#ifndef __ITuneRequest_FWD_DEFINED__
#define __ITuneRequest_FWD_DEFINED__
typedef interface ITuneRequest ITuneRequest;
#ifdef __cplusplus
interface ITuneRequest;
#endif /* __cplusplus */
#endif

#ifndef __IChannelIDTuneRequest_FWD_DEFINED__
#define __IChannelIDTuneRequest_FWD_DEFINED__
typedef interface IChannelIDTuneRequest IChannelIDTuneRequest;
#ifdef __cplusplus
interface IChannelIDTuneRequest;
#endif /* __cplusplus */
#endif

#ifndef __IChannelTuneRequest_FWD_DEFINED__
#define __IChannelTuneRequest_FWD_DEFINED__
typedef interface IChannelTuneRequest IChannelTuneRequest;
#ifdef __cplusplus
interface IChannelTuneRequest;
#endif /* __cplusplus */
#endif

#ifndef __IATSCChannelTuneRequest_FWD_DEFINED__
#define __IATSCChannelTuneRequest_FWD_DEFINED__
typedef interface IATSCChannelTuneRequest IATSCChannelTuneRequest;
#ifdef __cplusplus
interface IATSCChannelTuneRequest;
#endif /* __cplusplus */
#endif

#ifndef __IDigitalCableTuneRequest_FWD_DEFINED__
#define __IDigitalCableTuneRequest_FWD_DEFINED__
typedef interface IDigitalCableTuneRequest IDigitalCableTuneRequest;
#ifdef __cplusplus
interface IDigitalCableTuneRequest;
#endif /* __cplusplus */
#endif

#ifndef __IDVBTuneRequest_FWD_DEFINED__
#define __IDVBTuneRequest_FWD_DEFINED__
typedef interface IDVBTuneRequest IDVBTuneRequest;
#ifdef __cplusplus
interface IDVBTuneRequest;
#endif /* __cplusplus */
#endif

#ifndef __IMPEG2TuneRequest_FWD_DEFINED__
#define __IMPEG2TuneRequest_FWD_DEFINED__
typedef interface IMPEG2TuneRequest IMPEG2TuneRequest;
#ifdef __cplusplus
interface IMPEG2TuneRequest;
#endif /* __cplusplus */
#endif

#ifndef __IMPEG2TuneRequestFactory_FWD_DEFINED__
#define __IMPEG2TuneRequestFactory_FWD_DEFINED__
typedef interface IMPEG2TuneRequestFactory IMPEG2TuneRequestFactory;
#ifdef __cplusplus
interface IMPEG2TuneRequestFactory;
#endif /* __cplusplus */
#endif

#ifndef __IMPEG2TuneRequestSupport_FWD_DEFINED__
#define __IMPEG2TuneRequestSupport_FWD_DEFINED__
typedef interface IMPEG2TuneRequestSupport IMPEG2TuneRequestSupport;
#ifdef __cplusplus
interface IMPEG2TuneRequestSupport;
#endif /* __cplusplus */
#endif

#ifndef __ITunerCap_FWD_DEFINED__
#define __ITunerCap_FWD_DEFINED__
typedef interface ITunerCap ITunerCap;
#ifdef __cplusplus
interface ITunerCap;
#endif /* __cplusplus */
#endif

#ifndef __ITunerCapEx_FWD_DEFINED__
#define __ITunerCapEx_FWD_DEFINED__
typedef interface ITunerCapEx ITunerCapEx;
#ifdef __cplusplus
interface ITunerCapEx;
#endif /* __cplusplus */
#endif

#ifndef __ITuner_FWD_DEFINED__
#define __ITuner_FWD_DEFINED__
typedef interface ITuner ITuner;
#ifdef __cplusplus
interface ITuner;
#endif /* __cplusplus */
#endif

#ifndef __IScanningTuner_FWD_DEFINED__
#define __IScanningTuner_FWD_DEFINED__
typedef interface IScanningTuner IScanningTuner;
#ifdef __cplusplus
interface IScanningTuner;
#endif /* __cplusplus */
#endif

#ifndef __IScanningTunerEx_FWD_DEFINED__
#define __IScanningTunerEx_FWD_DEFINED__
typedef interface IScanningTunerEx IScanningTunerEx;
#ifdef __cplusplus
interface IScanningTunerEx;
#endif /* __cplusplus */
#endif

#ifndef __IComponentType_FWD_DEFINED__
#define __IComponentType_FWD_DEFINED__
typedef interface IComponentType IComponentType;
#ifdef __cplusplus
interface IComponentType;
#endif /* __cplusplus */
#endif

#ifndef __ILanguageComponentType_FWD_DEFINED__
#define __ILanguageComponentType_FWD_DEFINED__
typedef interface ILanguageComponentType ILanguageComponentType;
#ifdef __cplusplus
interface ILanguageComponentType;
#endif /* __cplusplus */
#endif

#ifndef __IMPEG2ComponentType_FWD_DEFINED__
#define __IMPEG2ComponentType_FWD_DEFINED__
typedef interface IMPEG2ComponentType IMPEG2ComponentType;
#ifdef __cplusplus
interface IMPEG2ComponentType;
#endif /* __cplusplus */
#endif

#ifndef __IATSCComponentType_FWD_DEFINED__
#define __IATSCComponentType_FWD_DEFINED__
typedef interface IATSCComponentType IATSCComponentType;
#ifdef __cplusplus
interface IATSCComponentType;
#endif /* __cplusplus */
#endif

#ifndef __IEnumComponentTypes_FWD_DEFINED__
#define __IEnumComponentTypes_FWD_DEFINED__
typedef interface IEnumComponentTypes IEnumComponentTypes;
#ifdef __cplusplus
interface IEnumComponentTypes;
#endif /* __cplusplus */
#endif

#ifndef __IComponentTypes_FWD_DEFINED__
#define __IComponentTypes_FWD_DEFINED__
typedef interface IComponentTypes IComponentTypes;
#ifdef __cplusplus
interface IComponentTypes;
#endif /* __cplusplus */
#endif

#ifndef __IComponent_FWD_DEFINED__
#define __IComponent_FWD_DEFINED__
typedef interface IComponent IComponent;
#ifdef __cplusplus
interface IComponent;
#endif /* __cplusplus */
#endif

#ifndef __IAnalogAudioComponentType_FWD_DEFINED__
#define __IAnalogAudioComponentType_FWD_DEFINED__
typedef interface IAnalogAudioComponentType IAnalogAudioComponentType;
#ifdef __cplusplus
interface IAnalogAudioComponentType;
#endif /* __cplusplus */
#endif

#ifndef __IMPEG2Component_FWD_DEFINED__
#define __IMPEG2Component_FWD_DEFINED__
typedef interface IMPEG2Component IMPEG2Component;
#ifdef __cplusplus
interface IMPEG2Component;
#endif /* __cplusplus */
#endif

#ifndef __IEnumComponents_FWD_DEFINED__
#define __IEnumComponents_FWD_DEFINED__
typedef interface IEnumComponents IEnumComponents;
#ifdef __cplusplus
interface IEnumComponents;
#endif /* __cplusplus */
#endif

#ifndef __IComponents_FWD_DEFINED__
#define __IComponents_FWD_DEFINED__
typedef interface IComponents IComponents;
#ifdef __cplusplus
interface IComponents;
#endif /* __cplusplus */
#endif

#ifndef __IComponentsOld_FWD_DEFINED__
#define __IComponentsOld_FWD_DEFINED__
typedef interface IComponentsOld IComponentsOld;
#ifdef __cplusplus
interface IComponentsOld;
#endif /* __cplusplus */
#endif

#ifndef __ILocator_FWD_DEFINED__
#define __ILocator_FWD_DEFINED__
typedef interface ILocator ILocator;
#ifdef __cplusplus
interface ILocator;
#endif /* __cplusplus */
#endif

#ifndef __IAnalogLocator_FWD_DEFINED__
#define __IAnalogLocator_FWD_DEFINED__
typedef interface IAnalogLocator IAnalogLocator;
#ifdef __cplusplus
interface IAnalogLocator;
#endif /* __cplusplus */
#endif

#ifndef __IDigitalLocator_FWD_DEFINED__
#define __IDigitalLocator_FWD_DEFINED__
typedef interface IDigitalLocator IDigitalLocator;
#ifdef __cplusplus
interface IDigitalLocator;
#endif /* __cplusplus */
#endif

#ifndef __IATSCLocator_FWD_DEFINED__
#define __IATSCLocator_FWD_DEFINED__
typedef interface IATSCLocator IATSCLocator;
#ifdef __cplusplus
interface IATSCLocator;
#endif /* __cplusplus */
#endif

#ifndef __IATSCLocator2_FWD_DEFINED__
#define __IATSCLocator2_FWD_DEFINED__
typedef interface IATSCLocator2 IATSCLocator2;
#ifdef __cplusplus
interface IATSCLocator2;
#endif /* __cplusplus */
#endif

#ifndef __IDigitalCableLocator_FWD_DEFINED__
#define __IDigitalCableLocator_FWD_DEFINED__
typedef interface IDigitalCableLocator IDigitalCableLocator;
#ifdef __cplusplus
interface IDigitalCableLocator;
#endif /* __cplusplus */
#endif

#ifndef __IDVBTLocator_FWD_DEFINED__
#define __IDVBTLocator_FWD_DEFINED__
typedef interface IDVBTLocator IDVBTLocator;
#ifdef __cplusplus
interface IDVBTLocator;
#endif /* __cplusplus */
#endif

#ifndef __IDVBTLocator2_FWD_DEFINED__
#define __IDVBTLocator2_FWD_DEFINED__
typedef interface IDVBTLocator2 IDVBTLocator2;
#ifdef __cplusplus
interface IDVBTLocator2;
#endif /* __cplusplus */
#endif

#ifndef __IDVBSLocator_FWD_DEFINED__
#define __IDVBSLocator_FWD_DEFINED__
typedef interface IDVBSLocator IDVBSLocator;
#ifdef __cplusplus
interface IDVBSLocator;
#endif /* __cplusplus */
#endif

#ifndef __IDVBSLocator2_FWD_DEFINED__
#define __IDVBSLocator2_FWD_DEFINED__
typedef interface IDVBSLocator2 IDVBSLocator2;
#ifdef __cplusplus
interface IDVBSLocator2;
#endif /* __cplusplus */
#endif

#ifndef __IDVBCLocator_FWD_DEFINED__
#define __IDVBCLocator_FWD_DEFINED__
typedef interface IDVBCLocator IDVBCLocator;
#ifdef __cplusplus
interface IDVBCLocator;
#endif /* __cplusplus */
#endif

#ifndef __IISDBSLocator_FWD_DEFINED__
#define __IISDBSLocator_FWD_DEFINED__
typedef interface IISDBSLocator IISDBSLocator;
#ifdef __cplusplus
interface IISDBSLocator;
#endif /* __cplusplus */
#endif

#ifndef __IESEvent_FWD_DEFINED__
#define __IESEvent_FWD_DEFINED__
typedef interface IESEvent IESEvent;
#ifdef __cplusplus
interface IESEvent;
#endif /* __cplusplus */
#endif

#ifndef __IESOpenMmiEvent_FWD_DEFINED__
#define __IESOpenMmiEvent_FWD_DEFINED__
typedef interface IESOpenMmiEvent IESOpenMmiEvent;
#ifdef __cplusplus
interface IESOpenMmiEvent;
#endif /* __cplusplus */
#endif

#ifndef __IESCloseMmiEvent_FWD_DEFINED__
#define __IESCloseMmiEvent_FWD_DEFINED__
typedef interface IESCloseMmiEvent IESCloseMmiEvent;
#ifdef __cplusplus
interface IESCloseMmiEvent;
#endif /* __cplusplus */
#endif

#ifndef __IESValueUpdatedEvent_FWD_DEFINED__
#define __IESValueUpdatedEvent_FWD_DEFINED__
typedef interface IESValueUpdatedEvent IESValueUpdatedEvent;
#ifdef __cplusplus
interface IESValueUpdatedEvent;
#endif /* __cplusplus */
#endif

#ifndef __IESRequestTunerEvent_FWD_DEFINED__
#define __IESRequestTunerEvent_FWD_DEFINED__
typedef interface IESRequestTunerEvent IESRequestTunerEvent;
#ifdef __cplusplus
interface IESRequestTunerEvent;
#endif /* __cplusplus */
#endif

#ifndef __IESIsdbCasResponseEvent_FWD_DEFINED__
#define __IESIsdbCasResponseEvent_FWD_DEFINED__
typedef interface IESIsdbCasResponseEvent IESIsdbCasResponseEvent;
#ifdef __cplusplus
interface IESIsdbCasResponseEvent;
#endif /* __cplusplus */
#endif

#ifndef __IGpnvsCommonBase_FWD_DEFINED__
#define __IGpnvsCommonBase_FWD_DEFINED__
typedef interface IGpnvsCommonBase IGpnvsCommonBase;
#ifdef __cplusplus
interface IGpnvsCommonBase;
#endif /* __cplusplus */
#endif

#ifndef __IESEventFactory_FWD_DEFINED__
#define __IESEventFactory_FWD_DEFINED__
typedef interface IESEventFactory IESEventFactory;
#ifdef __cplusplus
interface IESEventFactory;
#endif /* __cplusplus */
#endif

#ifndef __IESLicenseRenewalResultEvent_FWD_DEFINED__
#define __IESLicenseRenewalResultEvent_FWD_DEFINED__
typedef interface IESLicenseRenewalResultEvent IESLicenseRenewalResultEvent;
#ifdef __cplusplus
interface IESLicenseRenewalResultEvent;
#endif /* __cplusplus */
#endif

#ifndef __IESFileExpiryDateEvent_FWD_DEFINED__
#define __IESFileExpiryDateEvent_FWD_DEFINED__
typedef interface IESFileExpiryDateEvent IESFileExpiryDateEvent;
#ifdef __cplusplus
interface IESFileExpiryDateEvent;
#endif /* __cplusplus */
#endif

#ifndef __IESEvents_FWD_DEFINED__
#define __IESEvents_FWD_DEFINED__
typedef interface IESEvents IESEvents;
#ifdef __cplusplus
interface IESEvents;
#endif /* __cplusplus */
#endif

#ifndef __IESEventService_FWD_DEFINED__
#define __IESEventService_FWD_DEFINED__
typedef interface IESEventService IESEventService;
#ifdef __cplusplus
interface IESEventService;
#endif /* __cplusplus */
#endif

#ifndef __IESEventServiceConfiguration_FWD_DEFINED__
#define __IESEventServiceConfiguration_FWD_DEFINED__
typedef interface IESEventServiceConfiguration IESEventServiceConfiguration;
#ifdef __cplusplus
interface IESEventServiceConfiguration;
#endif /* __cplusplus */
#endif

#ifndef __IBroadcastEvent_FWD_DEFINED__
#define __IBroadcastEvent_FWD_DEFINED__
typedef interface IBroadcastEvent IBroadcastEvent;
#ifdef __cplusplus
interface IBroadcastEvent;
#endif /* __cplusplus */
#endif

#ifndef __IBroadcastEventEx_FWD_DEFINED__
#define __IBroadcastEventEx_FWD_DEFINED__
typedef interface IBroadcastEventEx IBroadcastEventEx;
#ifdef __cplusplus
interface IBroadcastEventEx;
#endif /* __cplusplus */
#endif

#ifndef __IRegisterTuner_FWD_DEFINED__
#define __IRegisterTuner_FWD_DEFINED__
typedef interface IRegisterTuner IRegisterTuner;
#ifdef __cplusplus
interface IRegisterTuner;
#endif /* __cplusplus */
#endif

#ifndef __IBDAComparable_FWD_DEFINED__
#define __IBDAComparable_FWD_DEFINED__
typedef interface IBDAComparable IBDAComparable;
#ifdef __cplusplus
interface IBDAComparable;
#endif /* __cplusplus */
#endif

#ifndef __IPersistTuneXml_FWD_DEFINED__
#define __IPersistTuneXml_FWD_DEFINED__
typedef interface IPersistTuneXml IPersistTuneXml;
#ifdef __cplusplus
interface IPersistTuneXml;
#endif /* __cplusplus */
#endif

#ifndef __IPersistTuneXmlUtility_FWD_DEFINED__
#define __IPersistTuneXmlUtility_FWD_DEFINED__
typedef interface IPersistTuneXmlUtility IPersistTuneXmlUtility;
#ifdef __cplusplus
interface IPersistTuneXmlUtility;
#endif /* __cplusplus */
#endif

#ifndef __IPersistTuneXmlUtility2_FWD_DEFINED__
#define __IPersistTuneXmlUtility2_FWD_DEFINED__
typedef interface IPersistTuneXmlUtility2 IPersistTuneXmlUtility2;
#ifdef __cplusplus
interface IPersistTuneXmlUtility2;
#endif /* __cplusplus */
#endif

#ifndef __IBDACreateTuneRequestEx_FWD_DEFINED__
#define __IBDACreateTuneRequestEx_FWD_DEFINED__
typedef interface IBDACreateTuneRequestEx IBDACreateTuneRequestEx;
#ifdef __cplusplus
interface IBDACreateTuneRequestEx;
#endif /* __cplusplus */
#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;
#ifdef __cplusplus
interface IAnalogLocator;
#endif /* __cplusplus */
#endif

#ifndef __IATSCLocator_FWD_DEFINED__
#define __IATSCLocator_FWD_DEFINED__
typedef interface IATSCLocator IATSCLocator;
#ifdef __cplusplus
interface IATSCLocator;
#endif /* __cplusplus */
#endif

#ifndef __IComponent_FWD_DEFINED__
#define __IComponent_FWD_DEFINED__
typedef interface IComponent IComponent;
#ifdef __cplusplus
interface IComponent;
#endif /* __cplusplus */
#endif

#ifndef __IComponents_FWD_DEFINED__
#define __IComponents_FWD_DEFINED__
typedef interface IComponents IComponents;
#ifdef __cplusplus
interface IComponents;
#endif /* __cplusplus */
#endif

#ifndef __IComponentType_FWD_DEFINED__
#define __IComponentType_FWD_DEFINED__
typedef interface IComponentType IComponentType;
#ifdef __cplusplus
interface IComponentType;
#endif /* __cplusplus */
#endif

#ifndef __IComponentTypes_FWD_DEFINED__
#define __IComponentTypes_FWD_DEFINED__
typedef interface IComponentTypes IComponentTypes;
#ifdef __cplusplus
interface IComponentTypes;
#endif /* __cplusplus */
#endif

#ifndef __IDigitalCableLocator_FWD_DEFINED__
#define __IDigitalCableLocator_FWD_DEFINED__
typedef interface IDigitalCableLocator IDigitalCableLocator;
#ifdef __cplusplus
interface IDigitalCableLocator;
#endif /* __cplusplus */
#endif

#ifndef __IDigitalCableTuneRequest_FWD_DEFINED__
#define __IDigitalCableTuneRequest_FWD_DEFINED__
typedef interface IDigitalCableTuneRequest IDigitalCableTuneRequest;
#ifdef __cplusplus
interface IDigitalCableTuneRequest;
#endif /* __cplusplus */
#endif

#ifndef __IDigitalCableTuningSpace_FWD_DEFINED__
#define __IDigitalCableTuningSpace_FWD_DEFINED__
typedef interface IDigitalCableTuningSpace IDigitalCableTuningSpace;
#ifdef __cplusplus
interface IDigitalCableTuningSpace;
#endif /* __cplusplus */
#endif

#ifndef __IDVBCLocator_FWD_DEFINED__
#define __IDVBCLocator_FWD_DEFINED__
typedef interface IDVBCLocator IDVBCLocator;
#ifdef __cplusplus
interface IDVBCLocator;
#endif /* __cplusplus */
#endif

#ifndef __IDVBSLocator_FWD_DEFINED__
#define __IDVBSLocator_FWD_DEFINED__
typedef interface IDVBSLocator IDVBSLocator;
#ifdef __cplusplus
interface IDVBSLocator;
#endif /* __cplusplus */
#endif

#ifndef __IDVBSLocator2_FWD_DEFINED__
#define __IDVBSLocator2_FWD_DEFINED__
typedef interface IDVBSLocator2 IDVBSLocator2;
#ifdef __cplusplus
interface IDVBSLocator2;
#endif /* __cplusplus */
#endif

#ifndef __IDVBTLocator_FWD_DEFINED__
#define __IDVBTLocator_FWD_DEFINED__
typedef interface IDVBTLocator IDVBTLocator;
#ifdef __cplusplus
interface IDVBTLocator;
#endif /* __cplusplus */
#endif

#ifndef __IDVBTLocator2_FWD_DEFINED__
#define __IDVBTLocator2_FWD_DEFINED__
typedef interface IDVBTLocator2 IDVBTLocator2;
#ifdef __cplusplus
interface IDVBTLocator2;
#endif /* __cplusplus */
#endif

#ifndef __IEnumComponents_FWD_DEFINED__
#define __IEnumComponents_FWD_DEFINED__
typedef interface IEnumComponents IEnumComponents;
#ifdef __cplusplus
interface IEnumComponents;
#endif /* __cplusplus */
#endif

#ifndef __IEnumComponentTypes_FWD_DEFINED__
#define __IEnumComponentTypes_FWD_DEFINED__
typedef interface IEnumComponentTypes IEnumComponentTypes;
#ifdef __cplusplus
interface IEnumComponentTypes;
#endif /* __cplusplus */
#endif

#ifndef __IEnumTuningSpaces_FWD_DEFINED__
#define __IEnumTuningSpaces_FWD_DEFINED__
typedef interface IEnumTuningSpaces IEnumTuningSpaces;
#ifdef __cplusplus
interface IEnumTuningSpaces;
#endif /* __cplusplus */
#endif

#ifndef __IISDBSLocator_FWD_DEFINED__
#define __IISDBSLocator_FWD_DEFINED__
typedef interface IISDBSLocator IISDBSLocator;
#ifdef __cplusplus
interface IISDBSLocator;
#endif /* __cplusplus */
#endif

#ifndef __ILanguageComponentType_FWD_DEFINED__
#define __ILanguageComponentType_FWD_DEFINED__
typedef interface ILanguageComponentType ILanguageComponentType;
#ifdef __cplusplus
interface ILanguageComponentType;
#endif /* __cplusplus */
#endif

#ifndef __ILocator_FWD_DEFINED__
#define __ILocator_FWD_DEFINED__
typedef interface ILocator ILocator;
#ifdef __cplusplus
interface ILocator;
#endif /* __cplusplus */
#endif

#ifndef __IMPEG2Component_FWD_DEFINED__
#define __IMPEG2Component_FWD_DEFINED__
typedef interface IMPEG2Component IMPEG2Component;
#ifdef __cplusplus
interface IMPEG2Component;
#endif /* __cplusplus */
#endif

#ifndef __IMPEG2ComponentType_FWD_DEFINED__
#define __IMPEG2ComponentType_FWD_DEFINED__
typedef interface IMPEG2ComponentType IMPEG2ComponentType;
#ifdef __cplusplus
interface IMPEG2ComponentType;
#endif /* __cplusplus */
#endif

#ifndef __IScanningTuner_FWD_DEFINED__
#define __IScanningTuner_FWD_DEFINED__
typedef interface IScanningTuner IScanningTuner;
#ifdef __cplusplus
interface IScanningTuner;
#endif /* __cplusplus */
#endif

#ifndef __ITuneRequest_FWD_DEFINED__
#define __ITuneRequest_FWD_DEFINED__
typedef interface ITuneRequest ITuneRequest;
#ifdef __cplusplus
interface ITuneRequest;
#endif /* __cplusplus */
#endif

#ifndef __ITuner_FWD_DEFINED__
#define __ITuner_FWD_DEFINED__
typedef interface ITuner ITuner;
#ifdef __cplusplus
interface ITuner;
#endif /* __cplusplus */
#endif

#ifndef __ITunerCap_FWD_DEFINED__
#define __ITunerCap_FWD_DEFINED__
typedef interface ITunerCap ITunerCap;
#ifdef __cplusplus
interface ITunerCap;
#endif /* __cplusplus */
#endif

#ifndef __ITuningSpace_FWD_DEFINED__
#define __ITuningSpace_FWD_DEFINED__
typedef interface ITuningSpace ITuningSpace;
#ifdef __cplusplus
interface ITuningSpace;
#endif /* __cplusplus */
#endif

#ifndef __ITuningSpaceContainer_FWD_DEFINED__
#define __ITuningSpaceContainer_FWD_DEFINED__
typedef interface ITuningSpaceContainer ITuningSpaceContainer;
#ifdef __cplusplus
interface ITuningSpaceContainer;
#endif /* __cplusplus */
#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 __WIDL_INLINE HRESULT ITuningSpaces_QueryInterface(ITuningSpaces* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ITuningSpaces_AddRef(ITuningSpaces* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ITuningSpaces_Release(ITuningSpaces* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ITuningSpaces_GetTypeInfoCount(ITuningSpaces* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ITuningSpaces_GetTypeInfo(ITuningSpaces* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ITuningSpaces_get_Count(ITuningSpaces* This,LONG *Count) {
    return This->lpVtbl->get_Count(This,Count);
}
static __WIDL_INLINE HRESULT ITuningSpaces_get__NewEnum(ITuningSpaces* This,IEnumVARIANT **NewEnum) {
    return This->lpVtbl->get__NewEnum(This,NewEnum);
}
static __WIDL_INLINE HRESULT ITuningSpaces_get_Item(ITuningSpaces* This,VARIANT varIndex,ITuningSpace **TuningSpace) {
    return This->lpVtbl->get_Item(This,varIndex,TuningSpace);
}
static __WIDL_INLINE HRESULT ITuningSpaces_get_EnumTuningSpaces(ITuningSpaces* This,IEnumTuningSpaces **NewEnum) {
    return This->lpVtbl->get_EnumTuningSpaces(This,NewEnum);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT ITuningSpaceContainer_QueryInterface(ITuningSpaceContainer* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ITuningSpaceContainer_AddRef(ITuningSpaceContainer* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ITuningSpaceContainer_Release(ITuningSpaceContainer* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ITuningSpaceContainer_GetTypeInfoCount(ITuningSpaceContainer* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ITuningSpaceContainer_GetTypeInfo(ITuningSpaceContainer* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ITuningSpaceContainer_get_Count(ITuningSpaceContainer* This,LONG *Count) {
    return This->lpVtbl->get_Count(This,Count);
}
static __WIDL_INLINE HRESULT ITuningSpaceContainer_get__NewEnum(ITuningSpaceContainer* This,IEnumVARIANT **NewEnum) {
    return This->lpVtbl->get__NewEnum(This,NewEnum);
}
static __WIDL_INLINE HRESULT ITuningSpaceContainer_get_Item(ITuningSpaceContainer* This,VARIANT varIndex,ITuningSpace **TuningSpace) {
    return This->lpVtbl->get_Item(This,varIndex,TuningSpace);
}
static __WIDL_INLINE HRESULT ITuningSpaceContainer_put_Item(ITuningSpaceContainer* This,VARIANT varIndex,ITuningSpace *TuningSpace) {
    return This->lpVtbl->put_Item(This,varIndex,TuningSpace);
}
static __WIDL_INLINE HRESULT ITuningSpaceContainer_TuningSpacesForCLSID(ITuningSpaceContainer* This,BSTR SpaceCLSID,ITuningSpaces **NewColl) {
    return This->lpVtbl->TuningSpacesForCLSID(This,SpaceCLSID,NewColl);
}
static __WIDL_INLINE HRESULT ITuningSpaceContainer__TuningSpacesForCLSID(ITuningSpaceContainer* This,REFCLSID SpaceCLSID,ITuningSpaces **NewColl) {
    return This->lpVtbl->_TuningSpacesForCLSID(This,SpaceCLSID,NewColl);
}
static __WIDL_INLINE HRESULT ITuningSpaceContainer_TuningSpacesForName(ITuningSpaceContainer* This,BSTR Name,ITuningSpaces **NewColl) {
    return This->lpVtbl->TuningSpacesForName(This,Name,NewColl);
}
static __WIDL_INLINE HRESULT ITuningSpaceContainer_FindID(ITuningSpaceContainer* This,ITuningSpace *TuningSpace,LONG *ID) {
    return This->lpVtbl->FindID(This,TuningSpace,ID);
}
static __WIDL_INLINE HRESULT ITuningSpaceContainer_Add(ITuningSpaceContainer* This,ITuningSpace *TuningSpace,VARIANT *NewIndex) {
    return This->lpVtbl->Add(This,TuningSpace,NewIndex);
}
static __WIDL_INLINE HRESULT ITuningSpaceContainer_get_EnumTuningSpaces(ITuningSpaceContainer* This,IEnumTuningSpaces **ppEnum) {
    return This->lpVtbl->get_EnumTuningSpaces(This,ppEnum);
}
static __WIDL_INLINE HRESULT ITuningSpaceContainer_Remove(ITuningSpaceContainer* This,VARIANT Index) {
    return This->lpVtbl->Remove(This,Index);
}
static __WIDL_INLINE HRESULT ITuningSpaceContainer_get_MaxCount(ITuningSpaceContainer* This,LONG *MaxCount) {
    return This->lpVtbl->get_MaxCount(This,MaxCount);
}
static __WIDL_INLINE HRESULT ITuningSpaceContainer_put_MaxCount(ITuningSpaceContainer* This,LONG MaxCount) {
    return This->lpVtbl->put_MaxCount(This,MaxCount);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT ITuningSpace_QueryInterface(ITuningSpace* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ITuningSpace_AddRef(ITuningSpace* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ITuningSpace_Release(ITuningSpace* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ITuningSpace_GetTypeInfoCount(ITuningSpace* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ITuningSpace_GetTypeInfo(ITuningSpace* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ITuningSpace_get_UniqueName(ITuningSpace* This,BSTR *Name) {
    return This->lpVtbl->get_UniqueName(This,Name);
}
static __WIDL_INLINE HRESULT ITuningSpace_put_UniqueName(ITuningSpace* This,BSTR Name) {
    return This->lpVtbl->put_UniqueName(This,Name);
}
static __WIDL_INLINE HRESULT ITuningSpace_get_FriendlyName(ITuningSpace* This,BSTR *Name) {
    return This->lpVtbl->get_FriendlyName(This,Name);
}
static __WIDL_INLINE HRESULT ITuningSpace_put_FriendlyName(ITuningSpace* This,BSTR Name) {
    return This->lpVtbl->put_FriendlyName(This,Name);
}
static __WIDL_INLINE HRESULT ITuningSpace_get_CLSID(ITuningSpace* This,BSTR *SpaceCLSID) {
    return This->lpVtbl->get_CLSID(This,SpaceCLSID);
}
static __WIDL_INLINE HRESULT ITuningSpace_get_NetworkType(ITuningSpace* This,BSTR *NetworkTypeGuid) {
    return This->lpVtbl->get_NetworkType(This,NetworkTypeGuid);
}
static __WIDL_INLINE HRESULT ITuningSpace_put_NetworkType(ITuningSpace* This,BSTR NetworkTypeGuid) {
    return This->lpVtbl->put_NetworkType(This,NetworkTypeGuid);
}
static __WIDL_INLINE HRESULT ITuningSpace_get__NetworkType(ITuningSpace* This,GUID *NetworkTypeGuid) {
    return This->lpVtbl->get__NetworkType(This,NetworkTypeGuid);
}
static __WIDL_INLINE HRESULT ITuningSpace_put__NetworkType(ITuningSpace* This,REFCLSID NetworkTypeGuid) {
    return This->lpVtbl->put__NetworkType(This,NetworkTypeGuid);
}
static __WIDL_INLINE HRESULT ITuningSpace_CreateTuneRequest(ITuningSpace* This,ITuneRequest **TuneRequest) {
    return This->lpVtbl->CreateTuneRequest(This,TuneRequest);
}
static __WIDL_INLINE HRESULT ITuningSpace_EnumCategoryGUIDs(ITuningSpace* This,IEnumGUID **ppEnum) {
    return This->lpVtbl->EnumCategoryGUIDs(This,ppEnum);
}
static __WIDL_INLINE HRESULT ITuningSpace_EnumDeviceMonikers(ITuningSpace* This,IEnumMoniker **ppEnum) {
    return This->lpVtbl->EnumDeviceMonikers(This,ppEnum);
}
static __WIDL_INLINE HRESULT ITuningSpace_get_DefaultPreferredComponentTypes(ITuningSpace* This,IComponentTypes **ComponentTypes) {
    return This->lpVtbl->get_DefaultPreferredComponentTypes(This,ComponentTypes);
}
static __WIDL_INLINE HRESULT ITuningSpace_put_DefaultPreferredComponentTypes(ITuningSpace* This,IComponentTypes *NewComponentTypes) {
    return This->lpVtbl->put_DefaultPreferredComponentTypes(This,NewComponentTypes);
}
static __WIDL_INLINE HRESULT ITuningSpace_get_FrequencyMapping(ITuningSpace* This,BSTR *pMapping) {
    return This->lpVtbl->get_FrequencyMapping(This,pMapping);
}
static __WIDL_INLINE HRESULT ITuningSpace_put_FrequencyMapping(ITuningSpace* This,BSTR Mapping) {
    return This->lpVtbl->put_FrequencyMapping(This,Mapping);
}
static __WIDL_INLINE HRESULT ITuningSpace_get_DefaultLocator(ITuningSpace* This,ILocator **LocatorVal) {
    return This->lpVtbl->get_DefaultLocator(This,LocatorVal);
}
static __WIDL_INLINE HRESULT ITuningSpace_put_DefaultLocator(ITuningSpace* This,ILocator *LocatorVal) {
    return This->lpVtbl->put_DefaultLocator(This,LocatorVal);
}
static __WIDL_INLINE HRESULT ITuningSpace_Clone(ITuningSpace* This,ITuningSpace **NewTS) {
    return This->lpVtbl->Clone(This,NewTS);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IEnumTuningSpaces_QueryInterface(IEnumTuningSpaces* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IEnumTuningSpaces_AddRef(IEnumTuningSpaces* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IEnumTuningSpaces_Release(IEnumTuningSpaces* This) {
    return This->lpVtbl->Release(This);
}
/*** IEnumTuningSpaces methods ***/
static __WIDL_INLINE HRESULT IEnumTuningSpaces_Next(IEnumTuningSpaces* This,ULONG celt,ITuningSpace **rgelt,ULONG *pceltFetched) {
    return This->lpVtbl->Next(This,celt,rgelt,pceltFetched);
}
static __WIDL_INLINE HRESULT IEnumTuningSpaces_Skip(IEnumTuningSpaces* This,ULONG celt) {
    return This->lpVtbl->Skip(This,celt);
}
static __WIDL_INLINE HRESULT IEnumTuningSpaces_Reset(IEnumTuningSpaces* This) {
    return This->lpVtbl->Reset(This);
}
static __WIDL_INLINE HRESULT IEnumTuningSpaces_Clone(IEnumTuningSpaces* This,IEnumTuningSpaces **ppEnum) {
    return This->lpVtbl->Clone(This,ppEnum);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IDVBTuningSpace_QueryInterface(IDVBTuningSpace* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDVBTuningSpace_AddRef(IDVBTuningSpace* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDVBTuningSpace_Release(IDVBTuningSpace* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IDVBTuningSpace_GetTypeInfoCount(IDVBTuningSpace* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IDVBTuningSpace_GetTypeInfo(IDVBTuningSpace* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDVBTuningSpace_get_UniqueName(IDVBTuningSpace* This,BSTR *Name) {
    return This->lpVtbl->get_UniqueName(This,Name);
}
static __WIDL_INLINE HRESULT IDVBTuningSpace_put_UniqueName(IDVBTuningSpace* This,BSTR Name) {
    return This->lpVtbl->put_UniqueName(This,Name);
}
static __WIDL_INLINE HRESULT IDVBTuningSpace_get_FriendlyName(IDVBTuningSpace* This,BSTR *Name) {
    return This->lpVtbl->get_FriendlyName(This,Name);
}
static __WIDL_INLINE HRESULT IDVBTuningSpace_put_FriendlyName(IDVBTuningSpace* This,BSTR Name) {
    return This->lpVtbl->put_FriendlyName(This,Name);
}
static __WIDL_INLINE HRESULT IDVBTuningSpace_get_CLSID(IDVBTuningSpace* This,BSTR *SpaceCLSID) {
    return This->lpVtbl->get_CLSID(This,SpaceCLSID);
}
static __WIDL_INLINE HRESULT IDVBTuningSpace_get_NetworkType(IDVBTuningSpace* This,BSTR *NetworkTypeGuid) {
    return This->lpVtbl->get_NetworkType(This,NetworkTypeGuid);
}
static __WIDL_INLINE HRESULT IDVBTuningSpace_put_NetworkType(IDVBTuningSpace* This,BSTR NetworkTypeGuid) {
    return This->lpVtbl->put_NetworkType(This,NetworkTypeGuid);
}
static __WIDL_INLINE HRESULT IDVBTuningSpace_get__NetworkType(IDVBTuningSpace* This,GUID *NetworkTypeGuid) {
    return This->lpVtbl->get__NetworkType(This,NetworkTypeGuid);
}
static __WIDL_INLINE HRESULT IDVBTuningSpace_put__NetworkType(IDVBTuningSpace* This,REFCLSID NetworkTypeGuid) {
    return This->lpVtbl->put__NetworkType(This,NetworkTypeGuid);
}
static __WIDL_INLINE HRESULT IDVBTuningSpace_CreateTuneRequest(IDVBTuningSpace* This,ITuneRequest **TuneRequest) {
    return This->lpVtbl->CreateTuneRequest(This,TuneRequest);
}
static __WIDL_INLINE HRESULT IDVBTuningSpace_EnumCategoryGUIDs(IDVBTuningSpace* This,IEnumGUID **ppEnum) {
    return This->lpVtbl->EnumCategoryGUIDs(This,ppEnum);
}
static __WIDL_INLINE HRESULT IDVBTuningSpace_EnumDeviceMonikers(IDVBTuningSpace* This,IEnumMoniker **ppEnum) {
    return This->lpVtbl->EnumDeviceMonikers(This,ppEnum);
}
static __WIDL_INLINE HRESULT IDVBTuningSpace_get_DefaultPreferredComponentTypes(IDVBTuningSpace* This,IComponentTypes **ComponentTypes) {
    return This->lpVtbl->get_DefaultPreferredComponentTypes(This,ComponentTypes);
}
static __WIDL_INLINE HRESULT IDVBTuningSpace_put_DefaultPreferredComponentTypes(IDVBTuningSpace* This,IComponentTypes *NewComponentTypes) {
    return This->lpVtbl->put_DefaultPreferredComponentTypes(This,NewComponentTypes);
}
static __WIDL_INLINE HRESULT IDVBTuningSpace_get_FrequencyMapping(IDVBTuningSpace* This,BSTR *pMapping) {
    return This->lpVtbl->get_FrequencyMapping(This,pMapping);
}
static __WIDL_INLINE HRESULT IDVBTuningSpace_put_FrequencyMapping(IDVBTuningSpace* This,BSTR Mapping) {
    return This->lpVtbl->put_FrequencyMapping(This,Mapping);
}
static __WIDL_INLINE HRESULT IDVBTuningSpace_get_DefaultLocator(IDVBTuningSpace* This,ILocator **LocatorVal) {
    return This->lpVtbl->get_DefaultLocator(This,LocatorVal);
}
static __WIDL_INLINE HRESULT IDVBTuningSpace_put_DefaultLocator(IDVBTuningSpace* This,ILocator *LocatorVal) {
    return This->lpVtbl->put_DefaultLocator(This,LocatorVal);
}
static __WIDL_INLINE HRESULT IDVBTuningSpace_Clone(IDVBTuningSpace* This,ITuningSpace **NewTS) {
    return This->lpVtbl->Clone(This,NewTS);
}
/*** IDVBTuningSpace methods ***/
static __WIDL_INLINE HRESULT IDVBTuningSpace_get_SystemType(IDVBTuningSpace* This,DVBSystemType *SysType) {
    return This->lpVtbl->get_SystemType(This,SysType);
}
static __WIDL_INLINE HRESULT IDVBTuningSpace_put_SystemType(IDVBTuningSpace* This,DVBSystemType SysType) {
    return This->lpVtbl->put_SystemType(This,SysType);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IDVBTuningSpace2_QueryInterface(IDVBTuningSpace2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDVBTuningSpace2_AddRef(IDVBTuningSpace2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDVBTuningSpace2_Release(IDVBTuningSpace2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IDVBTuningSpace2_GetTypeInfoCount(IDVBTuningSpace2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IDVBTuningSpace2_GetTypeInfo(IDVBTuningSpace2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDVBTuningSpace2_get_UniqueName(IDVBTuningSpace2* This,BSTR *Name) {
    return This->lpVtbl->get_UniqueName(This,Name);
}
static __WIDL_INLINE HRESULT IDVBTuningSpace2_put_UniqueName(IDVBTuningSpace2* This,BSTR Name) {
    return This->lpVtbl->put_UniqueName(This,Name);
}
static __WIDL_INLINE HRESULT IDVBTuningSpace2_get_FriendlyName(IDVBTuningSpace2* This,BSTR *Name) {
    return This->lpVtbl->get_FriendlyName(This,Name);
}
static __WIDL_INLINE HRESULT IDVBTuningSpace2_put_FriendlyName(IDVBTuningSpace2* This,BSTR Name) {
    return This->lpVtbl->put_FriendlyName(This,Name);
}
static __WIDL_INLINE HRESULT IDVBTuningSpace2_get_CLSID(IDVBTuningSpace2* This,BSTR *SpaceCLSID) {
    return This->lpVtbl->get_CLSID(This,SpaceCLSID);
}
static __WIDL_INLINE HRESULT IDVBTuningSpace2_get_NetworkType(IDVBTuningSpace2* This,BSTR *NetworkTypeGuid) {
    return This->lpVtbl->get_NetworkType(This,NetworkTypeGuid);
}
static __WIDL_INLINE HRESULT IDVBTuningSpace2_put_NetworkType(IDVBTuningSpace2* This,BSTR NetworkTypeGuid) {
    return This->lpVtbl->put_NetworkType(This,NetworkTypeGuid);
}
static __WIDL_INLINE HRESULT IDVBTuningSpace2_get__NetworkType(IDVBTuningSpace2* This,GUID *NetworkTypeGuid) {
    return This->lpVtbl->get__NetworkType(This,NetworkTypeGuid);
}
static __WIDL_INLINE HRESULT IDVBTuningSpace2_put__NetworkType(IDVBTuningSpace2* This,REFCLSID NetworkTypeGuid) {
    return This->lpVtbl->put__NetworkType(This,NetworkTypeGuid);
}
static __WIDL_INLINE HRESULT IDVBTuningSpace2_CreateTuneRequest(IDVBTuningSpace2* This,ITuneRequest **TuneRequest) {
    return This->lpVtbl->CreateTuneRequest(This,TuneRequest);
}
static __WIDL_INLINE HRESULT IDVBTuningSpace2_EnumCategoryGUIDs(IDVBTuningSpace2* This,IEnumGUID **ppEnum) {
    return This->lpVtbl->EnumCategoryGUIDs(This,ppEnum);
}
static __WIDL_INLINE HRESULT IDVBTuningSpace2_EnumDeviceMonikers(IDVBTuningSpace2* This,IEnumMoniker **ppEnum) {
    return This->lpVtbl->EnumDeviceMonikers(This,ppEnum);
}
static __WIDL_INLINE HRESULT IDVBTuningSpace2_get_DefaultPreferredComponentTypes(IDVBTuningSpace2* This,IComponentTypes **ComponentTypes) {
    return This->lpVtbl->get_DefaultPreferredComponentTypes(This,ComponentTypes);
}
static __WIDL_INLINE HRESULT IDVBTuningSpace2_put_DefaultPreferredComponentTypes(IDVBTuningSpace2* This,IComponentTypes *NewComponentTypes) {
    return This->lpVtbl->put_DefaultPreferredComponentTypes(This,NewComponentTypes);
}
static __WIDL_INLINE HRESULT IDVBTuningSpace2_get_FrequencyMapping(IDVBTuningSpace2* This,BSTR *pMapping) {
    return This->lpVtbl->get_FrequencyMapping(This,pMapping);
}
static __WIDL_INLINE HRESULT IDVBTuningSpace2_put_FrequencyMapping(IDVBTuningSpace2* This,BSTR Mapping) {
    return This->lpVtbl->put_FrequencyMapping(This,Mapping);
}
static __WIDL_INLINE HRESULT IDVBTuningSpace2_get_DefaultLocator(IDVBTuningSpace2* This,ILocator **LocatorVal) {
    return This->lpVtbl->get_DefaultLocator(This,LocatorVal);
}
static __WIDL_INLINE HRESULT IDVBTuningSpace2_put_DefaultLocator(IDVBTuningSpace2* This,ILocator *LocatorVal) {
    return This->lpVtbl->put_DefaultLocator(This,LocatorVal);
}
static __WIDL_INLINE HRESULT IDVBTuningSpace2_Clone(IDVBTuningSpace2* This,ITuningSpace **NewTS) {
    return This->lpVtbl->Clone(This,NewTS);
}
/*** IDVBTuningSpace methods ***/
static __WIDL_INLINE HRESULT IDVBTuningSpace2_get_SystemType(IDVBTuningSpace2* This,DVBSystemType *SysType) {
    return This->lpVtbl->get_SystemType(This,SysType);
}
static __WIDL_INLINE HRESULT IDVBTuningSpace2_put_SystemType(IDVBTuningSpace2* This,DVBSystemType SysType) {
    return This->lpVtbl->put_SystemType(This,SysType);
}
/*** IDVBTuningSpace2 methods ***/
static __WIDL_INLINE HRESULT IDVBTuningSpace2_get_NetworkID(IDVBTuningSpace2* This,LONG *NetworkID) {
    return This->lpVtbl->get_NetworkID(This,NetworkID);
}
static __WIDL_INLINE HRESULT IDVBTuningSpace2_put_NetworkID(IDVBTuningSpace2* This,LONG NetworkID) {
    return This->lpVtbl->put_NetworkID(This,NetworkID);
}
#endif
#endif

#endif


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

#endif


#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 __WIDL_INLINE HRESULT IAuxInTuningSpace_QueryInterface(IAuxInTuningSpace* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IAuxInTuningSpace_AddRef(IAuxInTuningSpace* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IAuxInTuningSpace_Release(IAuxInTuningSpace* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IAuxInTuningSpace_GetTypeInfoCount(IAuxInTuningSpace* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IAuxInTuningSpace_GetTypeInfo(IAuxInTuningSpace* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IAuxInTuningSpace_get_UniqueName(IAuxInTuningSpace* This,BSTR *Name) {
    return This->lpVtbl->get_UniqueName(This,Name);
}
static __WIDL_INLINE HRESULT IAuxInTuningSpace_put_UniqueName(IAuxInTuningSpace* This,BSTR Name) {
    return This->lpVtbl->put_UniqueName(This,Name);
}
static __WIDL_INLINE HRESULT IAuxInTuningSpace_get_FriendlyName(IAuxInTuningSpace* This,BSTR *Name) {
    return This->lpVtbl->get_FriendlyName(This,Name);
}
static __WIDL_INLINE HRESULT IAuxInTuningSpace_put_FriendlyName(IAuxInTuningSpace* This,BSTR Name) {
    return This->lpVtbl->put_FriendlyName(This,Name);
}
static __WIDL_INLINE HRESULT IAuxInTuningSpace_get_CLSID(IAuxInTuningSpace* This,BSTR *SpaceCLSID) {
    return This->lpVtbl->get_CLSID(This,SpaceCLSID);
}
static __WIDL_INLINE HRESULT IAuxInTuningSpace_get_NetworkType(IAuxInTuningSpace* This,BSTR *NetworkTypeGuid) {
    return This->lpVtbl->get_NetworkType(This,NetworkTypeGuid);
}
static __WIDL_INLINE HRESULT IAuxInTuningSpace_put_NetworkType(IAuxInTuningSpace* This,BSTR NetworkTypeGuid) {
    return This->lpVtbl->put_NetworkType(This,NetworkTypeGuid);
}
static __WIDL_INLINE HRESULT IAuxInTuningSpace_get__NetworkType(IAuxInTuningSpace* This,GUID *NetworkTypeGuid) {
    return This->lpVtbl->get__NetworkType(This,NetworkTypeGuid);
}
static __WIDL_INLINE HRESULT IAuxInTuningSpace_put__NetworkType(IAuxInTuningSpace* This,REFCLSID NetworkTypeGuid) {
    return This->lpVtbl->put__NetworkType(This,NetworkTypeGuid);
}
static __WIDL_INLINE HRESULT IAuxInTuningSpace_CreateTuneRequest(IAuxInTuningSpace* This,ITuneRequest **TuneRequest) {
    return This->lpVtbl->CreateTuneRequest(This,TuneRequest);
}
static __WIDL_INLINE HRESULT IAuxInTuningSpace_EnumCategoryGUIDs(IAuxInTuningSpace* This,IEnumGUID **ppEnum) {
    return This->lpVtbl->EnumCategoryGUIDs(This,ppEnum);
}
static __WIDL_INLINE HRESULT IAuxInTuningSpace_EnumDeviceMonikers(IAuxInTuningSpace* This,IEnumMoniker **ppEnum) {
    return This->lpVtbl->EnumDeviceMonikers(This,ppEnum);
}
static __WIDL_INLINE HRESULT IAuxInTuningSpace_get_DefaultPreferredComponentTypes(IAuxInTuningSpace* This,IComponentTypes **ComponentTypes) {
    return This->lpVtbl->get_DefaultPreferredComponentTypes(This,ComponentTypes);
}
static __WIDL_INLINE HRESULT IAuxInTuningSpace_put_DefaultPreferredComponentTypes(IAuxInTuningSpace* This,IComponentTypes *NewComponentTypes) {
    return This->lpVtbl->put_DefaultPreferredComponentTypes(This,NewComponentTypes);
}
static __WIDL_INLINE HRESULT IAuxInTuningSpace_get_FrequencyMapping(IAuxInTuningSpace* This,BSTR *pMapping) {
    return This->lpVtbl->get_FrequencyMapping(This,pMapping);
}
static __WIDL_INLINE HRESULT IAuxInTuningSpace_put_FrequencyMapping(IAuxInTuningSpace* This,BSTR Mapping) {
    return This->lpVtbl->put_FrequencyMapping(This,Mapping);
}
static __WIDL_INLINE HRESULT IAuxInTuningSpace_get_DefaultLocator(IAuxInTuningSpace* This,ILocator **LocatorVal) {
    return This->lpVtbl->get_DefaultLocator(This,LocatorVal);
}
static __WIDL_INLINE HRESULT IAuxInTuningSpace_put_DefaultLocator(IAuxInTuningSpace* This,ILocator *LocatorVal) {
    return This->lpVtbl->put_DefaultLocator(This,LocatorVal);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IAuxInTuningSpace2_QueryInterface(IAuxInTuningSpace2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IAuxInTuningSpace2_AddRef(IAuxInTuningSpace2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IAuxInTuningSpace2_Release(IAuxInTuningSpace2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IAuxInTuningSpace2_GetTypeInfoCount(IAuxInTuningSpace2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IAuxInTuningSpace2_GetTypeInfo(IAuxInTuningSpace2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IAuxInTuningSpace2_get_UniqueName(IAuxInTuningSpace2* This,BSTR *Name) {
    return This->lpVtbl->get_UniqueName(This,Name);
}
static __WIDL_INLINE HRESULT IAuxInTuningSpace2_put_UniqueName(IAuxInTuningSpace2* This,BSTR Name) {
    return This->lpVtbl->put_UniqueName(This,Name);
}
static __WIDL_INLINE HRESULT IAuxInTuningSpace2_get_FriendlyName(IAuxInTuningSpace2* This,BSTR *Name) {
    return This->lpVtbl->get_FriendlyName(This,Name);
}
static __WIDL_INLINE HRESULT IAuxInTuningSpace2_put_FriendlyName(IAuxInTuningSpace2* This,BSTR Name) {
    return This->lpVtbl->put_FriendlyName(This,Name);
}
static __WIDL_INLINE HRESULT IAuxInTuningSpace2_get_CLSID(IAuxInTuningSpace2* This,BSTR *SpaceCLSID) {
    return This->lpVtbl->get_CLSID(This,SpaceCLSID);
}
static __WIDL_INLINE HRESULT IAuxInTuningSpace2_get_NetworkType(IAuxInTuningSpace2* This,BSTR *NetworkTypeGuid) {
    return This->lpVtbl->get_NetworkType(This,NetworkTypeGuid);
}
static __WIDL_INLINE HRESULT IAuxInTuningSpace2_put_NetworkType(IAuxInTuningSpace2* This,BSTR NetworkTypeGuid) {
    return This->lpVtbl->put_NetworkType(This,NetworkTypeGuid);
}
static __WIDL_INLINE HRESULT IAuxInTuningSpace2_get__NetworkType(IAuxInTuningSpace2* This,GUID *NetworkTypeGuid) {
    return This->lpVtbl->get__NetworkType(This,NetworkTypeGuid);
}
static __WIDL_INLINE HRESULT IAuxInTuningSpace2_put__NetworkType(IAuxInTuningSpace2* This,REFCLSID NetworkTypeGuid) {
    return This->lpVtbl->put__NetworkType(This,NetworkTypeGuid);
}
static __WIDL_INLINE HRESULT IAuxInTuningSpace2_CreateTuneRequest(IAuxInTuningSpace2* This,ITuneRequest **TuneRequest) {
    return This->lpVtbl->CreateTuneRequest(This,TuneRequest);
}
static __WIDL_INLINE HRESULT IAuxInTuningSpace2_EnumCategoryGUIDs(IAuxInTuningSpace2* This,IEnumGUID **ppEnum) {
    return This->lpVtbl->EnumCategoryGUIDs(This,ppEnum);
}
static __WIDL_INLINE HRESULT IAuxInTuningSpace2_EnumDeviceMonikers(IAuxInTuningSpace2* This,IEnumMoniker **ppEnum) {
    return This->lpVtbl->EnumDeviceMonikers(This,ppEnum);
}
static __WIDL_INLINE HRESULT IAuxInTuningSpace2_get_DefaultPreferredComponentTypes(IAuxInTuningSpace2* This,IComponentTypes **ComponentTypes) {
    return This->lpVtbl->get_DefaultPreferredComponentTypes(This,ComponentTypes);
}
static __WIDL_INLINE HRESULT IAuxInTuningSpace2_put_DefaultPreferredComponentTypes(IAuxInTuningSpace2* This,IComponentTypes *NewComponentTypes) {
    return This->lpVtbl->put_DefaultPreferredComponentTypes(This,NewComponentTypes);
}
static __WIDL_INLINE HRESULT IAuxInTuningSpace2_get_FrequencyMapping(IAuxInTuningSpace2* This,BSTR *pMapping) {
    return This->lpVtbl->get_FrequencyMapping(This,pMapping);
}
static __WIDL_INLINE HRESULT IAuxInTuningSpace2_put_FrequencyMapping(IAuxInTuningSpace2* This,BSTR Mapping) {
    return This->lpVtbl->put_FrequencyMapping(This,Mapping);
}
static __WIDL_INLINE HRESULT IAuxInTuningSpace2_get_DefaultLocator(IAuxInTuningSpace2* This,ILocator **LocatorVal) {
    return This->lpVtbl->get_DefaultLocator(This,LocatorVal);
}
static __WIDL_INLINE HRESULT IAuxInTuningSpace2_put_DefaultLocator(IAuxInTuningSpace2* This,ILocator *LocatorVal) {
    return This->lpVtbl->put_DefaultLocator(This,LocatorVal);
}
static __WIDL_INLINE HRESULT IAuxInTuningSpace2_Clone(IAuxInTuningSpace2* This,ITuningSpace **NewTS) {
    return This->lpVtbl->Clone(This,NewTS);
}
/*** IAuxInTuningSpace2 methods ***/
static __WIDL_INLINE HRESULT IAuxInTuningSpace2_get_CountryCode(IAuxInTuningSpace2* This,LONG *CountryCodeVal) {
    return This->lpVtbl->get_CountryCode(This,CountryCodeVal);
}
static __WIDL_INLINE HRESULT IAuxInTuningSpace2_put_CountryCode(IAuxInTuningSpace2* This,LONG NewCountryCodeVal) {
    return This->lpVtbl->put_CountryCode(This,NewCountryCodeVal);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IAnalogTVTuningSpace_QueryInterface(IAnalogTVTuningSpace* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IAnalogTVTuningSpace_AddRef(IAnalogTVTuningSpace* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IAnalogTVTuningSpace_Release(IAnalogTVTuningSpace* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IAnalogTVTuningSpace_GetTypeInfoCount(IAnalogTVTuningSpace* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IAnalogTVTuningSpace_GetTypeInfo(IAnalogTVTuningSpace* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IAnalogTVTuningSpace_get_UniqueName(IAnalogTVTuningSpace* This,BSTR *Name) {
    return This->lpVtbl->get_UniqueName(This,Name);
}
static __WIDL_INLINE HRESULT IAnalogTVTuningSpace_put_UniqueName(IAnalogTVTuningSpace* This,BSTR Name) {
    return This->lpVtbl->put_UniqueName(This,Name);
}
static __WIDL_INLINE HRESULT IAnalogTVTuningSpace_get_FriendlyName(IAnalogTVTuningSpace* This,BSTR *Name) {
    return This->lpVtbl->get_FriendlyName(This,Name);
}
static __WIDL_INLINE HRESULT IAnalogTVTuningSpace_put_FriendlyName(IAnalogTVTuningSpace* This,BSTR Name) {
    return This->lpVtbl->put_FriendlyName(This,Name);
}
static __WIDL_INLINE HRESULT IAnalogTVTuningSpace_get_CLSID(IAnalogTVTuningSpace* This,BSTR *SpaceCLSID) {
    return This->lpVtbl->get_CLSID(This,SpaceCLSID);
}
static __WIDL_INLINE HRESULT IAnalogTVTuningSpace_get_NetworkType(IAnalogTVTuningSpace* This,BSTR *NetworkTypeGuid) {
    return This->lpVtbl->get_NetworkType(This,NetworkTypeGuid);
}
static __WIDL_INLINE HRESULT IAnalogTVTuningSpace_put_NetworkType(IAnalogTVTuningSpace* This,BSTR NetworkTypeGuid) {
    return This->lpVtbl->put_NetworkType(This,NetworkTypeGuid);
}
static __WIDL_INLINE HRESULT IAnalogTVTuningSpace_get__NetworkType(IAnalogTVTuningSpace* This,GUID *NetworkTypeGuid) {
    return This->lpVtbl->get__NetworkType(This,NetworkTypeGuid);
}
static __WIDL_INLINE HRESULT IAnalogTVTuningSpace_put__NetworkType(IAnalogTVTuningSpace* This,REFCLSID NetworkTypeGuid) {
    return This->lpVtbl->put__NetworkType(This,NetworkTypeGuid);
}
static __WIDL_INLINE HRESULT IAnalogTVTuningSpace_CreateTuneRequest(IAnalogTVTuningSpace* This,ITuneRequest **TuneRequest) {
    return This->lpVtbl->CreateTuneRequest(This,TuneRequest);
}
static __WIDL_INLINE HRESULT IAnalogTVTuningSpace_EnumCategoryGUIDs(IAnalogTVTuningSpace* This,IEnumGUID **ppEnum) {
    return This->lpVtbl->EnumCategoryGUIDs(This,ppEnum);
}
static __WIDL_INLINE HRESULT IAnalogTVTuningSpace_EnumDeviceMonikers(IAnalogTVTuningSpace* This,IEnumMoniker **ppEnum) {
    return This->lpVtbl->EnumDeviceMonikers(This,ppEnum);
}
static __WIDL_INLINE HRESULT IAnalogTVTuningSpace_get_DefaultPreferredComponentTypes(IAnalogTVTuningSpace* This,IComponentTypes **ComponentTypes) {
    return This->lpVtbl->get_DefaultPreferredComponentTypes(This,ComponentTypes);
}
static __WIDL_INLINE HRESULT IAnalogTVTuningSpace_put_DefaultPreferredComponentTypes(IAnalogTVTuningSpace* This,IComponentTypes *NewComponentTypes) {
    return This->lpVtbl->put_DefaultPreferredComponentTypes(This,NewComponentTypes);
}
static __WIDL_INLINE HRESULT IAnalogTVTuningSpace_get_FrequencyMapping(IAnalogTVTuningSpace* This,BSTR *pMapping) {
    return This->lpVtbl->get_FrequencyMapping(This,pMapping);
}
static __WIDL_INLINE HRESULT IAnalogTVTuningSpace_put_FrequencyMapping(IAnalogTVTuningSpace* This,BSTR Mapping) {
    return This->lpVtbl->put_FrequencyMapping(This,Mapping);
}
static __WIDL_INLINE HRESULT IAnalogTVTuningSpace_get_DefaultLocator(IAnalogTVTuningSpace* This,ILocator **LocatorVal) {
    return This->lpVtbl->get_DefaultLocator(This,LocatorVal);
}
static __WIDL_INLINE HRESULT IAnalogTVTuningSpace_put_DefaultLocator(IAnalogTVTuningSpace* This,ILocator *LocatorVal) {
    return This->lpVtbl->put_DefaultLocator(This,LocatorVal);
}
static __WIDL_INLINE HRESULT IAnalogTVTuningSpace_Clone(IAnalogTVTuningSpace* This,ITuningSpace **NewTS) {
    return This->lpVtbl->Clone(This,NewTS);
}
/*** IAnalogTVTuningSpace methods ***/
static __WIDL_INLINE HRESULT IAnalogTVTuningSpace_get_MinChannel(IAnalogTVTuningSpace* This,LONG *MinChannelVal) {
    return This->lpVtbl->get_MinChannel(This,MinChannelVal);
}
static __WIDL_INLINE HRESULT IAnalogTVTuningSpace_put_MinChannel(IAnalogTVTuningSpace* This,LONG NewMinChannelVal) {
    return This->lpVtbl->put_MinChannel(This,NewMinChannelVal);
}
static __WIDL_INLINE HRESULT IAnalogTVTuningSpace_get_MaxChannel(IAnalogTVTuningSpace* This,LONG *MaxChannelVal) {
    return This->lpVtbl->get_MaxChannel(This,MaxChannelVal);
}
static __WIDL_INLINE HRESULT IAnalogTVTuningSpace_put_MaxChannel(IAnalogTVTuningSpace* This,LONG NewMaxChannelVal) {
    return This->lpVtbl->put_MaxChannel(This,NewMaxChannelVal);
}
static __WIDL_INLINE HRESULT IAnalogTVTuningSpace_get_InputType(IAnalogTVTuningSpace* This,TunerInputType *InputTypeVal) {
    return This->lpVtbl->get_InputType(This,InputTypeVal);
}
static __WIDL_INLINE HRESULT IAnalogTVTuningSpace_put_InputType(IAnalogTVTuningSpace* This,TunerInputType NewInputTypeVal) {
    return This->lpVtbl->put_InputType(This,NewInputTypeVal);
}
static __WIDL_INLINE HRESULT IAnalogTVTuningSpace_get_CountryCode(IAnalogTVTuningSpace* This,LONG *CountryCodeVal) {
    return This->lpVtbl->get_CountryCode(This,CountryCodeVal);
}
static __WIDL_INLINE HRESULT IAnalogTVTuningSpace_put_CountryCode(IAnalogTVTuningSpace* This,LONG NewCountryCodeVal) {
    return This->lpVtbl->put_CountryCode(This,NewCountryCodeVal);
}
#endif
#endif

#endif


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

#endif


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

#endif


#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 __WIDL_INLINE HRESULT IAnalogRadioTuningSpace_QueryInterface(IAnalogRadioTuningSpace* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IAnalogRadioTuningSpace_AddRef(IAnalogRadioTuningSpace* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IAnalogRadioTuningSpace_Release(IAnalogRadioTuningSpace* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IAnalogRadioTuningSpace_GetTypeInfoCount(IAnalogRadioTuningSpace* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IAnalogRadioTuningSpace_GetTypeInfo(IAnalogRadioTuningSpace* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IAnalogRadioTuningSpace_get_UniqueName(IAnalogRadioTuningSpace* This,BSTR *Name) {
    return This->lpVtbl->get_UniqueName(This,Name);
}
static __WIDL_INLINE HRESULT IAnalogRadioTuningSpace_put_UniqueName(IAnalogRadioTuningSpace* This,BSTR Name) {
    return This->lpVtbl->put_UniqueName(This,Name);
}
static __WIDL_INLINE HRESULT IAnalogRadioTuningSpace_get_FriendlyName(IAnalogRadioTuningSpace* This,BSTR *Name) {
    return This->lpVtbl->get_FriendlyName(This,Name);
}
static __WIDL_INLINE HRESULT IAnalogRadioTuningSpace_put_FriendlyName(IAnalogRadioTuningSpace* This,BSTR Name) {
    return This->lpVtbl->put_FriendlyName(This,Name);
}
static __WIDL_INLINE HRESULT IAnalogRadioTuningSpace_get_CLSID(IAnalogRadioTuningSpace* This,BSTR *SpaceCLSID) {
    return This->lpVtbl->get_CLSID(This,SpaceCLSID);
}
static __WIDL_INLINE HRESULT IAnalogRadioTuningSpace_get_NetworkType(IAnalogRadioTuningSpace* This,BSTR *NetworkTypeGuid) {
    return This->lpVtbl->get_NetworkType(This,NetworkTypeGuid);
}
static __WIDL_INLINE HRESULT IAnalogRadioTuningSpace_put_NetworkType(IAnalogRadioTuningSpace* This,BSTR NetworkTypeGuid) {
    return This->lpVtbl->put_NetworkType(This,NetworkTypeGuid);
}
static __WIDL_INLINE HRESULT IAnalogRadioTuningSpace_get__NetworkType(IAnalogRadioTuningSpace* This,GUID *NetworkTypeGuid) {
    return This->lpVtbl->get__NetworkType(This,NetworkTypeGuid);
}
static __WIDL_INLINE HRESULT IAnalogRadioTuningSpace_put__NetworkType(IAnalogRadioTuningSpace* This,REFCLSID NetworkTypeGuid) {
    return This->lpVtbl->put__NetworkType(This,NetworkTypeGuid);
}
static __WIDL_INLINE HRESULT IAnalogRadioTuningSpace_CreateTuneRequest(IAnalogRadioTuningSpace* This,ITuneRequest **TuneRequest) {
    return This->lpVtbl->CreateTuneRequest(This,TuneRequest);
}
static __WIDL_INLINE HRESULT IAnalogRadioTuningSpace_EnumCategoryGUIDs(IAnalogRadioTuningSpace* This,IEnumGUID **ppEnum) {
    return This->lpVtbl->EnumCategoryGUIDs(This,ppEnum);
}
static __WIDL_INLINE HRESULT IAnalogRadioTuningSpace_EnumDeviceMonikers(IAnalogRadioTuningSpace* This,IEnumMoniker **ppEnum) {
    return This->lpVtbl->EnumDeviceMonikers(This,ppEnum);
}
static __WIDL_INLINE HRESULT IAnalogRadioTuningSpace_get_DefaultPreferredComponentTypes(IAnalogRadioTuningSpace* This,IComponentTypes **ComponentTypes) {
    return This->lpVtbl->get_DefaultPreferredComponentTypes(This,ComponentTypes);
}
static __WIDL_INLINE HRESULT IAnalogRadioTuningSpace_put_DefaultPreferredComponentTypes(IAnalogRadioTuningSpace* This,IComponentTypes *NewComponentTypes) {
    return This->lpVtbl->put_DefaultPreferredComponentTypes(This,NewComponentTypes);
}
static __WIDL_INLINE HRESULT IAnalogRadioTuningSpace_get_FrequencyMapping(IAnalogRadioTuningSpace* This,BSTR *pMapping) {
    return This->lpVtbl->get_FrequencyMapping(This,pMapping);
}
static __WIDL_INLINE HRESULT IAnalogRadioTuningSpace_put_FrequencyMapping(IAnalogRadioTuningSpace* This,BSTR Mapping) {
    return This->lpVtbl->put_FrequencyMapping(This,Mapping);
}
static __WIDL_INLINE HRESULT IAnalogRadioTuningSpace_get_DefaultLocator(IAnalogRadioTuningSpace* This,ILocator **LocatorVal) {
    return This->lpVtbl->get_DefaultLocator(This,LocatorVal);
}
static __WIDL_INLINE HRESULT IAnalogRadioTuningSpace_put_DefaultLocator(IAnalogRadioTuningSpace* This,ILocator *LocatorVal) {
    return This->lpVtbl->put_DefaultLocator(This,LocatorVal);
}
static __WIDL_INLINE HRESULT IAnalogRadioTuningSpace_Clone(IAnalogRadioTuningSpace* This,ITuningSpace **NewTS) {
    return This->lpVtbl->Clone(This,NewTS);
}
/*** IAnalogRadioTuningSpace methods ***/
static __WIDL_INLINE HRESULT IAnalogRadioTuningSpace_get_MinFrequency(IAnalogRadioTuningSpace* This,LONG *MinFrequencyVal) {
    return This->lpVtbl->get_MinFrequency(This,MinFrequencyVal);
}
static __WIDL_INLINE HRESULT IAnalogRadioTuningSpace_put_MinFrequency(IAnalogRadioTuningSpace* This,LONG NewMinFrequencyVal) {
    return This->lpVtbl->put_MinFrequency(This,NewMinFrequencyVal);
}
static __WIDL_INLINE HRESULT IAnalogRadioTuningSpace_get_MaxFrequency(IAnalogRadioTuningSpace* This,LONG *MaxFrequencyVal) {
    return This->lpVtbl->get_MaxFrequency(This,MaxFrequencyVal);
}
static __WIDL_INLINE HRESULT IAnalogRadioTuningSpace_put_MaxFrequency(IAnalogRadioTuningSpace* This,LONG NewMaxFrequencyVal) {
    return This->lpVtbl->put_MaxFrequency(This,NewMaxFrequencyVal);
}
static __WIDL_INLINE HRESULT IAnalogRadioTuningSpace_get_Step(IAnalogRadioTuningSpace* This,LONG *StepVal) {
    return This->lpVtbl->get_Step(This,StepVal);
}
static __WIDL_INLINE HRESULT IAnalogRadioTuningSpace_put_Step(IAnalogRadioTuningSpace* This,LONG NewStepVal) {
    return This->lpVtbl->put_Step(This,NewStepVal);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IAnalogRadioTuningSpace2_QueryInterface(IAnalogRadioTuningSpace2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IAnalogRadioTuningSpace2_AddRef(IAnalogRadioTuningSpace2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IAnalogRadioTuningSpace2_Release(IAnalogRadioTuningSpace2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IAnalogRadioTuningSpace2_GetTypeInfoCount(IAnalogRadioTuningSpace2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IAnalogRadioTuningSpace2_GetTypeInfo(IAnalogRadioTuningSpace2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IAnalogRadioTuningSpace2_get_UniqueName(IAnalogRadioTuningSpace2* This,BSTR *Name) {
    return This->lpVtbl->get_UniqueName(This,Name);
}
static __WIDL_INLINE HRESULT IAnalogRadioTuningSpace2_put_UniqueName(IAnalogRadioTuningSpace2* This,BSTR Name) {
    return This->lpVtbl->put_UniqueName(This,Name);
}
static __WIDL_INLINE HRESULT IAnalogRadioTuningSpace2_get_FriendlyName(IAnalogRadioTuningSpace2* This,BSTR *Name) {
    return This->lpVtbl->get_FriendlyName(This,Name);
}
static __WIDL_INLINE HRESULT IAnalogRadioTuningSpace2_put_FriendlyName(IAnalogRadioTuningSpace2* This,BSTR Name) {
    return This->lpVtbl->put_FriendlyName(This,Name);
}
static __WIDL_INLINE HRESULT IAnalogRadioTuningSpace2_get_CLSID(IAnalogRadioTuningSpace2* This,BSTR *SpaceCLSID) {
    return This->lpVtbl->get_CLSID(This,SpaceCLSID);
}
static __WIDL_INLINE HRESULT IAnalogRadioTuningSpace2_get_NetworkType(IAnalogRadioTuningSpace2* This,BSTR *NetworkTypeGuid) {
    return This->lpVtbl->get_NetworkType(This,NetworkTypeGuid);
}
static __WIDL_INLINE HRESULT IAnalogRadioTuningSpace2_put_NetworkType(IAnalogRadioTuningSpace2* This,BSTR NetworkTypeGuid) {
    return This->lpVtbl->put_NetworkType(This,NetworkTypeGuid);
}
static __WIDL_INLINE HRESULT IAnalogRadioTuningSpace2_get__NetworkType(IAnalogRadioTuningSpace2* This,GUID *NetworkTypeGuid) {
    return This->lpVtbl->get__NetworkType(This,NetworkTypeGuid);
}
static __WIDL_INLINE HRESULT IAnalogRadioTuningSpace2_put__NetworkType(IAnalogRadioTuningSpace2* This,REFCLSID NetworkTypeGuid) {
    return This->lpVtbl->put__NetworkType(This,NetworkTypeGuid);
}
static __WIDL_INLINE HRESULT IAnalogRadioTuningSpace2_CreateTuneRequest(IAnalogRadioTuningSpace2* This,ITuneRequest **TuneRequest) {
    return This->lpVtbl->CreateTuneRequest(This,TuneRequest);
}
static __WIDL_INLINE HRESULT IAnalogRadioTuningSpace2_EnumCategoryGUIDs(IAnalogRadioTuningSpace2* This,IEnumGUID **ppEnum) {
    return This->lpVtbl->EnumCategoryGUIDs(This,ppEnum);
}
static __WIDL_INLINE HRESULT IAnalogRadioTuningSpace2_EnumDeviceMonikers(IAnalogRadioTuningSpace2* This,IEnumMoniker **ppEnum) {
    return This->lpVtbl->EnumDeviceMonikers(This,ppEnum);
}
static __WIDL_INLINE HRESULT IAnalogRadioTuningSpace2_get_DefaultPreferredComponentTypes(IAnalogRadioTuningSpace2* This,IComponentTypes **ComponentTypes) {
    return This->lpVtbl->get_DefaultPreferredComponentTypes(This,ComponentTypes);
}
static __WIDL_INLINE HRESULT IAnalogRadioTuningSpace2_put_DefaultPreferredComponentTypes(IAnalogRadioTuningSpace2* This,IComponentTypes *NewComponentTypes) {
    return This->lpVtbl->put_DefaultPreferredComponentTypes(This,NewComponentTypes);
}
static __WIDL_INLINE HRESULT IAnalogRadioTuningSpace2_get_FrequencyMapping(IAnalogRadioTuningSpace2* This,BSTR *pMapping) {
    return This->lpVtbl->get_FrequencyMapping(This,pMapping);
}
static __WIDL_INLINE HRESULT IAnalogRadioTuningSpace2_put_FrequencyMapping(IAnalogRadioTuningSpace2* This,BSTR Mapping) {
    return This->lpVtbl->put_FrequencyMapping(This,Mapping);
}
static __WIDL_INLINE HRESULT IAnalogRadioTuningSpace2_get_DefaultLocator(IAnalogRadioTuningSpace2* This,ILocator **LocatorVal) {
    return This->lpVtbl->get_DefaultLocator(This,LocatorVal);
}
static __WIDL_INLINE HRESULT IAnalogRadioTuningSpace2_put_DefaultLocator(IAnalogRadioTuningSpace2* This,ILocator *LocatorVal) {
    return This->lpVtbl->put_DefaultLocator(This,LocatorVal);
}
static __WIDL_INLINE HRESULT IAnalogRadioTuningSpace2_Clone(IAnalogRadioTuningSpace2* This,ITuningSpace **NewTS) {
    return This->lpVtbl->Clone(This,NewTS);
}
/*** IAnalogRadioTuningSpace methods ***/
static __WIDL_INLINE HRESULT IAnalogRadioTuningSpace2_get_MinFrequency(IAnalogRadioTuningSpace2* This,LONG *MinFrequencyVal) {
    return This->lpVtbl->get_MinFrequency(This,MinFrequencyVal);
}
static __WIDL_INLINE HRESULT IAnalogRadioTuningSpace2_put_MinFrequency(IAnalogRadioTuningSpace2* This,LONG NewMinFrequencyVal) {
    return This->lpVtbl->put_MinFrequency(This,NewMinFrequencyVal);
}
static __WIDL_INLINE HRESULT IAnalogRadioTuningSpace2_get_MaxFrequency(IAnalogRadioTuningSpace2* This,LONG *MaxFrequencyVal) {
    return This->lpVtbl->get_MaxFrequency(This,MaxFrequencyVal);
}
static __WIDL_INLINE HRESULT IAnalogRadioTuningSpace2_put_MaxFrequency(IAnalogRadioTuningSpace2* This,LONG NewMaxFrequencyVal) {
    return This->lpVtbl->put_MaxFrequency(This,NewMaxFrequencyVal);
}
static __WIDL_INLINE HRESULT IAnalogRadioTuningSpace2_get_Step(IAnalogRadioTuningSpace2* This,LONG *StepVal) {
    return This->lpVtbl->get_Step(This,StepVal);
}
static __WIDL_INLINE HRESULT IAnalogRadioTuningSpace2_put_Step(IAnalogRadioTuningSpace2* This,LONG NewStepVal) {
    return This->lpVtbl->put_Step(This,NewStepVal);
}
/*** IAnalogRadioTuningSpace2 methods ***/
static __WIDL_INLINE HRESULT IAnalogRadioTuningSpace2_get_CountryCode(IAnalogRadioTuningSpace2* This,LONG *CountryCodeVal) {
    return This->lpVtbl->get_CountryCode(This,CountryCodeVal);
}
static __WIDL_INLINE HRESULT IAnalogRadioTuningSpace2_put_CountryCode(IAnalogRadioTuningSpace2* This,LONG NewCountryCodeVal) {
    return This->lpVtbl->put_CountryCode(This,NewCountryCodeVal);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT ITuneRequest_QueryInterface(ITuneRequest* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ITuneRequest_AddRef(ITuneRequest* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ITuneRequest_Release(ITuneRequest* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ITuneRequest_GetTypeInfoCount(ITuneRequest* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ITuneRequest_GetTypeInfo(ITuneRequest* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ITuneRequest_get_TuningSpace(ITuneRequest* This,ITuningSpace **TuningSpace) {
    return This->lpVtbl->get_TuningSpace(This,TuningSpace);
}
static __WIDL_INLINE HRESULT ITuneRequest_get_Components(ITuneRequest* This,IComponents **Components) {
    return This->lpVtbl->get_Components(This,Components);
}
static __WIDL_INLINE HRESULT ITuneRequest_Clone(ITuneRequest* This,ITuneRequest **NewTuneRequest) {
    return This->lpVtbl->Clone(This,NewTuneRequest);
}
static __WIDL_INLINE HRESULT ITuneRequest_get_Locator(ITuneRequest* This,ILocator **Locator) {
    return This->lpVtbl->get_Locator(This,Locator);
}
static __WIDL_INLINE HRESULT ITuneRequest_put_Locator(ITuneRequest* This,ILocator *Locator) {
    return This->lpVtbl->put_Locator(This,Locator);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IChannelIDTuneRequest_QueryInterface(IChannelIDTuneRequest* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IChannelIDTuneRequest_AddRef(IChannelIDTuneRequest* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IChannelIDTuneRequest_Release(IChannelIDTuneRequest* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IChannelIDTuneRequest_GetTypeInfoCount(IChannelIDTuneRequest* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IChannelIDTuneRequest_GetTypeInfo(IChannelIDTuneRequest* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IChannelIDTuneRequest_get_TuningSpace(IChannelIDTuneRequest* This,ITuningSpace **TuningSpace) {
    return This->lpVtbl->get_TuningSpace(This,TuningSpace);
}
static __WIDL_INLINE HRESULT IChannelIDTuneRequest_get_Components(IChannelIDTuneRequest* This,IComponents **Components) {
    return This->lpVtbl->get_Components(This,Components);
}
static __WIDL_INLINE HRESULT IChannelIDTuneRequest_Clone(IChannelIDTuneRequest* This,ITuneRequest **NewTuneRequest) {
    return This->lpVtbl->Clone(This,NewTuneRequest);
}
static __WIDL_INLINE HRESULT IChannelIDTuneRequest_get_Locator(IChannelIDTuneRequest* This,ILocator **Locator) {
    return This->lpVtbl->get_Locator(This,Locator);
}
static __WIDL_INLINE HRESULT IChannelIDTuneRequest_put_Locator(IChannelIDTuneRequest* This,ILocator *Locator) {
    return This->lpVtbl->put_Locator(This,Locator);
}
/*** IChannelIDTuneRequest methods ***/
static __WIDL_INLINE HRESULT IChannelIDTuneRequest_get_ChannelID(IChannelIDTuneRequest* This,BSTR *ChannelID) {
    return This->lpVtbl->get_ChannelID(This,ChannelID);
}
static __WIDL_INLINE HRESULT IChannelIDTuneRequest_put_ChannelID(IChannelIDTuneRequest* This,BSTR ChannelID) {
    return This->lpVtbl->put_ChannelID(This,ChannelID);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IChannelTuneRequest_QueryInterface(IChannelTuneRequest* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IChannelTuneRequest_AddRef(IChannelTuneRequest* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IChannelTuneRequest_Release(IChannelTuneRequest* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IChannelTuneRequest_GetTypeInfoCount(IChannelTuneRequest* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IChannelTuneRequest_GetTypeInfo(IChannelTuneRequest* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IChannelTuneRequest_get_TuningSpace(IChannelTuneRequest* This,ITuningSpace **TuningSpace) {
    return This->lpVtbl->get_TuningSpace(This,TuningSpace);
}
static __WIDL_INLINE HRESULT IChannelTuneRequest_get_Components(IChannelTuneRequest* This,IComponents **Components) {
    return This->lpVtbl->get_Components(This,Components);
}
static __WIDL_INLINE HRESULT IChannelTuneRequest_Clone(IChannelTuneRequest* This,ITuneRequest **NewTuneRequest) {
    return This->lpVtbl->Clone(This,NewTuneRequest);
}
static __WIDL_INLINE HRESULT IChannelTuneRequest_get_Locator(IChannelTuneRequest* This,ILocator **Locator) {
    return This->lpVtbl->get_Locator(This,Locator);
}
static __WIDL_INLINE HRESULT IChannelTuneRequest_put_Locator(IChannelTuneRequest* This,ILocator *Locator) {
    return This->lpVtbl->put_Locator(This,Locator);
}
/*** IChannelTuneRequest methods ***/
static __WIDL_INLINE HRESULT IChannelTuneRequest_get_Channel(IChannelTuneRequest* This,LONG *Channel) {
    return This->lpVtbl->get_Channel(This,Channel);
}
static __WIDL_INLINE HRESULT IChannelTuneRequest_put_Channel(IChannelTuneRequest* This,LONG Channel) {
    return This->lpVtbl->put_Channel(This,Channel);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IATSCChannelTuneRequest_QueryInterface(IATSCChannelTuneRequest* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IATSCChannelTuneRequest_AddRef(IATSCChannelTuneRequest* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IATSCChannelTuneRequest_Release(IATSCChannelTuneRequest* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IATSCChannelTuneRequest_GetTypeInfoCount(IATSCChannelTuneRequest* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IATSCChannelTuneRequest_GetTypeInfo(IATSCChannelTuneRequest* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IATSCChannelTuneRequest_get_TuningSpace(IATSCChannelTuneRequest* This,ITuningSpace **TuningSpace) {
    return This->lpVtbl->get_TuningSpace(This,TuningSpace);
}
static __WIDL_INLINE HRESULT IATSCChannelTuneRequest_get_Components(IATSCChannelTuneRequest* This,IComponents **Components) {
    return This->lpVtbl->get_Components(This,Components);
}
static __WIDL_INLINE HRESULT IATSCChannelTuneRequest_Clone(IATSCChannelTuneRequest* This,ITuneRequest **NewTuneRequest) {
    return This->lpVtbl->Clone(This,NewTuneRequest);
}
static __WIDL_INLINE HRESULT IATSCChannelTuneRequest_get_Locator(IATSCChannelTuneRequest* This,ILocator **Locator) {
    return This->lpVtbl->get_Locator(This,Locator);
}
static __WIDL_INLINE HRESULT IATSCChannelTuneRequest_put_Locator(IATSCChannelTuneRequest* This,ILocator *Locator) {
    return This->lpVtbl->put_Locator(This,Locator);
}
/*** IChannelTuneRequest methods ***/
static __WIDL_INLINE HRESULT IATSCChannelTuneRequest_get_Channel(IATSCChannelTuneRequest* This,LONG *Channel) {
    return This->lpVtbl->get_Channel(This,Channel);
}
static __WIDL_INLINE HRESULT IATSCChannelTuneRequest_put_Channel(IATSCChannelTuneRequest* This,LONG Channel) {
    return This->lpVtbl->put_Channel(This,Channel);
}
/*** IATSCChannelTuneRequest methods ***/
static __WIDL_INLINE HRESULT IATSCChannelTuneRequest_get_MinorChannel(IATSCChannelTuneRequest* This,LONG *MinorChannel) {
    return This->lpVtbl->get_MinorChannel(This,MinorChannel);
}
static __WIDL_INLINE HRESULT IATSCChannelTuneRequest_put_MinorChannel(IATSCChannelTuneRequest* This,LONG MinorChannel) {
    return This->lpVtbl->put_MinorChannel(This,MinorChannel);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IDigitalCableTuneRequest_QueryInterface(IDigitalCableTuneRequest* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDigitalCableTuneRequest_AddRef(IDigitalCableTuneRequest* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDigitalCableTuneRequest_Release(IDigitalCableTuneRequest* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IDigitalCableTuneRequest_GetTypeInfoCount(IDigitalCableTuneRequest* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IDigitalCableTuneRequest_GetTypeInfo(IDigitalCableTuneRequest* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDigitalCableTuneRequest_get_TuningSpace(IDigitalCableTuneRequest* This,ITuningSpace **TuningSpace) {
    return This->lpVtbl->get_TuningSpace(This,TuningSpace);
}
static __WIDL_INLINE HRESULT IDigitalCableTuneRequest_get_Components(IDigitalCableTuneRequest* This,IComponents **Components) {
    return This->lpVtbl->get_Components(This,Components);
}
static __WIDL_INLINE HRESULT IDigitalCableTuneRequest_Clone(IDigitalCableTuneRequest* This,ITuneRequest **NewTuneRequest) {
    return This->lpVtbl->Clone(This,NewTuneRequest);
}
static __WIDL_INLINE HRESULT IDigitalCableTuneRequest_get_Locator(IDigitalCableTuneRequest* This,ILocator **Locator) {
    return This->lpVtbl->get_Locator(This,Locator);
}
static __WIDL_INLINE HRESULT IDigitalCableTuneRequest_put_Locator(IDigitalCableTuneRequest* This,ILocator *Locator) {
    return This->lpVtbl->put_Locator(This,Locator);
}
/*** IChannelTuneRequest methods ***/
static __WIDL_INLINE HRESULT IDigitalCableTuneRequest_get_Channel(IDigitalCableTuneRequest* This,LONG *Channel) {
    return This->lpVtbl->get_Channel(This,Channel);
}
static __WIDL_INLINE HRESULT IDigitalCableTuneRequest_put_Channel(IDigitalCableTuneRequest* This,LONG Channel) {
    return This->lpVtbl->put_Channel(This,Channel);
}
/*** IATSCChannelTuneRequest methods ***/
static __WIDL_INLINE HRESULT IDigitalCableTuneRequest_get_MinorChannel(IDigitalCableTuneRequest* This,LONG *MinorChannel) {
    return This->lpVtbl->get_MinorChannel(This,MinorChannel);
}
static __WIDL_INLINE HRESULT IDigitalCableTuneRequest_put_MinorChannel(IDigitalCableTuneRequest* This,LONG MinorChannel) {
    return This->lpVtbl->put_MinorChannel(This,MinorChannel);
}
/*** IDigitalCableTuneRequest methods ***/
static __WIDL_INLINE HRESULT IDigitalCableTuneRequest_get_MajorChannel(IDigitalCableTuneRequest* This,LONG *pMajorChannel) {
    return This->lpVtbl->get_MajorChannel(This,pMajorChannel);
}
static __WIDL_INLINE HRESULT IDigitalCableTuneRequest_put_MajorChannel(IDigitalCableTuneRequest* This,LONG MajorChannel) {
    return This->lpVtbl->put_MajorChannel(This,MajorChannel);
}
static __WIDL_INLINE HRESULT IDigitalCableTuneRequest_get_SourceID(IDigitalCableTuneRequest* This,LONG *pSourceID) {
    return This->lpVtbl->get_SourceID(This,pSourceID);
}
static __WIDL_INLINE HRESULT IDigitalCableTuneRequest_put_SourceID(IDigitalCableTuneRequest* This,LONG SourceID) {
    return This->lpVtbl->put_SourceID(This,SourceID);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IDVBTuneRequest_QueryInterface(IDVBTuneRequest* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDVBTuneRequest_AddRef(IDVBTuneRequest* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDVBTuneRequest_Release(IDVBTuneRequest* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IDVBTuneRequest_GetTypeInfoCount(IDVBTuneRequest* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IDVBTuneRequest_GetTypeInfo(IDVBTuneRequest* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDVBTuneRequest_get_TuningSpace(IDVBTuneRequest* This,ITuningSpace **TuningSpace) {
    return This->lpVtbl->get_TuningSpace(This,TuningSpace);
}
static __WIDL_INLINE HRESULT IDVBTuneRequest_get_Components(IDVBTuneRequest* This,IComponents **Components) {
    return This->lpVtbl->get_Components(This,Components);
}
static __WIDL_INLINE HRESULT IDVBTuneRequest_Clone(IDVBTuneRequest* This,ITuneRequest **NewTuneRequest) {
    return This->lpVtbl->Clone(This,NewTuneRequest);
}
static __WIDL_INLINE HRESULT IDVBTuneRequest_get_Locator(IDVBTuneRequest* This,ILocator **Locator) {
    return This->lpVtbl->get_Locator(This,Locator);
}
static __WIDL_INLINE HRESULT IDVBTuneRequest_put_Locator(IDVBTuneRequest* This,ILocator *Locator) {
    return This->lpVtbl->put_Locator(This,Locator);
}
/*** IDVBTuneRequest methods ***/
static __WIDL_INLINE HRESULT IDVBTuneRequest_get_ONID(IDVBTuneRequest* This,LONG *ONID) {
    return This->lpVtbl->get_ONID(This,ONID);
}
static __WIDL_INLINE HRESULT IDVBTuneRequest_put_ONID(IDVBTuneRequest* This,LONG ONID) {
    return This->lpVtbl->put_ONID(This,ONID);
}
static __WIDL_INLINE HRESULT IDVBTuneRequest_get_TSID(IDVBTuneRequest* This,LONG *TSID) {
    return This->lpVtbl->get_TSID(This,TSID);
}
static __WIDL_INLINE HRESULT IDVBTuneRequest_put_TSID(IDVBTuneRequest* This,LONG TSID) {
    return This->lpVtbl->put_TSID(This,TSID);
}
static __WIDL_INLINE HRESULT IDVBTuneRequest_get_SID(IDVBTuneRequest* This,LONG *SID) {
    return This->lpVtbl->get_SID(This,SID);
}
static __WIDL_INLINE HRESULT IDVBTuneRequest_put_SID(IDVBTuneRequest* This,LONG SID) {
    return This->lpVtbl->put_SID(This,SID);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IMPEG2TuneRequest_QueryInterface(IMPEG2TuneRequest* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IMPEG2TuneRequest_AddRef(IMPEG2TuneRequest* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IMPEG2TuneRequest_Release(IMPEG2TuneRequest* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IMPEG2TuneRequest_GetTypeInfoCount(IMPEG2TuneRequest* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IMPEG2TuneRequest_GetTypeInfo(IMPEG2TuneRequest* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IMPEG2TuneRequest_get_TuningSpace(IMPEG2TuneRequest* This,ITuningSpace **TuningSpace) {
    return This->lpVtbl->get_TuningSpace(This,TuningSpace);
}
static __WIDL_INLINE HRESULT IMPEG2TuneRequest_get_Components(IMPEG2TuneRequest* This,IComponents **Components) {
    return This->lpVtbl->get_Components(This,Components);
}
static __WIDL_INLINE HRESULT IMPEG2TuneRequest_Clone(IMPEG2TuneRequest* This,ITuneRequest **NewTuneRequest) {
    return This->lpVtbl->Clone(This,NewTuneRequest);
}
static __WIDL_INLINE HRESULT IMPEG2TuneRequest_get_Locator(IMPEG2TuneRequest* This,ILocator **Locator) {
    return This->lpVtbl->get_Locator(This,Locator);
}
static __WIDL_INLINE HRESULT IMPEG2TuneRequest_put_Locator(IMPEG2TuneRequest* This,ILocator *Locator) {
    return This->lpVtbl->put_Locator(This,Locator);
}
/*** IMPEG2TuneRequest methods ***/
static __WIDL_INLINE HRESULT IMPEG2TuneRequest_get_TSID(IMPEG2TuneRequest* This,LONG *TSID) {
    return This->lpVtbl->get_TSID(This,TSID);
}
static __WIDL_INLINE HRESULT IMPEG2TuneRequest_put_TSID(IMPEG2TuneRequest* This,LONG TSID) {
    return This->lpVtbl->put_TSID(This,TSID);
}
static __WIDL_INLINE HRESULT IMPEG2TuneRequest_get_ProgNo(IMPEG2TuneRequest* This,LONG *ProgNo) {
    return This->lpVtbl->get_ProgNo(This,ProgNo);
}
static __WIDL_INLINE HRESULT IMPEG2TuneRequest_put_ProgNo(IMPEG2TuneRequest* This,LONG ProgNo) {
    return This->lpVtbl->put_ProgNo(This,ProgNo);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IMPEG2TuneRequestFactory_QueryInterface(IMPEG2TuneRequestFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IMPEG2TuneRequestFactory_AddRef(IMPEG2TuneRequestFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IMPEG2TuneRequestFactory_Release(IMPEG2TuneRequestFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IMPEG2TuneRequestFactory_GetTypeInfoCount(IMPEG2TuneRequestFactory* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IMPEG2TuneRequestFactory_GetTypeInfo(IMPEG2TuneRequestFactory* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IMPEG2TuneRequestFactory_CreateTuneRequest(IMPEG2TuneRequestFactory* This,ITuningSpace *TuningSpace,IMPEG2TuneRequest **TuneRequest) {
    return This->lpVtbl->CreateTuneRequest(This,TuningSpace,TuneRequest);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IMPEG2TuneRequestSupport_QueryInterface(IMPEG2TuneRequestSupport* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IMPEG2TuneRequestSupport_AddRef(IMPEG2TuneRequestSupport* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ITunerCap_QueryInterface(ITunerCap* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ITunerCap_AddRef(ITunerCap* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ITunerCap_Release(ITunerCap* This) {
    return This->lpVtbl->Release(This);
}
/*** ITunerCap methods ***/
static __WIDL_INLINE HRESULT ITunerCap_get_SupportedNetworkTypes(ITunerCap* This,ULONG ulcNetworkTypesMax,ULONG *pulcNetworkTypes,GUID *pguidNetworkTypes) {
    return This->lpVtbl->get_SupportedNetworkTypes(This,ulcNetworkTypesMax,pulcNetworkTypes,pguidNetworkTypes);
}
static __WIDL_INLINE HRESULT ITunerCap_get_SupportedVideoFormats(ITunerCap* This,ULONG *pulAMTunerModeType,ULONG *pulAnalogVideoStandard) {
    return This->lpVtbl->get_SupportedVideoFormats(This,pulAMTunerModeType,pulAnalogVideoStandard);
}
static __WIDL_INLINE HRESULT ITunerCap_get_AuxInputCount(ITunerCap* This,ULONG *pulCompositeCount,ULONG *pulSvideoCount) {
    return This->lpVtbl->get_AuxInputCount(This,pulCompositeCount,pulSvideoCount);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT ITunerCapEx_QueryInterface(ITunerCapEx* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ITunerCapEx_AddRef(ITunerCapEx* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ITunerCapEx_Release(ITunerCapEx* This) {
    return This->lpVtbl->Release(This);
}
/*** ITunerCapEx methods ***/
static __WIDL_INLINE HRESULT ITunerCapEx_get_Has608_708Caption(ITunerCapEx* This,VARIANT_BOOL *pbHasCaption) {
    return This->lpVtbl->get_Has608_708Caption(This,pbHasCaption);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT ITuner_QueryInterface(ITuner* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ITuner_AddRef(ITuner* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ITuner_Release(ITuner* This) {
    return This->lpVtbl->Release(This);
}
/*** ITuner methods ***/
static __WIDL_INLINE HRESULT ITuner_get_TuningSpace(ITuner* This,ITuningSpace **TuningSpace) {
    return This->lpVtbl->get_TuningSpace(This,TuningSpace);
}
static __WIDL_INLINE HRESULT ITuner_put_TuningSpace(ITuner* This,ITuningSpace *TuningSpace) {
    return This->lpVtbl->put_TuningSpace(This,TuningSpace);
}
static __WIDL_INLINE HRESULT ITuner_EnumTuningSpaces(ITuner* This,IEnumTuningSpaces **ppEnum) {
    return This->lpVtbl->EnumTuningSpaces(This,ppEnum);
}
static __WIDL_INLINE HRESULT ITuner_get_TuneRequest(ITuner* This,ITuneRequest **TuneRequest) {
    return This->lpVtbl->get_TuneRequest(This,TuneRequest);
}
static __WIDL_INLINE HRESULT ITuner_put_TuneRequest(ITuner* This,ITuneRequest *TuneRequest) {
    return This->lpVtbl->put_TuneRequest(This,TuneRequest);
}
static __WIDL_INLINE HRESULT ITuner_Validate(ITuner* This,ITuneRequest *TuneRequest) {
    return This->lpVtbl->Validate(This,TuneRequest);
}
static __WIDL_INLINE HRESULT ITuner_get_PreferredComponentTypes(ITuner* This,IComponentTypes **ComponentTypes) {
    return This->lpVtbl->get_PreferredComponentTypes(This,ComponentTypes);
}
static __WIDL_INLINE HRESULT ITuner_put_PreferredComponentTypes(ITuner* This,IComponentTypes *ComponentTypes) {
    return This->lpVtbl->put_PreferredComponentTypes(This,ComponentTypes);
}
static __WIDL_INLINE HRESULT ITuner_get_SignalStrength(ITuner* This,LONG *Strength) {
    return This->lpVtbl->get_SignalStrength(This,Strength);
}
static __WIDL_INLINE HRESULT ITuner_TriggerSignalEvents(ITuner* This,LONG Interval) {
    return This->lpVtbl->TriggerSignalEvents(This,Interval);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IScanningTuner_QueryInterface(IScanningTuner* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IScanningTuner_AddRef(IScanningTuner* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IScanningTuner_Release(IScanningTuner* This) {
    return This->lpVtbl->Release(This);
}
/*** ITuner methods ***/
static __WIDL_INLINE HRESULT IScanningTuner_get_TuningSpace(IScanningTuner* This,ITuningSpace **TuningSpace) {
    return This->lpVtbl->get_TuningSpace(This,TuningSpace);
}
static __WIDL_INLINE HRESULT IScanningTuner_put_TuningSpace(IScanningTuner* This,ITuningSpace *TuningSpace) {
    return This->lpVtbl->put_TuningSpace(This,TuningSpace);
}
static __WIDL_INLINE HRESULT IScanningTuner_EnumTuningSpaces(IScanningTuner* This,IEnumTuningSpaces **ppEnum) {
    return This->lpVtbl->EnumTuningSpaces(This,ppEnum);
}
static __WIDL_INLINE HRESULT IScanningTuner_get_TuneRequest(IScanningTuner* This,ITuneRequest **TuneRequest) {
    return This->lpVtbl->get_TuneRequest(This,TuneRequest);
}
static __WIDL_INLINE HRESULT IScanningTuner_put_TuneRequest(IScanningTuner* This,ITuneRequest *TuneRequest) {
    return This->lpVtbl->put_TuneRequest(This,TuneRequest);
}
static __WIDL_INLINE HRESULT IScanningTuner_Validate(IScanningTuner* This,ITuneRequest *TuneRequest) {
    return This->lpVtbl->Validate(This,TuneRequest);
}
static __WIDL_INLINE HRESULT IScanningTuner_get_PreferredComponentTypes(IScanningTuner* This,IComponentTypes **ComponentTypes) {
    return This->lpVtbl->get_PreferredComponentTypes(This,ComponentTypes);
}
static __WIDL_INLINE HRESULT IScanningTuner_put_PreferredComponentTypes(IScanningTuner* This,IComponentTypes *ComponentTypes) {
    return This->lpVtbl->put_PreferredComponentTypes(This,ComponentTypes);
}
static __WIDL_INLINE HRESULT IScanningTuner_get_SignalStrength(IScanningTuner* This,LONG *Strength) {
    return This->lpVtbl->get_SignalStrength(This,Strength);
}
static __WIDL_INLINE HRESULT IScanningTuner_TriggerSignalEvents(IScanningTuner* This,LONG Interval) {
    return This->lpVtbl->TriggerSignalEvents(This,Interval);
}
/*** IScanningTuner methods ***/
static __WIDL_INLINE HRESULT IScanningTuner_SeekUp(IScanningTuner* This) {
    return This->lpVtbl->SeekUp(This);
}
static __WIDL_INLINE HRESULT IScanningTuner_SeekDown(IScanningTuner* This) {
    return This->lpVtbl->SeekDown(This);
}
static __WIDL_INLINE HRESULT IScanningTuner_ScanUp(IScanningTuner* This,LONG MillisecondsPause) {
    return This->lpVtbl->ScanUp(This,MillisecondsPause);
}
static __WIDL_INLINE HRESULT IScanningTuner_ScanDown(IScanningTuner* This,LONG MillisecondsPause) {
    return This->lpVtbl->ScanDown(This,MillisecondsPause);
}
static __WIDL_INLINE HRESULT IScanningTuner_AutoProgram(IScanningTuner* This) {
    return This->lpVtbl->AutoProgram(This);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IScanningTunerEx_QueryInterface(IScanningTunerEx* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IScanningTunerEx_AddRef(IScanningTunerEx* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IScanningTunerEx_Release(IScanningTunerEx* This) {
    return This->lpVtbl->Release(This);
}
/*** ITuner methods ***/
static __WIDL_INLINE HRESULT IScanningTunerEx_get_TuningSpace(IScanningTunerEx* This,ITuningSpace **TuningSpace) {
    return This->lpVtbl->get_TuningSpace(This,TuningSpace);
}
static __WIDL_INLINE HRESULT IScanningTunerEx_put_TuningSpace(IScanningTunerEx* This,ITuningSpace *TuningSpace) {
    return This->lpVtbl->put_TuningSpace(This,TuningSpace);
}
static __WIDL_INLINE HRESULT IScanningTunerEx_EnumTuningSpaces(IScanningTunerEx* This,IEnumTuningSpaces **ppEnum) {
    return This->lpVtbl->EnumTuningSpaces(This,ppEnum);
}
static __WIDL_INLINE HRESULT IScanningTunerEx_get_TuneRequest(IScanningTunerEx* This,ITuneRequest **TuneRequest) {
    return This->lpVtbl->get_TuneRequest(This,TuneRequest);
}
static __WIDL_INLINE HRESULT IScanningTunerEx_put_TuneRequest(IScanningTunerEx* This,ITuneRequest *TuneRequest) {
    return This->lpVtbl->put_TuneRequest(This,TuneRequest);
}
static __WIDL_INLINE HRESULT IScanningTunerEx_Validate(IScanningTunerEx* This,ITuneRequest *TuneRequest) {
    return This->lpVtbl->Validate(This,TuneRequest);
}
static __WIDL_INLINE HRESULT IScanningTunerEx_get_PreferredComponentTypes(IScanningTunerEx* This,IComponentTypes **ComponentTypes) {
    return This->lpVtbl->get_PreferredComponentTypes(This,ComponentTypes);
}
static __WIDL_INLINE HRESULT IScanningTunerEx_put_PreferredComponentTypes(IScanningTunerEx* This,IComponentTypes *ComponentTypes) {
    return This->lpVtbl->put_PreferredComponentTypes(This,ComponentTypes);
}
static __WIDL_INLINE HRESULT IScanningTunerEx_get_SignalStrength(IScanningTunerEx* This,LONG *Strength) {
    return This->lpVtbl->get_SignalStrength(This,Strength);
}
static __WIDL_INLINE HRESULT IScanningTunerEx_TriggerSignalEvents(IScanningTunerEx* This,LONG Interval) {
    return This->lpVtbl->TriggerSignalEvents(This,Interval);
}
/*** IScanningTuner methods ***/
static __WIDL_INLINE HRESULT IScanningTunerEx_SeekUp(IScanningTunerEx* This) {
    return This->lpVtbl->SeekUp(This);
}
static __WIDL_INLINE HRESULT IScanningTunerEx_SeekDown(IScanningTunerEx* This) {
    return This->lpVtbl->SeekDown(This);
}
static __WIDL_INLINE HRESULT IScanningTunerEx_ScanUp(IScanningTunerEx* This,LONG MillisecondsPause) {
    return This->lpVtbl->ScanUp(This,MillisecondsPause);
}
static __WIDL_INLINE HRESULT IScanningTunerEx_ScanDown(IScanningTunerEx* This,LONG MillisecondsPause) {
    return This->lpVtbl->ScanDown(This,MillisecondsPause);
}
static __WIDL_INLINE HRESULT IScanningTunerEx_AutoProgram(IScanningTunerEx* This) {
    return This->lpVtbl->AutoProgram(This);
}
/*** IScanningTunerEx methods ***/
static __WIDL_INLINE HRESULT IScanningTunerEx_GetCurrentLocator(IScanningTunerEx* This,ILocator **pILocator) {
    return This->lpVtbl->GetCurrentLocator(This,pILocator);
}
static __WIDL_INLINE HRESULT IScanningTunerEx_PerformExhaustiveScan(IScanningTunerEx* This,LONG dwLowerFreq,LONG dwHigherFreq,VARIANT_BOOL bFineTune,HEVENT hEvent) {
    return This->lpVtbl->PerformExhaustiveScan(This,dwLowerFreq,dwHigherFreq,bFineTune,hEvent);
}
static __WIDL_INLINE HRESULT IScanningTunerEx_TerminateCurrentScan(IScanningTunerEx* This,LONG *pcurrentFreq) {
    return This->lpVtbl->TerminateCurrentScan(This,pcurrentFreq);
}
static __WIDL_INLINE HRESULT IScanningTunerEx_ResumeCurrentScan(IScanningTunerEx* This,HEVENT hEvent) {
    return This->lpVtbl->ResumeCurrentScan(This,hEvent);
}
static __WIDL_INLINE HRESULT IScanningTunerEx_GetTunerScanningCapability(IScanningTunerEx* This,LONG *HardwareAssistedScanning,LONG *NumStandardsSupported,GUID *BroadcastStandards) {
    return This->lpVtbl->GetTunerScanningCapability(This,HardwareAssistedScanning,NumStandardsSupported,BroadcastStandards);
}
static __WIDL_INLINE HRESULT IScanningTunerEx_GetTunerStatus(IScanningTunerEx* This,LONG *SecondsLeft,LONG *CurrentLockType,LONG *AutoDetect,LONG *CurrentFreq) {
    return This->lpVtbl->GetTunerStatus(This,SecondsLeft,CurrentLockType,AutoDetect,CurrentFreq);
}
static __WIDL_INLINE HRESULT IScanningTunerEx_GetCurrentTunerStandardCapability(IScanningTunerEx* This,GUID CurrentBroadcastStandard,LONG *SettlingTime,LONG *TvStandardsSupported) {
    return This->lpVtbl->GetCurrentTunerStandardCapability(This,CurrentBroadcastStandard,SettlingTime,TvStandardsSupported);
}
static __WIDL_INLINE HRESULT IScanningTunerEx_SetScanSignalTypeFilter(IScanningTunerEx* This,LONG ScanModulationTypes,LONG AnalogVideoStandard) {
    return This->lpVtbl->SetScanSignalTypeFilter(This,ScanModulationTypes,AnalogVideoStandard);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IComponentType_QueryInterface(IComponentType* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IComponentType_AddRef(IComponentType* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IComponentType_Release(IComponentType* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IComponentType_GetTypeInfoCount(IComponentType* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IComponentType_GetTypeInfo(IComponentType* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IComponentType_get_Category(IComponentType* This,ComponentCategory *Category) {
    return This->lpVtbl->get_Category(This,Category);
}
static __WIDL_INLINE HRESULT IComponentType_put_Category(IComponentType* This,ComponentCategory Category) {
    return This->lpVtbl->put_Category(This,Category);
}
static __WIDL_INLINE HRESULT IComponentType_get_MediaMajorType(IComponentType* This,BSTR *MediaMajorType) {
    return This->lpVtbl->get_MediaMajorType(This,MediaMajorType);
}
static __WIDL_INLINE HRESULT IComponentType_put_MediaMajorType(IComponentType* This,BSTR MediaMajorType) {
    return This->lpVtbl->put_MediaMajorType(This,MediaMajorType);
}
static __WIDL_INLINE HRESULT IComponentType_get__MediaMajorType(IComponentType* This,GUID *MediaMajorTypeGuid) {
    return This->lpVtbl->get__MediaMajorType(This,MediaMajorTypeGuid);
}
static __WIDL_INLINE HRESULT IComponentType_put__MediaMajorType(IComponentType* This,REFCLSID MediaMajorTypeGuid) {
    return This->lpVtbl->put__MediaMajorType(This,MediaMajorTypeGuid);
}
static __WIDL_INLINE HRESULT IComponentType_get_MediaSubType(IComponentType* This,BSTR *MediaSubType) {
    return This->lpVtbl->get_MediaSubType(This,MediaSubType);
}
static __WIDL_INLINE HRESULT IComponentType_put_MediaSubType(IComponentType* This,BSTR MediaSubType) {
    return This->lpVtbl->put_MediaSubType(This,MediaSubType);
}
static __WIDL_INLINE HRESULT IComponentType_get__MediaSubType(IComponentType* This,GUID *MediaSubTypeGuid) {
    return This->lpVtbl->get__MediaSubType(This,MediaSubTypeGuid);
}
static __WIDL_INLINE HRESULT IComponentType_put__MediaSubType(IComponentType* This,REFCLSID MediaSubTypeGuid) {
    return This->lpVtbl->put__MediaSubType(This,MediaSubTypeGuid);
}
static __WIDL_INLINE HRESULT IComponentType_get_MediaFormatType(IComponentType* This,BSTR *MediaFormatType) {
    return This->lpVtbl->get_MediaFormatType(This,MediaFormatType);
}
static __WIDL_INLINE HRESULT IComponentType_put_MediaFormatType(IComponentType* This,BSTR MediaFormatType) {
    return This->lpVtbl->put_MediaFormatType(This,MediaFormatType);
}
static __WIDL_INLINE HRESULT IComponentType_get__MediaFormatType(IComponentType* This,GUID *MediaFormatTypeGuid) {
    return This->lpVtbl->get__MediaFormatType(This,MediaFormatTypeGuid);
}
static __WIDL_INLINE HRESULT IComponentType_put__MediaFormatType(IComponentType* This,REFCLSID MediaFormatTypeGuid) {
    return This->lpVtbl->put__MediaFormatType(This,MediaFormatTypeGuid);
}
static __WIDL_INLINE HRESULT IComponentType_get_MediaType(IComponentType* This,AM_MEDIA_TYPE *MediaType) {
    return This->lpVtbl->get_MediaType(This,MediaType);
}
static __WIDL_INLINE HRESULT IComponentType_put_MediaType(IComponentType* This,AM_MEDIA_TYPE *MediaType) {
    return This->lpVtbl->put_MediaType(This,MediaType);
}
static __WIDL_INLINE HRESULT IComponentType_Clone(IComponentType* This,IComponentType **NewCT) {
    return This->lpVtbl->Clone(This,NewCT);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT ILanguageComponentType_QueryInterface(ILanguageComponentType* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ILanguageComponentType_AddRef(ILanguageComponentType* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ILanguageComponentType_Release(ILanguageComponentType* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ILanguageComponentType_GetTypeInfoCount(ILanguageComponentType* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ILanguageComponentType_GetTypeInfo(ILanguageComponentType* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ILanguageComponentType_get_Category(ILanguageComponentType* This,ComponentCategory *Category) {
    return This->lpVtbl->get_Category(This,Category);
}
static __WIDL_INLINE HRESULT ILanguageComponentType_put_Category(ILanguageComponentType* This,ComponentCategory Category) {
    return This->lpVtbl->put_Category(This,Category);
}
static __WIDL_INLINE HRESULT ILanguageComponentType_get_MediaMajorType(ILanguageComponentType* This,BSTR *MediaMajorType) {
    return This->lpVtbl->get_MediaMajorType(This,MediaMajorType);
}
static __WIDL_INLINE HRESULT ILanguageComponentType_put_MediaMajorType(ILanguageComponentType* This,BSTR MediaMajorType) {
    return This->lpVtbl->put_MediaMajorType(This,MediaMajorType);
}
static __WIDL_INLINE HRESULT ILanguageComponentType_get__MediaMajorType(ILanguageComponentType* This,GUID *MediaMajorTypeGuid) {
    return This->lpVtbl->get__MediaMajorType(This,MediaMajorTypeGuid);
}
static __WIDL_INLINE HRESULT ILanguageComponentType_put__MediaMajorType(ILanguageComponentType* This,REFCLSID MediaMajorTypeGuid) {
    return This->lpVtbl->put__MediaMajorType(This,MediaMajorTypeGuid);
}
static __WIDL_INLINE HRESULT ILanguageComponentType_get_MediaSubType(ILanguageComponentType* This,BSTR *MediaSubType) {
    return This->lpVtbl->get_MediaSubType(This,MediaSubType);
}
static __WIDL_INLINE HRESULT ILanguageComponentType_put_MediaSubType(ILanguageComponentType* This,BSTR MediaSubType) {
    return This->lpVtbl->put_MediaSubType(This,MediaSubType);
}
static __WIDL_INLINE HRESULT ILanguageComponentType_get__MediaSubType(ILanguageComponentType* This,GUID *MediaSubTypeGuid) {
    return This->lpVtbl->get__MediaSubType(This,MediaSubTypeGuid);
}
static __WIDL_INLINE HRESULT ILanguageComponentType_put__MediaSubType(ILanguageComponentType* This,REFCLSID MediaSubTypeGuid) {
    return This->lpVtbl->put__MediaSubType(This,MediaSubTypeGuid);
}
static __WIDL_INLINE HRESULT ILanguageComponentType_get_MediaFormatType(ILanguageComponentType* This,BSTR *MediaFormatType) {
    return This->lpVtbl->get_MediaFormatType(This,MediaFormatType);
}
static __WIDL_INLINE HRESULT ILanguageComponentType_put_MediaFormatType(ILanguageComponentType* This,BSTR MediaFormatType) {
    return This->lpVtbl->put_MediaFormatType(This,MediaFormatType);
}
static __WIDL_INLINE HRESULT ILanguageComponentType_get__MediaFormatType(ILanguageComponentType* This,GUID *MediaFormatTypeGuid) {
    return This->lpVtbl->get__MediaFormatType(This,MediaFormatTypeGuid);
}
static __WIDL_INLINE HRESULT ILanguageComponentType_put__MediaFormatType(ILanguageComponentType* This,REFCLSID MediaFormatTypeGuid) {
    return This->lpVtbl->put__MediaFormatType(This,MediaFormatTypeGuid);
}
static __WIDL_INLINE HRESULT ILanguageComponentType_get_MediaType(ILanguageComponentType* This,AM_MEDIA_TYPE *MediaType) {
    return This->lpVtbl->get_MediaType(This,MediaType);
}
static __WIDL_INLINE HRESULT ILanguageComponentType_put_MediaType(ILanguageComponentType* This,AM_MEDIA_TYPE *MediaType) {
    return This->lpVtbl->put_MediaType(This,MediaType);
}
static __WIDL_INLINE HRESULT ILanguageComponentType_Clone(ILanguageComponentType* This,IComponentType **NewCT) {
    return This->lpVtbl->Clone(This,NewCT);
}
/*** ILanguageComponentType methods ***/
static __WIDL_INLINE HRESULT ILanguageComponentType_get_LangID(ILanguageComponentType* This,LONG *LangID) {
    return This->lpVtbl->get_LangID(This,LangID);
}
static __WIDL_INLINE HRESULT ILanguageComponentType_put_LangID(ILanguageComponentType* This,LONG LangID) {
    return This->lpVtbl->put_LangID(This,LangID);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IMPEG2ComponentType_QueryInterface(IMPEG2ComponentType* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IMPEG2ComponentType_AddRef(IMPEG2ComponentType* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IMPEG2ComponentType_Release(IMPEG2ComponentType* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IMPEG2ComponentType_GetTypeInfoCount(IMPEG2ComponentType* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IMPEG2ComponentType_GetTypeInfo(IMPEG2ComponentType* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IMPEG2ComponentType_get_Category(IMPEG2ComponentType* This,ComponentCategory *Category) {
    return This->lpVtbl->get_Category(This,Category);
}
static __WIDL_INLINE HRESULT IMPEG2ComponentType_put_Category(IMPEG2ComponentType* This,ComponentCategory Category) {
    return This->lpVtbl->put_Category(This,Category);
}
static __WIDL_INLINE HRESULT IMPEG2ComponentType_get_MediaMajorType(IMPEG2ComponentType* This,BSTR *MediaMajorType) {
    return This->lpVtbl->get_MediaMajorType(This,MediaMajorType);
}
static __WIDL_INLINE HRESULT IMPEG2ComponentType_put_MediaMajorType(IMPEG2ComponentType* This,BSTR MediaMajorType) {
    return This->lpVtbl->put_MediaMajorType(This,MediaMajorType);
}
static __WIDL_INLINE HRESULT IMPEG2ComponentType_get__MediaMajorType(IMPEG2ComponentType* This,GUID *MediaMajorTypeGuid) {
    return This->lpVtbl->get__MediaMajorType(This,MediaMajorTypeGuid);
}
static __WIDL_INLINE HRESULT IMPEG2ComponentType_put__MediaMajorType(IMPEG2ComponentType* This,REFCLSID MediaMajorTypeGuid) {
    return This->lpVtbl->put__MediaMajorType(This,MediaMajorTypeGuid);
}
static __WIDL_INLINE HRESULT IMPEG2ComponentType_get_MediaSubType(IMPEG2ComponentType* This,BSTR *MediaSubType) {
    return This->lpVtbl->get_MediaSubType(This,MediaSubType);
}
static __WIDL_INLINE HRESULT IMPEG2ComponentType_put_MediaSubType(IMPEG2ComponentType* This,BSTR MediaSubType) {
    return This->lpVtbl->put_MediaSubType(This,MediaSubType);
}
static __WIDL_INLINE HRESULT IMPEG2ComponentType_get__MediaSubType(IMPEG2ComponentType* This,GUID *MediaSubTypeGuid) {
    return This->lpVtbl->get__MediaSubType(This,MediaSubTypeGuid);
}
static __WIDL_INLINE HRESULT IMPEG2ComponentType_put__MediaSubType(IMPEG2ComponentType* This,REFCLSID MediaSubTypeGuid) {
    return This->lpVtbl->put__MediaSubType(This,MediaSubTypeGuid);
}
static __WIDL_INLINE HRESULT IMPEG2ComponentType_get_MediaFormatType(IMPEG2ComponentType* This,BSTR *MediaFormatType) {
    return This->lpVtbl->get_MediaFormatType(This,MediaFormatType);
}
static __WIDL_INLINE HRESULT IMPEG2ComponentType_put_MediaFormatType(IMPEG2ComponentType* This,BSTR MediaFormatType) {
    return This->lpVtbl->put_MediaFormatType(This,MediaFormatType);
}
static __WIDL_INLINE HRESULT IMPEG2ComponentType_get__MediaFormatType(IMPEG2ComponentType* This,GUID *MediaFormatTypeGuid) {
    return This->lpVtbl->get__MediaFormatType(This,MediaFormatTypeGuid);
}
static __WIDL_INLINE HRESULT IMPEG2ComponentType_put__MediaFormatType(IMPEG2ComponentType* This,REFCLSID MediaFormatTypeGuid) {
    return This->lpVtbl->put__MediaFormatType(This,MediaFormatTypeGuid);
}
static __WIDL_INLINE HRESULT IMPEG2ComponentType_get_MediaType(IMPEG2ComponentType* This,AM_MEDIA_TYPE *MediaType) {
    return This->lpVtbl->get_MediaType(This,MediaType);
}
static __WIDL_INLINE HRESULT IMPEG2ComponentType_put_MediaType(IMPEG2ComponentType* This,AM_MEDIA_TYPE *MediaType) {
    return This->lpVtbl->put_MediaType(This,MediaType);
}
static __WIDL_INLINE HRESULT IMPEG2ComponentType_Clone(IMPEG2ComponentType* This,IComponentType **NewCT) {
    return This->lpVtbl->Clone(This,NewCT);
}
/*** ILanguageComponentType methods ***/
static __WIDL_INLINE HRESULT IMPEG2ComponentType_get_LangID(IMPEG2ComponentType* This,LONG *LangID) {
    return This->lpVtbl->get_LangID(This,LangID);
}
static __WIDL_INLINE HRESULT IMPEG2ComponentType_put_LangID(IMPEG2ComponentType* This,LONG LangID) {
    return This->lpVtbl->put_LangID(This,LangID);
}
/*** IMPEG2ComponentType methods ***/
static __WIDL_INLINE HRESULT IMPEG2ComponentType_get_StreamType(IMPEG2ComponentType* This,MPEG2StreamType *MP2StreamType) {
    return This->lpVtbl->get_StreamType(This,MP2StreamType);
}
static __WIDL_INLINE HRESULT IMPEG2ComponentType_put_StreamType(IMPEG2ComponentType* This,MPEG2StreamType MP2StreamType) {
    return This->lpVtbl->put_StreamType(This,MP2StreamType);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IATSCComponentType_QueryInterface(IATSCComponentType* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IATSCComponentType_AddRef(IATSCComponentType* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IATSCComponentType_Release(IATSCComponentType* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IATSCComponentType_GetTypeInfoCount(IATSCComponentType* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IATSCComponentType_GetTypeInfo(IATSCComponentType* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IATSCComponentType_get_Category(IATSCComponentType* This,ComponentCategory *Category) {
    return This->lpVtbl->get_Category(This,Category);
}
static __WIDL_INLINE HRESULT IATSCComponentType_put_Category(IATSCComponentType* This,ComponentCategory Category) {
    return This->lpVtbl->put_Category(This,Category);
}
static __WIDL_INLINE HRESULT IATSCComponentType_get_MediaMajorType(IATSCComponentType* This,BSTR *MediaMajorType) {
    return This->lpVtbl->get_MediaMajorType(This,MediaMajorType);
}
static __WIDL_INLINE HRESULT IATSCComponentType_put_MediaMajorType(IATSCComponentType* This,BSTR MediaMajorType) {
    return This->lpVtbl->put_MediaMajorType(This,MediaMajorType);
}
static __WIDL_INLINE HRESULT IATSCComponentType_get__MediaMajorType(IATSCComponentType* This,GUID *MediaMajorTypeGuid) {
    return This->lpVtbl->get__MediaMajorType(This,MediaMajorTypeGuid);
}
static __WIDL_INLINE HRESULT IATSCComponentType_put__MediaMajorType(IATSCComponentType* This,REFCLSID MediaMajorTypeGuid) {
    return This->lpVtbl->put__MediaMajorType(This,MediaMajorTypeGuid);
}
static __WIDL_INLINE HRESULT IATSCComponentType_get_MediaSubType(IATSCComponentType* This,BSTR *MediaSubType) {
    return This->lpVtbl->get_MediaSubType(This,MediaSubType);
}
static __WIDL_INLINE HRESULT IATSCComponentType_put_MediaSubType(IATSCComponentType* This,BSTR MediaSubType) {
    return This->lpVtbl->put_MediaSubType(This,MediaSubType);
}
static __WIDL_INLINE HRESULT IATSCComponentType_get__MediaSubType(IATSCComponentType* This,GUID *MediaSubTypeGuid) {
    return This->lpVtbl->get__MediaSubType(This,MediaSubTypeGuid);
}
static __WIDL_INLINE HRESULT IATSCComponentType_put__MediaSubType(IATSCComponentType* This,REFCLSID MediaSubTypeGuid) {
    return This->lpVtbl->put__MediaSubType(This,MediaSubTypeGuid);
}
static __WIDL_INLINE HRESULT IATSCComponentType_get_MediaFormatType(IATSCComponentType* This,BSTR *MediaFormatType) {
    return This->lpVtbl->get_MediaFormatType(This,MediaFormatType);
}
static __WIDL_INLINE HRESULT IATSCComponentType_put_MediaFormatType(IATSCComponentType* This,BSTR MediaFormatType) {
    return This->lpVtbl->put_MediaFormatType(This,MediaFormatType);
}
static __WIDL_INLINE HRESULT IATSCComponentType_get__MediaFormatType(IATSCComponentType* This,GUID *MediaFormatTypeGuid) {
    return This->lpVtbl->get__MediaFormatType(This,MediaFormatTypeGuid);
}
static __WIDL_INLINE HRESULT IATSCComponentType_put__MediaFormatType(IATSCComponentType* This,REFCLSID MediaFormatTypeGuid) {
    return This->lpVtbl->put__MediaFormatType(This,MediaFormatTypeGuid);
}
static __WIDL_INLINE HRESULT IATSCComponentType_get_MediaType(IATSCComponentType* This,AM_MEDIA_TYPE *MediaType) {
    return This->lpVtbl->get_MediaType(This,MediaType);
}
static __WIDL_INLINE HRESULT IATSCComponentType_put_MediaType(IATSCComponentType* This,AM_MEDIA_TYPE *MediaType) {
    return This->lpVtbl->put_MediaType(This,MediaType);
}
static __WIDL_INLINE HRESULT IATSCComponentType_Clone(IATSCComponentType* This,IComponentType **NewCT) {
    return This->lpVtbl->Clone(This,NewCT);
}
/*** ILanguageComponentType methods ***/
static __WIDL_INLINE HRESULT IATSCComponentType_get_LangID(IATSCComponentType* This,LONG *LangID) {
    return This->lpVtbl->get_LangID(This,LangID);
}
static __WIDL_INLINE HRESULT IATSCComponentType_put_LangID(IATSCComponentType* This,LONG LangID) {
    return This->lpVtbl->put_LangID(This,LangID);
}
/*** IMPEG2ComponentType methods ***/
static __WIDL_INLINE HRESULT IATSCComponentType_get_StreamType(IATSCComponentType* This,MPEG2StreamType *MP2StreamType) {
    return This->lpVtbl->get_StreamType(This,MP2StreamType);
}
static __WIDL_INLINE HRESULT IATSCComponentType_put_StreamType(IATSCComponentType* This,MPEG2StreamType MP2StreamType) {
    return This->lpVtbl->put_StreamType(This,MP2StreamType);
}
/*** IATSCComponentType methods ***/
static __WIDL_INLINE HRESULT IATSCComponentType_get_Flags(IATSCComponentType* This,LONG *Flags) {
    return This->lpVtbl->get_Flags(This,Flags);
}
static __WIDL_INLINE HRESULT IATSCComponentType_put_Flags(IATSCComponentType* This,LONG flags) {
    return This->lpVtbl->put_Flags(This,flags);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IEnumComponentTypes_QueryInterface(IEnumComponentTypes* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IEnumComponentTypes_AddRef(IEnumComponentTypes* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IEnumComponentTypes_Release(IEnumComponentTypes* This) {
    return This->lpVtbl->Release(This);
}
/*** IEnumComponentTypes methods ***/
static __WIDL_INLINE HRESULT IEnumComponentTypes_Next(IEnumComponentTypes* This,ULONG celt,IComponentType **rgelt,ULONG *pceltFetched) {
    return This->lpVtbl->Next(This,celt,rgelt,pceltFetched);
}
static __WIDL_INLINE HRESULT IEnumComponentTypes_Skip(IEnumComponentTypes* This,ULONG celt) {
    return This->lpVtbl->Skip(This,celt);
}
static __WIDL_INLINE HRESULT IEnumComponentTypes_Reset(IEnumComponentTypes* This) {
    return This->lpVtbl->Reset(This);
}
static __WIDL_INLINE HRESULT IEnumComponentTypes_Clone(IEnumComponentTypes* This,IEnumComponentTypes **ppEnum) {
    return This->lpVtbl->Clone(This,ppEnum);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IComponentTypes_QueryInterface(IComponentTypes* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IComponentTypes_AddRef(IComponentTypes* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IComponentTypes_Release(IComponentTypes* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IComponentTypes_GetTypeInfoCount(IComponentTypes* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IComponentTypes_GetTypeInfo(IComponentTypes* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IComponentTypes_get_Count(IComponentTypes* This,LONG *Count) {
    return This->lpVtbl->get_Count(This,Count);
}
static __WIDL_INLINE HRESULT IComponentTypes_get__NewEnum(IComponentTypes* This,IEnumVARIANT **ppNewEnum) {
    return This->lpVtbl->get__NewEnum(This,ppNewEnum);
}
static __WIDL_INLINE HRESULT IComponentTypes_EnumComponentTypes(IComponentTypes* This,IEnumComponentTypes **ppNewEnum) {
    return This->lpVtbl->EnumComponentTypes(This,ppNewEnum);
}
static __WIDL_INLINE HRESULT IComponentTypes_get_Item(IComponentTypes* This,VARIANT Index,IComponentType **ComponentType) {
    return This->lpVtbl->get_Item(This,Index,ComponentType);
}
static __WIDL_INLINE HRESULT IComponentTypes_put_Item(IComponentTypes* This,VARIANT Index,IComponentType *ComponentType) {
    return This->lpVtbl->put_Item(This,Index,ComponentType);
}
static __WIDL_INLINE HRESULT IComponentTypes_Add(IComponentTypes* This,IComponentType *ComponentType,VARIANT *NewIndex) {
    return This->lpVtbl->Add(This,ComponentType,NewIndex);
}
static __WIDL_INLINE HRESULT IComponentTypes_Remove(IComponentTypes* This,VARIANT Index) {
    return This->lpVtbl->Remove(This,Index);
}
static __WIDL_INLINE HRESULT IComponentTypes_Clone(IComponentTypes* This,IComponentTypes **NewList) {
    return This->lpVtbl->Clone(This,NewList);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IComponent_QueryInterface(IComponent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IComponent_AddRef(IComponent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IComponent_Release(IComponent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IComponent_GetTypeInfoCount(IComponent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IComponent_GetTypeInfo(IComponent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IComponent_get_Type(IComponent* This,IComponentType **CT) {
    return This->lpVtbl->get_Type(This,CT);
}
static __WIDL_INLINE HRESULT IComponent_put_Type(IComponent* This,IComponentType *CT) {
    return This->lpVtbl->put_Type(This,CT);
}
static __WIDL_INLINE HRESULT IComponent_get_DescLangID(IComponent* This,LONG *LangID) {
    return This->lpVtbl->get_DescLangID(This,LangID);
}
static __WIDL_INLINE HRESULT IComponent_put_DescLangID(IComponent* This,LONG LangID) {
    return This->lpVtbl->put_DescLangID(This,LangID);
}
static __WIDL_INLINE HRESULT IComponent_get_Status(IComponent* This,ComponentStatus *Status) {
    return This->lpVtbl->get_Status(This,Status);
}
static __WIDL_INLINE HRESULT IComponent_put_Status(IComponent* This,ComponentStatus Status) {
    return This->lpVtbl->put_Status(This,Status);
}
static __WIDL_INLINE HRESULT IComponent_get_Description(IComponent* This,BSTR *Description) {
    return This->lpVtbl->get_Description(This,Description);
}
static __WIDL_INLINE HRESULT IComponent_put_Description(IComponent* This,BSTR Description) {
    return This->lpVtbl->put_Description(This,Description);
}
static __WIDL_INLINE HRESULT IComponent_Clone(IComponent* This,IComponent **NewComponent) {
    return This->lpVtbl->Clone(This,NewComponent);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IAnalogAudioComponentType_QueryInterface(IAnalogAudioComponentType* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IAnalogAudioComponentType_AddRef(IAnalogAudioComponentType* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IAnalogAudioComponentType_Release(IAnalogAudioComponentType* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IAnalogAudioComponentType_GetTypeInfoCount(IAnalogAudioComponentType* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IAnalogAudioComponentType_GetTypeInfo(IAnalogAudioComponentType* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IAnalogAudioComponentType_get_Category(IAnalogAudioComponentType* This,ComponentCategory *Category) {
    return This->lpVtbl->get_Category(This,Category);
}
static __WIDL_INLINE HRESULT IAnalogAudioComponentType_put_Category(IAnalogAudioComponentType* This,ComponentCategory Category) {
    return This->lpVtbl->put_Category(This,Category);
}
static __WIDL_INLINE HRESULT IAnalogAudioComponentType_get_MediaMajorType(IAnalogAudioComponentType* This,BSTR *MediaMajorType) {
    return This->lpVtbl->get_MediaMajorType(This,MediaMajorType);
}
static __WIDL_INLINE HRESULT IAnalogAudioComponentType_put_MediaMajorType(IAnalogAudioComponentType* This,BSTR MediaMajorType) {
    return This->lpVtbl->put_MediaMajorType(This,MediaMajorType);
}
static __WIDL_INLINE HRESULT IAnalogAudioComponentType_get__MediaMajorType(IAnalogAudioComponentType* This,GUID *MediaMajorTypeGuid) {
    return This->lpVtbl->get__MediaMajorType(This,MediaMajorTypeGuid);
}
static __WIDL_INLINE HRESULT IAnalogAudioComponentType_put__MediaMajorType(IAnalogAudioComponentType* This,REFCLSID MediaMajorTypeGuid) {
    return This->lpVtbl->put__MediaMajorType(This,MediaMajorTypeGuid);
}
static __WIDL_INLINE HRESULT IAnalogAudioComponentType_get_MediaSubType(IAnalogAudioComponentType* This,BSTR *MediaSubType) {
    return This->lpVtbl->get_MediaSubType(This,MediaSubType);
}
static __WIDL_INLINE HRESULT IAnalogAudioComponentType_put_MediaSubType(IAnalogAudioComponentType* This,BSTR MediaSubType) {
    return This->lpVtbl->put_MediaSubType(This,MediaSubType);
}
static __WIDL_INLINE HRESULT IAnalogAudioComponentType_get__MediaSubType(IAnalogAudioComponentType* This,GUID *MediaSubTypeGuid) {
    return This->lpVtbl->get__MediaSubType(This,MediaSubTypeGuid);
}
static __WIDL_INLINE HRESULT IAnalogAudioComponentType_put__MediaSubType(IAnalogAudioComponentType* This,REFCLSID MediaSubTypeGuid) {
    return This->lpVtbl->put__MediaSubType(This,MediaSubTypeGuid);
}
static __WIDL_INLINE HRESULT IAnalogAudioComponentType_get_MediaFormatType(IAnalogAudioComponentType* This,BSTR *MediaFormatType) {
    return This->lpVtbl->get_MediaFormatType(This,MediaFormatType);
}
static __WIDL_INLINE HRESULT IAnalogAudioComponentType_put_MediaFormatType(IAnalogAudioComponentType* This,BSTR MediaFormatType) {
    return This->lpVtbl->put_MediaFormatType(This,MediaFormatType);
}
static __WIDL_INLINE HRESULT IAnalogAudioComponentType_get__MediaFormatType(IAnalogAudioComponentType* This,GUID *MediaFormatTypeGuid) {
    return This->lpVtbl->get__MediaFormatType(This,MediaFormatTypeGuid);
}
static __WIDL_INLINE HRESULT IAnalogAudioComponentType_put__MediaFormatType(IAnalogAudioComponentType* This,REFCLSID MediaFormatTypeGuid) {
    return This->lpVtbl->put__MediaFormatType(This,MediaFormatTypeGuid);
}
static __WIDL_INLINE HRESULT IAnalogAudioComponentType_get_MediaType(IAnalogAudioComponentType* This,AM_MEDIA_TYPE *MediaType) {
    return This->lpVtbl->get_MediaType(This,MediaType);
}
static __WIDL_INLINE HRESULT IAnalogAudioComponentType_put_MediaType(IAnalogAudioComponentType* This,AM_MEDIA_TYPE *MediaType) {
    return This->lpVtbl->put_MediaType(This,MediaType);
}
static __WIDL_INLINE HRESULT IAnalogAudioComponentType_Clone(IAnalogAudioComponentType* This,IComponentType **NewCT) {
    return This->lpVtbl->Clone(This,NewCT);
}
/*** IAnalogAudioComponentType methods ***/
static __WIDL_INLINE HRESULT IAnalogAudioComponentType_get_AnalogAudioMode(IAnalogAudioComponentType* This,TVAudioMode *Mode) {
    return This->lpVtbl->get_AnalogAudioMode(This,Mode);
}
static __WIDL_INLINE HRESULT IAnalogAudioComponentType_put_AnalogAudioMode(IAnalogAudioComponentType* This,TVAudioMode Mode) {
    return This->lpVtbl->put_AnalogAudioMode(This,Mode);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IMPEG2Component_QueryInterface(IMPEG2Component* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IMPEG2Component_AddRef(IMPEG2Component* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IMPEG2Component_Release(IMPEG2Component* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IMPEG2Component_GetTypeInfoCount(IMPEG2Component* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IMPEG2Component_GetTypeInfo(IMPEG2Component* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IMPEG2Component_get_Type(IMPEG2Component* This,IComponentType **CT) {
    return This->lpVtbl->get_Type(This,CT);
}
static __WIDL_INLINE HRESULT IMPEG2Component_put_Type(IMPEG2Component* This,IComponentType *CT) {
    return This->lpVtbl->put_Type(This,CT);
}
static __WIDL_INLINE HRESULT IMPEG2Component_get_DescLangID(IMPEG2Component* This,LONG *LangID) {
    return This->lpVtbl->get_DescLangID(This,LangID);
}
static __WIDL_INLINE HRESULT IMPEG2Component_put_DescLangID(IMPEG2Component* This,LONG LangID) {
    return This->lpVtbl->put_DescLangID(This,LangID);
}
static __WIDL_INLINE HRESULT IMPEG2Component_get_Status(IMPEG2Component* This,ComponentStatus *Status) {
    return This->lpVtbl->get_Status(This,Status);
}
static __WIDL_INLINE HRESULT IMPEG2Component_put_Status(IMPEG2Component* This,ComponentStatus Status) {
    return This->lpVtbl->put_Status(This,Status);
}
static __WIDL_INLINE HRESULT IMPEG2Component_get_Description(IMPEG2Component* This,BSTR *Description) {
    return This->lpVtbl->get_Description(This,Description);
}
static __WIDL_INLINE HRESULT IMPEG2Component_put_Description(IMPEG2Component* This,BSTR Description) {
    return This->lpVtbl->put_Description(This,Description);
}
static __WIDL_INLINE HRESULT IMPEG2Component_Clone(IMPEG2Component* This,IComponent **NewComponent) {
    return This->lpVtbl->Clone(This,NewComponent);
}
/*** IMPEG2Component methods ***/
static __WIDL_INLINE HRESULT IMPEG2Component_get_PID(IMPEG2Component* This,LONG *PID) {
    return This->lpVtbl->get_PID(This,PID);
}
static __WIDL_INLINE HRESULT IMPEG2Component_put_PID(IMPEG2Component* This,LONG PID) {
    return This->lpVtbl->put_PID(This,PID);
}
static __WIDL_INLINE HRESULT IMPEG2Component_get_PCRPID(IMPEG2Component* This,LONG *PCRPID) {
    return This->lpVtbl->get_PCRPID(This,PCRPID);
}
static __WIDL_INLINE HRESULT IMPEG2Component_put_PCRPID(IMPEG2Component* This,LONG PCRPID) {
    return This->lpVtbl->put_PCRPID(This,PCRPID);
}
static __WIDL_INLINE HRESULT IMPEG2Component_get_ProgramNumber(IMPEG2Component* This,LONG *ProgramNumber) {
    return This->lpVtbl->get_ProgramNumber(This,ProgramNumber);
}
static __WIDL_INLINE HRESULT IMPEG2Component_put_ProgramNumber(IMPEG2Component* This,LONG ProgramNumber) {
    return This->lpVtbl->put_ProgramNumber(This,ProgramNumber);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IEnumComponents_QueryInterface(IEnumComponents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IEnumComponents_AddRef(IEnumComponents* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IEnumComponents_Release(IEnumComponents* This) {
    return This->lpVtbl->Release(This);
}
/*** IEnumComponents methods ***/
static __WIDL_INLINE HRESULT IEnumComponents_Next(IEnumComponents* This,ULONG celt,IComponent **rgelt,ULONG *pceltFetched) {
    return This->lpVtbl->Next(This,celt,rgelt,pceltFetched);
}
static __WIDL_INLINE HRESULT IEnumComponents_Skip(IEnumComponents* This,ULONG celt) {
    return This->lpVtbl->Skip(This,celt);
}
static __WIDL_INLINE HRESULT IEnumComponents_Reset(IEnumComponents* This) {
    return This->lpVtbl->Reset(This);
}
static __WIDL_INLINE HRESULT IEnumComponents_Clone(IEnumComponents* This,IEnumComponents **ppEnum) {
    return This->lpVtbl->Clone(This,ppEnum);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IComponents_QueryInterface(IComponents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IComponents_AddRef(IComponents* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IComponents_Release(IComponents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IComponents_GetTypeInfoCount(IComponents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IComponents_GetTypeInfo(IComponents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IComponents_get_Count(IComponents* This,LONG *Count) {
    return This->lpVtbl->get_Count(This,Count);
}
static __WIDL_INLINE HRESULT IComponents_get__NewEnum(IComponents* This,IEnumVARIANT **ppNewEnum) {
    return This->lpVtbl->get__NewEnum(This,ppNewEnum);
}
static __WIDL_INLINE HRESULT IComponents_EnumComponents(IComponents* This,IEnumComponents **ppNewEnum) {
    return This->lpVtbl->EnumComponents(This,ppNewEnum);
}
static __WIDL_INLINE HRESULT IComponents_get_Item(IComponents* This,VARIANT Index,IComponent **ppComponent) {
    return This->lpVtbl->get_Item(This,Index,ppComponent);
}
static __WIDL_INLINE HRESULT IComponents_Add(IComponents* This,IComponent *Component,VARIANT *NewIndex) {
    return This->lpVtbl->Add(This,Component,NewIndex);
}
static __WIDL_INLINE HRESULT IComponents_Remove(IComponents* This,VARIANT Index) {
    return This->lpVtbl->Remove(This,Index);
}
static __WIDL_INLINE HRESULT IComponents_Clone(IComponents* This,IComponents **NewList) {
    return This->lpVtbl->Clone(This,NewList);
}
static __WIDL_INLINE HRESULT IComponents_put_Item(IComponents* This,VARIANT Index,IComponent *ppComponent) {
    return This->lpVtbl->put_Item(This,Index,ppComponent);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IComponentsOld_QueryInterface(IComponentsOld* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IComponentsOld_AddRef(IComponentsOld* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IComponentsOld_Release(IComponentsOld* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IComponentsOld_GetTypeInfoCount(IComponentsOld* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IComponentsOld_GetTypeInfo(IComponentsOld* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IComponentsOld_get_Count(IComponentsOld* This,LONG *Count) {
    return This->lpVtbl->get_Count(This,Count);
}
static __WIDL_INLINE HRESULT IComponentsOld_get__NewEnum(IComponentsOld* This,IEnumVARIANT **ppNewEnum) {
    return This->lpVtbl->get__NewEnum(This,ppNewEnum);
}
static __WIDL_INLINE HRESULT IComponentsOld_EnumComponents(IComponentsOld* This,IEnumComponents **ppNewEnum) {
    return This->lpVtbl->EnumComponents(This,ppNewEnum);
}
static __WIDL_INLINE HRESULT IComponentsOld_get_Item(IComponentsOld* This,VARIANT Index,IComponent **ppComponent) {
    return This->lpVtbl->get_Item(This,Index,ppComponent);
}
static __WIDL_INLINE HRESULT IComponentsOld_Add(IComponentsOld* This,IComponent *Component,VARIANT *NewIndex) {
    return This->lpVtbl->Add(This,Component,NewIndex);
}
static __WIDL_INLINE HRESULT IComponentsOld_Remove(IComponentsOld* This,VARIANT Index) {
    return This->lpVtbl->Remove(This,Index);
}
static __WIDL_INLINE HRESULT IComponentsOld_Clone(IComponentsOld* This,IComponents **NewList) {
    return This->lpVtbl->Clone(This,NewList);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT ILocator_QueryInterface(ILocator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ILocator_AddRef(ILocator* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ILocator_Release(ILocator* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ILocator_GetTypeInfoCount(ILocator* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ILocator_GetTypeInfo(ILocator* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ILocator_get_CarrierFrequency(ILocator* This,LONG *Frequency) {
    return This->lpVtbl->get_CarrierFrequency(This,Frequency);
}
static __WIDL_INLINE HRESULT ILocator_put_CarrierFrequency(ILocator* This,LONG Frequency) {
    return This->lpVtbl->put_CarrierFrequency(This,Frequency);
}
static __WIDL_INLINE HRESULT ILocator_get_InnerFEC(ILocator* This,FECMethod *FEC) {
    return This->lpVtbl->get_InnerFEC(This,FEC);
}
static __WIDL_INLINE HRESULT ILocator_put_InnerFEC(ILocator* This,FECMethod FEC) {
    return This->lpVtbl->put_InnerFEC(This,FEC);
}
static __WIDL_INLINE HRESULT ILocator_get_InnerFECRate(ILocator* This,BinaryConvolutionCodeRate *FEC) {
    return This->lpVtbl->get_InnerFECRate(This,FEC);
}
static __WIDL_INLINE HRESULT ILocator_put_InnerFECRate(ILocator* This,BinaryConvolutionCodeRate FEC) {
    return This->lpVtbl->put_InnerFECRate(This,FEC);
}
static __WIDL_INLINE HRESULT ILocator_get_OuterFEC(ILocator* This,FECMethod *FEC) {
    return This->lpVtbl->get_OuterFEC(This,FEC);
}
static __WIDL_INLINE HRESULT ILocator_put_OuterFEC(ILocator* This,FECMethod FEC) {
    return This->lpVtbl->put_OuterFEC(This,FEC);
}
static __WIDL_INLINE HRESULT ILocator_get_OuterFECRate(ILocator* This,BinaryConvolutionCodeRate *FEC) {
    return This->lpVtbl->get_OuterFECRate(This,FEC);
}
static __WIDL_INLINE HRESULT ILocator_put_OuterFECRate(ILocator* This,BinaryConvolutionCodeRate FEC) {
    return This->lpVtbl->put_OuterFECRate(This,FEC);
}
static __WIDL_INLINE HRESULT ILocator_get_Modulation(ILocator* This,ModulationType *Modulation) {
    return This->lpVtbl->get_Modulation(This,Modulation);
}
static __WIDL_INLINE HRESULT ILocator_put_Modulation(ILocator* This,ModulationType Modulation) {
    return This->lpVtbl->put_Modulation(This,Modulation);
}
static __WIDL_INLINE HRESULT ILocator_get_SymbolRate(ILocator* This,LONG *Rate) {
    return This->lpVtbl->get_SymbolRate(This,Rate);
}
static __WIDL_INLINE HRESULT ILocator_put_SymbolRate(ILocator* This,LONG Rate) {
    return This->lpVtbl->put_SymbolRate(This,Rate);
}
static __WIDL_INLINE HRESULT ILocator_Clone(ILocator* This,ILocator **NewLocator) {
    return This->lpVtbl->Clone(This,NewLocator);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IAnalogLocator_QueryInterface(IAnalogLocator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IAnalogLocator_AddRef(IAnalogLocator* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IAnalogLocator_Release(IAnalogLocator* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IAnalogLocator_GetTypeInfoCount(IAnalogLocator* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IAnalogLocator_GetTypeInfo(IAnalogLocator* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IAnalogLocator_get_CarrierFrequency(IAnalogLocator* This,LONG *Frequency) {
    return This->lpVtbl->get_CarrierFrequency(This,Frequency);
}
static __WIDL_INLINE HRESULT IAnalogLocator_put_CarrierFrequency(IAnalogLocator* This,LONG Frequency) {
    return This->lpVtbl->put_CarrierFrequency(This,Frequency);
}
static __WIDL_INLINE HRESULT IAnalogLocator_get_InnerFEC(IAnalogLocator* This,FECMethod *FEC) {
    return This->lpVtbl->get_InnerFEC(This,FEC);
}
static __WIDL_INLINE HRESULT IAnalogLocator_put_InnerFEC(IAnalogLocator* This,FECMethod FEC) {
    return This->lpVtbl->put_InnerFEC(This,FEC);
}
static __WIDL_INLINE HRESULT IAnalogLocator_get_InnerFECRate(IAnalogLocator* This,BinaryConvolutionCodeRate *FEC) {
    return This->lpVtbl->get_InnerFECRate(This,FEC);
}
static __WIDL_INLINE HRESULT IAnalogLocator_put_InnerFECRate(IAnalogLocator* This,BinaryConvolutionCodeRate FEC) {
    return This->lpVtbl->put_InnerFECRate(This,FEC);
}
static __WIDL_INLINE HRESULT IAnalogLocator_get_OuterFEC(IAnalogLocator* This,FECMethod *FEC) {
    return This->lpVtbl->get_OuterFEC(This,FEC);
}
static __WIDL_INLINE HRESULT IAnalogLocator_put_OuterFEC(IAnalogLocator* This,FECMethod FEC) {
    return This->lpVtbl->put_OuterFEC(This,FEC);
}
static __WIDL_INLINE HRESULT IAnalogLocator_get_OuterFECRate(IAnalogLocator* This,BinaryConvolutionCodeRate *FEC) {
    return This->lpVtbl->get_OuterFECRate(This,FEC);
}
static __WIDL_INLINE HRESULT IAnalogLocator_put_OuterFECRate(IAnalogLocator* This,BinaryConvolutionCodeRate FEC) {
    return This->lpVtbl->put_OuterFECRate(This,FEC);
}
static __WIDL_INLINE HRESULT IAnalogLocator_get_Modulation(IAnalogLocator* This,ModulationType *Modulation) {
    return This->lpVtbl->get_Modulation(This,Modulation);
}
static __WIDL_INLINE HRESULT IAnalogLocator_put_Modulation(IAnalogLocator* This,ModulationType Modulation) {
    return This->lpVtbl->put_Modulation(This,Modulation);
}
static __WIDL_INLINE HRESULT IAnalogLocator_get_SymbolRate(IAnalogLocator* This,LONG *Rate) {
    return This->lpVtbl->get_SymbolRate(This,Rate);
}
static __WIDL_INLINE HRESULT IAnalogLocator_put_SymbolRate(IAnalogLocator* This,LONG Rate) {
    return This->lpVtbl->put_SymbolRate(This,Rate);
}
static __WIDL_INLINE HRESULT IAnalogLocator_Clone(IAnalogLocator* This,ILocator **NewLocator) {
    return This->lpVtbl->Clone(This,NewLocator);
}
/*** IAnalogLocator methods ***/
static __WIDL_INLINE HRESULT IAnalogLocator_get_VideoStandard(IAnalogLocator* This,AnalogVideoStandard *AVS) {
    return This->lpVtbl->get_VideoStandard(This,AVS);
}
static __WIDL_INLINE HRESULT IAnalogLocator_put_VideoStandard(IAnalogLocator* This,AnalogVideoStandard AVS) {
    return This->lpVtbl->put_VideoStandard(This,AVS);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IDigitalLocator_QueryInterface(IDigitalLocator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDigitalLocator_AddRef(IDigitalLocator* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDigitalLocator_Release(IDigitalLocator* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IDigitalLocator_GetTypeInfoCount(IDigitalLocator* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IDigitalLocator_GetTypeInfo(IDigitalLocator* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDigitalLocator_get_CarrierFrequency(IDigitalLocator* This,LONG *Frequency) {
    return This->lpVtbl->get_CarrierFrequency(This,Frequency);
}
static __WIDL_INLINE HRESULT IDigitalLocator_put_CarrierFrequency(IDigitalLocator* This,LONG Frequency) {
    return This->lpVtbl->put_CarrierFrequency(This,Frequency);
}
static __WIDL_INLINE HRESULT IDigitalLocator_get_InnerFEC(IDigitalLocator* This,FECMethod *FEC) {
    return This->lpVtbl->get_InnerFEC(This,FEC);
}
static __WIDL_INLINE HRESULT IDigitalLocator_put_InnerFEC(IDigitalLocator* This,FECMethod FEC) {
    return This->lpVtbl->put_InnerFEC(This,FEC);
}
static __WIDL_INLINE HRESULT IDigitalLocator_get_InnerFECRate(IDigitalLocator* This,BinaryConvolutionCodeRate *FEC) {
    return This->lpVtbl->get_InnerFECRate(This,FEC);
}
static __WIDL_INLINE HRESULT IDigitalLocator_put_InnerFECRate(IDigitalLocator* This,BinaryConvolutionCodeRate FEC) {
    return This->lpVtbl->put_InnerFECRate(This,FEC);
}
static __WIDL_INLINE HRESULT IDigitalLocator_get_OuterFEC(IDigitalLocator* This,FECMethod *FEC) {
    return This->lpVtbl->get_OuterFEC(This,FEC);
}
static __WIDL_INLINE HRESULT IDigitalLocator_put_OuterFEC(IDigitalLocator* This,FECMethod FEC) {
    return This->lpVtbl->put_OuterFEC(This,FEC);
}
static __WIDL_INLINE HRESULT IDigitalLocator_get_OuterFECRate(IDigitalLocator* This,BinaryConvolutionCodeRate *FEC) {
    return This->lpVtbl->get_OuterFECRate(This,FEC);
}
static __WIDL_INLINE HRESULT IDigitalLocator_put_OuterFECRate(IDigitalLocator* This,BinaryConvolutionCodeRate FEC) {
    return This->lpVtbl->put_OuterFECRate(This,FEC);
}
static __WIDL_INLINE HRESULT IDigitalLocator_get_Modulation(IDigitalLocator* This,ModulationType *Modulation) {
    return This->lpVtbl->get_Modulation(This,Modulation);
}
static __WIDL_INLINE HRESULT IDigitalLocator_put_Modulation(IDigitalLocator* This,ModulationType Modulation) {
    return This->lpVtbl->put_Modulation(This,Modulation);
}
static __WIDL_INLINE HRESULT IDigitalLocator_get_SymbolRate(IDigitalLocator* This,LONG *Rate) {
    return This->lpVtbl->get_SymbolRate(This,Rate);
}
static __WIDL_INLINE HRESULT IDigitalLocator_put_SymbolRate(IDigitalLocator* This,LONG Rate) {
    return This->lpVtbl->put_SymbolRate(This,Rate);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IATSCLocator_QueryInterface(IATSCLocator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IATSCLocator_AddRef(IATSCLocator* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IATSCLocator_Release(IATSCLocator* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IATSCLocator_GetTypeInfoCount(IATSCLocator* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IATSCLocator_GetTypeInfo(IATSCLocator* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IATSCLocator_get_CarrierFrequency(IATSCLocator* This,LONG *Frequency) {
    return This->lpVtbl->get_CarrierFrequency(This,Frequency);
}
static __WIDL_INLINE HRESULT IATSCLocator_put_CarrierFrequency(IATSCLocator* This,LONG Frequency) {
    return This->lpVtbl->put_CarrierFrequency(This,Frequency);
}
static __WIDL_INLINE HRESULT IATSCLocator_get_InnerFEC(IATSCLocator* This,FECMethod *FEC) {
    return This->lpVtbl->get_InnerFEC(This,FEC);
}
static __WIDL_INLINE HRESULT IATSCLocator_put_InnerFEC(IATSCLocator* This,FECMethod FEC) {
    return This->lpVtbl->put_InnerFEC(This,FEC);
}
static __WIDL_INLINE HRESULT IATSCLocator_get_InnerFECRate(IATSCLocator* This,BinaryConvolutionCodeRate *FEC) {
    return This->lpVtbl->get_InnerFECRate(This,FEC);
}
static __WIDL_INLINE HRESULT IATSCLocator_put_InnerFECRate(IATSCLocator* This,BinaryConvolutionCodeRate FEC) {
    return This->lpVtbl->put_InnerFECRate(This,FEC);
}
static __WIDL_INLINE HRESULT IATSCLocator_get_OuterFEC(IATSCLocator* This,FECMethod *FEC) {
    return This->lpVtbl->get_OuterFEC(This,FEC);
}
static __WIDL_INLINE HRESULT IATSCLocator_put_OuterFEC(IATSCLocator* This,FECMethod FEC) {
    return This->lpVtbl->put_OuterFEC(This,FEC);
}
static __WIDL_INLINE HRESULT IATSCLocator_get_OuterFECRate(IATSCLocator* This,BinaryConvolutionCodeRate *FEC) {
    return This->lpVtbl->get_OuterFECRate(This,FEC);
}
static __WIDL_INLINE HRESULT IATSCLocator_put_OuterFECRate(IATSCLocator* This,BinaryConvolutionCodeRate FEC) {
    return This->lpVtbl->put_OuterFECRate(This,FEC);
}
static __WIDL_INLINE HRESULT IATSCLocator_get_Modulation(IATSCLocator* This,ModulationType *Modulation) {
    return This->lpVtbl->get_Modulation(This,Modulation);
}
static __WIDL_INLINE HRESULT IATSCLocator_put_Modulation(IATSCLocator* This,ModulationType Modulation) {
    return This->lpVtbl->put_Modulation(This,Modulation);
}
static __WIDL_INLINE HRESULT IATSCLocator_get_SymbolRate(IATSCLocator* This,LONG *Rate) {
    return This->lpVtbl->get_SymbolRate(This,Rate);
}
static __WIDL_INLINE HRESULT IATSCLocator_put_SymbolRate(IATSCLocator* This,LONG Rate) {
    return This->lpVtbl->put_SymbolRate(This,Rate);
}
static __WIDL_INLINE HRESULT IATSCLocator_Clone(IATSCLocator* This,ILocator **NewLocator) {
    return This->lpVtbl->Clone(This,NewLocator);
}
/*** IATSCLocator methods ***/
static __WIDL_INLINE HRESULT IATSCLocator_get_PhysicalChannel(IATSCLocator* This,LONG *PhysicalChannel) {
    return This->lpVtbl->get_PhysicalChannel(This,PhysicalChannel);
}
static __WIDL_INLINE HRESULT IATSCLocator_put_PhysicalChannel(IATSCLocator* This,LONG PhysicalChannel) {
    return This->lpVtbl->put_PhysicalChannel(This,PhysicalChannel);
}
static __WIDL_INLINE HRESULT IATSCLocator_get_TSID(IATSCLocator* This,LONG *TSID) {
    return This->lpVtbl->get_TSID(This,TSID);
}
static __WIDL_INLINE HRESULT IATSCLocator_put_TSID(IATSCLocator* This,LONG TSID) {
    return This->lpVtbl->put_TSID(This,TSID);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IATSCLocator2_QueryInterface(IATSCLocator2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IATSCLocator2_AddRef(IATSCLocator2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IATSCLocator2_Release(IATSCLocator2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IATSCLocator2_GetTypeInfoCount(IATSCLocator2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IATSCLocator2_GetTypeInfo(IATSCLocator2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IATSCLocator2_get_CarrierFrequency(IATSCLocator2* This,LONG *Frequency) {
    return This->lpVtbl->get_CarrierFrequency(This,Frequency);
}
static __WIDL_INLINE HRESULT IATSCLocator2_put_CarrierFrequency(IATSCLocator2* This,LONG Frequency) {
    return This->lpVtbl->put_CarrierFrequency(This,Frequency);
}
static __WIDL_INLINE HRESULT IATSCLocator2_get_InnerFEC(IATSCLocator2* This,FECMethod *FEC) {
    return This->lpVtbl->get_InnerFEC(This,FEC);
}
static __WIDL_INLINE HRESULT IATSCLocator2_put_InnerFEC(IATSCLocator2* This,FECMethod FEC) {
    return This->lpVtbl->put_InnerFEC(This,FEC);
}
static __WIDL_INLINE HRESULT IATSCLocator2_get_InnerFECRate(IATSCLocator2* This,BinaryConvolutionCodeRate *FEC) {
    return This->lpVtbl->get_InnerFECRate(This,FEC);
}
static __WIDL_INLINE HRESULT IATSCLocator2_put_InnerFECRate(IATSCLocator2* This,BinaryConvolutionCodeRate FEC) {
    return This->lpVtbl->put_InnerFECRate(This,FEC);
}
static __WIDL_INLINE HRESULT IATSCLocator2_get_OuterFEC(IATSCLocator2* This,FECMethod *FEC) {
    return This->lpVtbl->get_OuterFEC(This,FEC);
}
static __WIDL_INLINE HRESULT IATSCLocator2_put_OuterFEC(IATSCLocator2* This,FECMethod FEC) {
    return This->lpVtbl->put_OuterFEC(This,FEC);
}
static __WIDL_INLINE HRESULT IATSCLocator2_get_OuterFECRate(IATSCLocator2* This,BinaryConvolutionCodeRate *FEC) {
    return This->lpVtbl->get_OuterFECRate(This,FEC);
}
static __WIDL_INLINE HRESULT IATSCLocator2_put_OuterFECRate(IATSCLocator2* This,BinaryConvolutionCodeRate FEC) {
    return This->lpVtbl->put_OuterFECRate(This,FEC);
}
static __WIDL_INLINE HRESULT IATSCLocator2_get_Modulation(IATSCLocator2* This,ModulationType *Modulation) {
    return This->lpVtbl->get_Modulation(This,Modulation);
}
static __WIDL_INLINE HRESULT IATSCLocator2_put_Modulation(IATSCLocator2* This,ModulationType Modulation) {
    return This->lpVtbl->put_Modulation(This,Modulation);
}
static __WIDL_INLINE HRESULT IATSCLocator2_get_SymbolRate(IATSCLocator2* This,LONG *Rate) {
    return This->lpVtbl->get_SymbolRate(This,Rate);
}
static __WIDL_INLINE HRESULT IATSCLocator2_put_SymbolRate(IATSCLocator2* This,LONG Rate) {
    return This->lpVtbl->put_SymbolRate(This,Rate);
}
static __WIDL_INLINE HRESULT IATSCLocator2_Clone(IATSCLocator2* This,ILocator **NewLocator) {
    return This->lpVtbl->Clone(This,NewLocator);
}
/*** IATSCLocator methods ***/
static __WIDL_INLINE HRESULT IATSCLocator2_get_PhysicalChannel(IATSCLocator2* This,LONG *PhysicalChannel) {
    return This->lpVtbl->get_PhysicalChannel(This,PhysicalChannel);
}
static __WIDL_INLINE HRESULT IATSCLocator2_put_PhysicalChannel(IATSCLocator2* This,LONG PhysicalChannel) {
    return This->lpVtbl->put_PhysicalChannel(This,PhysicalChannel);
}
static __WIDL_INLINE HRESULT IATSCLocator2_get_TSID(IATSCLocator2* This,LONG *TSID) {
    return This->lpVtbl->get_TSID(This,TSID);
}
static __WIDL_INLINE HRESULT IATSCLocator2_put_TSID(IATSCLocator2* This,LONG TSID) {
    return This->lpVtbl->put_TSID(This,TSID);
}
/*** IATSCLocator2 methods ***/
static __WIDL_INLINE HRESULT IATSCLocator2_get_ProgramNumber(IATSCLocator2* This,LONG *ProgramNumber) {
    return This->lpVtbl->get_ProgramNumber(This,ProgramNumber);
}
static __WIDL_INLINE HRESULT IATSCLocator2_put_ProgramNumber(IATSCLocator2* This,LONG ProgramNumber) {
    return This->lpVtbl->put_ProgramNumber(This,ProgramNumber);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IDigitalCableLocator_QueryInterface(IDigitalCableLocator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDigitalCableLocator_AddRef(IDigitalCableLocator* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDigitalCableLocator_Release(IDigitalCableLocator* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IDigitalCableLocator_GetTypeInfoCount(IDigitalCableLocator* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IDigitalCableLocator_GetTypeInfo(IDigitalCableLocator* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDigitalCableLocator_get_CarrierFrequency(IDigitalCableLocator* This,LONG *Frequency) {
    return This->lpVtbl->get_CarrierFrequency(This,Frequency);
}
static __WIDL_INLINE HRESULT IDigitalCableLocator_put_CarrierFrequency(IDigitalCableLocator* This,LONG Frequency) {
    return This->lpVtbl->put_CarrierFrequency(This,Frequency);
}
static __WIDL_INLINE HRESULT IDigitalCableLocator_get_InnerFEC(IDigitalCableLocator* This,FECMethod *FEC) {
    return This->lpVtbl->get_InnerFEC(This,FEC);
}
static __WIDL_INLINE HRESULT IDigitalCableLocator_put_InnerFEC(IDigitalCableLocator* This,FECMethod FEC) {
    return This->lpVtbl->put_InnerFEC(This,FEC);
}
static __WIDL_INLINE HRESULT IDigitalCableLocator_get_InnerFECRate(IDigitalCableLocator* This,BinaryConvolutionCodeRate *FEC) {
    return This->lpVtbl->get_InnerFECRate(This,FEC);
}
static __WIDL_INLINE HRESULT IDigitalCableLocator_put_InnerFECRate(IDigitalCableLocator* This,BinaryConvolutionCodeRate FEC) {
    return This->lpVtbl->put_InnerFECRate(This,FEC);
}
static __WIDL_INLINE HRESULT IDigitalCableLocator_get_OuterFEC(IDigitalCableLocator* This,FECMethod *FEC) {
    return This->lpVtbl->get_OuterFEC(This,FEC);
}
static __WIDL_INLINE HRESULT IDigitalCableLocator_put_OuterFEC(IDigitalCableLocator* This,FECMethod FEC) {
    return This->lpVtbl->put_OuterFEC(This,FEC);
}
static __WIDL_INLINE HRESULT IDigitalCableLocator_get_OuterFECRate(IDigitalCableLocator* This,BinaryConvolutionCodeRate *FEC) {
    return This->lpVtbl->get_OuterFECRate(This,FEC);
}
static __WIDL_INLINE HRESULT IDigitalCableLocator_put_OuterFECRate(IDigitalCableLocator* This,BinaryConvolutionCodeRate FEC) {
    return This->lpVtbl->put_OuterFECRate(This,FEC);
}
static __WIDL_INLINE HRESULT IDigitalCableLocator_get_Modulation(IDigitalCableLocator* This,ModulationType *Modulation) {
    return This->lpVtbl->get_Modulation(This,Modulation);
}
static __WIDL_INLINE HRESULT IDigitalCableLocator_put_Modulation(IDigitalCableLocator* This,ModulationType Modulation) {
    return This->lpVtbl->put_Modulation(This,Modulation);
}
static __WIDL_INLINE HRESULT IDigitalCableLocator_get_SymbolRate(IDigitalCableLocator* This,LONG *Rate) {
    return This->lpVtbl->get_SymbolRate(This,Rate);
}
static __WIDL_INLINE HRESULT IDigitalCableLocator_put_SymbolRate(IDigitalCableLocator* This,LONG Rate) {
    return This->lpVtbl->put_SymbolRate(This,Rate);
}
static __WIDL_INLINE HRESULT IDigitalCableLocator_Clone(IDigitalCableLocator* This,ILocator **NewLocator) {
    return This->lpVtbl->Clone(This,NewLocator);
}
/*** IATSCLocator methods ***/
static __WIDL_INLINE HRESULT IDigitalCableLocator_get_PhysicalChannel(IDigitalCableLocator* This,LONG *PhysicalChannel) {
    return This->lpVtbl->get_PhysicalChannel(This,PhysicalChannel);
}
static __WIDL_INLINE HRESULT IDigitalCableLocator_put_PhysicalChannel(IDigitalCableLocator* This,LONG PhysicalChannel) {
    return This->lpVtbl->put_PhysicalChannel(This,PhysicalChannel);
}
static __WIDL_INLINE HRESULT IDigitalCableLocator_get_TSID(IDigitalCableLocator* This,LONG *TSID) {
    return This->lpVtbl->get_TSID(This,TSID);
}
static __WIDL_INLINE HRESULT IDigitalCableLocator_put_TSID(IDigitalCableLocator* This,LONG TSID) {
    return This->lpVtbl->put_TSID(This,TSID);
}
/*** IATSCLocator2 methods ***/
static __WIDL_INLINE HRESULT IDigitalCableLocator_get_ProgramNumber(IDigitalCableLocator* This,LONG *ProgramNumber) {
    return This->lpVtbl->get_ProgramNumber(This,ProgramNumber);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDVBTLocator_QueryInterface(IDVBTLocator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDVBTLocator_AddRef(IDVBTLocator* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDVBTLocator_Release(IDVBTLocator* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IDVBTLocator_GetTypeInfoCount(IDVBTLocator* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IDVBTLocator_GetTypeInfo(IDVBTLocator* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDVBTLocator_get_CarrierFrequency(IDVBTLocator* This,LONG *Frequency) {
    return This->lpVtbl->get_CarrierFrequency(This,Frequency);
}
static __WIDL_INLINE HRESULT IDVBTLocator_put_CarrierFrequency(IDVBTLocator* This,LONG Frequency) {
    return This->lpVtbl->put_CarrierFrequency(This,Frequency);
}
static __WIDL_INLINE HRESULT IDVBTLocator_get_InnerFEC(IDVBTLocator* This,FECMethod *FEC) {
    return This->lpVtbl->get_InnerFEC(This,FEC);
}
static __WIDL_INLINE HRESULT IDVBTLocator_put_InnerFEC(IDVBTLocator* This,FECMethod FEC) {
    return This->lpVtbl->put_InnerFEC(This,FEC);
}
static __WIDL_INLINE HRESULT IDVBTLocator_get_InnerFECRate(IDVBTLocator* This,BinaryConvolutionCodeRate *FEC) {
    return This->lpVtbl->get_InnerFECRate(This,FEC);
}
static __WIDL_INLINE HRESULT IDVBTLocator_put_InnerFECRate(IDVBTLocator* This,BinaryConvolutionCodeRate FEC) {
    return This->lpVtbl->put_InnerFECRate(This,FEC);
}
static __WIDL_INLINE HRESULT IDVBTLocator_get_OuterFEC(IDVBTLocator* This,FECMethod *FEC) {
    return This->lpVtbl->get_OuterFEC(This,FEC);
}
static __WIDL_INLINE HRESULT IDVBTLocator_put_OuterFEC(IDVBTLocator* This,FECMethod FEC) {
    return This->lpVtbl->put_OuterFEC(This,FEC);
}
static __WIDL_INLINE HRESULT IDVBTLocator_get_OuterFECRate(IDVBTLocator* This,BinaryConvolutionCodeRate *FEC) {
    return This->lpVtbl->get_OuterFECRate(This,FEC);
}
static __WIDL_INLINE HRESULT IDVBTLocator_put_OuterFECRate(IDVBTLocator* This,BinaryConvolutionCodeRate FEC) {
    return This->lpVtbl->put_OuterFECRate(This,FEC);
}
static __WIDL_INLINE HRESULT IDVBTLocator_get_Modulation(IDVBTLocator* This,ModulationType *Modulation) {
    return This->lpVtbl->get_Modulation(This,Modulation);
}
static __WIDL_INLINE HRESULT IDVBTLocator_put_Modulation(IDVBTLocator* This,ModulationType Modulation) {
    return This->lpVtbl->put_Modulation(This,Modulation);
}
static __WIDL_INLINE HRESULT IDVBTLocator_get_SymbolRate(IDVBTLocator* This,LONG *Rate) {
    return This->lpVtbl->get_SymbolRate(This,Rate);
}
static __WIDL_INLINE HRESULT IDVBTLocator_put_SymbolRate(IDVBTLocator* This,LONG Rate) {
    return This->lpVtbl->put_SymbolRate(This,Rate);
}
static __WIDL_INLINE HRESULT IDVBTLocator_Clone(IDVBTLocator* This,ILocator **NewLocator) {
    return This->lpVtbl->Clone(This,NewLocator);
}
/*** IDVBTLocator methods ***/
static __WIDL_INLINE HRESULT IDVBTLocator_get_Bandwidth(IDVBTLocator* This,LONG *BandWidthVal) {
    return This->lpVtbl->get_Bandwidth(This,BandWidthVal);
}
static __WIDL_INLINE HRESULT IDVBTLocator_put_Bandwidth(IDVBTLocator* This,LONG BandwidthVal) {
    return This->lpVtbl->put_Bandwidth(This,BandwidthVal);
}
static __WIDL_INLINE HRESULT IDVBTLocator_get_LPInnerFEC(IDVBTLocator* This,FECMethod *FEC) {
    return This->lpVtbl->get_LPInnerFEC(This,FEC);
}
static __WIDL_INLINE HRESULT IDVBTLocator_put_LPInnerFEC(IDVBTLocator* This,FECMethod FEC) {
    return This->lpVtbl->put_LPInnerFEC(This,FEC);
}
static __WIDL_INLINE HRESULT IDVBTLocator_get_LPInnerFECRate(IDVBTLocator* This,BinaryConvolutionCodeRate *FEC) {
    return This->lpVtbl->get_LPInnerFECRate(This,FEC);
}
static __WIDL_INLINE HRESULT IDVBTLocator_put_LPInnerFECRate(IDVBTLocator* This,BinaryConvolutionCodeRate FEC) {
    return This->lpVtbl->put_LPInnerFECRate(This,FEC);
}
static __WIDL_INLINE HRESULT IDVBTLocator_get_HAlpha(IDVBTLocator* This,HierarchyAlpha *Alpha) {
    return This->lpVtbl->get_HAlpha(This,Alpha);
}
static __WIDL_INLINE HRESULT IDVBTLocator_put_HAlpha(IDVBTLocator* This,HierarchyAlpha Alpha) {
    return This->lpVtbl->put_HAlpha(This,Alpha);
}
static __WIDL_INLINE HRESULT IDVBTLocator_get_Guard(IDVBTLocator* This,GuardInterval *GI) {
    return This->lpVtbl->get_Guard(This,GI);
}
static __WIDL_INLINE HRESULT IDVBTLocator_put_Guard(IDVBTLocator* This,GuardInterval GI) {
    return This->lpVtbl->put_Guard(This,GI);
}
static __WIDL_INLINE HRESULT IDVBTLocator_get_Mode(IDVBTLocator* This,TransmissionMode *mode) {
    return This->lpVtbl->get_Mode(This,mode);
}
static __WIDL_INLINE HRESULT IDVBTLocator_put_Mode(IDVBTLocator* This,TransmissionMode mode) {
    return This->lpVtbl->put_Mode(This,mode);
}
static __WIDL_INLINE HRESULT IDVBTLocator_get_OtherFrequencyInUse(IDVBTLocator* This,VARIANT_BOOL *OtherFrequencyInUseVal) {
    return This->lpVtbl->get_OtherFrequencyInUse(This,OtherFrequencyInUseVal);
}
static __WIDL_INLINE HRESULT IDVBTLocator_put_OtherFrequencyInUse(IDVBTLocator* This,VARIANT_BOOL OtherFrequencyInUseVal) {
    return This->lpVtbl->put_OtherFrequencyInUse(This,OtherFrequencyInUseVal);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IDVBTLocator2_QueryInterface(IDVBTLocator2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDVBTLocator2_AddRef(IDVBTLocator2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDVBTLocator2_Release(IDVBTLocator2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IDVBTLocator2_GetTypeInfoCount(IDVBTLocator2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IDVBTLocator2_GetTypeInfo(IDVBTLocator2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDVBTLocator2_get_CarrierFrequency(IDVBTLocator2* This,LONG *Frequency) {
    return This->lpVtbl->get_CarrierFrequency(This,Frequency);
}
static __WIDL_INLINE HRESULT IDVBTLocator2_put_CarrierFrequency(IDVBTLocator2* This,LONG Frequency) {
    return This->lpVtbl->put_CarrierFrequency(This,Frequency);
}
static __WIDL_INLINE HRESULT IDVBTLocator2_get_InnerFEC(IDVBTLocator2* This,FECMethod *FEC) {
    return This->lpVtbl->get_InnerFEC(This,FEC);
}
static __WIDL_INLINE HRESULT IDVBTLocator2_put_InnerFEC(IDVBTLocator2* This,FECMethod FEC) {
    return This->lpVtbl->put_InnerFEC(This,FEC);
}
static __WIDL_INLINE HRESULT IDVBTLocator2_get_InnerFECRate(IDVBTLocator2* This,BinaryConvolutionCodeRate *FEC) {
    return This->lpVtbl->get_InnerFECRate(This,FEC);
}
static __WIDL_INLINE HRESULT IDVBTLocator2_put_InnerFECRate(IDVBTLocator2* This,BinaryConvolutionCodeRate FEC) {
    return This->lpVtbl->put_InnerFECRate(This,FEC);
}
static __WIDL_INLINE HRESULT IDVBTLocator2_get_OuterFEC(IDVBTLocator2* This,FECMethod *FEC) {
    return This->lpVtbl->get_OuterFEC(This,FEC);
}
static __WIDL_INLINE HRESULT IDVBTLocator2_put_OuterFEC(IDVBTLocator2* This,FECMethod FEC) {
    return This->lpVtbl->put_OuterFEC(This,FEC);
}
static __WIDL_INLINE HRESULT IDVBTLocator2_get_OuterFECRate(IDVBTLocator2* This,BinaryConvolutionCodeRate *FEC) {
    return This->lpVtbl->get_OuterFECRate(This,FEC);
}
static __WIDL_INLINE HRESULT IDVBTLocator2_put_OuterFECRate(IDVBTLocator2* This,BinaryConvolutionCodeRate FEC) {
    return This->lpVtbl->put_OuterFECRate(This,FEC);
}
static __WIDL_INLINE HRESULT IDVBTLocator2_get_Modulation(IDVBTLocator2* This,ModulationType *Modulation) {
    return This->lpVtbl->get_Modulation(This,Modulation);
}
static __WIDL_INLINE HRESULT IDVBTLocator2_put_Modulation(IDVBTLocator2* This,ModulationType Modulation) {
    return This->lpVtbl->put_Modulation(This,Modulation);
}
static __WIDL_INLINE HRESULT IDVBTLocator2_get_SymbolRate(IDVBTLocator2* This,LONG *Rate) {
    return This->lpVtbl->get_SymbolRate(This,Rate);
}
static __WIDL_INLINE HRESULT IDVBTLocator2_put_SymbolRate(IDVBTLocator2* This,LONG Rate) {
    return This->lpVtbl->put_SymbolRate(This,Rate);
}
static __WIDL_INLINE HRESULT IDVBTLocator2_Clone(IDVBTLocator2* This,ILocator **NewLocator) {
    return This->lpVtbl->Clone(This,NewLocator);
}
/*** IDVBTLocator methods ***/
static __WIDL_INLINE HRESULT IDVBTLocator2_get_Bandwidth(IDVBTLocator2* This,LONG *BandWidthVal) {
    return This->lpVtbl->get_Bandwidth(This,BandWidthVal);
}
static __WIDL_INLINE HRESULT IDVBTLocator2_put_Bandwidth(IDVBTLocator2* This,LONG BandwidthVal) {
    return This->lpVtbl->put_Bandwidth(This,BandwidthVal);
}
static __WIDL_INLINE HRESULT IDVBTLocator2_get_LPInnerFEC(IDVBTLocator2* This,FECMethod *FEC) {
    return This->lpVtbl->get_LPInnerFEC(This,FEC);
}
static __WIDL_INLINE HRESULT IDVBTLocator2_put_LPInnerFEC(IDVBTLocator2* This,FECMethod FEC) {
    return This->lpVtbl->put_LPInnerFEC(This,FEC);
}
static __WIDL_INLINE HRESULT IDVBTLocator2_get_LPInnerFECRate(IDVBTLocator2* This,BinaryConvolutionCodeRate *FEC) {
    return This->lpVtbl->get_LPInnerFECRate(This,FEC);
}
static __WIDL_INLINE HRESULT IDVBTLocator2_put_LPInnerFECRate(IDVBTLocator2* This,BinaryConvolutionCodeRate FEC) {
    return This->lpVtbl->put_LPInnerFECRate(This,FEC);
}
static __WIDL_INLINE HRESULT IDVBTLocator2_get_HAlpha(IDVBTLocator2* This,HierarchyAlpha *Alpha) {
    return This->lpVtbl->get_HAlpha(This,Alpha);
}
static __WIDL_INLINE HRESULT IDVBTLocator2_put_HAlpha(IDVBTLocator2* This,HierarchyAlpha Alpha) {
    return This->lpVtbl->put_HAlpha(This,Alpha);
}
static __WIDL_INLINE HRESULT IDVBTLocator2_get_Guard(IDVBTLocator2* This,GuardInterval *GI) {
    return This->lpVtbl->get_Guard(This,GI);
}
static __WIDL_INLINE HRESULT IDVBTLocator2_put_Guard(IDVBTLocator2* This,GuardInterval GI) {
    return This->lpVtbl->put_Guard(This,GI);
}
static __WIDL_INLINE HRESULT IDVBTLocator2_get_Mode(IDVBTLocator2* This,TransmissionMode *mode) {
    return This->lpVtbl->get_Mode(This,mode);
}
static __WIDL_INLINE HRESULT IDVBTLocator2_put_Mode(IDVBTLocator2* This,TransmissionMode mode) {
    return This->lpVtbl->put_Mode(This,mode);
}
static __WIDL_INLINE HRESULT IDVBTLocator2_get_OtherFrequencyInUse(IDVBTLocator2* This,VARIANT_BOOL *OtherFrequencyInUseVal) {
    return This->lpVtbl->get_OtherFrequencyInUse(This,OtherFrequencyInUseVal);
}
static __WIDL_INLINE HRESULT IDVBTLocator2_put_OtherFrequencyInUse(IDVBTLocator2* This,VARIANT_BOOL OtherFrequencyInUseVal) {
    return This->lpVtbl->put_OtherFrequencyInUse(This,OtherFrequencyInUseVal);
}
/*** IDVBTLocator2 methods ***/
static __WIDL_INLINE HRESULT IDVBTLocator2_get_PhysicalLayerPipeId(IDVBTLocator2* This,LONG *PhysicalLayerPipeIdVal) {
    return This->lpVtbl->get_PhysicalLayerPipeId(This,PhysicalLayerPipeIdVal);
}
static __WIDL_INLINE HRESULT IDVBTLocator2_put_PhysicalLayerPipeId(IDVBTLocator2* This,LONG PhysicalLayerPipeIdVal) {
    return This->lpVtbl->put_PhysicalLayerPipeId(This,PhysicalLayerPipeIdVal);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IDVBSLocator_QueryInterface(IDVBSLocator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDVBSLocator_AddRef(IDVBSLocator* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDVBSLocator_Release(IDVBSLocator* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IDVBSLocator_GetTypeInfoCount(IDVBSLocator* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IDVBSLocator_GetTypeInfo(IDVBSLocator* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDVBSLocator_get_CarrierFrequency(IDVBSLocator* This,LONG *Frequency) {
    return This->lpVtbl->get_CarrierFrequency(This,Frequency);
}
static __WIDL_INLINE HRESULT IDVBSLocator_put_CarrierFrequency(IDVBSLocator* This,LONG Frequency) {
    return This->lpVtbl->put_CarrierFrequency(This,Frequency);
}
static __WIDL_INLINE HRESULT IDVBSLocator_get_InnerFEC(IDVBSLocator* This,FECMethod *FEC) {
    return This->lpVtbl->get_InnerFEC(This,FEC);
}
static __WIDL_INLINE HRESULT IDVBSLocator_put_InnerFEC(IDVBSLocator* This,FECMethod FEC) {
    return This->lpVtbl->put_InnerFEC(This,FEC);
}
static __WIDL_INLINE HRESULT IDVBSLocator_get_InnerFECRate(IDVBSLocator* This,BinaryConvolutionCodeRate *FEC) {
    return This->lpVtbl->get_InnerFECRate(This,FEC);
}
static __WIDL_INLINE HRESULT IDVBSLocator_put_InnerFECRate(IDVBSLocator* This,BinaryConvolutionCodeRate FEC) {
    return This->lpVtbl->put_InnerFECRate(This,FEC);
}
static __WIDL_INLINE HRESULT IDVBSLocator_get_OuterFEC(IDVBSLocator* This,FECMethod *FEC) {
    return This->lpVtbl->get_OuterFEC(This,FEC);
}
static __WIDL_INLINE HRESULT IDVBSLocator_put_OuterFEC(IDVBSLocator* This,FECMethod FEC) {
    return This->lpVtbl->put_OuterFEC(This,FEC);
}
static __WIDL_INLINE HRESULT IDVBSLocator_get_OuterFECRate(IDVBSLocator* This,BinaryConvolutionCodeRate *FEC) {
    return This->lpVtbl->get_OuterFECRate(This,FEC);
}
static __WIDL_INLINE HRESULT IDVBSLocator_put_OuterFECRate(IDVBSLocator* This,BinaryConvolutionCodeRate FEC) {
    return This->lpVtbl->put_OuterFECRate(This,FEC);
}
static __WIDL_INLINE HRESULT IDVBSLocator_get_Modulation(IDVBSLocator* This,ModulationType *Modulation) {
    return This->lpVtbl->get_Modulation(This,Modulation);
}
static __WIDL_INLINE HRESULT IDVBSLocator_put_Modulation(IDVBSLocator* This,ModulationType Modulation) {
    return This->lpVtbl->put_Modulation(This,Modulation);
}
static __WIDL_INLINE HRESULT IDVBSLocator_get_SymbolRate(IDVBSLocator* This,LONG *Rate) {
    return This->lpVtbl->get_SymbolRate(This,Rate);
}
static __WIDL_INLINE HRESULT IDVBSLocator_put_SymbolRate(IDVBSLocator* This,LONG Rate) {
    return This->lpVtbl->put_SymbolRate(This,Rate);
}
static __WIDL_INLINE HRESULT IDVBSLocator_Clone(IDVBSLocator* This,ILocator **NewLocator) {
    return This->lpVtbl->Clone(This,NewLocator);
}
/*** IDVBSLocator methods ***/
static __WIDL_INLINE HRESULT IDVBSLocator_get_SignalPolarisation(IDVBSLocator* This,Polarisation *PolarisationVal) {
    return This->lpVtbl->get_SignalPolarisation(This,PolarisationVal);
}
static __WIDL_INLINE HRESULT IDVBSLocator_put_SignalPolarisation(IDVBSLocator* This,Polarisation PolarisationVal) {
    return This->lpVtbl->put_SignalPolarisation(This,PolarisationVal);
}
static __WIDL_INLINE HRESULT IDVBSLocator_get_WestPosition(IDVBSLocator* This,VARIANT_BOOL *WestLongitude) {
    return This->lpVtbl->get_WestPosition(This,WestLongitude);
}
static __WIDL_INLINE HRESULT IDVBSLocator_put_WestPosition(IDVBSLocator* This,VARIANT_BOOL WestLongitude) {
    return This->lpVtbl->put_WestPosition(This,WestLongitude);
}
static __WIDL_INLINE HRESULT IDVBSLocator_get_OrbitalPosition(IDVBSLocator* This,LONG *longitude) {
    return This->lpVtbl->get_OrbitalPosition(This,longitude);
}
static __WIDL_INLINE HRESULT IDVBSLocator_put_OrbitalPosition(IDVBSLocator* This,LONG longitude) {
    return This->lpVtbl->put_OrbitalPosition(This,longitude);
}
static __WIDL_INLINE HRESULT IDVBSLocator_get_Azimuth(IDVBSLocator* This,LONG *Azimuth) {
    return This->lpVtbl->get_Azimuth(This,Azimuth);
}
static __WIDL_INLINE HRESULT IDVBSLocator_put_Azimuth(IDVBSLocator* This,LONG Azimuth) {
    return This->lpVtbl->put_Azimuth(This,Azimuth);
}
static __WIDL_INLINE HRESULT IDVBSLocator_get_Elevation(IDVBSLocator* This,LONG *Elevation) {
    return This->lpVtbl->get_Elevation(This,Elevation);
}
static __WIDL_INLINE HRESULT IDVBSLocator_put_Elevation(IDVBSLocator* This,LONG Elevation) {
    return This->lpVtbl->put_Elevation(This,Elevation);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IDVBSLocator2_QueryInterface(IDVBSLocator2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDVBSLocator2_AddRef(IDVBSLocator2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDVBSLocator2_Release(IDVBSLocator2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IDVBSLocator2_GetTypeInfoCount(IDVBSLocator2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IDVBSLocator2_GetTypeInfo(IDVBSLocator2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDVBSLocator2_get_CarrierFrequency(IDVBSLocator2* This,LONG *Frequency) {
    return This->lpVtbl->get_CarrierFrequency(This,Frequency);
}
static __WIDL_INLINE HRESULT IDVBSLocator2_put_CarrierFrequency(IDVBSLocator2* This,LONG Frequency) {
    return This->lpVtbl->put_CarrierFrequency(This,Frequency);
}
static __WIDL_INLINE HRESULT IDVBSLocator2_get_InnerFEC(IDVBSLocator2* This,FECMethod *FEC) {
    return This->lpVtbl->get_InnerFEC(This,FEC);
}
static __WIDL_INLINE HRESULT IDVBSLocator2_put_InnerFEC(IDVBSLocator2* This,FECMethod FEC) {
    return This->lpVtbl->put_InnerFEC(This,FEC);
}
static __WIDL_INLINE HRESULT IDVBSLocator2_get_InnerFECRate(IDVBSLocator2* This,BinaryConvolutionCodeRate *FEC) {
    return This->lpVtbl->get_InnerFECRate(This,FEC);
}
static __WIDL_INLINE HRESULT IDVBSLocator2_put_InnerFECRate(IDVBSLocator2* This,BinaryConvolutionCodeRate FEC) {
    return This->lpVtbl->put_InnerFECRate(This,FEC);
}
static __WIDL_INLINE HRESULT IDVBSLocator2_get_OuterFEC(IDVBSLocator2* This,FECMethod *FEC) {
    return This->lpVtbl->get_OuterFEC(This,FEC);
}
static __WIDL_INLINE HRESULT IDVBSLocator2_put_OuterFEC(IDVBSLocator2* This,FECMethod FEC) {
    return This->lpVtbl->put_OuterFEC(This,FEC);
}
static __WIDL_INLINE HRESULT IDVBSLocator2_get_OuterFECRate(IDVBSLocator2* This,BinaryConvolutionCodeRate *FEC) {
    return This->lpVtbl->get_OuterFECRate(This,FEC);
}
static __WIDL_INLINE HRESULT IDVBSLocator2_put_OuterFECRate(IDVBSLocator2* This,BinaryConvolutionCodeRate FEC) {
    return This->lpVtbl->put_OuterFECRate(This,FEC);
}
static __WIDL_INLINE HRESULT IDVBSLocator2_get_Modulation(IDVBSLocator2* This,ModulationType *Modulation) {
    return This->lpVtbl->get_Modulation(This,Modulation);
}
static __WIDL_INLINE HRESULT IDVBSLocator2_put_Modulation(IDVBSLocator2* This,ModulationType Modulation) {
    return This->lpVtbl->put_Modulation(This,Modulation);
}
static __WIDL_INLINE HRESULT IDVBSLocator2_get_SymbolRate(IDVBSLocator2* This,LONG *Rate) {
    return This->lpVtbl->get_SymbolRate(This,Rate);
}
static __WIDL_INLINE HRESULT IDVBSLocator2_put_SymbolRate(IDVBSLocator2* This,LONG Rate) {
    return This->lpVtbl->put_SymbolRate(This,Rate);
}
static __WIDL_INLINE HRESULT IDVBSLocator2_Clone(IDVBSLocator2* This,ILocator **NewLocator) {
    return This->lpVtbl->Clone(This,NewLocator);
}
/*** IDVBSLocator methods ***/
static __WIDL_INLINE HRESULT IDVBSLocator2_get_SignalPolarisation(IDVBSLocator2* This,Polarisation *PolarisationVal) {
    return This->lpVtbl->get_SignalPolarisation(This,PolarisationVal);
}
static __WIDL_INLINE HRESULT IDVBSLocator2_put_SignalPolarisation(IDVBSLocator2* This,Polarisation PolarisationVal) {
    return This->lpVtbl->put_SignalPolarisation(This,PolarisationVal);
}
static __WIDL_INLINE HRESULT IDVBSLocator2_get_WestPosition(IDVBSLocator2* This,VARIANT_BOOL *WestLongitude) {
    return This->lpVtbl->get_WestPosition(This,WestLongitude);
}
static __WIDL_INLINE HRESULT IDVBSLocator2_put_WestPosition(IDVBSLocator2* This,VARIANT_BOOL WestLongitude) {
    return This->lpVtbl->put_WestPosition(This,WestLongitude);
}
static __WIDL_INLINE HRESULT IDVBSLocator2_get_OrbitalPosition(IDVBSLocator2* This,LONG *longitude) {
    return This->lpVtbl->get_OrbitalPosition(This,longitude);
}
static __WIDL_INLINE HRESULT IDVBSLocator2_put_OrbitalPosition(IDVBSLocator2* This,LONG longitude) {
    return This->lpVtbl->put_OrbitalPosition(This,longitude);
}
static __WIDL_INLINE HRESULT IDVBSLocator2_get_Azimuth(IDVBSLocator2* This,LONG *Azimuth) {
    return This->lpVtbl->get_Azimuth(This,Azimuth);
}
static __WIDL_INLINE HRESULT IDVBSLocator2_put_Azimuth(IDVBSLocator2* This,LONG Azimuth) {
    return This->lpVtbl->put_Azimuth(This,Azimuth);
}
static __WIDL_INLINE HRESULT IDVBSLocator2_get_Elevation(IDVBSLocator2* This,LONG *Elevation) {
    return This->lpVtbl->get_Elevation(This,Elevation);
}
static __WIDL_INLINE HRESULT IDVBSLocator2_put_Elevation(IDVBSLocator2* This,LONG Elevation) {
    return This->lpVtbl->put_Elevation(This,Elevation);
}
/*** IDVBSLocator2 methods ***/
static __WIDL_INLINE HRESULT IDVBSLocator2_get_DiseqLNBSource(IDVBSLocator2* This,LNB_Source *DiseqLNBSourceVal) {
    return This->lpVtbl->get_DiseqLNBSource(This,DiseqLNBSourceVal);
}
static __WIDL_INLINE HRESULT IDVBSLocator2_put_DiseqLNBSource(IDVBSLocator2* This,LNB_Source DiseqLNBSourceVal) {
    return This->lpVtbl->put_DiseqLNBSource(This,DiseqLNBSourceVal);
}
static __WIDL_INLINE HRESULT IDVBSLocator2_get_LocalOscillatorOverrideLow(IDVBSLocator2* This,LONG *LocalOscillatorOverrideLowVal) {
    return This->lpVtbl->get_LocalOscillatorOverrideLow(This,LocalOscillatorOverrideLowVal);
}
static __WIDL_INLINE HRESULT IDVBSLocator2_put_LocalOscillatorOverrideLow(IDVBSLocator2* This,LONG LocalOscillatorOverrideLowVal) {
    return This->lpVtbl->put_LocalOscillatorOverrideLow(This,LocalOscillatorOverrideLowVal);
}
static __WIDL_INLINE HRESULT IDVBSLocator2_get_LocalOscillatorOverrideHigh(IDVBSLocator2* This,LONG *LocalOscillatorOverrideHighVal) {
    return This->lpVtbl->get_LocalOscillatorOverrideHigh(This,LocalOscillatorOverrideHighVal);
}
static __WIDL_INLINE HRESULT IDVBSLocator2_put_LocalOscillatorOverrideHigh(IDVBSLocator2* This,LONG LocalOscillatorOverrideHighVal) {
    return This->lpVtbl->put_LocalOscillatorOverrideHigh(This,LocalOscillatorOverrideHighVal);
}
static __WIDL_INLINE HRESULT IDVBSLocator2_get_LocalLNBSwitchOverride(IDVBSLocator2* This,LONG *LocalLNBSwitchOverrideVal) {
    return This->lpVtbl->get_LocalLNBSwitchOverride(This,LocalLNBSwitchOverrideVal);
}
static __WIDL_INLINE HRESULT IDVBSLocator2_put_LocalLNBSwitchOverride(IDVBSLocator2* This,LONG LocalLNBSwitchOverrideVal) {
    return This->lpVtbl->put_LocalLNBSwitchOverride(This,LocalLNBSwitchOverrideVal);
}
static __WIDL_INLINE HRESULT IDVBSLocator2_get_LocalSpectralInversionOverride(IDVBSLocator2* This,SpectralInversion *LocalSpectralInversionOverrideVal) {
    return This->lpVtbl->get_LocalSpectralInversionOverride(This,LocalSpectralInversionOverrideVal);
}
static __WIDL_INLINE HRESULT IDVBSLocator2_put_LocalSpectralInversionOverride(IDVBSLocator2* This,SpectralInversion LocalSpectralInversionOverrideVal) {
    return This->lpVtbl->put_LocalSpectralInversionOverride(This,LocalSpectralInversionOverrideVal);
}
static __WIDL_INLINE HRESULT IDVBSLocator2_get_SignalRollOff(IDVBSLocator2* This,RollOff *RollOffVal) {
    return This->lpVtbl->get_SignalRollOff(This,RollOffVal);
}
static __WIDL_INLINE HRESULT IDVBSLocator2_put_SignalRollOff(IDVBSLocator2* This,RollOff RollOffVal) {
    return This->lpVtbl->put_SignalRollOff(This,RollOffVal);
}
static __WIDL_INLINE HRESULT IDVBSLocator2_get_SignalPilot(IDVBSLocator2* This,Pilot *PilotVal) {
    return This->lpVtbl->get_SignalPilot(This,PilotVal);
}
static __WIDL_INLINE HRESULT IDVBSLocator2_put_SignalPilot(IDVBSLocator2* This,Pilot PilotVal) {
    return This->lpVtbl->put_SignalPilot(This,PilotVal);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IDVBCLocator_QueryInterface(IDVBCLocator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDVBCLocator_AddRef(IDVBCLocator* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDVBCLocator_Release(IDVBCLocator* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IDVBCLocator_GetTypeInfoCount(IDVBCLocator* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IDVBCLocator_GetTypeInfo(IDVBCLocator* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDVBCLocator_get_CarrierFrequency(IDVBCLocator* This,LONG *Frequency) {
    return This->lpVtbl->get_CarrierFrequency(This,Frequency);
}
static __WIDL_INLINE HRESULT IDVBCLocator_put_CarrierFrequency(IDVBCLocator* This,LONG Frequency) {
    return This->lpVtbl->put_CarrierFrequency(This,Frequency);
}
static __WIDL_INLINE HRESULT IDVBCLocator_get_InnerFEC(IDVBCLocator* This,FECMethod *FEC) {
    return This->lpVtbl->get_InnerFEC(This,FEC);
}
static __WIDL_INLINE HRESULT IDVBCLocator_put_InnerFEC(IDVBCLocator* This,FECMethod FEC) {
    return This->lpVtbl->put_InnerFEC(This,FEC);
}
static __WIDL_INLINE HRESULT IDVBCLocator_get_InnerFECRate(IDVBCLocator* This,BinaryConvolutionCodeRate *FEC) {
    return This->lpVtbl->get_InnerFECRate(This,FEC);
}
static __WIDL_INLINE HRESULT IDVBCLocator_put_InnerFECRate(IDVBCLocator* This,BinaryConvolutionCodeRate FEC) {
    return This->lpVtbl->put_InnerFECRate(This,FEC);
}
static __WIDL_INLINE HRESULT IDVBCLocator_get_OuterFEC(IDVBCLocator* This,FECMethod *FEC) {
    return This->lpVtbl->get_OuterFEC(This,FEC);
}
static __WIDL_INLINE HRESULT IDVBCLocator_put_OuterFEC(IDVBCLocator* This,FECMethod FEC) {
    return This->lpVtbl->put_OuterFEC(This,FEC);
}
static __WIDL_INLINE HRESULT IDVBCLocator_get_OuterFECRate(IDVBCLocator* This,BinaryConvolutionCodeRate *FEC) {
    return This->lpVtbl->get_OuterFECRate(This,FEC);
}
static __WIDL_INLINE HRESULT IDVBCLocator_put_OuterFECRate(IDVBCLocator* This,BinaryConvolutionCodeRate FEC) {
    return This->lpVtbl->put_OuterFECRate(This,FEC);
}
static __WIDL_INLINE HRESULT IDVBCLocator_get_Modulation(IDVBCLocator* This,ModulationType *Modulation) {
    return This->lpVtbl->get_Modulation(This,Modulation);
}
static __WIDL_INLINE HRESULT IDVBCLocator_put_Modulation(IDVBCLocator* This,ModulationType Modulation) {
    return This->lpVtbl->put_Modulation(This,Modulation);
}
static __WIDL_INLINE HRESULT IDVBCLocator_get_SymbolRate(IDVBCLocator* This,LONG *Rate) {
    return This->lpVtbl->get_SymbolRate(This,Rate);
}
static __WIDL_INLINE HRESULT IDVBCLocator_put_SymbolRate(IDVBCLocator* This,LONG Rate) {
    return This->lpVtbl->put_SymbolRate(This,Rate);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IISDBSLocator_QueryInterface(IISDBSLocator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IISDBSLocator_AddRef(IISDBSLocator* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IISDBSLocator_Release(IISDBSLocator* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IISDBSLocator_GetTypeInfoCount(IISDBSLocator* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IISDBSLocator_GetTypeInfo(IISDBSLocator* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IISDBSLocator_get_CarrierFrequency(IISDBSLocator* This,LONG *Frequency) {
    return This->lpVtbl->get_CarrierFrequency(This,Frequency);
}
static __WIDL_INLINE HRESULT IISDBSLocator_put_CarrierFrequency(IISDBSLocator* This,LONG Frequency) {
    return This->lpVtbl->put_CarrierFrequency(This,Frequency);
}
static __WIDL_INLINE HRESULT IISDBSLocator_get_InnerFEC(IISDBSLocator* This,FECMethod *FEC) {
    return This->lpVtbl->get_InnerFEC(This,FEC);
}
static __WIDL_INLINE HRESULT IISDBSLocator_put_InnerFEC(IISDBSLocator* This,FECMethod FEC) {
    return This->lpVtbl->put_InnerFEC(This,FEC);
}
static __WIDL_INLINE HRESULT IISDBSLocator_get_InnerFECRate(IISDBSLocator* This,BinaryConvolutionCodeRate *FEC) {
    return This->lpVtbl->get_InnerFECRate(This,FEC);
}
static __WIDL_INLINE HRESULT IISDBSLocator_put_InnerFECRate(IISDBSLocator* This,BinaryConvolutionCodeRate FEC) {
    return This->lpVtbl->put_InnerFECRate(This,FEC);
}
static __WIDL_INLINE HRESULT IISDBSLocator_get_OuterFEC(IISDBSLocator* This,FECMethod *FEC) {
    return This->lpVtbl->get_OuterFEC(This,FEC);
}
static __WIDL_INLINE HRESULT IISDBSLocator_put_OuterFEC(IISDBSLocator* This,FECMethod FEC) {
    return This->lpVtbl->put_OuterFEC(This,FEC);
}
static __WIDL_INLINE HRESULT IISDBSLocator_get_OuterFECRate(IISDBSLocator* This,BinaryConvolutionCodeRate *FEC) {
    return This->lpVtbl->get_OuterFECRate(This,FEC);
}
static __WIDL_INLINE HRESULT IISDBSLocator_put_OuterFECRate(IISDBSLocator* This,BinaryConvolutionCodeRate FEC) {
    return This->lpVtbl->put_OuterFECRate(This,FEC);
}
static __WIDL_INLINE HRESULT IISDBSLocator_get_Modulation(IISDBSLocator* This,ModulationType *Modulation) {
    return This->lpVtbl->get_Modulation(This,Modulation);
}
static __WIDL_INLINE HRESULT IISDBSLocator_put_Modulation(IISDBSLocator* This,ModulationType Modulation) {
    return This->lpVtbl->put_Modulation(This,Modulation);
}
static __WIDL_INLINE HRESULT IISDBSLocator_get_SymbolRate(IISDBSLocator* This,LONG *Rate) {
    return This->lpVtbl->get_SymbolRate(This,Rate);
}
static __WIDL_INLINE HRESULT IISDBSLocator_put_SymbolRate(IISDBSLocator* This,LONG Rate) {
    return This->lpVtbl->put_SymbolRate(This,Rate);
}
static __WIDL_INLINE HRESULT IISDBSLocator_Clone(IISDBSLocator* This,ILocator **NewLocator) {
    return This->lpVtbl->Clone(This,NewLocator);
}
/*** IDVBSLocator methods ***/
static __WIDL_INLINE HRESULT IISDBSLocator_get_SignalPolarisation(IISDBSLocator* This,Polarisation *PolarisationVal) {
    return This->lpVtbl->get_SignalPolarisation(This,PolarisationVal);
}
static __WIDL_INLINE HRESULT IISDBSLocator_put_SignalPolarisation(IISDBSLocator* This,Polarisation PolarisationVal) {
    return This->lpVtbl->put_SignalPolarisation(This,PolarisationVal);
}
static __WIDL_INLINE HRESULT IISDBSLocator_get_WestPosition(IISDBSLocator* This,VARIANT_BOOL *WestLongitude) {
    return This->lpVtbl->get_WestPosition(This,WestLongitude);
}
static __WIDL_INLINE HRESULT IISDBSLocator_put_WestPosition(IISDBSLocator* This,VARIANT_BOOL WestLongitude) {
    return This->lpVtbl->put_WestPosition(This,WestLongitude);
}
static __WIDL_INLINE HRESULT IISDBSLocator_get_OrbitalPosition(IISDBSLocator* This,LONG *longitude) {
    return This->lpVtbl->get_OrbitalPosition(This,longitude);
}
static __WIDL_INLINE HRESULT IISDBSLocator_put_OrbitalPosition(IISDBSLocator* This,LONG longitude) {
    return This->lpVtbl->put_OrbitalPosition(This,longitude);
}
static __WIDL_INLINE HRESULT IISDBSLocator_get_Azimuth(IISDBSLocator* This,LONG *Azimuth) {
    return This->lpVtbl->get_Azimuth(This,Azimuth);
}
static __WIDL_INLINE HRESULT IISDBSLocator_put_Azimuth(IISDBSLocator* This,LONG Azimuth) {
    return This->lpVtbl->put_Azimuth(This,Azimuth);
}
static __WIDL_INLINE HRESULT IISDBSLocator_get_Elevation(IISDBSLocator* This,LONG *Elevation) {
    return This->lpVtbl->get_Elevation(This,Elevation);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IESEvent_QueryInterface(IESEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IESEvent_AddRef(IESEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IESEvent_Release(IESEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IESEvent methods ***/
static __WIDL_INLINE HRESULT IESEvent_GetEventId(IESEvent* This,DWORD *pdwEventId) {
    return This->lpVtbl->GetEventId(This,pdwEventId);
}
static __WIDL_INLINE HRESULT IESEvent_GetEventType(IESEvent* This,GUID *pguidEventType) {
    return This->lpVtbl->GetEventType(This,pguidEventType);
}
static __WIDL_INLINE HRESULT IESEvent_SetCompletionStatus(IESEvent* This,DWORD dwResult) {
    return This->lpVtbl->SetCompletionStatus(This,dwResult);
}
static __WIDL_INLINE HRESULT IESEvent_GetData(IESEvent* This,SAFEARRAY **pbData) {
    return This->lpVtbl->GetData(This,pbData);
}
static __WIDL_INLINE HRESULT IESEvent_GetStringData(IESEvent* This,BSTR *pbstrData) {
    return This->lpVtbl->GetStringData(This,pbstrData);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IESOpenMmiEvent_QueryInterface(IESOpenMmiEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IESOpenMmiEvent_AddRef(IESOpenMmiEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IESOpenMmiEvent_Release(IESOpenMmiEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IESEvent methods ***/
static __WIDL_INLINE HRESULT IESOpenMmiEvent_GetEventId(IESOpenMmiEvent* This,DWORD *pdwEventId) {
    return This->lpVtbl->GetEventId(This,pdwEventId);
}
static __WIDL_INLINE HRESULT IESOpenMmiEvent_GetEventType(IESOpenMmiEvent* This,GUID *pguidEventType) {
    return This->lpVtbl->GetEventType(This,pguidEventType);
}
static __WIDL_INLINE HRESULT IESOpenMmiEvent_SetCompletionStatus(IESOpenMmiEvent* This,DWORD dwResult) {
    return This->lpVtbl->SetCompletionStatus(This,dwResult);
}
static __WIDL_INLINE HRESULT IESOpenMmiEvent_GetData(IESOpenMmiEvent* This,SAFEARRAY **pbData) {
    return This->lpVtbl->GetData(This,pbData);
}
static __WIDL_INLINE HRESULT IESOpenMmiEvent_GetStringData(IESOpenMmiEvent* This,BSTR *pbstrData) {
    return This->lpVtbl->GetStringData(This,pbstrData);
}
/*** IESOpenMmiEvent methods ***/
static __WIDL_INLINE HRESULT IESOpenMmiEvent_GetDialogNumber(IESOpenMmiEvent* This,DWORD *pDialogRequest,DWORD *pDialogNumber) {
    return This->lpVtbl->GetDialogNumber(This,pDialogRequest,pDialogNumber);
}
static __WIDL_INLINE HRESULT IESOpenMmiEvent_GetDialogType(IESOpenMmiEvent* This,GUID *guidDialogType) {
    return This->lpVtbl->GetDialogType(This,guidDialogType);
}
static __WIDL_INLINE HRESULT IESOpenMmiEvent_GetDialogData(IESOpenMmiEvent* This,SAFEARRAY **pbData) {
    return This->lpVtbl->GetDialogData(This,pbData);
}
static __WIDL_INLINE HRESULT IESOpenMmiEvent_GetDialogStringData(IESOpenMmiEvent* This,BSTR *pbstrBaseUrl,BSTR *pbstrData) {
    return This->lpVtbl->GetDialogStringData(This,pbstrBaseUrl,pbstrData);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IESCloseMmiEvent_QueryInterface(IESCloseMmiEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IESCloseMmiEvent_AddRef(IESCloseMmiEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IESCloseMmiEvent_Release(IESCloseMmiEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IESEvent methods ***/
static __WIDL_INLINE HRESULT IESCloseMmiEvent_GetEventId(IESCloseMmiEvent* This,DWORD *pdwEventId) {
    return This->lpVtbl->GetEventId(This,pdwEventId);
}
static __WIDL_INLINE HRESULT IESCloseMmiEvent_GetEventType(IESCloseMmiEvent* This,GUID *pguidEventType) {
    return This->lpVtbl->GetEventType(This,pguidEventType);
}
static __WIDL_INLINE HRESULT IESCloseMmiEvent_SetCompletionStatus(IESCloseMmiEvent* This,DWORD dwResult) {
    return This->lpVtbl->SetCompletionStatus(This,dwResult);
}
static __WIDL_INLINE HRESULT IESCloseMmiEvent_GetData(IESCloseMmiEvent* This,SAFEARRAY **pbData) {
    return This->lpVtbl->GetData(This,pbData);
}
static __WIDL_INLINE HRESULT IESCloseMmiEvent_GetStringData(IESCloseMmiEvent* This,BSTR *pbstrData) {
    return This->lpVtbl->GetStringData(This,pbstrData);
}
/*** IESCloseMmiEvent methods ***/
static __WIDL_INLINE HRESULT IESCloseMmiEvent_GetDialogNumber(IESCloseMmiEvent* This,DWORD *pDialogNumber) {
    return This->lpVtbl->GetDialogNumber(This,pDialogNumber);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IESValueUpdatedEvent_QueryInterface(IESValueUpdatedEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IESValueUpdatedEvent_AddRef(IESValueUpdatedEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IESValueUpdatedEvent_Release(IESValueUpdatedEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IESEvent methods ***/
static __WIDL_INLINE HRESULT IESValueUpdatedEvent_GetEventId(IESValueUpdatedEvent* This,DWORD *pdwEventId) {
    return This->lpVtbl->GetEventId(This,pdwEventId);
}
static __WIDL_INLINE HRESULT IESValueUpdatedEvent_GetEventType(IESValueUpdatedEvent* This,GUID *pguidEventType) {
    return This->lpVtbl->GetEventType(This,pguidEventType);
}
static __WIDL_INLINE HRESULT IESValueUpdatedEvent_SetCompletionStatus(IESValueUpdatedEvent* This,DWORD dwResult) {
    return This->lpVtbl->SetCompletionStatus(This,dwResult);
}
static __WIDL_INLINE HRESULT IESValueUpdatedEvent_GetData(IESValueUpdatedEvent* This,SAFEARRAY **pbData) {
    return This->lpVtbl->GetData(This,pbData);
}
static __WIDL_INLINE HRESULT IESValueUpdatedEvent_GetStringData(IESValueUpdatedEvent* This,BSTR *pbstrData) {
    return This->lpVtbl->GetStringData(This,pbstrData);
}
/*** IESValueUpdatedEvent methods ***/
static __WIDL_INLINE HRESULT IESValueUpdatedEvent_GetValueNames(IESValueUpdatedEvent* This,SAFEARRAY **pbstrNames) {
    return This->lpVtbl->GetValueNames(This,pbstrNames);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IESRequestTunerEvent_QueryInterface(IESRequestTunerEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IESRequestTunerEvent_AddRef(IESRequestTunerEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IESRequestTunerEvent_Release(IESRequestTunerEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IESEvent methods ***/
static __WIDL_INLINE HRESULT IESRequestTunerEvent_GetEventId(IESRequestTunerEvent* This,DWORD *pdwEventId) {
    return This->lpVtbl->GetEventId(This,pdwEventId);
}
static __WIDL_INLINE HRESULT IESRequestTunerEvent_GetEventType(IESRequestTunerEvent* This,GUID *pguidEventType) {
    return This->lpVtbl->GetEventType(This,pguidEventType);
}
static __WIDL_INLINE HRESULT IESRequestTunerEvent_SetCompletionStatus(IESRequestTunerEvent* This,DWORD dwResult) {
    return This->lpVtbl->SetCompletionStatus(This,dwResult);
}
static __WIDL_INLINE HRESULT IESRequestTunerEvent_GetData(IESRequestTunerEvent* This,SAFEARRAY **pbData) {
    return This->lpVtbl->GetData(This,pbData);
}
static __WIDL_INLINE HRESULT IESRequestTunerEvent_GetStringData(IESRequestTunerEvent* This,BSTR *pbstrData) {
    return This->lpVtbl->GetStringData(This,pbstrData);
}
/*** IESRequestTunerEvent methods ***/
static __WIDL_INLINE HRESULT IESRequestTunerEvent_GetPriority(IESRequestTunerEvent* This,BYTE *pbyPriority) {
    return This->lpVtbl->GetPriority(This,pbyPriority);
}
static __WIDL_INLINE HRESULT IESRequestTunerEvent_GetReason(IESRequestTunerEvent* This,BYTE *pbyReason) {
    return This->lpVtbl->GetReason(This,pbyReason);
}
static __WIDL_INLINE HRESULT IESRequestTunerEvent_GetConsequences(IESRequestTunerEvent* This,BYTE *pbyConsequences) {
    return This->lpVtbl->GetConsequences(This,pbyConsequences);
}
static __WIDL_INLINE HRESULT IESRequestTunerEvent_GetEstimatedTime(IESRequestTunerEvent* This,DWORD *pdwEstimatedTime) {
    return This->lpVtbl->GetEstimatedTime(This,pdwEstimatedTime);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IESIsdbCasResponseEvent_QueryInterface(IESIsdbCasResponseEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IESIsdbCasResponseEvent_AddRef(IESIsdbCasResponseEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IESIsdbCasResponseEvent_Release(IESIsdbCasResponseEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IESEvent methods ***/
static __WIDL_INLINE HRESULT IESIsdbCasResponseEvent_GetEventId(IESIsdbCasResponseEvent* This,DWORD *pdwEventId) {
    return This->lpVtbl->GetEventId(This,pdwEventId);
}
static __WIDL_INLINE HRESULT IESIsdbCasResponseEvent_GetEventType(IESIsdbCasResponseEvent* This,GUID *pguidEventType) {
    return This->lpVtbl->GetEventType(This,pguidEventType);
}
static __WIDL_INLINE HRESULT IESIsdbCasResponseEvent_SetCompletionStatus(IESIsdbCasResponseEvent* This,DWORD dwResult) {
    return This->lpVtbl->SetCompletionStatus(This,dwResult);
}
static __WIDL_INLINE HRESULT IESIsdbCasResponseEvent_GetData(IESIsdbCasResponseEvent* This,SAFEARRAY **pbData) {
    return This->lpVtbl->GetData(This,pbData);
}
static __WIDL_INLINE HRESULT IESIsdbCasResponseEvent_GetStringData(IESIsdbCasResponseEvent* This,BSTR *pbstrData) {
    return This->lpVtbl->GetStringData(This,pbstrData);
}
/*** IESIsdbCasResponseEvent methods ***/
static __WIDL_INLINE HRESULT IESIsdbCasResponseEvent_GetRequestId(IESIsdbCasResponseEvent* This,DWORD *pRequestId) {
    return This->lpVtbl->GetRequestId(This,pRequestId);
}
static __WIDL_INLINE HRESULT IESIsdbCasResponseEvent_GetStatus(IESIsdbCasResponseEvent* This,DWORD *pStatus) {
    return This->lpVtbl->GetStatus(This,pStatus);
}
static __WIDL_INLINE HRESULT IESIsdbCasResponseEvent_GetDataLength(IESIsdbCasResponseEvent* This,DWORD *pRequestLength) {
    return This->lpVtbl->GetDataLength(This,pRequestLength);
}
static __WIDL_INLINE HRESULT IESIsdbCasResponseEvent_GetResponseData(IESIsdbCasResponseEvent* This,SAFEARRAY **pbData) {
    return This->lpVtbl->GetResponseData(This,pbData);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IGpnvsCommonBase_QueryInterface(IGpnvsCommonBase* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IGpnvsCommonBase_AddRef(IGpnvsCommonBase* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IGpnvsCommonBase_Release(IGpnvsCommonBase* This) {
    return This->lpVtbl->Release(This);
}
/*** IGpnvsCommonBase methods ***/
static __WIDL_INLINE HRESULT IGpnvsCommonBase_GetValueUpdateName(IGpnvsCommonBase* This,BSTR *pbstrName) {
    return This->lpVtbl->GetValueUpdateName(This,pbstrName);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IESEventFactory_QueryInterface(IESEventFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IESEventFactory_AddRef(IESEventFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IESEventFactory_Release(IESEventFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IESEventFactory methods ***/
static __WIDL_INLINE 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


#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 __WIDL_INLINE HRESULT IESLicenseRenewalResultEvent_QueryInterface(IESLicenseRenewalResultEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IESLicenseRenewalResultEvent_AddRef(IESLicenseRenewalResultEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IESLicenseRenewalResultEvent_Release(IESLicenseRenewalResultEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IESEvent methods ***/
static __WIDL_INLINE HRESULT IESLicenseRenewalResultEvent_GetEventId(IESLicenseRenewalResultEvent* This,DWORD *pdwEventId) {
    return This->lpVtbl->GetEventId(This,pdwEventId);
}
static __WIDL_INLINE HRESULT IESLicenseRenewalResultEvent_GetEventType(IESLicenseRenewalResultEvent* This,GUID *pguidEventType) {
    return This->lpVtbl->GetEventType(This,pguidEventType);
}
static __WIDL_INLINE HRESULT IESLicenseRenewalResultEvent_SetCompletionStatus(IESLicenseRenewalResultEvent* This,DWORD dwResult) {
    return This->lpVtbl->SetCompletionStatus(This,dwResult);
}
static __WIDL_INLINE HRESULT IESLicenseRenewalResultEvent_GetData(IESLicenseRenewalResultEvent* This,SAFEARRAY **pbData) {
    return This->lpVtbl->GetData(This,pbData);
}
static __WIDL_INLINE HRESULT IESLicenseRenewalResultEvent_GetStringData(IESLicenseRenewalResultEvent* This,BSTR *pbstrData) {
    return This->lpVtbl->GetStringData(This,pbstrData);
}
/*** IESLicenseRenewalResultEvent methods ***/
static __WIDL_INLINE HRESULT IESLicenseRenewalResultEvent_GetCallersId(IESLicenseRenewalResultEvent* This,DWORD *pdwCallersId) {
    return This->lpVtbl->GetCallersId(This,pdwCallersId);
}
static __WIDL_INLINE HRESULT IESLicenseRenewalResultEvent_GetFileName(IESLicenseRenewalResultEvent* This,BSTR *pbstrFilename) {
    return This->lpVtbl->GetFileName(This,pbstrFilename);
}
static __WIDL_INLINE HRESULT IESLicenseRenewalResultEvent_IsRenewalSuccessful(IESLicenseRenewalResultEvent* This,WINBOOL *pfRenewalSuccessful) {
    return This->lpVtbl->IsRenewalSuccessful(This,pfRenewalSuccessful);
}
static __WIDL_INLINE HRESULT IESLicenseRenewalResultEvent_IsCheckEntitlementCallRequired(IESLicenseRenewalResultEvent* This,WINBOOL *pfCheckEntTokenCallNeeded) {
    return This->lpVtbl->IsCheckEntitlementCallRequired(This,pfCheckEntTokenCallNeeded);
}
static __WIDL_INLINE HRESULT IESLicenseRenewalResultEvent_GetDescrambledStatus(IESLicenseRenewalResultEvent* This,DWORD *pDescrambledStatus) {
    return This->lpVtbl->GetDescrambledStatus(This,pDescrambledStatus);
}
static __WIDL_INLINE HRESULT IESLicenseRenewalResultEvent_GetRenewalResultCode(IESLicenseRenewalResultEvent* This,DWORD *pdwRenewalResultCode) {
    return This->lpVtbl->GetRenewalResultCode(This,pdwRenewalResultCode);
}
static __WIDL_INLINE HRESULT IESLicenseRenewalResultEvent_GetCASFailureCode(IESLicenseRenewalResultEvent* This,DWORD *pdwCASFailureCode) {
    return This->lpVtbl->GetCASFailureCode(This,pdwCASFailureCode);
}
static __WIDL_INLINE HRESULT IESLicenseRenewalResultEvent_GetRenewalHResult(IESLicenseRenewalResultEvent* This,HRESULT *phr) {
    return This->lpVtbl->GetRenewalHResult(This,phr);
}
static __WIDL_INLINE HRESULT IESLicenseRenewalResultEvent_GetEntitlementTokenLength(IESLicenseRenewalResultEvent* This,DWORD *pdwLength) {
    return This->lpVtbl->GetEntitlementTokenLength(This,pdwLength);
}
static __WIDL_INLINE HRESULT IESLicenseRenewalResultEvent_GetEntitlementToken(IESLicenseRenewalResultEvent* This,SAFEARRAY **pbData) {
    return This->lpVtbl->GetEntitlementToken(This,pbData);
}
static __WIDL_INLINE HRESULT IESLicenseRenewalResultEvent_GetExpiryDate(IESLicenseRenewalResultEvent* This,DWORD64 *pqwExpiryDate) {
    return This->lpVtbl->GetExpiryDate(This,pqwExpiryDate);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IESFileExpiryDateEvent_QueryInterface(IESFileExpiryDateEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IESFileExpiryDateEvent_AddRef(IESFileExpiryDateEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IESFileExpiryDateEvent_Release(IESFileExpiryDateEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IESEvent methods ***/
static __WIDL_INLINE HRESULT IESFileExpiryDateEvent_GetEventId(IESFileExpiryDateEvent* This,DWORD *pdwEventId) {
    return This->lpVtbl->GetEventId(This,pdwEventId);
}
static __WIDL_INLINE HRESULT IESFileExpiryDateEvent_GetEventType(IESFileExpiryDateEvent* This,GUID *pguidEventType) {
    return This->lpVtbl->GetEventType(This,pguidEventType);
}
static __WIDL_INLINE HRESULT IESFileExpiryDateEvent_SetCompletionStatus(IESFileExpiryDateEvent* This,DWORD dwResult) {
    return This->lpVtbl->SetCompletionStatus(This,dwResult);
}
static __WIDL_INLINE HRESULT IESFileExpiryDateEvent_GetData(IESFileExpiryDateEvent* This,SAFEARRAY **pbData) {
    return This->lpVtbl->GetData(This,pbData);
}
static __WIDL_INLINE HRESULT IESFileExpiryDateEvent_GetStringData(IESFileExpiryDateEvent* This,BSTR *pbstrData) {
    return This->lpVtbl->GetStringData(This,pbstrData);
}
/*** IESFileExpiryDateEvent methods ***/
static __WIDL_INLINE HRESULT IESFileExpiryDateEvent_GetTunerId(IESFileExpiryDateEvent* This,GUID *pguidTunerId) {
    return This->lpVtbl->GetTunerId(This,pguidTunerId);
}
static __WIDL_INLINE HRESULT IESFileExpiryDateEvent_GetExpiryDate(IESFileExpiryDateEvent* This,DWORD64 *pqwExpiryDate) {
    return This->lpVtbl->GetExpiryDate(This,pqwExpiryDate);
}
static __WIDL_INLINE HRESULT IESFileExpiryDateEvent_GetFinalExpiryDate(IESFileExpiryDateEvent* This,DWORD64 *pqwExpiryDate) {
    return This->lpVtbl->GetFinalExpiryDate(This,pqwExpiryDate);
}
static __WIDL_INLINE HRESULT IESFileExpiryDateEvent_GetMaxRenewalCount(IESFileExpiryDateEvent* This,DWORD *dwMaxRenewalCount) {
    return This->lpVtbl->GetMaxRenewalCount(This,dwMaxRenewalCount);
}
static __WIDL_INLINE HRESULT IESFileExpiryDateEvent_IsEntitlementTokenPresent(IESFileExpiryDateEvent* This,WINBOOL *pfEntTokenPresent) {
    return This->lpVtbl->IsEntitlementTokenPresent(This,pfEntTokenPresent);
}
static __WIDL_INLINE HRESULT IESFileExpiryDateEvent_DoesExpireAfterFirstUse(IESFileExpiryDateEvent* This,WINBOOL *pfExpireAfterFirstUse) {
    return This->lpVtbl->DoesExpireAfterFirstUse(This,pfExpireAfterFirstUse);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IESEvents_QueryInterface(IESEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IESEvents_AddRef(IESEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IESEvents_Release(IESEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IESEvents methods ***/
static __WIDL_INLINE HRESULT IESEvents_OnESEventReceived(IESEvents* This,GUID guidEventType,IESEvent *pESEvent) {
    return This->lpVtbl->OnESEventReceived(This,guidEventType,pESEvent);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IESEventService_QueryInterface(IESEventService* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IESEventService_AddRef(IESEventService* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IESEventService_Release(IESEventService* This) {
    return This->lpVtbl->Release(This);
}
/*** IESEventService methods ***/
static __WIDL_INLINE HRESULT IESEventService_FireESEvent(IESEventService* This,IESEvent *pESEvent) {
    return This->lpVtbl->FireESEvent(This,pESEvent);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IESEventServiceConfiguration_QueryInterface(IESEventServiceConfiguration* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IESEventServiceConfiguration_AddRef(IESEventServiceConfiguration* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IESEventServiceConfiguration_Release(IESEventServiceConfiguration* This) {
    return This->lpVtbl->Release(This);
}
/*** IESEventServiceConfiguration methods ***/
static __WIDL_INLINE HRESULT IESEventServiceConfiguration_SetParent(IESEventServiceConfiguration* This,IESEventService *pEventService) {
    return This->lpVtbl->SetParent(This,pEventService);
}
static __WIDL_INLINE HRESULT IESEventServiceConfiguration_RemoveParent(IESEventServiceConfiguration* This) {
    return This->lpVtbl->RemoveParent(This);
}
static __WIDL_INLINE HRESULT IESEventServiceConfiguration_SetOwner(IESEventServiceConfiguration* This,IESEvents *pESEvents) {
    return This->lpVtbl->SetOwner(This,pESEvents);
}
static __WIDL_INLINE HRESULT IESEventServiceConfiguration_RemoveOwner(IESEventServiceConfiguration* This) {
    return This->lpVtbl->RemoveOwner(This);
}
static __WIDL_INLINE HRESULT IESEventServiceConfiguration_SetGraph(IESEventServiceConfiguration* This,IFilterGraph *pGraph) {
    return This->lpVtbl->SetGraph(This,pGraph);
}
static __WIDL_INLINE HRESULT IESEventServiceConfiguration_RemoveGraph(IESEventServiceConfiguration* This,IFilterGraph *pGraph) {
    return This->lpVtbl->RemoveGraph(This,pGraph);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IBroadcastEvent_QueryInterface(IBroadcastEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IBroadcastEvent_AddRef(IBroadcastEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IBroadcastEvent_Release(IBroadcastEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IBroadcastEvent methods ***/
static __WIDL_INLINE HRESULT IBroadcastEvent_Fire(IBroadcastEvent* This,GUID EventID) {
    return This->lpVtbl->Fire(This,EventID);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IBroadcastEventEx_QueryInterface(IBroadcastEventEx* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IBroadcastEventEx_AddRef(IBroadcastEventEx* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IBroadcastEventEx_Release(IBroadcastEventEx* This) {
    return This->lpVtbl->Release(This);
}
/*** IBroadcastEvent methods ***/
static __WIDL_INLINE HRESULT IBroadcastEventEx_Fire(IBroadcastEventEx* This,GUID EventID) {
    return This->lpVtbl->Fire(This,EventID);
}
/*** IBroadcastEventEx methods ***/
static __WIDL_INLINE 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


#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 __WIDL_INLINE HRESULT IRegisterTuner_QueryInterface(IRegisterTuner* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IRegisterTuner_AddRef(IRegisterTuner* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IRegisterTuner_Release(IRegisterTuner* This) {
    return This->lpVtbl->Release(This);
}
/*** IRegisterTuner methods ***/
static __WIDL_INLINE HRESULT IRegisterTuner_Register(IRegisterTuner* This,ITuner *pTuner,IGraphBuilder *pGraph) {
    return This->lpVtbl->Register(This,pTuner,pGraph);
}
static __WIDL_INLINE HRESULT IRegisterTuner_Unregister(IRegisterTuner* This) {
    return This->lpVtbl->Unregister(This);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IBDAComparable_QueryInterface(IBDAComparable* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IBDAComparable_AddRef(IBDAComparable* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IBDAComparable_Release(IBDAComparable* This) {
    return This->lpVtbl->Release(This);
}
/*** IBDAComparable methods ***/
static __WIDL_INLINE HRESULT IBDAComparable_CompareExact(IBDAComparable* This,IDispatch *CompareTo,LONG *Result) {
    return This->lpVtbl->CompareExact(This,CompareTo,Result);
}
static __WIDL_INLINE HRESULT IBDAComparable_CompareEquivalent(IBDAComparable* This,IDispatch *CompareTo,DWORD dwFlags,LONG *Result) {
    return This->lpVtbl->CompareEquivalent(This,CompareTo,dwFlags,Result);
}
static __WIDL_INLINE HRESULT IBDAComparable_HashExact(IBDAComparable* This,INT64 *Result) {
    return This->lpVtbl->HashExact(This,Result);
}
static __WIDL_INLINE HRESULT IBDAComparable_HashExactIncremental(IBDAComparable* This,INT64 PartialResult,INT64 *Result) {
    return This->lpVtbl->HashExactIncremental(This,PartialResult,Result);
}
static __WIDL_INLINE HRESULT IBDAComparable_HashEquivalent(IBDAComparable* This,DWORD dwFlags,INT64 *Result) {
    return This->lpVtbl->HashEquivalent(This,dwFlags,Result);
}
static __WIDL_INLINE HRESULT IBDAComparable_HashEquivalentIncremental(IBDAComparable* This,INT64 PartialResult,DWORD dwFlags,INT64 *Result) {
    return This->lpVtbl->HashEquivalentIncremental(This,PartialResult,dwFlags,Result);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IPersistTuneXml_QueryInterface(IPersistTuneXml* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IPersistTuneXml_AddRef(IPersistTuneXml* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IPersistTuneXml_Release(IPersistTuneXml* This) {
    return This->lpVtbl->Release(This);
}
/*** IPersist methods ***/
static __WIDL_INLINE HRESULT IPersistTuneXml_GetClassID(IPersistTuneXml* This,CLSID *pClassID) {
    return This->lpVtbl->GetClassID(This,pClassID);
}
/*** IPersistTuneXml methods ***/
static __WIDL_INLINE HRESULT IPersistTuneXml_InitNew(IPersistTuneXml* This) {
    return This->lpVtbl->InitNew(This);
}
static __WIDL_INLINE HRESULT IPersistTuneXml_Load(IPersistTuneXml* This,VARIANT varValue) {
    return This->lpVtbl->Load(This,varValue);
}
static __WIDL_INLINE HRESULT IPersistTuneXml_Save(IPersistTuneXml* This,VARIANT *pvarFragment) {
    return This->lpVtbl->Save(This,pvarFragment);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IPersistTuneXmlUtility_QueryInterface(IPersistTuneXmlUtility* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IPersistTuneXmlUtility_AddRef(IPersistTuneXmlUtility* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IPersistTuneXmlUtility_Release(IPersistTuneXmlUtility* This) {
    return This->lpVtbl->Release(This);
}
/*** IPersistTuneXmlUtility methods ***/
static __WIDL_INLINE HRESULT IPersistTuneXmlUtility_Deserialize(IPersistTuneXmlUtility* This,VARIANT varValue,IUnknown **ppObject) {
    return This->lpVtbl->Deserialize(This,varValue,ppObject);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IPersistTuneXmlUtility2_QueryInterface(IPersistTuneXmlUtility2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IPersistTuneXmlUtility2_AddRef(IPersistTuneXmlUtility2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IPersistTuneXmlUtility2_Release(IPersistTuneXmlUtility2* This) {
    return This->lpVtbl->Release(This);
}
/*** IPersistTuneXmlUtility methods ***/
static __WIDL_INLINE HRESULT IPersistTuneXmlUtility2_Deserialize(IPersistTuneXmlUtility2* This,VARIANT varValue,IUnknown **ppObject) {
    return This->lpVtbl->Deserialize(This,varValue,ppObject);
}
/*** IPersistTuneXmlUtility2 methods ***/
static __WIDL_INLINE HRESULT IPersistTuneXmlUtility2_Serialize(IPersistTuneXmlUtility2* This,ITuneRequest *piTuneRequest,BSTR *pString) {
    return This->lpVtbl->Serialize(This,piTuneRequest,pString);
}
#endif
#endif

#endif


#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 __WIDL_INLINE HRESULT IBDACreateTuneRequestEx_QueryInterface(IBDACreateTuneRequestEx* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IBDACreateTuneRequestEx_AddRef(IBDACreateTuneRequestEx* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IBDACreateTuneRequestEx_Release(IBDACreateTuneRequestEx* This) {
    return This->lpVtbl->Release(This);
}
/*** IBDACreateTuneRequestEx methods ***/
static __WIDL_INLINE HRESULT IBDACreateTuneRequestEx_CreateTuneRequestEx(IBDACreateTuneRequestEx* This,REFCLSID TuneRequestIID,ITuneRequest **TuneRequest) {
    return This->lpVtbl->CreateTuneRequestEx(This,TuneRequestIID,TuneRequest);
}
#endif
#endif

#endif


#endif  /* __IBDACreateTuneRequestEx_INTERFACE_DEFINED__ */

#ifndef __TunerLib_LIBRARY_DEFINED__
#define __TunerLib_LIBRARY_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 /* __TunerLib_LIBRARY_DEFINED__ */
#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__ */
