/*** Autogenerated by WIDL 8.12 from include/wmp.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 __wmp_h__
#define __wmp_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 __IWMPPlaylist_FWD_DEFINED__
#define __IWMPPlaylist_FWD_DEFINED__
typedef interface IWMPPlaylist IWMPPlaylist;
#ifdef __cplusplus
interface IWMPPlaylist;
#endif /* __cplusplus */
#endif

#ifndef __IWMPMedia_FWD_DEFINED__
#define __IWMPMedia_FWD_DEFINED__
typedef interface IWMPMedia IWMPMedia;
#ifdef __cplusplus
interface IWMPMedia;
#endif /* __cplusplus */
#endif

#ifndef __IWMPControls_FWD_DEFINED__
#define __IWMPControls_FWD_DEFINED__
typedef interface IWMPControls IWMPControls;
#ifdef __cplusplus
interface IWMPControls;
#endif /* __cplusplus */
#endif

#ifndef __IWMPControls2_FWD_DEFINED__
#define __IWMPControls2_FWD_DEFINED__
typedef interface IWMPControls2 IWMPControls2;
#ifdef __cplusplus
interface IWMPControls2;
#endif /* __cplusplus */
#endif

#ifndef __IWMPRemoteMediaServices_FWD_DEFINED__
#define __IWMPRemoteMediaServices_FWD_DEFINED__
typedef interface IWMPRemoteMediaServices IWMPRemoteMediaServices;
#ifdef __cplusplus
interface IWMPRemoteMediaServices;
#endif /* __cplusplus */
#endif

#ifndef __IWMPSettings_FWD_DEFINED__
#define __IWMPSettings_FWD_DEFINED__
typedef interface IWMPSettings IWMPSettings;
#ifdef __cplusplus
interface IWMPSettings;
#endif /* __cplusplus */
#endif

#ifndef __IWMPStringCollection_FWD_DEFINED__
#define __IWMPStringCollection_FWD_DEFINED__
typedef interface IWMPStringCollection IWMPStringCollection;
#ifdef __cplusplus
interface IWMPStringCollection;
#endif /* __cplusplus */
#endif

#ifndef __IWMPMediaCollection_FWD_DEFINED__
#define __IWMPMediaCollection_FWD_DEFINED__
typedef interface IWMPMediaCollection IWMPMediaCollection;
#ifdef __cplusplus
interface IWMPMediaCollection;
#endif /* __cplusplus */
#endif

#ifndef __IWMPPlaylistArray_FWD_DEFINED__
#define __IWMPPlaylistArray_FWD_DEFINED__
typedef interface IWMPPlaylistArray IWMPPlaylistArray;
#ifdef __cplusplus
interface IWMPPlaylistArray;
#endif /* __cplusplus */
#endif

#ifndef __IWMPPlaylistCollection_FWD_DEFINED__
#define __IWMPPlaylistCollection_FWD_DEFINED__
typedef interface IWMPPlaylistCollection IWMPPlaylistCollection;
#ifdef __cplusplus
interface IWMPPlaylistCollection;
#endif /* __cplusplus */
#endif

#ifndef __IWMPNetwork_FWD_DEFINED__
#define __IWMPNetwork_FWD_DEFINED__
typedef interface IWMPNetwork IWMPNetwork;
#ifdef __cplusplus
interface IWMPNetwork;
#endif /* __cplusplus */
#endif

#ifndef __IWMPCdrom_FWD_DEFINED__
#define __IWMPCdrom_FWD_DEFINED__
typedef interface IWMPCdrom IWMPCdrom;
#ifdef __cplusplus
interface IWMPCdrom;
#endif /* __cplusplus */
#endif

#ifndef __IWMPCdromCollection_FWD_DEFINED__
#define __IWMPCdromCollection_FWD_DEFINED__
typedef interface IWMPCdromCollection IWMPCdromCollection;
#ifdef __cplusplus
interface IWMPCdromCollection;
#endif /* __cplusplus */
#endif

#ifndef __IWMPDVD_FWD_DEFINED__
#define __IWMPDVD_FWD_DEFINED__
typedef interface IWMPDVD IWMPDVD;
#ifdef __cplusplus
interface IWMPDVD;
#endif /* __cplusplus */
#endif

#ifndef __IWMPClosedCaption_FWD_DEFINED__
#define __IWMPClosedCaption_FWD_DEFINED__
typedef interface IWMPClosedCaption IWMPClosedCaption;
#ifdef __cplusplus
interface IWMPClosedCaption;
#endif /* __cplusplus */
#endif

#ifndef __IWMPErrorItem_FWD_DEFINED__
#define __IWMPErrorItem_FWD_DEFINED__
typedef interface IWMPErrorItem IWMPErrorItem;
#ifdef __cplusplus
interface IWMPErrorItem;
#endif /* __cplusplus */
#endif

#ifndef __IWMPMedia2_FWD_DEFINED__
#define __IWMPMedia2_FWD_DEFINED__
typedef interface IWMPMedia2 IWMPMedia2;
#ifdef __cplusplus
interface IWMPMedia2;
#endif /* __cplusplus */
#endif

#ifndef __IWMPMedia3_FWD_DEFINED__
#define __IWMPMedia3_FWD_DEFINED__
typedef interface IWMPMedia3 IWMPMedia3;
#ifdef __cplusplus
interface IWMPMedia3;
#endif /* __cplusplus */
#endif

#ifndef __IWMPError_FWD_DEFINED__
#define __IWMPError_FWD_DEFINED__
typedef interface IWMPError IWMPError;
#ifdef __cplusplus
interface IWMPError;
#endif /* __cplusplus */
#endif

#ifndef __IWMPPlayerApplication_FWD_DEFINED__
#define __IWMPPlayerApplication_FWD_DEFINED__
typedef interface IWMPPlayerApplication IWMPPlayerApplication;
#ifdef __cplusplus
interface IWMPPlayerApplication;
#endif /* __cplusplus */
#endif

#ifndef __IWMPCore_FWD_DEFINED__
#define __IWMPCore_FWD_DEFINED__
typedef interface IWMPCore IWMPCore;
#ifdef __cplusplus
interface IWMPCore;
#endif /* __cplusplus */
#endif

#ifndef __IWMPCore2_FWD_DEFINED__
#define __IWMPCore2_FWD_DEFINED__
typedef interface IWMPCore2 IWMPCore2;
#ifdef __cplusplus
interface IWMPCore2;
#endif /* __cplusplus */
#endif

#ifndef __IWMPCore3_FWD_DEFINED__
#define __IWMPCore3_FWD_DEFINED__
typedef interface IWMPCore3 IWMPCore3;
#ifdef __cplusplus
interface IWMPCore3;
#endif /* __cplusplus */
#endif

#ifndef __IWMPPlayer4_FWD_DEFINED__
#define __IWMPPlayer4_FWD_DEFINED__
typedef interface IWMPPlayer4 IWMPPlayer4;
#ifdef __cplusplus
interface IWMPPlayer4;
#endif /* __cplusplus */
#endif

#ifndef __IWMPPlayer_FWD_DEFINED__
#define __IWMPPlayer_FWD_DEFINED__
typedef interface IWMPPlayer IWMPPlayer;
#ifdef __cplusplus
interface IWMPPlayer;
#endif /* __cplusplus */
#endif

#ifndef __IWMPSyncDevice_FWD_DEFINED__
#define __IWMPSyncDevice_FWD_DEFINED__
typedef interface IWMPSyncDevice IWMPSyncDevice;
#ifdef __cplusplus
interface IWMPSyncDevice;
#endif /* __cplusplus */
#endif

#ifndef __IWMPSyncDevice2_FWD_DEFINED__
#define __IWMPSyncDevice2_FWD_DEFINED__
typedef interface IWMPSyncDevice2 IWMPSyncDevice2;
#ifdef __cplusplus
interface IWMPSyncDevice2;
#endif /* __cplusplus */
#endif

#ifndef __IWMPCdromRip_FWD_DEFINED__
#define __IWMPCdromRip_FWD_DEFINED__
typedef interface IWMPCdromRip IWMPCdromRip;
#ifdef __cplusplus
interface IWMPCdromRip;
#endif /* __cplusplus */
#endif

#ifndef __IWMPCdromBurn_FWD_DEFINED__
#define __IWMPCdromBurn_FWD_DEFINED__
typedef interface IWMPCdromBurn IWMPCdromBurn;
#ifdef __cplusplus
interface IWMPCdromBurn;
#endif /* __cplusplus */
#endif

#ifndef __IWMPLibrary_FWD_DEFINED__
#define __IWMPLibrary_FWD_DEFINED__
typedef interface IWMPLibrary IWMPLibrary;
#ifdef __cplusplus
interface IWMPLibrary;
#endif /* __cplusplus */
#endif

#ifndef __IWMPEvents_FWD_DEFINED__
#define __IWMPEvents_FWD_DEFINED__
typedef interface IWMPEvents IWMPEvents;
#ifdef __cplusplus
interface IWMPEvents;
#endif /* __cplusplus */
#endif

#ifndef __IWMPEvents2_FWD_DEFINED__
#define __IWMPEvents2_FWD_DEFINED__
typedef interface IWMPEvents2 IWMPEvents2;
#ifdef __cplusplus
interface IWMPEvents2;
#endif /* __cplusplus */
#endif

#ifndef __IWMPEvents3_FWD_DEFINED__
#define __IWMPEvents3_FWD_DEFINED__
typedef interface IWMPEvents3 IWMPEvents3;
#ifdef __cplusplus
interface IWMPEvents3;
#endif /* __cplusplus */
#endif

#ifndef __IWMPEvents4_FWD_DEFINED__
#define __IWMPEvents4_FWD_DEFINED__
typedef interface IWMPEvents4 IWMPEvents4;
#ifdef __cplusplus
interface IWMPEvents4;
#endif /* __cplusplus */
#endif

#ifndef ___WMPOCXEvents_FWD_DEFINED__
#define ___WMPOCXEvents_FWD_DEFINED__
typedef interface _WMPOCXEvents _WMPOCXEvents;
#ifdef __cplusplus
interface _WMPOCXEvents;
#endif /* __cplusplus */
#endif

#ifndef __WindowsMediaPlayer_FWD_DEFINED__
#define __WindowsMediaPlayer_FWD_DEFINED__
#ifdef __cplusplus
typedef class WindowsMediaPlayer WindowsMediaPlayer;
#else
typedef struct WindowsMediaPlayer WindowsMediaPlayer;
#endif /* defined __cplusplus */
#endif /* defined __WindowsMediaPlayer_FWD_DEFINED__ */

/* Headers for imported files */

#include <oaidl.h>
#include <ocidl.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef __WMPLib_LIBRARY_DEFINED__
#define __WMPLib_LIBRARY_DEFINED__

DEFINE_GUID(LIBID_WMPLib, 0x6bf52a50, 0x394a, 0x11d3, 0xb1,0x53, 0x00,0xc0,0x4f,0x79,0xfa,0xa6);

typedef enum __WIDL_wmp_generated_name_00000020 {
    wmposUndefined = 0,
    wmposPlaylistChanging = 1,
    wmposPlaylistLocating = 2,
    wmposPlaylistConnecting = 3,
    wmposPlaylistLoading = 4,
    wmposPlaylistOpening = 5,
    wmposPlaylistOpenNoMedia = 6,
    wmposPlaylistChanged = 7,
    wmposMediaChanging = 8,
    wmposMediaLocating = 9,
    wmposMediaConnecting = 10,
    wmposMediaLoading = 11,
    wmposMediaOpening = 12,
    wmposMediaOpen = 13,
    wmposBeginCodecAcquisition = 14,
    wmposEndCodecAcquisition = 15,
    wmposBeginLicenseAcquisition = 16,
    wmposEndLicenseAcquisition = 17,
    wmposBeginIndividualization = 18,
    wmposEndIndividualization = 19,
    wmposMediaWaiting = 20,
    wmposOpeningUnknownURL = 21
} WMPOpenState;
typedef enum __WIDL_wmp_generated_name_00000021 {
    wmppsUndefined = 0,
    wmppsStopped = 1,
    wmppsPaused = 2,
    wmppsPlaying = 3,
    wmppsScanForward = 4,
    wmppsScanReverse = 5,
    wmppsBuffering = 6,
    wmppsWaiting = 7,
    wmppsMediaEnded = 8,
    wmppsTransitioning = 9,
    wmppsReady = 10,
    wmppsReconnecting = 11,
    wmppsLast = 12
} WMPPlayState;
typedef enum __WIDL_wmp_generated_name_00000022 {
    wmplcUnknown = 0,
    wmplcClear = 1,
    wmplcInfoChange = 2,
    wmplcMove = 3,
    wmplcDelete = 4,
    wmplcInsert = 5,
    wmplcAppend = 6,
    wmplcPrivate = 7,
    wmplcNameChange = 8,
    wmplcMorph = 9,
    wmplcSort = 10,
    wmplcLast = 11
} WMPPlaylistChangeEventType;
typedef enum __WIDL_wmp_generated_name_00000023 {
    wmpdsUnknown = 0,
    wmpdsPartnershipExists = 1,
    wmpdsPartnershipDeclined = 2,
    wmpdsPartnershipAnother = 3,
    wmpdsManualDevice = 4,
    wmpdsNewDevice = 5,
    wmpdsLast = 6
} WMPDeviceStatus;
typedef enum __WIDL_wmp_generated_name_00000024 {
    wmpssUnknown = 0,
    wmpssSynchronizing = 1,
    wmpssStopped = 2,
    wmpssEstimating = 3,
    wmpssLast = 4
} WMPSyncState;
typedef enum __WIDL_wmp_generated_name_00000025 {
    wmprsUnknown = 0,
    wmprsRipping = 1,
    wmprsStopped = 2
} WMPRipState;
typedef enum __WIDL_wmp_generated_name_00000026 {
    wmpbfAudioCD = 0,
    wmpbfDataCD = 1
} WMPBurnFormat;
typedef enum __WIDL_wmp_generated_name_00000027 {
    wmpbsUnknown = 0,
    wmpbsBusy = 1,
    wmpbsReady = 2,
    wmpbsWaitingForDisc = 3,
    wmpbsRefreshStatusPending = 4,
    wmpbsPreparingToBurn = 5,
    wmpbsBurning = 6,
    wmpbsStopped = 7,
    wmpbsErasing = 8,
    wmpbsDownloading = 9
} WMPBurnState;
typedef enum __WIDL_wmp_generated_name_00000028 {
    wmpltUnknown = 0,
    wmpltAll = 1,
    wmpltLocal = 2,
    wmpltRemote = 3,
    wmpltDisc = 4,
    wmpltPortableDevice = 5
} WMPLibraryType;
typedef enum __WIDL_wmp_generated_name_00000029 {
    wmpfssUnknown = 0,
    wmpfssScanning = 1,
    wmpfssUpdating = 2,
    wmpfssStopped = 3
} WMPFolderScanState;
typedef enum __WIDL_wmp_generated_name_0000002A {
    wmpsccetUnknown = 0,
    wmpsccetInsert = 1,
    wmpsccetChange = 2,
    wmpsccetDelete = 3,
    wmpsccetClear = 4,
    wmpsccetBeginUpdates = 5,
    wmpsccetEndUpdates = 6
} WMPStringCollectionChangeEventType;
#ifndef __IWMPMedia_FWD_DEFINED__
#define __IWMPMedia_FWD_DEFINED__
typedef interface IWMPMedia IWMPMedia;
#ifdef __cplusplus
interface IWMPMedia;
#endif /* __cplusplus */
#endif

/*****************************************************************************
 * IWMPPlaylist interface
 */
#ifndef __IWMPPlaylist_INTERFACE_DEFINED__
#define __IWMPPlaylist_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMPPlaylist, 0xd5f0f4f1, 0x130c, 0x11d3, 0xb1,0x4e, 0x00,0xc0,0x4f,0x79,0xfa,0xa6);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d5f0f4f1-130c-11d3-b14e-00c04f79faa6")
IWMPPlaylist : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_count(
        LONG *plCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_name(
        BSTR *pbstrName) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_name(
        BSTR pbstrName) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_attributeCount(
        LONG *plCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_attributeName(
        LONG lIndex,
        BSTR *pbstrAttributeName) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Item(
        LONG lIndex,
        IWMPMedia **ppIWMPMedia) = 0;

    virtual HRESULT STDMETHODCALLTYPE getItemInfo(
        BSTR bstrName,
        BSTR *pbstrVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE setItemInfo(
        BSTR bstrName,
        BSTR bstrValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_isIdentical(
        IWMPPlaylist *pIWMPPlaylist,
        VARIANT_BOOL *pvbool) = 0;

    virtual HRESULT STDMETHODCALLTYPE clear(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE insertItem(
        LONG lIndex,
        IWMPMedia *pIWMPMedia) = 0;

    virtual HRESULT STDMETHODCALLTYPE appendItem(
        IWMPMedia *pIWMPMedia) = 0;

    virtual HRESULT STDMETHODCALLTYPE removeItem(
        IWMPMedia *pIWMPMedia) = 0;

    virtual HRESULT STDMETHODCALLTYPE moveItem(
        LONG lIndexOld,
        LONG lIndexNew) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMPPlaylist, 0xd5f0f4f1, 0x130c, 0x11d3, 0xb1,0x4e, 0x00,0xc0,0x4f,0x79,0xfa,0xa6)
#endif
#else
typedef struct IWMPPlaylistVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IWMPPlaylist methods ***/
    HRESULT (STDMETHODCALLTYPE *get_count)(
        IWMPPlaylist *This,
        LONG *plCount);

    HRESULT (STDMETHODCALLTYPE *get_name)(
        IWMPPlaylist *This,
        BSTR *pbstrName);

    HRESULT (STDMETHODCALLTYPE *put_name)(
        IWMPPlaylist *This,
        BSTR pbstrName);

    HRESULT (STDMETHODCALLTYPE *get_attributeCount)(
        IWMPPlaylist *This,
        LONG *plCount);

    HRESULT (STDMETHODCALLTYPE *get_attributeName)(
        IWMPPlaylist *This,
        LONG lIndex,
        BSTR *pbstrAttributeName);

    HRESULT (STDMETHODCALLTYPE *get_Item)(
        IWMPPlaylist *This,
        LONG lIndex,
        IWMPMedia **ppIWMPMedia);

    HRESULT (STDMETHODCALLTYPE *getItemInfo)(
        IWMPPlaylist *This,
        BSTR bstrName,
        BSTR *pbstrVal);

    HRESULT (STDMETHODCALLTYPE *setItemInfo)(
        IWMPPlaylist *This,
        BSTR bstrName,
        BSTR bstrValue);

    HRESULT (STDMETHODCALLTYPE *get_isIdentical)(
        IWMPPlaylist *This,
        IWMPPlaylist *pIWMPPlaylist,
        VARIANT_BOOL *pvbool);

    HRESULT (STDMETHODCALLTYPE *clear)(
        IWMPPlaylist *This);

    HRESULT (STDMETHODCALLTYPE *insertItem)(
        IWMPPlaylist *This,
        LONG lIndex,
        IWMPMedia *pIWMPMedia);

    HRESULT (STDMETHODCALLTYPE *appendItem)(
        IWMPPlaylist *This,
        IWMPMedia *pIWMPMedia);

    HRESULT (STDMETHODCALLTYPE *removeItem)(
        IWMPPlaylist *This,
        IWMPMedia *pIWMPMedia);

    HRESULT (STDMETHODCALLTYPE *moveItem)(
        IWMPPlaylist *This,
        LONG lIndexOld,
        LONG lIndexNew);

    END_INTERFACE
} IWMPPlaylistVtbl;

interface IWMPPlaylist {
    CONST_VTBL IWMPPlaylistVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMPPlaylist_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMPPlaylist_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMPPlaylist_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IWMPPlaylist_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IWMPPlaylist_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IWMPPlaylist_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IWMPPlaylist_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IWMPPlaylist methods ***/
#define IWMPPlaylist_get_count(This,plCount) (This)->lpVtbl->get_count(This,plCount)
#define IWMPPlaylist_get_name(This,pbstrName) (This)->lpVtbl->get_name(This,pbstrName)
#define IWMPPlaylist_put_name(This,pbstrName) (This)->lpVtbl->put_name(This,pbstrName)
#define IWMPPlaylist_get_attributeCount(This,plCount) (This)->lpVtbl->get_attributeCount(This,plCount)
#define IWMPPlaylist_get_attributeName(This,lIndex,pbstrAttributeName) (This)->lpVtbl->get_attributeName(This,lIndex,pbstrAttributeName)
#define IWMPPlaylist_get_Item(This,lIndex,ppIWMPMedia) (This)->lpVtbl->get_Item(This,lIndex,ppIWMPMedia)
#define IWMPPlaylist_getItemInfo(This,bstrName,pbstrVal) (This)->lpVtbl->getItemInfo(This,bstrName,pbstrVal)
#define IWMPPlaylist_setItemInfo(This,bstrName,bstrValue) (This)->lpVtbl->setItemInfo(This,bstrName,bstrValue)
#define IWMPPlaylist_get_isIdentical(This,pIWMPPlaylist,pvbool) (This)->lpVtbl->get_isIdentical(This,pIWMPPlaylist,pvbool)
#define IWMPPlaylist_clear(This) (This)->lpVtbl->clear(This)
#define IWMPPlaylist_insertItem(This,lIndex,pIWMPMedia) (This)->lpVtbl->insertItem(This,lIndex,pIWMPMedia)
#define IWMPPlaylist_appendItem(This,pIWMPMedia) (This)->lpVtbl->appendItem(This,pIWMPMedia)
#define IWMPPlaylist_removeItem(This,pIWMPMedia) (This)->lpVtbl->removeItem(This,pIWMPMedia)
#define IWMPPlaylist_moveItem(This,lIndexOld,lIndexNew) (This)->lpVtbl->moveItem(This,lIndexOld,lIndexNew)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IWMPPlaylist_QueryInterface(IWMPPlaylist* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWMPPlaylist_AddRef(IWMPPlaylist* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWMPPlaylist_Release(IWMPPlaylist* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IWMPPlaylist_GetTypeInfoCount(IWMPPlaylist* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IWMPPlaylist_GetTypeInfo(IWMPPlaylist* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IWMPPlaylist_GetIDsOfNames(IWMPPlaylist* 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 IWMPPlaylist_Invoke(IWMPPlaylist* 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);
}
/*** IWMPPlaylist methods ***/
static __WIDL_INLINE HRESULT IWMPPlaylist_get_count(IWMPPlaylist* This,LONG *plCount) {
    return This->lpVtbl->get_count(This,plCount);
}
static __WIDL_INLINE HRESULT IWMPPlaylist_get_name(IWMPPlaylist* This,BSTR *pbstrName) {
    return This->lpVtbl->get_name(This,pbstrName);
}
static __WIDL_INLINE HRESULT IWMPPlaylist_put_name(IWMPPlaylist* This,BSTR pbstrName) {
    return This->lpVtbl->put_name(This,pbstrName);
}
static __WIDL_INLINE HRESULT IWMPPlaylist_get_attributeCount(IWMPPlaylist* This,LONG *plCount) {
    return This->lpVtbl->get_attributeCount(This,plCount);
}
static __WIDL_INLINE HRESULT IWMPPlaylist_get_attributeName(IWMPPlaylist* This,LONG lIndex,BSTR *pbstrAttributeName) {
    return This->lpVtbl->get_attributeName(This,lIndex,pbstrAttributeName);
}
static __WIDL_INLINE HRESULT IWMPPlaylist_get_Item(IWMPPlaylist* This,LONG lIndex,IWMPMedia **ppIWMPMedia) {
    return This->lpVtbl->get_Item(This,lIndex,ppIWMPMedia);
}
static __WIDL_INLINE HRESULT IWMPPlaylist_getItemInfo(IWMPPlaylist* This,BSTR bstrName,BSTR *pbstrVal) {
    return This->lpVtbl->getItemInfo(This,bstrName,pbstrVal);
}
static __WIDL_INLINE HRESULT IWMPPlaylist_setItemInfo(IWMPPlaylist* This,BSTR bstrName,BSTR bstrValue) {
    return This->lpVtbl->setItemInfo(This,bstrName,bstrValue);
}
static __WIDL_INLINE HRESULT IWMPPlaylist_get_isIdentical(IWMPPlaylist* This,IWMPPlaylist *pIWMPPlaylist,VARIANT_BOOL *pvbool) {
    return This->lpVtbl->get_isIdentical(This,pIWMPPlaylist,pvbool);
}
static __WIDL_INLINE HRESULT IWMPPlaylist_clear(IWMPPlaylist* This) {
    return This->lpVtbl->clear(This);
}
static __WIDL_INLINE HRESULT IWMPPlaylist_insertItem(IWMPPlaylist* This,LONG lIndex,IWMPMedia *pIWMPMedia) {
    return This->lpVtbl->insertItem(This,lIndex,pIWMPMedia);
}
static __WIDL_INLINE HRESULT IWMPPlaylist_appendItem(IWMPPlaylist* This,IWMPMedia *pIWMPMedia) {
    return This->lpVtbl->appendItem(This,pIWMPMedia);
}
static __WIDL_INLINE HRESULT IWMPPlaylist_removeItem(IWMPPlaylist* This,IWMPMedia *pIWMPMedia) {
    return This->lpVtbl->removeItem(This,pIWMPMedia);
}
static __WIDL_INLINE HRESULT IWMPPlaylist_moveItem(IWMPPlaylist* This,LONG lIndexOld,LONG lIndexNew) {
    return This->lpVtbl->moveItem(This,lIndexOld,lIndexNew);
}
#endif
#endif

#endif


#endif  /* __IWMPPlaylist_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMPMedia interface
 */
#ifndef __IWMPMedia_INTERFACE_DEFINED__
#define __IWMPMedia_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMPMedia, 0x94d55e95, 0x3fac, 0x11d3, 0xb1,0x55, 0x00,0xc0,0x4f,0x79,0xfa,0xa6);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("94d55e95-3fac-11d3-b155-00c04f79faa6")
IWMPMedia : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_isIdentical(
        IWMPMedia *pIWMPMedia,
        VARIANT_BOOL *pvbool) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_sourceURL(
        BSTR *pbstrSourceURL) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_name(
        BSTR *pbstrName) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_name(
        BSTR pbstrName) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_imageSourceWidth(
        LONG *pWidth) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_imageSourceHeight(
        LONG *pHeight) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_markerCount(
        LONG *pMarkerCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE getMarkerTime(
        LONG MarkerNum,
        double *pMarkerTime) = 0;

    virtual HRESULT STDMETHODCALLTYPE getMarkerName(
        LONG MarkerNum,
        BSTR *pbstrMarkerName) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_duration(
        double *pDuration) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_durationString(
        BSTR *pbstrDuration) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_attributeCount(
        LONG *plCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE getAttributeName(
        LONG lIndex,
        BSTR *pbstrItemName) = 0;

    virtual HRESULT STDMETHODCALLTYPE getItemInfo(
        BSTR bstrItemName,
        BSTR *pbstrVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE setItemInfo(
        BSTR bstrItemName,
        BSTR bstrVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE getItemInfoByAtom(
        LONG lAtom,
        BSTR *pbstrVal) = 0;

    virtual HRESULT STDMETHODCALLTYPE isMemberOf(
        IWMPPlaylist *pPlaylist,
        VARIANT_BOOL *pvarfIsMemberOf) = 0;

    virtual HRESULT STDMETHODCALLTYPE isReadOnlyItem(
        BSTR bstrItemName,
        VARIANT_BOOL *pvarfIsReadOnly) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMPMedia, 0x94d55e95, 0x3fac, 0x11d3, 0xb1,0x55, 0x00,0xc0,0x4f,0x79,0xfa,0xa6)
#endif
#else
typedef struct IWMPMediaVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IWMPMedia methods ***/
    HRESULT (STDMETHODCALLTYPE *get_isIdentical)(
        IWMPMedia *This,
        IWMPMedia *pIWMPMedia,
        VARIANT_BOOL *pvbool);

    HRESULT (STDMETHODCALLTYPE *get_sourceURL)(
        IWMPMedia *This,
        BSTR *pbstrSourceURL);

    HRESULT (STDMETHODCALLTYPE *get_name)(
        IWMPMedia *This,
        BSTR *pbstrName);

    HRESULT (STDMETHODCALLTYPE *put_name)(
        IWMPMedia *This,
        BSTR pbstrName);

    HRESULT (STDMETHODCALLTYPE *get_imageSourceWidth)(
        IWMPMedia *This,
        LONG *pWidth);

    HRESULT (STDMETHODCALLTYPE *get_imageSourceHeight)(
        IWMPMedia *This,
        LONG *pHeight);

    HRESULT (STDMETHODCALLTYPE *get_markerCount)(
        IWMPMedia *This,
        LONG *pMarkerCount);

    HRESULT (STDMETHODCALLTYPE *getMarkerTime)(
        IWMPMedia *This,
        LONG MarkerNum,
        double *pMarkerTime);

    HRESULT (STDMETHODCALLTYPE *getMarkerName)(
        IWMPMedia *This,
        LONG MarkerNum,
        BSTR *pbstrMarkerName);

    HRESULT (STDMETHODCALLTYPE *get_duration)(
        IWMPMedia *This,
        double *pDuration);

    HRESULT (STDMETHODCALLTYPE *get_durationString)(
        IWMPMedia *This,
        BSTR *pbstrDuration);

    HRESULT (STDMETHODCALLTYPE *get_attributeCount)(
        IWMPMedia *This,
        LONG *plCount);

    HRESULT (STDMETHODCALLTYPE *getAttributeName)(
        IWMPMedia *This,
        LONG lIndex,
        BSTR *pbstrItemName);

    HRESULT (STDMETHODCALLTYPE *getItemInfo)(
        IWMPMedia *This,
        BSTR bstrItemName,
        BSTR *pbstrVal);

    HRESULT (STDMETHODCALLTYPE *setItemInfo)(
        IWMPMedia *This,
        BSTR bstrItemName,
        BSTR bstrVal);

    HRESULT (STDMETHODCALLTYPE *getItemInfoByAtom)(
        IWMPMedia *This,
        LONG lAtom,
        BSTR *pbstrVal);

    HRESULT (STDMETHODCALLTYPE *isMemberOf)(
        IWMPMedia *This,
        IWMPPlaylist *pPlaylist,
        VARIANT_BOOL *pvarfIsMemberOf);

    HRESULT (STDMETHODCALLTYPE *isReadOnlyItem)(
        IWMPMedia *This,
        BSTR bstrItemName,
        VARIANT_BOOL *pvarfIsReadOnly);

    END_INTERFACE
} IWMPMediaVtbl;

interface IWMPMedia {
    CONST_VTBL IWMPMediaVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMPMedia_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMPMedia_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMPMedia_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IWMPMedia_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IWMPMedia_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IWMPMedia_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IWMPMedia_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IWMPMedia methods ***/
#define IWMPMedia_get_isIdentical(This,pIWMPMedia,pvbool) (This)->lpVtbl->get_isIdentical(This,pIWMPMedia,pvbool)
#define IWMPMedia_get_sourceURL(This,pbstrSourceURL) (This)->lpVtbl->get_sourceURL(This,pbstrSourceURL)
#define IWMPMedia_get_name(This,pbstrName) (This)->lpVtbl->get_name(This,pbstrName)
#define IWMPMedia_put_name(This,pbstrName) (This)->lpVtbl->put_name(This,pbstrName)
#define IWMPMedia_get_imageSourceWidth(This,pWidth) (This)->lpVtbl->get_imageSourceWidth(This,pWidth)
#define IWMPMedia_get_imageSourceHeight(This,pHeight) (This)->lpVtbl->get_imageSourceHeight(This,pHeight)
#define IWMPMedia_get_markerCount(This,pMarkerCount) (This)->lpVtbl->get_markerCount(This,pMarkerCount)
#define IWMPMedia_getMarkerTime(This,MarkerNum,pMarkerTime) (This)->lpVtbl->getMarkerTime(This,MarkerNum,pMarkerTime)
#define IWMPMedia_getMarkerName(This,MarkerNum,pbstrMarkerName) (This)->lpVtbl->getMarkerName(This,MarkerNum,pbstrMarkerName)
#define IWMPMedia_get_duration(This,pDuration) (This)->lpVtbl->get_duration(This,pDuration)
#define IWMPMedia_get_durationString(This,pbstrDuration) (This)->lpVtbl->get_durationString(This,pbstrDuration)
#define IWMPMedia_get_attributeCount(This,plCount) (This)->lpVtbl->get_attributeCount(This,plCount)
#define IWMPMedia_getAttributeName(This,lIndex,pbstrItemName) (This)->lpVtbl->getAttributeName(This,lIndex,pbstrItemName)
#define IWMPMedia_getItemInfo(This,bstrItemName,pbstrVal) (This)->lpVtbl->getItemInfo(This,bstrItemName,pbstrVal)
#define IWMPMedia_setItemInfo(This,bstrItemName,bstrVal) (This)->lpVtbl->setItemInfo(This,bstrItemName,bstrVal)
#define IWMPMedia_getItemInfoByAtom(This,lAtom,pbstrVal) (This)->lpVtbl->getItemInfoByAtom(This,lAtom,pbstrVal)
#define IWMPMedia_isMemberOf(This,pPlaylist,pvarfIsMemberOf) (This)->lpVtbl->isMemberOf(This,pPlaylist,pvarfIsMemberOf)
#define IWMPMedia_isReadOnlyItem(This,bstrItemName,pvarfIsReadOnly) (This)->lpVtbl->isReadOnlyItem(This,bstrItemName,pvarfIsReadOnly)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IWMPMedia_QueryInterface(IWMPMedia* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWMPMedia_AddRef(IWMPMedia* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWMPMedia_Release(IWMPMedia* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IWMPMedia_GetTypeInfoCount(IWMPMedia* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IWMPMedia_GetTypeInfo(IWMPMedia* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IWMPMedia_GetIDsOfNames(IWMPMedia* 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 IWMPMedia_Invoke(IWMPMedia* 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);
}
/*** IWMPMedia methods ***/
static __WIDL_INLINE HRESULT IWMPMedia_get_isIdentical(IWMPMedia* This,IWMPMedia *pIWMPMedia,VARIANT_BOOL *pvbool) {
    return This->lpVtbl->get_isIdentical(This,pIWMPMedia,pvbool);
}
static __WIDL_INLINE HRESULT IWMPMedia_get_sourceURL(IWMPMedia* This,BSTR *pbstrSourceURL) {
    return This->lpVtbl->get_sourceURL(This,pbstrSourceURL);
}
static __WIDL_INLINE HRESULT IWMPMedia_get_name(IWMPMedia* This,BSTR *pbstrName) {
    return This->lpVtbl->get_name(This,pbstrName);
}
static __WIDL_INLINE HRESULT IWMPMedia_put_name(IWMPMedia* This,BSTR pbstrName) {
    return This->lpVtbl->put_name(This,pbstrName);
}
static __WIDL_INLINE HRESULT IWMPMedia_get_imageSourceWidth(IWMPMedia* This,LONG *pWidth) {
    return This->lpVtbl->get_imageSourceWidth(This,pWidth);
}
static __WIDL_INLINE HRESULT IWMPMedia_get_imageSourceHeight(IWMPMedia* This,LONG *pHeight) {
    return This->lpVtbl->get_imageSourceHeight(This,pHeight);
}
static __WIDL_INLINE HRESULT IWMPMedia_get_markerCount(IWMPMedia* This,LONG *pMarkerCount) {
    return This->lpVtbl->get_markerCount(This,pMarkerCount);
}
static __WIDL_INLINE HRESULT IWMPMedia_getMarkerTime(IWMPMedia* This,LONG MarkerNum,double *pMarkerTime) {
    return This->lpVtbl->getMarkerTime(This,MarkerNum,pMarkerTime);
}
static __WIDL_INLINE HRESULT IWMPMedia_getMarkerName(IWMPMedia* This,LONG MarkerNum,BSTR *pbstrMarkerName) {
    return This->lpVtbl->getMarkerName(This,MarkerNum,pbstrMarkerName);
}
static __WIDL_INLINE HRESULT IWMPMedia_get_duration(IWMPMedia* This,double *pDuration) {
    return This->lpVtbl->get_duration(This,pDuration);
}
static __WIDL_INLINE HRESULT IWMPMedia_get_durationString(IWMPMedia* This,BSTR *pbstrDuration) {
    return This->lpVtbl->get_durationString(This,pbstrDuration);
}
static __WIDL_INLINE HRESULT IWMPMedia_get_attributeCount(IWMPMedia* This,LONG *plCount) {
    return This->lpVtbl->get_attributeCount(This,plCount);
}
static __WIDL_INLINE HRESULT IWMPMedia_getAttributeName(IWMPMedia* This,LONG lIndex,BSTR *pbstrItemName) {
    return This->lpVtbl->getAttributeName(This,lIndex,pbstrItemName);
}
static __WIDL_INLINE HRESULT IWMPMedia_getItemInfo(IWMPMedia* This,BSTR bstrItemName,BSTR *pbstrVal) {
    return This->lpVtbl->getItemInfo(This,bstrItemName,pbstrVal);
}
static __WIDL_INLINE HRESULT IWMPMedia_setItemInfo(IWMPMedia* This,BSTR bstrItemName,BSTR bstrVal) {
    return This->lpVtbl->setItemInfo(This,bstrItemName,bstrVal);
}
static __WIDL_INLINE HRESULT IWMPMedia_getItemInfoByAtom(IWMPMedia* This,LONG lAtom,BSTR *pbstrVal) {
    return This->lpVtbl->getItemInfoByAtom(This,lAtom,pbstrVal);
}
static __WIDL_INLINE HRESULT IWMPMedia_isMemberOf(IWMPMedia* This,IWMPPlaylist *pPlaylist,VARIANT_BOOL *pvarfIsMemberOf) {
    return This->lpVtbl->isMemberOf(This,pPlaylist,pvarfIsMemberOf);
}
static __WIDL_INLINE HRESULT IWMPMedia_isReadOnlyItem(IWMPMedia* This,BSTR bstrItemName,VARIANT_BOOL *pvarfIsReadOnly) {
    return This->lpVtbl->isReadOnlyItem(This,bstrItemName,pvarfIsReadOnly);
}
#endif
#endif

#endif


#endif  /* __IWMPMedia_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMPControls interface
 */
#ifndef __IWMPControls_INTERFACE_DEFINED__
#define __IWMPControls_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMPControls, 0x74c09e02, 0xf828, 0x11d2, 0xa7,0x4b, 0x00,0xa0,0xc9,0x05,0xf3,0x6e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("74c09e02-f828-11d2-a74b-00a0c905f36e")
IWMPControls : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_isAvailable(
        BSTR bstrItem,
        VARIANT_BOOL *pIsAvailable) = 0;

    virtual HRESULT STDMETHODCALLTYPE play(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE stop(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE pause(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE fastForward(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE fastReverse(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_currentPosition(
        double *pdCurrentPosition) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_currentPosition(
        double pdCurrentPosition) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_currentPositionString(
        BSTR *pbstrCurrentPosition) = 0;

    virtual HRESULT STDMETHODCALLTYPE next(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE previous(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE currentItem(
        IWMPMedia **ppIWMPMedia) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_currentItem(
        IWMPMedia *ppIWMPMedia) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_currentMarker(
        LONG *plMarker) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_currentMarker(
        LONG plMarker) = 0;

    virtual HRESULT STDMETHODCALLTYPE playItem(
        IWMPMedia *pIWMPMedia) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMPControls, 0x74c09e02, 0xf828, 0x11d2, 0xa7,0x4b, 0x00,0xa0,0xc9,0x05,0xf3,0x6e)
#endif
#else
typedef struct IWMPControlsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IWMPControls methods ***/
    HRESULT (STDMETHODCALLTYPE *get_isAvailable)(
        IWMPControls *This,
        BSTR bstrItem,
        VARIANT_BOOL *pIsAvailable);

    HRESULT (STDMETHODCALLTYPE *play)(
        IWMPControls *This);

    HRESULT (STDMETHODCALLTYPE *stop)(
        IWMPControls *This);

    HRESULT (STDMETHODCALLTYPE *pause)(
        IWMPControls *This);

    HRESULT (STDMETHODCALLTYPE *fastForward)(
        IWMPControls *This);

    HRESULT (STDMETHODCALLTYPE *fastReverse)(
        IWMPControls *This);

    HRESULT (STDMETHODCALLTYPE *get_currentPosition)(
        IWMPControls *This,
        double *pdCurrentPosition);

    HRESULT (STDMETHODCALLTYPE *put_currentPosition)(
        IWMPControls *This,
        double pdCurrentPosition);

    HRESULT (STDMETHODCALLTYPE *get_currentPositionString)(
        IWMPControls *This,
        BSTR *pbstrCurrentPosition);

    HRESULT (STDMETHODCALLTYPE *next)(
        IWMPControls *This);

    HRESULT (STDMETHODCALLTYPE *previous)(
        IWMPControls *This);

    HRESULT (STDMETHODCALLTYPE *currentItem)(
        IWMPControls *This,
        IWMPMedia **ppIWMPMedia);

    HRESULT (STDMETHODCALLTYPE *put_currentItem)(
        IWMPControls *This,
        IWMPMedia *ppIWMPMedia);

    HRESULT (STDMETHODCALLTYPE *get_currentMarker)(
        IWMPControls *This,
        LONG *plMarker);

    HRESULT (STDMETHODCALLTYPE *put_currentMarker)(
        IWMPControls *This,
        LONG plMarker);

    HRESULT (STDMETHODCALLTYPE *playItem)(
        IWMPControls *This,
        IWMPMedia *pIWMPMedia);

    END_INTERFACE
} IWMPControlsVtbl;

interface IWMPControls {
    CONST_VTBL IWMPControlsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMPControls_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMPControls_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMPControls_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IWMPControls_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IWMPControls_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IWMPControls_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IWMPControls_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IWMPControls methods ***/
#define IWMPControls_get_isAvailable(This,bstrItem,pIsAvailable) (This)->lpVtbl->get_isAvailable(This,bstrItem,pIsAvailable)
#define IWMPControls_play(This) (This)->lpVtbl->play(This)
#define IWMPControls_stop(This) (This)->lpVtbl->stop(This)
#define IWMPControls_pause(This) (This)->lpVtbl->pause(This)
#define IWMPControls_fastForward(This) (This)->lpVtbl->fastForward(This)
#define IWMPControls_fastReverse(This) (This)->lpVtbl->fastReverse(This)
#define IWMPControls_get_currentPosition(This,pdCurrentPosition) (This)->lpVtbl->get_currentPosition(This,pdCurrentPosition)
#define IWMPControls_put_currentPosition(This,pdCurrentPosition) (This)->lpVtbl->put_currentPosition(This,pdCurrentPosition)
#define IWMPControls_get_currentPositionString(This,pbstrCurrentPosition) (This)->lpVtbl->get_currentPositionString(This,pbstrCurrentPosition)
#define IWMPControls_next(This) (This)->lpVtbl->next(This)
#define IWMPControls_previous(This) (This)->lpVtbl->previous(This)
#define IWMPControls_currentItem(This,ppIWMPMedia) (This)->lpVtbl->currentItem(This,ppIWMPMedia)
#define IWMPControls_put_currentItem(This,ppIWMPMedia) (This)->lpVtbl->put_currentItem(This,ppIWMPMedia)
#define IWMPControls_get_currentMarker(This,plMarker) (This)->lpVtbl->get_currentMarker(This,plMarker)
#define IWMPControls_put_currentMarker(This,plMarker) (This)->lpVtbl->put_currentMarker(This,plMarker)
#define IWMPControls_playItem(This,pIWMPMedia) (This)->lpVtbl->playItem(This,pIWMPMedia)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IWMPControls_QueryInterface(IWMPControls* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWMPControls_AddRef(IWMPControls* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWMPControls_Release(IWMPControls* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IWMPControls_GetTypeInfoCount(IWMPControls* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IWMPControls_GetTypeInfo(IWMPControls* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IWMPControls_GetIDsOfNames(IWMPControls* 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 IWMPControls_Invoke(IWMPControls* 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);
}
/*** IWMPControls methods ***/
static __WIDL_INLINE HRESULT IWMPControls_get_isAvailable(IWMPControls* This,BSTR bstrItem,VARIANT_BOOL *pIsAvailable) {
    return This->lpVtbl->get_isAvailable(This,bstrItem,pIsAvailable);
}
static __WIDL_INLINE HRESULT IWMPControls_play(IWMPControls* This) {
    return This->lpVtbl->play(This);
}
static __WIDL_INLINE HRESULT IWMPControls_stop(IWMPControls* This) {
    return This->lpVtbl->stop(This);
}
static __WIDL_INLINE HRESULT IWMPControls_pause(IWMPControls* This) {
    return This->lpVtbl->pause(This);
}
static __WIDL_INLINE HRESULT IWMPControls_fastForward(IWMPControls* This) {
    return This->lpVtbl->fastForward(This);
}
static __WIDL_INLINE HRESULT IWMPControls_fastReverse(IWMPControls* This) {
    return This->lpVtbl->fastReverse(This);
}
static __WIDL_INLINE HRESULT IWMPControls_get_currentPosition(IWMPControls* This,double *pdCurrentPosition) {
    return This->lpVtbl->get_currentPosition(This,pdCurrentPosition);
}
static __WIDL_INLINE HRESULT IWMPControls_put_currentPosition(IWMPControls* This,double pdCurrentPosition) {
    return This->lpVtbl->put_currentPosition(This,pdCurrentPosition);
}
static __WIDL_INLINE HRESULT IWMPControls_get_currentPositionString(IWMPControls* This,BSTR *pbstrCurrentPosition) {
    return This->lpVtbl->get_currentPositionString(This,pbstrCurrentPosition);
}
static __WIDL_INLINE HRESULT IWMPControls_next(IWMPControls* This) {
    return This->lpVtbl->next(This);
}
static __WIDL_INLINE HRESULT IWMPControls_previous(IWMPControls* This) {
    return This->lpVtbl->previous(This);
}
static __WIDL_INLINE HRESULT IWMPControls_currentItem(IWMPControls* This,IWMPMedia **ppIWMPMedia) {
    return This->lpVtbl->currentItem(This,ppIWMPMedia);
}
static __WIDL_INLINE HRESULT IWMPControls_put_currentItem(IWMPControls* This,IWMPMedia *ppIWMPMedia) {
    return This->lpVtbl->put_currentItem(This,ppIWMPMedia);
}
static __WIDL_INLINE HRESULT IWMPControls_get_currentMarker(IWMPControls* This,LONG *plMarker) {
    return This->lpVtbl->get_currentMarker(This,plMarker);
}
static __WIDL_INLINE HRESULT IWMPControls_put_currentMarker(IWMPControls* This,LONG plMarker) {
    return This->lpVtbl->put_currentMarker(This,plMarker);
}
static __WIDL_INLINE HRESULT IWMPControls_playItem(IWMPControls* This,IWMPMedia *pIWMPMedia) {
    return This->lpVtbl->playItem(This,pIWMPMedia);
}
#endif
#endif

#endif


#endif  /* __IWMPControls_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMPControls2 interface
 */
#ifndef __IWMPControls2_INTERFACE_DEFINED__
#define __IWMPControls2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMPControls2, 0x6f030d25, 0x0890, 0x480f, 0x97,0x75, 0x1f,0x7e,0x40,0xab,0x5b,0x8e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("6f030d25-0890-480f-9775-1f7e40ab5b8e")
IWMPControls2 : public IWMPControls
{
    virtual HRESULT STDMETHODCALLTYPE step(
        LONG lStep) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMPControls2, 0x6f030d25, 0x0890, 0x480f, 0x97,0x75, 0x1f,0x7e,0x40,0xab,0x5b,0x8e)
#endif
#else
typedef struct IWMPControls2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IWMPControls methods ***/
    HRESULT (STDMETHODCALLTYPE *get_isAvailable)(
        IWMPControls2 *This,
        BSTR bstrItem,
        VARIANT_BOOL *pIsAvailable);

    HRESULT (STDMETHODCALLTYPE *play)(
        IWMPControls2 *This);

    HRESULT (STDMETHODCALLTYPE *stop)(
        IWMPControls2 *This);

    HRESULT (STDMETHODCALLTYPE *pause)(
        IWMPControls2 *This);

    HRESULT (STDMETHODCALLTYPE *fastForward)(
        IWMPControls2 *This);

    HRESULT (STDMETHODCALLTYPE *fastReverse)(
        IWMPControls2 *This);

    HRESULT (STDMETHODCALLTYPE *get_currentPosition)(
        IWMPControls2 *This,
        double *pdCurrentPosition);

    HRESULT (STDMETHODCALLTYPE *put_currentPosition)(
        IWMPControls2 *This,
        double pdCurrentPosition);

    HRESULT (STDMETHODCALLTYPE *get_currentPositionString)(
        IWMPControls2 *This,
        BSTR *pbstrCurrentPosition);

    HRESULT (STDMETHODCALLTYPE *next)(
        IWMPControls2 *This);

    HRESULT (STDMETHODCALLTYPE *previous)(
        IWMPControls2 *This);

    HRESULT (STDMETHODCALLTYPE *currentItem)(
        IWMPControls2 *This,
        IWMPMedia **ppIWMPMedia);

    HRESULT (STDMETHODCALLTYPE *put_currentItem)(
        IWMPControls2 *This,
        IWMPMedia *ppIWMPMedia);

    HRESULT (STDMETHODCALLTYPE *get_currentMarker)(
        IWMPControls2 *This,
        LONG *plMarker);

    HRESULT (STDMETHODCALLTYPE *put_currentMarker)(
        IWMPControls2 *This,
        LONG plMarker);

    HRESULT (STDMETHODCALLTYPE *playItem)(
        IWMPControls2 *This,
        IWMPMedia *pIWMPMedia);

    /*** IWMPControls2 methods ***/
    HRESULT (STDMETHODCALLTYPE *step)(
        IWMPControls2 *This,
        LONG lStep);

    END_INTERFACE
} IWMPControls2Vtbl;

interface IWMPControls2 {
    CONST_VTBL IWMPControls2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMPControls2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMPControls2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMPControls2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IWMPControls2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IWMPControls2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IWMPControls2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IWMPControls2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IWMPControls methods ***/
#define IWMPControls2_get_isAvailable(This,bstrItem,pIsAvailable) (This)->lpVtbl->get_isAvailable(This,bstrItem,pIsAvailable)
#define IWMPControls2_play(This) (This)->lpVtbl->play(This)
#define IWMPControls2_stop(This) (This)->lpVtbl->stop(This)
#define IWMPControls2_pause(This) (This)->lpVtbl->pause(This)
#define IWMPControls2_fastForward(This) (This)->lpVtbl->fastForward(This)
#define IWMPControls2_fastReverse(This) (This)->lpVtbl->fastReverse(This)
#define IWMPControls2_get_currentPosition(This,pdCurrentPosition) (This)->lpVtbl->get_currentPosition(This,pdCurrentPosition)
#define IWMPControls2_put_currentPosition(This,pdCurrentPosition) (This)->lpVtbl->put_currentPosition(This,pdCurrentPosition)
#define IWMPControls2_get_currentPositionString(This,pbstrCurrentPosition) (This)->lpVtbl->get_currentPositionString(This,pbstrCurrentPosition)
#define IWMPControls2_next(This) (This)->lpVtbl->next(This)
#define IWMPControls2_previous(This) (This)->lpVtbl->previous(This)
#define IWMPControls2_currentItem(This,ppIWMPMedia) (This)->lpVtbl->currentItem(This,ppIWMPMedia)
#define IWMPControls2_put_currentItem(This,ppIWMPMedia) (This)->lpVtbl->put_currentItem(This,ppIWMPMedia)
#define IWMPControls2_get_currentMarker(This,plMarker) (This)->lpVtbl->get_currentMarker(This,plMarker)
#define IWMPControls2_put_currentMarker(This,plMarker) (This)->lpVtbl->put_currentMarker(This,plMarker)
#define IWMPControls2_playItem(This,pIWMPMedia) (This)->lpVtbl->playItem(This,pIWMPMedia)
/*** IWMPControls2 methods ***/
#define IWMPControls2_step(This,lStep) (This)->lpVtbl->step(This,lStep)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IWMPControls2_QueryInterface(IWMPControls2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWMPControls2_AddRef(IWMPControls2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWMPControls2_Release(IWMPControls2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IWMPControls2_GetTypeInfoCount(IWMPControls2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IWMPControls2_GetTypeInfo(IWMPControls2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IWMPControls2_GetIDsOfNames(IWMPControls2* 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 IWMPControls2_Invoke(IWMPControls2* 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);
}
/*** IWMPControls methods ***/
static __WIDL_INLINE HRESULT IWMPControls2_get_isAvailable(IWMPControls2* This,BSTR bstrItem,VARIANT_BOOL *pIsAvailable) {
    return This->lpVtbl->get_isAvailable(This,bstrItem,pIsAvailable);
}
static __WIDL_INLINE HRESULT IWMPControls2_play(IWMPControls2* This) {
    return This->lpVtbl->play(This);
}
static __WIDL_INLINE HRESULT IWMPControls2_stop(IWMPControls2* This) {
    return This->lpVtbl->stop(This);
}
static __WIDL_INLINE HRESULT IWMPControls2_pause(IWMPControls2* This) {
    return This->lpVtbl->pause(This);
}
static __WIDL_INLINE HRESULT IWMPControls2_fastForward(IWMPControls2* This) {
    return This->lpVtbl->fastForward(This);
}
static __WIDL_INLINE HRESULT IWMPControls2_fastReverse(IWMPControls2* This) {
    return This->lpVtbl->fastReverse(This);
}
static __WIDL_INLINE HRESULT IWMPControls2_get_currentPosition(IWMPControls2* This,double *pdCurrentPosition) {
    return This->lpVtbl->get_currentPosition(This,pdCurrentPosition);
}
static __WIDL_INLINE HRESULT IWMPControls2_put_currentPosition(IWMPControls2* This,double pdCurrentPosition) {
    return This->lpVtbl->put_currentPosition(This,pdCurrentPosition);
}
static __WIDL_INLINE HRESULT IWMPControls2_get_currentPositionString(IWMPControls2* This,BSTR *pbstrCurrentPosition) {
    return This->lpVtbl->get_currentPositionString(This,pbstrCurrentPosition);
}
static __WIDL_INLINE HRESULT IWMPControls2_next(IWMPControls2* This) {
    return This->lpVtbl->next(This);
}
static __WIDL_INLINE HRESULT IWMPControls2_previous(IWMPControls2* This) {
    return This->lpVtbl->previous(This);
}
static __WIDL_INLINE HRESULT IWMPControls2_currentItem(IWMPControls2* This,IWMPMedia **ppIWMPMedia) {
    return This->lpVtbl->currentItem(This,ppIWMPMedia);
}
static __WIDL_INLINE HRESULT IWMPControls2_put_currentItem(IWMPControls2* This,IWMPMedia *ppIWMPMedia) {
    return This->lpVtbl->put_currentItem(This,ppIWMPMedia);
}
static __WIDL_INLINE HRESULT IWMPControls2_get_currentMarker(IWMPControls2* This,LONG *plMarker) {
    return This->lpVtbl->get_currentMarker(This,plMarker);
}
static __WIDL_INLINE HRESULT IWMPControls2_put_currentMarker(IWMPControls2* This,LONG plMarker) {
    return This->lpVtbl->put_currentMarker(This,plMarker);
}
static __WIDL_INLINE HRESULT IWMPControls2_playItem(IWMPControls2* This,IWMPMedia *pIWMPMedia) {
    return This->lpVtbl->playItem(This,pIWMPMedia);
}
/*** IWMPControls2 methods ***/
static __WIDL_INLINE HRESULT IWMPControls2_step(IWMPControls2* This,LONG lStep) {
    return This->lpVtbl->step(This,lStep);
}
#endif
#endif

#endif


#endif  /* __IWMPControls2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMPRemoteMediaServices interface
 */
#ifndef __IWMPRemoteMediaServices_INTERFACE_DEFINED__
#define __IWMPRemoteMediaServices_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMPRemoteMediaServices, 0xcbb92747, 0x741f, 0x44fe, 0xab,0x5b, 0xf1,0xa4,0x8f,0x3b,0x2a,0x59);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("cbb92747-741f-44fe-ab5b-f1a48f3b2a59")
IWMPRemoteMediaServices : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetServiceType(
        BSTR *type) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetApplicationName(
        BSTR *name) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetScriptableObject(
        BSTR *name,
        IDispatch **out) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCustomUIMode(
        BSTR *file) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMPRemoteMediaServices, 0xcbb92747, 0x741f, 0x44fe, 0xab,0x5b, 0xf1,0xa4,0x8f,0x3b,0x2a,0x59)
#endif
#else
typedef struct IWMPRemoteMediaServicesVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMPRemoteMediaServices methods ***/
    HRESULT (STDMETHODCALLTYPE *GetServiceType)(
        IWMPRemoteMediaServices *This,
        BSTR *type);

    HRESULT (STDMETHODCALLTYPE *GetApplicationName)(
        IWMPRemoteMediaServices *This,
        BSTR *name);

    HRESULT (STDMETHODCALLTYPE *GetScriptableObject)(
        IWMPRemoteMediaServices *This,
        BSTR *name,
        IDispatch **out);

    HRESULT (STDMETHODCALLTYPE *GetCustomUIMode)(
        IWMPRemoteMediaServices *This,
        BSTR *file);

    END_INTERFACE
} IWMPRemoteMediaServicesVtbl;

interface IWMPRemoteMediaServices {
    CONST_VTBL IWMPRemoteMediaServicesVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMPRemoteMediaServices_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMPRemoteMediaServices_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMPRemoteMediaServices_Release(This) (This)->lpVtbl->Release(This)
/*** IWMPRemoteMediaServices methods ***/
#define IWMPRemoteMediaServices_GetServiceType(This,type) (This)->lpVtbl->GetServiceType(This,type)
#define IWMPRemoteMediaServices_GetApplicationName(This,name) (This)->lpVtbl->GetApplicationName(This,name)
#define IWMPRemoteMediaServices_GetScriptableObject(This,name,out) (This)->lpVtbl->GetScriptableObject(This,name,out)
#define IWMPRemoteMediaServices_GetCustomUIMode(This,file) (This)->lpVtbl->GetCustomUIMode(This,file)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IWMPRemoteMediaServices_QueryInterface(IWMPRemoteMediaServices* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWMPRemoteMediaServices_AddRef(IWMPRemoteMediaServices* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWMPRemoteMediaServices_Release(IWMPRemoteMediaServices* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMPRemoteMediaServices methods ***/
static __WIDL_INLINE HRESULT IWMPRemoteMediaServices_GetServiceType(IWMPRemoteMediaServices* This,BSTR *type) {
    return This->lpVtbl->GetServiceType(This,type);
}
static __WIDL_INLINE HRESULT IWMPRemoteMediaServices_GetApplicationName(IWMPRemoteMediaServices* This,BSTR *name) {
    return This->lpVtbl->GetApplicationName(This,name);
}
static __WIDL_INLINE HRESULT IWMPRemoteMediaServices_GetScriptableObject(IWMPRemoteMediaServices* This,BSTR *name,IDispatch **out) {
    return This->lpVtbl->GetScriptableObject(This,name,out);
}
static __WIDL_INLINE HRESULT IWMPRemoteMediaServices_GetCustomUIMode(IWMPRemoteMediaServices* This,BSTR *file) {
    return This->lpVtbl->GetCustomUIMode(This,file);
}
#endif
#endif

#endif


#endif  /* __IWMPRemoteMediaServices_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMPSettings interface
 */
#ifndef __IWMPSettings_INTERFACE_DEFINED__
#define __IWMPSettings_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMPSettings, 0x9104d1ab, 0x80c9, 0x4fed, 0xab,0xf0, 0x2e,0x64,0x17,0xa6,0xdf,0x14);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("9104d1ab-80c9-4fed-abf0-2e6417a6df14")
IWMPSettings : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_isAvailable(
        BSTR bstrItem,
        VARIANT_BOOL *pIsAvailable) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_autoStart(
        VARIANT_BOOL *pfAutoStart) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_autoStart(
        VARIANT_BOOL pfAutoStart) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_baseURL(
        BSTR *pbstrBaseURL) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_baseURL(
        BSTR pbstrBaseURL) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_defaultFrame(
        BSTR *pbstrDefaultFrame) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_defaultFrame(
        BSTR pbstrDefaultFrame) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_invokeURLs(
        VARIANT_BOOL *pfInvokeURLs) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_invokeURLs(
        VARIANT_BOOL pfInvokeURLs) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_mute(
        VARIANT_BOOL *pfMute) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_mute(
        VARIANT_BOOL pfMute) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_playCount(
        LONG *plCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_playCount(
        LONG plCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_rate(
        double *pdRate) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_rate(
        double pdRate) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_balance(
        LONG *plBalance) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_balance(
        LONG plBalance) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_volume(
        LONG *plVolume) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_volume(
        LONG plVolume) = 0;

    virtual HRESULT STDMETHODCALLTYPE getMode(
        BSTR bstrMode,
        VARIANT_BOOL *pvarfMode) = 0;

    virtual HRESULT STDMETHODCALLTYPE setMode(
        BSTR bstrMode,
        VARIANT_BOOL varfMode) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_enableErrorDialogs(
        VARIANT_BOOL *pfEnableErrorDialogs) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_enableErrorDialogs(
        VARIANT_BOOL pfEnableErrorDialogs) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMPSettings, 0x9104d1ab, 0x80c9, 0x4fed, 0xab,0xf0, 0x2e,0x64,0x17,0xa6,0xdf,0x14)
#endif
#else
typedef struct IWMPSettingsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IWMPSettings methods ***/
    HRESULT (STDMETHODCALLTYPE *get_isAvailable)(
        IWMPSettings *This,
        BSTR bstrItem,
        VARIANT_BOOL *pIsAvailable);

    HRESULT (STDMETHODCALLTYPE *get_autoStart)(
        IWMPSettings *This,
        VARIANT_BOOL *pfAutoStart);

    HRESULT (STDMETHODCALLTYPE *put_autoStart)(
        IWMPSettings *This,
        VARIANT_BOOL pfAutoStart);

    HRESULT (STDMETHODCALLTYPE *get_baseURL)(
        IWMPSettings *This,
        BSTR *pbstrBaseURL);

    HRESULT (STDMETHODCALLTYPE *put_baseURL)(
        IWMPSettings *This,
        BSTR pbstrBaseURL);

    HRESULT (STDMETHODCALLTYPE *get_defaultFrame)(
        IWMPSettings *This,
        BSTR *pbstrDefaultFrame);

    HRESULT (STDMETHODCALLTYPE *put_defaultFrame)(
        IWMPSettings *This,
        BSTR pbstrDefaultFrame);

    HRESULT (STDMETHODCALLTYPE *get_invokeURLs)(
        IWMPSettings *This,
        VARIANT_BOOL *pfInvokeURLs);

    HRESULT (STDMETHODCALLTYPE *put_invokeURLs)(
        IWMPSettings *This,
        VARIANT_BOOL pfInvokeURLs);

    HRESULT (STDMETHODCALLTYPE *get_mute)(
        IWMPSettings *This,
        VARIANT_BOOL *pfMute);

    HRESULT (STDMETHODCALLTYPE *put_mute)(
        IWMPSettings *This,
        VARIANT_BOOL pfMute);

    HRESULT (STDMETHODCALLTYPE *get_playCount)(
        IWMPSettings *This,
        LONG *plCount);

    HRESULT (STDMETHODCALLTYPE *put_playCount)(
        IWMPSettings *This,
        LONG plCount);

    HRESULT (STDMETHODCALLTYPE *get_rate)(
        IWMPSettings *This,
        double *pdRate);

    HRESULT (STDMETHODCALLTYPE *put_rate)(
        IWMPSettings *This,
        double pdRate);

    HRESULT (STDMETHODCALLTYPE *get_balance)(
        IWMPSettings *This,
        LONG *plBalance);

    HRESULT (STDMETHODCALLTYPE *put_balance)(
        IWMPSettings *This,
        LONG plBalance);

    HRESULT (STDMETHODCALLTYPE *get_volume)(
        IWMPSettings *This,
        LONG *plVolume);

    HRESULT (STDMETHODCALLTYPE *put_volume)(
        IWMPSettings *This,
        LONG plVolume);

    HRESULT (STDMETHODCALLTYPE *getMode)(
        IWMPSettings *This,
        BSTR bstrMode,
        VARIANT_BOOL *pvarfMode);

    HRESULT (STDMETHODCALLTYPE *setMode)(
        IWMPSettings *This,
        BSTR bstrMode,
        VARIANT_BOOL varfMode);

    HRESULT (STDMETHODCALLTYPE *get_enableErrorDialogs)(
        IWMPSettings *This,
        VARIANT_BOOL *pfEnableErrorDialogs);

    HRESULT (STDMETHODCALLTYPE *put_enableErrorDialogs)(
        IWMPSettings *This,
        VARIANT_BOOL pfEnableErrorDialogs);

    END_INTERFACE
} IWMPSettingsVtbl;

interface IWMPSettings {
    CONST_VTBL IWMPSettingsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMPSettings_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMPSettings_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMPSettings_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IWMPSettings_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IWMPSettings_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IWMPSettings_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IWMPSettings_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IWMPSettings methods ***/
#define IWMPSettings_get_isAvailable(This,bstrItem,pIsAvailable) (This)->lpVtbl->get_isAvailable(This,bstrItem,pIsAvailable)
#define IWMPSettings_get_autoStart(This,pfAutoStart) (This)->lpVtbl->get_autoStart(This,pfAutoStart)
#define IWMPSettings_put_autoStart(This,pfAutoStart) (This)->lpVtbl->put_autoStart(This,pfAutoStart)
#define IWMPSettings_get_baseURL(This,pbstrBaseURL) (This)->lpVtbl->get_baseURL(This,pbstrBaseURL)
#define IWMPSettings_put_baseURL(This,pbstrBaseURL) (This)->lpVtbl->put_baseURL(This,pbstrBaseURL)
#define IWMPSettings_get_defaultFrame(This,pbstrDefaultFrame) (This)->lpVtbl->get_defaultFrame(This,pbstrDefaultFrame)
#define IWMPSettings_put_defaultFrame(This,pbstrDefaultFrame) (This)->lpVtbl->put_defaultFrame(This,pbstrDefaultFrame)
#define IWMPSettings_get_invokeURLs(This,pfInvokeURLs) (This)->lpVtbl->get_invokeURLs(This,pfInvokeURLs)
#define IWMPSettings_put_invokeURLs(This,pfInvokeURLs) (This)->lpVtbl->put_invokeURLs(This,pfInvokeURLs)
#define IWMPSettings_get_mute(This,pfMute) (This)->lpVtbl->get_mute(This,pfMute)
#define IWMPSettings_put_mute(This,pfMute) (This)->lpVtbl->put_mute(This,pfMute)
#define IWMPSettings_get_playCount(This,plCount) (This)->lpVtbl->get_playCount(This,plCount)
#define IWMPSettings_put_playCount(This,plCount) (This)->lpVtbl->put_playCount(This,plCount)
#define IWMPSettings_get_rate(This,pdRate) (This)->lpVtbl->get_rate(This,pdRate)
#define IWMPSettings_put_rate(This,pdRate) (This)->lpVtbl->put_rate(This,pdRate)
#define IWMPSettings_get_balance(This,plBalance) (This)->lpVtbl->get_balance(This,plBalance)
#define IWMPSettings_put_balance(This,plBalance) (This)->lpVtbl->put_balance(This,plBalance)
#define IWMPSettings_get_volume(This,plVolume) (This)->lpVtbl->get_volume(This,plVolume)
#define IWMPSettings_put_volume(This,plVolume) (This)->lpVtbl->put_volume(This,plVolume)
#define IWMPSettings_getMode(This,bstrMode,pvarfMode) (This)->lpVtbl->getMode(This,bstrMode,pvarfMode)
#define IWMPSettings_setMode(This,bstrMode,varfMode) (This)->lpVtbl->setMode(This,bstrMode,varfMode)
#define IWMPSettings_get_enableErrorDialogs(This,pfEnableErrorDialogs) (This)->lpVtbl->get_enableErrorDialogs(This,pfEnableErrorDialogs)
#define IWMPSettings_put_enableErrorDialogs(This,pfEnableErrorDialogs) (This)->lpVtbl->put_enableErrorDialogs(This,pfEnableErrorDialogs)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IWMPSettings_QueryInterface(IWMPSettings* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWMPSettings_AddRef(IWMPSettings* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWMPSettings_Release(IWMPSettings* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IWMPSettings_GetTypeInfoCount(IWMPSettings* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IWMPSettings_GetTypeInfo(IWMPSettings* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IWMPSettings_GetIDsOfNames(IWMPSettings* 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 IWMPSettings_Invoke(IWMPSettings* 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);
}
/*** IWMPSettings methods ***/
static __WIDL_INLINE HRESULT IWMPSettings_get_isAvailable(IWMPSettings* This,BSTR bstrItem,VARIANT_BOOL *pIsAvailable) {
    return This->lpVtbl->get_isAvailable(This,bstrItem,pIsAvailable);
}
static __WIDL_INLINE HRESULT IWMPSettings_get_autoStart(IWMPSettings* This,VARIANT_BOOL *pfAutoStart) {
    return This->lpVtbl->get_autoStart(This,pfAutoStart);
}
static __WIDL_INLINE HRESULT IWMPSettings_put_autoStart(IWMPSettings* This,VARIANT_BOOL pfAutoStart) {
    return This->lpVtbl->put_autoStart(This,pfAutoStart);
}
static __WIDL_INLINE HRESULT IWMPSettings_get_baseURL(IWMPSettings* This,BSTR *pbstrBaseURL) {
    return This->lpVtbl->get_baseURL(This,pbstrBaseURL);
}
static __WIDL_INLINE HRESULT IWMPSettings_put_baseURL(IWMPSettings* This,BSTR pbstrBaseURL) {
    return This->lpVtbl->put_baseURL(This,pbstrBaseURL);
}
static __WIDL_INLINE HRESULT IWMPSettings_get_defaultFrame(IWMPSettings* This,BSTR *pbstrDefaultFrame) {
    return This->lpVtbl->get_defaultFrame(This,pbstrDefaultFrame);
}
static __WIDL_INLINE HRESULT IWMPSettings_put_defaultFrame(IWMPSettings* This,BSTR pbstrDefaultFrame) {
    return This->lpVtbl->put_defaultFrame(This,pbstrDefaultFrame);
}
static __WIDL_INLINE HRESULT IWMPSettings_get_invokeURLs(IWMPSettings* This,VARIANT_BOOL *pfInvokeURLs) {
    return This->lpVtbl->get_invokeURLs(This,pfInvokeURLs);
}
static __WIDL_INLINE HRESULT IWMPSettings_put_invokeURLs(IWMPSettings* This,VARIANT_BOOL pfInvokeURLs) {
    return This->lpVtbl->put_invokeURLs(This,pfInvokeURLs);
}
static __WIDL_INLINE HRESULT IWMPSettings_get_mute(IWMPSettings* This,VARIANT_BOOL *pfMute) {
    return This->lpVtbl->get_mute(This,pfMute);
}
static __WIDL_INLINE HRESULT IWMPSettings_put_mute(IWMPSettings* This,VARIANT_BOOL pfMute) {
    return This->lpVtbl->put_mute(This,pfMute);
}
static __WIDL_INLINE HRESULT IWMPSettings_get_playCount(IWMPSettings* This,LONG *plCount) {
    return This->lpVtbl->get_playCount(This,plCount);
}
static __WIDL_INLINE HRESULT IWMPSettings_put_playCount(IWMPSettings* This,LONG plCount) {
    return This->lpVtbl->put_playCount(This,plCount);
}
static __WIDL_INLINE HRESULT IWMPSettings_get_rate(IWMPSettings* This,double *pdRate) {
    return This->lpVtbl->get_rate(This,pdRate);
}
static __WIDL_INLINE HRESULT IWMPSettings_put_rate(IWMPSettings* This,double pdRate) {
    return This->lpVtbl->put_rate(This,pdRate);
}
static __WIDL_INLINE HRESULT IWMPSettings_get_balance(IWMPSettings* This,LONG *plBalance) {
    return This->lpVtbl->get_balance(This,plBalance);
}
static __WIDL_INLINE HRESULT IWMPSettings_put_balance(IWMPSettings* This,LONG plBalance) {
    return This->lpVtbl->put_balance(This,plBalance);
}
static __WIDL_INLINE HRESULT IWMPSettings_get_volume(IWMPSettings* This,LONG *plVolume) {
    return This->lpVtbl->get_volume(This,plVolume);
}
static __WIDL_INLINE HRESULT IWMPSettings_put_volume(IWMPSettings* This,LONG plVolume) {
    return This->lpVtbl->put_volume(This,plVolume);
}
static __WIDL_INLINE HRESULT IWMPSettings_getMode(IWMPSettings* This,BSTR bstrMode,VARIANT_BOOL *pvarfMode) {
    return This->lpVtbl->getMode(This,bstrMode,pvarfMode);
}
static __WIDL_INLINE HRESULT IWMPSettings_setMode(IWMPSettings* This,BSTR bstrMode,VARIANT_BOOL varfMode) {
    return This->lpVtbl->setMode(This,bstrMode,varfMode);
}
static __WIDL_INLINE HRESULT IWMPSettings_get_enableErrorDialogs(IWMPSettings* This,VARIANT_BOOL *pfEnableErrorDialogs) {
    return This->lpVtbl->get_enableErrorDialogs(This,pfEnableErrorDialogs);
}
static __WIDL_INLINE HRESULT IWMPSettings_put_enableErrorDialogs(IWMPSettings* This,VARIANT_BOOL pfEnableErrorDialogs) {
    return This->lpVtbl->put_enableErrorDialogs(This,pfEnableErrorDialogs);
}
#endif
#endif

#endif


#endif  /* __IWMPSettings_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMPStringCollection interface
 */
#ifndef __IWMPStringCollection_INTERFACE_DEFINED__
#define __IWMPStringCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMPStringCollection, 0x4a976298, 0x8c0d, 0x11d3, 0xb3,0x89, 0x00,0xc0,0x4f,0x68,0x57,0x4b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("4a976298-8c0d-11d3-b389-00c04f68574b")
IWMPStringCollection : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_count(
        LONG *plCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE Item(
        LONG lIndex,
        BSTR *pbstrString) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMPStringCollection, 0x4a976298, 0x8c0d, 0x11d3, 0xb3,0x89, 0x00,0xc0,0x4f,0x68,0x57,0x4b)
#endif
#else
typedef struct IWMPStringCollectionVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IWMPStringCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *get_count)(
        IWMPStringCollection *This,
        LONG *plCount);

    HRESULT (STDMETHODCALLTYPE *Item)(
        IWMPStringCollection *This,
        LONG lIndex,
        BSTR *pbstrString);

    END_INTERFACE
} IWMPStringCollectionVtbl;

interface IWMPStringCollection {
    CONST_VTBL IWMPStringCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMPStringCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMPStringCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMPStringCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IWMPStringCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IWMPStringCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IWMPStringCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IWMPStringCollection_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IWMPStringCollection methods ***/
#define IWMPStringCollection_get_count(This,plCount) (This)->lpVtbl->get_count(This,plCount)
#define IWMPStringCollection_Item(This,lIndex,pbstrString) (This)->lpVtbl->Item(This,lIndex,pbstrString)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IWMPStringCollection_QueryInterface(IWMPStringCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWMPStringCollection_AddRef(IWMPStringCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWMPStringCollection_Release(IWMPStringCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IWMPStringCollection_GetTypeInfoCount(IWMPStringCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IWMPStringCollection_GetTypeInfo(IWMPStringCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IWMPStringCollection_GetIDsOfNames(IWMPStringCollection* 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 IWMPStringCollection_Invoke(IWMPStringCollection* 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);
}
/*** IWMPStringCollection methods ***/
static __WIDL_INLINE HRESULT IWMPStringCollection_get_count(IWMPStringCollection* This,LONG *plCount) {
    return This->lpVtbl->get_count(This,plCount);
}
static __WIDL_INLINE HRESULT IWMPStringCollection_Item(IWMPStringCollection* This,LONG lIndex,BSTR *pbstrString) {
    return This->lpVtbl->Item(This,lIndex,pbstrString);
}
#endif
#endif

#endif


#endif  /* __IWMPStringCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMPMediaCollection interface
 */
#ifndef __IWMPMediaCollection_INTERFACE_DEFINED__
#define __IWMPMediaCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMPMediaCollection, 0x8363bc22, 0xb4b4, 0x4b19, 0x98,0x9d, 0x1c,0xd7,0x65,0x74,0x9d,0xd1);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("8363bc22-b4b4-4b19-989d-1cd765749dd1")
IWMPMediaCollection : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE add(
        BSTR bstrURL,
        IWMPMedia **ppItem) = 0;

    virtual HRESULT STDMETHODCALLTYPE getAll(
        IWMPPlaylist **ppMediaItems) = 0;

    virtual HRESULT STDMETHODCALLTYPE getByName(
        BSTR bstrName,
        IWMPPlaylist **ppMediaItems) = 0;

    virtual HRESULT STDMETHODCALLTYPE getByGenre(
        BSTR bstrGenre,
        IWMPPlaylist **ppMediaItems) = 0;

    virtual HRESULT STDMETHODCALLTYPE getByAuthor(
        BSTR bstrAuthor,
        IWMPPlaylist **ppMediaItems) = 0;

    virtual HRESULT STDMETHODCALLTYPE getByAlbum(
        BSTR bstrAlbum,
        IWMPPlaylist **ppMediaItems) = 0;

    virtual HRESULT STDMETHODCALLTYPE getByAttribute(
        BSTR bstrAttribute,
        BSTR bstrValue,
        IWMPPlaylist **ppMediaItems) = 0;

    virtual HRESULT STDMETHODCALLTYPE remove(
        IWMPMedia *pItem,
        VARIANT_BOOL varfDeleteFile) = 0;

    virtual HRESULT STDMETHODCALLTYPE getAttributeStringCollection(
        BSTR bstrAttribute,
        BSTR bstrMediaType,
        IWMPStringCollection **ppStringCollection) = 0;

    virtual HRESULT STDMETHODCALLTYPE getMediaAtom(
        BSTR bstrItemName,
        LONG *plAtom) = 0;

    virtual HRESULT STDMETHODCALLTYPE setDeleted(
        IWMPMedia *pItem,
        VARIANT_BOOL varfIsDeleted) = 0;

    virtual HRESULT STDMETHODCALLTYPE isDeleted(
        IWMPMedia *pItem,
        VARIANT_BOOL *pvarfIsDeleted) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMPMediaCollection, 0x8363bc22, 0xb4b4, 0x4b19, 0x98,0x9d, 0x1c,0xd7,0x65,0x74,0x9d,0xd1)
#endif
#else
typedef struct IWMPMediaCollectionVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IWMPMediaCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *add)(
        IWMPMediaCollection *This,
        BSTR bstrURL,
        IWMPMedia **ppItem);

    HRESULT (STDMETHODCALLTYPE *getAll)(
        IWMPMediaCollection *This,
        IWMPPlaylist **ppMediaItems);

    HRESULT (STDMETHODCALLTYPE *getByName)(
        IWMPMediaCollection *This,
        BSTR bstrName,
        IWMPPlaylist **ppMediaItems);

    HRESULT (STDMETHODCALLTYPE *getByGenre)(
        IWMPMediaCollection *This,
        BSTR bstrGenre,
        IWMPPlaylist **ppMediaItems);

    HRESULT (STDMETHODCALLTYPE *getByAuthor)(
        IWMPMediaCollection *This,
        BSTR bstrAuthor,
        IWMPPlaylist **ppMediaItems);

    HRESULT (STDMETHODCALLTYPE *getByAlbum)(
        IWMPMediaCollection *This,
        BSTR bstrAlbum,
        IWMPPlaylist **ppMediaItems);

    HRESULT (STDMETHODCALLTYPE *getByAttribute)(
        IWMPMediaCollection *This,
        BSTR bstrAttribute,
        BSTR bstrValue,
        IWMPPlaylist **ppMediaItems);

    HRESULT (STDMETHODCALLTYPE *remove)(
        IWMPMediaCollection *This,
        IWMPMedia *pItem,
        VARIANT_BOOL varfDeleteFile);

    HRESULT (STDMETHODCALLTYPE *getAttributeStringCollection)(
        IWMPMediaCollection *This,
        BSTR bstrAttribute,
        BSTR bstrMediaType,
        IWMPStringCollection **ppStringCollection);

    HRESULT (STDMETHODCALLTYPE *getMediaAtom)(
        IWMPMediaCollection *This,
        BSTR bstrItemName,
        LONG *plAtom);

    HRESULT (STDMETHODCALLTYPE *setDeleted)(
        IWMPMediaCollection *This,
        IWMPMedia *pItem,
        VARIANT_BOOL varfIsDeleted);

    HRESULT (STDMETHODCALLTYPE *isDeleted)(
        IWMPMediaCollection *This,
        IWMPMedia *pItem,
        VARIANT_BOOL *pvarfIsDeleted);

    END_INTERFACE
} IWMPMediaCollectionVtbl;

interface IWMPMediaCollection {
    CONST_VTBL IWMPMediaCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMPMediaCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMPMediaCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMPMediaCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IWMPMediaCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IWMPMediaCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IWMPMediaCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IWMPMediaCollection_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IWMPMediaCollection methods ***/
#define IWMPMediaCollection_add(This,bstrURL,ppItem) (This)->lpVtbl->add(This,bstrURL,ppItem)
#define IWMPMediaCollection_getAll(This,ppMediaItems) (This)->lpVtbl->getAll(This,ppMediaItems)
#define IWMPMediaCollection_getByName(This,bstrName,ppMediaItems) (This)->lpVtbl->getByName(This,bstrName,ppMediaItems)
#define IWMPMediaCollection_getByGenre(This,bstrGenre,ppMediaItems) (This)->lpVtbl->getByGenre(This,bstrGenre,ppMediaItems)
#define IWMPMediaCollection_getByAuthor(This,bstrAuthor,ppMediaItems) (This)->lpVtbl->getByAuthor(This,bstrAuthor,ppMediaItems)
#define IWMPMediaCollection_getByAlbum(This,bstrAlbum,ppMediaItems) (This)->lpVtbl->getByAlbum(This,bstrAlbum,ppMediaItems)
#define IWMPMediaCollection_getByAttribute(This,bstrAttribute,bstrValue,ppMediaItems) (This)->lpVtbl->getByAttribute(This,bstrAttribute,bstrValue,ppMediaItems)
#define IWMPMediaCollection_remove(This,pItem,varfDeleteFile) (This)->lpVtbl->remove(This,pItem,varfDeleteFile)
#define IWMPMediaCollection_getAttributeStringCollection(This,bstrAttribute,bstrMediaType,ppStringCollection) (This)->lpVtbl->getAttributeStringCollection(This,bstrAttribute,bstrMediaType,ppStringCollection)
#define IWMPMediaCollection_getMediaAtom(This,bstrItemName,plAtom) (This)->lpVtbl->getMediaAtom(This,bstrItemName,plAtom)
#define IWMPMediaCollection_setDeleted(This,pItem,varfIsDeleted) (This)->lpVtbl->setDeleted(This,pItem,varfIsDeleted)
#define IWMPMediaCollection_isDeleted(This,pItem,pvarfIsDeleted) (This)->lpVtbl->isDeleted(This,pItem,pvarfIsDeleted)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IWMPMediaCollection_QueryInterface(IWMPMediaCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWMPMediaCollection_AddRef(IWMPMediaCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWMPMediaCollection_Release(IWMPMediaCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IWMPMediaCollection_GetTypeInfoCount(IWMPMediaCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IWMPMediaCollection_GetTypeInfo(IWMPMediaCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IWMPMediaCollection_GetIDsOfNames(IWMPMediaCollection* 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 IWMPMediaCollection_Invoke(IWMPMediaCollection* 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);
}
/*** IWMPMediaCollection methods ***/
static __WIDL_INLINE HRESULT IWMPMediaCollection_add(IWMPMediaCollection* This,BSTR bstrURL,IWMPMedia **ppItem) {
    return This->lpVtbl->add(This,bstrURL,ppItem);
}
static __WIDL_INLINE HRESULT IWMPMediaCollection_getAll(IWMPMediaCollection* This,IWMPPlaylist **ppMediaItems) {
    return This->lpVtbl->getAll(This,ppMediaItems);
}
static __WIDL_INLINE HRESULT IWMPMediaCollection_getByName(IWMPMediaCollection* This,BSTR bstrName,IWMPPlaylist **ppMediaItems) {
    return This->lpVtbl->getByName(This,bstrName,ppMediaItems);
}
static __WIDL_INLINE HRESULT IWMPMediaCollection_getByGenre(IWMPMediaCollection* This,BSTR bstrGenre,IWMPPlaylist **ppMediaItems) {
    return This->lpVtbl->getByGenre(This,bstrGenre,ppMediaItems);
}
static __WIDL_INLINE HRESULT IWMPMediaCollection_getByAuthor(IWMPMediaCollection* This,BSTR bstrAuthor,IWMPPlaylist **ppMediaItems) {
    return This->lpVtbl->getByAuthor(This,bstrAuthor,ppMediaItems);
}
static __WIDL_INLINE HRESULT IWMPMediaCollection_getByAlbum(IWMPMediaCollection* This,BSTR bstrAlbum,IWMPPlaylist **ppMediaItems) {
    return This->lpVtbl->getByAlbum(This,bstrAlbum,ppMediaItems);
}
static __WIDL_INLINE HRESULT IWMPMediaCollection_getByAttribute(IWMPMediaCollection* This,BSTR bstrAttribute,BSTR bstrValue,IWMPPlaylist **ppMediaItems) {
    return This->lpVtbl->getByAttribute(This,bstrAttribute,bstrValue,ppMediaItems);
}
static __WIDL_INLINE HRESULT IWMPMediaCollection_remove(IWMPMediaCollection* This,IWMPMedia *pItem,VARIANT_BOOL varfDeleteFile) {
    return This->lpVtbl->remove(This,pItem,varfDeleteFile);
}
static __WIDL_INLINE HRESULT IWMPMediaCollection_getAttributeStringCollection(IWMPMediaCollection* This,BSTR bstrAttribute,BSTR bstrMediaType,IWMPStringCollection **ppStringCollection) {
    return This->lpVtbl->getAttributeStringCollection(This,bstrAttribute,bstrMediaType,ppStringCollection);
}
static __WIDL_INLINE HRESULT IWMPMediaCollection_getMediaAtom(IWMPMediaCollection* This,BSTR bstrItemName,LONG *plAtom) {
    return This->lpVtbl->getMediaAtom(This,bstrItemName,plAtom);
}
static __WIDL_INLINE HRESULT IWMPMediaCollection_setDeleted(IWMPMediaCollection* This,IWMPMedia *pItem,VARIANT_BOOL varfIsDeleted) {
    return This->lpVtbl->setDeleted(This,pItem,varfIsDeleted);
}
static __WIDL_INLINE HRESULT IWMPMediaCollection_isDeleted(IWMPMediaCollection* This,IWMPMedia *pItem,VARIANT_BOOL *pvarfIsDeleted) {
    return This->lpVtbl->isDeleted(This,pItem,pvarfIsDeleted);
}
#endif
#endif

#endif


#endif  /* __IWMPMediaCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMPPlaylistArray interface
 */
#ifndef __IWMPPlaylistArray_INTERFACE_DEFINED__
#define __IWMPPlaylistArray_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMPPlaylistArray, 0x679409c0, 0x99f7, 0x11d3, 0x9f,0xb7, 0x00,0x10,0x5a,0xa6,0x20,0xbb);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("679409c0-99f7-11d3-9fb7-00105aa620bb")
IWMPPlaylistArray : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_count(
        LONG *plCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE Item(
        LONG lIndex,
        IWMPPlaylist **ppItem) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMPPlaylistArray, 0x679409c0, 0x99f7, 0x11d3, 0x9f,0xb7, 0x00,0x10,0x5a,0xa6,0x20,0xbb)
#endif
#else
typedef struct IWMPPlaylistArrayVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IWMPPlaylistArray methods ***/
    HRESULT (STDMETHODCALLTYPE *get_count)(
        IWMPPlaylistArray *This,
        LONG *plCount);

    HRESULT (STDMETHODCALLTYPE *Item)(
        IWMPPlaylistArray *This,
        LONG lIndex,
        IWMPPlaylist **ppItem);

    END_INTERFACE
} IWMPPlaylistArrayVtbl;

interface IWMPPlaylistArray {
    CONST_VTBL IWMPPlaylistArrayVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMPPlaylistArray_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMPPlaylistArray_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMPPlaylistArray_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IWMPPlaylistArray_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IWMPPlaylistArray_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IWMPPlaylistArray_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IWMPPlaylistArray_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IWMPPlaylistArray methods ***/
#define IWMPPlaylistArray_get_count(This,plCount) (This)->lpVtbl->get_count(This,plCount)
#define IWMPPlaylistArray_Item(This,lIndex,ppItem) (This)->lpVtbl->Item(This,lIndex,ppItem)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IWMPPlaylistArray_QueryInterface(IWMPPlaylistArray* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWMPPlaylistArray_AddRef(IWMPPlaylistArray* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWMPPlaylistArray_Release(IWMPPlaylistArray* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IWMPPlaylistArray_GetTypeInfoCount(IWMPPlaylistArray* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IWMPPlaylistArray_GetTypeInfo(IWMPPlaylistArray* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IWMPPlaylistArray_GetIDsOfNames(IWMPPlaylistArray* 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 IWMPPlaylistArray_Invoke(IWMPPlaylistArray* 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);
}
/*** IWMPPlaylistArray methods ***/
static __WIDL_INLINE HRESULT IWMPPlaylistArray_get_count(IWMPPlaylistArray* This,LONG *plCount) {
    return This->lpVtbl->get_count(This,plCount);
}
static __WIDL_INLINE HRESULT IWMPPlaylistArray_Item(IWMPPlaylistArray* This,LONG lIndex,IWMPPlaylist **ppItem) {
    return This->lpVtbl->Item(This,lIndex,ppItem);
}
#endif
#endif

#endif


#endif  /* __IWMPPlaylistArray_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMPPlaylistCollection interface
 */
#ifndef __IWMPPlaylistCollection_INTERFACE_DEFINED__
#define __IWMPPlaylistCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMPPlaylistCollection, 0x10a13217, 0x23a7, 0x439b, 0xb1,0xc0, 0xd8,0x47,0xc7,0x9b,0x77,0x74);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("10a13217-23a7-439b-b1c0-d847c79b7774")
IWMPPlaylistCollection : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE newPlaylist(
        BSTR bstrName,
        IWMPPlaylist **ppItem) = 0;

    virtual HRESULT STDMETHODCALLTYPE getAll(
        IWMPPlaylistArray **ppPlaylistArray) = 0;

    virtual HRESULT STDMETHODCALLTYPE getByName(
        BSTR bstrName,
        IWMPPlaylistArray **ppPlaylistArray) = 0;

    virtual HRESULT STDMETHODCALLTYPE remove(
        IWMPPlaylist *pItem) = 0;

    virtual HRESULT STDMETHODCALLTYPE setDeleted(
        IWMPPlaylist *pItem,
        VARIANT_BOOL varfIsDeleted) = 0;

    virtual HRESULT STDMETHODCALLTYPE isDeleted(
        IWMPPlaylist *pItem,
        VARIANT_BOOL *pvarfIsDeleted) = 0;

    virtual HRESULT STDMETHODCALLTYPE importPlaylist(
        IWMPPlaylist *pItem,
        IWMPPlaylist **ppImportedItem) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMPPlaylistCollection, 0x10a13217, 0x23a7, 0x439b, 0xb1,0xc0, 0xd8,0x47,0xc7,0x9b,0x77,0x74)
#endif
#else
typedef struct IWMPPlaylistCollectionVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IWMPPlaylistCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *newPlaylist)(
        IWMPPlaylistCollection *This,
        BSTR bstrName,
        IWMPPlaylist **ppItem);

    HRESULT (STDMETHODCALLTYPE *getAll)(
        IWMPPlaylistCollection *This,
        IWMPPlaylistArray **ppPlaylistArray);

    HRESULT (STDMETHODCALLTYPE *getByName)(
        IWMPPlaylistCollection *This,
        BSTR bstrName,
        IWMPPlaylistArray **ppPlaylistArray);

    HRESULT (STDMETHODCALLTYPE *remove)(
        IWMPPlaylistCollection *This,
        IWMPPlaylist *pItem);

    HRESULT (STDMETHODCALLTYPE *setDeleted)(
        IWMPPlaylistCollection *This,
        IWMPPlaylist *pItem,
        VARIANT_BOOL varfIsDeleted);

    HRESULT (STDMETHODCALLTYPE *isDeleted)(
        IWMPPlaylistCollection *This,
        IWMPPlaylist *pItem,
        VARIANT_BOOL *pvarfIsDeleted);

    HRESULT (STDMETHODCALLTYPE *importPlaylist)(
        IWMPPlaylistCollection *This,
        IWMPPlaylist *pItem,
        IWMPPlaylist **ppImportedItem);

    END_INTERFACE
} IWMPPlaylistCollectionVtbl;

interface IWMPPlaylistCollection {
    CONST_VTBL IWMPPlaylistCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMPPlaylistCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMPPlaylistCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMPPlaylistCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IWMPPlaylistCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IWMPPlaylistCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IWMPPlaylistCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IWMPPlaylistCollection_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IWMPPlaylistCollection methods ***/
#define IWMPPlaylistCollection_newPlaylist(This,bstrName,ppItem) (This)->lpVtbl->newPlaylist(This,bstrName,ppItem)
#define IWMPPlaylistCollection_getAll(This,ppPlaylistArray) (This)->lpVtbl->getAll(This,ppPlaylistArray)
#define IWMPPlaylistCollection_getByName(This,bstrName,ppPlaylistArray) (This)->lpVtbl->getByName(This,bstrName,ppPlaylistArray)
#define IWMPPlaylistCollection_remove(This,pItem) (This)->lpVtbl->remove(This,pItem)
#define IWMPPlaylistCollection_setDeleted(This,pItem,varfIsDeleted) (This)->lpVtbl->setDeleted(This,pItem,varfIsDeleted)
#define IWMPPlaylistCollection_isDeleted(This,pItem,pvarfIsDeleted) (This)->lpVtbl->isDeleted(This,pItem,pvarfIsDeleted)
#define IWMPPlaylistCollection_importPlaylist(This,pItem,ppImportedItem) (This)->lpVtbl->importPlaylist(This,pItem,ppImportedItem)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IWMPPlaylistCollection_QueryInterface(IWMPPlaylistCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWMPPlaylistCollection_AddRef(IWMPPlaylistCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWMPPlaylistCollection_Release(IWMPPlaylistCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IWMPPlaylistCollection_GetTypeInfoCount(IWMPPlaylistCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IWMPPlaylistCollection_GetTypeInfo(IWMPPlaylistCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IWMPPlaylistCollection_GetIDsOfNames(IWMPPlaylistCollection* 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 IWMPPlaylistCollection_Invoke(IWMPPlaylistCollection* 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);
}
/*** IWMPPlaylistCollection methods ***/
static __WIDL_INLINE HRESULT IWMPPlaylistCollection_newPlaylist(IWMPPlaylistCollection* This,BSTR bstrName,IWMPPlaylist **ppItem) {
    return This->lpVtbl->newPlaylist(This,bstrName,ppItem);
}
static __WIDL_INLINE HRESULT IWMPPlaylistCollection_getAll(IWMPPlaylistCollection* This,IWMPPlaylistArray **ppPlaylistArray) {
    return This->lpVtbl->getAll(This,ppPlaylistArray);
}
static __WIDL_INLINE HRESULT IWMPPlaylistCollection_getByName(IWMPPlaylistCollection* This,BSTR bstrName,IWMPPlaylistArray **ppPlaylistArray) {
    return This->lpVtbl->getByName(This,bstrName,ppPlaylistArray);
}
static __WIDL_INLINE HRESULT IWMPPlaylistCollection_remove(IWMPPlaylistCollection* This,IWMPPlaylist *pItem) {
    return This->lpVtbl->remove(This,pItem);
}
static __WIDL_INLINE HRESULT IWMPPlaylistCollection_setDeleted(IWMPPlaylistCollection* This,IWMPPlaylist *pItem,VARIANT_BOOL varfIsDeleted) {
    return This->lpVtbl->setDeleted(This,pItem,varfIsDeleted);
}
static __WIDL_INLINE HRESULT IWMPPlaylistCollection_isDeleted(IWMPPlaylistCollection* This,IWMPPlaylist *pItem,VARIANT_BOOL *pvarfIsDeleted) {
    return This->lpVtbl->isDeleted(This,pItem,pvarfIsDeleted);
}
static __WIDL_INLINE HRESULT IWMPPlaylistCollection_importPlaylist(IWMPPlaylistCollection* This,IWMPPlaylist *pItem,IWMPPlaylist **ppImportedItem) {
    return This->lpVtbl->importPlaylist(This,pItem,ppImportedItem);
}
#endif
#endif

#endif


#endif  /* __IWMPPlaylistCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMPNetwork interface
 */
#ifndef __IWMPNetwork_INTERFACE_DEFINED__
#define __IWMPNetwork_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMPNetwork, 0xec21b779, 0xedef, 0x462d, 0xbb,0xa4, 0xad,0x9d,0xde,0x2b,0x29,0xa7);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("ec21b779-edef-462d-bba4-ad9dde2b29a7")
IWMPNetwork : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_bandWidth(
        LONG *plBandwidth) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_recoveredPackets(
        LONG *plRecoveredPackets) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_sourceProtocol(
        BSTR *pbstrSourceProtocol) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_receivedPackets(
        LONG *plReceivedPackets) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_lostPackets(
        LONG *plLostPackets) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_receptionQuality(
        LONG *plReceptionQuality) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_bufferingCount(
        LONG *plBufferingCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_bufferingProgress(
        LONG *plBufferingProgress) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_bufferingTime(
        LONG *plBufferingTime) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_bufferingTime(
        LONG plBufferingTime) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_frameRate(
        LONG *plFrameRate) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_maxBitRate(
        LONG *plBitRate) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_bitRate(
        LONG *plBitRate) = 0;

    virtual HRESULT STDMETHODCALLTYPE getProxySettings(
        BSTR bstrProtocol,
        LONG *plProxySetting) = 0;

    virtual HRESULT STDMETHODCALLTYPE setProxySettings(
        BSTR bstrProtocol,
        LONG lProxySetting) = 0;

    virtual HRESULT STDMETHODCALLTYPE getProxyName(
        BSTR bstrProtocol,
        BSTR *pbstrProxyName) = 0;

    virtual HRESULT STDMETHODCALLTYPE setProxyName(
        BSTR bstrProtocol,
        BSTR bstrProxyName) = 0;

    virtual HRESULT STDMETHODCALLTYPE getProxyPort(
        BSTR bstrProtocol,
        LONG *lProxyPort) = 0;

    virtual HRESULT STDMETHODCALLTYPE setProxyPort(
        BSTR bstrProtocol,
        LONG lProxyPort) = 0;

    virtual HRESULT STDMETHODCALLTYPE getProxyExceptionList(
        BSTR bstrProtocol,
        BSTR *pbstrExceptionList) = 0;

    virtual HRESULT STDMETHODCALLTYPE setProxyExceptionList(
        BSTR bstrProtocol,
        BSTR pbstrExceptionList) = 0;

    virtual HRESULT STDMETHODCALLTYPE getProxyBypassForLocal(
        BSTR bstrProtocol,
        VARIANT_BOOL *pfBypassForLocal) = 0;

    virtual HRESULT STDMETHODCALLTYPE setProxyBypassForLocal(
        BSTR bstrProtocol,
        VARIANT_BOOL fBypassForLocal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_maxBandwidth(
        LONG *lMaxBandwidth) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_maxBandwidth(
        LONG lMaxBandwidth) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_downloadProgress(
        LONG *plDownloadProgress) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_encodedFrameRate(
        LONG *plFrameRate) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_framesSkipped(
        LONG *plFrames) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMPNetwork, 0xec21b779, 0xedef, 0x462d, 0xbb,0xa4, 0xad,0x9d,0xde,0x2b,0x29,0xa7)
#endif
#else
typedef struct IWMPNetworkVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IWMPNetwork methods ***/
    HRESULT (STDMETHODCALLTYPE *get_bandWidth)(
        IWMPNetwork *This,
        LONG *plBandwidth);

    HRESULT (STDMETHODCALLTYPE *get_recoveredPackets)(
        IWMPNetwork *This,
        LONG *plRecoveredPackets);

    HRESULT (STDMETHODCALLTYPE *get_sourceProtocol)(
        IWMPNetwork *This,
        BSTR *pbstrSourceProtocol);

    HRESULT (STDMETHODCALLTYPE *get_receivedPackets)(
        IWMPNetwork *This,
        LONG *plReceivedPackets);

    HRESULT (STDMETHODCALLTYPE *get_lostPackets)(
        IWMPNetwork *This,
        LONG *plLostPackets);

    HRESULT (STDMETHODCALLTYPE *get_receptionQuality)(
        IWMPNetwork *This,
        LONG *plReceptionQuality);

    HRESULT (STDMETHODCALLTYPE *get_bufferingCount)(
        IWMPNetwork *This,
        LONG *plBufferingCount);

    HRESULT (STDMETHODCALLTYPE *get_bufferingProgress)(
        IWMPNetwork *This,
        LONG *plBufferingProgress);

    HRESULT (STDMETHODCALLTYPE *get_bufferingTime)(
        IWMPNetwork *This,
        LONG *plBufferingTime);

    HRESULT (STDMETHODCALLTYPE *put_bufferingTime)(
        IWMPNetwork *This,
        LONG plBufferingTime);

    HRESULT (STDMETHODCALLTYPE *get_frameRate)(
        IWMPNetwork *This,
        LONG *plFrameRate);

    HRESULT (STDMETHODCALLTYPE *get_maxBitRate)(
        IWMPNetwork *This,
        LONG *plBitRate);

    HRESULT (STDMETHODCALLTYPE *get_bitRate)(
        IWMPNetwork *This,
        LONG *plBitRate);

    HRESULT (STDMETHODCALLTYPE *getProxySettings)(
        IWMPNetwork *This,
        BSTR bstrProtocol,
        LONG *plProxySetting);

    HRESULT (STDMETHODCALLTYPE *setProxySettings)(
        IWMPNetwork *This,
        BSTR bstrProtocol,
        LONG lProxySetting);

    HRESULT (STDMETHODCALLTYPE *getProxyName)(
        IWMPNetwork *This,
        BSTR bstrProtocol,
        BSTR *pbstrProxyName);

    HRESULT (STDMETHODCALLTYPE *setProxyName)(
        IWMPNetwork *This,
        BSTR bstrProtocol,
        BSTR bstrProxyName);

    HRESULT (STDMETHODCALLTYPE *getProxyPort)(
        IWMPNetwork *This,
        BSTR bstrProtocol,
        LONG *lProxyPort);

    HRESULT (STDMETHODCALLTYPE *setProxyPort)(
        IWMPNetwork *This,
        BSTR bstrProtocol,
        LONG lProxyPort);

    HRESULT (STDMETHODCALLTYPE *getProxyExceptionList)(
        IWMPNetwork *This,
        BSTR bstrProtocol,
        BSTR *pbstrExceptionList);

    HRESULT (STDMETHODCALLTYPE *setProxyExceptionList)(
        IWMPNetwork *This,
        BSTR bstrProtocol,
        BSTR pbstrExceptionList);

    HRESULT (STDMETHODCALLTYPE *getProxyBypassForLocal)(
        IWMPNetwork *This,
        BSTR bstrProtocol,
        VARIANT_BOOL *pfBypassForLocal);

    HRESULT (STDMETHODCALLTYPE *setProxyBypassForLocal)(
        IWMPNetwork *This,
        BSTR bstrProtocol,
        VARIANT_BOOL fBypassForLocal);

    HRESULT (STDMETHODCALLTYPE *get_maxBandwidth)(
        IWMPNetwork *This,
        LONG *lMaxBandwidth);

    HRESULT (STDMETHODCALLTYPE *put_maxBandwidth)(
        IWMPNetwork *This,
        LONG lMaxBandwidth);

    HRESULT (STDMETHODCALLTYPE *get_downloadProgress)(
        IWMPNetwork *This,
        LONG *plDownloadProgress);

    HRESULT (STDMETHODCALLTYPE *get_encodedFrameRate)(
        IWMPNetwork *This,
        LONG *plFrameRate);

    HRESULT (STDMETHODCALLTYPE *get_framesSkipped)(
        IWMPNetwork *This,
        LONG *plFrames);

    END_INTERFACE
} IWMPNetworkVtbl;

interface IWMPNetwork {
    CONST_VTBL IWMPNetworkVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMPNetwork_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMPNetwork_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMPNetwork_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IWMPNetwork_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IWMPNetwork_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IWMPNetwork_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IWMPNetwork_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IWMPNetwork methods ***/
#define IWMPNetwork_get_bandWidth(This,plBandwidth) (This)->lpVtbl->get_bandWidth(This,plBandwidth)
#define IWMPNetwork_get_recoveredPackets(This,plRecoveredPackets) (This)->lpVtbl->get_recoveredPackets(This,plRecoveredPackets)
#define IWMPNetwork_get_sourceProtocol(This,pbstrSourceProtocol) (This)->lpVtbl->get_sourceProtocol(This,pbstrSourceProtocol)
#define IWMPNetwork_get_receivedPackets(This,plReceivedPackets) (This)->lpVtbl->get_receivedPackets(This,plReceivedPackets)
#define IWMPNetwork_get_lostPackets(This,plLostPackets) (This)->lpVtbl->get_lostPackets(This,plLostPackets)
#define IWMPNetwork_get_receptionQuality(This,plReceptionQuality) (This)->lpVtbl->get_receptionQuality(This,plReceptionQuality)
#define IWMPNetwork_get_bufferingCount(This,plBufferingCount) (This)->lpVtbl->get_bufferingCount(This,plBufferingCount)
#define IWMPNetwork_get_bufferingProgress(This,plBufferingProgress) (This)->lpVtbl->get_bufferingProgress(This,plBufferingProgress)
#define IWMPNetwork_get_bufferingTime(This,plBufferingTime) (This)->lpVtbl->get_bufferingTime(This,plBufferingTime)
#define IWMPNetwork_put_bufferingTime(This,plBufferingTime) (This)->lpVtbl->put_bufferingTime(This,plBufferingTime)
#define IWMPNetwork_get_frameRate(This,plFrameRate) (This)->lpVtbl->get_frameRate(This,plFrameRate)
#define IWMPNetwork_get_maxBitRate(This,plBitRate) (This)->lpVtbl->get_maxBitRate(This,plBitRate)
#define IWMPNetwork_get_bitRate(This,plBitRate) (This)->lpVtbl->get_bitRate(This,plBitRate)
#define IWMPNetwork_getProxySettings(This,bstrProtocol,plProxySetting) (This)->lpVtbl->getProxySettings(This,bstrProtocol,plProxySetting)
#define IWMPNetwork_setProxySettings(This,bstrProtocol,lProxySetting) (This)->lpVtbl->setProxySettings(This,bstrProtocol,lProxySetting)
#define IWMPNetwork_getProxyName(This,bstrProtocol,pbstrProxyName) (This)->lpVtbl->getProxyName(This,bstrProtocol,pbstrProxyName)
#define IWMPNetwork_setProxyName(This,bstrProtocol,bstrProxyName) (This)->lpVtbl->setProxyName(This,bstrProtocol,bstrProxyName)
#define IWMPNetwork_getProxyPort(This,bstrProtocol,lProxyPort) (This)->lpVtbl->getProxyPort(This,bstrProtocol,lProxyPort)
#define IWMPNetwork_setProxyPort(This,bstrProtocol,lProxyPort) (This)->lpVtbl->setProxyPort(This,bstrProtocol,lProxyPort)
#define IWMPNetwork_getProxyExceptionList(This,bstrProtocol,pbstrExceptionList) (This)->lpVtbl->getProxyExceptionList(This,bstrProtocol,pbstrExceptionList)
#define IWMPNetwork_setProxyExceptionList(This,bstrProtocol,pbstrExceptionList) (This)->lpVtbl->setProxyExceptionList(This,bstrProtocol,pbstrExceptionList)
#define IWMPNetwork_getProxyBypassForLocal(This,bstrProtocol,pfBypassForLocal) (This)->lpVtbl->getProxyBypassForLocal(This,bstrProtocol,pfBypassForLocal)
#define IWMPNetwork_setProxyBypassForLocal(This,bstrProtocol,fBypassForLocal) (This)->lpVtbl->setProxyBypassForLocal(This,bstrProtocol,fBypassForLocal)
#define IWMPNetwork_get_maxBandwidth(This,lMaxBandwidth) (This)->lpVtbl->get_maxBandwidth(This,lMaxBandwidth)
#define IWMPNetwork_put_maxBandwidth(This,lMaxBandwidth) (This)->lpVtbl->put_maxBandwidth(This,lMaxBandwidth)
#define IWMPNetwork_get_downloadProgress(This,plDownloadProgress) (This)->lpVtbl->get_downloadProgress(This,plDownloadProgress)
#define IWMPNetwork_get_encodedFrameRate(This,plFrameRate) (This)->lpVtbl->get_encodedFrameRate(This,plFrameRate)
#define IWMPNetwork_get_framesSkipped(This,plFrames) (This)->lpVtbl->get_framesSkipped(This,plFrames)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IWMPNetwork_QueryInterface(IWMPNetwork* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWMPNetwork_AddRef(IWMPNetwork* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWMPNetwork_Release(IWMPNetwork* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IWMPNetwork_GetTypeInfoCount(IWMPNetwork* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IWMPNetwork_GetTypeInfo(IWMPNetwork* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IWMPNetwork_GetIDsOfNames(IWMPNetwork* 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 IWMPNetwork_Invoke(IWMPNetwork* 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);
}
/*** IWMPNetwork methods ***/
static __WIDL_INLINE HRESULT IWMPNetwork_get_bandWidth(IWMPNetwork* This,LONG *plBandwidth) {
    return This->lpVtbl->get_bandWidth(This,plBandwidth);
}
static __WIDL_INLINE HRESULT IWMPNetwork_get_recoveredPackets(IWMPNetwork* This,LONG *plRecoveredPackets) {
    return This->lpVtbl->get_recoveredPackets(This,plRecoveredPackets);
}
static __WIDL_INLINE HRESULT IWMPNetwork_get_sourceProtocol(IWMPNetwork* This,BSTR *pbstrSourceProtocol) {
    return This->lpVtbl->get_sourceProtocol(This,pbstrSourceProtocol);
}
static __WIDL_INLINE HRESULT IWMPNetwork_get_receivedPackets(IWMPNetwork* This,LONG *plReceivedPackets) {
    return This->lpVtbl->get_receivedPackets(This,plReceivedPackets);
}
static __WIDL_INLINE HRESULT IWMPNetwork_get_lostPackets(IWMPNetwork* This,LONG *plLostPackets) {
    return This->lpVtbl->get_lostPackets(This,plLostPackets);
}
static __WIDL_INLINE HRESULT IWMPNetwork_get_receptionQuality(IWMPNetwork* This,LONG *plReceptionQuality) {
    return This->lpVtbl->get_receptionQuality(This,plReceptionQuality);
}
static __WIDL_INLINE HRESULT IWMPNetwork_get_bufferingCount(IWMPNetwork* This,LONG *plBufferingCount) {
    return This->lpVtbl->get_bufferingCount(This,plBufferingCount);
}
static __WIDL_INLINE HRESULT IWMPNetwork_get_bufferingProgress(IWMPNetwork* This,LONG *plBufferingProgress) {
    return This->lpVtbl->get_bufferingProgress(This,plBufferingProgress);
}
static __WIDL_INLINE HRESULT IWMPNetwork_get_bufferingTime(IWMPNetwork* This,LONG *plBufferingTime) {
    return This->lpVtbl->get_bufferingTime(This,plBufferingTime);
}
static __WIDL_INLINE HRESULT IWMPNetwork_put_bufferingTime(IWMPNetwork* This,LONG plBufferingTime) {
    return This->lpVtbl->put_bufferingTime(This,plBufferingTime);
}
static __WIDL_INLINE HRESULT IWMPNetwork_get_frameRate(IWMPNetwork* This,LONG *plFrameRate) {
    return This->lpVtbl->get_frameRate(This,plFrameRate);
}
static __WIDL_INLINE HRESULT IWMPNetwork_get_maxBitRate(IWMPNetwork* This,LONG *plBitRate) {
    return This->lpVtbl->get_maxBitRate(This,plBitRate);
}
static __WIDL_INLINE HRESULT IWMPNetwork_get_bitRate(IWMPNetwork* This,LONG *plBitRate) {
    return This->lpVtbl->get_bitRate(This,plBitRate);
}
static __WIDL_INLINE HRESULT IWMPNetwork_getProxySettings(IWMPNetwork* This,BSTR bstrProtocol,LONG *plProxySetting) {
    return This->lpVtbl->getProxySettings(This,bstrProtocol,plProxySetting);
}
static __WIDL_INLINE HRESULT IWMPNetwork_setProxySettings(IWMPNetwork* This,BSTR bstrProtocol,LONG lProxySetting) {
    return This->lpVtbl->setProxySettings(This,bstrProtocol,lProxySetting);
}
static __WIDL_INLINE HRESULT IWMPNetwork_getProxyName(IWMPNetwork* This,BSTR bstrProtocol,BSTR *pbstrProxyName) {
    return This->lpVtbl->getProxyName(This,bstrProtocol,pbstrProxyName);
}
static __WIDL_INLINE HRESULT IWMPNetwork_setProxyName(IWMPNetwork* This,BSTR bstrProtocol,BSTR bstrProxyName) {
    return This->lpVtbl->setProxyName(This,bstrProtocol,bstrProxyName);
}
static __WIDL_INLINE HRESULT IWMPNetwork_getProxyPort(IWMPNetwork* This,BSTR bstrProtocol,LONG *lProxyPort) {
    return This->lpVtbl->getProxyPort(This,bstrProtocol,lProxyPort);
}
static __WIDL_INLINE HRESULT IWMPNetwork_setProxyPort(IWMPNetwork* This,BSTR bstrProtocol,LONG lProxyPort) {
    return This->lpVtbl->setProxyPort(This,bstrProtocol,lProxyPort);
}
static __WIDL_INLINE HRESULT IWMPNetwork_getProxyExceptionList(IWMPNetwork* This,BSTR bstrProtocol,BSTR *pbstrExceptionList) {
    return This->lpVtbl->getProxyExceptionList(This,bstrProtocol,pbstrExceptionList);
}
static __WIDL_INLINE HRESULT IWMPNetwork_setProxyExceptionList(IWMPNetwork* This,BSTR bstrProtocol,BSTR pbstrExceptionList) {
    return This->lpVtbl->setProxyExceptionList(This,bstrProtocol,pbstrExceptionList);
}
static __WIDL_INLINE HRESULT IWMPNetwork_getProxyBypassForLocal(IWMPNetwork* This,BSTR bstrProtocol,VARIANT_BOOL *pfBypassForLocal) {
    return This->lpVtbl->getProxyBypassForLocal(This,bstrProtocol,pfBypassForLocal);
}
static __WIDL_INLINE HRESULT IWMPNetwork_setProxyBypassForLocal(IWMPNetwork* This,BSTR bstrProtocol,VARIANT_BOOL fBypassForLocal) {
    return This->lpVtbl->setProxyBypassForLocal(This,bstrProtocol,fBypassForLocal);
}
static __WIDL_INLINE HRESULT IWMPNetwork_get_maxBandwidth(IWMPNetwork* This,LONG *lMaxBandwidth) {
    return This->lpVtbl->get_maxBandwidth(This,lMaxBandwidth);
}
static __WIDL_INLINE HRESULT IWMPNetwork_put_maxBandwidth(IWMPNetwork* This,LONG lMaxBandwidth) {
    return This->lpVtbl->put_maxBandwidth(This,lMaxBandwidth);
}
static __WIDL_INLINE HRESULT IWMPNetwork_get_downloadProgress(IWMPNetwork* This,LONG *plDownloadProgress) {
    return This->lpVtbl->get_downloadProgress(This,plDownloadProgress);
}
static __WIDL_INLINE HRESULT IWMPNetwork_get_encodedFrameRate(IWMPNetwork* This,LONG *plFrameRate) {
    return This->lpVtbl->get_encodedFrameRate(This,plFrameRate);
}
static __WIDL_INLINE HRESULT IWMPNetwork_get_framesSkipped(IWMPNetwork* This,LONG *plFrames) {
    return This->lpVtbl->get_framesSkipped(This,plFrames);
}
#endif
#endif

#endif


#endif  /* __IWMPNetwork_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMPCdrom interface
 */
#ifndef __IWMPCdrom_INTERFACE_DEFINED__
#define __IWMPCdrom_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMPCdrom, 0xcfab6e98, 0x8730, 0x11d3, 0xb3,0x88, 0x00,0xc0,0x4f,0x68,0x57,0x4b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("cfab6e98-8730-11d3-b388-00c04f68574b")
IWMPCdrom : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_driveSpecifier(
        BSTR *pbstrDrive) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Playlist(
        IWMPPlaylist **ppPlaylist) = 0;

    virtual HRESULT STDMETHODCALLTYPE eject(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMPCdrom, 0xcfab6e98, 0x8730, 0x11d3, 0xb3,0x88, 0x00,0xc0,0x4f,0x68,0x57,0x4b)
#endif
#else
typedef struct IWMPCdromVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IWMPCdrom methods ***/
    HRESULT (STDMETHODCALLTYPE *get_driveSpecifier)(
        IWMPCdrom *This,
        BSTR *pbstrDrive);

    HRESULT (STDMETHODCALLTYPE *get_Playlist)(
        IWMPCdrom *This,
        IWMPPlaylist **ppPlaylist);

    HRESULT (STDMETHODCALLTYPE *eject)(
        IWMPCdrom *This);

    END_INTERFACE
} IWMPCdromVtbl;

interface IWMPCdrom {
    CONST_VTBL IWMPCdromVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMPCdrom_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMPCdrom_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMPCdrom_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IWMPCdrom_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IWMPCdrom_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IWMPCdrom_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IWMPCdrom_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IWMPCdrom methods ***/
#define IWMPCdrom_get_driveSpecifier(This,pbstrDrive) (This)->lpVtbl->get_driveSpecifier(This,pbstrDrive)
#define IWMPCdrom_get_Playlist(This,ppPlaylist) (This)->lpVtbl->get_Playlist(This,ppPlaylist)
#define IWMPCdrom_eject(This) (This)->lpVtbl->eject(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IWMPCdrom_QueryInterface(IWMPCdrom* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWMPCdrom_AddRef(IWMPCdrom* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWMPCdrom_Release(IWMPCdrom* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IWMPCdrom_GetTypeInfoCount(IWMPCdrom* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IWMPCdrom_GetTypeInfo(IWMPCdrom* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IWMPCdrom_GetIDsOfNames(IWMPCdrom* 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 IWMPCdrom_Invoke(IWMPCdrom* 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);
}
/*** IWMPCdrom methods ***/
static __WIDL_INLINE HRESULT IWMPCdrom_get_driveSpecifier(IWMPCdrom* This,BSTR *pbstrDrive) {
    return This->lpVtbl->get_driveSpecifier(This,pbstrDrive);
}
static __WIDL_INLINE HRESULT IWMPCdrom_get_Playlist(IWMPCdrom* This,IWMPPlaylist **ppPlaylist) {
    return This->lpVtbl->get_Playlist(This,ppPlaylist);
}
static __WIDL_INLINE HRESULT IWMPCdrom_eject(IWMPCdrom* This) {
    return This->lpVtbl->eject(This);
}
#endif
#endif

#endif


#endif  /* __IWMPCdrom_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMPCdromCollection interface
 */
#ifndef __IWMPCdromCollection_INTERFACE_DEFINED__
#define __IWMPCdromCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMPCdromCollection, 0xee4c8fe2, 0x34b2, 0x11d3, 0xa3,0xbf, 0x00,0x60,0x97,0xc9,0xb3,0x44);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("ee4c8fe2-34b2-11d3-a3bf-006097c9b344")
IWMPCdromCollection : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_count(
        LONG *plCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE Item(
        LONG lIndex,
        IWMPCdrom **ppItem) = 0;

    virtual HRESULT STDMETHODCALLTYPE getByDriveSpecifier(
        BSTR bstrDriveSpecifier,
        IWMPCdrom **ppCdrom) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMPCdromCollection, 0xee4c8fe2, 0x34b2, 0x11d3, 0xa3,0xbf, 0x00,0x60,0x97,0xc9,0xb3,0x44)
#endif
#else
typedef struct IWMPCdromCollectionVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IWMPCdromCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *get_count)(
        IWMPCdromCollection *This,
        LONG *plCount);

    HRESULT (STDMETHODCALLTYPE *Item)(
        IWMPCdromCollection *This,
        LONG lIndex,
        IWMPCdrom **ppItem);

    HRESULT (STDMETHODCALLTYPE *getByDriveSpecifier)(
        IWMPCdromCollection *This,
        BSTR bstrDriveSpecifier,
        IWMPCdrom **ppCdrom);

    END_INTERFACE
} IWMPCdromCollectionVtbl;

interface IWMPCdromCollection {
    CONST_VTBL IWMPCdromCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMPCdromCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMPCdromCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMPCdromCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IWMPCdromCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IWMPCdromCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IWMPCdromCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IWMPCdromCollection_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IWMPCdromCollection methods ***/
#define IWMPCdromCollection_get_count(This,plCount) (This)->lpVtbl->get_count(This,plCount)
#define IWMPCdromCollection_Item(This,lIndex,ppItem) (This)->lpVtbl->Item(This,lIndex,ppItem)
#define IWMPCdromCollection_getByDriveSpecifier(This,bstrDriveSpecifier,ppCdrom) (This)->lpVtbl->getByDriveSpecifier(This,bstrDriveSpecifier,ppCdrom)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IWMPCdromCollection_QueryInterface(IWMPCdromCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWMPCdromCollection_AddRef(IWMPCdromCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWMPCdromCollection_Release(IWMPCdromCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IWMPCdromCollection_GetTypeInfoCount(IWMPCdromCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IWMPCdromCollection_GetTypeInfo(IWMPCdromCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IWMPCdromCollection_GetIDsOfNames(IWMPCdromCollection* 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 IWMPCdromCollection_Invoke(IWMPCdromCollection* 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);
}
/*** IWMPCdromCollection methods ***/
static __WIDL_INLINE HRESULT IWMPCdromCollection_get_count(IWMPCdromCollection* This,LONG *plCount) {
    return This->lpVtbl->get_count(This,plCount);
}
static __WIDL_INLINE HRESULT IWMPCdromCollection_Item(IWMPCdromCollection* This,LONG lIndex,IWMPCdrom **ppItem) {
    return This->lpVtbl->Item(This,lIndex,ppItem);
}
static __WIDL_INLINE HRESULT IWMPCdromCollection_getByDriveSpecifier(IWMPCdromCollection* This,BSTR bstrDriveSpecifier,IWMPCdrom **ppCdrom) {
    return This->lpVtbl->getByDriveSpecifier(This,bstrDriveSpecifier,ppCdrom);
}
#endif
#endif

#endif


#endif  /* __IWMPCdromCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMPDVD interface
 */
#ifndef __IWMPDVD_INTERFACE_DEFINED__
#define __IWMPDVD_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMPDVD, 0x8da61686, 0x4668, 0x4a5c, 0xae,0x5d, 0x80,0x31,0x93,0x29,0x3d,0xbe);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("8da61686-4668-4a5c-ae5d-803193293dbe")
IWMPDVD : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_isAvailable(
        BSTR bstrItem,
        VARIANT_BOOL *pIsAvailable) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_domain(
        BSTR *strDomain) = 0;

    virtual HRESULT STDMETHODCALLTYPE topMenu(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE titleMenu(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE back(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE resume(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMPDVD, 0x8da61686, 0x4668, 0x4a5c, 0xae,0x5d, 0x80,0x31,0x93,0x29,0x3d,0xbe)
#endif
#else
typedef struct IWMPDVDVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IWMPDVD methods ***/
    HRESULT (STDMETHODCALLTYPE *get_isAvailable)(
        IWMPDVD *This,
        BSTR bstrItem,
        VARIANT_BOOL *pIsAvailable);

    HRESULT (STDMETHODCALLTYPE *get_domain)(
        IWMPDVD *This,
        BSTR *strDomain);

    HRESULT (STDMETHODCALLTYPE *topMenu)(
        IWMPDVD *This);

    HRESULT (STDMETHODCALLTYPE *titleMenu)(
        IWMPDVD *This);

    HRESULT (STDMETHODCALLTYPE *back)(
        IWMPDVD *This);

    HRESULT (STDMETHODCALLTYPE *resume)(
        IWMPDVD *This);

    END_INTERFACE
} IWMPDVDVtbl;

interface IWMPDVD {
    CONST_VTBL IWMPDVDVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMPDVD_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMPDVD_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMPDVD_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IWMPDVD_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IWMPDVD_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IWMPDVD_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IWMPDVD_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IWMPDVD methods ***/
#define IWMPDVD_get_isAvailable(This,bstrItem,pIsAvailable) (This)->lpVtbl->get_isAvailable(This,bstrItem,pIsAvailable)
#define IWMPDVD_get_domain(This,strDomain) (This)->lpVtbl->get_domain(This,strDomain)
#define IWMPDVD_topMenu(This) (This)->lpVtbl->topMenu(This)
#define IWMPDVD_titleMenu(This) (This)->lpVtbl->titleMenu(This)
#define IWMPDVD_back(This) (This)->lpVtbl->back(This)
#define IWMPDVD_resume(This) (This)->lpVtbl->resume(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IWMPDVD_QueryInterface(IWMPDVD* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWMPDVD_AddRef(IWMPDVD* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWMPDVD_Release(IWMPDVD* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IWMPDVD_GetTypeInfoCount(IWMPDVD* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IWMPDVD_GetTypeInfo(IWMPDVD* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IWMPDVD_GetIDsOfNames(IWMPDVD* 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 IWMPDVD_Invoke(IWMPDVD* 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);
}
/*** IWMPDVD methods ***/
static __WIDL_INLINE HRESULT IWMPDVD_get_isAvailable(IWMPDVD* This,BSTR bstrItem,VARIANT_BOOL *pIsAvailable) {
    return This->lpVtbl->get_isAvailable(This,bstrItem,pIsAvailable);
}
static __WIDL_INLINE HRESULT IWMPDVD_get_domain(IWMPDVD* This,BSTR *strDomain) {
    return This->lpVtbl->get_domain(This,strDomain);
}
static __WIDL_INLINE HRESULT IWMPDVD_topMenu(IWMPDVD* This) {
    return This->lpVtbl->topMenu(This);
}
static __WIDL_INLINE HRESULT IWMPDVD_titleMenu(IWMPDVD* This) {
    return This->lpVtbl->titleMenu(This);
}
static __WIDL_INLINE HRESULT IWMPDVD_back(IWMPDVD* This) {
    return This->lpVtbl->back(This);
}
static __WIDL_INLINE HRESULT IWMPDVD_resume(IWMPDVD* This) {
    return This->lpVtbl->resume(This);
}
#endif
#endif

#endif


#endif  /* __IWMPDVD_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMPClosedCaption interface
 */
#ifndef __IWMPClosedCaption_INTERFACE_DEFINED__
#define __IWMPClosedCaption_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMPClosedCaption, 0x4f2df574, 0xc588, 0x11d3, 0x9e,0xd0, 0x00,0xc0,0x4f,0xb6,0xe9,0x37);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("4f2df574-c588-11d3-9ed0-00c04fb6e937")
IWMPClosedCaption : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_SAMIStyle(
        BSTR *pbstrSAMIStyle) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_SAMIStyle(
        BSTR pbstrSAMIStyle) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_SAMILang(
        BSTR *pbstrSAMILang) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_SAMILang(
        BSTR pbstrSAMILang) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_SAMIFileName(
        BSTR *pbstrSAMIFileName) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_SAMIFileName(
        BSTR pbstrSAMIFileName) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_captioningId(
        BSTR *pbstrCaptioningID) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_captioningId(
        BSTR pbstrCaptioningID) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMPClosedCaption, 0x4f2df574, 0xc588, 0x11d3, 0x9e,0xd0, 0x00,0xc0,0x4f,0xb6,0xe9,0x37)
#endif
#else
typedef struct IWMPClosedCaptionVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IWMPClosedCaption methods ***/
    HRESULT (STDMETHODCALLTYPE *get_SAMIStyle)(
        IWMPClosedCaption *This,
        BSTR *pbstrSAMIStyle);

    HRESULT (STDMETHODCALLTYPE *put_SAMIStyle)(
        IWMPClosedCaption *This,
        BSTR pbstrSAMIStyle);

    HRESULT (STDMETHODCALLTYPE *get_SAMILang)(
        IWMPClosedCaption *This,
        BSTR *pbstrSAMILang);

    HRESULT (STDMETHODCALLTYPE *put_SAMILang)(
        IWMPClosedCaption *This,
        BSTR pbstrSAMILang);

    HRESULT (STDMETHODCALLTYPE *get_SAMIFileName)(
        IWMPClosedCaption *This,
        BSTR *pbstrSAMIFileName);

    HRESULT (STDMETHODCALLTYPE *put_SAMIFileName)(
        IWMPClosedCaption *This,
        BSTR pbstrSAMIFileName);

    HRESULT (STDMETHODCALLTYPE *get_captioningId)(
        IWMPClosedCaption *This,
        BSTR *pbstrCaptioningID);

    HRESULT (STDMETHODCALLTYPE *put_captioningId)(
        IWMPClosedCaption *This,
        BSTR pbstrCaptioningID);

    END_INTERFACE
} IWMPClosedCaptionVtbl;

interface IWMPClosedCaption {
    CONST_VTBL IWMPClosedCaptionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMPClosedCaption_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMPClosedCaption_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMPClosedCaption_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IWMPClosedCaption_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IWMPClosedCaption_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IWMPClosedCaption_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IWMPClosedCaption_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IWMPClosedCaption methods ***/
#define IWMPClosedCaption_get_SAMIStyle(This,pbstrSAMIStyle) (This)->lpVtbl->get_SAMIStyle(This,pbstrSAMIStyle)
#define IWMPClosedCaption_put_SAMIStyle(This,pbstrSAMIStyle) (This)->lpVtbl->put_SAMIStyle(This,pbstrSAMIStyle)
#define IWMPClosedCaption_get_SAMILang(This,pbstrSAMILang) (This)->lpVtbl->get_SAMILang(This,pbstrSAMILang)
#define IWMPClosedCaption_put_SAMILang(This,pbstrSAMILang) (This)->lpVtbl->put_SAMILang(This,pbstrSAMILang)
#define IWMPClosedCaption_get_SAMIFileName(This,pbstrSAMIFileName) (This)->lpVtbl->get_SAMIFileName(This,pbstrSAMIFileName)
#define IWMPClosedCaption_put_SAMIFileName(This,pbstrSAMIFileName) (This)->lpVtbl->put_SAMIFileName(This,pbstrSAMIFileName)
#define IWMPClosedCaption_get_captioningId(This,pbstrCaptioningID) (This)->lpVtbl->get_captioningId(This,pbstrCaptioningID)
#define IWMPClosedCaption_put_captioningId(This,pbstrCaptioningID) (This)->lpVtbl->put_captioningId(This,pbstrCaptioningID)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IWMPClosedCaption_QueryInterface(IWMPClosedCaption* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWMPClosedCaption_AddRef(IWMPClosedCaption* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWMPClosedCaption_Release(IWMPClosedCaption* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IWMPClosedCaption_GetTypeInfoCount(IWMPClosedCaption* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IWMPClosedCaption_GetTypeInfo(IWMPClosedCaption* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IWMPClosedCaption_GetIDsOfNames(IWMPClosedCaption* 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 IWMPClosedCaption_Invoke(IWMPClosedCaption* 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);
}
/*** IWMPClosedCaption methods ***/
static __WIDL_INLINE HRESULT IWMPClosedCaption_get_SAMIStyle(IWMPClosedCaption* This,BSTR *pbstrSAMIStyle) {
    return This->lpVtbl->get_SAMIStyle(This,pbstrSAMIStyle);
}
static __WIDL_INLINE HRESULT IWMPClosedCaption_put_SAMIStyle(IWMPClosedCaption* This,BSTR pbstrSAMIStyle) {
    return This->lpVtbl->put_SAMIStyle(This,pbstrSAMIStyle);
}
static __WIDL_INLINE HRESULT IWMPClosedCaption_get_SAMILang(IWMPClosedCaption* This,BSTR *pbstrSAMILang) {
    return This->lpVtbl->get_SAMILang(This,pbstrSAMILang);
}
static __WIDL_INLINE HRESULT IWMPClosedCaption_put_SAMILang(IWMPClosedCaption* This,BSTR pbstrSAMILang) {
    return This->lpVtbl->put_SAMILang(This,pbstrSAMILang);
}
static __WIDL_INLINE HRESULT IWMPClosedCaption_get_SAMIFileName(IWMPClosedCaption* This,BSTR *pbstrSAMIFileName) {
    return This->lpVtbl->get_SAMIFileName(This,pbstrSAMIFileName);
}
static __WIDL_INLINE HRESULT IWMPClosedCaption_put_SAMIFileName(IWMPClosedCaption* This,BSTR pbstrSAMIFileName) {
    return This->lpVtbl->put_SAMIFileName(This,pbstrSAMIFileName);
}
static __WIDL_INLINE HRESULT IWMPClosedCaption_get_captioningId(IWMPClosedCaption* This,BSTR *pbstrCaptioningID) {
    return This->lpVtbl->get_captioningId(This,pbstrCaptioningID);
}
static __WIDL_INLINE HRESULT IWMPClosedCaption_put_captioningId(IWMPClosedCaption* This,BSTR pbstrCaptioningID) {
    return This->lpVtbl->put_captioningId(This,pbstrCaptioningID);
}
#endif
#endif

#endif


#endif  /* __IWMPClosedCaption_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMPErrorItem interface
 */
#ifndef __IWMPErrorItem_INTERFACE_DEFINED__
#define __IWMPErrorItem_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMPErrorItem, 0x3614c646, 0x3b3b, 0x4de7, 0xa8,0x1e, 0x93,0x0e,0x3f,0x21,0x27,0xb3);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3614c646-3b3b-4de7-a81e-930e3f2127b3")
IWMPErrorItem : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_errorCode(
        LONG *phr) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_errorDescription(
        BSTR *pbstrDescription) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_errorContext(
        VARIANT *pvarContext) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_remedy(
        LONG *plRemedy) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_customUrl(
        BSTR *pbstrCustomUrl) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMPErrorItem, 0x3614c646, 0x3b3b, 0x4de7, 0xa8,0x1e, 0x93,0x0e,0x3f,0x21,0x27,0xb3)
#endif
#else
typedef struct IWMPErrorItemVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IWMPErrorItem methods ***/
    HRESULT (STDMETHODCALLTYPE *get_errorCode)(
        IWMPErrorItem *This,
        LONG *phr);

    HRESULT (STDMETHODCALLTYPE *get_errorDescription)(
        IWMPErrorItem *This,
        BSTR *pbstrDescription);

    HRESULT (STDMETHODCALLTYPE *get_errorContext)(
        IWMPErrorItem *This,
        VARIANT *pvarContext);

    HRESULT (STDMETHODCALLTYPE *get_remedy)(
        IWMPErrorItem *This,
        LONG *plRemedy);

    HRESULT (STDMETHODCALLTYPE *get_customUrl)(
        IWMPErrorItem *This,
        BSTR *pbstrCustomUrl);

    END_INTERFACE
} IWMPErrorItemVtbl;

interface IWMPErrorItem {
    CONST_VTBL IWMPErrorItemVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMPErrorItem_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMPErrorItem_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMPErrorItem_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IWMPErrorItem_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IWMPErrorItem_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IWMPErrorItem_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IWMPErrorItem_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IWMPErrorItem methods ***/
#define IWMPErrorItem_get_errorCode(This,phr) (This)->lpVtbl->get_errorCode(This,phr)
#define IWMPErrorItem_get_errorDescription(This,pbstrDescription) (This)->lpVtbl->get_errorDescription(This,pbstrDescription)
#define IWMPErrorItem_get_errorContext(This,pvarContext) (This)->lpVtbl->get_errorContext(This,pvarContext)
#define IWMPErrorItem_get_remedy(This,plRemedy) (This)->lpVtbl->get_remedy(This,plRemedy)
#define IWMPErrorItem_get_customUrl(This,pbstrCustomUrl) (This)->lpVtbl->get_customUrl(This,pbstrCustomUrl)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IWMPErrorItem_QueryInterface(IWMPErrorItem* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWMPErrorItem_AddRef(IWMPErrorItem* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWMPErrorItem_Release(IWMPErrorItem* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IWMPErrorItem_GetTypeInfoCount(IWMPErrorItem* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IWMPErrorItem_GetTypeInfo(IWMPErrorItem* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IWMPErrorItem_GetIDsOfNames(IWMPErrorItem* 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 IWMPErrorItem_Invoke(IWMPErrorItem* 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);
}
/*** IWMPErrorItem methods ***/
static __WIDL_INLINE HRESULT IWMPErrorItem_get_errorCode(IWMPErrorItem* This,LONG *phr) {
    return This->lpVtbl->get_errorCode(This,phr);
}
static __WIDL_INLINE HRESULT IWMPErrorItem_get_errorDescription(IWMPErrorItem* This,BSTR *pbstrDescription) {
    return This->lpVtbl->get_errorDescription(This,pbstrDescription);
}
static __WIDL_INLINE HRESULT IWMPErrorItem_get_errorContext(IWMPErrorItem* This,VARIANT *pvarContext) {
    return This->lpVtbl->get_errorContext(This,pvarContext);
}
static __WIDL_INLINE HRESULT IWMPErrorItem_get_remedy(IWMPErrorItem* This,LONG *plRemedy) {
    return This->lpVtbl->get_remedy(This,plRemedy);
}
static __WIDL_INLINE HRESULT IWMPErrorItem_get_customUrl(IWMPErrorItem* This,BSTR *pbstrCustomUrl) {
    return This->lpVtbl->get_customUrl(This,pbstrCustomUrl);
}
#endif
#endif

#endif


#endif  /* __IWMPErrorItem_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMPMedia2 interface
 */
#ifndef __IWMPMedia2_INTERFACE_DEFINED__
#define __IWMPMedia2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMPMedia2, 0xab7c88bb, 0x143e, 0x4ea4, 0xac,0xc3, 0xe4,0x35,0x0b,0x21,0x06,0xc3);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("ab7c88bb-143e-4ea4-acc3-e4350b2106c3")
IWMPMedia2 : public IWMPMedia
{
    virtual HRESULT STDMETHODCALLTYPE get_error(
        IWMPErrorItem **out) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMPMedia2, 0xab7c88bb, 0x143e, 0x4ea4, 0xac,0xc3, 0xe4,0x35,0x0b,0x21,0x06,0xc3)
#endif
#else
typedef struct IWMPMedia2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IWMPMedia methods ***/
    HRESULT (STDMETHODCALLTYPE *get_isIdentical)(
        IWMPMedia2 *This,
        IWMPMedia *pIWMPMedia,
        VARIANT_BOOL *pvbool);

    HRESULT (STDMETHODCALLTYPE *get_sourceURL)(
        IWMPMedia2 *This,
        BSTR *pbstrSourceURL);

    HRESULT (STDMETHODCALLTYPE *get_name)(
        IWMPMedia2 *This,
        BSTR *pbstrName);

    HRESULT (STDMETHODCALLTYPE *put_name)(
        IWMPMedia2 *This,
        BSTR pbstrName);

    HRESULT (STDMETHODCALLTYPE *get_imageSourceWidth)(
        IWMPMedia2 *This,
        LONG *pWidth);

    HRESULT (STDMETHODCALLTYPE *get_imageSourceHeight)(
        IWMPMedia2 *This,
        LONG *pHeight);

    HRESULT (STDMETHODCALLTYPE *get_markerCount)(
        IWMPMedia2 *This,
        LONG *pMarkerCount);

    HRESULT (STDMETHODCALLTYPE *getMarkerTime)(
        IWMPMedia2 *This,
        LONG MarkerNum,
        double *pMarkerTime);

    HRESULT (STDMETHODCALLTYPE *getMarkerName)(
        IWMPMedia2 *This,
        LONG MarkerNum,
        BSTR *pbstrMarkerName);

    HRESULT (STDMETHODCALLTYPE *get_duration)(
        IWMPMedia2 *This,
        double *pDuration);

    HRESULT (STDMETHODCALLTYPE *get_durationString)(
        IWMPMedia2 *This,
        BSTR *pbstrDuration);

    HRESULT (STDMETHODCALLTYPE *get_attributeCount)(
        IWMPMedia2 *This,
        LONG *plCount);

    HRESULT (STDMETHODCALLTYPE *getAttributeName)(
        IWMPMedia2 *This,
        LONG lIndex,
        BSTR *pbstrItemName);

    HRESULT (STDMETHODCALLTYPE *getItemInfo)(
        IWMPMedia2 *This,
        BSTR bstrItemName,
        BSTR *pbstrVal);

    HRESULT (STDMETHODCALLTYPE *setItemInfo)(
        IWMPMedia2 *This,
        BSTR bstrItemName,
        BSTR bstrVal);

    HRESULT (STDMETHODCALLTYPE *getItemInfoByAtom)(
        IWMPMedia2 *This,
        LONG lAtom,
        BSTR *pbstrVal);

    HRESULT (STDMETHODCALLTYPE *isMemberOf)(
        IWMPMedia2 *This,
        IWMPPlaylist *pPlaylist,
        VARIANT_BOOL *pvarfIsMemberOf);

    HRESULT (STDMETHODCALLTYPE *isReadOnlyItem)(
        IWMPMedia2 *This,
        BSTR bstrItemName,
        VARIANT_BOOL *pvarfIsReadOnly);

    /*** IWMPMedia2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_error)(
        IWMPMedia2 *This,
        IWMPErrorItem **out);

    END_INTERFACE
} IWMPMedia2Vtbl;

interface IWMPMedia2 {
    CONST_VTBL IWMPMedia2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMPMedia2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMPMedia2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMPMedia2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IWMPMedia2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IWMPMedia2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IWMPMedia2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IWMPMedia2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IWMPMedia methods ***/
#define IWMPMedia2_get_isIdentical(This,pIWMPMedia,pvbool) (This)->lpVtbl->get_isIdentical(This,pIWMPMedia,pvbool)
#define IWMPMedia2_get_sourceURL(This,pbstrSourceURL) (This)->lpVtbl->get_sourceURL(This,pbstrSourceURL)
#define IWMPMedia2_get_name(This,pbstrName) (This)->lpVtbl->get_name(This,pbstrName)
#define IWMPMedia2_put_name(This,pbstrName) (This)->lpVtbl->put_name(This,pbstrName)
#define IWMPMedia2_get_imageSourceWidth(This,pWidth) (This)->lpVtbl->get_imageSourceWidth(This,pWidth)
#define IWMPMedia2_get_imageSourceHeight(This,pHeight) (This)->lpVtbl->get_imageSourceHeight(This,pHeight)
#define IWMPMedia2_get_markerCount(This,pMarkerCount) (This)->lpVtbl->get_markerCount(This,pMarkerCount)
#define IWMPMedia2_getMarkerTime(This,MarkerNum,pMarkerTime) (This)->lpVtbl->getMarkerTime(This,MarkerNum,pMarkerTime)
#define IWMPMedia2_getMarkerName(This,MarkerNum,pbstrMarkerName) (This)->lpVtbl->getMarkerName(This,MarkerNum,pbstrMarkerName)
#define IWMPMedia2_get_duration(This,pDuration) (This)->lpVtbl->get_duration(This,pDuration)
#define IWMPMedia2_get_durationString(This,pbstrDuration) (This)->lpVtbl->get_durationString(This,pbstrDuration)
#define IWMPMedia2_get_attributeCount(This,plCount) (This)->lpVtbl->get_attributeCount(This,plCount)
#define IWMPMedia2_getAttributeName(This,lIndex,pbstrItemName) (This)->lpVtbl->getAttributeName(This,lIndex,pbstrItemName)
#define IWMPMedia2_getItemInfo(This,bstrItemName,pbstrVal) (This)->lpVtbl->getItemInfo(This,bstrItemName,pbstrVal)
#define IWMPMedia2_setItemInfo(This,bstrItemName,bstrVal) (This)->lpVtbl->setItemInfo(This,bstrItemName,bstrVal)
#define IWMPMedia2_getItemInfoByAtom(This,lAtom,pbstrVal) (This)->lpVtbl->getItemInfoByAtom(This,lAtom,pbstrVal)
#define IWMPMedia2_isMemberOf(This,pPlaylist,pvarfIsMemberOf) (This)->lpVtbl->isMemberOf(This,pPlaylist,pvarfIsMemberOf)
#define IWMPMedia2_isReadOnlyItem(This,bstrItemName,pvarfIsReadOnly) (This)->lpVtbl->isReadOnlyItem(This,bstrItemName,pvarfIsReadOnly)
/*** IWMPMedia2 methods ***/
#define IWMPMedia2_get_error(This,out) (This)->lpVtbl->get_error(This,out)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IWMPMedia2_QueryInterface(IWMPMedia2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWMPMedia2_AddRef(IWMPMedia2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWMPMedia2_Release(IWMPMedia2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IWMPMedia2_GetTypeInfoCount(IWMPMedia2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IWMPMedia2_GetTypeInfo(IWMPMedia2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IWMPMedia2_GetIDsOfNames(IWMPMedia2* 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 IWMPMedia2_Invoke(IWMPMedia2* 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);
}
/*** IWMPMedia methods ***/
static __WIDL_INLINE HRESULT IWMPMedia2_get_isIdentical(IWMPMedia2* This,IWMPMedia *pIWMPMedia,VARIANT_BOOL *pvbool) {
    return This->lpVtbl->get_isIdentical(This,pIWMPMedia,pvbool);
}
static __WIDL_INLINE HRESULT IWMPMedia2_get_sourceURL(IWMPMedia2* This,BSTR *pbstrSourceURL) {
    return This->lpVtbl->get_sourceURL(This,pbstrSourceURL);
}
static __WIDL_INLINE HRESULT IWMPMedia2_get_name(IWMPMedia2* This,BSTR *pbstrName) {
    return This->lpVtbl->get_name(This,pbstrName);
}
static __WIDL_INLINE HRESULT IWMPMedia2_put_name(IWMPMedia2* This,BSTR pbstrName) {
    return This->lpVtbl->put_name(This,pbstrName);
}
static __WIDL_INLINE HRESULT IWMPMedia2_get_imageSourceWidth(IWMPMedia2* This,LONG *pWidth) {
    return This->lpVtbl->get_imageSourceWidth(This,pWidth);
}
static __WIDL_INLINE HRESULT IWMPMedia2_get_imageSourceHeight(IWMPMedia2* This,LONG *pHeight) {
    return This->lpVtbl->get_imageSourceHeight(This,pHeight);
}
static __WIDL_INLINE HRESULT IWMPMedia2_get_markerCount(IWMPMedia2* This,LONG *pMarkerCount) {
    return This->lpVtbl->get_markerCount(This,pMarkerCount);
}
static __WIDL_INLINE HRESULT IWMPMedia2_getMarkerTime(IWMPMedia2* This,LONG MarkerNum,double *pMarkerTime) {
    return This->lpVtbl->getMarkerTime(This,MarkerNum,pMarkerTime);
}
static __WIDL_INLINE HRESULT IWMPMedia2_getMarkerName(IWMPMedia2* This,LONG MarkerNum,BSTR *pbstrMarkerName) {
    return This->lpVtbl->getMarkerName(This,MarkerNum,pbstrMarkerName);
}
static __WIDL_INLINE HRESULT IWMPMedia2_get_duration(IWMPMedia2* This,double *pDuration) {
    return This->lpVtbl->get_duration(This,pDuration);
}
static __WIDL_INLINE HRESULT IWMPMedia2_get_durationString(IWMPMedia2* This,BSTR *pbstrDuration) {
    return This->lpVtbl->get_durationString(This,pbstrDuration);
}
static __WIDL_INLINE HRESULT IWMPMedia2_get_attributeCount(IWMPMedia2* This,LONG *plCount) {
    return This->lpVtbl->get_attributeCount(This,plCount);
}
static __WIDL_INLINE HRESULT IWMPMedia2_getAttributeName(IWMPMedia2* This,LONG lIndex,BSTR *pbstrItemName) {
    return This->lpVtbl->getAttributeName(This,lIndex,pbstrItemName);
}
static __WIDL_INLINE HRESULT IWMPMedia2_getItemInfo(IWMPMedia2* This,BSTR bstrItemName,BSTR *pbstrVal) {
    return This->lpVtbl->getItemInfo(This,bstrItemName,pbstrVal);
}
static __WIDL_INLINE HRESULT IWMPMedia2_setItemInfo(IWMPMedia2* This,BSTR bstrItemName,BSTR bstrVal) {
    return This->lpVtbl->setItemInfo(This,bstrItemName,bstrVal);
}
static __WIDL_INLINE HRESULT IWMPMedia2_getItemInfoByAtom(IWMPMedia2* This,LONG lAtom,BSTR *pbstrVal) {
    return This->lpVtbl->getItemInfoByAtom(This,lAtom,pbstrVal);
}
static __WIDL_INLINE HRESULT IWMPMedia2_isMemberOf(IWMPMedia2* This,IWMPPlaylist *pPlaylist,VARIANT_BOOL *pvarfIsMemberOf) {
    return This->lpVtbl->isMemberOf(This,pPlaylist,pvarfIsMemberOf);
}
static __WIDL_INLINE HRESULT IWMPMedia2_isReadOnlyItem(IWMPMedia2* This,BSTR bstrItemName,VARIANT_BOOL *pvarfIsReadOnly) {
    return This->lpVtbl->isReadOnlyItem(This,bstrItemName,pvarfIsReadOnly);
}
/*** IWMPMedia2 methods ***/
static __WIDL_INLINE HRESULT IWMPMedia2_get_error(IWMPMedia2* This,IWMPErrorItem **out) {
    return This->lpVtbl->get_error(This,out);
}
#endif
#endif

#endif


#endif  /* __IWMPMedia2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMPMedia3 interface
 */
#ifndef __IWMPMedia3_INTERFACE_DEFINED__
#define __IWMPMedia3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMPMedia3, 0xf118efc7, 0xf03a, 0x4fb4, 0x99,0xc9, 0x1c,0x02,0xa5,0xc1,0x06,0x5b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("f118efc7-f03a-4fb4-99c9-1c02a5c1065b")
IWMPMedia3 : public IWMPMedia2
{
    virtual HRESULT STDMETHODCALLTYPE getAttributeCountByType(
        BSTR type,
        BSTR language,
        LONG *out) = 0;

    virtual HRESULT STDMETHODCALLTYPE getItemInfoByType(
        BSTR type,
        BSTR language,
        LONG index,
        VARIANT *out) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMPMedia3, 0xf118efc7, 0xf03a, 0x4fb4, 0x99,0xc9, 0x1c,0x02,0xa5,0xc1,0x06,0x5b)
#endif
#else
typedef struct IWMPMedia3Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IWMPMedia methods ***/
    HRESULT (STDMETHODCALLTYPE *get_isIdentical)(
        IWMPMedia3 *This,
        IWMPMedia *pIWMPMedia,
        VARIANT_BOOL *pvbool);

    HRESULT (STDMETHODCALLTYPE *get_sourceURL)(
        IWMPMedia3 *This,
        BSTR *pbstrSourceURL);

    HRESULT (STDMETHODCALLTYPE *get_name)(
        IWMPMedia3 *This,
        BSTR *pbstrName);

    HRESULT (STDMETHODCALLTYPE *put_name)(
        IWMPMedia3 *This,
        BSTR pbstrName);

    HRESULT (STDMETHODCALLTYPE *get_imageSourceWidth)(
        IWMPMedia3 *This,
        LONG *pWidth);

    HRESULT (STDMETHODCALLTYPE *get_imageSourceHeight)(
        IWMPMedia3 *This,
        LONG *pHeight);

    HRESULT (STDMETHODCALLTYPE *get_markerCount)(
        IWMPMedia3 *This,
        LONG *pMarkerCount);

    HRESULT (STDMETHODCALLTYPE *getMarkerTime)(
        IWMPMedia3 *This,
        LONG MarkerNum,
        double *pMarkerTime);

    HRESULT (STDMETHODCALLTYPE *getMarkerName)(
        IWMPMedia3 *This,
        LONG MarkerNum,
        BSTR *pbstrMarkerName);

    HRESULT (STDMETHODCALLTYPE *get_duration)(
        IWMPMedia3 *This,
        double *pDuration);

    HRESULT (STDMETHODCALLTYPE *get_durationString)(
        IWMPMedia3 *This,
        BSTR *pbstrDuration);

    HRESULT (STDMETHODCALLTYPE *get_attributeCount)(
        IWMPMedia3 *This,
        LONG *plCount);

    HRESULT (STDMETHODCALLTYPE *getAttributeName)(
        IWMPMedia3 *This,
        LONG lIndex,
        BSTR *pbstrItemName);

    HRESULT (STDMETHODCALLTYPE *getItemInfo)(
        IWMPMedia3 *This,
        BSTR bstrItemName,
        BSTR *pbstrVal);

    HRESULT (STDMETHODCALLTYPE *setItemInfo)(
        IWMPMedia3 *This,
        BSTR bstrItemName,
        BSTR bstrVal);

    HRESULT (STDMETHODCALLTYPE *getItemInfoByAtom)(
        IWMPMedia3 *This,
        LONG lAtom,
        BSTR *pbstrVal);

    HRESULT (STDMETHODCALLTYPE *isMemberOf)(
        IWMPMedia3 *This,
        IWMPPlaylist *pPlaylist,
        VARIANT_BOOL *pvarfIsMemberOf);

    HRESULT (STDMETHODCALLTYPE *isReadOnlyItem)(
        IWMPMedia3 *This,
        BSTR bstrItemName,
        VARIANT_BOOL *pvarfIsReadOnly);

    /*** IWMPMedia2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_error)(
        IWMPMedia3 *This,
        IWMPErrorItem **out);

    /*** IWMPMedia3 methods ***/
    HRESULT (STDMETHODCALLTYPE *getAttributeCountByType)(
        IWMPMedia3 *This,
        BSTR type,
        BSTR language,
        LONG *out);

    HRESULT (STDMETHODCALLTYPE *getItemInfoByType)(
        IWMPMedia3 *This,
        BSTR type,
        BSTR language,
        LONG index,
        VARIANT *out);

    END_INTERFACE
} IWMPMedia3Vtbl;

interface IWMPMedia3 {
    CONST_VTBL IWMPMedia3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMPMedia3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMPMedia3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMPMedia3_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IWMPMedia3_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IWMPMedia3_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IWMPMedia3_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IWMPMedia3_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IWMPMedia methods ***/
#define IWMPMedia3_get_isIdentical(This,pIWMPMedia,pvbool) (This)->lpVtbl->get_isIdentical(This,pIWMPMedia,pvbool)
#define IWMPMedia3_get_sourceURL(This,pbstrSourceURL) (This)->lpVtbl->get_sourceURL(This,pbstrSourceURL)
#define IWMPMedia3_get_name(This,pbstrName) (This)->lpVtbl->get_name(This,pbstrName)
#define IWMPMedia3_put_name(This,pbstrName) (This)->lpVtbl->put_name(This,pbstrName)
#define IWMPMedia3_get_imageSourceWidth(This,pWidth) (This)->lpVtbl->get_imageSourceWidth(This,pWidth)
#define IWMPMedia3_get_imageSourceHeight(This,pHeight) (This)->lpVtbl->get_imageSourceHeight(This,pHeight)
#define IWMPMedia3_get_markerCount(This,pMarkerCount) (This)->lpVtbl->get_markerCount(This,pMarkerCount)
#define IWMPMedia3_getMarkerTime(This,MarkerNum,pMarkerTime) (This)->lpVtbl->getMarkerTime(This,MarkerNum,pMarkerTime)
#define IWMPMedia3_getMarkerName(This,MarkerNum,pbstrMarkerName) (This)->lpVtbl->getMarkerName(This,MarkerNum,pbstrMarkerName)
#define IWMPMedia3_get_duration(This,pDuration) (This)->lpVtbl->get_duration(This,pDuration)
#define IWMPMedia3_get_durationString(This,pbstrDuration) (This)->lpVtbl->get_durationString(This,pbstrDuration)
#define IWMPMedia3_get_attributeCount(This,plCount) (This)->lpVtbl->get_attributeCount(This,plCount)
#define IWMPMedia3_getAttributeName(This,lIndex,pbstrItemName) (This)->lpVtbl->getAttributeName(This,lIndex,pbstrItemName)
#define IWMPMedia3_getItemInfo(This,bstrItemName,pbstrVal) (This)->lpVtbl->getItemInfo(This,bstrItemName,pbstrVal)
#define IWMPMedia3_setItemInfo(This,bstrItemName,bstrVal) (This)->lpVtbl->setItemInfo(This,bstrItemName,bstrVal)
#define IWMPMedia3_getItemInfoByAtom(This,lAtom,pbstrVal) (This)->lpVtbl->getItemInfoByAtom(This,lAtom,pbstrVal)
#define IWMPMedia3_isMemberOf(This,pPlaylist,pvarfIsMemberOf) (This)->lpVtbl->isMemberOf(This,pPlaylist,pvarfIsMemberOf)
#define IWMPMedia3_isReadOnlyItem(This,bstrItemName,pvarfIsReadOnly) (This)->lpVtbl->isReadOnlyItem(This,bstrItemName,pvarfIsReadOnly)
/*** IWMPMedia2 methods ***/
#define IWMPMedia3_get_error(This,out) (This)->lpVtbl->get_error(This,out)
/*** IWMPMedia3 methods ***/
#define IWMPMedia3_getAttributeCountByType(This,type,language,out) (This)->lpVtbl->getAttributeCountByType(This,type,language,out)
#define IWMPMedia3_getItemInfoByType(This,type,language,index,out) (This)->lpVtbl->getItemInfoByType(This,type,language,index,out)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IWMPMedia3_QueryInterface(IWMPMedia3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWMPMedia3_AddRef(IWMPMedia3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWMPMedia3_Release(IWMPMedia3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IWMPMedia3_GetTypeInfoCount(IWMPMedia3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IWMPMedia3_GetTypeInfo(IWMPMedia3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IWMPMedia3_GetIDsOfNames(IWMPMedia3* 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 IWMPMedia3_Invoke(IWMPMedia3* 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);
}
/*** IWMPMedia methods ***/
static __WIDL_INLINE HRESULT IWMPMedia3_get_isIdentical(IWMPMedia3* This,IWMPMedia *pIWMPMedia,VARIANT_BOOL *pvbool) {
    return This->lpVtbl->get_isIdentical(This,pIWMPMedia,pvbool);
}
static __WIDL_INLINE HRESULT IWMPMedia3_get_sourceURL(IWMPMedia3* This,BSTR *pbstrSourceURL) {
    return This->lpVtbl->get_sourceURL(This,pbstrSourceURL);
}
static __WIDL_INLINE HRESULT IWMPMedia3_get_name(IWMPMedia3* This,BSTR *pbstrName) {
    return This->lpVtbl->get_name(This,pbstrName);
}
static __WIDL_INLINE HRESULT IWMPMedia3_put_name(IWMPMedia3* This,BSTR pbstrName) {
    return This->lpVtbl->put_name(This,pbstrName);
}
static __WIDL_INLINE HRESULT IWMPMedia3_get_imageSourceWidth(IWMPMedia3* This,LONG *pWidth) {
    return This->lpVtbl->get_imageSourceWidth(This,pWidth);
}
static __WIDL_INLINE HRESULT IWMPMedia3_get_imageSourceHeight(IWMPMedia3* This,LONG *pHeight) {
    return This->lpVtbl->get_imageSourceHeight(This,pHeight);
}
static __WIDL_INLINE HRESULT IWMPMedia3_get_markerCount(IWMPMedia3* This,LONG *pMarkerCount) {
    return This->lpVtbl->get_markerCount(This,pMarkerCount);
}
static __WIDL_INLINE HRESULT IWMPMedia3_getMarkerTime(IWMPMedia3* This,LONG MarkerNum,double *pMarkerTime) {
    return This->lpVtbl->getMarkerTime(This,MarkerNum,pMarkerTime);
}
static __WIDL_INLINE HRESULT IWMPMedia3_getMarkerName(IWMPMedia3* This,LONG MarkerNum,BSTR *pbstrMarkerName) {
    return This->lpVtbl->getMarkerName(This,MarkerNum,pbstrMarkerName);
}
static __WIDL_INLINE HRESULT IWMPMedia3_get_duration(IWMPMedia3* This,double *pDuration) {
    return This->lpVtbl->get_duration(This,pDuration);
}
static __WIDL_INLINE HRESULT IWMPMedia3_get_durationString(IWMPMedia3* This,BSTR *pbstrDuration) {
    return This->lpVtbl->get_durationString(This,pbstrDuration);
}
static __WIDL_INLINE HRESULT IWMPMedia3_get_attributeCount(IWMPMedia3* This,LONG *plCount) {
    return This->lpVtbl->get_attributeCount(This,plCount);
}
static __WIDL_INLINE HRESULT IWMPMedia3_getAttributeName(IWMPMedia3* This,LONG lIndex,BSTR *pbstrItemName) {
    return This->lpVtbl->getAttributeName(This,lIndex,pbstrItemName);
}
static __WIDL_INLINE HRESULT IWMPMedia3_getItemInfo(IWMPMedia3* This,BSTR bstrItemName,BSTR *pbstrVal) {
    return This->lpVtbl->getItemInfo(This,bstrItemName,pbstrVal);
}
static __WIDL_INLINE HRESULT IWMPMedia3_setItemInfo(IWMPMedia3* This,BSTR bstrItemName,BSTR bstrVal) {
    return This->lpVtbl->setItemInfo(This,bstrItemName,bstrVal);
}
static __WIDL_INLINE HRESULT IWMPMedia3_getItemInfoByAtom(IWMPMedia3* This,LONG lAtom,BSTR *pbstrVal) {
    return This->lpVtbl->getItemInfoByAtom(This,lAtom,pbstrVal);
}
static __WIDL_INLINE HRESULT IWMPMedia3_isMemberOf(IWMPMedia3* This,IWMPPlaylist *pPlaylist,VARIANT_BOOL *pvarfIsMemberOf) {
    return This->lpVtbl->isMemberOf(This,pPlaylist,pvarfIsMemberOf);
}
static __WIDL_INLINE HRESULT IWMPMedia3_isReadOnlyItem(IWMPMedia3* This,BSTR bstrItemName,VARIANT_BOOL *pvarfIsReadOnly) {
    return This->lpVtbl->isReadOnlyItem(This,bstrItemName,pvarfIsReadOnly);
}
/*** IWMPMedia2 methods ***/
static __WIDL_INLINE HRESULT IWMPMedia3_get_error(IWMPMedia3* This,IWMPErrorItem **out) {
    return This->lpVtbl->get_error(This,out);
}
/*** IWMPMedia3 methods ***/
static __WIDL_INLINE HRESULT IWMPMedia3_getAttributeCountByType(IWMPMedia3* This,BSTR type,BSTR language,LONG *out) {
    return This->lpVtbl->getAttributeCountByType(This,type,language,out);
}
static __WIDL_INLINE HRESULT IWMPMedia3_getItemInfoByType(IWMPMedia3* This,BSTR type,BSTR language,LONG index,VARIANT *out) {
    return This->lpVtbl->getItemInfoByType(This,type,language,index,out);
}
#endif
#endif

#endif


#endif  /* __IWMPMedia3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMPError interface
 */
#ifndef __IWMPError_INTERFACE_DEFINED__
#define __IWMPError_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMPError, 0xa12dcf7d, 0x14ab, 0x4c1b, 0xa8,0xcd, 0x63,0x90,0x9f,0x06,0x02,0x5b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a12dcf7d-14ab-4c1b-a8cd-63909f06025b")
IWMPError : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE clearErrorQueue(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_errorCount(
        LONG *plNumErrors) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Item(
        LONG dwIndex,
        IWMPErrorItem **ppErrorItem) = 0;

    virtual HRESULT STDMETHODCALLTYPE webHelp(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMPError, 0xa12dcf7d, 0x14ab, 0x4c1b, 0xa8,0xcd, 0x63,0x90,0x9f,0x06,0x02,0x5b)
#endif
#else
typedef struct IWMPErrorVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IWMPError methods ***/
    HRESULT (STDMETHODCALLTYPE *clearErrorQueue)(
        IWMPError *This);

    HRESULT (STDMETHODCALLTYPE *get_errorCount)(
        IWMPError *This,
        LONG *plNumErrors);

    HRESULT (STDMETHODCALLTYPE *get_Item)(
        IWMPError *This,
        LONG dwIndex,
        IWMPErrorItem **ppErrorItem);

    HRESULT (STDMETHODCALLTYPE *webHelp)(
        IWMPError *This);

    END_INTERFACE
} IWMPErrorVtbl;

interface IWMPError {
    CONST_VTBL IWMPErrorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMPError_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMPError_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMPError_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IWMPError_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IWMPError_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IWMPError_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IWMPError_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IWMPError methods ***/
#define IWMPError_clearErrorQueue(This) (This)->lpVtbl->clearErrorQueue(This)
#define IWMPError_get_errorCount(This,plNumErrors) (This)->lpVtbl->get_errorCount(This,plNumErrors)
#define IWMPError_get_Item(This,dwIndex,ppErrorItem) (This)->lpVtbl->get_Item(This,dwIndex,ppErrorItem)
#define IWMPError_webHelp(This) (This)->lpVtbl->webHelp(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IWMPError_QueryInterface(IWMPError* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWMPError_AddRef(IWMPError* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWMPError_Release(IWMPError* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IWMPError_GetTypeInfoCount(IWMPError* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IWMPError_GetTypeInfo(IWMPError* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IWMPError_GetIDsOfNames(IWMPError* 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 IWMPError_Invoke(IWMPError* 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);
}
/*** IWMPError methods ***/
static __WIDL_INLINE HRESULT IWMPError_clearErrorQueue(IWMPError* This) {
    return This->lpVtbl->clearErrorQueue(This);
}
static __WIDL_INLINE HRESULT IWMPError_get_errorCount(IWMPError* This,LONG *plNumErrors) {
    return This->lpVtbl->get_errorCount(This,plNumErrors);
}
static __WIDL_INLINE HRESULT IWMPError_get_Item(IWMPError* This,LONG dwIndex,IWMPErrorItem **ppErrorItem) {
    return This->lpVtbl->get_Item(This,dwIndex,ppErrorItem);
}
static __WIDL_INLINE HRESULT IWMPError_webHelp(IWMPError* This) {
    return This->lpVtbl->webHelp(This);
}
#endif
#endif

#endif


#endif  /* __IWMPError_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMPPlayerApplication interface
 */
#ifndef __IWMPPlayerApplication_INTERFACE_DEFINED__
#define __IWMPPlayerApplication_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMPPlayerApplication, 0x40897764, 0xceab, 0x47be, 0xad,0x4a, 0x8e,0x28,0x53,0x7f,0x9b,0xbf);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("40897764-ceab-47be-ad4a-8e28537f9bbf")
IWMPPlayerApplication : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE switchToPlayerApplication(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE switchToControl(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_playerDocked(
        VARIANT_BOOL *pbPlayerDocked) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_hasDisplay(
        VARIANT_BOOL *pbHasDisplay) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMPPlayerApplication, 0x40897764, 0xceab, 0x47be, 0xad,0x4a, 0x8e,0x28,0x53,0x7f,0x9b,0xbf)
#endif
#else
typedef struct IWMPPlayerApplicationVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IWMPPlayerApplication methods ***/
    HRESULT (STDMETHODCALLTYPE *switchToPlayerApplication)(
        IWMPPlayerApplication *This);

    HRESULT (STDMETHODCALLTYPE *switchToControl)(
        IWMPPlayerApplication *This);

    HRESULT (STDMETHODCALLTYPE *get_playerDocked)(
        IWMPPlayerApplication *This,
        VARIANT_BOOL *pbPlayerDocked);

    HRESULT (STDMETHODCALLTYPE *get_hasDisplay)(
        IWMPPlayerApplication *This,
        VARIANT_BOOL *pbHasDisplay);

    END_INTERFACE
} IWMPPlayerApplicationVtbl;

interface IWMPPlayerApplication {
    CONST_VTBL IWMPPlayerApplicationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMPPlayerApplication_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMPPlayerApplication_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMPPlayerApplication_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IWMPPlayerApplication_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IWMPPlayerApplication_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IWMPPlayerApplication_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IWMPPlayerApplication_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IWMPPlayerApplication methods ***/
#define IWMPPlayerApplication_switchToPlayerApplication(This) (This)->lpVtbl->switchToPlayerApplication(This)
#define IWMPPlayerApplication_switchToControl(This) (This)->lpVtbl->switchToControl(This)
#define IWMPPlayerApplication_get_playerDocked(This,pbPlayerDocked) (This)->lpVtbl->get_playerDocked(This,pbPlayerDocked)
#define IWMPPlayerApplication_get_hasDisplay(This,pbHasDisplay) (This)->lpVtbl->get_hasDisplay(This,pbHasDisplay)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IWMPPlayerApplication_QueryInterface(IWMPPlayerApplication* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWMPPlayerApplication_AddRef(IWMPPlayerApplication* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWMPPlayerApplication_Release(IWMPPlayerApplication* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IWMPPlayerApplication_GetTypeInfoCount(IWMPPlayerApplication* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IWMPPlayerApplication_GetTypeInfo(IWMPPlayerApplication* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IWMPPlayerApplication_GetIDsOfNames(IWMPPlayerApplication* 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 IWMPPlayerApplication_Invoke(IWMPPlayerApplication* 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);
}
/*** IWMPPlayerApplication methods ***/
static __WIDL_INLINE HRESULT IWMPPlayerApplication_switchToPlayerApplication(IWMPPlayerApplication* This) {
    return This->lpVtbl->switchToPlayerApplication(This);
}
static __WIDL_INLINE HRESULT IWMPPlayerApplication_switchToControl(IWMPPlayerApplication* This) {
    return This->lpVtbl->switchToControl(This);
}
static __WIDL_INLINE HRESULT IWMPPlayerApplication_get_playerDocked(IWMPPlayerApplication* This,VARIANT_BOOL *pbPlayerDocked) {
    return This->lpVtbl->get_playerDocked(This,pbPlayerDocked);
}
static __WIDL_INLINE HRESULT IWMPPlayerApplication_get_hasDisplay(IWMPPlayerApplication* This,VARIANT_BOOL *pbHasDisplay) {
    return This->lpVtbl->get_hasDisplay(This,pbHasDisplay);
}
#endif
#endif

#endif


#endif  /* __IWMPPlayerApplication_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMPCore interface
 */
#ifndef __IWMPCore_INTERFACE_DEFINED__
#define __IWMPCore_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMPCore, 0xd84cca99, 0xcce2, 0x11d2, 0x9e,0xcc, 0x00,0x00,0xf8,0x08,0x59,0x81);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d84cca99-cce2-11d2-9ecc-0000f8085981")
IWMPCore : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE close(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_URL(
        BSTR *pbstrURL) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_URL(
        BSTR pbstrURL) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_openState(
        WMPOpenState *pwmpos) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_playState(
        WMPPlayState *pwmpps) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_controls(
        IWMPControls **ppControl) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_settings(
        IWMPSettings **ppSettings) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_currentMedia(
        IWMPMedia **ppMedia) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_currentMedia(
        IWMPMedia *ppMedia) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_mediaCollection(
        IWMPMediaCollection **ppMediaCollection) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_playlistCollection(
        IWMPPlaylistCollection **ppPlaylistCollection) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_versionInfo(
        BSTR *pbstrVersionInfo) = 0;

    virtual HRESULT STDMETHODCALLTYPE launchURL(
        BSTR bstrURL) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_network(
        IWMPNetwork **ppQNI) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_currentPlaylist(
        IWMPPlaylist **ppPL) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_currentPlaylist(
        IWMPPlaylist *ppPL) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_cdromCollection(
        IWMPCdromCollection **ppCdromCollection) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_closedCaption(
        IWMPClosedCaption **ppClosedCaption) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_isOnline(
        VARIANT_BOOL *pfOnline) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Error(
        IWMPError **ppError) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_status(
        BSTR *pbstrStatus) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMPCore, 0xd84cca99, 0xcce2, 0x11d2, 0x9e,0xcc, 0x00,0x00,0xf8,0x08,0x59,0x81)
#endif
#else
typedef struct IWMPCoreVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IWMPCore methods ***/
    HRESULT (STDMETHODCALLTYPE *close)(
        IWMPCore *This);

    HRESULT (STDMETHODCALLTYPE *get_URL)(
        IWMPCore *This,
        BSTR *pbstrURL);

    HRESULT (STDMETHODCALLTYPE *put_URL)(
        IWMPCore *This,
        BSTR pbstrURL);

    HRESULT (STDMETHODCALLTYPE *get_openState)(
        IWMPCore *This,
        WMPOpenState *pwmpos);

    HRESULT (STDMETHODCALLTYPE *get_playState)(
        IWMPCore *This,
        WMPPlayState *pwmpps);

    HRESULT (STDMETHODCALLTYPE *get_controls)(
        IWMPCore *This,
        IWMPControls **ppControl);

    HRESULT (STDMETHODCALLTYPE *get_settings)(
        IWMPCore *This,
        IWMPSettings **ppSettings);

    HRESULT (STDMETHODCALLTYPE *get_currentMedia)(
        IWMPCore *This,
        IWMPMedia **ppMedia);

    HRESULT (STDMETHODCALLTYPE *put_currentMedia)(
        IWMPCore *This,
        IWMPMedia *ppMedia);

    HRESULT (STDMETHODCALLTYPE *get_mediaCollection)(
        IWMPCore *This,
        IWMPMediaCollection **ppMediaCollection);

    HRESULT (STDMETHODCALLTYPE *get_playlistCollection)(
        IWMPCore *This,
        IWMPPlaylistCollection **ppPlaylistCollection);

    HRESULT (STDMETHODCALLTYPE *get_versionInfo)(
        IWMPCore *This,
        BSTR *pbstrVersionInfo);

    HRESULT (STDMETHODCALLTYPE *launchURL)(
        IWMPCore *This,
        BSTR bstrURL);

    HRESULT (STDMETHODCALLTYPE *get_network)(
        IWMPCore *This,
        IWMPNetwork **ppQNI);

    HRESULT (STDMETHODCALLTYPE *get_currentPlaylist)(
        IWMPCore *This,
        IWMPPlaylist **ppPL);

    HRESULT (STDMETHODCALLTYPE *put_currentPlaylist)(
        IWMPCore *This,
        IWMPPlaylist *ppPL);

    HRESULT (STDMETHODCALLTYPE *get_cdromCollection)(
        IWMPCore *This,
        IWMPCdromCollection **ppCdromCollection);

    HRESULT (STDMETHODCALLTYPE *get_closedCaption)(
        IWMPCore *This,
        IWMPClosedCaption **ppClosedCaption);

    HRESULT (STDMETHODCALLTYPE *get_isOnline)(
        IWMPCore *This,
        VARIANT_BOOL *pfOnline);

    HRESULT (STDMETHODCALLTYPE *get_Error)(
        IWMPCore *This,
        IWMPError **ppError);

    HRESULT (STDMETHODCALLTYPE *get_status)(
        IWMPCore *This,
        BSTR *pbstrStatus);

    END_INTERFACE
} IWMPCoreVtbl;

interface IWMPCore {
    CONST_VTBL IWMPCoreVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMPCore_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMPCore_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMPCore_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IWMPCore_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IWMPCore_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IWMPCore_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IWMPCore_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IWMPCore methods ***/
#define IWMPCore_close(This) (This)->lpVtbl->close(This)
#define IWMPCore_get_URL(This,pbstrURL) (This)->lpVtbl->get_URL(This,pbstrURL)
#define IWMPCore_put_URL(This,pbstrURL) (This)->lpVtbl->put_URL(This,pbstrURL)
#define IWMPCore_get_openState(This,pwmpos) (This)->lpVtbl->get_openState(This,pwmpos)
#define IWMPCore_get_playState(This,pwmpps) (This)->lpVtbl->get_playState(This,pwmpps)
#define IWMPCore_get_controls(This,ppControl) (This)->lpVtbl->get_controls(This,ppControl)
#define IWMPCore_get_settings(This,ppSettings) (This)->lpVtbl->get_settings(This,ppSettings)
#define IWMPCore_get_currentMedia(This,ppMedia) (This)->lpVtbl->get_currentMedia(This,ppMedia)
#define IWMPCore_put_currentMedia(This,ppMedia) (This)->lpVtbl->put_currentMedia(This,ppMedia)
#define IWMPCore_get_mediaCollection(This,ppMediaCollection) (This)->lpVtbl->get_mediaCollection(This,ppMediaCollection)
#define IWMPCore_get_playlistCollection(This,ppPlaylistCollection) (This)->lpVtbl->get_playlistCollection(This,ppPlaylistCollection)
#define IWMPCore_get_versionInfo(This,pbstrVersionInfo) (This)->lpVtbl->get_versionInfo(This,pbstrVersionInfo)
#define IWMPCore_launchURL(This,bstrURL) (This)->lpVtbl->launchURL(This,bstrURL)
#define IWMPCore_get_network(This,ppQNI) (This)->lpVtbl->get_network(This,ppQNI)
#define IWMPCore_get_currentPlaylist(This,ppPL) (This)->lpVtbl->get_currentPlaylist(This,ppPL)
#define IWMPCore_put_currentPlaylist(This,ppPL) (This)->lpVtbl->put_currentPlaylist(This,ppPL)
#define IWMPCore_get_cdromCollection(This,ppCdromCollection) (This)->lpVtbl->get_cdromCollection(This,ppCdromCollection)
#define IWMPCore_get_closedCaption(This,ppClosedCaption) (This)->lpVtbl->get_closedCaption(This,ppClosedCaption)
#define IWMPCore_get_isOnline(This,pfOnline) (This)->lpVtbl->get_isOnline(This,pfOnline)
#define IWMPCore_get_Error(This,ppError) (This)->lpVtbl->get_Error(This,ppError)
#define IWMPCore_get_status(This,pbstrStatus) (This)->lpVtbl->get_status(This,pbstrStatus)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IWMPCore_QueryInterface(IWMPCore* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWMPCore_AddRef(IWMPCore* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWMPCore_Release(IWMPCore* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IWMPCore_GetTypeInfoCount(IWMPCore* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IWMPCore_GetTypeInfo(IWMPCore* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IWMPCore_GetIDsOfNames(IWMPCore* 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 IWMPCore_Invoke(IWMPCore* 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);
}
/*** IWMPCore methods ***/
static __WIDL_INLINE HRESULT IWMPCore_close(IWMPCore* This) {
    return This->lpVtbl->close(This);
}
static __WIDL_INLINE HRESULT IWMPCore_get_URL(IWMPCore* This,BSTR *pbstrURL) {
    return This->lpVtbl->get_URL(This,pbstrURL);
}
static __WIDL_INLINE HRESULT IWMPCore_put_URL(IWMPCore* This,BSTR pbstrURL) {
    return This->lpVtbl->put_URL(This,pbstrURL);
}
static __WIDL_INLINE HRESULT IWMPCore_get_openState(IWMPCore* This,WMPOpenState *pwmpos) {
    return This->lpVtbl->get_openState(This,pwmpos);
}
static __WIDL_INLINE HRESULT IWMPCore_get_playState(IWMPCore* This,WMPPlayState *pwmpps) {
    return This->lpVtbl->get_playState(This,pwmpps);
}
static __WIDL_INLINE HRESULT IWMPCore_get_controls(IWMPCore* This,IWMPControls **ppControl) {
    return This->lpVtbl->get_controls(This,ppControl);
}
static __WIDL_INLINE HRESULT IWMPCore_get_settings(IWMPCore* This,IWMPSettings **ppSettings) {
    return This->lpVtbl->get_settings(This,ppSettings);
}
static __WIDL_INLINE HRESULT IWMPCore_get_currentMedia(IWMPCore* This,IWMPMedia **ppMedia) {
    return This->lpVtbl->get_currentMedia(This,ppMedia);
}
static __WIDL_INLINE HRESULT IWMPCore_put_currentMedia(IWMPCore* This,IWMPMedia *ppMedia) {
    return This->lpVtbl->put_currentMedia(This,ppMedia);
}
static __WIDL_INLINE HRESULT IWMPCore_get_mediaCollection(IWMPCore* This,IWMPMediaCollection **ppMediaCollection) {
    return This->lpVtbl->get_mediaCollection(This,ppMediaCollection);
}
static __WIDL_INLINE HRESULT IWMPCore_get_playlistCollection(IWMPCore* This,IWMPPlaylistCollection **ppPlaylistCollection) {
    return This->lpVtbl->get_playlistCollection(This,ppPlaylistCollection);
}
static __WIDL_INLINE HRESULT IWMPCore_get_versionInfo(IWMPCore* This,BSTR *pbstrVersionInfo) {
    return This->lpVtbl->get_versionInfo(This,pbstrVersionInfo);
}
static __WIDL_INLINE HRESULT IWMPCore_launchURL(IWMPCore* This,BSTR bstrURL) {
    return This->lpVtbl->launchURL(This,bstrURL);
}
static __WIDL_INLINE HRESULT IWMPCore_get_network(IWMPCore* This,IWMPNetwork **ppQNI) {
    return This->lpVtbl->get_network(This,ppQNI);
}
static __WIDL_INLINE HRESULT IWMPCore_get_currentPlaylist(IWMPCore* This,IWMPPlaylist **ppPL) {
    return This->lpVtbl->get_currentPlaylist(This,ppPL);
}
static __WIDL_INLINE HRESULT IWMPCore_put_currentPlaylist(IWMPCore* This,IWMPPlaylist *ppPL) {
    return This->lpVtbl->put_currentPlaylist(This,ppPL);
}
static __WIDL_INLINE HRESULT IWMPCore_get_cdromCollection(IWMPCore* This,IWMPCdromCollection **ppCdromCollection) {
    return This->lpVtbl->get_cdromCollection(This,ppCdromCollection);
}
static __WIDL_INLINE HRESULT IWMPCore_get_closedCaption(IWMPCore* This,IWMPClosedCaption **ppClosedCaption) {
    return This->lpVtbl->get_closedCaption(This,ppClosedCaption);
}
static __WIDL_INLINE HRESULT IWMPCore_get_isOnline(IWMPCore* This,VARIANT_BOOL *pfOnline) {
    return This->lpVtbl->get_isOnline(This,pfOnline);
}
static __WIDL_INLINE HRESULT IWMPCore_get_Error(IWMPCore* This,IWMPError **ppError) {
    return This->lpVtbl->get_Error(This,ppError);
}
static __WIDL_INLINE HRESULT IWMPCore_get_status(IWMPCore* This,BSTR *pbstrStatus) {
    return This->lpVtbl->get_status(This,pbstrStatus);
}
#endif
#endif

#endif


#endif  /* __IWMPCore_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMPCore2 interface
 */
#ifndef __IWMPCore2_INTERFACE_DEFINED__
#define __IWMPCore2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMPCore2, 0xbc17e5b7, 0x7561, 0x4c18, 0xbb,0x90, 0x17,0xd4,0x85,0x77,0x56,0x59);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("bc17e5b7-7561-4c18-bb90-17d485775659")
IWMPCore2 : public IWMPCore
{
    virtual HRESULT STDMETHODCALLTYPE get_dvd(
        IWMPDVD **ppDVD) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMPCore2, 0xbc17e5b7, 0x7561, 0x4c18, 0xbb,0x90, 0x17,0xd4,0x85,0x77,0x56,0x59)
#endif
#else
typedef struct IWMPCore2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IWMPCore methods ***/
    HRESULT (STDMETHODCALLTYPE *close)(
        IWMPCore2 *This);

    HRESULT (STDMETHODCALLTYPE *get_URL)(
        IWMPCore2 *This,
        BSTR *pbstrURL);

    HRESULT (STDMETHODCALLTYPE *put_URL)(
        IWMPCore2 *This,
        BSTR pbstrURL);

    HRESULT (STDMETHODCALLTYPE *get_openState)(
        IWMPCore2 *This,
        WMPOpenState *pwmpos);

    HRESULT (STDMETHODCALLTYPE *get_playState)(
        IWMPCore2 *This,
        WMPPlayState *pwmpps);

    HRESULT (STDMETHODCALLTYPE *get_controls)(
        IWMPCore2 *This,
        IWMPControls **ppControl);

    HRESULT (STDMETHODCALLTYPE *get_settings)(
        IWMPCore2 *This,
        IWMPSettings **ppSettings);

    HRESULT (STDMETHODCALLTYPE *get_currentMedia)(
        IWMPCore2 *This,
        IWMPMedia **ppMedia);

    HRESULT (STDMETHODCALLTYPE *put_currentMedia)(
        IWMPCore2 *This,
        IWMPMedia *ppMedia);

    HRESULT (STDMETHODCALLTYPE *get_mediaCollection)(
        IWMPCore2 *This,
        IWMPMediaCollection **ppMediaCollection);

    HRESULT (STDMETHODCALLTYPE *get_playlistCollection)(
        IWMPCore2 *This,
        IWMPPlaylistCollection **ppPlaylistCollection);

    HRESULT (STDMETHODCALLTYPE *get_versionInfo)(
        IWMPCore2 *This,
        BSTR *pbstrVersionInfo);

    HRESULT (STDMETHODCALLTYPE *launchURL)(
        IWMPCore2 *This,
        BSTR bstrURL);

    HRESULT (STDMETHODCALLTYPE *get_network)(
        IWMPCore2 *This,
        IWMPNetwork **ppQNI);

    HRESULT (STDMETHODCALLTYPE *get_currentPlaylist)(
        IWMPCore2 *This,
        IWMPPlaylist **ppPL);

    HRESULT (STDMETHODCALLTYPE *put_currentPlaylist)(
        IWMPCore2 *This,
        IWMPPlaylist *ppPL);

    HRESULT (STDMETHODCALLTYPE *get_cdromCollection)(
        IWMPCore2 *This,
        IWMPCdromCollection **ppCdromCollection);

    HRESULT (STDMETHODCALLTYPE *get_closedCaption)(
        IWMPCore2 *This,
        IWMPClosedCaption **ppClosedCaption);

    HRESULT (STDMETHODCALLTYPE *get_isOnline)(
        IWMPCore2 *This,
        VARIANT_BOOL *pfOnline);

    HRESULT (STDMETHODCALLTYPE *get_Error)(
        IWMPCore2 *This,
        IWMPError **ppError);

    HRESULT (STDMETHODCALLTYPE *get_status)(
        IWMPCore2 *This,
        BSTR *pbstrStatus);

    /*** IWMPCore2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_dvd)(
        IWMPCore2 *This,
        IWMPDVD **ppDVD);

    END_INTERFACE
} IWMPCore2Vtbl;

interface IWMPCore2 {
    CONST_VTBL IWMPCore2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMPCore2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMPCore2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMPCore2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IWMPCore2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IWMPCore2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IWMPCore2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IWMPCore2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IWMPCore methods ***/
#define IWMPCore2_close(This) (This)->lpVtbl->close(This)
#define IWMPCore2_get_URL(This,pbstrURL) (This)->lpVtbl->get_URL(This,pbstrURL)
#define IWMPCore2_put_URL(This,pbstrURL) (This)->lpVtbl->put_URL(This,pbstrURL)
#define IWMPCore2_get_openState(This,pwmpos) (This)->lpVtbl->get_openState(This,pwmpos)
#define IWMPCore2_get_playState(This,pwmpps) (This)->lpVtbl->get_playState(This,pwmpps)
#define IWMPCore2_get_controls(This,ppControl) (This)->lpVtbl->get_controls(This,ppControl)
#define IWMPCore2_get_settings(This,ppSettings) (This)->lpVtbl->get_settings(This,ppSettings)
#define IWMPCore2_get_currentMedia(This,ppMedia) (This)->lpVtbl->get_currentMedia(This,ppMedia)
#define IWMPCore2_put_currentMedia(This,ppMedia) (This)->lpVtbl->put_currentMedia(This,ppMedia)
#define IWMPCore2_get_mediaCollection(This,ppMediaCollection) (This)->lpVtbl->get_mediaCollection(This,ppMediaCollection)
#define IWMPCore2_get_playlistCollection(This,ppPlaylistCollection) (This)->lpVtbl->get_playlistCollection(This,ppPlaylistCollection)
#define IWMPCore2_get_versionInfo(This,pbstrVersionInfo) (This)->lpVtbl->get_versionInfo(This,pbstrVersionInfo)
#define IWMPCore2_launchURL(This,bstrURL) (This)->lpVtbl->launchURL(This,bstrURL)
#define IWMPCore2_get_network(This,ppQNI) (This)->lpVtbl->get_network(This,ppQNI)
#define IWMPCore2_get_currentPlaylist(This,ppPL) (This)->lpVtbl->get_currentPlaylist(This,ppPL)
#define IWMPCore2_put_currentPlaylist(This,ppPL) (This)->lpVtbl->put_currentPlaylist(This,ppPL)
#define IWMPCore2_get_cdromCollection(This,ppCdromCollection) (This)->lpVtbl->get_cdromCollection(This,ppCdromCollection)
#define IWMPCore2_get_closedCaption(This,ppClosedCaption) (This)->lpVtbl->get_closedCaption(This,ppClosedCaption)
#define IWMPCore2_get_isOnline(This,pfOnline) (This)->lpVtbl->get_isOnline(This,pfOnline)
#define IWMPCore2_get_Error(This,ppError) (This)->lpVtbl->get_Error(This,ppError)
#define IWMPCore2_get_status(This,pbstrStatus) (This)->lpVtbl->get_status(This,pbstrStatus)
/*** IWMPCore2 methods ***/
#define IWMPCore2_get_dvd(This,ppDVD) (This)->lpVtbl->get_dvd(This,ppDVD)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IWMPCore2_QueryInterface(IWMPCore2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWMPCore2_AddRef(IWMPCore2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWMPCore2_Release(IWMPCore2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IWMPCore2_GetTypeInfoCount(IWMPCore2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IWMPCore2_GetTypeInfo(IWMPCore2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IWMPCore2_GetIDsOfNames(IWMPCore2* 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 IWMPCore2_Invoke(IWMPCore2* 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);
}
/*** IWMPCore methods ***/
static __WIDL_INLINE HRESULT IWMPCore2_close(IWMPCore2* This) {
    return This->lpVtbl->close(This);
}
static __WIDL_INLINE HRESULT IWMPCore2_get_URL(IWMPCore2* This,BSTR *pbstrURL) {
    return This->lpVtbl->get_URL(This,pbstrURL);
}
static __WIDL_INLINE HRESULT IWMPCore2_put_URL(IWMPCore2* This,BSTR pbstrURL) {
    return This->lpVtbl->put_URL(This,pbstrURL);
}
static __WIDL_INLINE HRESULT IWMPCore2_get_openState(IWMPCore2* This,WMPOpenState *pwmpos) {
    return This->lpVtbl->get_openState(This,pwmpos);
}
static __WIDL_INLINE HRESULT IWMPCore2_get_playState(IWMPCore2* This,WMPPlayState *pwmpps) {
    return This->lpVtbl->get_playState(This,pwmpps);
}
static __WIDL_INLINE HRESULT IWMPCore2_get_controls(IWMPCore2* This,IWMPControls **ppControl) {
    return This->lpVtbl->get_controls(This,ppControl);
}
static __WIDL_INLINE HRESULT IWMPCore2_get_settings(IWMPCore2* This,IWMPSettings **ppSettings) {
    return This->lpVtbl->get_settings(This,ppSettings);
}
static __WIDL_INLINE HRESULT IWMPCore2_get_currentMedia(IWMPCore2* This,IWMPMedia **ppMedia) {
    return This->lpVtbl->get_currentMedia(This,ppMedia);
}
static __WIDL_INLINE HRESULT IWMPCore2_put_currentMedia(IWMPCore2* This,IWMPMedia *ppMedia) {
    return This->lpVtbl->put_currentMedia(This,ppMedia);
}
static __WIDL_INLINE HRESULT IWMPCore2_get_mediaCollection(IWMPCore2* This,IWMPMediaCollection **ppMediaCollection) {
    return This->lpVtbl->get_mediaCollection(This,ppMediaCollection);
}
static __WIDL_INLINE HRESULT IWMPCore2_get_playlistCollection(IWMPCore2* This,IWMPPlaylistCollection **ppPlaylistCollection) {
    return This->lpVtbl->get_playlistCollection(This,ppPlaylistCollection);
}
static __WIDL_INLINE HRESULT IWMPCore2_get_versionInfo(IWMPCore2* This,BSTR *pbstrVersionInfo) {
    return This->lpVtbl->get_versionInfo(This,pbstrVersionInfo);
}
static __WIDL_INLINE HRESULT IWMPCore2_launchURL(IWMPCore2* This,BSTR bstrURL) {
    return This->lpVtbl->launchURL(This,bstrURL);
}
static __WIDL_INLINE HRESULT IWMPCore2_get_network(IWMPCore2* This,IWMPNetwork **ppQNI) {
    return This->lpVtbl->get_network(This,ppQNI);
}
static __WIDL_INLINE HRESULT IWMPCore2_get_currentPlaylist(IWMPCore2* This,IWMPPlaylist **ppPL) {
    return This->lpVtbl->get_currentPlaylist(This,ppPL);
}
static __WIDL_INLINE HRESULT IWMPCore2_put_currentPlaylist(IWMPCore2* This,IWMPPlaylist *ppPL) {
    return This->lpVtbl->put_currentPlaylist(This,ppPL);
}
static __WIDL_INLINE HRESULT IWMPCore2_get_cdromCollection(IWMPCore2* This,IWMPCdromCollection **ppCdromCollection) {
    return This->lpVtbl->get_cdromCollection(This,ppCdromCollection);
}
static __WIDL_INLINE HRESULT IWMPCore2_get_closedCaption(IWMPCore2* This,IWMPClosedCaption **ppClosedCaption) {
    return This->lpVtbl->get_closedCaption(This,ppClosedCaption);
}
static __WIDL_INLINE HRESULT IWMPCore2_get_isOnline(IWMPCore2* This,VARIANT_BOOL *pfOnline) {
    return This->lpVtbl->get_isOnline(This,pfOnline);
}
static __WIDL_INLINE HRESULT IWMPCore2_get_Error(IWMPCore2* This,IWMPError **ppError) {
    return This->lpVtbl->get_Error(This,ppError);
}
static __WIDL_INLINE HRESULT IWMPCore2_get_status(IWMPCore2* This,BSTR *pbstrStatus) {
    return This->lpVtbl->get_status(This,pbstrStatus);
}
/*** IWMPCore2 methods ***/
static __WIDL_INLINE HRESULT IWMPCore2_get_dvd(IWMPCore2* This,IWMPDVD **ppDVD) {
    return This->lpVtbl->get_dvd(This,ppDVD);
}
#endif
#endif

#endif


#endif  /* __IWMPCore2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMPCore3 interface
 */
#ifndef __IWMPCore3_INTERFACE_DEFINED__
#define __IWMPCore3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMPCore3, 0x7587c667, 0x628f, 0x499f, 0x88,0xe7, 0x6a,0x6f,0x4e,0x88,0x84,0x64);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("7587c667-628f-499f-88e7-6a6f4e888464")
IWMPCore3 : public IWMPCore2
{
    virtual HRESULT STDMETHODCALLTYPE newPlaylist(
        BSTR bstrName,
        BSTR bstrURL,
        IWMPPlaylist **ppPlaylist) = 0;

    virtual HRESULT STDMETHODCALLTYPE newMedia(
        BSTR bstrURL,
        IWMPMedia **ppMedia) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMPCore3, 0x7587c667, 0x628f, 0x499f, 0x88,0xe7, 0x6a,0x6f,0x4e,0x88,0x84,0x64)
#endif
#else
typedef struct IWMPCore3Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IWMPCore methods ***/
    HRESULT (STDMETHODCALLTYPE *close)(
        IWMPCore3 *This);

    HRESULT (STDMETHODCALLTYPE *get_URL)(
        IWMPCore3 *This,
        BSTR *pbstrURL);

    HRESULT (STDMETHODCALLTYPE *put_URL)(
        IWMPCore3 *This,
        BSTR pbstrURL);

    HRESULT (STDMETHODCALLTYPE *get_openState)(
        IWMPCore3 *This,
        WMPOpenState *pwmpos);

    HRESULT (STDMETHODCALLTYPE *get_playState)(
        IWMPCore3 *This,
        WMPPlayState *pwmpps);

    HRESULT (STDMETHODCALLTYPE *get_controls)(
        IWMPCore3 *This,
        IWMPControls **ppControl);

    HRESULT (STDMETHODCALLTYPE *get_settings)(
        IWMPCore3 *This,
        IWMPSettings **ppSettings);

    HRESULT (STDMETHODCALLTYPE *get_currentMedia)(
        IWMPCore3 *This,
        IWMPMedia **ppMedia);

    HRESULT (STDMETHODCALLTYPE *put_currentMedia)(
        IWMPCore3 *This,
        IWMPMedia *ppMedia);

    HRESULT (STDMETHODCALLTYPE *get_mediaCollection)(
        IWMPCore3 *This,
        IWMPMediaCollection **ppMediaCollection);

    HRESULT (STDMETHODCALLTYPE *get_playlistCollection)(
        IWMPCore3 *This,
        IWMPPlaylistCollection **ppPlaylistCollection);

    HRESULT (STDMETHODCALLTYPE *get_versionInfo)(
        IWMPCore3 *This,
        BSTR *pbstrVersionInfo);

    HRESULT (STDMETHODCALLTYPE *launchURL)(
        IWMPCore3 *This,
        BSTR bstrURL);

    HRESULT (STDMETHODCALLTYPE *get_network)(
        IWMPCore3 *This,
        IWMPNetwork **ppQNI);

    HRESULT (STDMETHODCALLTYPE *get_currentPlaylist)(
        IWMPCore3 *This,
        IWMPPlaylist **ppPL);

    HRESULT (STDMETHODCALLTYPE *put_currentPlaylist)(
        IWMPCore3 *This,
        IWMPPlaylist *ppPL);

    HRESULT (STDMETHODCALLTYPE *get_cdromCollection)(
        IWMPCore3 *This,
        IWMPCdromCollection **ppCdromCollection);

    HRESULT (STDMETHODCALLTYPE *get_closedCaption)(
        IWMPCore3 *This,
        IWMPClosedCaption **ppClosedCaption);

    HRESULT (STDMETHODCALLTYPE *get_isOnline)(
        IWMPCore3 *This,
        VARIANT_BOOL *pfOnline);

    HRESULT (STDMETHODCALLTYPE *get_Error)(
        IWMPCore3 *This,
        IWMPError **ppError);

    HRESULT (STDMETHODCALLTYPE *get_status)(
        IWMPCore3 *This,
        BSTR *pbstrStatus);

    /*** IWMPCore2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_dvd)(
        IWMPCore3 *This,
        IWMPDVD **ppDVD);

    /*** IWMPCore3 methods ***/
    HRESULT (STDMETHODCALLTYPE *newPlaylist)(
        IWMPCore3 *This,
        BSTR bstrName,
        BSTR bstrURL,
        IWMPPlaylist **ppPlaylist);

    HRESULT (STDMETHODCALLTYPE *newMedia)(
        IWMPCore3 *This,
        BSTR bstrURL,
        IWMPMedia **ppMedia);

    END_INTERFACE
} IWMPCore3Vtbl;

interface IWMPCore3 {
    CONST_VTBL IWMPCore3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMPCore3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMPCore3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMPCore3_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IWMPCore3_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IWMPCore3_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IWMPCore3_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IWMPCore3_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IWMPCore methods ***/
#define IWMPCore3_close(This) (This)->lpVtbl->close(This)
#define IWMPCore3_get_URL(This,pbstrURL) (This)->lpVtbl->get_URL(This,pbstrURL)
#define IWMPCore3_put_URL(This,pbstrURL) (This)->lpVtbl->put_URL(This,pbstrURL)
#define IWMPCore3_get_openState(This,pwmpos) (This)->lpVtbl->get_openState(This,pwmpos)
#define IWMPCore3_get_playState(This,pwmpps) (This)->lpVtbl->get_playState(This,pwmpps)
#define IWMPCore3_get_controls(This,ppControl) (This)->lpVtbl->get_controls(This,ppControl)
#define IWMPCore3_get_settings(This,ppSettings) (This)->lpVtbl->get_settings(This,ppSettings)
#define IWMPCore3_get_currentMedia(This,ppMedia) (This)->lpVtbl->get_currentMedia(This,ppMedia)
#define IWMPCore3_put_currentMedia(This,ppMedia) (This)->lpVtbl->put_currentMedia(This,ppMedia)
#define IWMPCore3_get_mediaCollection(This,ppMediaCollection) (This)->lpVtbl->get_mediaCollection(This,ppMediaCollection)
#define IWMPCore3_get_playlistCollection(This,ppPlaylistCollection) (This)->lpVtbl->get_playlistCollection(This,ppPlaylistCollection)
#define IWMPCore3_get_versionInfo(This,pbstrVersionInfo) (This)->lpVtbl->get_versionInfo(This,pbstrVersionInfo)
#define IWMPCore3_launchURL(This,bstrURL) (This)->lpVtbl->launchURL(This,bstrURL)
#define IWMPCore3_get_network(This,ppQNI) (This)->lpVtbl->get_network(This,ppQNI)
#define IWMPCore3_get_currentPlaylist(This,ppPL) (This)->lpVtbl->get_currentPlaylist(This,ppPL)
#define IWMPCore3_put_currentPlaylist(This,ppPL) (This)->lpVtbl->put_currentPlaylist(This,ppPL)
#define IWMPCore3_get_cdromCollection(This,ppCdromCollection) (This)->lpVtbl->get_cdromCollection(This,ppCdromCollection)
#define IWMPCore3_get_closedCaption(This,ppClosedCaption) (This)->lpVtbl->get_closedCaption(This,ppClosedCaption)
#define IWMPCore3_get_isOnline(This,pfOnline) (This)->lpVtbl->get_isOnline(This,pfOnline)
#define IWMPCore3_get_Error(This,ppError) (This)->lpVtbl->get_Error(This,ppError)
#define IWMPCore3_get_status(This,pbstrStatus) (This)->lpVtbl->get_status(This,pbstrStatus)
/*** IWMPCore2 methods ***/
#define IWMPCore3_get_dvd(This,ppDVD) (This)->lpVtbl->get_dvd(This,ppDVD)
/*** IWMPCore3 methods ***/
#define IWMPCore3_newPlaylist(This,bstrName,bstrURL,ppPlaylist) (This)->lpVtbl->newPlaylist(This,bstrName,bstrURL,ppPlaylist)
#define IWMPCore3_newMedia(This,bstrURL,ppMedia) (This)->lpVtbl->newMedia(This,bstrURL,ppMedia)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IWMPCore3_QueryInterface(IWMPCore3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWMPCore3_AddRef(IWMPCore3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWMPCore3_Release(IWMPCore3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IWMPCore3_GetTypeInfoCount(IWMPCore3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IWMPCore3_GetTypeInfo(IWMPCore3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IWMPCore3_GetIDsOfNames(IWMPCore3* 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 IWMPCore3_Invoke(IWMPCore3* 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);
}
/*** IWMPCore methods ***/
static __WIDL_INLINE HRESULT IWMPCore3_close(IWMPCore3* This) {
    return This->lpVtbl->close(This);
}
static __WIDL_INLINE HRESULT IWMPCore3_get_URL(IWMPCore3* This,BSTR *pbstrURL) {
    return This->lpVtbl->get_URL(This,pbstrURL);
}
static __WIDL_INLINE HRESULT IWMPCore3_put_URL(IWMPCore3* This,BSTR pbstrURL) {
    return This->lpVtbl->put_URL(This,pbstrURL);
}
static __WIDL_INLINE HRESULT IWMPCore3_get_openState(IWMPCore3* This,WMPOpenState *pwmpos) {
    return This->lpVtbl->get_openState(This,pwmpos);
}
static __WIDL_INLINE HRESULT IWMPCore3_get_playState(IWMPCore3* This,WMPPlayState *pwmpps) {
    return This->lpVtbl->get_playState(This,pwmpps);
}
static __WIDL_INLINE HRESULT IWMPCore3_get_controls(IWMPCore3* This,IWMPControls **ppControl) {
    return This->lpVtbl->get_controls(This,ppControl);
}
static __WIDL_INLINE HRESULT IWMPCore3_get_settings(IWMPCore3* This,IWMPSettings **ppSettings) {
    return This->lpVtbl->get_settings(This,ppSettings);
}
static __WIDL_INLINE HRESULT IWMPCore3_get_currentMedia(IWMPCore3* This,IWMPMedia **ppMedia) {
    return This->lpVtbl->get_currentMedia(This,ppMedia);
}
static __WIDL_INLINE HRESULT IWMPCore3_put_currentMedia(IWMPCore3* This,IWMPMedia *ppMedia) {
    return This->lpVtbl->put_currentMedia(This,ppMedia);
}
static __WIDL_INLINE HRESULT IWMPCore3_get_mediaCollection(IWMPCore3* This,IWMPMediaCollection **ppMediaCollection) {
    return This->lpVtbl->get_mediaCollection(This,ppMediaCollection);
}
static __WIDL_INLINE HRESULT IWMPCore3_get_playlistCollection(IWMPCore3* This,IWMPPlaylistCollection **ppPlaylistCollection) {
    return This->lpVtbl->get_playlistCollection(This,ppPlaylistCollection);
}
static __WIDL_INLINE HRESULT IWMPCore3_get_versionInfo(IWMPCore3* This,BSTR *pbstrVersionInfo) {
    return This->lpVtbl->get_versionInfo(This,pbstrVersionInfo);
}
static __WIDL_INLINE HRESULT IWMPCore3_launchURL(IWMPCore3* This,BSTR bstrURL) {
    return This->lpVtbl->launchURL(This,bstrURL);
}
static __WIDL_INLINE HRESULT IWMPCore3_get_network(IWMPCore3* This,IWMPNetwork **ppQNI) {
    return This->lpVtbl->get_network(This,ppQNI);
}
static __WIDL_INLINE HRESULT IWMPCore3_get_currentPlaylist(IWMPCore3* This,IWMPPlaylist **ppPL) {
    return This->lpVtbl->get_currentPlaylist(This,ppPL);
}
static __WIDL_INLINE HRESULT IWMPCore3_put_currentPlaylist(IWMPCore3* This,IWMPPlaylist *ppPL) {
    return This->lpVtbl->put_currentPlaylist(This,ppPL);
}
static __WIDL_INLINE HRESULT IWMPCore3_get_cdromCollection(IWMPCore3* This,IWMPCdromCollection **ppCdromCollection) {
    return This->lpVtbl->get_cdromCollection(This,ppCdromCollection);
}
static __WIDL_INLINE HRESULT IWMPCore3_get_closedCaption(IWMPCore3* This,IWMPClosedCaption **ppClosedCaption) {
    return This->lpVtbl->get_closedCaption(This,ppClosedCaption);
}
static __WIDL_INLINE HRESULT IWMPCore3_get_isOnline(IWMPCore3* This,VARIANT_BOOL *pfOnline) {
    return This->lpVtbl->get_isOnline(This,pfOnline);
}
static __WIDL_INLINE HRESULT IWMPCore3_get_Error(IWMPCore3* This,IWMPError **ppError) {
    return This->lpVtbl->get_Error(This,ppError);
}
static __WIDL_INLINE HRESULT IWMPCore3_get_status(IWMPCore3* This,BSTR *pbstrStatus) {
    return This->lpVtbl->get_status(This,pbstrStatus);
}
/*** IWMPCore2 methods ***/
static __WIDL_INLINE HRESULT IWMPCore3_get_dvd(IWMPCore3* This,IWMPDVD **ppDVD) {
    return This->lpVtbl->get_dvd(This,ppDVD);
}
/*** IWMPCore3 methods ***/
static __WIDL_INLINE HRESULT IWMPCore3_newPlaylist(IWMPCore3* This,BSTR bstrName,BSTR bstrURL,IWMPPlaylist **ppPlaylist) {
    return This->lpVtbl->newPlaylist(This,bstrName,bstrURL,ppPlaylist);
}
static __WIDL_INLINE HRESULT IWMPCore3_newMedia(IWMPCore3* This,BSTR bstrURL,IWMPMedia **ppMedia) {
    return This->lpVtbl->newMedia(This,bstrURL,ppMedia);
}
#endif
#endif

#endif


#endif  /* __IWMPCore3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMPPlayer4 interface
 */
#ifndef __IWMPPlayer4_INTERFACE_DEFINED__
#define __IWMPPlayer4_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMPPlayer4, 0x6c497d62, 0x8919, 0x413c, 0x82,0xdb, 0xe9,0x35,0xfb,0x3e,0xc5,0x84);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("6c497d62-8919-413c-82db-e935fb3ec584")
IWMPPlayer4 : public IWMPCore3
{
    virtual HRESULT STDMETHODCALLTYPE get_enabled(
        VARIANT_BOOL *pbEnabled) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_enabled(
        VARIANT_BOOL pbEnabled) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_fullScreen(
        VARIANT_BOOL *pbFullScreen) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_fullScreen(
        VARIANT_BOOL pbFullScreen) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_enableContextMenu(
        VARIANT_BOOL *pbEnableContextMenu) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_enableContextMenu(
        VARIANT_BOOL pbEnableContextMenu) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_uiMode(
        BSTR pbstrMode) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_uiMode(
        BSTR *pbstrMode) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_stretchToFit(
        VARIANT_BOOL *pbEnabled) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_stretchToFit(
        VARIANT_BOOL pbEnabled) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_windowlessVideo(
        VARIANT_BOOL *pbEnabled) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_windowlessVideo(
        VARIANT_BOOL pbEnabled) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_isRemote(
        VARIANT_BOOL *pvarfIsRemote) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_playerApplication(
        IWMPPlayerApplication **ppIWMPPlayerApplication) = 0;

    virtual HRESULT STDMETHODCALLTYPE openPlayer(
        BSTR bstrURL) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMPPlayer4, 0x6c497d62, 0x8919, 0x413c, 0x82,0xdb, 0xe9,0x35,0xfb,0x3e,0xc5,0x84)
#endif
#else
typedef struct IWMPPlayer4Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IWMPCore methods ***/
    HRESULT (STDMETHODCALLTYPE *close)(
        IWMPPlayer4 *This);

    HRESULT (STDMETHODCALLTYPE *get_URL)(
        IWMPPlayer4 *This,
        BSTR *pbstrURL);

    HRESULT (STDMETHODCALLTYPE *put_URL)(
        IWMPPlayer4 *This,
        BSTR pbstrURL);

    HRESULT (STDMETHODCALLTYPE *get_openState)(
        IWMPPlayer4 *This,
        WMPOpenState *pwmpos);

    HRESULT (STDMETHODCALLTYPE *get_playState)(
        IWMPPlayer4 *This,
        WMPPlayState *pwmpps);

    HRESULT (STDMETHODCALLTYPE *get_controls)(
        IWMPPlayer4 *This,
        IWMPControls **ppControl);

    HRESULT (STDMETHODCALLTYPE *get_settings)(
        IWMPPlayer4 *This,
        IWMPSettings **ppSettings);

    HRESULT (STDMETHODCALLTYPE *get_currentMedia)(
        IWMPPlayer4 *This,
        IWMPMedia **ppMedia);

    HRESULT (STDMETHODCALLTYPE *put_currentMedia)(
        IWMPPlayer4 *This,
        IWMPMedia *ppMedia);

    HRESULT (STDMETHODCALLTYPE *get_mediaCollection)(
        IWMPPlayer4 *This,
        IWMPMediaCollection **ppMediaCollection);

    HRESULT (STDMETHODCALLTYPE *get_playlistCollection)(
        IWMPPlayer4 *This,
        IWMPPlaylistCollection **ppPlaylistCollection);

    HRESULT (STDMETHODCALLTYPE *get_versionInfo)(
        IWMPPlayer4 *This,
        BSTR *pbstrVersionInfo);

    HRESULT (STDMETHODCALLTYPE *launchURL)(
        IWMPPlayer4 *This,
        BSTR bstrURL);

    HRESULT (STDMETHODCALLTYPE *get_network)(
        IWMPPlayer4 *This,
        IWMPNetwork **ppQNI);

    HRESULT (STDMETHODCALLTYPE *get_currentPlaylist)(
        IWMPPlayer4 *This,
        IWMPPlaylist **ppPL);

    HRESULT (STDMETHODCALLTYPE *put_currentPlaylist)(
        IWMPPlayer4 *This,
        IWMPPlaylist *ppPL);

    HRESULT (STDMETHODCALLTYPE *get_cdromCollection)(
        IWMPPlayer4 *This,
        IWMPCdromCollection **ppCdromCollection);

    HRESULT (STDMETHODCALLTYPE *get_closedCaption)(
        IWMPPlayer4 *This,
        IWMPClosedCaption **ppClosedCaption);

    HRESULT (STDMETHODCALLTYPE *get_isOnline)(
        IWMPPlayer4 *This,
        VARIANT_BOOL *pfOnline);

    HRESULT (STDMETHODCALLTYPE *get_Error)(
        IWMPPlayer4 *This,
        IWMPError **ppError);

    HRESULT (STDMETHODCALLTYPE *get_status)(
        IWMPPlayer4 *This,
        BSTR *pbstrStatus);

    /*** IWMPCore2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_dvd)(
        IWMPPlayer4 *This,
        IWMPDVD **ppDVD);

    /*** IWMPCore3 methods ***/
    HRESULT (STDMETHODCALLTYPE *newPlaylist)(
        IWMPPlayer4 *This,
        BSTR bstrName,
        BSTR bstrURL,
        IWMPPlaylist **ppPlaylist);

    HRESULT (STDMETHODCALLTYPE *newMedia)(
        IWMPPlayer4 *This,
        BSTR bstrURL,
        IWMPMedia **ppMedia);

    /*** IWMPPlayer4 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_enabled)(
        IWMPPlayer4 *This,
        VARIANT_BOOL *pbEnabled);

    HRESULT (STDMETHODCALLTYPE *put_enabled)(
        IWMPPlayer4 *This,
        VARIANT_BOOL pbEnabled);

    HRESULT (STDMETHODCALLTYPE *get_fullScreen)(
        IWMPPlayer4 *This,
        VARIANT_BOOL *pbFullScreen);

    HRESULT (STDMETHODCALLTYPE *put_fullScreen)(
        IWMPPlayer4 *This,
        VARIANT_BOOL pbFullScreen);

    HRESULT (STDMETHODCALLTYPE *get_enableContextMenu)(
        IWMPPlayer4 *This,
        VARIANT_BOOL *pbEnableContextMenu);

    HRESULT (STDMETHODCALLTYPE *put_enableContextMenu)(
        IWMPPlayer4 *This,
        VARIANT_BOOL pbEnableContextMenu);

    HRESULT (STDMETHODCALLTYPE *put_uiMode)(
        IWMPPlayer4 *This,
        BSTR pbstrMode);

    HRESULT (STDMETHODCALLTYPE *get_uiMode)(
        IWMPPlayer4 *This,
        BSTR *pbstrMode);

    HRESULT (STDMETHODCALLTYPE *get_stretchToFit)(
        IWMPPlayer4 *This,
        VARIANT_BOOL *pbEnabled);

    HRESULT (STDMETHODCALLTYPE *put_stretchToFit)(
        IWMPPlayer4 *This,
        VARIANT_BOOL pbEnabled);

    HRESULT (STDMETHODCALLTYPE *get_windowlessVideo)(
        IWMPPlayer4 *This,
        VARIANT_BOOL *pbEnabled);

    HRESULT (STDMETHODCALLTYPE *put_windowlessVideo)(
        IWMPPlayer4 *This,
        VARIANT_BOOL pbEnabled);

    HRESULT (STDMETHODCALLTYPE *get_isRemote)(
        IWMPPlayer4 *This,
        VARIANT_BOOL *pvarfIsRemote);

    HRESULT (STDMETHODCALLTYPE *get_playerApplication)(
        IWMPPlayer4 *This,
        IWMPPlayerApplication **ppIWMPPlayerApplication);

    HRESULT (STDMETHODCALLTYPE *openPlayer)(
        IWMPPlayer4 *This,
        BSTR bstrURL);

    END_INTERFACE
} IWMPPlayer4Vtbl;

interface IWMPPlayer4 {
    CONST_VTBL IWMPPlayer4Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMPPlayer4_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMPPlayer4_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMPPlayer4_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IWMPPlayer4_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IWMPPlayer4_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IWMPPlayer4_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IWMPPlayer4_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IWMPCore methods ***/
#define IWMPPlayer4_close(This) (This)->lpVtbl->close(This)
#define IWMPPlayer4_get_URL(This,pbstrURL) (This)->lpVtbl->get_URL(This,pbstrURL)
#define IWMPPlayer4_put_URL(This,pbstrURL) (This)->lpVtbl->put_URL(This,pbstrURL)
#define IWMPPlayer4_get_openState(This,pwmpos) (This)->lpVtbl->get_openState(This,pwmpos)
#define IWMPPlayer4_get_playState(This,pwmpps) (This)->lpVtbl->get_playState(This,pwmpps)
#define IWMPPlayer4_get_controls(This,ppControl) (This)->lpVtbl->get_controls(This,ppControl)
#define IWMPPlayer4_get_settings(This,ppSettings) (This)->lpVtbl->get_settings(This,ppSettings)
#define IWMPPlayer4_get_currentMedia(This,ppMedia) (This)->lpVtbl->get_currentMedia(This,ppMedia)
#define IWMPPlayer4_put_currentMedia(This,ppMedia) (This)->lpVtbl->put_currentMedia(This,ppMedia)
#define IWMPPlayer4_get_mediaCollection(This,ppMediaCollection) (This)->lpVtbl->get_mediaCollection(This,ppMediaCollection)
#define IWMPPlayer4_get_playlistCollection(This,ppPlaylistCollection) (This)->lpVtbl->get_playlistCollection(This,ppPlaylistCollection)
#define IWMPPlayer4_get_versionInfo(This,pbstrVersionInfo) (This)->lpVtbl->get_versionInfo(This,pbstrVersionInfo)
#define IWMPPlayer4_launchURL(This,bstrURL) (This)->lpVtbl->launchURL(This,bstrURL)
#define IWMPPlayer4_get_network(This,ppQNI) (This)->lpVtbl->get_network(This,ppQNI)
#define IWMPPlayer4_get_currentPlaylist(This,ppPL) (This)->lpVtbl->get_currentPlaylist(This,ppPL)
#define IWMPPlayer4_put_currentPlaylist(This,ppPL) (This)->lpVtbl->put_currentPlaylist(This,ppPL)
#define IWMPPlayer4_get_cdromCollection(This,ppCdromCollection) (This)->lpVtbl->get_cdromCollection(This,ppCdromCollection)
#define IWMPPlayer4_get_closedCaption(This,ppClosedCaption) (This)->lpVtbl->get_closedCaption(This,ppClosedCaption)
#define IWMPPlayer4_get_isOnline(This,pfOnline) (This)->lpVtbl->get_isOnline(This,pfOnline)
#define IWMPPlayer4_get_Error(This,ppError) (This)->lpVtbl->get_Error(This,ppError)
#define IWMPPlayer4_get_status(This,pbstrStatus) (This)->lpVtbl->get_status(This,pbstrStatus)
/*** IWMPCore2 methods ***/
#define IWMPPlayer4_get_dvd(This,ppDVD) (This)->lpVtbl->get_dvd(This,ppDVD)
/*** IWMPCore3 methods ***/
#define IWMPPlayer4_newPlaylist(This,bstrName,bstrURL,ppPlaylist) (This)->lpVtbl->newPlaylist(This,bstrName,bstrURL,ppPlaylist)
#define IWMPPlayer4_newMedia(This,bstrURL,ppMedia) (This)->lpVtbl->newMedia(This,bstrURL,ppMedia)
/*** IWMPPlayer4 methods ***/
#define IWMPPlayer4_get_enabled(This,pbEnabled) (This)->lpVtbl->get_enabled(This,pbEnabled)
#define IWMPPlayer4_put_enabled(This,pbEnabled) (This)->lpVtbl->put_enabled(This,pbEnabled)
#define IWMPPlayer4_get_fullScreen(This,pbFullScreen) (This)->lpVtbl->get_fullScreen(This,pbFullScreen)
#define IWMPPlayer4_put_fullScreen(This,pbFullScreen) (This)->lpVtbl->put_fullScreen(This,pbFullScreen)
#define IWMPPlayer4_get_enableContextMenu(This,pbEnableContextMenu) (This)->lpVtbl->get_enableContextMenu(This,pbEnableContextMenu)
#define IWMPPlayer4_put_enableContextMenu(This,pbEnableContextMenu) (This)->lpVtbl->put_enableContextMenu(This,pbEnableContextMenu)
#define IWMPPlayer4_put_uiMode(This,pbstrMode) (This)->lpVtbl->put_uiMode(This,pbstrMode)
#define IWMPPlayer4_get_uiMode(This,pbstrMode) (This)->lpVtbl->get_uiMode(This,pbstrMode)
#define IWMPPlayer4_get_stretchToFit(This,pbEnabled) (This)->lpVtbl->get_stretchToFit(This,pbEnabled)
#define IWMPPlayer4_put_stretchToFit(This,pbEnabled) (This)->lpVtbl->put_stretchToFit(This,pbEnabled)
#define IWMPPlayer4_get_windowlessVideo(This,pbEnabled) (This)->lpVtbl->get_windowlessVideo(This,pbEnabled)
#define IWMPPlayer4_put_windowlessVideo(This,pbEnabled) (This)->lpVtbl->put_windowlessVideo(This,pbEnabled)
#define IWMPPlayer4_get_isRemote(This,pvarfIsRemote) (This)->lpVtbl->get_isRemote(This,pvarfIsRemote)
#define IWMPPlayer4_get_playerApplication(This,ppIWMPPlayerApplication) (This)->lpVtbl->get_playerApplication(This,ppIWMPPlayerApplication)
#define IWMPPlayer4_openPlayer(This,bstrURL) (This)->lpVtbl->openPlayer(This,bstrURL)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IWMPPlayer4_QueryInterface(IWMPPlayer4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWMPPlayer4_AddRef(IWMPPlayer4* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWMPPlayer4_Release(IWMPPlayer4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IWMPPlayer4_GetTypeInfoCount(IWMPPlayer4* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IWMPPlayer4_GetTypeInfo(IWMPPlayer4* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IWMPPlayer4_GetIDsOfNames(IWMPPlayer4* 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 IWMPPlayer4_Invoke(IWMPPlayer4* 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);
}
/*** IWMPCore methods ***/
static __WIDL_INLINE HRESULT IWMPPlayer4_close(IWMPPlayer4* This) {
    return This->lpVtbl->close(This);
}
static __WIDL_INLINE HRESULT IWMPPlayer4_get_URL(IWMPPlayer4* This,BSTR *pbstrURL) {
    return This->lpVtbl->get_URL(This,pbstrURL);
}
static __WIDL_INLINE HRESULT IWMPPlayer4_put_URL(IWMPPlayer4* This,BSTR pbstrURL) {
    return This->lpVtbl->put_URL(This,pbstrURL);
}
static __WIDL_INLINE HRESULT IWMPPlayer4_get_openState(IWMPPlayer4* This,WMPOpenState *pwmpos) {
    return This->lpVtbl->get_openState(This,pwmpos);
}
static __WIDL_INLINE HRESULT IWMPPlayer4_get_playState(IWMPPlayer4* This,WMPPlayState *pwmpps) {
    return This->lpVtbl->get_playState(This,pwmpps);
}
static __WIDL_INLINE HRESULT IWMPPlayer4_get_controls(IWMPPlayer4* This,IWMPControls **ppControl) {
    return This->lpVtbl->get_controls(This,ppControl);
}
static __WIDL_INLINE HRESULT IWMPPlayer4_get_settings(IWMPPlayer4* This,IWMPSettings **ppSettings) {
    return This->lpVtbl->get_settings(This,ppSettings);
}
static __WIDL_INLINE HRESULT IWMPPlayer4_get_currentMedia(IWMPPlayer4* This,IWMPMedia **ppMedia) {
    return This->lpVtbl->get_currentMedia(This,ppMedia);
}
static __WIDL_INLINE HRESULT IWMPPlayer4_put_currentMedia(IWMPPlayer4* This,IWMPMedia *ppMedia) {
    return This->lpVtbl->put_currentMedia(This,ppMedia);
}
static __WIDL_INLINE HRESULT IWMPPlayer4_get_mediaCollection(IWMPPlayer4* This,IWMPMediaCollection **ppMediaCollection) {
    return This->lpVtbl->get_mediaCollection(This,ppMediaCollection);
}
static __WIDL_INLINE HRESULT IWMPPlayer4_get_playlistCollection(IWMPPlayer4* This,IWMPPlaylistCollection **ppPlaylistCollection) {
    return This->lpVtbl->get_playlistCollection(This,ppPlaylistCollection);
}
static __WIDL_INLINE HRESULT IWMPPlayer4_get_versionInfo(IWMPPlayer4* This,BSTR *pbstrVersionInfo) {
    return This->lpVtbl->get_versionInfo(This,pbstrVersionInfo);
}
static __WIDL_INLINE HRESULT IWMPPlayer4_launchURL(IWMPPlayer4* This,BSTR bstrURL) {
    return This->lpVtbl->launchURL(This,bstrURL);
}
static __WIDL_INLINE HRESULT IWMPPlayer4_get_network(IWMPPlayer4* This,IWMPNetwork **ppQNI) {
    return This->lpVtbl->get_network(This,ppQNI);
}
static __WIDL_INLINE HRESULT IWMPPlayer4_get_currentPlaylist(IWMPPlayer4* This,IWMPPlaylist **ppPL) {
    return This->lpVtbl->get_currentPlaylist(This,ppPL);
}
static __WIDL_INLINE HRESULT IWMPPlayer4_put_currentPlaylist(IWMPPlayer4* This,IWMPPlaylist *ppPL) {
    return This->lpVtbl->put_currentPlaylist(This,ppPL);
}
static __WIDL_INLINE HRESULT IWMPPlayer4_get_cdromCollection(IWMPPlayer4* This,IWMPCdromCollection **ppCdromCollection) {
    return This->lpVtbl->get_cdromCollection(This,ppCdromCollection);
}
static __WIDL_INLINE HRESULT IWMPPlayer4_get_closedCaption(IWMPPlayer4* This,IWMPClosedCaption **ppClosedCaption) {
    return This->lpVtbl->get_closedCaption(This,ppClosedCaption);
}
static __WIDL_INLINE HRESULT IWMPPlayer4_get_isOnline(IWMPPlayer4* This,VARIANT_BOOL *pfOnline) {
    return This->lpVtbl->get_isOnline(This,pfOnline);
}
static __WIDL_INLINE HRESULT IWMPPlayer4_get_Error(IWMPPlayer4* This,IWMPError **ppError) {
    return This->lpVtbl->get_Error(This,ppError);
}
static __WIDL_INLINE HRESULT IWMPPlayer4_get_status(IWMPPlayer4* This,BSTR *pbstrStatus) {
    return This->lpVtbl->get_status(This,pbstrStatus);
}
/*** IWMPCore2 methods ***/
static __WIDL_INLINE HRESULT IWMPPlayer4_get_dvd(IWMPPlayer4* This,IWMPDVD **ppDVD) {
    return This->lpVtbl->get_dvd(This,ppDVD);
}
/*** IWMPCore3 methods ***/
static __WIDL_INLINE HRESULT IWMPPlayer4_newPlaylist(IWMPPlayer4* This,BSTR bstrName,BSTR bstrURL,IWMPPlaylist **ppPlaylist) {
    return This->lpVtbl->newPlaylist(This,bstrName,bstrURL,ppPlaylist);
}
static __WIDL_INLINE HRESULT IWMPPlayer4_newMedia(IWMPPlayer4* This,BSTR bstrURL,IWMPMedia **ppMedia) {
    return This->lpVtbl->newMedia(This,bstrURL,ppMedia);
}
/*** IWMPPlayer4 methods ***/
static __WIDL_INLINE HRESULT IWMPPlayer4_get_enabled(IWMPPlayer4* This,VARIANT_BOOL *pbEnabled) {
    return This->lpVtbl->get_enabled(This,pbEnabled);
}
static __WIDL_INLINE HRESULT IWMPPlayer4_put_enabled(IWMPPlayer4* This,VARIANT_BOOL pbEnabled) {
    return This->lpVtbl->put_enabled(This,pbEnabled);
}
static __WIDL_INLINE HRESULT IWMPPlayer4_get_fullScreen(IWMPPlayer4* This,VARIANT_BOOL *pbFullScreen) {
    return This->lpVtbl->get_fullScreen(This,pbFullScreen);
}
static __WIDL_INLINE HRESULT IWMPPlayer4_put_fullScreen(IWMPPlayer4* This,VARIANT_BOOL pbFullScreen) {
    return This->lpVtbl->put_fullScreen(This,pbFullScreen);
}
static __WIDL_INLINE HRESULT IWMPPlayer4_get_enableContextMenu(IWMPPlayer4* This,VARIANT_BOOL *pbEnableContextMenu) {
    return This->lpVtbl->get_enableContextMenu(This,pbEnableContextMenu);
}
static __WIDL_INLINE HRESULT IWMPPlayer4_put_enableContextMenu(IWMPPlayer4* This,VARIANT_BOOL pbEnableContextMenu) {
    return This->lpVtbl->put_enableContextMenu(This,pbEnableContextMenu);
}
static __WIDL_INLINE HRESULT IWMPPlayer4_put_uiMode(IWMPPlayer4* This,BSTR pbstrMode) {
    return This->lpVtbl->put_uiMode(This,pbstrMode);
}
static __WIDL_INLINE HRESULT IWMPPlayer4_get_uiMode(IWMPPlayer4* This,BSTR *pbstrMode) {
    return This->lpVtbl->get_uiMode(This,pbstrMode);
}
static __WIDL_INLINE HRESULT IWMPPlayer4_get_stretchToFit(IWMPPlayer4* This,VARIANT_BOOL *pbEnabled) {
    return This->lpVtbl->get_stretchToFit(This,pbEnabled);
}
static __WIDL_INLINE HRESULT IWMPPlayer4_put_stretchToFit(IWMPPlayer4* This,VARIANT_BOOL pbEnabled) {
    return This->lpVtbl->put_stretchToFit(This,pbEnabled);
}
static __WIDL_INLINE HRESULT IWMPPlayer4_get_windowlessVideo(IWMPPlayer4* This,VARIANT_BOOL *pbEnabled) {
    return This->lpVtbl->get_windowlessVideo(This,pbEnabled);
}
static __WIDL_INLINE HRESULT IWMPPlayer4_put_windowlessVideo(IWMPPlayer4* This,VARIANT_BOOL pbEnabled) {
    return This->lpVtbl->put_windowlessVideo(This,pbEnabled);
}
static __WIDL_INLINE HRESULT IWMPPlayer4_get_isRemote(IWMPPlayer4* This,VARIANT_BOOL *pvarfIsRemote) {
    return This->lpVtbl->get_isRemote(This,pvarfIsRemote);
}
static __WIDL_INLINE HRESULT IWMPPlayer4_get_playerApplication(IWMPPlayer4* This,IWMPPlayerApplication **ppIWMPPlayerApplication) {
    return This->lpVtbl->get_playerApplication(This,ppIWMPPlayerApplication);
}
static __WIDL_INLINE HRESULT IWMPPlayer4_openPlayer(IWMPPlayer4* This,BSTR bstrURL) {
    return This->lpVtbl->openPlayer(This,bstrURL);
}
#endif
#endif

#endif


#endif  /* __IWMPPlayer4_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMPPlayer interface
 */
#ifndef __IWMPPlayer_INTERFACE_DEFINED__
#define __IWMPPlayer_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMPPlayer, 0x6bf52a4f, 0x394a, 0x11d3, 0xb1,0x53, 0x00,0xc0,0x4f,0x79,0xfa,0xa6);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("6bf52a4f-394a-11d3-b153-00c04f79faa6")
IWMPPlayer : public IWMPCore
{
    virtual HRESULT STDMETHODCALLTYPE get_enabled(
        VARIANT_BOOL *pbEnabled) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_enabled(
        VARIANT_BOOL pbEnabled) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_fullScreen(
        VARIANT_BOOL *pbFullScreen) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_fullScreen(
        VARIANT_BOOL pbFullScreen) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_enableContextMenu(
        VARIANT_BOOL *pbEnableContextMenu) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_enableContextMenu(
        VARIANT_BOOL pbEnableContextMenu) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_uiMode(
        BSTR pbstrMode) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_uiMode(
        BSTR *pbstrMode) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMPPlayer, 0x6bf52a4f, 0x394a, 0x11d3, 0xb1,0x53, 0x00,0xc0,0x4f,0x79,0xfa,0xa6)
#endif
#else
typedef struct IWMPPlayerVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IWMPCore methods ***/
    HRESULT (STDMETHODCALLTYPE *close)(
        IWMPPlayer *This);

    HRESULT (STDMETHODCALLTYPE *get_URL)(
        IWMPPlayer *This,
        BSTR *pbstrURL);

    HRESULT (STDMETHODCALLTYPE *put_URL)(
        IWMPPlayer *This,
        BSTR pbstrURL);

    HRESULT (STDMETHODCALLTYPE *get_openState)(
        IWMPPlayer *This,
        WMPOpenState *pwmpos);

    HRESULT (STDMETHODCALLTYPE *get_playState)(
        IWMPPlayer *This,
        WMPPlayState *pwmpps);

    HRESULT (STDMETHODCALLTYPE *get_controls)(
        IWMPPlayer *This,
        IWMPControls **ppControl);

    HRESULT (STDMETHODCALLTYPE *get_settings)(
        IWMPPlayer *This,
        IWMPSettings **ppSettings);

    HRESULT (STDMETHODCALLTYPE *get_currentMedia)(
        IWMPPlayer *This,
        IWMPMedia **ppMedia);

    HRESULT (STDMETHODCALLTYPE *put_currentMedia)(
        IWMPPlayer *This,
        IWMPMedia *ppMedia);

    HRESULT (STDMETHODCALLTYPE *get_mediaCollection)(
        IWMPPlayer *This,
        IWMPMediaCollection **ppMediaCollection);

    HRESULT (STDMETHODCALLTYPE *get_playlistCollection)(
        IWMPPlayer *This,
        IWMPPlaylistCollection **ppPlaylistCollection);

    HRESULT (STDMETHODCALLTYPE *get_versionInfo)(
        IWMPPlayer *This,
        BSTR *pbstrVersionInfo);

    HRESULT (STDMETHODCALLTYPE *launchURL)(
        IWMPPlayer *This,
        BSTR bstrURL);

    HRESULT (STDMETHODCALLTYPE *get_network)(
        IWMPPlayer *This,
        IWMPNetwork **ppQNI);

    HRESULT (STDMETHODCALLTYPE *get_currentPlaylist)(
        IWMPPlayer *This,
        IWMPPlaylist **ppPL);

    HRESULT (STDMETHODCALLTYPE *put_currentPlaylist)(
        IWMPPlayer *This,
        IWMPPlaylist *ppPL);

    HRESULT (STDMETHODCALLTYPE *get_cdromCollection)(
        IWMPPlayer *This,
        IWMPCdromCollection **ppCdromCollection);

    HRESULT (STDMETHODCALLTYPE *get_closedCaption)(
        IWMPPlayer *This,
        IWMPClosedCaption **ppClosedCaption);

    HRESULT (STDMETHODCALLTYPE *get_isOnline)(
        IWMPPlayer *This,
        VARIANT_BOOL *pfOnline);

    HRESULT (STDMETHODCALLTYPE *get_Error)(
        IWMPPlayer *This,
        IWMPError **ppError);

    HRESULT (STDMETHODCALLTYPE *get_status)(
        IWMPPlayer *This,
        BSTR *pbstrStatus);

    /*** IWMPPlayer methods ***/
    HRESULT (STDMETHODCALLTYPE *get_enabled)(
        IWMPPlayer *This,
        VARIANT_BOOL *pbEnabled);

    HRESULT (STDMETHODCALLTYPE *put_enabled)(
        IWMPPlayer *This,
        VARIANT_BOOL pbEnabled);

    HRESULT (STDMETHODCALLTYPE *get_fullScreen)(
        IWMPPlayer *This,
        VARIANT_BOOL *pbFullScreen);

    HRESULT (STDMETHODCALLTYPE *put_fullScreen)(
        IWMPPlayer *This,
        VARIANT_BOOL pbFullScreen);

    HRESULT (STDMETHODCALLTYPE *get_enableContextMenu)(
        IWMPPlayer *This,
        VARIANT_BOOL *pbEnableContextMenu);

    HRESULT (STDMETHODCALLTYPE *put_enableContextMenu)(
        IWMPPlayer *This,
        VARIANT_BOOL pbEnableContextMenu);

    HRESULT (STDMETHODCALLTYPE *put_uiMode)(
        IWMPPlayer *This,
        BSTR pbstrMode);

    HRESULT (STDMETHODCALLTYPE *get_uiMode)(
        IWMPPlayer *This,
        BSTR *pbstrMode);

    END_INTERFACE
} IWMPPlayerVtbl;

interface IWMPPlayer {
    CONST_VTBL IWMPPlayerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMPPlayer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMPPlayer_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMPPlayer_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IWMPPlayer_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IWMPPlayer_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IWMPPlayer_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IWMPPlayer_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IWMPCore methods ***/
#define IWMPPlayer_close(This) (This)->lpVtbl->close(This)
#define IWMPPlayer_get_URL(This,pbstrURL) (This)->lpVtbl->get_URL(This,pbstrURL)
#define IWMPPlayer_put_URL(This,pbstrURL) (This)->lpVtbl->put_URL(This,pbstrURL)
#define IWMPPlayer_get_openState(This,pwmpos) (This)->lpVtbl->get_openState(This,pwmpos)
#define IWMPPlayer_get_playState(This,pwmpps) (This)->lpVtbl->get_playState(This,pwmpps)
#define IWMPPlayer_get_controls(This,ppControl) (This)->lpVtbl->get_controls(This,ppControl)
#define IWMPPlayer_get_settings(This,ppSettings) (This)->lpVtbl->get_settings(This,ppSettings)
#define IWMPPlayer_get_currentMedia(This,ppMedia) (This)->lpVtbl->get_currentMedia(This,ppMedia)
#define IWMPPlayer_put_currentMedia(This,ppMedia) (This)->lpVtbl->put_currentMedia(This,ppMedia)
#define IWMPPlayer_get_mediaCollection(This,ppMediaCollection) (This)->lpVtbl->get_mediaCollection(This,ppMediaCollection)
#define IWMPPlayer_get_playlistCollection(This,ppPlaylistCollection) (This)->lpVtbl->get_playlistCollection(This,ppPlaylistCollection)
#define IWMPPlayer_get_versionInfo(This,pbstrVersionInfo) (This)->lpVtbl->get_versionInfo(This,pbstrVersionInfo)
#define IWMPPlayer_launchURL(This,bstrURL) (This)->lpVtbl->launchURL(This,bstrURL)
#define IWMPPlayer_get_network(This,ppQNI) (This)->lpVtbl->get_network(This,ppQNI)
#define IWMPPlayer_get_currentPlaylist(This,ppPL) (This)->lpVtbl->get_currentPlaylist(This,ppPL)
#define IWMPPlayer_put_currentPlaylist(This,ppPL) (This)->lpVtbl->put_currentPlaylist(This,ppPL)
#define IWMPPlayer_get_cdromCollection(This,ppCdromCollection) (This)->lpVtbl->get_cdromCollection(This,ppCdromCollection)
#define IWMPPlayer_get_closedCaption(This,ppClosedCaption) (This)->lpVtbl->get_closedCaption(This,ppClosedCaption)
#define IWMPPlayer_get_isOnline(This,pfOnline) (This)->lpVtbl->get_isOnline(This,pfOnline)
#define IWMPPlayer_get_Error(This,ppError) (This)->lpVtbl->get_Error(This,ppError)
#define IWMPPlayer_get_status(This,pbstrStatus) (This)->lpVtbl->get_status(This,pbstrStatus)
/*** IWMPPlayer methods ***/
#define IWMPPlayer_get_enabled(This,pbEnabled) (This)->lpVtbl->get_enabled(This,pbEnabled)
#define IWMPPlayer_put_enabled(This,pbEnabled) (This)->lpVtbl->put_enabled(This,pbEnabled)
#define IWMPPlayer_get_fullScreen(This,pbFullScreen) (This)->lpVtbl->get_fullScreen(This,pbFullScreen)
#define IWMPPlayer_put_fullScreen(This,pbFullScreen) (This)->lpVtbl->put_fullScreen(This,pbFullScreen)
#define IWMPPlayer_get_enableContextMenu(This,pbEnableContextMenu) (This)->lpVtbl->get_enableContextMenu(This,pbEnableContextMenu)
#define IWMPPlayer_put_enableContextMenu(This,pbEnableContextMenu) (This)->lpVtbl->put_enableContextMenu(This,pbEnableContextMenu)
#define IWMPPlayer_put_uiMode(This,pbstrMode) (This)->lpVtbl->put_uiMode(This,pbstrMode)
#define IWMPPlayer_get_uiMode(This,pbstrMode) (This)->lpVtbl->get_uiMode(This,pbstrMode)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IWMPPlayer_QueryInterface(IWMPPlayer* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWMPPlayer_AddRef(IWMPPlayer* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWMPPlayer_Release(IWMPPlayer* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IWMPPlayer_GetTypeInfoCount(IWMPPlayer* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IWMPPlayer_GetTypeInfo(IWMPPlayer* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IWMPPlayer_GetIDsOfNames(IWMPPlayer* 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 IWMPPlayer_Invoke(IWMPPlayer* 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);
}
/*** IWMPCore methods ***/
static __WIDL_INLINE HRESULT IWMPPlayer_close(IWMPPlayer* This) {
    return This->lpVtbl->close(This);
}
static __WIDL_INLINE HRESULT IWMPPlayer_get_URL(IWMPPlayer* This,BSTR *pbstrURL) {
    return This->lpVtbl->get_URL(This,pbstrURL);
}
static __WIDL_INLINE HRESULT IWMPPlayer_put_URL(IWMPPlayer* This,BSTR pbstrURL) {
    return This->lpVtbl->put_URL(This,pbstrURL);
}
static __WIDL_INLINE HRESULT IWMPPlayer_get_openState(IWMPPlayer* This,WMPOpenState *pwmpos) {
    return This->lpVtbl->get_openState(This,pwmpos);
}
static __WIDL_INLINE HRESULT IWMPPlayer_get_playState(IWMPPlayer* This,WMPPlayState *pwmpps) {
    return This->lpVtbl->get_playState(This,pwmpps);
}
static __WIDL_INLINE HRESULT IWMPPlayer_get_controls(IWMPPlayer* This,IWMPControls **ppControl) {
    return This->lpVtbl->get_controls(This,ppControl);
}
static __WIDL_INLINE HRESULT IWMPPlayer_get_settings(IWMPPlayer* This,IWMPSettings **ppSettings) {
    return This->lpVtbl->get_settings(This,ppSettings);
}
static __WIDL_INLINE HRESULT IWMPPlayer_get_currentMedia(IWMPPlayer* This,IWMPMedia **ppMedia) {
    return This->lpVtbl->get_currentMedia(This,ppMedia);
}
static __WIDL_INLINE HRESULT IWMPPlayer_put_currentMedia(IWMPPlayer* This,IWMPMedia *ppMedia) {
    return This->lpVtbl->put_currentMedia(This,ppMedia);
}
static __WIDL_INLINE HRESULT IWMPPlayer_get_mediaCollection(IWMPPlayer* This,IWMPMediaCollection **ppMediaCollection) {
    return This->lpVtbl->get_mediaCollection(This,ppMediaCollection);
}
static __WIDL_INLINE HRESULT IWMPPlayer_get_playlistCollection(IWMPPlayer* This,IWMPPlaylistCollection **ppPlaylistCollection) {
    return This->lpVtbl->get_playlistCollection(This,ppPlaylistCollection);
}
static __WIDL_INLINE HRESULT IWMPPlayer_get_versionInfo(IWMPPlayer* This,BSTR *pbstrVersionInfo) {
    return This->lpVtbl->get_versionInfo(This,pbstrVersionInfo);
}
static __WIDL_INLINE HRESULT IWMPPlayer_launchURL(IWMPPlayer* This,BSTR bstrURL) {
    return This->lpVtbl->launchURL(This,bstrURL);
}
static __WIDL_INLINE HRESULT IWMPPlayer_get_network(IWMPPlayer* This,IWMPNetwork **ppQNI) {
    return This->lpVtbl->get_network(This,ppQNI);
}
static __WIDL_INLINE HRESULT IWMPPlayer_get_currentPlaylist(IWMPPlayer* This,IWMPPlaylist **ppPL) {
    return This->lpVtbl->get_currentPlaylist(This,ppPL);
}
static __WIDL_INLINE HRESULT IWMPPlayer_put_currentPlaylist(IWMPPlayer* This,IWMPPlaylist *ppPL) {
    return This->lpVtbl->put_currentPlaylist(This,ppPL);
}
static __WIDL_INLINE HRESULT IWMPPlayer_get_cdromCollection(IWMPPlayer* This,IWMPCdromCollection **ppCdromCollection) {
    return This->lpVtbl->get_cdromCollection(This,ppCdromCollection);
}
static __WIDL_INLINE HRESULT IWMPPlayer_get_closedCaption(IWMPPlayer* This,IWMPClosedCaption **ppClosedCaption) {
    return This->lpVtbl->get_closedCaption(This,ppClosedCaption);
}
static __WIDL_INLINE HRESULT IWMPPlayer_get_isOnline(IWMPPlayer* This,VARIANT_BOOL *pfOnline) {
    return This->lpVtbl->get_isOnline(This,pfOnline);
}
static __WIDL_INLINE HRESULT IWMPPlayer_get_Error(IWMPPlayer* This,IWMPError **ppError) {
    return This->lpVtbl->get_Error(This,ppError);
}
static __WIDL_INLINE HRESULT IWMPPlayer_get_status(IWMPPlayer* This,BSTR *pbstrStatus) {
    return This->lpVtbl->get_status(This,pbstrStatus);
}
/*** IWMPPlayer methods ***/
static __WIDL_INLINE HRESULT IWMPPlayer_get_enabled(IWMPPlayer* This,VARIANT_BOOL *pbEnabled) {
    return This->lpVtbl->get_enabled(This,pbEnabled);
}
static __WIDL_INLINE HRESULT IWMPPlayer_put_enabled(IWMPPlayer* This,VARIANT_BOOL pbEnabled) {
    return This->lpVtbl->put_enabled(This,pbEnabled);
}
static __WIDL_INLINE HRESULT IWMPPlayer_get_fullScreen(IWMPPlayer* This,VARIANT_BOOL *pbFullScreen) {
    return This->lpVtbl->get_fullScreen(This,pbFullScreen);
}
static __WIDL_INLINE HRESULT IWMPPlayer_put_fullScreen(IWMPPlayer* This,VARIANT_BOOL pbFullScreen) {
    return This->lpVtbl->put_fullScreen(This,pbFullScreen);
}
static __WIDL_INLINE HRESULT IWMPPlayer_get_enableContextMenu(IWMPPlayer* This,VARIANT_BOOL *pbEnableContextMenu) {
    return This->lpVtbl->get_enableContextMenu(This,pbEnableContextMenu);
}
static __WIDL_INLINE HRESULT IWMPPlayer_put_enableContextMenu(IWMPPlayer* This,VARIANT_BOOL pbEnableContextMenu) {
    return This->lpVtbl->put_enableContextMenu(This,pbEnableContextMenu);
}
static __WIDL_INLINE HRESULT IWMPPlayer_put_uiMode(IWMPPlayer* This,BSTR pbstrMode) {
    return This->lpVtbl->put_uiMode(This,pbstrMode);
}
static __WIDL_INLINE HRESULT IWMPPlayer_get_uiMode(IWMPPlayer* This,BSTR *pbstrMode) {
    return This->lpVtbl->get_uiMode(This,pbstrMode);
}
#endif
#endif

#endif


#endif  /* __IWMPPlayer_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMPSyncDevice interface
 */
#ifndef __IWMPSyncDevice_INTERFACE_DEFINED__
#define __IWMPSyncDevice_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMPSyncDevice, 0x82a2986c, 0x0293, 0x4fd0, 0xb2,0x79, 0xb2,0x1b,0x86,0xc0,0x58,0xbe);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("82a2986c-0293-4fd0-b279-b21b86c058be")
IWMPSyncDevice : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE get_friendlyName(
        BSTR *name) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_friendlyName(
        BSTR name) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_deviceName(
        BSTR *name) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_deviceId(
        BSTR *device) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_partnershipIndex(
        LONG *index) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_connected(
        VARIANT_BOOL *connected) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_status(
        WMPDeviceStatus *status) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_syncState(
        WMPSyncState *state) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_progress(
        LONG *progress) = 0;

    virtual HRESULT STDMETHODCALLTYPE getItemInfo(
        BSTR name,
        BSTR *val) = 0;

    virtual HRESULT STDMETHODCALLTYPE createPartnership(
        VARIANT_BOOL showui) = 0;

    virtual HRESULT STDMETHODCALLTYPE deletePartnership(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE start(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE stop(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE showSettings(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE isIdentical(
        IWMPSyncDevice *device,
        VARIANT_BOOL *ret) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMPSyncDevice, 0x82a2986c, 0x0293, 0x4fd0, 0xb2,0x79, 0xb2,0x1b,0x86,0xc0,0x58,0xbe)
#endif
#else
typedef struct IWMPSyncDeviceVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMPSyncDevice methods ***/
    HRESULT (STDMETHODCALLTYPE *get_friendlyName)(
        IWMPSyncDevice *This,
        BSTR *name);

    HRESULT (STDMETHODCALLTYPE *put_friendlyName)(
        IWMPSyncDevice *This,
        BSTR name);

    HRESULT (STDMETHODCALLTYPE *get_deviceName)(
        IWMPSyncDevice *This,
        BSTR *name);

    HRESULT (STDMETHODCALLTYPE *get_deviceId)(
        IWMPSyncDevice *This,
        BSTR *device);

    HRESULT (STDMETHODCALLTYPE *get_partnershipIndex)(
        IWMPSyncDevice *This,
        LONG *index);

    HRESULT (STDMETHODCALLTYPE *get_connected)(
        IWMPSyncDevice *This,
        VARIANT_BOOL *connected);

    HRESULT (STDMETHODCALLTYPE *get_status)(
        IWMPSyncDevice *This,
        WMPDeviceStatus *status);

    HRESULT (STDMETHODCALLTYPE *get_syncState)(
        IWMPSyncDevice *This,
        WMPSyncState *state);

    HRESULT (STDMETHODCALLTYPE *get_progress)(
        IWMPSyncDevice *This,
        LONG *progress);

    HRESULT (STDMETHODCALLTYPE *getItemInfo)(
        IWMPSyncDevice *This,
        BSTR name,
        BSTR *val);

    HRESULT (STDMETHODCALLTYPE *createPartnership)(
        IWMPSyncDevice *This,
        VARIANT_BOOL showui);

    HRESULT (STDMETHODCALLTYPE *deletePartnership)(
        IWMPSyncDevice *This);

    HRESULT (STDMETHODCALLTYPE *start)(
        IWMPSyncDevice *This);

    HRESULT (STDMETHODCALLTYPE *stop)(
        IWMPSyncDevice *This);

    HRESULT (STDMETHODCALLTYPE *showSettings)(
        IWMPSyncDevice *This);

    HRESULT (STDMETHODCALLTYPE *isIdentical)(
        IWMPSyncDevice *This,
        IWMPSyncDevice *device,
        VARIANT_BOOL *ret);

    END_INTERFACE
} IWMPSyncDeviceVtbl;

interface IWMPSyncDevice {
    CONST_VTBL IWMPSyncDeviceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMPSyncDevice_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMPSyncDevice_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMPSyncDevice_Release(This) (This)->lpVtbl->Release(This)
/*** IWMPSyncDevice methods ***/
#define IWMPSyncDevice_get_friendlyName(This,name) (This)->lpVtbl->get_friendlyName(This,name)
#define IWMPSyncDevice_put_friendlyName(This,name) (This)->lpVtbl->put_friendlyName(This,name)
#define IWMPSyncDevice_get_deviceName(This,name) (This)->lpVtbl->get_deviceName(This,name)
#define IWMPSyncDevice_get_deviceId(This,device) (This)->lpVtbl->get_deviceId(This,device)
#define IWMPSyncDevice_get_partnershipIndex(This,index) (This)->lpVtbl->get_partnershipIndex(This,index)
#define IWMPSyncDevice_get_connected(This,connected) (This)->lpVtbl->get_connected(This,connected)
#define IWMPSyncDevice_get_status(This,status) (This)->lpVtbl->get_status(This,status)
#define IWMPSyncDevice_get_syncState(This,state) (This)->lpVtbl->get_syncState(This,state)
#define IWMPSyncDevice_get_progress(This,progress) (This)->lpVtbl->get_progress(This,progress)
#define IWMPSyncDevice_getItemInfo(This,name,val) (This)->lpVtbl->getItemInfo(This,name,val)
#define IWMPSyncDevice_createPartnership(This,showui) (This)->lpVtbl->createPartnership(This,showui)
#define IWMPSyncDevice_deletePartnership(This) (This)->lpVtbl->deletePartnership(This)
#define IWMPSyncDevice_start(This) (This)->lpVtbl->start(This)
#define IWMPSyncDevice_stop(This) (This)->lpVtbl->stop(This)
#define IWMPSyncDevice_showSettings(This) (This)->lpVtbl->showSettings(This)
#define IWMPSyncDevice_isIdentical(This,device,ret) (This)->lpVtbl->isIdentical(This,device,ret)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IWMPSyncDevice_QueryInterface(IWMPSyncDevice* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWMPSyncDevice_AddRef(IWMPSyncDevice* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWMPSyncDevice_Release(IWMPSyncDevice* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMPSyncDevice methods ***/
static __WIDL_INLINE HRESULT IWMPSyncDevice_get_friendlyName(IWMPSyncDevice* This,BSTR *name) {
    return This->lpVtbl->get_friendlyName(This,name);
}
static __WIDL_INLINE HRESULT IWMPSyncDevice_put_friendlyName(IWMPSyncDevice* This,BSTR name) {
    return This->lpVtbl->put_friendlyName(This,name);
}
static __WIDL_INLINE HRESULT IWMPSyncDevice_get_deviceName(IWMPSyncDevice* This,BSTR *name) {
    return This->lpVtbl->get_deviceName(This,name);
}
static __WIDL_INLINE HRESULT IWMPSyncDevice_get_deviceId(IWMPSyncDevice* This,BSTR *device) {
    return This->lpVtbl->get_deviceId(This,device);
}
static __WIDL_INLINE HRESULT IWMPSyncDevice_get_partnershipIndex(IWMPSyncDevice* This,LONG *index) {
    return This->lpVtbl->get_partnershipIndex(This,index);
}
static __WIDL_INLINE HRESULT IWMPSyncDevice_get_connected(IWMPSyncDevice* This,VARIANT_BOOL *connected) {
    return This->lpVtbl->get_connected(This,connected);
}
static __WIDL_INLINE HRESULT IWMPSyncDevice_get_status(IWMPSyncDevice* This,WMPDeviceStatus *status) {
    return This->lpVtbl->get_status(This,status);
}
static __WIDL_INLINE HRESULT IWMPSyncDevice_get_syncState(IWMPSyncDevice* This,WMPSyncState *state) {
    return This->lpVtbl->get_syncState(This,state);
}
static __WIDL_INLINE HRESULT IWMPSyncDevice_get_progress(IWMPSyncDevice* This,LONG *progress) {
    return This->lpVtbl->get_progress(This,progress);
}
static __WIDL_INLINE HRESULT IWMPSyncDevice_getItemInfo(IWMPSyncDevice* This,BSTR name,BSTR *val) {
    return This->lpVtbl->getItemInfo(This,name,val);
}
static __WIDL_INLINE HRESULT IWMPSyncDevice_createPartnership(IWMPSyncDevice* This,VARIANT_BOOL showui) {
    return This->lpVtbl->createPartnership(This,showui);
}
static __WIDL_INLINE HRESULT IWMPSyncDevice_deletePartnership(IWMPSyncDevice* This) {
    return This->lpVtbl->deletePartnership(This);
}
static __WIDL_INLINE HRESULT IWMPSyncDevice_start(IWMPSyncDevice* This) {
    return This->lpVtbl->start(This);
}
static __WIDL_INLINE HRESULT IWMPSyncDevice_stop(IWMPSyncDevice* This) {
    return This->lpVtbl->stop(This);
}
static __WIDL_INLINE HRESULT IWMPSyncDevice_showSettings(IWMPSyncDevice* This) {
    return This->lpVtbl->showSettings(This);
}
static __WIDL_INLINE HRESULT IWMPSyncDevice_isIdentical(IWMPSyncDevice* This,IWMPSyncDevice *device,VARIANT_BOOL *ret) {
    return This->lpVtbl->isIdentical(This,device,ret);
}
#endif
#endif

#endif


#endif  /* __IWMPSyncDevice_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMPSyncDevice2 interface
 */
#ifndef __IWMPSyncDevice2_INTERFACE_DEFINED__
#define __IWMPSyncDevice2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMPSyncDevice2, 0x88afb4b2, 0x140a, 0x44d2, 0x91,0xe6, 0x45,0x43,0xda,0x46,0x7c,0xd1);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("88afb4b2-140a-44d2-91e6-4543da467cd1")
IWMPSyncDevice2 : public IWMPSyncDevice
{
    virtual HRESULT STDMETHODCALLTYPE setItemInfo(
        BSTR name,
        BSTR val) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMPSyncDevice2, 0x88afb4b2, 0x140a, 0x44d2, 0x91,0xe6, 0x45,0x43,0xda,0x46,0x7c,0xd1)
#endif
#else
typedef struct IWMPSyncDevice2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMPSyncDevice methods ***/
    HRESULT (STDMETHODCALLTYPE *get_friendlyName)(
        IWMPSyncDevice2 *This,
        BSTR *name);

    HRESULT (STDMETHODCALLTYPE *put_friendlyName)(
        IWMPSyncDevice2 *This,
        BSTR name);

    HRESULT (STDMETHODCALLTYPE *get_deviceName)(
        IWMPSyncDevice2 *This,
        BSTR *name);

    HRESULT (STDMETHODCALLTYPE *get_deviceId)(
        IWMPSyncDevice2 *This,
        BSTR *device);

    HRESULT (STDMETHODCALLTYPE *get_partnershipIndex)(
        IWMPSyncDevice2 *This,
        LONG *index);

    HRESULT (STDMETHODCALLTYPE *get_connected)(
        IWMPSyncDevice2 *This,
        VARIANT_BOOL *connected);

    HRESULT (STDMETHODCALLTYPE *get_status)(
        IWMPSyncDevice2 *This,
        WMPDeviceStatus *status);

    HRESULT (STDMETHODCALLTYPE *get_syncState)(
        IWMPSyncDevice2 *This,
        WMPSyncState *state);

    HRESULT (STDMETHODCALLTYPE *get_progress)(
        IWMPSyncDevice2 *This,
        LONG *progress);

    HRESULT (STDMETHODCALLTYPE *getItemInfo)(
        IWMPSyncDevice2 *This,
        BSTR name,
        BSTR *val);

    HRESULT (STDMETHODCALLTYPE *createPartnership)(
        IWMPSyncDevice2 *This,
        VARIANT_BOOL showui);

    HRESULT (STDMETHODCALLTYPE *deletePartnership)(
        IWMPSyncDevice2 *This);

    HRESULT (STDMETHODCALLTYPE *start)(
        IWMPSyncDevice2 *This);

    HRESULT (STDMETHODCALLTYPE *stop)(
        IWMPSyncDevice2 *This);

    HRESULT (STDMETHODCALLTYPE *showSettings)(
        IWMPSyncDevice2 *This);

    HRESULT (STDMETHODCALLTYPE *isIdentical)(
        IWMPSyncDevice2 *This,
        IWMPSyncDevice *device,
        VARIANT_BOOL *ret);

    /*** IWMPSyncDevice2 methods ***/
    HRESULT (STDMETHODCALLTYPE *setItemInfo)(
        IWMPSyncDevice2 *This,
        BSTR name,
        BSTR val);

    END_INTERFACE
} IWMPSyncDevice2Vtbl;

interface IWMPSyncDevice2 {
    CONST_VTBL IWMPSyncDevice2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMPSyncDevice2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMPSyncDevice2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMPSyncDevice2_Release(This) (This)->lpVtbl->Release(This)
/*** IWMPSyncDevice methods ***/
#define IWMPSyncDevice2_get_friendlyName(This,name) (This)->lpVtbl->get_friendlyName(This,name)
#define IWMPSyncDevice2_put_friendlyName(This,name) (This)->lpVtbl->put_friendlyName(This,name)
#define IWMPSyncDevice2_get_deviceName(This,name) (This)->lpVtbl->get_deviceName(This,name)
#define IWMPSyncDevice2_get_deviceId(This,device) (This)->lpVtbl->get_deviceId(This,device)
#define IWMPSyncDevice2_get_partnershipIndex(This,index) (This)->lpVtbl->get_partnershipIndex(This,index)
#define IWMPSyncDevice2_get_connected(This,connected) (This)->lpVtbl->get_connected(This,connected)
#define IWMPSyncDevice2_get_status(This,status) (This)->lpVtbl->get_status(This,status)
#define IWMPSyncDevice2_get_syncState(This,state) (This)->lpVtbl->get_syncState(This,state)
#define IWMPSyncDevice2_get_progress(This,progress) (This)->lpVtbl->get_progress(This,progress)
#define IWMPSyncDevice2_getItemInfo(This,name,val) (This)->lpVtbl->getItemInfo(This,name,val)
#define IWMPSyncDevice2_createPartnership(This,showui) (This)->lpVtbl->createPartnership(This,showui)
#define IWMPSyncDevice2_deletePartnership(This) (This)->lpVtbl->deletePartnership(This)
#define IWMPSyncDevice2_start(This) (This)->lpVtbl->start(This)
#define IWMPSyncDevice2_stop(This) (This)->lpVtbl->stop(This)
#define IWMPSyncDevice2_showSettings(This) (This)->lpVtbl->showSettings(This)
#define IWMPSyncDevice2_isIdentical(This,device,ret) (This)->lpVtbl->isIdentical(This,device,ret)
/*** IWMPSyncDevice2 methods ***/
#define IWMPSyncDevice2_setItemInfo(This,name,val) (This)->lpVtbl->setItemInfo(This,name,val)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IWMPSyncDevice2_QueryInterface(IWMPSyncDevice2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWMPSyncDevice2_AddRef(IWMPSyncDevice2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWMPSyncDevice2_Release(IWMPSyncDevice2* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMPSyncDevice methods ***/
static __WIDL_INLINE HRESULT IWMPSyncDevice2_get_friendlyName(IWMPSyncDevice2* This,BSTR *name) {
    return This->lpVtbl->get_friendlyName(This,name);
}
static __WIDL_INLINE HRESULT IWMPSyncDevice2_put_friendlyName(IWMPSyncDevice2* This,BSTR name) {
    return This->lpVtbl->put_friendlyName(This,name);
}
static __WIDL_INLINE HRESULT IWMPSyncDevice2_get_deviceName(IWMPSyncDevice2* This,BSTR *name) {
    return This->lpVtbl->get_deviceName(This,name);
}
static __WIDL_INLINE HRESULT IWMPSyncDevice2_get_deviceId(IWMPSyncDevice2* This,BSTR *device) {
    return This->lpVtbl->get_deviceId(This,device);
}
static __WIDL_INLINE HRESULT IWMPSyncDevice2_get_partnershipIndex(IWMPSyncDevice2* This,LONG *index) {
    return This->lpVtbl->get_partnershipIndex(This,index);
}
static __WIDL_INLINE HRESULT IWMPSyncDevice2_get_connected(IWMPSyncDevice2* This,VARIANT_BOOL *connected) {
    return This->lpVtbl->get_connected(This,connected);
}
static __WIDL_INLINE HRESULT IWMPSyncDevice2_get_status(IWMPSyncDevice2* This,WMPDeviceStatus *status) {
    return This->lpVtbl->get_status(This,status);
}
static __WIDL_INLINE HRESULT IWMPSyncDevice2_get_syncState(IWMPSyncDevice2* This,WMPSyncState *state) {
    return This->lpVtbl->get_syncState(This,state);
}
static __WIDL_INLINE HRESULT IWMPSyncDevice2_get_progress(IWMPSyncDevice2* This,LONG *progress) {
    return This->lpVtbl->get_progress(This,progress);
}
static __WIDL_INLINE HRESULT IWMPSyncDevice2_getItemInfo(IWMPSyncDevice2* This,BSTR name,BSTR *val) {
    return This->lpVtbl->getItemInfo(This,name,val);
}
static __WIDL_INLINE HRESULT IWMPSyncDevice2_createPartnership(IWMPSyncDevice2* This,VARIANT_BOOL showui) {
    return This->lpVtbl->createPartnership(This,showui);
}
static __WIDL_INLINE HRESULT IWMPSyncDevice2_deletePartnership(IWMPSyncDevice2* This) {
    return This->lpVtbl->deletePartnership(This);
}
static __WIDL_INLINE HRESULT IWMPSyncDevice2_start(IWMPSyncDevice2* This) {
    return This->lpVtbl->start(This);
}
static __WIDL_INLINE HRESULT IWMPSyncDevice2_stop(IWMPSyncDevice2* This) {
    return This->lpVtbl->stop(This);
}
static __WIDL_INLINE HRESULT IWMPSyncDevice2_showSettings(IWMPSyncDevice2* This) {
    return This->lpVtbl->showSettings(This);
}
static __WIDL_INLINE HRESULT IWMPSyncDevice2_isIdentical(IWMPSyncDevice2* This,IWMPSyncDevice *device,VARIANT_BOOL *ret) {
    return This->lpVtbl->isIdentical(This,device,ret);
}
/*** IWMPSyncDevice2 methods ***/
static __WIDL_INLINE HRESULT IWMPSyncDevice2_setItemInfo(IWMPSyncDevice2* This,BSTR name,BSTR val) {
    return This->lpVtbl->setItemInfo(This,name,val);
}
#endif
#endif

#endif


#endif  /* __IWMPSyncDevice2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMPCdromRip interface
 */
#ifndef __IWMPCdromRip_INTERFACE_DEFINED__
#define __IWMPCdromRip_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMPCdromRip, 0x56e2294f, 0x69ed, 0x4629, 0xa8,0x69, 0xae,0xa7,0x2c,0x0d,0xcc,0x2c);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("56e2294f-69ed-4629-a869-aea72c0dcc2c")
IWMPCdromRip : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE get_ripState(
        WMPRipState *state) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ripProgress(
        LONG *progress) = 0;

    virtual HRESULT STDMETHODCALLTYPE startRip(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE stopRip(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMPCdromRip, 0x56e2294f, 0x69ed, 0x4629, 0xa8,0x69, 0xae,0xa7,0x2c,0x0d,0xcc,0x2c)
#endif
#else
typedef struct IWMPCdromRipVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMPCdromRip methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ripState)(
        IWMPCdromRip *This,
        WMPRipState *state);

    HRESULT (STDMETHODCALLTYPE *get_ripProgress)(
        IWMPCdromRip *This,
        LONG *progress);

    HRESULT (STDMETHODCALLTYPE *startRip)(
        IWMPCdromRip *This);

    HRESULT (STDMETHODCALLTYPE *stopRip)(
        IWMPCdromRip *This);

    END_INTERFACE
} IWMPCdromRipVtbl;

interface IWMPCdromRip {
    CONST_VTBL IWMPCdromRipVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMPCdromRip_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMPCdromRip_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMPCdromRip_Release(This) (This)->lpVtbl->Release(This)
/*** IWMPCdromRip methods ***/
#define IWMPCdromRip_get_ripState(This,state) (This)->lpVtbl->get_ripState(This,state)
#define IWMPCdromRip_get_ripProgress(This,progress) (This)->lpVtbl->get_ripProgress(This,progress)
#define IWMPCdromRip_startRip(This) (This)->lpVtbl->startRip(This)
#define IWMPCdromRip_stopRip(This) (This)->lpVtbl->stopRip(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IWMPCdromRip_QueryInterface(IWMPCdromRip* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWMPCdromRip_AddRef(IWMPCdromRip* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWMPCdromRip_Release(IWMPCdromRip* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMPCdromRip methods ***/
static __WIDL_INLINE HRESULT IWMPCdromRip_get_ripState(IWMPCdromRip* This,WMPRipState *state) {
    return This->lpVtbl->get_ripState(This,state);
}
static __WIDL_INLINE HRESULT IWMPCdromRip_get_ripProgress(IWMPCdromRip* This,LONG *progress) {
    return This->lpVtbl->get_ripProgress(This,progress);
}
static __WIDL_INLINE HRESULT IWMPCdromRip_startRip(IWMPCdromRip* This) {
    return This->lpVtbl->startRip(This);
}
static __WIDL_INLINE HRESULT IWMPCdromRip_stopRip(IWMPCdromRip* This) {
    return This->lpVtbl->stopRip(This);
}
#endif
#endif

#endif


#endif  /* __IWMPCdromRip_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMPCdromBurn interface
 */
#ifndef __IWMPCdromBurn_INTERFACE_DEFINED__
#define __IWMPCdromBurn_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMPCdromBurn, 0xbd94dbeb, 0x417f, 0x4928, 0xaa,0x06, 0x08,0x7d,0x56,0xed,0x9b,0x59);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("bd94dbeb-417f-4928-aa06-087d56ed9b59")
IWMPCdromBurn : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE isAvailable(
        BSTR item,
        VARIANT_BOOL *available) = 0;

    virtual HRESULT STDMETHODCALLTYPE getItemInfo(
        BSTR item,
        BSTR *val) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_label(
        BSTR *label) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_label(
        BSTR label) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_burnFormat(
        WMPBurnFormat *format) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_burnFormat(
        WMPBurnFormat format) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_burnPlaylist(
        IWMPPlaylist **playlist) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_burnPlaylist(
        IWMPPlaylist *playlist) = 0;

    virtual HRESULT STDMETHODCALLTYPE refreshStatus(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_burnState(
        WMPBurnState *state) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_burnProgress(
        LONG *progress) = 0;

    virtual HRESULT STDMETHODCALLTYPE startBurn(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE stopBurn(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE erase(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMPCdromBurn, 0xbd94dbeb, 0x417f, 0x4928, 0xaa,0x06, 0x08,0x7d,0x56,0xed,0x9b,0x59)
#endif
#else
typedef struct IWMPCdromBurnVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMPCdromBurn methods ***/
    HRESULT (STDMETHODCALLTYPE *isAvailable)(
        IWMPCdromBurn *This,
        BSTR item,
        VARIANT_BOOL *available);

    HRESULT (STDMETHODCALLTYPE *getItemInfo)(
        IWMPCdromBurn *This,
        BSTR item,
        BSTR *val);

    HRESULT (STDMETHODCALLTYPE *get_label)(
        IWMPCdromBurn *This,
        BSTR *label);

    HRESULT (STDMETHODCALLTYPE *put_label)(
        IWMPCdromBurn *This,
        BSTR label);

    HRESULT (STDMETHODCALLTYPE *get_burnFormat)(
        IWMPCdromBurn *This,
        WMPBurnFormat *format);

    HRESULT (STDMETHODCALLTYPE *put_burnFormat)(
        IWMPCdromBurn *This,
        WMPBurnFormat format);

    HRESULT (STDMETHODCALLTYPE *get_burnPlaylist)(
        IWMPCdromBurn *This,
        IWMPPlaylist **playlist);

    HRESULT (STDMETHODCALLTYPE *put_burnPlaylist)(
        IWMPCdromBurn *This,
        IWMPPlaylist *playlist);

    HRESULT (STDMETHODCALLTYPE *refreshStatus)(
        IWMPCdromBurn *This);

    HRESULT (STDMETHODCALLTYPE *get_burnState)(
        IWMPCdromBurn *This,
        WMPBurnState *state);

    HRESULT (STDMETHODCALLTYPE *get_burnProgress)(
        IWMPCdromBurn *This,
        LONG *progress);

    HRESULT (STDMETHODCALLTYPE *startBurn)(
        IWMPCdromBurn *This);

    HRESULT (STDMETHODCALLTYPE *stopBurn)(
        IWMPCdromBurn *This);

    HRESULT (STDMETHODCALLTYPE *erase)(
        IWMPCdromBurn *This);

    END_INTERFACE
} IWMPCdromBurnVtbl;

interface IWMPCdromBurn {
    CONST_VTBL IWMPCdromBurnVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMPCdromBurn_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMPCdromBurn_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMPCdromBurn_Release(This) (This)->lpVtbl->Release(This)
/*** IWMPCdromBurn methods ***/
#define IWMPCdromBurn_isAvailable(This,item,available) (This)->lpVtbl->isAvailable(This,item,available)
#define IWMPCdromBurn_getItemInfo(This,item,val) (This)->lpVtbl->getItemInfo(This,item,val)
#define IWMPCdromBurn_get_label(This,label) (This)->lpVtbl->get_label(This,label)
#define IWMPCdromBurn_put_label(This,label) (This)->lpVtbl->put_label(This,label)
#define IWMPCdromBurn_get_burnFormat(This,format) (This)->lpVtbl->get_burnFormat(This,format)
#define IWMPCdromBurn_put_burnFormat(This,format) (This)->lpVtbl->put_burnFormat(This,format)
#define IWMPCdromBurn_get_burnPlaylist(This,playlist) (This)->lpVtbl->get_burnPlaylist(This,playlist)
#define IWMPCdromBurn_put_burnPlaylist(This,playlist) (This)->lpVtbl->put_burnPlaylist(This,playlist)
#define IWMPCdromBurn_refreshStatus(This) (This)->lpVtbl->refreshStatus(This)
#define IWMPCdromBurn_get_burnState(This,state) (This)->lpVtbl->get_burnState(This,state)
#define IWMPCdromBurn_get_burnProgress(This,progress) (This)->lpVtbl->get_burnProgress(This,progress)
#define IWMPCdromBurn_startBurn(This) (This)->lpVtbl->startBurn(This)
#define IWMPCdromBurn_stopBurn(This) (This)->lpVtbl->stopBurn(This)
#define IWMPCdromBurn_erase(This) (This)->lpVtbl->erase(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IWMPCdromBurn_QueryInterface(IWMPCdromBurn* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWMPCdromBurn_AddRef(IWMPCdromBurn* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWMPCdromBurn_Release(IWMPCdromBurn* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMPCdromBurn methods ***/
static __WIDL_INLINE HRESULT IWMPCdromBurn_isAvailable(IWMPCdromBurn* This,BSTR item,VARIANT_BOOL *available) {
    return This->lpVtbl->isAvailable(This,item,available);
}
static __WIDL_INLINE HRESULT IWMPCdromBurn_getItemInfo(IWMPCdromBurn* This,BSTR item,BSTR *val) {
    return This->lpVtbl->getItemInfo(This,item,val);
}
static __WIDL_INLINE HRESULT IWMPCdromBurn_get_label(IWMPCdromBurn* This,BSTR *label) {
    return This->lpVtbl->get_label(This,label);
}
static __WIDL_INLINE HRESULT IWMPCdromBurn_put_label(IWMPCdromBurn* This,BSTR label) {
    return This->lpVtbl->put_label(This,label);
}
static __WIDL_INLINE HRESULT IWMPCdromBurn_get_burnFormat(IWMPCdromBurn* This,WMPBurnFormat *format) {
    return This->lpVtbl->get_burnFormat(This,format);
}
static __WIDL_INLINE HRESULT IWMPCdromBurn_put_burnFormat(IWMPCdromBurn* This,WMPBurnFormat format) {
    return This->lpVtbl->put_burnFormat(This,format);
}
static __WIDL_INLINE HRESULT IWMPCdromBurn_get_burnPlaylist(IWMPCdromBurn* This,IWMPPlaylist **playlist) {
    return This->lpVtbl->get_burnPlaylist(This,playlist);
}
static __WIDL_INLINE HRESULT IWMPCdromBurn_put_burnPlaylist(IWMPCdromBurn* This,IWMPPlaylist *playlist) {
    return This->lpVtbl->put_burnPlaylist(This,playlist);
}
static __WIDL_INLINE HRESULT IWMPCdromBurn_refreshStatus(IWMPCdromBurn* This) {
    return This->lpVtbl->refreshStatus(This);
}
static __WIDL_INLINE HRESULT IWMPCdromBurn_get_burnState(IWMPCdromBurn* This,WMPBurnState *state) {
    return This->lpVtbl->get_burnState(This,state);
}
static __WIDL_INLINE HRESULT IWMPCdromBurn_get_burnProgress(IWMPCdromBurn* This,LONG *progress) {
    return This->lpVtbl->get_burnProgress(This,progress);
}
static __WIDL_INLINE HRESULT IWMPCdromBurn_startBurn(IWMPCdromBurn* This) {
    return This->lpVtbl->startBurn(This);
}
static __WIDL_INLINE HRESULT IWMPCdromBurn_stopBurn(IWMPCdromBurn* This) {
    return This->lpVtbl->stopBurn(This);
}
static __WIDL_INLINE HRESULT IWMPCdromBurn_erase(IWMPCdromBurn* This) {
    return This->lpVtbl->erase(This);
}
#endif
#endif

#endif


#endif  /* __IWMPCdromBurn_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMPLibrary interface
 */
#ifndef __IWMPLibrary_INTERFACE_DEFINED__
#define __IWMPLibrary_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMPLibrary, 0x3df47861, 0x7df1, 0x4c1f, 0xa8,0x1b, 0x4c,0x26,0xf0,0xf7,0xa7,0xc6);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3df47861-7df1-4c1f-a81b-4c26f0f7a7c6")
IWMPLibrary : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE get_name(
        BSTR *name) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_type(
        WMPLibraryType *type) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_mediaCollection(
        IWMPMediaCollection **collection) = 0;

    virtual HRESULT STDMETHODCALLTYPE isIdentical(
        IWMPLibrary *wmplibrary,
        VARIANT_BOOL *ret) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMPLibrary, 0x3df47861, 0x7df1, 0x4c1f, 0xa8,0x1b, 0x4c,0x26,0xf0,0xf7,0xa7,0xc6)
#endif
#else
typedef struct IWMPLibraryVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMPLibrary methods ***/
    HRESULT (STDMETHODCALLTYPE *get_name)(
        IWMPLibrary *This,
        BSTR *name);

    HRESULT (STDMETHODCALLTYPE *get_type)(
        IWMPLibrary *This,
        WMPLibraryType *type);

    HRESULT (STDMETHODCALLTYPE *get_mediaCollection)(
        IWMPLibrary *This,
        IWMPMediaCollection **collection);

    HRESULT (STDMETHODCALLTYPE *isIdentical)(
        IWMPLibrary *This,
        IWMPLibrary *wmplibrary,
        VARIANT_BOOL *ret);

    END_INTERFACE
} IWMPLibraryVtbl;

interface IWMPLibrary {
    CONST_VTBL IWMPLibraryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMPLibrary_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMPLibrary_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMPLibrary_Release(This) (This)->lpVtbl->Release(This)
/*** IWMPLibrary methods ***/
#define IWMPLibrary_get_name(This,name) (This)->lpVtbl->get_name(This,name)
#define IWMPLibrary_get_type(This,type) (This)->lpVtbl->get_type(This,type)
#define IWMPLibrary_get_mediaCollection(This,collection) (This)->lpVtbl->get_mediaCollection(This,collection)
#define IWMPLibrary_isIdentical(This,wmplibrary,ret) (This)->lpVtbl->isIdentical(This,wmplibrary,ret)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IWMPLibrary_QueryInterface(IWMPLibrary* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWMPLibrary_AddRef(IWMPLibrary* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWMPLibrary_Release(IWMPLibrary* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMPLibrary methods ***/
static __WIDL_INLINE HRESULT IWMPLibrary_get_name(IWMPLibrary* This,BSTR *name) {
    return This->lpVtbl->get_name(This,name);
}
static __WIDL_INLINE HRESULT IWMPLibrary_get_type(IWMPLibrary* This,WMPLibraryType *type) {
    return This->lpVtbl->get_type(This,type);
}
static __WIDL_INLINE HRESULT IWMPLibrary_get_mediaCollection(IWMPLibrary* This,IWMPMediaCollection **collection) {
    return This->lpVtbl->get_mediaCollection(This,collection);
}
static __WIDL_INLINE HRESULT IWMPLibrary_isIdentical(IWMPLibrary* This,IWMPLibrary *wmplibrary,VARIANT_BOOL *ret) {
    return This->lpVtbl->isIdentical(This,wmplibrary,ret);
}
#endif
#endif

#endif


#endif  /* __IWMPLibrary_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMPEvents interface
 */
#ifndef __IWMPEvents_INTERFACE_DEFINED__
#define __IWMPEvents_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMPEvents, 0x19a6627b, 0xda9e, 0x47c1, 0xbb,0x23, 0x00,0xb5,0xe6,0x68,0x23,0x6a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("19a6627b-da9e-47c1-bb23-00b5e668236a")
IWMPEvents : public IUnknown
{
    virtual void STDMETHODCALLTYPE OpenStateChange(
        LONG state) = 0;

    virtual void STDMETHODCALLTYPE PlayStateChange(
        LONG state) = 0;

    virtual void STDMETHODCALLTYPE AudioLanguageChange(
        LONG lang) = 0;

    virtual void STDMETHODCALLTYPE StatusChange(
        ) = 0;

    virtual void STDMETHODCALLTYPE ScriptCommand(
        BSTR type,
        BSTR param) = 0;

    virtual void STDMETHODCALLTYPE NewStream(
        ) = 0;

    virtual void STDMETHODCALLTYPE Disconnect(
        LONG result) = 0;

    virtual void STDMETHODCALLTYPE Buffering(
        VARIANT_BOOL start) = 0;

    virtual void STDMETHODCALLTYPE Error(
        ) = 0;

    virtual void STDMETHODCALLTYPE Warning(
        LONG warning,
        LONG param,
        BSTR description) = 0;

    virtual void STDMETHODCALLTYPE EndOfStream(
        LONG result) = 0;

    virtual void STDMETHODCALLTYPE PositionChange(
        double old_position,
        double new_position) = 0;

    virtual void STDMETHODCALLTYPE MarkerHit(
        LONG marker) = 0;

    virtual void STDMETHODCALLTYPE DurationUnitChange(
        LONG duration) = 0;

    virtual void STDMETHODCALLTYPE CdromMediaChange(
        LONG num) = 0;

    virtual void STDMETHODCALLTYPE PlaylistChange(
        IDispatch *playlist,
        WMPPlaylistChangeEventType change) = 0;

    virtual void STDMETHODCALLTYPE CurrentPlaylistChange(
        WMPPlaylistChangeEventType change) = 0;

    virtual void STDMETHODCALLTYPE CurrentPlaylistItemAvailable(
        BSTR item) = 0;

    virtual void STDMETHODCALLTYPE MediaChange(
        IDispatch *item) = 0;

    virtual void STDMETHODCALLTYPE CurrentMediaItemAvailable(
        BSTR name) = 0;

    virtual void STDMETHODCALLTYPE CurrentItemChange(
        IDispatch *media) = 0;

    virtual void STDMETHODCALLTYPE MediaCollectionChange(
        ) = 0;

    virtual void STDMETHODCALLTYPE MediaCollectionAttributeStringAdded(
        BSTR name,
        BSTR val) = 0;

    virtual void STDMETHODCALLTYPE MediaCollectionAttributeStringRemoved(
        BSTR name,
        BSTR val) = 0;

    virtual void STDMETHODCALLTYPE MediaCollectionAttributeStringChanged(
        BSTR name,
        BSTR old_val,
        BSTR new_val) = 0;

    virtual void STDMETHODCALLTYPE PlaylistCollectionChange(
        ) = 0;

    virtual void STDMETHODCALLTYPE PlaylistCollectionPlaylistAdded(
        BSTR name) = 0;

    virtual void STDMETHODCALLTYPE PlaylistCollectionPlaylistRemoved(
        BSTR name) = 0;

    virtual void STDMETHODCALLTYPE PlaylistCollectionPlaylistSetAsDeleted(
        BSTR name,
        VARIANT_BOOL deleted) = 0;

    virtual void STDMETHODCALLTYPE ModeChange(
        BSTR ModeName,
        VARIANT_BOOL value) = 0;

    virtual void STDMETHODCALLTYPE MediaError(
        IDispatch *media) = 0;

    virtual void STDMETHODCALLTYPE OpenPlaylistSwitch(
        IDispatch *item) = 0;

    virtual void STDMETHODCALLTYPE DomainChange(
        BSTR domain) = 0;

    virtual void STDMETHODCALLTYPE SwitchedToPlayerApplication(
        ) = 0;

    virtual void STDMETHODCALLTYPE SwitchedToControl(
        ) = 0;

    virtual void STDMETHODCALLTYPE PlayerDockedStateChange(
        ) = 0;

    virtual void STDMETHODCALLTYPE PlayerReconnect(
        ) = 0;

    virtual void STDMETHODCALLTYPE Click(
        short button,
        short shift_state,
        LONG x,
        LONG y) = 0;

    virtual void STDMETHODCALLTYPE DoubleClick(
        short button,
        short shift_state,
        LONG fX,
        LONG fY) = 0;

    virtual void STDMETHODCALLTYPE KeyDown(
        short keycode,
        short shift_state) = 0;

    virtual void STDMETHODCALLTYPE KeyPress(
        short ascii) = 0;

    virtual void STDMETHODCALLTYPE KeyUp(
        short keycode,
        short shift_state) = 0;

    virtual void STDMETHODCALLTYPE MouseDown(
        short button,
        short nShiftState,
        LONG x,
        LONG y) = 0;

    virtual void STDMETHODCALLTYPE MouseMove(
        short button,
        short shift_state,
        LONG x,
        LONG y) = 0;

    virtual void STDMETHODCALLTYPE MouseUp(
        short button,
        short shift_state,
        LONG x,
        LONG y) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMPEvents, 0x19a6627b, 0xda9e, 0x47c1, 0xbb,0x23, 0x00,0xb5,0xe6,0x68,0x23,0x6a)
#endif
#else
typedef struct IWMPEventsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMPEvents methods ***/
    void (STDMETHODCALLTYPE *OpenStateChange)(
        IWMPEvents *This,
        LONG state);

    void (STDMETHODCALLTYPE *PlayStateChange)(
        IWMPEvents *This,
        LONG state);

    void (STDMETHODCALLTYPE *AudioLanguageChange)(
        IWMPEvents *This,
        LONG lang);

    void (STDMETHODCALLTYPE *StatusChange)(
        IWMPEvents *This);

    void (STDMETHODCALLTYPE *ScriptCommand)(
        IWMPEvents *This,
        BSTR type,
        BSTR param);

    void (STDMETHODCALLTYPE *NewStream)(
        IWMPEvents *This);

    void (STDMETHODCALLTYPE *Disconnect)(
        IWMPEvents *This,
        LONG result);

    void (STDMETHODCALLTYPE *Buffering)(
        IWMPEvents *This,
        VARIANT_BOOL start);

    void (STDMETHODCALLTYPE *Error)(
        IWMPEvents *This);

    void (STDMETHODCALLTYPE *Warning)(
        IWMPEvents *This,
        LONG warning,
        LONG param,
        BSTR description);

    void (STDMETHODCALLTYPE *EndOfStream)(
        IWMPEvents *This,
        LONG result);

    void (STDMETHODCALLTYPE *PositionChange)(
        IWMPEvents *This,
        double old_position,
        double new_position);

    void (STDMETHODCALLTYPE *MarkerHit)(
        IWMPEvents *This,
        LONG marker);

    void (STDMETHODCALLTYPE *DurationUnitChange)(
        IWMPEvents *This,
        LONG duration);

    void (STDMETHODCALLTYPE *CdromMediaChange)(
        IWMPEvents *This,
        LONG num);

    void (STDMETHODCALLTYPE *PlaylistChange)(
        IWMPEvents *This,
        IDispatch *playlist,
        WMPPlaylistChangeEventType change);

    void (STDMETHODCALLTYPE *CurrentPlaylistChange)(
        IWMPEvents *This,
        WMPPlaylistChangeEventType change);

    void (STDMETHODCALLTYPE *CurrentPlaylistItemAvailable)(
        IWMPEvents *This,
        BSTR item);

    void (STDMETHODCALLTYPE *MediaChange)(
        IWMPEvents *This,
        IDispatch *item);

    void (STDMETHODCALLTYPE *CurrentMediaItemAvailable)(
        IWMPEvents *This,
        BSTR name);

    void (STDMETHODCALLTYPE *CurrentItemChange)(
        IWMPEvents *This,
        IDispatch *media);

    void (STDMETHODCALLTYPE *MediaCollectionChange)(
        IWMPEvents *This);

    void (STDMETHODCALLTYPE *MediaCollectionAttributeStringAdded)(
        IWMPEvents *This,
        BSTR name,
        BSTR val);

    void (STDMETHODCALLTYPE *MediaCollectionAttributeStringRemoved)(
        IWMPEvents *This,
        BSTR name,
        BSTR val);

    void (STDMETHODCALLTYPE *MediaCollectionAttributeStringChanged)(
        IWMPEvents *This,
        BSTR name,
        BSTR old_val,
        BSTR new_val);

    void (STDMETHODCALLTYPE *PlaylistCollectionChange)(
        IWMPEvents *This);

    void (STDMETHODCALLTYPE *PlaylistCollectionPlaylistAdded)(
        IWMPEvents *This,
        BSTR name);

    void (STDMETHODCALLTYPE *PlaylistCollectionPlaylistRemoved)(
        IWMPEvents *This,
        BSTR name);

    void (STDMETHODCALLTYPE *PlaylistCollectionPlaylistSetAsDeleted)(
        IWMPEvents *This,
        BSTR name,
        VARIANT_BOOL deleted);

    void (STDMETHODCALLTYPE *ModeChange)(
        IWMPEvents *This,
        BSTR ModeName,
        VARIANT_BOOL value);

    void (STDMETHODCALLTYPE *MediaError)(
        IWMPEvents *This,
        IDispatch *media);

    void (STDMETHODCALLTYPE *OpenPlaylistSwitch)(
        IWMPEvents *This,
        IDispatch *item);

    void (STDMETHODCALLTYPE *DomainChange)(
        IWMPEvents *This,
        BSTR domain);

    void (STDMETHODCALLTYPE *SwitchedToPlayerApplication)(
        IWMPEvents *This);

    void (STDMETHODCALLTYPE *SwitchedToControl)(
        IWMPEvents *This);

    void (STDMETHODCALLTYPE *PlayerDockedStateChange)(
        IWMPEvents *This);

    void (STDMETHODCALLTYPE *PlayerReconnect)(
        IWMPEvents *This);

    void (STDMETHODCALLTYPE *Click)(
        IWMPEvents *This,
        short button,
        short shift_state,
        LONG x,
        LONG y);

    void (STDMETHODCALLTYPE *DoubleClick)(
        IWMPEvents *This,
        short button,
        short shift_state,
        LONG fX,
        LONG fY);

    void (STDMETHODCALLTYPE *KeyDown)(
        IWMPEvents *This,
        short keycode,
        short shift_state);

    void (STDMETHODCALLTYPE *KeyPress)(
        IWMPEvents *This,
        short ascii);

    void (STDMETHODCALLTYPE *KeyUp)(
        IWMPEvents *This,
        short keycode,
        short shift_state);

    void (STDMETHODCALLTYPE *MouseDown)(
        IWMPEvents *This,
        short button,
        short nShiftState,
        LONG x,
        LONG y);

    void (STDMETHODCALLTYPE *MouseMove)(
        IWMPEvents *This,
        short button,
        short shift_state,
        LONG x,
        LONG y);

    void (STDMETHODCALLTYPE *MouseUp)(
        IWMPEvents *This,
        short button,
        short shift_state,
        LONG x,
        LONG y);

    END_INTERFACE
} IWMPEventsVtbl;

interface IWMPEvents {
    CONST_VTBL IWMPEventsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMPEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMPEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMPEvents_Release(This) (This)->lpVtbl->Release(This)
/*** IWMPEvents methods ***/
#define IWMPEvents_OpenStateChange(This,state) (This)->lpVtbl->OpenStateChange(This,state)
#define IWMPEvents_PlayStateChange(This,state) (This)->lpVtbl->PlayStateChange(This,state)
#define IWMPEvents_AudioLanguageChange(This,lang) (This)->lpVtbl->AudioLanguageChange(This,lang)
#define IWMPEvents_StatusChange(This) (This)->lpVtbl->StatusChange(This)
#define IWMPEvents_ScriptCommand(This,type,param) (This)->lpVtbl->ScriptCommand(This,type,param)
#define IWMPEvents_NewStream(This) (This)->lpVtbl->NewStream(This)
#define IWMPEvents_Disconnect(This,result) (This)->lpVtbl->Disconnect(This,result)
#define IWMPEvents_Buffering(This,start) (This)->lpVtbl->Buffering(This,start)
#define IWMPEvents_Error(This) (This)->lpVtbl->Error(This)
#define IWMPEvents_Warning(This,warning,param,description) (This)->lpVtbl->Warning(This,warning,param,description)
#define IWMPEvents_EndOfStream(This,result) (This)->lpVtbl->EndOfStream(This,result)
#define IWMPEvents_PositionChange(This,old_position,new_position) (This)->lpVtbl->PositionChange(This,old_position,new_position)
#define IWMPEvents_MarkerHit(This,marker) (This)->lpVtbl->MarkerHit(This,marker)
#define IWMPEvents_DurationUnitChange(This,duration) (This)->lpVtbl->DurationUnitChange(This,duration)
#define IWMPEvents_CdromMediaChange(This,num) (This)->lpVtbl->CdromMediaChange(This,num)
#define IWMPEvents_PlaylistChange(This,playlist,change) (This)->lpVtbl->PlaylistChange(This,playlist,change)
#define IWMPEvents_CurrentPlaylistChange(This,change) (This)->lpVtbl->CurrentPlaylistChange(This,change)
#define IWMPEvents_CurrentPlaylistItemAvailable(This,item) (This)->lpVtbl->CurrentPlaylistItemAvailable(This,item)
#define IWMPEvents_MediaChange(This,item) (This)->lpVtbl->MediaChange(This,item)
#define IWMPEvents_CurrentMediaItemAvailable(This,name) (This)->lpVtbl->CurrentMediaItemAvailable(This,name)
#define IWMPEvents_CurrentItemChange(This,media) (This)->lpVtbl->CurrentItemChange(This,media)
#define IWMPEvents_MediaCollectionChange(This) (This)->lpVtbl->MediaCollectionChange(This)
#define IWMPEvents_MediaCollectionAttributeStringAdded(This,name,val) (This)->lpVtbl->MediaCollectionAttributeStringAdded(This,name,val)
#define IWMPEvents_MediaCollectionAttributeStringRemoved(This,name,val) (This)->lpVtbl->MediaCollectionAttributeStringRemoved(This,name,val)
#define IWMPEvents_MediaCollectionAttributeStringChanged(This,name,old_val,new_val) (This)->lpVtbl->MediaCollectionAttributeStringChanged(This,name,old_val,new_val)
#define IWMPEvents_PlaylistCollectionChange(This) (This)->lpVtbl->PlaylistCollectionChange(This)
#define IWMPEvents_PlaylistCollectionPlaylistAdded(This,name) (This)->lpVtbl->PlaylistCollectionPlaylistAdded(This,name)
#define IWMPEvents_PlaylistCollectionPlaylistRemoved(This,name) (This)->lpVtbl->PlaylistCollectionPlaylistRemoved(This,name)
#define IWMPEvents_PlaylistCollectionPlaylistSetAsDeleted(This,name,deleted) (This)->lpVtbl->PlaylistCollectionPlaylistSetAsDeleted(This,name,deleted)
#define IWMPEvents_ModeChange(This,ModeName,value) (This)->lpVtbl->ModeChange(This,ModeName,value)
#define IWMPEvents_MediaError(This,media) (This)->lpVtbl->MediaError(This,media)
#define IWMPEvents_OpenPlaylistSwitch(This,item) (This)->lpVtbl->OpenPlaylistSwitch(This,item)
#define IWMPEvents_DomainChange(This,domain) (This)->lpVtbl->DomainChange(This,domain)
#define IWMPEvents_SwitchedToPlayerApplication(This) (This)->lpVtbl->SwitchedToPlayerApplication(This)
#define IWMPEvents_SwitchedToControl(This) (This)->lpVtbl->SwitchedToControl(This)
#define IWMPEvents_PlayerDockedStateChange(This) (This)->lpVtbl->PlayerDockedStateChange(This)
#define IWMPEvents_PlayerReconnect(This) (This)->lpVtbl->PlayerReconnect(This)
#define IWMPEvents_Click(This,button,shift_state,x,y) (This)->lpVtbl->Click(This,button,shift_state,x,y)
#define IWMPEvents_DoubleClick(This,button,shift_state,fX,fY) (This)->lpVtbl->DoubleClick(This,button,shift_state,fX,fY)
#define IWMPEvents_KeyDown(This,keycode,shift_state) (This)->lpVtbl->KeyDown(This,keycode,shift_state)
#define IWMPEvents_KeyPress(This,ascii) (This)->lpVtbl->KeyPress(This,ascii)
#define IWMPEvents_KeyUp(This,keycode,shift_state) (This)->lpVtbl->KeyUp(This,keycode,shift_state)
#define IWMPEvents_MouseDown(This,button,nShiftState,x,y) (This)->lpVtbl->MouseDown(This,button,nShiftState,x,y)
#define IWMPEvents_MouseMove(This,button,shift_state,x,y) (This)->lpVtbl->MouseMove(This,button,shift_state,x,y)
#define IWMPEvents_MouseUp(This,button,shift_state,x,y) (This)->lpVtbl->MouseUp(This,button,shift_state,x,y)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IWMPEvents_QueryInterface(IWMPEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWMPEvents_AddRef(IWMPEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWMPEvents_Release(IWMPEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMPEvents methods ***/
static __WIDL_INLINE void IWMPEvents_OpenStateChange(IWMPEvents* This,LONG state) {
    This->lpVtbl->OpenStateChange(This,state);
}
static __WIDL_INLINE void IWMPEvents_PlayStateChange(IWMPEvents* This,LONG state) {
    This->lpVtbl->PlayStateChange(This,state);
}
static __WIDL_INLINE void IWMPEvents_AudioLanguageChange(IWMPEvents* This,LONG lang) {
    This->lpVtbl->AudioLanguageChange(This,lang);
}
static __WIDL_INLINE void IWMPEvents_StatusChange(IWMPEvents* This) {
    This->lpVtbl->StatusChange(This);
}
static __WIDL_INLINE void IWMPEvents_ScriptCommand(IWMPEvents* This,BSTR type,BSTR param) {
    This->lpVtbl->ScriptCommand(This,type,param);
}
static __WIDL_INLINE void IWMPEvents_NewStream(IWMPEvents* This) {
    This->lpVtbl->NewStream(This);
}
static __WIDL_INLINE void IWMPEvents_Disconnect(IWMPEvents* This,LONG result) {
    This->lpVtbl->Disconnect(This,result);
}
static __WIDL_INLINE void IWMPEvents_Buffering(IWMPEvents* This,VARIANT_BOOL start) {
    This->lpVtbl->Buffering(This,start);
}
static __WIDL_INLINE void IWMPEvents_Error(IWMPEvents* This) {
    This->lpVtbl->Error(This);
}
static __WIDL_INLINE void IWMPEvents_Warning(IWMPEvents* This,LONG warning,LONG param,BSTR description) {
    This->lpVtbl->Warning(This,warning,param,description);
}
static __WIDL_INLINE void IWMPEvents_EndOfStream(IWMPEvents* This,LONG result) {
    This->lpVtbl->EndOfStream(This,result);
}
static __WIDL_INLINE void IWMPEvents_PositionChange(IWMPEvents* This,double old_position,double new_position) {
    This->lpVtbl->PositionChange(This,old_position,new_position);
}
static __WIDL_INLINE void IWMPEvents_MarkerHit(IWMPEvents* This,LONG marker) {
    This->lpVtbl->MarkerHit(This,marker);
}
static __WIDL_INLINE void IWMPEvents_DurationUnitChange(IWMPEvents* This,LONG duration) {
    This->lpVtbl->DurationUnitChange(This,duration);
}
static __WIDL_INLINE void IWMPEvents_CdromMediaChange(IWMPEvents* This,LONG num) {
    This->lpVtbl->CdromMediaChange(This,num);
}
static __WIDL_INLINE void IWMPEvents_PlaylistChange(IWMPEvents* This,IDispatch *playlist,WMPPlaylistChangeEventType change) {
    This->lpVtbl->PlaylistChange(This,playlist,change);
}
static __WIDL_INLINE void IWMPEvents_CurrentPlaylistChange(IWMPEvents* This,WMPPlaylistChangeEventType change) {
    This->lpVtbl->CurrentPlaylistChange(This,change);
}
static __WIDL_INLINE void IWMPEvents_CurrentPlaylistItemAvailable(IWMPEvents* This,BSTR item) {
    This->lpVtbl->CurrentPlaylistItemAvailable(This,item);
}
static __WIDL_INLINE void IWMPEvents_MediaChange(IWMPEvents* This,IDispatch *item) {
    This->lpVtbl->MediaChange(This,item);
}
static __WIDL_INLINE void IWMPEvents_CurrentMediaItemAvailable(IWMPEvents* This,BSTR name) {
    This->lpVtbl->CurrentMediaItemAvailable(This,name);
}
static __WIDL_INLINE void IWMPEvents_CurrentItemChange(IWMPEvents* This,IDispatch *media) {
    This->lpVtbl->CurrentItemChange(This,media);
}
static __WIDL_INLINE void IWMPEvents_MediaCollectionChange(IWMPEvents* This) {
    This->lpVtbl->MediaCollectionChange(This);
}
static __WIDL_INLINE void IWMPEvents_MediaCollectionAttributeStringAdded(IWMPEvents* This,BSTR name,BSTR val) {
    This->lpVtbl->MediaCollectionAttributeStringAdded(This,name,val);
}
static __WIDL_INLINE void IWMPEvents_MediaCollectionAttributeStringRemoved(IWMPEvents* This,BSTR name,BSTR val) {
    This->lpVtbl->MediaCollectionAttributeStringRemoved(This,name,val);
}
static __WIDL_INLINE void IWMPEvents_MediaCollectionAttributeStringChanged(IWMPEvents* This,BSTR name,BSTR old_val,BSTR new_val) {
    This->lpVtbl->MediaCollectionAttributeStringChanged(This,name,old_val,new_val);
}
static __WIDL_INLINE void IWMPEvents_PlaylistCollectionChange(IWMPEvents* This) {
    This->lpVtbl->PlaylistCollectionChange(This);
}
static __WIDL_INLINE void IWMPEvents_PlaylistCollectionPlaylistAdded(IWMPEvents* This,BSTR name) {
    This->lpVtbl->PlaylistCollectionPlaylistAdded(This,name);
}
static __WIDL_INLINE void IWMPEvents_PlaylistCollectionPlaylistRemoved(IWMPEvents* This,BSTR name) {
    This->lpVtbl->PlaylistCollectionPlaylistRemoved(This,name);
}
static __WIDL_INLINE void IWMPEvents_PlaylistCollectionPlaylistSetAsDeleted(IWMPEvents* This,BSTR name,VARIANT_BOOL deleted) {
    This->lpVtbl->PlaylistCollectionPlaylistSetAsDeleted(This,name,deleted);
}
static __WIDL_INLINE void IWMPEvents_ModeChange(IWMPEvents* This,BSTR ModeName,VARIANT_BOOL value) {
    This->lpVtbl->ModeChange(This,ModeName,value);
}
static __WIDL_INLINE void IWMPEvents_MediaError(IWMPEvents* This,IDispatch *media) {
    This->lpVtbl->MediaError(This,media);
}
static __WIDL_INLINE void IWMPEvents_OpenPlaylistSwitch(IWMPEvents* This,IDispatch *item) {
    This->lpVtbl->OpenPlaylistSwitch(This,item);
}
static __WIDL_INLINE void IWMPEvents_DomainChange(IWMPEvents* This,BSTR domain) {
    This->lpVtbl->DomainChange(This,domain);
}
static __WIDL_INLINE void IWMPEvents_SwitchedToPlayerApplication(IWMPEvents* This) {
    This->lpVtbl->SwitchedToPlayerApplication(This);
}
static __WIDL_INLINE void IWMPEvents_SwitchedToControl(IWMPEvents* This) {
    This->lpVtbl->SwitchedToControl(This);
}
static __WIDL_INLINE void IWMPEvents_PlayerDockedStateChange(IWMPEvents* This) {
    This->lpVtbl->PlayerDockedStateChange(This);
}
static __WIDL_INLINE void IWMPEvents_PlayerReconnect(IWMPEvents* This) {
    This->lpVtbl->PlayerReconnect(This);
}
static __WIDL_INLINE void IWMPEvents_Click(IWMPEvents* This,short button,short shift_state,LONG x,LONG y) {
    This->lpVtbl->Click(This,button,shift_state,x,y);
}
static __WIDL_INLINE void IWMPEvents_DoubleClick(IWMPEvents* This,short button,short shift_state,LONG fX,LONG fY) {
    This->lpVtbl->DoubleClick(This,button,shift_state,fX,fY);
}
static __WIDL_INLINE void IWMPEvents_KeyDown(IWMPEvents* This,short keycode,short shift_state) {
    This->lpVtbl->KeyDown(This,keycode,shift_state);
}
static __WIDL_INLINE void IWMPEvents_KeyPress(IWMPEvents* This,short ascii) {
    This->lpVtbl->KeyPress(This,ascii);
}
static __WIDL_INLINE void IWMPEvents_KeyUp(IWMPEvents* This,short keycode,short shift_state) {
    This->lpVtbl->KeyUp(This,keycode,shift_state);
}
static __WIDL_INLINE void IWMPEvents_MouseDown(IWMPEvents* This,short button,short nShiftState,LONG x,LONG y) {
    This->lpVtbl->MouseDown(This,button,nShiftState,x,y);
}
static __WIDL_INLINE void IWMPEvents_MouseMove(IWMPEvents* This,short button,short shift_state,LONG x,LONG y) {
    This->lpVtbl->MouseMove(This,button,shift_state,x,y);
}
static __WIDL_INLINE void IWMPEvents_MouseUp(IWMPEvents* This,short button,short shift_state,LONG x,LONG y) {
    This->lpVtbl->MouseUp(This,button,shift_state,x,y);
}
#endif
#endif

#endif


#endif  /* __IWMPEvents_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMPEvents2 interface
 */
#ifndef __IWMPEvents2_INTERFACE_DEFINED__
#define __IWMPEvents2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMPEvents2, 0x1e7601fa, 0x47ea, 0x4107, 0x9e,0xa9, 0x90,0x04,0xed,0x96,0x84,0xff);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("1e7601fa-47ea-4107-9ea9-9004ed9684ff")
IWMPEvents2 : public IWMPEvents
{
    virtual void STDMETHODCALLTYPE DeviceConnect(
        IWMPSyncDevice *device) = 0;

    virtual void STDMETHODCALLTYPE DeviceDisconnect(
        IWMPSyncDevice *device) = 0;

    virtual void STDMETHODCALLTYPE DeviceStatusChange(
        IWMPSyncDevice *device,
        WMPDeviceStatus status) = 0;

    virtual void STDMETHODCALLTYPE DeviceSyncStateChange(
        IWMPSyncDevice *device,
        WMPSyncState state) = 0;

    virtual void STDMETHODCALLTYPE DeviceSyncError(
        IWMPSyncDevice *device,
        IDispatch *media) = 0;

    virtual void STDMETHODCALLTYPE CreatePartnershipComplete(
        IWMPSyncDevice *device,
        HRESULT result) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMPEvents2, 0x1e7601fa, 0x47ea, 0x4107, 0x9e,0xa9, 0x90,0x04,0xed,0x96,0x84,0xff)
#endif
#else
typedef struct IWMPEvents2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMPEvents methods ***/
    void (STDMETHODCALLTYPE *OpenStateChange)(
        IWMPEvents2 *This,
        LONG state);

    void (STDMETHODCALLTYPE *PlayStateChange)(
        IWMPEvents2 *This,
        LONG state);

    void (STDMETHODCALLTYPE *AudioLanguageChange)(
        IWMPEvents2 *This,
        LONG lang);

    void (STDMETHODCALLTYPE *StatusChange)(
        IWMPEvents2 *This);

    void (STDMETHODCALLTYPE *ScriptCommand)(
        IWMPEvents2 *This,
        BSTR type,
        BSTR param);

    void (STDMETHODCALLTYPE *NewStream)(
        IWMPEvents2 *This);

    void (STDMETHODCALLTYPE *Disconnect)(
        IWMPEvents2 *This,
        LONG result);

    void (STDMETHODCALLTYPE *Buffering)(
        IWMPEvents2 *This,
        VARIANT_BOOL start);

    void (STDMETHODCALLTYPE *Error)(
        IWMPEvents2 *This);

    void (STDMETHODCALLTYPE *Warning)(
        IWMPEvents2 *This,
        LONG warning,
        LONG param,
        BSTR description);

    void (STDMETHODCALLTYPE *EndOfStream)(
        IWMPEvents2 *This,
        LONG result);

    void (STDMETHODCALLTYPE *PositionChange)(
        IWMPEvents2 *This,
        double old_position,
        double new_position);

    void (STDMETHODCALLTYPE *MarkerHit)(
        IWMPEvents2 *This,
        LONG marker);

    void (STDMETHODCALLTYPE *DurationUnitChange)(
        IWMPEvents2 *This,
        LONG duration);

    void (STDMETHODCALLTYPE *CdromMediaChange)(
        IWMPEvents2 *This,
        LONG num);

    void (STDMETHODCALLTYPE *PlaylistChange)(
        IWMPEvents2 *This,
        IDispatch *playlist,
        WMPPlaylistChangeEventType change);

    void (STDMETHODCALLTYPE *CurrentPlaylistChange)(
        IWMPEvents2 *This,
        WMPPlaylistChangeEventType change);

    void (STDMETHODCALLTYPE *CurrentPlaylistItemAvailable)(
        IWMPEvents2 *This,
        BSTR item);

    void (STDMETHODCALLTYPE *MediaChange)(
        IWMPEvents2 *This,
        IDispatch *item);

    void (STDMETHODCALLTYPE *CurrentMediaItemAvailable)(
        IWMPEvents2 *This,
        BSTR name);

    void (STDMETHODCALLTYPE *CurrentItemChange)(
        IWMPEvents2 *This,
        IDispatch *media);

    void (STDMETHODCALLTYPE *MediaCollectionChange)(
        IWMPEvents2 *This);

    void (STDMETHODCALLTYPE *MediaCollectionAttributeStringAdded)(
        IWMPEvents2 *This,
        BSTR name,
        BSTR val);

    void (STDMETHODCALLTYPE *MediaCollectionAttributeStringRemoved)(
        IWMPEvents2 *This,
        BSTR name,
        BSTR val);

    void (STDMETHODCALLTYPE *MediaCollectionAttributeStringChanged)(
        IWMPEvents2 *This,
        BSTR name,
        BSTR old_val,
        BSTR new_val);

    void (STDMETHODCALLTYPE *PlaylistCollectionChange)(
        IWMPEvents2 *This);

    void (STDMETHODCALLTYPE *PlaylistCollectionPlaylistAdded)(
        IWMPEvents2 *This,
        BSTR name);

    void (STDMETHODCALLTYPE *PlaylistCollectionPlaylistRemoved)(
        IWMPEvents2 *This,
        BSTR name);

    void (STDMETHODCALLTYPE *PlaylistCollectionPlaylistSetAsDeleted)(
        IWMPEvents2 *This,
        BSTR name,
        VARIANT_BOOL deleted);

    void (STDMETHODCALLTYPE *ModeChange)(
        IWMPEvents2 *This,
        BSTR ModeName,
        VARIANT_BOOL value);

    void (STDMETHODCALLTYPE *MediaError)(
        IWMPEvents2 *This,
        IDispatch *media);

    void (STDMETHODCALLTYPE *OpenPlaylistSwitch)(
        IWMPEvents2 *This,
        IDispatch *item);

    void (STDMETHODCALLTYPE *DomainChange)(
        IWMPEvents2 *This,
        BSTR domain);

    void (STDMETHODCALLTYPE *SwitchedToPlayerApplication)(
        IWMPEvents2 *This);

    void (STDMETHODCALLTYPE *SwitchedToControl)(
        IWMPEvents2 *This);

    void (STDMETHODCALLTYPE *PlayerDockedStateChange)(
        IWMPEvents2 *This);

    void (STDMETHODCALLTYPE *PlayerReconnect)(
        IWMPEvents2 *This);

    void (STDMETHODCALLTYPE *Click)(
        IWMPEvents2 *This,
        short button,
        short shift_state,
        LONG x,
        LONG y);

    void (STDMETHODCALLTYPE *DoubleClick)(
        IWMPEvents2 *This,
        short button,
        short shift_state,
        LONG fX,
        LONG fY);

    void (STDMETHODCALLTYPE *KeyDown)(
        IWMPEvents2 *This,
        short keycode,
        short shift_state);

    void (STDMETHODCALLTYPE *KeyPress)(
        IWMPEvents2 *This,
        short ascii);

    void (STDMETHODCALLTYPE *KeyUp)(
        IWMPEvents2 *This,
        short keycode,
        short shift_state);

    void (STDMETHODCALLTYPE *MouseDown)(
        IWMPEvents2 *This,
        short button,
        short nShiftState,
        LONG x,
        LONG y);

    void (STDMETHODCALLTYPE *MouseMove)(
        IWMPEvents2 *This,
        short button,
        short shift_state,
        LONG x,
        LONG y);

    void (STDMETHODCALLTYPE *MouseUp)(
        IWMPEvents2 *This,
        short button,
        short shift_state,
        LONG x,
        LONG y);

    /*** IWMPEvents2 methods ***/
    void (STDMETHODCALLTYPE *DeviceConnect)(
        IWMPEvents2 *This,
        IWMPSyncDevice *device);

    void (STDMETHODCALLTYPE *DeviceDisconnect)(
        IWMPEvents2 *This,
        IWMPSyncDevice *device);

    void (STDMETHODCALLTYPE *DeviceStatusChange)(
        IWMPEvents2 *This,
        IWMPSyncDevice *device,
        WMPDeviceStatus status);

    void (STDMETHODCALLTYPE *DeviceSyncStateChange)(
        IWMPEvents2 *This,
        IWMPSyncDevice *device,
        WMPSyncState state);

    void (STDMETHODCALLTYPE *DeviceSyncError)(
        IWMPEvents2 *This,
        IWMPSyncDevice *device,
        IDispatch *media);

    void (STDMETHODCALLTYPE *CreatePartnershipComplete)(
        IWMPEvents2 *This,
        IWMPSyncDevice *device,
        HRESULT result);

    END_INTERFACE
} IWMPEvents2Vtbl;

interface IWMPEvents2 {
    CONST_VTBL IWMPEvents2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMPEvents2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMPEvents2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMPEvents2_Release(This) (This)->lpVtbl->Release(This)
/*** IWMPEvents methods ***/
#define IWMPEvents2_OpenStateChange(This,state) (This)->lpVtbl->OpenStateChange(This,state)
#define IWMPEvents2_PlayStateChange(This,state) (This)->lpVtbl->PlayStateChange(This,state)
#define IWMPEvents2_AudioLanguageChange(This,lang) (This)->lpVtbl->AudioLanguageChange(This,lang)
#define IWMPEvents2_StatusChange(This) (This)->lpVtbl->StatusChange(This)
#define IWMPEvents2_ScriptCommand(This,type,param) (This)->lpVtbl->ScriptCommand(This,type,param)
#define IWMPEvents2_NewStream(This) (This)->lpVtbl->NewStream(This)
#define IWMPEvents2_Disconnect(This,result) (This)->lpVtbl->Disconnect(This,result)
#define IWMPEvents2_Buffering(This,start) (This)->lpVtbl->Buffering(This,start)
#define IWMPEvents2_Error(This) (This)->lpVtbl->Error(This)
#define IWMPEvents2_Warning(This,warning,param,description) (This)->lpVtbl->Warning(This,warning,param,description)
#define IWMPEvents2_EndOfStream(This,result) (This)->lpVtbl->EndOfStream(This,result)
#define IWMPEvents2_PositionChange(This,old_position,new_position) (This)->lpVtbl->PositionChange(This,old_position,new_position)
#define IWMPEvents2_MarkerHit(This,marker) (This)->lpVtbl->MarkerHit(This,marker)
#define IWMPEvents2_DurationUnitChange(This,duration) (This)->lpVtbl->DurationUnitChange(This,duration)
#define IWMPEvents2_CdromMediaChange(This,num) (This)->lpVtbl->CdromMediaChange(This,num)
#define IWMPEvents2_PlaylistChange(This,playlist,change) (This)->lpVtbl->PlaylistChange(This,playlist,change)
#define IWMPEvents2_CurrentPlaylistChange(This,change) (This)->lpVtbl->CurrentPlaylistChange(This,change)
#define IWMPEvents2_CurrentPlaylistItemAvailable(This,item) (This)->lpVtbl->CurrentPlaylistItemAvailable(This,item)
#define IWMPEvents2_MediaChange(This,item) (This)->lpVtbl->MediaChange(This,item)
#define IWMPEvents2_CurrentMediaItemAvailable(This,name) (This)->lpVtbl->CurrentMediaItemAvailable(This,name)
#define IWMPEvents2_CurrentItemChange(This,media) (This)->lpVtbl->CurrentItemChange(This,media)
#define IWMPEvents2_MediaCollectionChange(This) (This)->lpVtbl->MediaCollectionChange(This)
#define IWMPEvents2_MediaCollectionAttributeStringAdded(This,name,val) (This)->lpVtbl->MediaCollectionAttributeStringAdded(This,name,val)
#define IWMPEvents2_MediaCollectionAttributeStringRemoved(This,name,val) (This)->lpVtbl->MediaCollectionAttributeStringRemoved(This,name,val)
#define IWMPEvents2_MediaCollectionAttributeStringChanged(This,name,old_val,new_val) (This)->lpVtbl->MediaCollectionAttributeStringChanged(This,name,old_val,new_val)
#define IWMPEvents2_PlaylistCollectionChange(This) (This)->lpVtbl->PlaylistCollectionChange(This)
#define IWMPEvents2_PlaylistCollectionPlaylistAdded(This,name) (This)->lpVtbl->PlaylistCollectionPlaylistAdded(This,name)
#define IWMPEvents2_PlaylistCollectionPlaylistRemoved(This,name) (This)->lpVtbl->PlaylistCollectionPlaylistRemoved(This,name)
#define IWMPEvents2_PlaylistCollectionPlaylistSetAsDeleted(This,name,deleted) (This)->lpVtbl->PlaylistCollectionPlaylistSetAsDeleted(This,name,deleted)
#define IWMPEvents2_ModeChange(This,ModeName,value) (This)->lpVtbl->ModeChange(This,ModeName,value)
#define IWMPEvents2_MediaError(This,media) (This)->lpVtbl->MediaError(This,media)
#define IWMPEvents2_OpenPlaylistSwitch(This,item) (This)->lpVtbl->OpenPlaylistSwitch(This,item)
#define IWMPEvents2_DomainChange(This,domain) (This)->lpVtbl->DomainChange(This,domain)
#define IWMPEvents2_SwitchedToPlayerApplication(This) (This)->lpVtbl->SwitchedToPlayerApplication(This)
#define IWMPEvents2_SwitchedToControl(This) (This)->lpVtbl->SwitchedToControl(This)
#define IWMPEvents2_PlayerDockedStateChange(This) (This)->lpVtbl->PlayerDockedStateChange(This)
#define IWMPEvents2_PlayerReconnect(This) (This)->lpVtbl->PlayerReconnect(This)
#define IWMPEvents2_Click(This,button,shift_state,x,y) (This)->lpVtbl->Click(This,button,shift_state,x,y)
#define IWMPEvents2_DoubleClick(This,button,shift_state,fX,fY) (This)->lpVtbl->DoubleClick(This,button,shift_state,fX,fY)
#define IWMPEvents2_KeyDown(This,keycode,shift_state) (This)->lpVtbl->KeyDown(This,keycode,shift_state)
#define IWMPEvents2_KeyPress(This,ascii) (This)->lpVtbl->KeyPress(This,ascii)
#define IWMPEvents2_KeyUp(This,keycode,shift_state) (This)->lpVtbl->KeyUp(This,keycode,shift_state)
#define IWMPEvents2_MouseDown(This,button,nShiftState,x,y) (This)->lpVtbl->MouseDown(This,button,nShiftState,x,y)
#define IWMPEvents2_MouseMove(This,button,shift_state,x,y) (This)->lpVtbl->MouseMove(This,button,shift_state,x,y)
#define IWMPEvents2_MouseUp(This,button,shift_state,x,y) (This)->lpVtbl->MouseUp(This,button,shift_state,x,y)
/*** IWMPEvents2 methods ***/
#define IWMPEvents2_DeviceConnect(This,device) (This)->lpVtbl->DeviceConnect(This,device)
#define IWMPEvents2_DeviceDisconnect(This,device) (This)->lpVtbl->DeviceDisconnect(This,device)
#define IWMPEvents2_DeviceStatusChange(This,device,status) (This)->lpVtbl->DeviceStatusChange(This,device,status)
#define IWMPEvents2_DeviceSyncStateChange(This,device,state) (This)->lpVtbl->DeviceSyncStateChange(This,device,state)
#define IWMPEvents2_DeviceSyncError(This,device,media) (This)->lpVtbl->DeviceSyncError(This,device,media)
#define IWMPEvents2_CreatePartnershipComplete(This,device,result) (This)->lpVtbl->CreatePartnershipComplete(This,device,result)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IWMPEvents2_QueryInterface(IWMPEvents2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWMPEvents2_AddRef(IWMPEvents2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWMPEvents2_Release(IWMPEvents2* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMPEvents methods ***/
static __WIDL_INLINE void IWMPEvents2_OpenStateChange(IWMPEvents2* This,LONG state) {
    This->lpVtbl->OpenStateChange(This,state);
}
static __WIDL_INLINE void IWMPEvents2_PlayStateChange(IWMPEvents2* This,LONG state) {
    This->lpVtbl->PlayStateChange(This,state);
}
static __WIDL_INLINE void IWMPEvents2_AudioLanguageChange(IWMPEvents2* This,LONG lang) {
    This->lpVtbl->AudioLanguageChange(This,lang);
}
static __WIDL_INLINE void IWMPEvents2_StatusChange(IWMPEvents2* This) {
    This->lpVtbl->StatusChange(This);
}
static __WIDL_INLINE void IWMPEvents2_ScriptCommand(IWMPEvents2* This,BSTR type,BSTR param) {
    This->lpVtbl->ScriptCommand(This,type,param);
}
static __WIDL_INLINE void IWMPEvents2_NewStream(IWMPEvents2* This) {
    This->lpVtbl->NewStream(This);
}
static __WIDL_INLINE void IWMPEvents2_Disconnect(IWMPEvents2* This,LONG result) {
    This->lpVtbl->Disconnect(This,result);
}
static __WIDL_INLINE void IWMPEvents2_Buffering(IWMPEvents2* This,VARIANT_BOOL start) {
    This->lpVtbl->Buffering(This,start);
}
static __WIDL_INLINE void IWMPEvents2_Error(IWMPEvents2* This) {
    This->lpVtbl->Error(This);
}
static __WIDL_INLINE void IWMPEvents2_Warning(IWMPEvents2* This,LONG warning,LONG param,BSTR description) {
    This->lpVtbl->Warning(This,warning,param,description);
}
static __WIDL_INLINE void IWMPEvents2_EndOfStream(IWMPEvents2* This,LONG result) {
    This->lpVtbl->EndOfStream(This,result);
}
static __WIDL_INLINE void IWMPEvents2_PositionChange(IWMPEvents2* This,double old_position,double new_position) {
    This->lpVtbl->PositionChange(This,old_position,new_position);
}
static __WIDL_INLINE void IWMPEvents2_MarkerHit(IWMPEvents2* This,LONG marker) {
    This->lpVtbl->MarkerHit(This,marker);
}
static __WIDL_INLINE void IWMPEvents2_DurationUnitChange(IWMPEvents2* This,LONG duration) {
    This->lpVtbl->DurationUnitChange(This,duration);
}
static __WIDL_INLINE void IWMPEvents2_CdromMediaChange(IWMPEvents2* This,LONG num) {
    This->lpVtbl->CdromMediaChange(This,num);
}
static __WIDL_INLINE void IWMPEvents2_PlaylistChange(IWMPEvents2* This,IDispatch *playlist,WMPPlaylistChangeEventType change) {
    This->lpVtbl->PlaylistChange(This,playlist,change);
}
static __WIDL_INLINE void IWMPEvents2_CurrentPlaylistChange(IWMPEvents2* This,WMPPlaylistChangeEventType change) {
    This->lpVtbl->CurrentPlaylistChange(This,change);
}
static __WIDL_INLINE void IWMPEvents2_CurrentPlaylistItemAvailable(IWMPEvents2* This,BSTR item) {
    This->lpVtbl->CurrentPlaylistItemAvailable(This,item);
}
static __WIDL_INLINE void IWMPEvents2_MediaChange(IWMPEvents2* This,IDispatch *item) {
    This->lpVtbl->MediaChange(This,item);
}
static __WIDL_INLINE void IWMPEvents2_CurrentMediaItemAvailable(IWMPEvents2* This,BSTR name) {
    This->lpVtbl->CurrentMediaItemAvailable(This,name);
}
static __WIDL_INLINE void IWMPEvents2_CurrentItemChange(IWMPEvents2* This,IDispatch *media) {
    This->lpVtbl->CurrentItemChange(This,media);
}
static __WIDL_INLINE void IWMPEvents2_MediaCollectionChange(IWMPEvents2* This) {
    This->lpVtbl->MediaCollectionChange(This);
}
static __WIDL_INLINE void IWMPEvents2_MediaCollectionAttributeStringAdded(IWMPEvents2* This,BSTR name,BSTR val) {
    This->lpVtbl->MediaCollectionAttributeStringAdded(This,name,val);
}
static __WIDL_INLINE void IWMPEvents2_MediaCollectionAttributeStringRemoved(IWMPEvents2* This,BSTR name,BSTR val) {
    This->lpVtbl->MediaCollectionAttributeStringRemoved(This,name,val);
}
static __WIDL_INLINE void IWMPEvents2_MediaCollectionAttributeStringChanged(IWMPEvents2* This,BSTR name,BSTR old_val,BSTR new_val) {
    This->lpVtbl->MediaCollectionAttributeStringChanged(This,name,old_val,new_val);
}
static __WIDL_INLINE void IWMPEvents2_PlaylistCollectionChange(IWMPEvents2* This) {
    This->lpVtbl->PlaylistCollectionChange(This);
}
static __WIDL_INLINE void IWMPEvents2_PlaylistCollectionPlaylistAdded(IWMPEvents2* This,BSTR name) {
    This->lpVtbl->PlaylistCollectionPlaylistAdded(This,name);
}
static __WIDL_INLINE void IWMPEvents2_PlaylistCollectionPlaylistRemoved(IWMPEvents2* This,BSTR name) {
    This->lpVtbl->PlaylistCollectionPlaylistRemoved(This,name);
}
static __WIDL_INLINE void IWMPEvents2_PlaylistCollectionPlaylistSetAsDeleted(IWMPEvents2* This,BSTR name,VARIANT_BOOL deleted) {
    This->lpVtbl->PlaylistCollectionPlaylistSetAsDeleted(This,name,deleted);
}
static __WIDL_INLINE void IWMPEvents2_ModeChange(IWMPEvents2* This,BSTR ModeName,VARIANT_BOOL value) {
    This->lpVtbl->ModeChange(This,ModeName,value);
}
static __WIDL_INLINE void IWMPEvents2_MediaError(IWMPEvents2* This,IDispatch *media) {
    This->lpVtbl->MediaError(This,media);
}
static __WIDL_INLINE void IWMPEvents2_OpenPlaylistSwitch(IWMPEvents2* This,IDispatch *item) {
    This->lpVtbl->OpenPlaylistSwitch(This,item);
}
static __WIDL_INLINE void IWMPEvents2_DomainChange(IWMPEvents2* This,BSTR domain) {
    This->lpVtbl->DomainChange(This,domain);
}
static __WIDL_INLINE void IWMPEvents2_SwitchedToPlayerApplication(IWMPEvents2* This) {
    This->lpVtbl->SwitchedToPlayerApplication(This);
}
static __WIDL_INLINE void IWMPEvents2_SwitchedToControl(IWMPEvents2* This) {
    This->lpVtbl->SwitchedToControl(This);
}
static __WIDL_INLINE void IWMPEvents2_PlayerDockedStateChange(IWMPEvents2* This) {
    This->lpVtbl->PlayerDockedStateChange(This);
}
static __WIDL_INLINE void IWMPEvents2_PlayerReconnect(IWMPEvents2* This) {
    This->lpVtbl->PlayerReconnect(This);
}
static __WIDL_INLINE void IWMPEvents2_Click(IWMPEvents2* This,short button,short shift_state,LONG x,LONG y) {
    This->lpVtbl->Click(This,button,shift_state,x,y);
}
static __WIDL_INLINE void IWMPEvents2_DoubleClick(IWMPEvents2* This,short button,short shift_state,LONG fX,LONG fY) {
    This->lpVtbl->DoubleClick(This,button,shift_state,fX,fY);
}
static __WIDL_INLINE void IWMPEvents2_KeyDown(IWMPEvents2* This,short keycode,short shift_state) {
    This->lpVtbl->KeyDown(This,keycode,shift_state);
}
static __WIDL_INLINE void IWMPEvents2_KeyPress(IWMPEvents2* This,short ascii) {
    This->lpVtbl->KeyPress(This,ascii);
}
static __WIDL_INLINE void IWMPEvents2_KeyUp(IWMPEvents2* This,short keycode,short shift_state) {
    This->lpVtbl->KeyUp(This,keycode,shift_state);
}
static __WIDL_INLINE void IWMPEvents2_MouseDown(IWMPEvents2* This,short button,short nShiftState,LONG x,LONG y) {
    This->lpVtbl->MouseDown(This,button,nShiftState,x,y);
}
static __WIDL_INLINE void IWMPEvents2_MouseMove(IWMPEvents2* This,short button,short shift_state,LONG x,LONG y) {
    This->lpVtbl->MouseMove(This,button,shift_state,x,y);
}
static __WIDL_INLINE void IWMPEvents2_MouseUp(IWMPEvents2* This,short button,short shift_state,LONG x,LONG y) {
    This->lpVtbl->MouseUp(This,button,shift_state,x,y);
}
/*** IWMPEvents2 methods ***/
static __WIDL_INLINE void IWMPEvents2_DeviceConnect(IWMPEvents2* This,IWMPSyncDevice *device) {
    This->lpVtbl->DeviceConnect(This,device);
}
static __WIDL_INLINE void IWMPEvents2_DeviceDisconnect(IWMPEvents2* This,IWMPSyncDevice *device) {
    This->lpVtbl->DeviceDisconnect(This,device);
}
static __WIDL_INLINE void IWMPEvents2_DeviceStatusChange(IWMPEvents2* This,IWMPSyncDevice *device,WMPDeviceStatus status) {
    This->lpVtbl->DeviceStatusChange(This,device,status);
}
static __WIDL_INLINE void IWMPEvents2_DeviceSyncStateChange(IWMPEvents2* This,IWMPSyncDevice *device,WMPSyncState state) {
    This->lpVtbl->DeviceSyncStateChange(This,device,state);
}
static __WIDL_INLINE void IWMPEvents2_DeviceSyncError(IWMPEvents2* This,IWMPSyncDevice *device,IDispatch *media) {
    This->lpVtbl->DeviceSyncError(This,device,media);
}
static __WIDL_INLINE void IWMPEvents2_CreatePartnershipComplete(IWMPEvents2* This,IWMPSyncDevice *device,HRESULT result) {
    This->lpVtbl->CreatePartnershipComplete(This,device,result);
}
#endif
#endif

#endif


#endif  /* __IWMPEvents2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMPEvents3 interface
 */
#ifndef __IWMPEvents3_INTERFACE_DEFINED__
#define __IWMPEvents3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMPEvents3, 0x1f504270, 0xa66b, 0x4223, 0x8e,0x96, 0x26,0xa0,0x6c,0x63,0xd6,0x9f);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("1f504270-a66b-4223-8e96-26a06c63d69f")
IWMPEvents3 : public IWMPEvents2
{
    virtual void STDMETHODCALLTYPE CdromRipStateChange(
        IWMPCdromRip *rip,
        WMPRipState state) = 0;

    virtual void STDMETHODCALLTYPE CdromRipMediaError(
        IWMPCdromRip *rip,
        IDispatch *media) = 0;

    virtual void STDMETHODCALLTYPE CdromBurnStateChange(
        IWMPCdromBurn *burn,
        WMPBurnState state) = 0;

    virtual void STDMETHODCALLTYPE CdromBurnMediaError(
        IWMPCdromBurn *burn,
        IDispatch *media) = 0;

    virtual void STDMETHODCALLTYPE CdromBurnError(
        IWMPCdromBurn *burn,
        HRESULT error) = 0;

    virtual void STDMETHODCALLTYPE LibraryConnect(
        IWMPLibrary *wmplibrary) = 0;

    virtual void STDMETHODCALLTYPE LibraryDisconnect(
        IWMPLibrary *wmplibrary) = 0;

    virtual void STDMETHODCALLTYPE FolderScanStateChange(
        WMPFolderScanState state) = 0;

    virtual void STDMETHODCALLTYPE StringCollectionChange(
        IDispatch *collection,
        WMPStringCollectionChangeEventType change,
        LONG index) = 0;

    virtual void STDMETHODCALLTYPE MediaCollectionMediaAdded(
        IDispatch *media) = 0;

    virtual void STDMETHODCALLTYPE MediaCollectionMediaRemoved(
        IDispatch *media) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMPEvents3, 0x1f504270, 0xa66b, 0x4223, 0x8e,0x96, 0x26,0xa0,0x6c,0x63,0xd6,0x9f)
#endif
#else
typedef struct IWMPEvents3Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMPEvents methods ***/
    void (STDMETHODCALLTYPE *OpenStateChange)(
        IWMPEvents3 *This,
        LONG state);

    void (STDMETHODCALLTYPE *PlayStateChange)(
        IWMPEvents3 *This,
        LONG state);

    void (STDMETHODCALLTYPE *AudioLanguageChange)(
        IWMPEvents3 *This,
        LONG lang);

    void (STDMETHODCALLTYPE *StatusChange)(
        IWMPEvents3 *This);

    void (STDMETHODCALLTYPE *ScriptCommand)(
        IWMPEvents3 *This,
        BSTR type,
        BSTR param);

    void (STDMETHODCALLTYPE *NewStream)(
        IWMPEvents3 *This);

    void (STDMETHODCALLTYPE *Disconnect)(
        IWMPEvents3 *This,
        LONG result);

    void (STDMETHODCALLTYPE *Buffering)(
        IWMPEvents3 *This,
        VARIANT_BOOL start);

    void (STDMETHODCALLTYPE *Error)(
        IWMPEvents3 *This);

    void (STDMETHODCALLTYPE *Warning)(
        IWMPEvents3 *This,
        LONG warning,
        LONG param,
        BSTR description);

    void (STDMETHODCALLTYPE *EndOfStream)(
        IWMPEvents3 *This,
        LONG result);

    void (STDMETHODCALLTYPE *PositionChange)(
        IWMPEvents3 *This,
        double old_position,
        double new_position);

    void (STDMETHODCALLTYPE *MarkerHit)(
        IWMPEvents3 *This,
        LONG marker);

    void (STDMETHODCALLTYPE *DurationUnitChange)(
        IWMPEvents3 *This,
        LONG duration);

    void (STDMETHODCALLTYPE *CdromMediaChange)(
        IWMPEvents3 *This,
        LONG num);

    void (STDMETHODCALLTYPE *PlaylistChange)(
        IWMPEvents3 *This,
        IDispatch *playlist,
        WMPPlaylistChangeEventType change);

    void (STDMETHODCALLTYPE *CurrentPlaylistChange)(
        IWMPEvents3 *This,
        WMPPlaylistChangeEventType change);

    void (STDMETHODCALLTYPE *CurrentPlaylistItemAvailable)(
        IWMPEvents3 *This,
        BSTR item);

    void (STDMETHODCALLTYPE *MediaChange)(
        IWMPEvents3 *This,
        IDispatch *item);

    void (STDMETHODCALLTYPE *CurrentMediaItemAvailable)(
        IWMPEvents3 *This,
        BSTR name);

    void (STDMETHODCALLTYPE *CurrentItemChange)(
        IWMPEvents3 *This,
        IDispatch *media);

    void (STDMETHODCALLTYPE *MediaCollectionChange)(
        IWMPEvents3 *This);

    void (STDMETHODCALLTYPE *MediaCollectionAttributeStringAdded)(
        IWMPEvents3 *This,
        BSTR name,
        BSTR val);

    void (STDMETHODCALLTYPE *MediaCollectionAttributeStringRemoved)(
        IWMPEvents3 *This,
        BSTR name,
        BSTR val);

    void (STDMETHODCALLTYPE *MediaCollectionAttributeStringChanged)(
        IWMPEvents3 *This,
        BSTR name,
        BSTR old_val,
        BSTR new_val);

    void (STDMETHODCALLTYPE *PlaylistCollectionChange)(
        IWMPEvents3 *This);

    void (STDMETHODCALLTYPE *PlaylistCollectionPlaylistAdded)(
        IWMPEvents3 *This,
        BSTR name);

    void (STDMETHODCALLTYPE *PlaylistCollectionPlaylistRemoved)(
        IWMPEvents3 *This,
        BSTR name);

    void (STDMETHODCALLTYPE *PlaylistCollectionPlaylistSetAsDeleted)(
        IWMPEvents3 *This,
        BSTR name,
        VARIANT_BOOL deleted);

    void (STDMETHODCALLTYPE *ModeChange)(
        IWMPEvents3 *This,
        BSTR ModeName,
        VARIANT_BOOL value);

    void (STDMETHODCALLTYPE *MediaError)(
        IWMPEvents3 *This,
        IDispatch *media);

    void (STDMETHODCALLTYPE *OpenPlaylistSwitch)(
        IWMPEvents3 *This,
        IDispatch *item);

    void (STDMETHODCALLTYPE *DomainChange)(
        IWMPEvents3 *This,
        BSTR domain);

    void (STDMETHODCALLTYPE *SwitchedToPlayerApplication)(
        IWMPEvents3 *This);

    void (STDMETHODCALLTYPE *SwitchedToControl)(
        IWMPEvents3 *This);

    void (STDMETHODCALLTYPE *PlayerDockedStateChange)(
        IWMPEvents3 *This);

    void (STDMETHODCALLTYPE *PlayerReconnect)(
        IWMPEvents3 *This);

    void (STDMETHODCALLTYPE *Click)(
        IWMPEvents3 *This,
        short button,
        short shift_state,
        LONG x,
        LONG y);

    void (STDMETHODCALLTYPE *DoubleClick)(
        IWMPEvents3 *This,
        short button,
        short shift_state,
        LONG fX,
        LONG fY);

    void (STDMETHODCALLTYPE *KeyDown)(
        IWMPEvents3 *This,
        short keycode,
        short shift_state);

    void (STDMETHODCALLTYPE *KeyPress)(
        IWMPEvents3 *This,
        short ascii);

    void (STDMETHODCALLTYPE *KeyUp)(
        IWMPEvents3 *This,
        short keycode,
        short shift_state);

    void (STDMETHODCALLTYPE *MouseDown)(
        IWMPEvents3 *This,
        short button,
        short nShiftState,
        LONG x,
        LONG y);

    void (STDMETHODCALLTYPE *MouseMove)(
        IWMPEvents3 *This,
        short button,
        short shift_state,
        LONG x,
        LONG y);

    void (STDMETHODCALLTYPE *MouseUp)(
        IWMPEvents3 *This,
        short button,
        short shift_state,
        LONG x,
        LONG y);

    /*** IWMPEvents2 methods ***/
    void (STDMETHODCALLTYPE *DeviceConnect)(
        IWMPEvents3 *This,
        IWMPSyncDevice *device);

    void (STDMETHODCALLTYPE *DeviceDisconnect)(
        IWMPEvents3 *This,
        IWMPSyncDevice *device);

    void (STDMETHODCALLTYPE *DeviceStatusChange)(
        IWMPEvents3 *This,
        IWMPSyncDevice *device,
        WMPDeviceStatus status);

    void (STDMETHODCALLTYPE *DeviceSyncStateChange)(
        IWMPEvents3 *This,
        IWMPSyncDevice *device,
        WMPSyncState state);

    void (STDMETHODCALLTYPE *DeviceSyncError)(
        IWMPEvents3 *This,
        IWMPSyncDevice *device,
        IDispatch *media);

    void (STDMETHODCALLTYPE *CreatePartnershipComplete)(
        IWMPEvents3 *This,
        IWMPSyncDevice *device,
        HRESULT result);

    /*** IWMPEvents3 methods ***/
    void (STDMETHODCALLTYPE *CdromRipStateChange)(
        IWMPEvents3 *This,
        IWMPCdromRip *rip,
        WMPRipState state);

    void (STDMETHODCALLTYPE *CdromRipMediaError)(
        IWMPEvents3 *This,
        IWMPCdromRip *rip,
        IDispatch *media);

    void (STDMETHODCALLTYPE *CdromBurnStateChange)(
        IWMPEvents3 *This,
        IWMPCdromBurn *burn,
        WMPBurnState state);

    void (STDMETHODCALLTYPE *CdromBurnMediaError)(
        IWMPEvents3 *This,
        IWMPCdromBurn *burn,
        IDispatch *media);

    void (STDMETHODCALLTYPE *CdromBurnError)(
        IWMPEvents3 *This,
        IWMPCdromBurn *burn,
        HRESULT error);

    void (STDMETHODCALLTYPE *LibraryConnect)(
        IWMPEvents3 *This,
        IWMPLibrary *wmplibrary);

    void (STDMETHODCALLTYPE *LibraryDisconnect)(
        IWMPEvents3 *This,
        IWMPLibrary *wmplibrary);

    void (STDMETHODCALLTYPE *FolderScanStateChange)(
        IWMPEvents3 *This,
        WMPFolderScanState state);

    void (STDMETHODCALLTYPE *StringCollectionChange)(
        IWMPEvents3 *This,
        IDispatch *collection,
        WMPStringCollectionChangeEventType change,
        LONG index);

    void (STDMETHODCALLTYPE *MediaCollectionMediaAdded)(
        IWMPEvents3 *This,
        IDispatch *media);

    void (STDMETHODCALLTYPE *MediaCollectionMediaRemoved)(
        IWMPEvents3 *This,
        IDispatch *media);

    END_INTERFACE
} IWMPEvents3Vtbl;

interface IWMPEvents3 {
    CONST_VTBL IWMPEvents3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMPEvents3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMPEvents3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMPEvents3_Release(This) (This)->lpVtbl->Release(This)
/*** IWMPEvents methods ***/
#define IWMPEvents3_OpenStateChange(This,state) (This)->lpVtbl->OpenStateChange(This,state)
#define IWMPEvents3_PlayStateChange(This,state) (This)->lpVtbl->PlayStateChange(This,state)
#define IWMPEvents3_AudioLanguageChange(This,lang) (This)->lpVtbl->AudioLanguageChange(This,lang)
#define IWMPEvents3_StatusChange(This) (This)->lpVtbl->StatusChange(This)
#define IWMPEvents3_ScriptCommand(This,type,param) (This)->lpVtbl->ScriptCommand(This,type,param)
#define IWMPEvents3_NewStream(This) (This)->lpVtbl->NewStream(This)
#define IWMPEvents3_Disconnect(This,result) (This)->lpVtbl->Disconnect(This,result)
#define IWMPEvents3_Buffering(This,start) (This)->lpVtbl->Buffering(This,start)
#define IWMPEvents3_Error(This) (This)->lpVtbl->Error(This)
#define IWMPEvents3_Warning(This,warning,param,description) (This)->lpVtbl->Warning(This,warning,param,description)
#define IWMPEvents3_EndOfStream(This,result) (This)->lpVtbl->EndOfStream(This,result)
#define IWMPEvents3_PositionChange(This,old_position,new_position) (This)->lpVtbl->PositionChange(This,old_position,new_position)
#define IWMPEvents3_MarkerHit(This,marker) (This)->lpVtbl->MarkerHit(This,marker)
#define IWMPEvents3_DurationUnitChange(This,duration) (This)->lpVtbl->DurationUnitChange(This,duration)
#define IWMPEvents3_CdromMediaChange(This,num) (This)->lpVtbl->CdromMediaChange(This,num)
#define IWMPEvents3_PlaylistChange(This,playlist,change) (This)->lpVtbl->PlaylistChange(This,playlist,change)
#define IWMPEvents3_CurrentPlaylistChange(This,change) (This)->lpVtbl->CurrentPlaylistChange(This,change)
#define IWMPEvents3_CurrentPlaylistItemAvailable(This,item) (This)->lpVtbl->CurrentPlaylistItemAvailable(This,item)
#define IWMPEvents3_MediaChange(This,item) (This)->lpVtbl->MediaChange(This,item)
#define IWMPEvents3_CurrentMediaItemAvailable(This,name) (This)->lpVtbl->CurrentMediaItemAvailable(This,name)
#define IWMPEvents3_CurrentItemChange(This,media) (This)->lpVtbl->CurrentItemChange(This,media)
#define IWMPEvents3_MediaCollectionChange(This) (This)->lpVtbl->MediaCollectionChange(This)
#define IWMPEvents3_MediaCollectionAttributeStringAdded(This,name,val) (This)->lpVtbl->MediaCollectionAttributeStringAdded(This,name,val)
#define IWMPEvents3_MediaCollectionAttributeStringRemoved(This,name,val) (This)->lpVtbl->MediaCollectionAttributeStringRemoved(This,name,val)
#define IWMPEvents3_MediaCollectionAttributeStringChanged(This,name,old_val,new_val) (This)->lpVtbl->MediaCollectionAttributeStringChanged(This,name,old_val,new_val)
#define IWMPEvents3_PlaylistCollectionChange(This) (This)->lpVtbl->PlaylistCollectionChange(This)
#define IWMPEvents3_PlaylistCollectionPlaylistAdded(This,name) (This)->lpVtbl->PlaylistCollectionPlaylistAdded(This,name)
#define IWMPEvents3_PlaylistCollectionPlaylistRemoved(This,name) (This)->lpVtbl->PlaylistCollectionPlaylistRemoved(This,name)
#define IWMPEvents3_PlaylistCollectionPlaylistSetAsDeleted(This,name,deleted) (This)->lpVtbl->PlaylistCollectionPlaylistSetAsDeleted(This,name,deleted)
#define IWMPEvents3_ModeChange(This,ModeName,value) (This)->lpVtbl->ModeChange(This,ModeName,value)
#define IWMPEvents3_MediaError(This,media) (This)->lpVtbl->MediaError(This,media)
#define IWMPEvents3_OpenPlaylistSwitch(This,item) (This)->lpVtbl->OpenPlaylistSwitch(This,item)
#define IWMPEvents3_DomainChange(This,domain) (This)->lpVtbl->DomainChange(This,domain)
#define IWMPEvents3_SwitchedToPlayerApplication(This) (This)->lpVtbl->SwitchedToPlayerApplication(This)
#define IWMPEvents3_SwitchedToControl(This) (This)->lpVtbl->SwitchedToControl(This)
#define IWMPEvents3_PlayerDockedStateChange(This) (This)->lpVtbl->PlayerDockedStateChange(This)
#define IWMPEvents3_PlayerReconnect(This) (This)->lpVtbl->PlayerReconnect(This)
#define IWMPEvents3_Click(This,button,shift_state,x,y) (This)->lpVtbl->Click(This,button,shift_state,x,y)
#define IWMPEvents3_DoubleClick(This,button,shift_state,fX,fY) (This)->lpVtbl->DoubleClick(This,button,shift_state,fX,fY)
#define IWMPEvents3_KeyDown(This,keycode,shift_state) (This)->lpVtbl->KeyDown(This,keycode,shift_state)
#define IWMPEvents3_KeyPress(This,ascii) (This)->lpVtbl->KeyPress(This,ascii)
#define IWMPEvents3_KeyUp(This,keycode,shift_state) (This)->lpVtbl->KeyUp(This,keycode,shift_state)
#define IWMPEvents3_MouseDown(This,button,nShiftState,x,y) (This)->lpVtbl->MouseDown(This,button,nShiftState,x,y)
#define IWMPEvents3_MouseMove(This,button,shift_state,x,y) (This)->lpVtbl->MouseMove(This,button,shift_state,x,y)
#define IWMPEvents3_MouseUp(This,button,shift_state,x,y) (This)->lpVtbl->MouseUp(This,button,shift_state,x,y)
/*** IWMPEvents2 methods ***/
#define IWMPEvents3_DeviceConnect(This,device) (This)->lpVtbl->DeviceConnect(This,device)
#define IWMPEvents3_DeviceDisconnect(This,device) (This)->lpVtbl->DeviceDisconnect(This,device)
#define IWMPEvents3_DeviceStatusChange(This,device,status) (This)->lpVtbl->DeviceStatusChange(This,device,status)
#define IWMPEvents3_DeviceSyncStateChange(This,device,state) (This)->lpVtbl->DeviceSyncStateChange(This,device,state)
#define IWMPEvents3_DeviceSyncError(This,device,media) (This)->lpVtbl->DeviceSyncError(This,device,media)
#define IWMPEvents3_CreatePartnershipComplete(This,device,result) (This)->lpVtbl->CreatePartnershipComplete(This,device,result)
/*** IWMPEvents3 methods ***/
#define IWMPEvents3_CdromRipStateChange(This,rip,state) (This)->lpVtbl->CdromRipStateChange(This,rip,state)
#define IWMPEvents3_CdromRipMediaError(This,rip,media) (This)->lpVtbl->CdromRipMediaError(This,rip,media)
#define IWMPEvents3_CdromBurnStateChange(This,burn,state) (This)->lpVtbl->CdromBurnStateChange(This,burn,state)
#define IWMPEvents3_CdromBurnMediaError(This,burn,media) (This)->lpVtbl->CdromBurnMediaError(This,burn,media)
#define IWMPEvents3_CdromBurnError(This,burn,error) (This)->lpVtbl->CdromBurnError(This,burn,error)
#define IWMPEvents3_LibraryConnect(This,wmplibrary) (This)->lpVtbl->LibraryConnect(This,wmplibrary)
#define IWMPEvents3_LibraryDisconnect(This,wmplibrary) (This)->lpVtbl->LibraryDisconnect(This,wmplibrary)
#define IWMPEvents3_FolderScanStateChange(This,state) (This)->lpVtbl->FolderScanStateChange(This,state)
#define IWMPEvents3_StringCollectionChange(This,collection,change,index) (This)->lpVtbl->StringCollectionChange(This,collection,change,index)
#define IWMPEvents3_MediaCollectionMediaAdded(This,media) (This)->lpVtbl->MediaCollectionMediaAdded(This,media)
#define IWMPEvents3_MediaCollectionMediaRemoved(This,media) (This)->lpVtbl->MediaCollectionMediaRemoved(This,media)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IWMPEvents3_QueryInterface(IWMPEvents3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWMPEvents3_AddRef(IWMPEvents3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWMPEvents3_Release(IWMPEvents3* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMPEvents methods ***/
static __WIDL_INLINE void IWMPEvents3_OpenStateChange(IWMPEvents3* This,LONG state) {
    This->lpVtbl->OpenStateChange(This,state);
}
static __WIDL_INLINE void IWMPEvents3_PlayStateChange(IWMPEvents3* This,LONG state) {
    This->lpVtbl->PlayStateChange(This,state);
}
static __WIDL_INLINE void IWMPEvents3_AudioLanguageChange(IWMPEvents3* This,LONG lang) {
    This->lpVtbl->AudioLanguageChange(This,lang);
}
static __WIDL_INLINE void IWMPEvents3_StatusChange(IWMPEvents3* This) {
    This->lpVtbl->StatusChange(This);
}
static __WIDL_INLINE void IWMPEvents3_ScriptCommand(IWMPEvents3* This,BSTR type,BSTR param) {
    This->lpVtbl->ScriptCommand(This,type,param);
}
static __WIDL_INLINE void IWMPEvents3_NewStream(IWMPEvents3* This) {
    This->lpVtbl->NewStream(This);
}
static __WIDL_INLINE void IWMPEvents3_Disconnect(IWMPEvents3* This,LONG result) {
    This->lpVtbl->Disconnect(This,result);
}
static __WIDL_INLINE void IWMPEvents3_Buffering(IWMPEvents3* This,VARIANT_BOOL start) {
    This->lpVtbl->Buffering(This,start);
}
static __WIDL_INLINE void IWMPEvents3_Error(IWMPEvents3* This) {
    This->lpVtbl->Error(This);
}
static __WIDL_INLINE void IWMPEvents3_Warning(IWMPEvents3* This,LONG warning,LONG param,BSTR description) {
    This->lpVtbl->Warning(This,warning,param,description);
}
static __WIDL_INLINE void IWMPEvents3_EndOfStream(IWMPEvents3* This,LONG result) {
    This->lpVtbl->EndOfStream(This,result);
}
static __WIDL_INLINE void IWMPEvents3_PositionChange(IWMPEvents3* This,double old_position,double new_position) {
    This->lpVtbl->PositionChange(This,old_position,new_position);
}
static __WIDL_INLINE void IWMPEvents3_MarkerHit(IWMPEvents3* This,LONG marker) {
    This->lpVtbl->MarkerHit(This,marker);
}
static __WIDL_INLINE void IWMPEvents3_DurationUnitChange(IWMPEvents3* This,LONG duration) {
    This->lpVtbl->DurationUnitChange(This,duration);
}
static __WIDL_INLINE void IWMPEvents3_CdromMediaChange(IWMPEvents3* This,LONG num) {
    This->lpVtbl->CdromMediaChange(This,num);
}
static __WIDL_INLINE void IWMPEvents3_PlaylistChange(IWMPEvents3* This,IDispatch *playlist,WMPPlaylistChangeEventType change) {
    This->lpVtbl->PlaylistChange(This,playlist,change);
}
static __WIDL_INLINE void IWMPEvents3_CurrentPlaylistChange(IWMPEvents3* This,WMPPlaylistChangeEventType change) {
    This->lpVtbl->CurrentPlaylistChange(This,change);
}
static __WIDL_INLINE void IWMPEvents3_CurrentPlaylistItemAvailable(IWMPEvents3* This,BSTR item) {
    This->lpVtbl->CurrentPlaylistItemAvailable(This,item);
}
static __WIDL_INLINE void IWMPEvents3_MediaChange(IWMPEvents3* This,IDispatch *item) {
    This->lpVtbl->MediaChange(This,item);
}
static __WIDL_INLINE void IWMPEvents3_CurrentMediaItemAvailable(IWMPEvents3* This,BSTR name) {
    This->lpVtbl->CurrentMediaItemAvailable(This,name);
}
static __WIDL_INLINE void IWMPEvents3_CurrentItemChange(IWMPEvents3* This,IDispatch *media) {
    This->lpVtbl->CurrentItemChange(This,media);
}
static __WIDL_INLINE void IWMPEvents3_MediaCollectionChange(IWMPEvents3* This) {
    This->lpVtbl->MediaCollectionChange(This);
}
static __WIDL_INLINE void IWMPEvents3_MediaCollectionAttributeStringAdded(IWMPEvents3* This,BSTR name,BSTR val) {
    This->lpVtbl->MediaCollectionAttributeStringAdded(This,name,val);
}
static __WIDL_INLINE void IWMPEvents3_MediaCollectionAttributeStringRemoved(IWMPEvents3* This,BSTR name,BSTR val) {
    This->lpVtbl->MediaCollectionAttributeStringRemoved(This,name,val);
}
static __WIDL_INLINE void IWMPEvents3_MediaCollectionAttributeStringChanged(IWMPEvents3* This,BSTR name,BSTR old_val,BSTR new_val) {
    This->lpVtbl->MediaCollectionAttributeStringChanged(This,name,old_val,new_val);
}
static __WIDL_INLINE void IWMPEvents3_PlaylistCollectionChange(IWMPEvents3* This) {
    This->lpVtbl->PlaylistCollectionChange(This);
}
static __WIDL_INLINE void IWMPEvents3_PlaylistCollectionPlaylistAdded(IWMPEvents3* This,BSTR name) {
    This->lpVtbl->PlaylistCollectionPlaylistAdded(This,name);
}
static __WIDL_INLINE void IWMPEvents3_PlaylistCollectionPlaylistRemoved(IWMPEvents3* This,BSTR name) {
    This->lpVtbl->PlaylistCollectionPlaylistRemoved(This,name);
}
static __WIDL_INLINE void IWMPEvents3_PlaylistCollectionPlaylistSetAsDeleted(IWMPEvents3* This,BSTR name,VARIANT_BOOL deleted) {
    This->lpVtbl->PlaylistCollectionPlaylistSetAsDeleted(This,name,deleted);
}
static __WIDL_INLINE void IWMPEvents3_ModeChange(IWMPEvents3* This,BSTR ModeName,VARIANT_BOOL value) {
    This->lpVtbl->ModeChange(This,ModeName,value);
}
static __WIDL_INLINE void IWMPEvents3_MediaError(IWMPEvents3* This,IDispatch *media) {
    This->lpVtbl->MediaError(This,media);
}
static __WIDL_INLINE void IWMPEvents3_OpenPlaylistSwitch(IWMPEvents3* This,IDispatch *item) {
    This->lpVtbl->OpenPlaylistSwitch(This,item);
}
static __WIDL_INLINE void IWMPEvents3_DomainChange(IWMPEvents3* This,BSTR domain) {
    This->lpVtbl->DomainChange(This,domain);
}
static __WIDL_INLINE void IWMPEvents3_SwitchedToPlayerApplication(IWMPEvents3* This) {
    This->lpVtbl->SwitchedToPlayerApplication(This);
}
static __WIDL_INLINE void IWMPEvents3_SwitchedToControl(IWMPEvents3* This) {
    This->lpVtbl->SwitchedToControl(This);
}
static __WIDL_INLINE void IWMPEvents3_PlayerDockedStateChange(IWMPEvents3* This) {
    This->lpVtbl->PlayerDockedStateChange(This);
}
static __WIDL_INLINE void IWMPEvents3_PlayerReconnect(IWMPEvents3* This) {
    This->lpVtbl->PlayerReconnect(This);
}
static __WIDL_INLINE void IWMPEvents3_Click(IWMPEvents3* This,short button,short shift_state,LONG x,LONG y) {
    This->lpVtbl->Click(This,button,shift_state,x,y);
}
static __WIDL_INLINE void IWMPEvents3_DoubleClick(IWMPEvents3* This,short button,short shift_state,LONG fX,LONG fY) {
    This->lpVtbl->DoubleClick(This,button,shift_state,fX,fY);
}
static __WIDL_INLINE void IWMPEvents3_KeyDown(IWMPEvents3* This,short keycode,short shift_state) {
    This->lpVtbl->KeyDown(This,keycode,shift_state);
}
static __WIDL_INLINE void IWMPEvents3_KeyPress(IWMPEvents3* This,short ascii) {
    This->lpVtbl->KeyPress(This,ascii);
}
static __WIDL_INLINE void IWMPEvents3_KeyUp(IWMPEvents3* This,short keycode,short shift_state) {
    This->lpVtbl->KeyUp(This,keycode,shift_state);
}
static __WIDL_INLINE void IWMPEvents3_MouseDown(IWMPEvents3* This,short button,short nShiftState,LONG x,LONG y) {
    This->lpVtbl->MouseDown(This,button,nShiftState,x,y);
}
static __WIDL_INLINE void IWMPEvents3_MouseMove(IWMPEvents3* This,short button,short shift_state,LONG x,LONG y) {
    This->lpVtbl->MouseMove(This,button,shift_state,x,y);
}
static __WIDL_INLINE void IWMPEvents3_MouseUp(IWMPEvents3* This,short button,short shift_state,LONG x,LONG y) {
    This->lpVtbl->MouseUp(This,button,shift_state,x,y);
}
/*** IWMPEvents2 methods ***/
static __WIDL_INLINE void IWMPEvents3_DeviceConnect(IWMPEvents3* This,IWMPSyncDevice *device) {
    This->lpVtbl->DeviceConnect(This,device);
}
static __WIDL_INLINE void IWMPEvents3_DeviceDisconnect(IWMPEvents3* This,IWMPSyncDevice *device) {
    This->lpVtbl->DeviceDisconnect(This,device);
}
static __WIDL_INLINE void IWMPEvents3_DeviceStatusChange(IWMPEvents3* This,IWMPSyncDevice *device,WMPDeviceStatus status) {
    This->lpVtbl->DeviceStatusChange(This,device,status);
}
static __WIDL_INLINE void IWMPEvents3_DeviceSyncStateChange(IWMPEvents3* This,IWMPSyncDevice *device,WMPSyncState state) {
    This->lpVtbl->DeviceSyncStateChange(This,device,state);
}
static __WIDL_INLINE void IWMPEvents3_DeviceSyncError(IWMPEvents3* This,IWMPSyncDevice *device,IDispatch *media) {
    This->lpVtbl->DeviceSyncError(This,device,media);
}
static __WIDL_INLINE void IWMPEvents3_CreatePartnershipComplete(IWMPEvents3* This,IWMPSyncDevice *device,HRESULT result) {
    This->lpVtbl->CreatePartnershipComplete(This,device,result);
}
/*** IWMPEvents3 methods ***/
static __WIDL_INLINE void IWMPEvents3_CdromRipStateChange(IWMPEvents3* This,IWMPCdromRip *rip,WMPRipState state) {
    This->lpVtbl->CdromRipStateChange(This,rip,state);
}
static __WIDL_INLINE void IWMPEvents3_CdromRipMediaError(IWMPEvents3* This,IWMPCdromRip *rip,IDispatch *media) {
    This->lpVtbl->CdromRipMediaError(This,rip,media);
}
static __WIDL_INLINE void IWMPEvents3_CdromBurnStateChange(IWMPEvents3* This,IWMPCdromBurn *burn,WMPBurnState state) {
    This->lpVtbl->CdromBurnStateChange(This,burn,state);
}
static __WIDL_INLINE void IWMPEvents3_CdromBurnMediaError(IWMPEvents3* This,IWMPCdromBurn *burn,IDispatch *media) {
    This->lpVtbl->CdromBurnMediaError(This,burn,media);
}
static __WIDL_INLINE void IWMPEvents3_CdromBurnError(IWMPEvents3* This,IWMPCdromBurn *burn,HRESULT error) {
    This->lpVtbl->CdromBurnError(This,burn,error);
}
static __WIDL_INLINE void IWMPEvents3_LibraryConnect(IWMPEvents3* This,IWMPLibrary *wmplibrary) {
    This->lpVtbl->LibraryConnect(This,wmplibrary);
}
static __WIDL_INLINE void IWMPEvents3_LibraryDisconnect(IWMPEvents3* This,IWMPLibrary *wmplibrary) {
    This->lpVtbl->LibraryDisconnect(This,wmplibrary);
}
static __WIDL_INLINE void IWMPEvents3_FolderScanStateChange(IWMPEvents3* This,WMPFolderScanState state) {
    This->lpVtbl->FolderScanStateChange(This,state);
}
static __WIDL_INLINE void IWMPEvents3_StringCollectionChange(IWMPEvents3* This,IDispatch *collection,WMPStringCollectionChangeEventType change,LONG index) {
    This->lpVtbl->StringCollectionChange(This,collection,change,index);
}
static __WIDL_INLINE void IWMPEvents3_MediaCollectionMediaAdded(IWMPEvents3* This,IDispatch *media) {
    This->lpVtbl->MediaCollectionMediaAdded(This,media);
}
static __WIDL_INLINE void IWMPEvents3_MediaCollectionMediaRemoved(IWMPEvents3* This,IDispatch *media) {
    This->lpVtbl->MediaCollectionMediaRemoved(This,media);
}
#endif
#endif

#endif


#endif  /* __IWMPEvents3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMPEvents4 interface
 */
#ifndef __IWMPEvents4_INTERFACE_DEFINED__
#define __IWMPEvents4_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMPEvents4, 0x26dabcfa, 0x306b, 0x404d, 0x9a,0x6f, 0x63,0x0a,0x84,0x05,0x04,0x8d);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("26dabcfa-306b-404d-9a6f-630a8405048d")
IWMPEvents4 : public IWMPEvents3
{
    virtual void STDMETHODCALLTYPE DeviceEstimation(
        IWMPSyncDevice *device,
        HRESULT result,
        LONGLONG used_space,
        LONGLONG estimated_space) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMPEvents4, 0x26dabcfa, 0x306b, 0x404d, 0x9a,0x6f, 0x63,0x0a,0x84,0x05,0x04,0x8d)
#endif
#else
typedef struct IWMPEvents4Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMPEvents methods ***/
    void (STDMETHODCALLTYPE *OpenStateChange)(
        IWMPEvents4 *This,
        LONG state);

    void (STDMETHODCALLTYPE *PlayStateChange)(
        IWMPEvents4 *This,
        LONG state);

    void (STDMETHODCALLTYPE *AudioLanguageChange)(
        IWMPEvents4 *This,
        LONG lang);

    void (STDMETHODCALLTYPE *StatusChange)(
        IWMPEvents4 *This);

    void (STDMETHODCALLTYPE *ScriptCommand)(
        IWMPEvents4 *This,
        BSTR type,
        BSTR param);

    void (STDMETHODCALLTYPE *NewStream)(
        IWMPEvents4 *This);

    void (STDMETHODCALLTYPE *Disconnect)(
        IWMPEvents4 *This,
        LONG result);

    void (STDMETHODCALLTYPE *Buffering)(
        IWMPEvents4 *This,
        VARIANT_BOOL start);

    void (STDMETHODCALLTYPE *Error)(
        IWMPEvents4 *This);

    void (STDMETHODCALLTYPE *Warning)(
        IWMPEvents4 *This,
        LONG warning,
        LONG param,
        BSTR description);

    void (STDMETHODCALLTYPE *EndOfStream)(
        IWMPEvents4 *This,
        LONG result);

    void (STDMETHODCALLTYPE *PositionChange)(
        IWMPEvents4 *This,
        double old_position,
        double new_position);

    void (STDMETHODCALLTYPE *MarkerHit)(
        IWMPEvents4 *This,
        LONG marker);

    void (STDMETHODCALLTYPE *DurationUnitChange)(
        IWMPEvents4 *This,
        LONG duration);

    void (STDMETHODCALLTYPE *CdromMediaChange)(
        IWMPEvents4 *This,
        LONG num);

    void (STDMETHODCALLTYPE *PlaylistChange)(
        IWMPEvents4 *This,
        IDispatch *playlist,
        WMPPlaylistChangeEventType change);

    void (STDMETHODCALLTYPE *CurrentPlaylistChange)(
        IWMPEvents4 *This,
        WMPPlaylistChangeEventType change);

    void (STDMETHODCALLTYPE *CurrentPlaylistItemAvailable)(
        IWMPEvents4 *This,
        BSTR item);

    void (STDMETHODCALLTYPE *MediaChange)(
        IWMPEvents4 *This,
        IDispatch *item);

    void (STDMETHODCALLTYPE *CurrentMediaItemAvailable)(
        IWMPEvents4 *This,
        BSTR name);

    void (STDMETHODCALLTYPE *CurrentItemChange)(
        IWMPEvents4 *This,
        IDispatch *media);

    void (STDMETHODCALLTYPE *MediaCollectionChange)(
        IWMPEvents4 *This);

    void (STDMETHODCALLTYPE *MediaCollectionAttributeStringAdded)(
        IWMPEvents4 *This,
        BSTR name,
        BSTR val);

    void (STDMETHODCALLTYPE *MediaCollectionAttributeStringRemoved)(
        IWMPEvents4 *This,
        BSTR name,
        BSTR val);

    void (STDMETHODCALLTYPE *MediaCollectionAttributeStringChanged)(
        IWMPEvents4 *This,
        BSTR name,
        BSTR old_val,
        BSTR new_val);

    void (STDMETHODCALLTYPE *PlaylistCollectionChange)(
        IWMPEvents4 *This);

    void (STDMETHODCALLTYPE *PlaylistCollectionPlaylistAdded)(
        IWMPEvents4 *This,
        BSTR name);

    void (STDMETHODCALLTYPE *PlaylistCollectionPlaylistRemoved)(
        IWMPEvents4 *This,
        BSTR name);

    void (STDMETHODCALLTYPE *PlaylistCollectionPlaylistSetAsDeleted)(
        IWMPEvents4 *This,
        BSTR name,
        VARIANT_BOOL deleted);

    void (STDMETHODCALLTYPE *ModeChange)(
        IWMPEvents4 *This,
        BSTR ModeName,
        VARIANT_BOOL value);

    void (STDMETHODCALLTYPE *MediaError)(
        IWMPEvents4 *This,
        IDispatch *media);

    void (STDMETHODCALLTYPE *OpenPlaylistSwitch)(
        IWMPEvents4 *This,
        IDispatch *item);

    void (STDMETHODCALLTYPE *DomainChange)(
        IWMPEvents4 *This,
        BSTR domain);

    void (STDMETHODCALLTYPE *SwitchedToPlayerApplication)(
        IWMPEvents4 *This);

    void (STDMETHODCALLTYPE *SwitchedToControl)(
        IWMPEvents4 *This);

    void (STDMETHODCALLTYPE *PlayerDockedStateChange)(
        IWMPEvents4 *This);

    void (STDMETHODCALLTYPE *PlayerReconnect)(
        IWMPEvents4 *This);

    void (STDMETHODCALLTYPE *Click)(
        IWMPEvents4 *This,
        short button,
        short shift_state,
        LONG x,
        LONG y);

    void (STDMETHODCALLTYPE *DoubleClick)(
        IWMPEvents4 *This,
        short button,
        short shift_state,
        LONG fX,
        LONG fY);

    void (STDMETHODCALLTYPE *KeyDown)(
        IWMPEvents4 *This,
        short keycode,
        short shift_state);

    void (STDMETHODCALLTYPE *KeyPress)(
        IWMPEvents4 *This,
        short ascii);

    void (STDMETHODCALLTYPE *KeyUp)(
        IWMPEvents4 *This,
        short keycode,
        short shift_state);

    void (STDMETHODCALLTYPE *MouseDown)(
        IWMPEvents4 *This,
        short button,
        short nShiftState,
        LONG x,
        LONG y);

    void (STDMETHODCALLTYPE *MouseMove)(
        IWMPEvents4 *This,
        short button,
        short shift_state,
        LONG x,
        LONG y);

    void (STDMETHODCALLTYPE *MouseUp)(
        IWMPEvents4 *This,
        short button,
        short shift_state,
        LONG x,
        LONG y);

    /*** IWMPEvents2 methods ***/
    void (STDMETHODCALLTYPE *DeviceConnect)(
        IWMPEvents4 *This,
        IWMPSyncDevice *device);

    void (STDMETHODCALLTYPE *DeviceDisconnect)(
        IWMPEvents4 *This,
        IWMPSyncDevice *device);

    void (STDMETHODCALLTYPE *DeviceStatusChange)(
        IWMPEvents4 *This,
        IWMPSyncDevice *device,
        WMPDeviceStatus status);

    void (STDMETHODCALLTYPE *DeviceSyncStateChange)(
        IWMPEvents4 *This,
        IWMPSyncDevice *device,
        WMPSyncState state);

    void (STDMETHODCALLTYPE *DeviceSyncError)(
        IWMPEvents4 *This,
        IWMPSyncDevice *device,
        IDispatch *media);

    void (STDMETHODCALLTYPE *CreatePartnershipComplete)(
        IWMPEvents4 *This,
        IWMPSyncDevice *device,
        HRESULT result);

    /*** IWMPEvents3 methods ***/
    void (STDMETHODCALLTYPE *CdromRipStateChange)(
        IWMPEvents4 *This,
        IWMPCdromRip *rip,
        WMPRipState state);

    void (STDMETHODCALLTYPE *CdromRipMediaError)(
        IWMPEvents4 *This,
        IWMPCdromRip *rip,
        IDispatch *media);

    void (STDMETHODCALLTYPE *CdromBurnStateChange)(
        IWMPEvents4 *This,
        IWMPCdromBurn *burn,
        WMPBurnState state);

    void (STDMETHODCALLTYPE *CdromBurnMediaError)(
        IWMPEvents4 *This,
        IWMPCdromBurn *burn,
        IDispatch *media);

    void (STDMETHODCALLTYPE *CdromBurnError)(
        IWMPEvents4 *This,
        IWMPCdromBurn *burn,
        HRESULT error);

    void (STDMETHODCALLTYPE *LibraryConnect)(
        IWMPEvents4 *This,
        IWMPLibrary *wmplibrary);

    void (STDMETHODCALLTYPE *LibraryDisconnect)(
        IWMPEvents4 *This,
        IWMPLibrary *wmplibrary);

    void (STDMETHODCALLTYPE *FolderScanStateChange)(
        IWMPEvents4 *This,
        WMPFolderScanState state);

    void (STDMETHODCALLTYPE *StringCollectionChange)(
        IWMPEvents4 *This,
        IDispatch *collection,
        WMPStringCollectionChangeEventType change,
        LONG index);

    void (STDMETHODCALLTYPE *MediaCollectionMediaAdded)(
        IWMPEvents4 *This,
        IDispatch *media);

    void (STDMETHODCALLTYPE *MediaCollectionMediaRemoved)(
        IWMPEvents4 *This,
        IDispatch *media);

    /*** IWMPEvents4 methods ***/
    void (STDMETHODCALLTYPE *DeviceEstimation)(
        IWMPEvents4 *This,
        IWMPSyncDevice *device,
        HRESULT result,
        LONGLONG used_space,
        LONGLONG estimated_space);

    END_INTERFACE
} IWMPEvents4Vtbl;

interface IWMPEvents4 {
    CONST_VTBL IWMPEvents4Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMPEvents4_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMPEvents4_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMPEvents4_Release(This) (This)->lpVtbl->Release(This)
/*** IWMPEvents methods ***/
#define IWMPEvents4_OpenStateChange(This,state) (This)->lpVtbl->OpenStateChange(This,state)
#define IWMPEvents4_PlayStateChange(This,state) (This)->lpVtbl->PlayStateChange(This,state)
#define IWMPEvents4_AudioLanguageChange(This,lang) (This)->lpVtbl->AudioLanguageChange(This,lang)
#define IWMPEvents4_StatusChange(This) (This)->lpVtbl->StatusChange(This)
#define IWMPEvents4_ScriptCommand(This,type,param) (This)->lpVtbl->ScriptCommand(This,type,param)
#define IWMPEvents4_NewStream(This) (This)->lpVtbl->NewStream(This)
#define IWMPEvents4_Disconnect(This,result) (This)->lpVtbl->Disconnect(This,result)
#define IWMPEvents4_Buffering(This,start) (This)->lpVtbl->Buffering(This,start)
#define IWMPEvents4_Error(This) (This)->lpVtbl->Error(This)
#define IWMPEvents4_Warning(This,warning,param,description) (This)->lpVtbl->Warning(This,warning,param,description)
#define IWMPEvents4_EndOfStream(This,result) (This)->lpVtbl->EndOfStream(This,result)
#define IWMPEvents4_PositionChange(This,old_position,new_position) (This)->lpVtbl->PositionChange(This,old_position,new_position)
#define IWMPEvents4_MarkerHit(This,marker) (This)->lpVtbl->MarkerHit(This,marker)
#define IWMPEvents4_DurationUnitChange(This,duration) (This)->lpVtbl->DurationUnitChange(This,duration)
#define IWMPEvents4_CdromMediaChange(This,num) (This)->lpVtbl->CdromMediaChange(This,num)
#define IWMPEvents4_PlaylistChange(This,playlist,change) (This)->lpVtbl->PlaylistChange(This,playlist,change)
#define IWMPEvents4_CurrentPlaylistChange(This,change) (This)->lpVtbl->CurrentPlaylistChange(This,change)
#define IWMPEvents4_CurrentPlaylistItemAvailable(This,item) (This)->lpVtbl->CurrentPlaylistItemAvailable(This,item)
#define IWMPEvents4_MediaChange(This,item) (This)->lpVtbl->MediaChange(This,item)
#define IWMPEvents4_CurrentMediaItemAvailable(This,name) (This)->lpVtbl->CurrentMediaItemAvailable(This,name)
#define IWMPEvents4_CurrentItemChange(This,media) (This)->lpVtbl->CurrentItemChange(This,media)
#define IWMPEvents4_MediaCollectionChange(This) (This)->lpVtbl->MediaCollectionChange(This)
#define IWMPEvents4_MediaCollectionAttributeStringAdded(This,name,val) (This)->lpVtbl->MediaCollectionAttributeStringAdded(This,name,val)
#define IWMPEvents4_MediaCollectionAttributeStringRemoved(This,name,val) (This)->lpVtbl->MediaCollectionAttributeStringRemoved(This,name,val)
#define IWMPEvents4_MediaCollectionAttributeStringChanged(This,name,old_val,new_val) (This)->lpVtbl->MediaCollectionAttributeStringChanged(This,name,old_val,new_val)
#define IWMPEvents4_PlaylistCollectionChange(This) (This)->lpVtbl->PlaylistCollectionChange(This)
#define IWMPEvents4_PlaylistCollectionPlaylistAdded(This,name) (This)->lpVtbl->PlaylistCollectionPlaylistAdded(This,name)
#define IWMPEvents4_PlaylistCollectionPlaylistRemoved(This,name) (This)->lpVtbl->PlaylistCollectionPlaylistRemoved(This,name)
#define IWMPEvents4_PlaylistCollectionPlaylistSetAsDeleted(This,name,deleted) (This)->lpVtbl->PlaylistCollectionPlaylistSetAsDeleted(This,name,deleted)
#define IWMPEvents4_ModeChange(This,ModeName,value) (This)->lpVtbl->ModeChange(This,ModeName,value)
#define IWMPEvents4_MediaError(This,media) (This)->lpVtbl->MediaError(This,media)
#define IWMPEvents4_OpenPlaylistSwitch(This,item) (This)->lpVtbl->OpenPlaylistSwitch(This,item)
#define IWMPEvents4_DomainChange(This,domain) (This)->lpVtbl->DomainChange(This,domain)
#define IWMPEvents4_SwitchedToPlayerApplication(This) (This)->lpVtbl->SwitchedToPlayerApplication(This)
#define IWMPEvents4_SwitchedToControl(This) (This)->lpVtbl->SwitchedToControl(This)
#define IWMPEvents4_PlayerDockedStateChange(This) (This)->lpVtbl->PlayerDockedStateChange(This)
#define IWMPEvents4_PlayerReconnect(This) (This)->lpVtbl->PlayerReconnect(This)
#define IWMPEvents4_Click(This,button,shift_state,x,y) (This)->lpVtbl->Click(This,button,shift_state,x,y)
#define IWMPEvents4_DoubleClick(This,button,shift_state,fX,fY) (This)->lpVtbl->DoubleClick(This,button,shift_state,fX,fY)
#define IWMPEvents4_KeyDown(This,keycode,shift_state) (This)->lpVtbl->KeyDown(This,keycode,shift_state)
#define IWMPEvents4_KeyPress(This,ascii) (This)->lpVtbl->KeyPress(This,ascii)
#define IWMPEvents4_KeyUp(This,keycode,shift_state) (This)->lpVtbl->KeyUp(This,keycode,shift_state)
#define IWMPEvents4_MouseDown(This,button,nShiftState,x,y) (This)->lpVtbl->MouseDown(This,button,nShiftState,x,y)
#define IWMPEvents4_MouseMove(This,button,shift_state,x,y) (This)->lpVtbl->MouseMove(This,button,shift_state,x,y)
#define IWMPEvents4_MouseUp(This,button,shift_state,x,y) (This)->lpVtbl->MouseUp(This,button,shift_state,x,y)
/*** IWMPEvents2 methods ***/
#define IWMPEvents4_DeviceConnect(This,device) (This)->lpVtbl->DeviceConnect(This,device)
#define IWMPEvents4_DeviceDisconnect(This,device) (This)->lpVtbl->DeviceDisconnect(This,device)
#define IWMPEvents4_DeviceStatusChange(This,device,status) (This)->lpVtbl->DeviceStatusChange(This,device,status)
#define IWMPEvents4_DeviceSyncStateChange(This,device,state) (This)->lpVtbl->DeviceSyncStateChange(This,device,state)
#define IWMPEvents4_DeviceSyncError(This,device,media) (This)->lpVtbl->DeviceSyncError(This,device,media)
#define IWMPEvents4_CreatePartnershipComplete(This,device,result) (This)->lpVtbl->CreatePartnershipComplete(This,device,result)
/*** IWMPEvents3 methods ***/
#define IWMPEvents4_CdromRipStateChange(This,rip,state) (This)->lpVtbl->CdromRipStateChange(This,rip,state)
#define IWMPEvents4_CdromRipMediaError(This,rip,media) (This)->lpVtbl->CdromRipMediaError(This,rip,media)
#define IWMPEvents4_CdromBurnStateChange(This,burn,state) (This)->lpVtbl->CdromBurnStateChange(This,burn,state)
#define IWMPEvents4_CdromBurnMediaError(This,burn,media) (This)->lpVtbl->CdromBurnMediaError(This,burn,media)
#define IWMPEvents4_CdromBurnError(This,burn,error) (This)->lpVtbl->CdromBurnError(This,burn,error)
#define IWMPEvents4_LibraryConnect(This,wmplibrary) (This)->lpVtbl->LibraryConnect(This,wmplibrary)
#define IWMPEvents4_LibraryDisconnect(This,wmplibrary) (This)->lpVtbl->LibraryDisconnect(This,wmplibrary)
#define IWMPEvents4_FolderScanStateChange(This,state) (This)->lpVtbl->FolderScanStateChange(This,state)
#define IWMPEvents4_StringCollectionChange(This,collection,change,index) (This)->lpVtbl->StringCollectionChange(This,collection,change,index)
#define IWMPEvents4_MediaCollectionMediaAdded(This,media) (This)->lpVtbl->MediaCollectionMediaAdded(This,media)
#define IWMPEvents4_MediaCollectionMediaRemoved(This,media) (This)->lpVtbl->MediaCollectionMediaRemoved(This,media)
/*** IWMPEvents4 methods ***/
#define IWMPEvents4_DeviceEstimation(This,device,result,used_space,estimated_space) (This)->lpVtbl->DeviceEstimation(This,device,result,used_space,estimated_space)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IWMPEvents4_QueryInterface(IWMPEvents4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWMPEvents4_AddRef(IWMPEvents4* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWMPEvents4_Release(IWMPEvents4* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMPEvents methods ***/
static __WIDL_INLINE void IWMPEvents4_OpenStateChange(IWMPEvents4* This,LONG state) {
    This->lpVtbl->OpenStateChange(This,state);
}
static __WIDL_INLINE void IWMPEvents4_PlayStateChange(IWMPEvents4* This,LONG state) {
    This->lpVtbl->PlayStateChange(This,state);
}
static __WIDL_INLINE void IWMPEvents4_AudioLanguageChange(IWMPEvents4* This,LONG lang) {
    This->lpVtbl->AudioLanguageChange(This,lang);
}
static __WIDL_INLINE void IWMPEvents4_StatusChange(IWMPEvents4* This) {
    This->lpVtbl->StatusChange(This);
}
static __WIDL_INLINE void IWMPEvents4_ScriptCommand(IWMPEvents4* This,BSTR type,BSTR param) {
    This->lpVtbl->ScriptCommand(This,type,param);
}
static __WIDL_INLINE void IWMPEvents4_NewStream(IWMPEvents4* This) {
    This->lpVtbl->NewStream(This);
}
static __WIDL_INLINE void IWMPEvents4_Disconnect(IWMPEvents4* This,LONG result) {
    This->lpVtbl->Disconnect(This,result);
}
static __WIDL_INLINE void IWMPEvents4_Buffering(IWMPEvents4* This,VARIANT_BOOL start) {
    This->lpVtbl->Buffering(This,start);
}
static __WIDL_INLINE void IWMPEvents4_Error(IWMPEvents4* This) {
    This->lpVtbl->Error(This);
}
static __WIDL_INLINE void IWMPEvents4_Warning(IWMPEvents4* This,LONG warning,LONG param,BSTR description) {
    This->lpVtbl->Warning(This,warning,param,description);
}
static __WIDL_INLINE void IWMPEvents4_EndOfStream(IWMPEvents4* This,LONG result) {
    This->lpVtbl->EndOfStream(This,result);
}
static __WIDL_INLINE void IWMPEvents4_PositionChange(IWMPEvents4* This,double old_position,double new_position) {
    This->lpVtbl->PositionChange(This,old_position,new_position);
}
static __WIDL_INLINE void IWMPEvents4_MarkerHit(IWMPEvents4* This,LONG marker) {
    This->lpVtbl->MarkerHit(This,marker);
}
static __WIDL_INLINE void IWMPEvents4_DurationUnitChange(IWMPEvents4* This,LONG duration) {
    This->lpVtbl->DurationUnitChange(This,duration);
}
static __WIDL_INLINE void IWMPEvents4_CdromMediaChange(IWMPEvents4* This,LONG num) {
    This->lpVtbl->CdromMediaChange(This,num);
}
static __WIDL_INLINE void IWMPEvents4_PlaylistChange(IWMPEvents4* This,IDispatch *playlist,WMPPlaylistChangeEventType change) {
    This->lpVtbl->PlaylistChange(This,playlist,change);
}
static __WIDL_INLINE void IWMPEvents4_CurrentPlaylistChange(IWMPEvents4* This,WMPPlaylistChangeEventType change) {
    This->lpVtbl->CurrentPlaylistChange(This,change);
}
static __WIDL_INLINE void IWMPEvents4_CurrentPlaylistItemAvailable(IWMPEvents4* This,BSTR item) {
    This->lpVtbl->CurrentPlaylistItemAvailable(This,item);
}
static __WIDL_INLINE void IWMPEvents4_MediaChange(IWMPEvents4* This,IDispatch *item) {
    This->lpVtbl->MediaChange(This,item);
}
static __WIDL_INLINE void IWMPEvents4_CurrentMediaItemAvailable(IWMPEvents4* This,BSTR name) {
    This->lpVtbl->CurrentMediaItemAvailable(This,name);
}
static __WIDL_INLINE void IWMPEvents4_CurrentItemChange(IWMPEvents4* This,IDispatch *media) {
    This->lpVtbl->CurrentItemChange(This,media);
}
static __WIDL_INLINE void IWMPEvents4_MediaCollectionChange(IWMPEvents4* This) {
    This->lpVtbl->MediaCollectionChange(This);
}
static __WIDL_INLINE void IWMPEvents4_MediaCollectionAttributeStringAdded(IWMPEvents4* This,BSTR name,BSTR val) {
    This->lpVtbl->MediaCollectionAttributeStringAdded(This,name,val);
}
static __WIDL_INLINE void IWMPEvents4_MediaCollectionAttributeStringRemoved(IWMPEvents4* This,BSTR name,BSTR val) {
    This->lpVtbl->MediaCollectionAttributeStringRemoved(This,name,val);
}
static __WIDL_INLINE void IWMPEvents4_MediaCollectionAttributeStringChanged(IWMPEvents4* This,BSTR name,BSTR old_val,BSTR new_val) {
    This->lpVtbl->MediaCollectionAttributeStringChanged(This,name,old_val,new_val);
}
static __WIDL_INLINE void IWMPEvents4_PlaylistCollectionChange(IWMPEvents4* This) {
    This->lpVtbl->PlaylistCollectionChange(This);
}
static __WIDL_INLINE void IWMPEvents4_PlaylistCollectionPlaylistAdded(IWMPEvents4* This,BSTR name) {
    This->lpVtbl->PlaylistCollectionPlaylistAdded(This,name);
}
static __WIDL_INLINE void IWMPEvents4_PlaylistCollectionPlaylistRemoved(IWMPEvents4* This,BSTR name) {
    This->lpVtbl->PlaylistCollectionPlaylistRemoved(This,name);
}
static __WIDL_INLINE void IWMPEvents4_PlaylistCollectionPlaylistSetAsDeleted(IWMPEvents4* This,BSTR name,VARIANT_BOOL deleted) {
    This->lpVtbl->PlaylistCollectionPlaylistSetAsDeleted(This,name,deleted);
}
static __WIDL_INLINE void IWMPEvents4_ModeChange(IWMPEvents4* This,BSTR ModeName,VARIANT_BOOL value) {
    This->lpVtbl->ModeChange(This,ModeName,value);
}
static __WIDL_INLINE void IWMPEvents4_MediaError(IWMPEvents4* This,IDispatch *media) {
    This->lpVtbl->MediaError(This,media);
}
static __WIDL_INLINE void IWMPEvents4_OpenPlaylistSwitch(IWMPEvents4* This,IDispatch *item) {
    This->lpVtbl->OpenPlaylistSwitch(This,item);
}
static __WIDL_INLINE void IWMPEvents4_DomainChange(IWMPEvents4* This,BSTR domain) {
    This->lpVtbl->DomainChange(This,domain);
}
static __WIDL_INLINE void IWMPEvents4_SwitchedToPlayerApplication(IWMPEvents4* This) {
    This->lpVtbl->SwitchedToPlayerApplication(This);
}
static __WIDL_INLINE void IWMPEvents4_SwitchedToControl(IWMPEvents4* This) {
    This->lpVtbl->SwitchedToControl(This);
}
static __WIDL_INLINE void IWMPEvents4_PlayerDockedStateChange(IWMPEvents4* This) {
    This->lpVtbl->PlayerDockedStateChange(This);
}
static __WIDL_INLINE void IWMPEvents4_PlayerReconnect(IWMPEvents4* This) {
    This->lpVtbl->PlayerReconnect(This);
}
static __WIDL_INLINE void IWMPEvents4_Click(IWMPEvents4* This,short button,short shift_state,LONG x,LONG y) {
    This->lpVtbl->Click(This,button,shift_state,x,y);
}
static __WIDL_INLINE void IWMPEvents4_DoubleClick(IWMPEvents4* This,short button,short shift_state,LONG fX,LONG fY) {
    This->lpVtbl->DoubleClick(This,button,shift_state,fX,fY);
}
static __WIDL_INLINE void IWMPEvents4_KeyDown(IWMPEvents4* This,short keycode,short shift_state) {
    This->lpVtbl->KeyDown(This,keycode,shift_state);
}
static __WIDL_INLINE void IWMPEvents4_KeyPress(IWMPEvents4* This,short ascii) {
    This->lpVtbl->KeyPress(This,ascii);
}
static __WIDL_INLINE void IWMPEvents4_KeyUp(IWMPEvents4* This,short keycode,short shift_state) {
    This->lpVtbl->KeyUp(This,keycode,shift_state);
}
static __WIDL_INLINE void IWMPEvents4_MouseDown(IWMPEvents4* This,short button,short nShiftState,LONG x,LONG y) {
    This->lpVtbl->MouseDown(This,button,nShiftState,x,y);
}
static __WIDL_INLINE void IWMPEvents4_MouseMove(IWMPEvents4* This,short button,short shift_state,LONG x,LONG y) {
    This->lpVtbl->MouseMove(This,button,shift_state,x,y);
}
static __WIDL_INLINE void IWMPEvents4_MouseUp(IWMPEvents4* This,short button,short shift_state,LONG x,LONG y) {
    This->lpVtbl->MouseUp(This,button,shift_state,x,y);
}
/*** IWMPEvents2 methods ***/
static __WIDL_INLINE void IWMPEvents4_DeviceConnect(IWMPEvents4* This,IWMPSyncDevice *device) {
    This->lpVtbl->DeviceConnect(This,device);
}
static __WIDL_INLINE void IWMPEvents4_DeviceDisconnect(IWMPEvents4* This,IWMPSyncDevice *device) {
    This->lpVtbl->DeviceDisconnect(This,device);
}
static __WIDL_INLINE void IWMPEvents4_DeviceStatusChange(IWMPEvents4* This,IWMPSyncDevice *device,WMPDeviceStatus status) {
    This->lpVtbl->DeviceStatusChange(This,device,status);
}
static __WIDL_INLINE void IWMPEvents4_DeviceSyncStateChange(IWMPEvents4* This,IWMPSyncDevice *device,WMPSyncState state) {
    This->lpVtbl->DeviceSyncStateChange(This,device,state);
}
static __WIDL_INLINE void IWMPEvents4_DeviceSyncError(IWMPEvents4* This,IWMPSyncDevice *device,IDispatch *media) {
    This->lpVtbl->DeviceSyncError(This,device,media);
}
static __WIDL_INLINE void IWMPEvents4_CreatePartnershipComplete(IWMPEvents4* This,IWMPSyncDevice *device,HRESULT result) {
    This->lpVtbl->CreatePartnershipComplete(This,device,result);
}
/*** IWMPEvents3 methods ***/
static __WIDL_INLINE void IWMPEvents4_CdromRipStateChange(IWMPEvents4* This,IWMPCdromRip *rip,WMPRipState state) {
    This->lpVtbl->CdromRipStateChange(This,rip,state);
}
static __WIDL_INLINE void IWMPEvents4_CdromRipMediaError(IWMPEvents4* This,IWMPCdromRip *rip,IDispatch *media) {
    This->lpVtbl->CdromRipMediaError(This,rip,media);
}
static __WIDL_INLINE void IWMPEvents4_CdromBurnStateChange(IWMPEvents4* This,IWMPCdromBurn *burn,WMPBurnState state) {
    This->lpVtbl->CdromBurnStateChange(This,burn,state);
}
static __WIDL_INLINE void IWMPEvents4_CdromBurnMediaError(IWMPEvents4* This,IWMPCdromBurn *burn,IDispatch *media) {
    This->lpVtbl->CdromBurnMediaError(This,burn,media);
}
static __WIDL_INLINE void IWMPEvents4_CdromBurnError(IWMPEvents4* This,IWMPCdromBurn *burn,HRESULT error) {
    This->lpVtbl->CdromBurnError(This,burn,error);
}
static __WIDL_INLINE void IWMPEvents4_LibraryConnect(IWMPEvents4* This,IWMPLibrary *wmplibrary) {
    This->lpVtbl->LibraryConnect(This,wmplibrary);
}
static __WIDL_INLINE void IWMPEvents4_LibraryDisconnect(IWMPEvents4* This,IWMPLibrary *wmplibrary) {
    This->lpVtbl->LibraryDisconnect(This,wmplibrary);
}
static __WIDL_INLINE void IWMPEvents4_FolderScanStateChange(IWMPEvents4* This,WMPFolderScanState state) {
    This->lpVtbl->FolderScanStateChange(This,state);
}
static __WIDL_INLINE void IWMPEvents4_StringCollectionChange(IWMPEvents4* This,IDispatch *collection,WMPStringCollectionChangeEventType change,LONG index) {
    This->lpVtbl->StringCollectionChange(This,collection,change,index);
}
static __WIDL_INLINE void IWMPEvents4_MediaCollectionMediaAdded(IWMPEvents4* This,IDispatch *media) {
    This->lpVtbl->MediaCollectionMediaAdded(This,media);
}
static __WIDL_INLINE void IWMPEvents4_MediaCollectionMediaRemoved(IWMPEvents4* This,IDispatch *media) {
    This->lpVtbl->MediaCollectionMediaRemoved(This,media);
}
/*** IWMPEvents4 methods ***/
static __WIDL_INLINE void IWMPEvents4_DeviceEstimation(IWMPEvents4* This,IWMPSyncDevice *device,HRESULT result,LONGLONG used_space,LONGLONG estimated_space) {
    This->lpVtbl->DeviceEstimation(This,device,result,used_space,estimated_space);
}
#endif
#endif

#endif


#endif  /* __IWMPEvents4_INTERFACE_DEFINED__ */

/*****************************************************************************
 * _WMPOCXEvents interface
 */
#ifndef ___WMPOCXEvents_INTERFACE_DEFINED__
#define ___WMPOCXEvents_INTERFACE_DEFINED__

DEFINE_GUID(IID__WMPOCXEvents, 0x6bf52a51, 0x394a, 0x11d3, 0xb1,0x53, 0x00,0xc0,0x4f,0x79,0xfa,0xa6);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("6bf52a51-394a-11d3-b153-00c04f79faa6")
_WMPOCXEvents : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(_WMPOCXEvents, 0x6bf52a51, 0x394a, 0x11d3, 0xb1,0x53, 0x00,0xc0,0x4f,0x79,0xfa,0xa6)
#endif
#else
typedef struct _WMPOCXEventsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    END_INTERFACE
} _WMPOCXEventsVtbl;

interface _WMPOCXEvents {
    CONST_VTBL _WMPOCXEventsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define _WMPOCXEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define _WMPOCXEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define _WMPOCXEvents_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define _WMPOCXEvents_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define _WMPOCXEvents_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define _WMPOCXEvents_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define _WMPOCXEvents_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT _WMPOCXEvents_QueryInterface(_WMPOCXEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG _WMPOCXEvents_AddRef(_WMPOCXEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG _WMPOCXEvents_Release(_WMPOCXEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT _WMPOCXEvents_GetTypeInfoCount(_WMPOCXEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT _WMPOCXEvents_GetTypeInfo(_WMPOCXEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT _WMPOCXEvents_GetIDsOfNames(_WMPOCXEvents* 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 _WMPOCXEvents_Invoke(_WMPOCXEvents* 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);
}
#endif
#endif

#endif


#endif  /* ___WMPOCXEvents_INTERFACE_DEFINED__ */

/*****************************************************************************
 * WindowsMediaPlayer coclass
 */

DEFINE_GUID(CLSID_WindowsMediaPlayer, 0x6bf52a52, 0x394a, 0x11d3, 0xb1,0x53, 0x00,0xc0,0x4f,0x79,0xfa,0xa6);

#ifdef __cplusplus
class DECLSPEC_UUID("6bf52a52-394a-11d3-b153-00c04f79faa6") WindowsMediaPlayer;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(WindowsMediaPlayer, 0x6bf52a52, 0x394a, 0x11d3, 0xb1,0x53, 0x00,0xc0,0x4f,0x79,0xfa,0xa6)
#endif
#endif

#endif /* __WMPLib_LIBRARY_DEFINED__ */
/* Begin additional prototypes for all interfaces */

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 *);
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 *);

/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __wmp_h__ */
