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