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

/* 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 FORCEINLINE HRESULT IWMPPlaylist_QueryInterface(IWMPPlaylist* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMPPlaylist_AddRef(IWMPPlaylist* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMPPlaylist_Release(IWMPPlaylist* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IWMPPlaylist_GetTypeInfoCount(IWMPPlaylist* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IWMPPlaylist_GetTypeInfo(IWMPPlaylist* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE 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 FORCEINLINE 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 FORCEINLINE HRESULT IWMPPlaylist_get_count(IWMPPlaylist* This,LONG *plCount) {
    return This->lpVtbl->get_count(This,plCount);
}
static FORCEINLINE HRESULT IWMPPlaylist_get_name(IWMPPlaylist* This,BSTR *pbstrName) {
    return This->lpVtbl->get_name(This,pbstrName);
}
static FORCEINLINE HRESULT IWMPPlaylist_put_name(IWMPPlaylist* This,BSTR pbstrName) {
    return This->lpVtbl->put_name(This,pbstrName);
}
static FORCEINLINE HRESULT IWMPPlaylist_get_attributeCount(IWMPPlaylist* This,LONG *plCount) {
    return This->lpVtbl->get_attributeCount(This,plCount);
}
static FORCEINLINE HRESULT IWMPPlaylist_get_attributeName(IWMPPlaylist* This,LONG lIndex,BSTR *pbstrAttributeName) {
    return This->lpVtbl->get_attributeName(This,lIndex,pbstrAttributeName);
}
static FORCEINLINE HRESULT IWMPPlaylist_get_Item(IWMPPlaylist* This,LONG lIndex,IWMPMedia **ppIWMPMedia) {
    return This->lpVtbl->get_Item(This,lIndex,ppIWMPMedia);
}
static FORCEINLINE HRESULT IWMPPlaylist_getItemInfo(IWMPPlaylist* This,BSTR bstrName,BSTR *pbstrVal) {
    return This->lpVtbl->getItemInfo(This,bstrName,pbstrVal);
}
static FORCEINLINE HRESULT IWMPPlaylist_setItemInfo(IWMPPlaylist* This,BSTR bstrName,BSTR bstrValue) {
    return This->lpVtbl->setItemInfo(This,bstrName,bstrValue);
}
static FORCEINLINE HRESULT IWMPPlaylist_get_isIdentical(IWMPPlaylist* This,IWMPPlaylist *pIWMPPlaylist,VARIANT_BOOL *pvbool) {
    return This->lpVtbl->get_isIdentical(This,pIWMPPlaylist,pvbool);
}
static FORCEINLINE HRESULT IWMPPlaylist_clear(IWMPPlaylist* This) {
    return This->lpVtbl->clear(This);
}
static FORCEINLINE HRESULT IWMPPlaylist_insertItem(IWMPPlaylist* This,LONG lIndex,IWMPMedia *pIWMPMedia) {
    return This->lpVtbl->insertItem(This,lIndex,pIWMPMedia);
}
static FORCEINLINE HRESULT IWMPPlaylist_appendItem(IWMPPlaylist* This,IWMPMedia *pIWMPMedia) {
    return This->lpVtbl->appendItem(This,pIWMPMedia);
}
static FORCEINLINE HRESULT IWMPPlaylist_removeItem(IWMPPlaylist* This,IWMPMedia *pIWMPMedia) {
    return This->lpVtbl->removeItem(This,pIWMPMedia);
}
static FORCEINLINE 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 FORCEINLINE HRESULT IWMPMedia_QueryInterface(IWMPMedia* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMPMedia_AddRef(IWMPMedia* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMPMedia_Release(IWMPMedia* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IWMPMedia_GetTypeInfoCount(IWMPMedia* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IWMPMedia_GetTypeInfo(IWMPMedia* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE 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 FORCEINLINE 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 FORCEINLINE HRESULT IWMPMedia_get_isIdentical(IWMPMedia* This,IWMPMedia *pIWMPMedia,VARIANT_BOOL *pvbool) {
    return This->lpVtbl->get_isIdentical(This,pIWMPMedia,pvbool);
}
static FORCEINLINE HRESULT IWMPMedia_get_sourceURL(IWMPMedia* This,BSTR *pbstrSourceURL) {
    return This->lpVtbl->get_sourceURL(This,pbstrSourceURL);
}
static FORCEINLINE HRESULT IWMPMedia_get_name(IWMPMedia* This,BSTR *pbstrName) {
    return This->lpVtbl->get_name(This,pbstrName);
}
static FORCEINLINE HRESULT IWMPMedia_put_name(IWMPMedia* This,BSTR pbstrName) {
    return This->lpVtbl->put_name(This,pbstrName);
}
static FORCEINLINE HRESULT IWMPMedia_get_imageSourceWidth(IWMPMedia* This,LONG *pWidth) {
    return This->lpVtbl->get_imageSourceWidth(This,pWidth);
}
static FORCEINLINE HRESULT IWMPMedia_get_imageSourceHeight(IWMPMedia* This,LONG *pHeight) {
    return This->lpVtbl->get_imageSourceHeight(This,pHeight);
}
static FORCEINLINE HRESULT IWMPMedia_get_markerCount(IWMPMedia* This,LONG *pMarkerCount) {
    return This->lpVtbl->get_markerCount(This,pMarkerCount);
}
static FORCEINLINE HRESULT IWMPMedia_getMarkerTime(IWMPMedia* This,LONG MarkerNum,double *pMarkerTime) {
    return This->lpVtbl->getMarkerTime(This,MarkerNum,pMarkerTime);
}
static FORCEINLINE HRESULT IWMPMedia_getMarkerName(IWMPMedia* This,LONG MarkerNum,BSTR *pbstrMarkerName) {
    return This->lpVtbl->getMarkerName(This,MarkerNum,pbstrMarkerName);
}
static FORCEINLINE HRESULT IWMPMedia_get_duration(IWMPMedia* This,double *pDuration) {
    return This->lpVtbl->get_duration(This,pDuration);
}
static FORCEINLINE HRESULT IWMPMedia_get_durationString(IWMPMedia* This,BSTR *pbstrDuration) {
    return This->lpVtbl->get_durationString(This,pbstrDuration);
}
static FORCEINLINE HRESULT IWMPMedia_get_attributeCount(IWMPMedia* This,LONG *plCount) {
    return This->lpVtbl->get_attributeCount(This,plCount);
}
static FORCEINLINE HRESULT IWMPMedia_getAttributeName(IWMPMedia* This,LONG lIndex,BSTR *pbstrItemName) {
    return This->lpVtbl->getAttributeName(This,lIndex,pbstrItemName);
}
static FORCEINLINE HRESULT IWMPMedia_getItemInfo(IWMPMedia* This,BSTR bstrItemName,BSTR *pbstrVal) {
    return This->lpVtbl->getItemInfo(This,bstrItemName,pbstrVal);
}
static FORCEINLINE HRESULT IWMPMedia_setItemInfo(IWMPMedia* This,BSTR bstrItemName,BSTR bstrVal) {
    return This->lpVtbl->setItemInfo(This,bstrItemName,bstrVal);
}
static FORCEINLINE HRESULT IWMPMedia_getItemInfoByAtom(IWMPMedia* This,LONG lAtom,BSTR *pbstrVal) {
    return This->lpVtbl->getItemInfoByAtom(This,lAtom,pbstrVal);
}
static FORCEINLINE HRESULT IWMPMedia_isMemberOf(IWMPMedia* This,IWMPPlaylist *pPlaylist,VARIANT_BOOL *pvarfIsMemberOf) {
    return This->lpVtbl->isMemberOf(This,pPlaylist,pvarfIsMemberOf);
}
static FORCEINLINE 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 FORCEINLINE HRESULT IWMPControls_QueryInterface(IWMPControls* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMPControls_AddRef(IWMPControls* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMPControls_Release(IWMPControls* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IWMPControls_GetTypeInfoCount(IWMPControls* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IWMPControls_GetTypeInfo(IWMPControls* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE 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 FORCEINLINE 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 FORCEINLINE HRESULT IWMPControls_get_isAvailable(IWMPControls* This,BSTR bstrItem,VARIANT_BOOL *pIsAvailable) {
    return This->lpVtbl->get_isAvailable(This,bstrItem,pIsAvailable);
}
static FORCEINLINE HRESULT IWMPControls_play(IWMPControls* This) {
    return This->lpVtbl->play(This);
}
static FORCEINLINE HRESULT IWMPControls_stop(IWMPControls* This) {
    return This->lpVtbl->stop(This);
}
static FORCEINLINE HRESULT IWMPControls_pause(IWMPControls* This) {
    return This->lpVtbl->pause(This);
}
static FORCEINLINE HRESULT IWMPControls_fastForward(IWMPControls* This) {
    return This->lpVtbl->fastForward(This);
}
static FORCEINLINE HRESULT IWMPControls_fastReverse(IWMPControls* This) {
    return This->lpVtbl->fastReverse(This);
}
static FORCEINLINE HRESULT IWMPControls_get_currentPosition(IWMPControls* This,double *pdCurrentPosition) {
    return This->lpVtbl->get_currentPosition(This,pdCurrentPosition);
}
static FORCEINLINE HRESULT IWMPControls_put_currentPosition(IWMPControls* This,double pdCurrentPosition) {
    return This->lpVtbl->put_currentPosition(This,pdCurrentPosition);
}
static FORCEINLINE HRESULT IWMPControls_get_currentPositionString(IWMPControls* This,BSTR *pbstrCurrentPosition) {
    return This->lpVtbl->get_currentPositionString(This,pbstrCurrentPosition);
}
static FORCEINLINE HRESULT IWMPControls_next(IWMPControls* This) {
    return This->lpVtbl->next(This);
}
static FORCEINLINE HRESULT IWMPControls_previous(IWMPControls* This) {
    return This->lpVtbl->previous(This);
}
static FORCEINLINE HRESULT IWMPControls_currentItem(IWMPControls* This,IWMPMedia **ppIWMPMedia) {
    return This->lpVtbl->currentItem(This,ppIWMPMedia);
}
static FORCEINLINE HRESULT IWMPControls_put_currentItem(IWMPControls* This,IWMPMedia *ppIWMPMedia) {
    return This->lpVtbl->put_currentItem(This,ppIWMPMedia);
}
static FORCEINLINE HRESULT IWMPControls_get_currentMarker(IWMPControls* This,LONG *plMarker) {
    return This->lpVtbl->get_currentMarker(This,plMarker);
}
static FORCEINLINE HRESULT IWMPControls_put_currentMarker(IWMPControls* This,LONG plMarker) {
    return This->lpVtbl->put_currentMarker(This,plMarker);
}
static FORCEINLINE 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 FORCEINLINE HRESULT IWMPControls2_QueryInterface(IWMPControls2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMPControls2_AddRef(IWMPControls2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMPControls2_Release(IWMPControls2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IWMPControls2_GetTypeInfoCount(IWMPControls2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IWMPControls2_GetTypeInfo(IWMPControls2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE 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 FORCEINLINE 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 FORCEINLINE HRESULT IWMPControls2_get_isAvailable(IWMPControls2* This,BSTR bstrItem,VARIANT_BOOL *pIsAvailable) {
    return This->lpVtbl->get_isAvailable(This,bstrItem,pIsAvailable);
}
static FORCEINLINE HRESULT IWMPControls2_play(IWMPControls2* This) {
    return This->lpVtbl->play(This);
}
static FORCEINLINE HRESULT IWMPControls2_stop(IWMPControls2* This) {
    return This->lpVtbl->stop(This);
}
static FORCEINLINE HRESULT IWMPControls2_pause(IWMPControls2* This) {
    return This->lpVtbl->pause(This);
}
static FORCEINLINE HRESULT IWMPControls2_fastForward(IWMPControls2* This) {
    return This->lpVtbl->fastForward(This);
}
static FORCEINLINE HRESULT IWMPControls2_fastReverse(IWMPControls2* This) {
    return This->lpVtbl->fastReverse(This);
}
static FORCEINLINE HRESULT IWMPControls2_get_currentPosition(IWMPControls2* This,double *pdCurrentPosition) {
    return This->lpVtbl->get_currentPosition(This,pdCurrentPosition);
}
static FORCEINLINE HRESULT IWMPControls2_put_currentPosition(IWMPControls2* This,double pdCurrentPosition) {
    return This->lpVtbl->put_currentPosition(This,pdCurrentPosition);
}
static FORCEINLINE HRESULT IWMPControls2_get_currentPositionString(IWMPControls2* This,BSTR *pbstrCurrentPosition) {
    return This->lpVtbl->get_currentPositionString(This,pbstrCurrentPosition);
}
static FORCEINLINE HRESULT IWMPControls2_next(IWMPControls2* This) {
    return This->lpVtbl->next(This);
}
static FORCEINLINE HRESULT IWMPControls2_previous(IWMPControls2* This) {
    return This->lpVtbl->previous(This);
}
static FORCEINLINE HRESULT IWMPControls2_currentItem(IWMPControls2* This,IWMPMedia **ppIWMPMedia) {
    return This->lpVtbl->currentItem(This,ppIWMPMedia);
}
static FORCEINLINE HRESULT IWMPControls2_put_currentItem(IWMPControls2* This,IWMPMedia *ppIWMPMedia) {
    return This->lpVtbl->put_currentItem(This,ppIWMPMedia);
}
static FORCEINLINE HRESULT IWMPControls2_get_currentMarker(IWMPControls2* This,LONG *plMarker) {
    return This->lpVtbl->get_currentMarker(This,plMarker);
}
static FORCEINLINE HRESULT IWMPControls2_put_currentMarker(IWMPControls2* This,LONG plMarker) {
    return This->lpVtbl->put_currentMarker(This,plMarker);
}
static FORCEINLINE HRESULT IWMPControls2_playItem(IWMPControls2* This,IWMPMedia *pIWMPMedia) {
    return This->lpVtbl->playItem(This,pIWMPMedia);
}
/*** IWMPControls2 methods ***/
static FORCEINLINE 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 FORCEINLINE HRESULT IWMPRemoteMediaServices_QueryInterface(IWMPRemoteMediaServices* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMPRemoteMediaServices_AddRef(IWMPRemoteMediaServices* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMPRemoteMediaServices_Release(IWMPRemoteMediaServices* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMPRemoteMediaServices methods ***/
static FORCEINLINE HRESULT IWMPRemoteMediaServices_GetServiceType(IWMPRemoteMediaServices* This,BSTR *type) {
    return This->lpVtbl->GetServiceType(This,type);
}
static FORCEINLINE HRESULT IWMPRemoteMediaServices_GetApplicationName(IWMPRemoteMediaServices* This,BSTR *name) {
    return This->lpVtbl->GetApplicationName(This,name);
}
static FORCEINLINE HRESULT IWMPRemoteMediaServices_GetScriptableObject(IWMPRemoteMediaServices* This,BSTR *name,IDispatch **out) {
    return This->lpVtbl->GetScriptableObject(This,name,out);
}
static FORCEINLINE 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 FORCEINLINE HRESULT IWMPSettings_QueryInterface(IWMPSettings* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMPSettings_AddRef(IWMPSettings* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMPSettings_Release(IWMPSettings* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IWMPSettings_GetTypeInfoCount(IWMPSettings* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IWMPSettings_GetTypeInfo(IWMPSettings* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE 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 FORCEINLINE 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 FORCEINLINE HRESULT IWMPSettings_get_isAvailable(IWMPSettings* This,BSTR bstrItem,VARIANT_BOOL *pIsAvailable) {
    return This->lpVtbl->get_isAvailable(This,bstrItem,pIsAvailable);
}
static FORCEINLINE HRESULT IWMPSettings_get_autoStart(IWMPSettings* This,VARIANT_BOOL *pfAutoStart) {
    return This->lpVtbl->get_autoStart(This,pfAutoStart);
}
static FORCEINLINE HRESULT IWMPSettings_put_autoStart(IWMPSettings* This,VARIANT_BOOL pfAutoStart) {
    return This->lpVtbl->put_autoStart(This,pfAutoStart);
}
static FORCEINLINE HRESULT IWMPSettings_get_baseURL(IWMPSettings* This,BSTR *pbstrBaseURL) {
    return This->lpVtbl->get_baseURL(This,pbstrBaseURL);
}
static FORCEINLINE HRESULT IWMPSettings_put_baseURL(IWMPSettings* This,BSTR pbstrBaseURL) {
    return This->lpVtbl->put_baseURL(This,pbstrBaseURL);
}
static FORCEINLINE HRESULT IWMPSettings_get_defaultFrame(IWMPSettings* This,BSTR *pbstrDefaultFrame) {
    return This->lpVtbl->get_defaultFrame(This,pbstrDefaultFrame);
}
static FORCEINLINE HRESULT IWMPSettings_put_defaultFrame(IWMPSettings* This,BSTR pbstrDefaultFrame) {
    return This->lpVtbl->put_defaultFrame(This,pbstrDefaultFrame);
}
static FORCEINLINE HRESULT IWMPSettings_get_invokeURLs(IWMPSettings* This,VARIANT_BOOL *pfInvokeURLs) {
    return This->lpVtbl->get_invokeURLs(This,pfInvokeURLs);
}
static FORCEINLINE HRESULT IWMPSettings_put_invokeURLs(IWMPSettings* This,VARIANT_BOOL pfInvokeURLs) {
    return This->lpVtbl->put_invokeURLs(This,pfInvokeURLs);
}
static FORCEINLINE HRESULT IWMPSettings_get_mute(IWMPSettings* This,VARIANT_BOOL *pfMute) {
    return This->lpVtbl->get_mute(This,pfMute);
}
static FORCEINLINE HRESULT IWMPSettings_put_mute(IWMPSettings* This,VARIANT_BOOL pfMute) {
    return This->lpVtbl->put_mute(This,pfMute);
}
static FORCEINLINE HRESULT IWMPSettings_get_playCount(IWMPSettings* This,LONG *plCount) {
    return This->lpVtbl->get_playCount(This,plCount);
}
static FORCEINLINE HRESULT IWMPSettings_put_playCount(IWMPSettings* This,LONG plCount) {
    return This->lpVtbl->put_playCount(This,plCount);
}
static FORCEINLINE HRESULT IWMPSettings_get_rate(IWMPSettings* This,double *pdRate) {
    return This->lpVtbl->get_rate(This,pdRate);
}
static FORCEINLINE HRESULT IWMPSettings_put_rate(IWMPSettings* This,double pdRate) {
    return This->lpVtbl->put_rate(This,pdRate);
}
static FORCEINLINE HRESULT IWMPSettings_get_balance(IWMPSettings* This,LONG *plBalance) {
    return This->lpVtbl->get_balance(This,plBalance);
}
static FORCEINLINE HRESULT IWMPSettings_put_balance(IWMPSettings* This,LONG plBalance) {
    return This->lpVtbl->put_balance(This,plBalance);
}
static FORCEINLINE HRESULT IWMPSettings_get_volume(IWMPSettings* This,LONG *plVolume) {
    return This->lpVtbl->get_volume(This,plVolume);
}
static FORCEINLINE HRESULT IWMPSettings_put_volume(IWMPSettings* This,LONG plVolume) {
    return This->lpVtbl->put_volume(This,plVolume);
}
static FORCEINLINE HRESULT IWMPSettings_getMode(IWMPSettings* This,BSTR bstrMode,VARIANT_BOOL *pvarfMode) {
    return This->lpVtbl->getMode(This,bstrMode,pvarfMode);
}
static FORCEINLINE HRESULT IWMPSettings_setMode(IWMPSettings* This,BSTR bstrMode,VARIANT_BOOL varfMode) {
    return This->lpVtbl->setMode(This,bstrMode,varfMode);
}
static FORCEINLINE HRESULT IWMPSettings_get_enableErrorDialogs(IWMPSettings* This,VARIANT_BOOL *pfEnableErrorDialogs) {
    return This->lpVtbl->get_enableErrorDialogs(This,pfEnableErrorDialogs);
}
static FORCEINLINE 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 FORCEINLINE HRESULT IWMPStringCollection_QueryInterface(IWMPStringCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMPStringCollection_AddRef(IWMPStringCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMPStringCollection_Release(IWMPStringCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IWMPStringCollection_GetTypeInfoCount(IWMPStringCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IWMPStringCollection_GetTypeInfo(IWMPStringCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE 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 FORCEINLINE 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 FORCEINLINE HRESULT IWMPStringCollection_get_count(IWMPStringCollection* This,LONG *plCount) {
    return This->lpVtbl->get_count(This,plCount);
}
static FORCEINLINE 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 FORCEINLINE HRESULT IWMPMediaCollection_QueryInterface(IWMPMediaCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMPMediaCollection_AddRef(IWMPMediaCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMPMediaCollection_Release(IWMPMediaCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IWMPMediaCollection_GetTypeInfoCount(IWMPMediaCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IWMPMediaCollection_GetTypeInfo(IWMPMediaCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE 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 FORCEINLINE 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 FORCEINLINE HRESULT IWMPMediaCollection_add(IWMPMediaCollection* This,BSTR bstrURL,IWMPMedia **ppItem) {
    return This->lpVtbl->add(This,bstrURL,ppItem);
}
static FORCEINLINE HRESULT IWMPMediaCollection_getAll(IWMPMediaCollection* This,IWMPPlaylist **ppMediaItems) {
    return This->lpVtbl->getAll(This,ppMediaItems);
}
static FORCEINLINE HRESULT IWMPMediaCollection_getByName(IWMPMediaCollection* This,BSTR bstrName,IWMPPlaylist **ppMediaItems) {
    return This->lpVtbl->getByName(This,bstrName,ppMediaItems);
}
static FORCEINLINE HRESULT IWMPMediaCollection_getByGenre(IWMPMediaCollection* This,BSTR bstrGenre,IWMPPlaylist **ppMediaItems) {
    return This->lpVtbl->getByGenre(This,bstrGenre,ppMediaItems);
}
static FORCEINLINE HRESULT IWMPMediaCollection_getByAuthor(IWMPMediaCollection* This,BSTR bstrAuthor,IWMPPlaylist **ppMediaItems) {
    return This->lpVtbl->getByAuthor(This,bstrAuthor,ppMediaItems);
}
static FORCEINLINE HRESULT IWMPMediaCollection_getByAlbum(IWMPMediaCollection* This,BSTR bstrAlbum,IWMPPlaylist **ppMediaItems) {
    return This->lpVtbl->getByAlbum(This,bstrAlbum,ppMediaItems);
}
static FORCEINLINE HRESULT IWMPMediaCollection_getByAttribute(IWMPMediaCollection* This,BSTR bstrAttribute,BSTR bstrValue,IWMPPlaylist **ppMediaItems) {
    return This->lpVtbl->getByAttribute(This,bstrAttribute,bstrValue,ppMediaItems);
}
static FORCEINLINE HRESULT IWMPMediaCollection_remove(IWMPMediaCollection* This,IWMPMedia *pItem,VARIANT_BOOL varfDeleteFile) {
    return This->lpVtbl->remove(This,pItem,varfDeleteFile);
}
static FORCEINLINE HRESULT IWMPMediaCollection_getAttributeStringCollection(IWMPMediaCollection* This,BSTR bstrAttribute,BSTR bstrMediaType,IWMPStringCollection **ppStringCollection) {
    return This->lpVtbl->getAttributeStringCollection(This,bstrAttribute,bstrMediaType,ppStringCollection);
}
static FORCEINLINE HRESULT IWMPMediaCollection_getMediaAtom(IWMPMediaCollection* This,BSTR bstrItemName,LONG *plAtom) {
    return This->lpVtbl->getMediaAtom(This,bstrItemName,plAtom);
}
static FORCEINLINE HRESULT IWMPMediaCollection_setDeleted(IWMPMediaCollection* This,IWMPMedia *pItem,VARIANT_BOOL varfIsDeleted) {
    return This->lpVtbl->setDeleted(This,pItem,varfIsDeleted);
}
static FORCEINLINE 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 FORCEINLINE HRESULT IWMPPlaylistArray_QueryInterface(IWMPPlaylistArray* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMPPlaylistArray_AddRef(IWMPPlaylistArray* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMPPlaylistArray_Release(IWMPPlaylistArray* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IWMPPlaylistArray_GetTypeInfoCount(IWMPPlaylistArray* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IWMPPlaylistArray_GetTypeInfo(IWMPPlaylistArray* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE 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 FORCEINLINE 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 FORCEINLINE HRESULT IWMPPlaylistArray_get_count(IWMPPlaylistArray* This,LONG *plCount) {
    return This->lpVtbl->get_count(This,plCount);
}
static FORCEINLINE 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 FORCEINLINE HRESULT IWMPPlaylistCollection_QueryInterface(IWMPPlaylistCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMPPlaylistCollection_AddRef(IWMPPlaylistCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMPPlaylistCollection_Release(IWMPPlaylistCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IWMPPlaylistCollection_GetTypeInfoCount(IWMPPlaylistCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IWMPPlaylistCollection_GetTypeInfo(IWMPPlaylistCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE 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 FORCEINLINE 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 FORCEINLINE HRESULT IWMPPlaylistCollection_newPlaylist(IWMPPlaylistCollection* This,BSTR bstrName,IWMPPlaylist **ppItem) {
    return This->lpVtbl->newPlaylist(This,bstrName,ppItem);
}
static FORCEINLINE HRESULT IWMPPlaylistCollection_getAll(IWMPPlaylistCollection* This,IWMPPlaylistArray **ppPlaylistArray) {
    return This->lpVtbl->getAll(This,ppPlaylistArray);
}
static FORCEINLINE HRESULT IWMPPlaylistCollection_getByName(IWMPPlaylistCollection* This,BSTR bstrName,IWMPPlaylistArray **ppPlaylistArray) {
    return This->lpVtbl->getByName(This,bstrName,ppPlaylistArray);
}
static FORCEINLINE HRESULT IWMPPlaylistCollection_remove(IWMPPlaylistCollection* This,IWMPPlaylist *pItem) {
    return This->lpVtbl->remove(This,pItem);
}
static FORCEINLINE HRESULT IWMPPlaylistCollection_setDeleted(IWMPPlaylistCollection* This,IWMPPlaylist *pItem,VARIANT_BOOL varfIsDeleted) {
    return This->lpVtbl->setDeleted(This,pItem,varfIsDeleted);
}
static FORCEINLINE HRESULT IWMPPlaylistCollection_isDeleted(IWMPPlaylistCollection* This,IWMPPlaylist *pItem,VARIANT_BOOL *pvarfIsDeleted) {
    return This->lpVtbl->isDeleted(This,pItem,pvarfIsDeleted);
}
static FORCEINLINE 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 FORCEINLINE HRESULT IWMPNetwork_QueryInterface(IWMPNetwork* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMPNetwork_AddRef(IWMPNetwork* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMPNetwork_Release(IWMPNetwork* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IWMPNetwork_GetTypeInfoCount(IWMPNetwork* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IWMPNetwork_GetTypeInfo(IWMPNetwork* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE 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 FORCEINLINE 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 FORCEINLINE HRESULT IWMPNetwork_get_bandWidth(IWMPNetwork* This,LONG *plBandwidth) {
    return This->lpVtbl->get_bandWidth(This,plBandwidth);
}
static FORCEINLINE HRESULT IWMPNetwork_get_recoveredPackets(IWMPNetwork* This,LONG *plRecoveredPackets) {
    return This->lpVtbl->get_recoveredPackets(This,plRecoveredPackets);
}
static FORCEINLINE HRESULT IWMPNetwork_get_sourceProtocol(IWMPNetwork* This,BSTR *pbstrSourceProtocol) {
    return This->lpVtbl->get_sourceProtocol(This,pbstrSourceProtocol);
}
static FORCEINLINE HRESULT IWMPNetwork_get_receivedPackets(IWMPNetwork* This,LONG *plReceivedPackets) {
    return This->lpVtbl->get_receivedPackets(This,plReceivedPackets);
}
static FORCEINLINE HRESULT IWMPNetwork_get_lostPackets(IWMPNetwork* This,LONG *plLostPackets) {
    return This->lpVtbl->get_lostPackets(This,plLostPackets);
}
static FORCEINLINE HRESULT IWMPNetwork_get_receptionQuality(IWMPNetwork* This,LONG *plReceptionQuality) {
    return This->lpVtbl->get_receptionQuality(This,plReceptionQuality);
}
static FORCEINLINE HRESULT IWMPNetwork_get_bufferingCount(IWMPNetwork* This,LONG *plBufferingCount) {
    return This->lpVtbl->get_bufferingCount(This,plBufferingCount);
}
static FORCEINLINE HRESULT IWMPNetwork_get_bufferingProgress(IWMPNetwork* This,LONG *plBufferingProgress) {
    return This->lpVtbl->get_bufferingProgress(This,plBufferingProgress);
}
static FORCEINLINE HRESULT IWMPNetwork_get_bufferingTime(IWMPNetwork* This,LONG *plBufferingTime) {
    return This->lpVtbl->get_bufferingTime(This,plBufferingTime);
}
static FORCEINLINE HRESULT IWMPNetwork_put_bufferingTime(IWMPNetwork* This,LONG plBufferingTime) {
    return This->lpVtbl->put_bufferingTime(This,plBufferingTime);
}
static FORCEINLINE HRESULT IWMPNetwork_get_frameRate(IWMPNetwork* This,LONG *plFrameRate) {
    return This->lpVtbl->get_frameRate(This,plFrameRate);
}
static FORCEINLINE HRESULT IWMPNetwork_get_maxBitRate(IWMPNetwork* This,LONG *plBitRate) {
    return This->lpVtbl->get_maxBitRate(This,plBitRate);
}
static FORCEINLINE HRESULT IWMPNetwork_get_bitRate(IWMPNetwork* This,LONG *plBitRate) {
    return This->lpVtbl->get_bitRate(This,plBitRate);
}
static FORCEINLINE HRESULT IWMPNetwork_getProxySettings(IWMPNetwork* This,BSTR bstrProtocol,LONG *plProxySetting) {
    return This->lpVtbl->getProxySettings(This,bstrProtocol,plProxySetting);
}
static FORCEINLINE HRESULT IWMPNetwork_setProxySettings(IWMPNetwork* This,BSTR bstrProtocol,LONG lProxySetting) {
    return This->lpVtbl->setProxySettings(This,bstrProtocol,lProxySetting);
}
static FORCEINLINE HRESULT IWMPNetwork_getProxyName(IWMPNetwork* This,BSTR bstrProtocol,BSTR *pbstrProxyName) {
    return This->lpVtbl->getProxyName(This,bstrProtocol,pbstrProxyName);
}
static FORCEINLINE HRESULT IWMPNetwork_setProxyName(IWMPNetwork* This,BSTR bstrProtocol,BSTR bstrProxyName) {
    return This->lpVtbl->setProxyName(This,bstrProtocol,bstrProxyName);
}
static FORCEINLINE HRESULT IWMPNetwork_getProxyPort(IWMPNetwork* This,BSTR bstrProtocol,LONG *lProxyPort) {
    return This->lpVtbl->getProxyPort(This,bstrProtocol,lProxyPort);
}
static FORCEINLINE HRESULT IWMPNetwork_setProxyPort(IWMPNetwork* This,BSTR bstrProtocol,LONG lProxyPort) {
    return This->lpVtbl->setProxyPort(This,bstrProtocol,lProxyPort);
}
static FORCEINLINE HRESULT IWMPNetwork_getProxyExceptionList(IWMPNetwork* This,BSTR bstrProtocol,BSTR *pbstrExceptionList) {
    return This->lpVtbl->getProxyExceptionList(This,bstrProtocol,pbstrExceptionList);
}
static FORCEINLINE HRESULT IWMPNetwork_setProxyExceptionList(IWMPNetwork* This,BSTR bstrProtocol,BSTR pbstrExceptionList) {
    return This->lpVtbl->setProxyExceptionList(This,bstrProtocol,pbstrExceptionList);
}
static FORCEINLINE HRESULT IWMPNetwork_getProxyBypassForLocal(IWMPNetwork* This,BSTR bstrProtocol,VARIANT_BOOL *pfBypassForLocal) {
    return This->lpVtbl->getProxyBypassForLocal(This,bstrProtocol,pfBypassForLocal);
}
static FORCEINLINE HRESULT IWMPNetwork_setProxyBypassForLocal(IWMPNetwork* This,BSTR bstrProtocol,VARIANT_BOOL fBypassForLocal) {
    return This->lpVtbl->setProxyBypassForLocal(This,bstrProtocol,fBypassForLocal);
}
static FORCEINLINE HRESULT IWMPNetwork_get_maxBandwidth(IWMPNetwork* This,LONG *lMaxBandwidth) {
    return This->lpVtbl->get_maxBandwidth(This,lMaxBandwidth);
}
static FORCEINLINE HRESULT IWMPNetwork_put_maxBandwidth(IWMPNetwork* This,LONG lMaxBandwidth) {
    return This->lpVtbl->put_maxBandwidth(This,lMaxBandwidth);
}
static FORCEINLINE HRESULT IWMPNetwork_get_downloadProgress(IWMPNetwork* This,LONG *plDownloadProgress) {
    return This->lpVtbl->get_downloadProgress(This,plDownloadProgress);
}
static FORCEINLINE HRESULT IWMPNetwork_get_encodedFrameRate(IWMPNetwork* This,LONG *plFrameRate) {
    return This->lpVtbl->get_encodedFrameRate(This,plFrameRate);
}
static FORCEINLINE 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 FORCEINLINE HRESULT IWMPCdrom_QueryInterface(IWMPCdrom* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMPCdrom_AddRef(IWMPCdrom* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMPCdrom_Release(IWMPCdrom* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IWMPCdrom_GetTypeInfoCount(IWMPCdrom* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IWMPCdrom_GetTypeInfo(IWMPCdrom* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE 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 FORCEINLINE 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 FORCEINLINE HRESULT IWMPCdrom_get_driveSpecifier(IWMPCdrom* This,BSTR *pbstrDrive) {
    return This->lpVtbl->get_driveSpecifier(This,pbstrDrive);
}
static FORCEINLINE HRESULT IWMPCdrom_get_Playlist(IWMPCdrom* This,IWMPPlaylist **ppPlaylist) {
    return This->lpVtbl->get_Playlist(This,ppPlaylist);
}
static FORCEINLINE 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 FORCEINLINE HRESULT IWMPCdromCollection_QueryInterface(IWMPCdromCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMPCdromCollection_AddRef(IWMPCdromCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMPCdromCollection_Release(IWMPCdromCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IWMPCdromCollection_GetTypeInfoCount(IWMPCdromCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IWMPCdromCollection_GetTypeInfo(IWMPCdromCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE 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 FORCEINLINE 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 FORCEINLINE HRESULT IWMPCdromCollection_get_count(IWMPCdromCollection* This,LONG *plCount) {
    return This->lpVtbl->get_count(This,plCount);
}
static FORCEINLINE HRESULT IWMPCdromCollection_Item(IWMPCdromCollection* This,LONG lIndex,IWMPCdrom **ppItem) {
    return This->lpVtbl->Item(This,lIndex,ppItem);
}
static FORCEINLINE 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 FORCEINLINE HRESULT IWMPDVD_QueryInterface(IWMPDVD* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMPDVD_AddRef(IWMPDVD* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMPDVD_Release(IWMPDVD* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IWMPDVD_GetTypeInfoCount(IWMPDVD* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IWMPDVD_GetTypeInfo(IWMPDVD* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE 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 FORCEINLINE 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 FORCEINLINE HRESULT IWMPDVD_get_isAvailable(IWMPDVD* This,BSTR bstrItem,VARIANT_BOOL *pIsAvailable) {
    return This->lpVtbl->get_isAvailable(This,bstrItem,pIsAvailable);
}
static FORCEINLINE HRESULT IWMPDVD_get_domain(IWMPDVD* This,BSTR *strDomain) {
    return This->lpVtbl->get_domain(This,strDomain);
}
static FORCEINLINE HRESULT IWMPDVD_topMenu(IWMPDVD* This) {
    return This->lpVtbl->topMenu(This);
}
static FORCEINLINE HRESULT IWMPDVD_titleMenu(IWMPDVD* This) {
    return This->lpVtbl->titleMenu(This);
}
static FORCEINLINE HRESULT IWMPDVD_back(IWMPDVD* This) {
    return This->lpVtbl->back(This);
}
static FORCEINLINE 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 FORCEINLINE HRESULT IWMPClosedCaption_QueryInterface(IWMPClosedCaption* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMPClosedCaption_AddRef(IWMPClosedCaption* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMPClosedCaption_Release(IWMPClosedCaption* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IWMPClosedCaption_GetTypeInfoCount(IWMPClosedCaption* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IWMPClosedCaption_GetTypeInfo(IWMPClosedCaption* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE 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 FORCEINLINE 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 FORCEINLINE HRESULT IWMPClosedCaption_get_SAMIStyle(IWMPClosedCaption* This,BSTR *pbstrSAMIStyle) {
    return This->lpVtbl->get_SAMIStyle(This,pbstrSAMIStyle);
}
static FORCEINLINE HRESULT IWMPClosedCaption_put_SAMIStyle(IWMPClosedCaption* This,BSTR pbstrSAMIStyle) {
    return This->lpVtbl->put_SAMIStyle(This,pbstrSAMIStyle);
}
static FORCEINLINE HRESULT IWMPClosedCaption_get_SAMILang(IWMPClosedCaption* This,BSTR *pbstrSAMILang) {
    return This->lpVtbl->get_SAMILang(This,pbstrSAMILang);
}
static FORCEINLINE HRESULT IWMPClosedCaption_put_SAMILang(IWMPClosedCaption* This,BSTR pbstrSAMILang) {
    return This->lpVtbl->put_SAMILang(This,pbstrSAMILang);
}
static FORCEINLINE HRESULT IWMPClosedCaption_get_SAMIFileName(IWMPClosedCaption* This,BSTR *pbstrSAMIFileName) {
    return This->lpVtbl->get_SAMIFileName(This,pbstrSAMIFileName);
}
static FORCEINLINE HRESULT IWMPClosedCaption_put_SAMIFileName(IWMPClosedCaption* This,BSTR pbstrSAMIFileName) {
    return This->lpVtbl->put_SAMIFileName(This,pbstrSAMIFileName);
}
static FORCEINLINE HRESULT IWMPClosedCaption_get_captioningId(IWMPClosedCaption* This,BSTR *pbstrCaptioningID) {
    return This->lpVtbl->get_captioningId(This,pbstrCaptioningID);
}
static FORCEINLINE 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 FORCEINLINE HRESULT IWMPErrorItem_QueryInterface(IWMPErrorItem* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMPErrorItem_AddRef(IWMPErrorItem* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMPErrorItem_Release(IWMPErrorItem* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IWMPErrorItem_GetTypeInfoCount(IWMPErrorItem* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IWMPErrorItem_GetTypeInfo(IWMPErrorItem* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE 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 FORCEINLINE 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 FORCEINLINE HRESULT IWMPErrorItem_get_errorCode(IWMPErrorItem* This,LONG *phr) {
    return This->lpVtbl->get_errorCode(This,phr);
}
static FORCEINLINE HRESULT IWMPErrorItem_get_errorDescription(IWMPErrorItem* This,BSTR *pbstrDescription) {
    return This->lpVtbl->get_errorDescription(This,pbstrDescription);
}
static FORCEINLINE HRESULT IWMPErrorItem_get_errorContext(IWMPErrorItem* This,VARIANT *pvarContext) {
    return This->lpVtbl->get_errorContext(This,pvarContext);
}
static FORCEINLINE HRESULT IWMPErrorItem_get_remedy(IWMPErrorItem* This,LONG *plRemedy) {
    return This->lpVtbl->get_remedy(This,plRemedy);
}
static FORCEINLINE 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 FORCEINLINE HRESULT IWMPMedia2_QueryInterface(IWMPMedia2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMPMedia2_AddRef(IWMPMedia2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMPMedia2_Release(IWMPMedia2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IWMPMedia2_GetTypeInfoCount(IWMPMedia2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IWMPMedia2_GetTypeInfo(IWMPMedia2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE 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 FORCEINLINE 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 FORCEINLINE HRESULT IWMPMedia2_get_isIdentical(IWMPMedia2* This,IWMPMedia *pIWMPMedia,VARIANT_BOOL *pvbool) {
    return This->lpVtbl->get_isIdentical(This,pIWMPMedia,pvbool);
}
static FORCEINLINE HRESULT IWMPMedia2_get_sourceURL(IWMPMedia2* This,BSTR *pbstrSourceURL) {
    return This->lpVtbl->get_sourceURL(This,pbstrSourceURL);
}
static FORCEINLINE HRESULT IWMPMedia2_get_name(IWMPMedia2* This,BSTR *pbstrName) {
    return This->lpVtbl->get_name(This,pbstrName);
}
static FORCEINLINE HRESULT IWMPMedia2_put_name(IWMPMedia2* This,BSTR pbstrName) {
    return This->lpVtbl->put_name(This,pbstrName);
}
static FORCEINLINE HRESULT IWMPMedia2_get_imageSourceWidth(IWMPMedia2* This,LONG *pWidth) {
    return This->lpVtbl->get_imageSourceWidth(This,pWidth);
}
static FORCEINLINE HRESULT IWMPMedia2_get_imageSourceHeight(IWMPMedia2* This,LONG *pHeight) {
    return This->lpVtbl->get_imageSourceHeight(This,pHeight);
}
static FORCEINLINE HRESULT IWMPMedia2_get_markerCount(IWMPMedia2* This,LONG *pMarkerCount) {
    return This->lpVtbl->get_markerCount(This,pMarkerCount);
}
static FORCEINLINE HRESULT IWMPMedia2_getMarkerTime(IWMPMedia2* This,LONG MarkerNum,double *pMarkerTime) {
    return This->lpVtbl->getMarkerTime(This,MarkerNum,pMarkerTime);
}
static FORCEINLINE HRESULT IWMPMedia2_getMarkerName(IWMPMedia2* This,LONG MarkerNum,BSTR *pbstrMarkerName) {
    return This->lpVtbl->getMarkerName(This,MarkerNum,pbstrMarkerName);
}
static FORCEINLINE HRESULT IWMPMedia2_get_duration(IWMPMedia2* This,double *pDuration) {
    return This->lpVtbl->get_duration(This,pDuration);
}
static FORCEINLINE HRESULT IWMPMedia2_get_durationString(IWMPMedia2* This,BSTR *pbstrDuration) {
    return This->lpVtbl->get_durationString(This,pbstrDuration);
}
static FORCEINLINE HRESULT IWMPMedia2_get_attributeCount(IWMPMedia2* This,LONG *plCount) {
    return This->lpVtbl->get_attributeCount(This,plCount);
}
static FORCEINLINE HRESULT IWMPMedia2_getAttributeName(IWMPMedia2* This,LONG lIndex,BSTR *pbstrItemName) {
    return This->lpVtbl->getAttributeName(This,lIndex,pbstrItemName);
}
static FORCEINLINE HRESULT IWMPMedia2_getItemInfo(IWMPMedia2* This,BSTR bstrItemName,BSTR *pbstrVal) {
    return This->lpVtbl->getItemInfo(This,bstrItemName,pbstrVal);
}
static FORCEINLINE HRESULT IWMPMedia2_setItemInfo(IWMPMedia2* This,BSTR bstrItemName,BSTR bstrVal) {
    return This->lpVtbl->setItemInfo(This,bstrItemName,bstrVal);
}
static FORCEINLINE HRESULT IWMPMedia2_getItemInfoByAtom(IWMPMedia2* This,LONG lAtom,BSTR *pbstrVal) {
    return This->lpVtbl->getItemInfoByAtom(This,lAtom,pbstrVal);
}
static FORCEINLINE HRESULT IWMPMedia2_isMemberOf(IWMPMedia2* This,IWMPPlaylist *pPlaylist,VARIANT_BOOL *pvarfIsMemberOf) {
    return This->lpVtbl->isMemberOf(This,pPlaylist,pvarfIsMemberOf);
}
static FORCEINLINE HRESULT IWMPMedia2_isReadOnlyItem(IWMPMedia2* This,BSTR bstrItemName,VARIANT_BOOL *pvarfIsReadOnly) {
    return This->lpVtbl->isReadOnlyItem(This,bstrItemName,pvarfIsReadOnly);
}
/*** IWMPMedia2 methods ***/
static FORCEINLINE 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 FORCEINLINE HRESULT IWMPMedia3_QueryInterface(IWMPMedia3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMPMedia3_AddRef(IWMPMedia3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMPMedia3_Release(IWMPMedia3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IWMPMedia3_GetTypeInfoCount(IWMPMedia3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IWMPMedia3_GetTypeInfo(IWMPMedia3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE 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 FORCEINLINE 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 FORCEINLINE HRESULT IWMPMedia3_get_isIdentical(IWMPMedia3* This,IWMPMedia *pIWMPMedia,VARIANT_BOOL *pvbool) {
    return This->lpVtbl->get_isIdentical(This,pIWMPMedia,pvbool);
}
static FORCEINLINE HRESULT IWMPMedia3_get_sourceURL(IWMPMedia3* This,BSTR *pbstrSourceURL) {
    return This->lpVtbl->get_sourceURL(This,pbstrSourceURL);
}
static FORCEINLINE HRESULT IWMPMedia3_get_name(IWMPMedia3* This,BSTR *pbstrName) {
    return This->lpVtbl->get_name(This,pbstrName);
}
static FORCEINLINE HRESULT IWMPMedia3_put_name(IWMPMedia3* This,BSTR pbstrName) {
    return This->lpVtbl->put_name(This,pbstrName);
}
static FORCEINLINE HRESULT IWMPMedia3_get_imageSourceWidth(IWMPMedia3* This,LONG *pWidth) {
    return This->lpVtbl->get_imageSourceWidth(This,pWidth);
}
static FORCEINLINE HRESULT IWMPMedia3_get_imageSourceHeight(IWMPMedia3* This,LONG *pHeight) {
    return This->lpVtbl->get_imageSourceHeight(This,pHeight);
}
static FORCEINLINE HRESULT IWMPMedia3_get_markerCount(IWMPMedia3* This,LONG *pMarkerCount) {
    return This->lpVtbl->get_markerCount(This,pMarkerCount);
}
static FORCEINLINE HRESULT IWMPMedia3_getMarkerTime(IWMPMedia3* This,LONG MarkerNum,double *pMarkerTime) {
    return This->lpVtbl->getMarkerTime(This,MarkerNum,pMarkerTime);
}
static FORCEINLINE HRESULT IWMPMedia3_getMarkerName(IWMPMedia3* This,LONG MarkerNum,BSTR *pbstrMarkerName) {
    return This->lpVtbl->getMarkerName(This,MarkerNum,pbstrMarkerName);
}
static FORCEINLINE HRESULT IWMPMedia3_get_duration(IWMPMedia3* This,double *pDuration) {
    return This->lpVtbl->get_duration(This,pDuration);
}
static FORCEINLINE HRESULT IWMPMedia3_get_durationString(IWMPMedia3* This,BSTR *pbstrDuration) {
    return This->lpVtbl->get_durationString(This,pbstrDuration);
}
static FORCEINLINE HRESULT IWMPMedia3_get_attributeCount(IWMPMedia3* This,LONG *plCount) {
    return This->lpVtbl->get_attributeCount(This,plCount);
}
static FORCEINLINE HRESULT IWMPMedia3_getAttributeName(IWMPMedia3* This,LONG lIndex,BSTR *pbstrItemName) {
    return This->lpVtbl->getAttributeName(This,lIndex,pbstrItemName);
}
static FORCEINLINE HRESULT IWMPMedia3_getItemInfo(IWMPMedia3* This,BSTR bstrItemName,BSTR *pbstrVal) {
    return This->lpVtbl->getItemInfo(This,bstrItemName,pbstrVal);
}
static FORCEINLINE HRESULT IWMPMedia3_setItemInfo(IWMPMedia3* This,BSTR bstrItemName,BSTR bstrVal) {
    return This->lpVtbl->setItemInfo(This,bstrItemName,bstrVal);
}
static FORCEINLINE HRESULT IWMPMedia3_getItemInfoByAtom(IWMPMedia3* This,LONG lAtom,BSTR *pbstrVal) {
    return This->lpVtbl->getItemInfoByAtom(This,lAtom,pbstrVal);
}
static FORCEINLINE HRESULT IWMPMedia3_isMemberOf(IWMPMedia3* This,IWMPPlaylist *pPlaylist,VARIANT_BOOL *pvarfIsMemberOf) {
    return This->lpVtbl->isMemberOf(This,pPlaylist,pvarfIsMemberOf);
}
static FORCEINLINE HRESULT IWMPMedia3_isReadOnlyItem(IWMPMedia3* This,BSTR bstrItemName,VARIANT_BOOL *pvarfIsReadOnly) {
    return This->lpVtbl->isReadOnlyItem(This,bstrItemName,pvarfIsReadOnly);
}
/*** IWMPMedia2 methods ***/
static FORCEINLINE HRESULT IWMPMedia3_get_error(IWMPMedia3* This,IWMPErrorItem **out) {
    return This->lpVtbl->get_error(This,out);
}
/*** IWMPMedia3 methods ***/
static FORCEINLINE HRESULT IWMPMedia3_getAttributeCountByType(IWMPMedia3* This,BSTR type,BSTR language,LONG *out) {
    return This->lpVtbl->getAttributeCountByType(This,type,language,out);
}
static FORCEINLINE 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 FORCEINLINE HRESULT IWMPError_QueryInterface(IWMPError* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMPError_AddRef(IWMPError* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMPError_Release(IWMPError* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IWMPError_GetTypeInfoCount(IWMPError* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IWMPError_GetTypeInfo(IWMPError* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE 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 FORCEINLINE 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 FORCEINLINE HRESULT IWMPError_clearErrorQueue(IWMPError* This) {
    return This->lpVtbl->clearErrorQueue(This);
}
static FORCEINLINE HRESULT IWMPError_get_errorCount(IWMPError* This,LONG *plNumErrors) {
    return This->lpVtbl->get_errorCount(This,plNumErrors);
}
static FORCEINLINE HRESULT IWMPError_get_Item(IWMPError* This,LONG dwIndex,IWMPErrorItem **ppErrorItem) {
    return This->lpVtbl->get_Item(This,dwIndex,ppErrorItem);
}
static FORCEINLINE 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 FORCEINLINE HRESULT IWMPPlayerApplication_QueryInterface(IWMPPlayerApplication* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMPPlayerApplication_AddRef(IWMPPlayerApplication* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMPPlayerApplication_Release(IWMPPlayerApplication* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IWMPPlayerApplication_GetTypeInfoCount(IWMPPlayerApplication* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IWMPPlayerApplication_GetTypeInfo(IWMPPlayerApplication* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE 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 FORCEINLINE 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 FORCEINLINE HRESULT IWMPPlayerApplication_switchToPlayerApplication(IWMPPlayerApplication* This) {
    return This->lpVtbl->switchToPlayerApplication(This);
}
static FORCEINLINE HRESULT IWMPPlayerApplication_switchToControl(IWMPPlayerApplication* This) {
    return This->lpVtbl->switchToControl(This);
}
static FORCEINLINE HRESULT IWMPPlayerApplication_get_playerDocked(IWMPPlayerApplication* This,VARIANT_BOOL *pbPlayerDocked) {
    return This->lpVtbl->get_playerDocked(This,pbPlayerDocked);
}
static FORCEINLINE 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 FORCEINLINE HRESULT IWMPCore_QueryInterface(IWMPCore* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMPCore_AddRef(IWMPCore* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMPCore_Release(IWMPCore* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IWMPCore_GetTypeInfoCount(IWMPCore* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IWMPCore_GetTypeInfo(IWMPCore* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE 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 FORCEINLINE 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 FORCEINLINE HRESULT IWMPCore_close(IWMPCore* This) {
    return This->lpVtbl->close(This);
}
static FORCEINLINE HRESULT IWMPCore_get_URL(IWMPCore* This,BSTR *pbstrURL) {
    return This->lpVtbl->get_URL(This,pbstrURL);
}
static FORCEINLINE HRESULT IWMPCore_put_URL(IWMPCore* This,BSTR pbstrURL) {
    return This->lpVtbl->put_URL(This,pbstrURL);
}
static FORCEINLINE HRESULT IWMPCore_get_openState(IWMPCore* This,WMPOpenState *pwmpos) {
    return This->lpVtbl->get_openState(This,pwmpos);
}
static FORCEINLINE HRESULT IWMPCore_get_playState(IWMPCore* This,WMPPlayState *pwmpps) {
    return This->lpVtbl->get_playState(This,pwmpps);
}
static FORCEINLINE HRESULT IWMPCore_get_controls(IWMPCore* This,IWMPControls **ppControl) {
    return This->lpVtbl->get_controls(This,ppControl);
}
static FORCEINLINE HRESULT IWMPCore_get_settings(IWMPCore* This,IWMPSettings **ppSettings) {
    return This->lpVtbl->get_settings(This,ppSettings);
}
static FORCEINLINE HRESULT IWMPCore_get_currentMedia(IWMPCore* This,IWMPMedia **ppMedia) {
    return This->lpVtbl->get_currentMedia(This,ppMedia);
}
static FORCEINLINE HRESULT IWMPCore_put_currentMedia(IWMPCore* This,IWMPMedia *ppMedia) {
    return This->lpVtbl->put_currentMedia(This,ppMedia);
}
static FORCEINLINE HRESULT IWMPCore_get_mediaCollection(IWMPCore* This,IWMPMediaCollection **ppMediaCollection) {
    return This->lpVtbl->get_mediaCollection(This,ppMediaCollection);
}
static FORCEINLINE HRESULT IWMPCore_get_playlistCollection(IWMPCore* This,IWMPPlaylistCollection **ppPlaylistCollection) {
    return This->lpVtbl->get_playlistCollection(This,ppPlaylistCollection);
}
static FORCEINLINE HRESULT IWMPCore_get_versionInfo(IWMPCore* This,BSTR *pbstrVersionInfo) {
    return This->lpVtbl->get_versionInfo(This,pbstrVersionInfo);
}
static FORCEINLINE HRESULT IWMPCore_launchURL(IWMPCore* This,BSTR bstrURL) {
    return This->lpVtbl->launchURL(This,bstrURL);
}
static FORCEINLINE HRESULT IWMPCore_get_network(IWMPCore* This,IWMPNetwork **ppQNI) {
    return This->lpVtbl->get_network(This,ppQNI);
}
static FORCEINLINE HRESULT IWMPCore_get_currentPlaylist(IWMPCore* This,IWMPPlaylist **ppPL) {
    return This->lpVtbl->get_currentPlaylist(This,ppPL);
}
static FORCEINLINE HRESULT IWMPCore_put_currentPlaylist(IWMPCore* This,IWMPPlaylist *ppPL) {
    return This->lpVtbl->put_currentPlaylist(This,ppPL);
}
static FORCEINLINE HRESULT IWMPCore_get_cdromCollection(IWMPCore* This,IWMPCdromCollection **ppCdromCollection) {
    return This->lpVtbl->get_cdromCollection(This,ppCdromCollection);
}
static FORCEINLINE HRESULT IWMPCore_get_closedCaption(IWMPCore* This,IWMPClosedCaption **ppClosedCaption) {
    return This->lpVtbl->get_closedCaption(This,ppClosedCaption);
}
static FORCEINLINE HRESULT IWMPCore_get_isOnline(IWMPCore* This,VARIANT_BOOL *pfOnline) {
    return This->lpVtbl->get_isOnline(This,pfOnline);
}
static FORCEINLINE HRESULT IWMPCore_get_Error(IWMPCore* This,IWMPError **ppError) {
    return This->lpVtbl->get_Error(This,ppError);
}
static FORCEINLINE 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 FORCEINLINE HRESULT IWMPCore2_QueryInterface(IWMPCore2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMPCore2_AddRef(IWMPCore2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMPCore2_Release(IWMPCore2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IWMPCore2_GetTypeInfoCount(IWMPCore2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IWMPCore2_GetTypeInfo(IWMPCore2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE 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 FORCEINLINE 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 FORCEINLINE HRESULT IWMPCore2_close(IWMPCore2* This) {
    return This->lpVtbl->close(This);
}
static FORCEINLINE HRESULT IWMPCore2_get_URL(IWMPCore2* This,BSTR *pbstrURL) {
    return This->lpVtbl->get_URL(This,pbstrURL);
}
static FORCEINLINE HRESULT IWMPCore2_put_URL(IWMPCore2* This,BSTR pbstrURL) {
    return This->lpVtbl->put_URL(This,pbstrURL);
}
static FORCEINLINE HRESULT IWMPCore2_get_openState(IWMPCore2* This,WMPOpenState *pwmpos) {
    return This->lpVtbl->get_openState(This,pwmpos);
}
static FORCEINLINE HRESULT IWMPCore2_get_playState(IWMPCore2* This,WMPPlayState *pwmpps) {
    return This->lpVtbl->get_playState(This,pwmpps);
}
static FORCEINLINE HRESULT IWMPCore2_get_controls(IWMPCore2* This,IWMPControls **ppControl) {
    return This->lpVtbl->get_controls(This,ppControl);
}
static FORCEINLINE HRESULT IWMPCore2_get_settings(IWMPCore2* This,IWMPSettings **ppSettings) {
    return This->lpVtbl->get_settings(This,ppSettings);
}
static FORCEINLINE HRESULT IWMPCore2_get_currentMedia(IWMPCore2* This,IWMPMedia **ppMedia) {
    return This->lpVtbl->get_currentMedia(This,ppMedia);
}
static FORCEINLINE HRESULT IWMPCore2_put_currentMedia(IWMPCore2* This,IWMPMedia *ppMedia) {
    return This->lpVtbl->put_currentMedia(This,ppMedia);
}
static FORCEINLINE HRESULT IWMPCore2_get_mediaCollection(IWMPCore2* This,IWMPMediaCollection **ppMediaCollection) {
    return This->lpVtbl->get_mediaCollection(This,ppMediaCollection);
}
static FORCEINLINE HRESULT IWMPCore2_get_playlistCollection(IWMPCore2* This,IWMPPlaylistCollection **ppPlaylistCollection) {
    return This->lpVtbl->get_playlistCollection(This,ppPlaylistCollection);
}
static FORCEINLINE HRESULT IWMPCore2_get_versionInfo(IWMPCore2* This,BSTR *pbstrVersionInfo) {
    return This->lpVtbl->get_versionInfo(This,pbstrVersionInfo);
}
static FORCEINLINE HRESULT IWMPCore2_launchURL(IWMPCore2* This,BSTR bstrURL) {
    return This->lpVtbl->launchURL(This,bstrURL);
}
static FORCEINLINE HRESULT IWMPCore2_get_network(IWMPCore2* This,IWMPNetwork **ppQNI) {
    return This->lpVtbl->get_network(This,ppQNI);
}
static FORCEINLINE HRESULT IWMPCore2_get_currentPlaylist(IWMPCore2* This,IWMPPlaylist **ppPL) {
    return This->lpVtbl->get_currentPlaylist(This,ppPL);
}
static FORCEINLINE HRESULT IWMPCore2_put_currentPlaylist(IWMPCore2* This,IWMPPlaylist *ppPL) {
    return This->lpVtbl->put_currentPlaylist(This,ppPL);
}
static FORCEINLINE HRESULT IWMPCore2_get_cdromCollection(IWMPCore2* This,IWMPCdromCollection **ppCdromCollection) {
    return This->lpVtbl->get_cdromCollection(This,ppCdromCollection);
}
static FORCEINLINE HRESULT IWMPCore2_get_closedCaption(IWMPCore2* This,IWMPClosedCaption **ppClosedCaption) {
    return This->lpVtbl->get_closedCaption(This,ppClosedCaption);
}
static FORCEINLINE HRESULT IWMPCore2_get_isOnline(IWMPCore2* This,VARIANT_BOOL *pfOnline) {
    return This->lpVtbl->get_isOnline(This,pfOnline);
}
static FORCEINLINE HRESULT IWMPCore2_get_Error(IWMPCore2* This,IWMPError **ppError) {
    return This->lpVtbl->get_Error(This,ppError);
}
static FORCEINLINE HRESULT IWMPCore2_get_status(IWMPCore2* This,BSTR *pbstrStatus) {
    return This->lpVtbl->get_status(This,pbstrStatus);
}
/*** IWMPCore2 methods ***/
static FORCEINLINE 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 FORCEINLINE HRESULT IWMPCore3_QueryInterface(IWMPCore3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMPCore3_AddRef(IWMPCore3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMPCore3_Release(IWMPCore3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IWMPCore3_GetTypeInfoCount(IWMPCore3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IWMPCore3_GetTypeInfo(IWMPCore3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE 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 FORCEINLINE 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 FORCEINLINE HRESULT IWMPCore3_close(IWMPCore3* This) {
    return This->lpVtbl->close(This);
}
static FORCEINLINE HRESULT IWMPCore3_get_URL(IWMPCore3* This,BSTR *pbstrURL) {
    return This->lpVtbl->get_URL(This,pbstrURL);
}
static FORCEINLINE HRESULT IWMPCore3_put_URL(IWMPCore3* This,BSTR pbstrURL) {
    return This->lpVtbl->put_URL(This,pbstrURL);
}
static FORCEINLINE HRESULT IWMPCore3_get_openState(IWMPCore3* This,WMPOpenState *pwmpos) {
    return This->lpVtbl->get_openState(This,pwmpos);
}
static FORCEINLINE HRESULT IWMPCore3_get_playState(IWMPCore3* This,WMPPlayState *pwmpps) {
    return This->lpVtbl->get_playState(This,pwmpps);
}
static FORCEINLINE HRESULT IWMPCore3_get_controls(IWMPCore3* This,IWMPControls **ppControl) {
    return This->lpVtbl->get_controls(This,ppControl);
}
static FORCEINLINE HRESULT IWMPCore3_get_settings(IWMPCore3* This,IWMPSettings **ppSettings) {
    return This->lpVtbl->get_settings(This,ppSettings);
}
static FORCEINLINE HRESULT IWMPCore3_get_currentMedia(IWMPCore3* This,IWMPMedia **ppMedia) {
    return This->lpVtbl->get_currentMedia(This,ppMedia);
}
static FORCEINLINE HRESULT IWMPCore3_put_currentMedia(IWMPCore3* This,IWMPMedia *ppMedia) {
    return This->lpVtbl->put_currentMedia(This,ppMedia);
}
static FORCEINLINE HRESULT IWMPCore3_get_mediaCollection(IWMPCore3* This,IWMPMediaCollection **ppMediaCollection) {
    return This->lpVtbl->get_mediaCollection(This,ppMediaCollection);
}
static FORCEINLINE HRESULT IWMPCore3_get_playlistCollection(IWMPCore3* This,IWMPPlaylistCollection **ppPlaylistCollection) {
    return This->lpVtbl->get_playlistCollection(This,ppPlaylistCollection);
}
static FORCEINLINE HRESULT IWMPCore3_get_versionInfo(IWMPCore3* This,BSTR *pbstrVersionInfo) {
    return This->lpVtbl->get_versionInfo(This,pbstrVersionInfo);
}
static FORCEINLINE HRESULT IWMPCore3_launchURL(IWMPCore3* This,BSTR bstrURL) {
    return This->lpVtbl->launchURL(This,bstrURL);
}
static FORCEINLINE HRESULT IWMPCore3_get_network(IWMPCore3* This,IWMPNetwork **ppQNI) {
    return This->lpVtbl->get_network(This,ppQNI);
}
static FORCEINLINE HRESULT IWMPCore3_get_currentPlaylist(IWMPCore3* This,IWMPPlaylist **ppPL) {
    return This->lpVtbl->get_currentPlaylist(This,ppPL);
}
static FORCEINLINE HRESULT IWMPCore3_put_currentPlaylist(IWMPCore3* This,IWMPPlaylist *ppPL) {
    return This->lpVtbl->put_currentPlaylist(This,ppPL);
}
static FORCEINLINE HRESULT IWMPCore3_get_cdromCollection(IWMPCore3* This,IWMPCdromCollection **ppCdromCollection) {
    return This->lpVtbl->get_cdromCollection(This,ppCdromCollection);
}
static FORCEINLINE HRESULT IWMPCore3_get_closedCaption(IWMPCore3* This,IWMPClosedCaption **ppClosedCaption) {
    return This->lpVtbl->get_closedCaption(This,ppClosedCaption);
}
static FORCEINLINE HRESULT IWMPCore3_get_isOnline(IWMPCore3* This,VARIANT_BOOL *pfOnline) {
    return This->lpVtbl->get_isOnline(This,pfOnline);
}
static FORCEINLINE HRESULT IWMPCore3_get_Error(IWMPCore3* This,IWMPError **ppError) {
    return This->lpVtbl->get_Error(This,ppError);
}
static FORCEINLINE HRESULT IWMPCore3_get_status(IWMPCore3* This,BSTR *pbstrStatus) {
    return This->lpVtbl->get_status(This,pbstrStatus);
}
/*** IWMPCore2 methods ***/
static FORCEINLINE HRESULT IWMPCore3_get_dvd(IWMPCore3* This,IWMPDVD **ppDVD) {
    return This->lpVtbl->get_dvd(This,ppDVD);
}
/*** IWMPCore3 methods ***/
static FORCEINLINE HRESULT IWMPCore3_newPlaylist(IWMPCore3* This,BSTR bstrName,BSTR bstrURL,IWMPPlaylist **ppPlaylist) {
    return This->lpVtbl->newPlaylist(This,bstrName,bstrURL,ppPlaylist);
}
static FORCEINLINE 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 FORCEINLINE HRESULT IWMPPlayer4_QueryInterface(IWMPPlayer4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMPPlayer4_AddRef(IWMPPlayer4* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMPPlayer4_Release(IWMPPlayer4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IWMPPlayer4_GetTypeInfoCount(IWMPPlayer4* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IWMPPlayer4_GetTypeInfo(IWMPPlayer4* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE 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 FORCEINLINE 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 FORCEINLINE HRESULT IWMPPlayer4_close(IWMPPlayer4* This) {
    return This->lpVtbl->close(This);
}
static FORCEINLINE HRESULT IWMPPlayer4_get_URL(IWMPPlayer4* This,BSTR *pbstrURL) {
    return This->lpVtbl->get_URL(This,pbstrURL);
}
static FORCEINLINE HRESULT IWMPPlayer4_put_URL(IWMPPlayer4* This,BSTR pbstrURL) {
    return This->lpVtbl->put_URL(This,pbstrURL);
}
static FORCEINLINE HRESULT IWMPPlayer4_get_openState(IWMPPlayer4* This,WMPOpenState *pwmpos) {
    return This->lpVtbl->get_openState(This,pwmpos);
}
static FORCEINLINE HRESULT IWMPPlayer4_get_playState(IWMPPlayer4* This,WMPPlayState *pwmpps) {
    return This->lpVtbl->get_playState(This,pwmpps);
}
static FORCEINLINE HRESULT IWMPPlayer4_get_controls(IWMPPlayer4* This,IWMPControls **ppControl) {
    return This->lpVtbl->get_controls(This,ppControl);
}
static FORCEINLINE HRESULT IWMPPlayer4_get_settings(IWMPPlayer4* This,IWMPSettings **ppSettings) {
    return This->lpVtbl->get_settings(This,ppSettings);
}
static FORCEINLINE HRESULT IWMPPlayer4_get_currentMedia(IWMPPlayer4* This,IWMPMedia **ppMedia) {
    return This->lpVtbl->get_currentMedia(This,ppMedia);
}
static FORCEINLINE HRESULT IWMPPlayer4_put_currentMedia(IWMPPlayer4* This,IWMPMedia *ppMedia) {
    return This->lpVtbl->put_currentMedia(This,ppMedia);
}
static FORCEINLINE HRESULT IWMPPlayer4_get_mediaCollection(IWMPPlayer4* This,IWMPMediaCollection **ppMediaCollection) {
    return This->lpVtbl->get_mediaCollection(This,ppMediaCollection);
}
static FORCEINLINE HRESULT IWMPPlayer4_get_playlistCollection(IWMPPlayer4* This,IWMPPlaylistCollection **ppPlaylistCollection) {
    return This->lpVtbl->get_playlistCollection(This,ppPlaylistCollection);
}
static FORCEINLINE HRESULT IWMPPlayer4_get_versionInfo(IWMPPlayer4* This,BSTR *pbstrVersionInfo) {
    return This->lpVtbl->get_versionInfo(This,pbstrVersionInfo);
}
static FORCEINLINE HRESULT IWMPPlayer4_launchURL(IWMPPlayer4* This,BSTR bstrURL) {
    return This->lpVtbl->launchURL(This,bstrURL);
}
static FORCEINLINE HRESULT IWMPPlayer4_get_network(IWMPPlayer4* This,IWMPNetwork **ppQNI) {
    return This->lpVtbl->get_network(This,ppQNI);
}
static FORCEINLINE HRESULT IWMPPlayer4_get_currentPlaylist(IWMPPlayer4* This,IWMPPlaylist **ppPL) {
    return This->lpVtbl->get_currentPlaylist(This,ppPL);
}
static FORCEINLINE HRESULT IWMPPlayer4_put_currentPlaylist(IWMPPlayer4* This,IWMPPlaylist *ppPL) {
    return This->lpVtbl->put_currentPlaylist(This,ppPL);
}
static FORCEINLINE HRESULT IWMPPlayer4_get_cdromCollection(IWMPPlayer4* This,IWMPCdromCollection **ppCdromCollection) {
    return This->lpVtbl->get_cdromCollection(This,ppCdromCollection);
}
static FORCEINLINE HRESULT IWMPPlayer4_get_closedCaption(IWMPPlayer4* This,IWMPClosedCaption **ppClosedCaption) {
    return This->lpVtbl->get_closedCaption(This,ppClosedCaption);
}
static FORCEINLINE HRESULT IWMPPlayer4_get_isOnline(IWMPPlayer4* This,VARIANT_BOOL *pfOnline) {
    return This->lpVtbl->get_isOnline(This,pfOnline);
}
static FORCEINLINE HRESULT IWMPPlayer4_get_Error(IWMPPlayer4* This,IWMPError **ppError) {
    return This->lpVtbl->get_Error(This,ppError);
}
static FORCEINLINE HRESULT IWMPPlayer4_get_status(IWMPPlayer4* This,BSTR *pbstrStatus) {
    return This->lpVtbl->get_status(This,pbstrStatus);
}
/*** IWMPCore2 methods ***/
static FORCEINLINE HRESULT IWMPPlayer4_get_dvd(IWMPPlayer4* This,IWMPDVD **ppDVD) {
    return This->lpVtbl->get_dvd(This,ppDVD);
}
/*** IWMPCore3 methods ***/
static FORCEINLINE HRESULT IWMPPlayer4_newPlaylist(IWMPPlayer4* This,BSTR bstrName,BSTR bstrURL,IWMPPlaylist **ppPlaylist) {
    return This->lpVtbl->newPlaylist(This,bstrName,bstrURL,ppPlaylist);
}
static FORCEINLINE HRESULT IWMPPlayer4_newMedia(IWMPPlayer4* This,BSTR bstrURL,IWMPMedia **ppMedia) {
    return This->lpVtbl->newMedia(This,bstrURL,ppMedia);
}
/*** IWMPPlayer4 methods ***/
static FORCEINLINE HRESULT IWMPPlayer4_get_enabled(IWMPPlayer4* This,VARIANT_BOOL *pbEnabled) {
    return This->lpVtbl->get_enabled(This,pbEnabled);
}
static FORCEINLINE HRESULT IWMPPlayer4_put_enabled(IWMPPlayer4* This,VARIANT_BOOL pbEnabled) {
    return This->lpVtbl->put_enabled(This,pbEnabled);
}
static FORCEINLINE HRESULT IWMPPlayer4_get_fullScreen(IWMPPlayer4* This,VARIANT_BOOL *pbFullScreen) {
    return This->lpVtbl->get_fullScreen(This,pbFullScreen);
}
static FORCEINLINE HRESULT IWMPPlayer4_put_fullScreen(IWMPPlayer4* This,VARIANT_BOOL pbFullScreen) {
    return This->lpVtbl->put_fullScreen(This,pbFullScreen);
}
static FORCEINLINE HRESULT IWMPPlayer4_get_enableContextMenu(IWMPPlayer4* This,VARIANT_BOOL *pbEnableContextMenu) {
    return This->lpVtbl->get_enableContextMenu(This,pbEnableContextMenu);
}
static FORCEINLINE HRESULT IWMPPlayer4_put_enableContextMenu(IWMPPlayer4* This,VARIANT_BOOL pbEnableContextMenu) {
    return This->lpVtbl->put_enableContextMenu(This,pbEnableContextMenu);
}
static FORCEINLINE HRESULT IWMPPlayer4_put_uiMode(IWMPPlayer4* This,BSTR pbstrMode) {
    return This->lpVtbl->put_uiMode(This,pbstrMode);
}
static FORCEINLINE HRESULT IWMPPlayer4_get_uiMode(IWMPPlayer4* This,BSTR *pbstrMode) {
    return This->lpVtbl->get_uiMode(This,pbstrMode);
}
static FORCEINLINE HRESULT IWMPPlayer4_get_stretchToFit(IWMPPlayer4* This,VARIANT_BOOL *pbEnabled) {
    return This->lpVtbl->get_stretchToFit(This,pbEnabled);
}
static FORCEINLINE HRESULT IWMPPlayer4_put_stretchToFit(IWMPPlayer4* This,VARIANT_BOOL pbEnabled) {
    return This->lpVtbl->put_stretchToFit(This,pbEnabled);
}
static FORCEINLINE HRESULT IWMPPlayer4_get_windowlessVideo(IWMPPlayer4* This,VARIANT_BOOL *pbEnabled) {
    return This->lpVtbl->get_windowlessVideo(This,pbEnabled);
}
static FORCEINLINE HRESULT IWMPPlayer4_put_windowlessVideo(IWMPPlayer4* This,VARIANT_BOOL pbEnabled) {
    return This->lpVtbl->put_windowlessVideo(This,pbEnabled);
}
static FORCEINLINE HRESULT IWMPPlayer4_get_isRemote(IWMPPlayer4* This,VARIANT_BOOL *pvarfIsRemote) {
    return This->lpVtbl->get_isRemote(This,pvarfIsRemote);
}
static FORCEINLINE HRESULT IWMPPlayer4_get_playerApplication(IWMPPlayer4* This,IWMPPlayerApplication **ppIWMPPlayerApplication) {
    return This->lpVtbl->get_playerApplication(This,ppIWMPPlayerApplication);
}
static FORCEINLINE 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 FORCEINLINE HRESULT IWMPPlayer_QueryInterface(IWMPPlayer* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMPPlayer_AddRef(IWMPPlayer* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMPPlayer_Release(IWMPPlayer* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IWMPPlayer_GetTypeInfoCount(IWMPPlayer* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IWMPPlayer_GetTypeInfo(IWMPPlayer* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE 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 FORCEINLINE 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 FORCEINLINE HRESULT IWMPPlayer_close(IWMPPlayer* This) {
    return This->lpVtbl->close(This);
}
static FORCEINLINE HRESULT IWMPPlayer_get_URL(IWMPPlayer* This,BSTR *pbstrURL) {
    return This->lpVtbl->get_URL(This,pbstrURL);
}
static FORCEINLINE HRESULT IWMPPlayer_put_URL(IWMPPlayer* This,BSTR pbstrURL) {
    return This->lpVtbl->put_URL(This,pbstrURL);
}
static FORCEINLINE HRESULT IWMPPlayer_get_openState(IWMPPlayer* This,WMPOpenState *pwmpos) {
    return This->lpVtbl->get_openState(This,pwmpos);
}
static FORCEINLINE HRESULT IWMPPlayer_get_playState(IWMPPlayer* This,WMPPlayState *pwmpps) {
    return This->lpVtbl->get_playState(This,pwmpps);
}
static FORCEINLINE HRESULT IWMPPlayer_get_controls(IWMPPlayer* This,IWMPControls **ppControl) {
    return This->lpVtbl->get_controls(This,ppControl);
}
static FORCEINLINE HRESULT IWMPPlayer_get_settings(IWMPPlayer* This,IWMPSettings **ppSettings) {
    return This->lpVtbl->get_settings(This,ppSettings);
}
static FORCEINLINE HRESULT IWMPPlayer_get_currentMedia(IWMPPlayer* This,IWMPMedia **ppMedia) {
    return This->lpVtbl->get_currentMedia(This,ppMedia);
}
static FORCEINLINE HRESULT IWMPPlayer_put_currentMedia(IWMPPlayer* This,IWMPMedia *ppMedia) {
    return This->lpVtbl->put_currentMedia(This,ppMedia);
}
static FORCEINLINE HRESULT IWMPPlayer_get_mediaCollection(IWMPPlayer* This,IWMPMediaCollection **ppMediaCollection) {
    return This->lpVtbl->get_mediaCollection(This,ppMediaCollection);
}
static FORCEINLINE HRESULT IWMPPlayer_get_playlistCollection(IWMPPlayer* This,IWMPPlaylistCollection **ppPlaylistCollection) {
    return This->lpVtbl->get_playlistCollection(This,ppPlaylistCollection);
}
static FORCEINLINE HRESULT IWMPPlayer_get_versionInfo(IWMPPlayer* This,BSTR *pbstrVersionInfo) {
    return This->lpVtbl->get_versionInfo(This,pbstrVersionInfo);
}
static FORCEINLINE HRESULT IWMPPlayer_launchURL(IWMPPlayer* This,BSTR bstrURL) {
    return This->lpVtbl->launchURL(This,bstrURL);
}
static FORCEINLINE HRESULT IWMPPlayer_get_network(IWMPPlayer* This,IWMPNetwork **ppQNI) {
    return This->lpVtbl->get_network(This,ppQNI);
}
static FORCEINLINE HRESULT IWMPPlayer_get_currentPlaylist(IWMPPlayer* This,IWMPPlaylist **ppPL) {
    return This->lpVtbl->get_currentPlaylist(This,ppPL);
}
static FORCEINLINE HRESULT IWMPPlayer_put_currentPlaylist(IWMPPlayer* This,IWMPPlaylist *ppPL) {
    return This->lpVtbl->put_currentPlaylist(This,ppPL);
}
static FORCEINLINE HRESULT IWMPPlayer_get_cdromCollection(IWMPPlayer* This,IWMPCdromCollection **ppCdromCollection) {
    return This->lpVtbl->get_cdromCollection(This,ppCdromCollection);
}
static FORCEINLINE HRESULT IWMPPlayer_get_closedCaption(IWMPPlayer* This,IWMPClosedCaption **ppClosedCaption) {
    return This->lpVtbl->get_closedCaption(This,ppClosedCaption);
}
static FORCEINLINE HRESULT IWMPPlayer_get_isOnline(IWMPPlayer* This,VARIANT_BOOL *pfOnline) {
    return This->lpVtbl->get_isOnline(This,pfOnline);
}
static FORCEINLINE HRESULT IWMPPlayer_get_Error(IWMPPlayer* This,IWMPError **ppError) {
    return This->lpVtbl->get_Error(This,ppError);
}
static FORCEINLINE HRESULT IWMPPlayer_get_status(IWMPPlayer* This,BSTR *pbstrStatus) {
    return This->lpVtbl->get_status(This,pbstrStatus);
}
/*** IWMPPlayer methods ***/
static FORCEINLINE HRESULT IWMPPlayer_get_enabled(IWMPPlayer* This,VARIANT_BOOL *pbEnabled) {
    return This->lpVtbl->get_enabled(This,pbEnabled);
}
static FORCEINLINE HRESULT IWMPPlayer_put_enabled(IWMPPlayer* This,VARIANT_BOOL pbEnabled) {
    return This->lpVtbl->put_enabled(This,pbEnabled);
}
static FORCEINLINE HRESULT IWMPPlayer_get_fullScreen(IWMPPlayer* This,VARIANT_BOOL *pbFullScreen) {
    return This->lpVtbl->get_fullScreen(This,pbFullScreen);
}
static FORCEINLINE HRESULT IWMPPlayer_put_fullScreen(IWMPPlayer* This,VARIANT_BOOL pbFullScreen) {
    return This->lpVtbl->put_fullScreen(This,pbFullScreen);
}
static FORCEINLINE HRESULT IWMPPlayer_get_enableContextMenu(IWMPPlayer* This,VARIANT_BOOL *pbEnableContextMenu) {
    return This->lpVtbl->get_enableContextMenu(This,pbEnableContextMenu);
}
static FORCEINLINE HRESULT IWMPPlayer_put_enableContextMenu(IWMPPlayer* This,VARIANT_BOOL pbEnableContextMenu) {
    return This->lpVtbl->put_enableContextMenu(This,pbEnableContextMenu);
}
static FORCEINLINE HRESULT IWMPPlayer_put_uiMode(IWMPPlayer* This,BSTR pbstrMode) {
    return This->lpVtbl->put_uiMode(This,pbstrMode);
}
static FORCEINLINE 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 FORCEINLINE HRESULT IWMPSyncDevice_QueryInterface(IWMPSyncDevice* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMPSyncDevice_AddRef(IWMPSyncDevice* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMPSyncDevice_Release(IWMPSyncDevice* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMPSyncDevice methods ***/
static FORCEINLINE HRESULT IWMPSyncDevice_get_friendlyName(IWMPSyncDevice* This,BSTR *name) {
    return This->lpVtbl->get_friendlyName(This,name);
}
static FORCEINLINE HRESULT IWMPSyncDevice_put_friendlyName(IWMPSyncDevice* This,BSTR name) {
    return This->lpVtbl->put_friendlyName(This,name);
}
static FORCEINLINE HRESULT IWMPSyncDevice_get_deviceName(IWMPSyncDevice* This,BSTR *name) {
    return This->lpVtbl->get_deviceName(This,name);
}
static FORCEINLINE HRESULT IWMPSyncDevice_get_deviceId(IWMPSyncDevice* This,BSTR *device) {
    return This->lpVtbl->get_deviceId(This,device);
}
static FORCEINLINE HRESULT IWMPSyncDevice_get_partnershipIndex(IWMPSyncDevice* This,LONG *index) {
    return This->lpVtbl->get_partnershipIndex(This,index);
}
static FORCEINLINE HRESULT IWMPSyncDevice_get_connected(IWMPSyncDevice* This,VARIANT_BOOL *connected) {
    return This->lpVtbl->get_connected(This,connected);
}
static FORCEINLINE HRESULT IWMPSyncDevice_get_status(IWMPSyncDevice* This,WMPDeviceStatus *status) {
    return This->lpVtbl->get_status(This,status);
}
static FORCEINLINE HRESULT IWMPSyncDevice_get_syncState(IWMPSyncDevice* This,WMPSyncState *state) {
    return This->lpVtbl->get_syncState(This,state);
}
static FORCEINLINE HRESULT IWMPSyncDevice_get_progress(IWMPSyncDevice* This,LONG *progress) {
    return This->lpVtbl->get_progress(This,progress);
}
static FORCEINLINE HRESULT IWMPSyncDevice_getItemInfo(IWMPSyncDevice* This,BSTR name,BSTR *val) {
    return This->lpVtbl->getItemInfo(This,name,val);
}
static FORCEINLINE HRESULT IWMPSyncDevice_createPartnership(IWMPSyncDevice* This,VARIANT_BOOL showui) {
    return This->lpVtbl->createPartnership(This,showui);
}
static FORCEINLINE HRESULT IWMPSyncDevice_deletePartnership(IWMPSyncDevice* This) {
    return This->lpVtbl->deletePartnership(This);
}
static FORCEINLINE HRESULT IWMPSyncDevice_start(IWMPSyncDevice* This) {
    return This->lpVtbl->start(This);
}
static FORCEINLINE HRESULT IWMPSyncDevice_stop(IWMPSyncDevice* This) {
    return This->lpVtbl->stop(This);
}
static FORCEINLINE HRESULT IWMPSyncDevice_showSettings(IWMPSyncDevice* This) {
    return This->lpVtbl->showSettings(This);
}
static FORCEINLINE 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 FORCEINLINE HRESULT IWMPSyncDevice2_QueryInterface(IWMPSyncDevice2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMPSyncDevice2_AddRef(IWMPSyncDevice2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMPSyncDevice2_Release(IWMPSyncDevice2* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMPSyncDevice methods ***/
static FORCEINLINE HRESULT IWMPSyncDevice2_get_friendlyName(IWMPSyncDevice2* This,BSTR *name) {
    return This->lpVtbl->get_friendlyName(This,name);
}
static FORCEINLINE HRESULT IWMPSyncDevice2_put_friendlyName(IWMPSyncDevice2* This,BSTR name) {
    return This->lpVtbl->put_friendlyName(This,name);
}
static FORCEINLINE HRESULT IWMPSyncDevice2_get_deviceName(IWMPSyncDevice2* This,BSTR *name) {
    return This->lpVtbl->get_deviceName(This,name);
}
static FORCEINLINE HRESULT IWMPSyncDevice2_get_deviceId(IWMPSyncDevice2* This,BSTR *device) {
    return This->lpVtbl->get_deviceId(This,device);
}
static FORCEINLINE HRESULT IWMPSyncDevice2_get_partnershipIndex(IWMPSyncDevice2* This,LONG *index) {
    return This->lpVtbl->get_partnershipIndex(This,index);
}
static FORCEINLINE HRESULT IWMPSyncDevice2_get_connected(IWMPSyncDevice2* This,VARIANT_BOOL *connected) {
    return This->lpVtbl->get_connected(This,connected);
}
static FORCEINLINE HRESULT IWMPSyncDevice2_get_status(IWMPSyncDevice2* This,WMPDeviceStatus *status) {
    return This->lpVtbl->get_status(This,status);
}
static FORCEINLINE HRESULT IWMPSyncDevice2_get_syncState(IWMPSyncDevice2* This,WMPSyncState *state) {
    return This->lpVtbl->get_syncState(This,state);
}
static FORCEINLINE HRESULT IWMPSyncDevice2_get_progress(IWMPSyncDevice2* This,LONG *progress) {
    return This->lpVtbl->get_progress(This,progress);
}
static FORCEINLINE HRESULT IWMPSyncDevice2_getItemInfo(IWMPSyncDevice2* This,BSTR name,BSTR *val) {
    return This->lpVtbl->getItemInfo(This,name,val);
}
static FORCEINLINE HRESULT IWMPSyncDevice2_createPartnership(IWMPSyncDevice2* This,VARIANT_BOOL showui) {
    return This->lpVtbl->createPartnership(This,showui);
}
static FORCEINLINE HRESULT IWMPSyncDevice2_deletePartnership(IWMPSyncDevice2* This) {
    return This->lpVtbl->deletePartnership(This);
}
static FORCEINLINE HRESULT IWMPSyncDevice2_start(IWMPSyncDevice2* This) {
    return This->lpVtbl->start(This);
}
static FORCEINLINE HRESULT IWMPSyncDevice2_stop(IWMPSyncDevice2* This) {
    return This->lpVtbl->stop(This);
}
static FORCEINLINE HRESULT IWMPSyncDevice2_showSettings(IWMPSyncDevice2* This) {
    return This->lpVtbl->showSettings(This);
}
static FORCEINLINE HRESULT IWMPSyncDevice2_isIdentical(IWMPSyncDevice2* This,IWMPSyncDevice *device,VARIANT_BOOL *ret) {
    return This->lpVtbl->isIdentical(This,device,ret);
}
/*** IWMPSyncDevice2 methods ***/
static FORCEINLINE 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 FORCEINLINE HRESULT IWMPCdromRip_QueryInterface(IWMPCdromRip* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMPCdromRip_AddRef(IWMPCdromRip* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMPCdromRip_Release(IWMPCdromRip* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMPCdromRip methods ***/
static FORCEINLINE HRESULT IWMPCdromRip_get_ripState(IWMPCdromRip* This,WMPRipState *state) {
    return This->lpVtbl->get_ripState(This,state);
}
static FORCEINLINE HRESULT IWMPCdromRip_get_ripProgress(IWMPCdromRip* This,LONG *progress) {
    return This->lpVtbl->get_ripProgress(This,progress);
}
static FORCEINLINE HRESULT IWMPCdromRip_startRip(IWMPCdromRip* This) {
    return This->lpVtbl->startRip(This);
}
static FORCEINLINE 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 FORCEINLINE HRESULT IWMPCdromBurn_QueryInterface(IWMPCdromBurn* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMPCdromBurn_AddRef(IWMPCdromBurn* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMPCdromBurn_Release(IWMPCdromBurn* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMPCdromBurn methods ***/
static FORCEINLINE HRESULT IWMPCdromBurn_isAvailable(IWMPCdromBurn* This,BSTR item,VARIANT_BOOL *available) {
    return This->lpVtbl->isAvailable(This,item,available);
}
static FORCEINLINE HRESULT IWMPCdromBurn_getItemInfo(IWMPCdromBurn* This,BSTR item,BSTR *val) {
    return This->lpVtbl->getItemInfo(This,item,val);
}
static FORCEINLINE HRESULT IWMPCdromBurn_get_label(IWMPCdromBurn* This,BSTR *label) {
    return This->lpVtbl->get_label(This,label);
}
static FORCEINLINE HRESULT IWMPCdromBurn_put_label(IWMPCdromBurn* This,BSTR label) {
    return This->lpVtbl->put_label(This,label);
}
static FORCEINLINE HRESULT IWMPCdromBurn_get_burnFormat(IWMPCdromBurn* This,WMPBurnFormat *format) {
    return This->lpVtbl->get_burnFormat(This,format);
}
static FORCEINLINE HRESULT IWMPCdromBurn_put_burnFormat(IWMPCdromBurn* This,WMPBurnFormat format) {
    return This->lpVtbl->put_burnFormat(This,format);
}
static FORCEINLINE HRESULT IWMPCdromBurn_get_burnPlaylist(IWMPCdromBurn* This,IWMPPlaylist **playlist) {
    return This->lpVtbl->get_burnPlaylist(This,playlist);
}
static FORCEINLINE HRESULT IWMPCdromBurn_put_burnPlaylist(IWMPCdromBurn* This,IWMPPlaylist *playlist) {
    return This->lpVtbl->put_burnPlaylist(This,playlist);
}
static FORCEINLINE HRESULT IWMPCdromBurn_refreshStatus(IWMPCdromBurn* This) {
    return This->lpVtbl->refreshStatus(This);
}
static FORCEINLINE HRESULT IWMPCdromBurn_get_burnState(IWMPCdromBurn* This,WMPBurnState *state) {
    return This->lpVtbl->get_burnState(This,state);
}
static FORCEINLINE HRESULT IWMPCdromBurn_get_burnProgress(IWMPCdromBurn* This,LONG *progress) {
    return This->lpVtbl->get_burnProgress(This,progress);
}
static FORCEINLINE HRESULT IWMPCdromBurn_startBurn(IWMPCdromBurn* This) {
    return This->lpVtbl->startBurn(This);
}
static FORCEINLINE HRESULT IWMPCdromBurn_stopBurn(IWMPCdromBurn* This) {
    return This->lpVtbl->stopBurn(This);
}
static FORCEINLINE 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 FORCEINLINE HRESULT IWMPLibrary_QueryInterface(IWMPLibrary* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMPLibrary_AddRef(IWMPLibrary* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMPLibrary_Release(IWMPLibrary* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMPLibrary methods ***/
static FORCEINLINE HRESULT IWMPLibrary_get_name(IWMPLibrary* This,BSTR *name) {
    return This->lpVtbl->get_name(This,name);
}
static FORCEINLINE HRESULT IWMPLibrary_get_type(IWMPLibrary* This,WMPLibraryType *type) {
    return This->lpVtbl->get_type(This,type);
}
static FORCEINLINE HRESULT IWMPLibrary_get_mediaCollection(IWMPLibrary* This,IWMPMediaCollection **collection) {
    return This->lpVtbl->get_mediaCollection(This,collection);
}
static FORCEINLINE 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 FORCEINLINE HRESULT IWMPEvents_QueryInterface(IWMPEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMPEvents_AddRef(IWMPEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMPEvents_Release(IWMPEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMPEvents methods ***/
static FORCEINLINE void IWMPEvents_OpenStateChange(IWMPEvents* This,LONG state) {
    This->lpVtbl->OpenStateChange(This,state);
}
static FORCEINLINE void IWMPEvents_PlayStateChange(IWMPEvents* This,LONG state) {
    This->lpVtbl->PlayStateChange(This,state);
}
static FORCEINLINE void IWMPEvents_AudioLanguageChange(IWMPEvents* This,LONG lang) {
    This->lpVtbl->AudioLanguageChange(This,lang);
}
static FORCEINLINE void IWMPEvents_StatusChange(IWMPEvents* This) {
    This->lpVtbl->StatusChange(This);
}
static FORCEINLINE void IWMPEvents_ScriptCommand(IWMPEvents* This,BSTR type,BSTR param) {
    This->lpVtbl->ScriptCommand(This,type,param);
}
static FORCEINLINE void IWMPEvents_NewStream(IWMPEvents* This) {
    This->lpVtbl->NewStream(This);
}
static FORCEINLINE void IWMPEvents_Disconnect(IWMPEvents* This,LONG result) {
    This->lpVtbl->Disconnect(This,result);
}
static FORCEINLINE void IWMPEvents_Buffering(IWMPEvents* This,VARIANT_BOOL start) {
    This->lpVtbl->Buffering(This,start);
}
static FORCEINLINE void IWMPEvents_Error(IWMPEvents* This) {
    This->lpVtbl->Error(This);
}
static FORCEINLINE void IWMPEvents_Warning(IWMPEvents* This,LONG warning,LONG param,BSTR description) {
    This->lpVtbl->Warning(This,warning,param,description);
}
static FORCEINLINE void IWMPEvents_EndOfStream(IWMPEvents* This,LONG result) {
    This->lpVtbl->EndOfStream(This,result);
}
static FORCEINLINE void IWMPEvents_PositionChange(IWMPEvents* This,double old_position,double new_position) {
    This->lpVtbl->PositionChange(This,old_position,new_position);
}
static FORCEINLINE void IWMPEvents_MarkerHit(IWMPEvents* This,LONG marker) {
    This->lpVtbl->MarkerHit(This,marker);
}
static FORCEINLINE void IWMPEvents_DurationUnitChange(IWMPEvents* This,LONG duration) {
    This->lpVtbl->DurationUnitChange(This,duration);
}
static FORCEINLINE void IWMPEvents_CdromMediaChange(IWMPEvents* This,LONG num) {
    This->lpVtbl->CdromMediaChange(This,num);
}
static FORCEINLINE void IWMPEvents_PlaylistChange(IWMPEvents* This,IDispatch *playlist,WMPPlaylistChangeEventType change) {
    This->lpVtbl->PlaylistChange(This,playlist,change);
}
static FORCEINLINE void IWMPEvents_CurrentPlaylistChange(IWMPEvents* This,WMPPlaylistChangeEventType change) {
    This->lpVtbl->CurrentPlaylistChange(This,change);
}
static FORCEINLINE void IWMPEvents_CurrentPlaylistItemAvailable(IWMPEvents* This,BSTR item) {
    This->lpVtbl->CurrentPlaylistItemAvailable(This,item);
}
static FORCEINLINE void IWMPEvents_MediaChange(IWMPEvents* This,IDispatch *item) {
    This->lpVtbl->MediaChange(This,item);
}
static FORCEINLINE void IWMPEvents_CurrentMediaItemAvailable(IWMPEvents* This,BSTR name) {
    This->lpVtbl->CurrentMediaItemAvailable(This,name);
}
static FORCEINLINE void IWMPEvents_CurrentItemChange(IWMPEvents* This,IDispatch *media) {
    This->lpVtbl->CurrentItemChange(This,media);
}
static FORCEINLINE void IWMPEvents_MediaCollectionChange(IWMPEvents* This) {
    This->lpVtbl->MediaCollectionChange(This);
}
static FORCEINLINE void IWMPEvents_MediaCollectionAttributeStringAdded(IWMPEvents* This,BSTR name,BSTR val) {
    This->lpVtbl->MediaCollectionAttributeStringAdded(This,name,val);
}
static FORCEINLINE void IWMPEvents_MediaCollectionAttributeStringRemoved(IWMPEvents* This,BSTR name,BSTR val) {
    This->lpVtbl->MediaCollectionAttributeStringRemoved(This,name,val);
}
static FORCEINLINE void IWMPEvents_MediaCollectionAttributeStringChanged(IWMPEvents* This,BSTR name,BSTR old_val,BSTR new_val) {
    This->lpVtbl->MediaCollectionAttributeStringChanged(This,name,old_val,new_val);
}
static FORCEINLINE void IWMPEvents_PlaylistCollectionChange(IWMPEvents* This) {
    This->lpVtbl->PlaylistCollectionChange(This);
}
static FORCEINLINE void IWMPEvents_PlaylistCollectionPlaylistAdded(IWMPEvents* This,BSTR name) {
    This->lpVtbl->PlaylistCollectionPlaylistAdded(This,name);
}
static FORCEINLINE void IWMPEvents_PlaylistCollectionPlaylistRemoved(IWMPEvents* This,BSTR name) {
    This->lpVtbl->PlaylistCollectionPlaylistRemoved(This,name);
}
static FORCEINLINE void IWMPEvents_PlaylistCollectionPlaylistSetAsDeleted(IWMPEvents* This,BSTR name,VARIANT_BOOL deleted) {
    This->lpVtbl->PlaylistCollectionPlaylistSetAsDeleted(This,name,deleted);
}
static FORCEINLINE void IWMPEvents_ModeChange(IWMPEvents* This,BSTR ModeName,VARIANT_BOOL value) {
    This->lpVtbl->ModeChange(This,ModeName,value);
}
static FORCEINLINE void IWMPEvents_MediaError(IWMPEvents* This,IDispatch *media) {
    This->lpVtbl->MediaError(This,media);
}
static FORCEINLINE void IWMPEvents_OpenPlaylistSwitch(IWMPEvents* This,IDispatch *item) {
    This->lpVtbl->OpenPlaylistSwitch(This,item);
}
static FORCEINLINE void IWMPEvents_DomainChange(IWMPEvents* This,BSTR domain) {
    This->lpVtbl->DomainChange(This,domain);
}
static FORCEINLINE void IWMPEvents_SwitchedToPlayerApplication(IWMPEvents* This) {
    This->lpVtbl->SwitchedToPlayerApplication(This);
}
static FORCEINLINE void IWMPEvents_SwitchedToControl(IWMPEvents* This) {
    This->lpVtbl->SwitchedToControl(This);
}
static FORCEINLINE void IWMPEvents_PlayerDockedStateChange(IWMPEvents* This) {
    This->lpVtbl->PlayerDockedStateChange(This);
}
static FORCEINLINE void IWMPEvents_PlayerReconnect(IWMPEvents* This) {
    This->lpVtbl->PlayerReconnect(This);
}
static FORCEINLINE void IWMPEvents_Click(IWMPEvents* This,short button,short shift_state,LONG x,LONG y) {
    This->lpVtbl->Click(This,button,shift_state,x,y);
}
static FORCEINLINE void IWMPEvents_DoubleClick(IWMPEvents* This,short button,short shift_state,LONG fX,LONG fY) {
    This->lpVtbl->DoubleClick(This,button,shift_state,fX,fY);
}
static FORCEINLINE void IWMPEvents_KeyDown(IWMPEvents* This,short keycode,short shift_state) {
    This->lpVtbl->KeyDown(This,keycode,shift_state);
}
static FORCEINLINE void IWMPEvents_KeyPress(IWMPEvents* This,short ascii) {
    This->lpVtbl->KeyPress(This,ascii);
}
static FORCEINLINE void IWMPEvents_KeyUp(IWMPEvents* This,short keycode,short shift_state) {
    This->lpVtbl->KeyUp(This,keycode,shift_state);
}
static FORCEINLINE void IWMPEvents_MouseDown(IWMPEvents* This,short button,short nShiftState,LONG x,LONG y) {
    This->lpVtbl->MouseDown(This,button,nShiftState,x,y);
}
static FORCEINLINE void IWMPEvents_MouseMove(IWMPEvents* This,short button,short shift_state,LONG x,LONG y) {
    This->lpVtbl->MouseMove(This,button,shift_state,x,y);
}
static FORCEINLINE 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 FORCEINLINE HRESULT IWMPEvents2_QueryInterface(IWMPEvents2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMPEvents2_AddRef(IWMPEvents2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMPEvents2_Release(IWMPEvents2* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMPEvents methods ***/
static FORCEINLINE void IWMPEvents2_OpenStateChange(IWMPEvents2* This,LONG state) {
    This->lpVtbl->OpenStateChange(This,state);
}
static FORCEINLINE void IWMPEvents2_PlayStateChange(IWMPEvents2* This,LONG state) {
    This->lpVtbl->PlayStateChange(This,state);
}
static FORCEINLINE void IWMPEvents2_AudioLanguageChange(IWMPEvents2* This,LONG lang) {
    This->lpVtbl->AudioLanguageChange(This,lang);
}
static FORCEINLINE void IWMPEvents2_StatusChange(IWMPEvents2* This) {
    This->lpVtbl->StatusChange(This);
}
static FORCEINLINE void IWMPEvents2_ScriptCommand(IWMPEvents2* This,BSTR type,BSTR param) {
    This->lpVtbl->ScriptCommand(This,type,param);
}
static FORCEINLINE void IWMPEvents2_NewStream(IWMPEvents2* This) {
    This->lpVtbl->NewStream(This);
}
static FORCEINLINE void IWMPEvents2_Disconnect(IWMPEvents2* This,LONG result) {
    This->lpVtbl->Disconnect(This,result);
}
static FORCEINLINE void IWMPEvents2_Buffering(IWMPEvents2* This,VARIANT_BOOL start) {
    This->lpVtbl->Buffering(This,start);
}
static FORCEINLINE void IWMPEvents2_Error(IWMPEvents2* This) {
    This->lpVtbl->Error(This);
}
static FORCEINLINE void IWMPEvents2_Warning(IWMPEvents2* This,LONG warning,LONG param,BSTR description) {
    This->lpVtbl->Warning(This,warning,param,description);
}
static FORCEINLINE void IWMPEvents2_EndOfStream(IWMPEvents2* This,LONG result) {
    This->lpVtbl->EndOfStream(This,result);
}
static FORCEINLINE void IWMPEvents2_PositionChange(IWMPEvents2* This,double old_position,double new_position) {
    This->lpVtbl->PositionChange(This,old_position,new_position);
}
static FORCEINLINE void IWMPEvents2_MarkerHit(IWMPEvents2* This,LONG marker) {
    This->lpVtbl->MarkerHit(This,marker);
}
static FORCEINLINE void IWMPEvents2_DurationUnitChange(IWMPEvents2* This,LONG duration) {
    This->lpVtbl->DurationUnitChange(This,duration);
}
static FORCEINLINE void IWMPEvents2_CdromMediaChange(IWMPEvents2* This,LONG num) {
    This->lpVtbl->CdromMediaChange(This,num);
}
static FORCEINLINE void IWMPEvents2_PlaylistChange(IWMPEvents2* This,IDispatch *playlist,WMPPlaylistChangeEventType change) {
    This->lpVtbl->PlaylistChange(This,playlist,change);
}
static FORCEINLINE void IWMPEvents2_CurrentPlaylistChange(IWMPEvents2* This,WMPPlaylistChangeEventType change) {
    This->lpVtbl->CurrentPlaylistChange(This,change);
}
static FORCEINLINE void IWMPEvents2_CurrentPlaylistItemAvailable(IWMPEvents2* This,BSTR item) {
    This->lpVtbl->CurrentPlaylistItemAvailable(This,item);
}
static FORCEINLINE void IWMPEvents2_MediaChange(IWMPEvents2* This,IDispatch *item) {
    This->lpVtbl->MediaChange(This,item);
}
static FORCEINLINE void IWMPEvents2_CurrentMediaItemAvailable(IWMPEvents2* This,BSTR name) {
    This->lpVtbl->CurrentMediaItemAvailable(This,name);
}
static FORCEINLINE void IWMPEvents2_CurrentItemChange(IWMPEvents2* This,IDispatch *media) {
    This->lpVtbl->CurrentItemChange(This,media);
}
static FORCEINLINE void IWMPEvents2_MediaCollectionChange(IWMPEvents2* This) {
    This->lpVtbl->MediaCollectionChange(This);
}
static FORCEINLINE void IWMPEvents2_MediaCollectionAttributeStringAdded(IWMPEvents2* This,BSTR name,BSTR val) {
    This->lpVtbl->MediaCollectionAttributeStringAdded(This,name,val);
}
static FORCEINLINE void IWMPEvents2_MediaCollectionAttributeStringRemoved(IWMPEvents2* This,BSTR name,BSTR val) {
    This->lpVtbl->MediaCollectionAttributeStringRemoved(This,name,val);
}
static FORCEINLINE void IWMPEvents2_MediaCollectionAttributeStringChanged(IWMPEvents2* This,BSTR name,BSTR old_val,BSTR new_val) {
    This->lpVtbl->MediaCollectionAttributeStringChanged(This,name,old_val,new_val);
}
static FORCEINLINE void IWMPEvents2_PlaylistCollectionChange(IWMPEvents2* This) {
    This->lpVtbl->PlaylistCollectionChange(This);
}
static FORCEINLINE void IWMPEvents2_PlaylistCollectionPlaylistAdded(IWMPEvents2* This,BSTR name) {
    This->lpVtbl->PlaylistCollectionPlaylistAdded(This,name);
}
static FORCEINLINE void IWMPEvents2_PlaylistCollectionPlaylistRemoved(IWMPEvents2* This,BSTR name) {
    This->lpVtbl->PlaylistCollectionPlaylistRemoved(This,name);
}
static FORCEINLINE void IWMPEvents2_PlaylistCollectionPlaylistSetAsDeleted(IWMPEvents2* This,BSTR name,VARIANT_BOOL deleted) {
    This->lpVtbl->PlaylistCollectionPlaylistSetAsDeleted(This,name,deleted);
}
static FORCEINLINE void IWMPEvents2_ModeChange(IWMPEvents2* This,BSTR ModeName,VARIANT_BOOL value) {
    This->lpVtbl->ModeChange(This,ModeName,value);
}
static FORCEINLINE void IWMPEvents2_MediaError(IWMPEvents2* This,IDispatch *media) {
    This->lpVtbl->MediaError(This,media);
}
static FORCEINLINE void IWMPEvents2_OpenPlaylistSwitch(IWMPEvents2* This,IDispatch *item) {
    This->lpVtbl->OpenPlaylistSwitch(This,item);
}
static FORCEINLINE void IWMPEvents2_DomainChange(IWMPEvents2* This,BSTR domain) {
    This->lpVtbl->DomainChange(This,domain);
}
static FORCEINLINE void IWMPEvents2_SwitchedToPlayerApplication(IWMPEvents2* This) {
    This->lpVtbl->SwitchedToPlayerApplication(This);
}
static FORCEINLINE void IWMPEvents2_SwitchedToControl(IWMPEvents2* This) {
    This->lpVtbl->SwitchedToControl(This);
}
static FORCEINLINE void IWMPEvents2_PlayerDockedStateChange(IWMPEvents2* This) {
    This->lpVtbl->PlayerDockedStateChange(This);
}
static FORCEINLINE void IWMPEvents2_PlayerReconnect(IWMPEvents2* This) {
    This->lpVtbl->PlayerReconnect(This);
}
static FORCEINLINE void IWMPEvents2_Click(IWMPEvents2* This,short button,short shift_state,LONG x,LONG y) {
    This->lpVtbl->Click(This,button,shift_state,x,y);
}
static FORCEINLINE void IWMPEvents2_DoubleClick(IWMPEvents2* This,short button,short shift_state,LONG fX,LONG fY) {
    This->lpVtbl->DoubleClick(This,button,shift_state,fX,fY);
}
static FORCEINLINE void IWMPEvents2_KeyDown(IWMPEvents2* This,short keycode,short shift_state) {
    This->lpVtbl->KeyDown(This,keycode,shift_state);
}
static FORCEINLINE void IWMPEvents2_KeyPress(IWMPEvents2* This,short ascii) {
    This->lpVtbl->KeyPress(This,ascii);
}
static FORCEINLINE void IWMPEvents2_KeyUp(IWMPEvents2* This,short keycode,short shift_state) {
    This->lpVtbl->KeyUp(This,keycode,shift_state);
}
static FORCEINLINE void IWMPEvents2_MouseDown(IWMPEvents2* This,short button,short nShiftState,LONG x,LONG y) {
    This->lpVtbl->MouseDown(This,button,nShiftState,x,y);
}
static FORCEINLINE void IWMPEvents2_MouseMove(IWMPEvents2* This,short button,short shift_state,LONG x,LONG y) {
    This->lpVtbl->MouseMove(This,button,shift_state,x,y);
}
static FORCEINLINE 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 FORCEINLINE void IWMPEvents2_DeviceConnect(IWMPEvents2* This,IWMPSyncDevice *device) {
    This->lpVtbl->DeviceConnect(This,device);
}
static FORCEINLINE void IWMPEvents2_DeviceDisconnect(IWMPEvents2* This,IWMPSyncDevice *device) {
    This->lpVtbl->DeviceDisconnect(This,device);
}
static FORCEINLINE void IWMPEvents2_DeviceStatusChange(IWMPEvents2* This,IWMPSyncDevice *device,WMPDeviceStatus status) {
    This->lpVtbl->DeviceStatusChange(This,device,status);
}
static FORCEINLINE void IWMPEvents2_DeviceSyncStateChange(IWMPEvents2* This,IWMPSyncDevice *device,WMPSyncState state) {
    This->lpVtbl->DeviceSyncStateChange(This,device,state);
}
static FORCEINLINE void IWMPEvents2_DeviceSyncError(IWMPEvents2* This,IWMPSyncDevice *device,IDispatch *media) {
    This->lpVtbl->DeviceSyncError(This,device,media);
}
static FORCEINLINE 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 FORCEINLINE HRESULT IWMPEvents3_QueryInterface(IWMPEvents3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMPEvents3_AddRef(IWMPEvents3* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMPEvents3_Release(IWMPEvents3* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMPEvents methods ***/
static FORCEINLINE void IWMPEvents3_OpenStateChange(IWMPEvents3* This,LONG state) {
    This->lpVtbl->OpenStateChange(This,state);
}
static FORCEINLINE void IWMPEvents3_PlayStateChange(IWMPEvents3* This,LONG state) {
    This->lpVtbl->PlayStateChange(This,state);
}
static FORCEINLINE void IWMPEvents3_AudioLanguageChange(IWMPEvents3* This,LONG lang) {
    This->lpVtbl->AudioLanguageChange(This,lang);
}
static FORCEINLINE void IWMPEvents3_StatusChange(IWMPEvents3* This) {
    This->lpVtbl->StatusChange(This);
}
static FORCEINLINE void IWMPEvents3_ScriptCommand(IWMPEvents3* This,BSTR type,BSTR param) {
    This->lpVtbl->ScriptCommand(This,type,param);
}
static FORCEINLINE void IWMPEvents3_NewStream(IWMPEvents3* This) {
    This->lpVtbl->NewStream(This);
}
static FORCEINLINE void IWMPEvents3_Disconnect(IWMPEvents3* This,LONG result) {
    This->lpVtbl->Disconnect(This,result);
}
static FORCEINLINE void IWMPEvents3_Buffering(IWMPEvents3* This,VARIANT_BOOL start) {
    This->lpVtbl->Buffering(This,start);
}
static FORCEINLINE void IWMPEvents3_Error(IWMPEvents3* This) {
    This->lpVtbl->Error(This);
}
static FORCEINLINE void IWMPEvents3_Warning(IWMPEvents3* This,LONG warning,LONG param,BSTR description) {
    This->lpVtbl->Warning(This,warning,param,description);
}
static FORCEINLINE void IWMPEvents3_EndOfStream(IWMPEvents3* This,LONG result) {
    This->lpVtbl->EndOfStream(This,result);
}
static FORCEINLINE void IWMPEvents3_PositionChange(IWMPEvents3* This,double old_position,double new_position) {
    This->lpVtbl->PositionChange(This,old_position,new_position);
}
static FORCEINLINE void IWMPEvents3_MarkerHit(IWMPEvents3* This,LONG marker) {
    This->lpVtbl->MarkerHit(This,marker);
}
static FORCEINLINE void IWMPEvents3_DurationUnitChange(IWMPEvents3* This,LONG duration) {
    This->lpVtbl->DurationUnitChange(This,duration);
}
static FORCEINLINE void IWMPEvents3_CdromMediaChange(IWMPEvents3* This,LONG num) {
    This->lpVtbl->CdromMediaChange(This,num);
}
static FORCEINLINE void IWMPEvents3_PlaylistChange(IWMPEvents3* This,IDispatch *playlist,WMPPlaylistChangeEventType change) {
    This->lpVtbl->PlaylistChange(This,playlist,change);
}
static FORCEINLINE void IWMPEvents3_CurrentPlaylistChange(IWMPEvents3* This,WMPPlaylistChangeEventType change) {
    This->lpVtbl->CurrentPlaylistChange(This,change);
}
static FORCEINLINE void IWMPEvents3_CurrentPlaylistItemAvailable(IWMPEvents3* This,BSTR item) {
    This->lpVtbl->CurrentPlaylistItemAvailable(This,item);
}
static FORCEINLINE void IWMPEvents3_MediaChange(IWMPEvents3* This,IDispatch *item) {
    This->lpVtbl->MediaChange(This,item);
}
static FORCEINLINE void IWMPEvents3_CurrentMediaItemAvailable(IWMPEvents3* This,BSTR name) {
    This->lpVtbl->CurrentMediaItemAvailable(This,name);
}
static FORCEINLINE void IWMPEvents3_CurrentItemChange(IWMPEvents3* This,IDispatch *media) {
    This->lpVtbl->CurrentItemChange(This,media);
}
static FORCEINLINE void IWMPEvents3_MediaCollectionChange(IWMPEvents3* This) {
    This->lpVtbl->MediaCollectionChange(This);
}
static FORCEINLINE void IWMPEvents3_MediaCollectionAttributeStringAdded(IWMPEvents3* This,BSTR name,BSTR val) {
    This->lpVtbl->MediaCollectionAttributeStringAdded(This,name,val);
}
static FORCEINLINE void IWMPEvents3_MediaCollectionAttributeStringRemoved(IWMPEvents3* This,BSTR name,BSTR val) {
    This->lpVtbl->MediaCollectionAttributeStringRemoved(This,name,val);
}
static FORCEINLINE void IWMPEvents3_MediaCollectionAttributeStringChanged(IWMPEvents3* This,BSTR name,BSTR old_val,BSTR new_val) {
    This->lpVtbl->MediaCollectionAttributeStringChanged(This,name,old_val,new_val);
}
static FORCEINLINE void IWMPEvents3_PlaylistCollectionChange(IWMPEvents3* This) {
    This->lpVtbl->PlaylistCollectionChange(This);
}
static FORCEINLINE void IWMPEvents3_PlaylistCollectionPlaylistAdded(IWMPEvents3* This,BSTR name) {
    This->lpVtbl->PlaylistCollectionPlaylistAdded(This,name);
}
static FORCEINLINE void IWMPEvents3_PlaylistCollectionPlaylistRemoved(IWMPEvents3* This,BSTR name) {
    This->lpVtbl->PlaylistCollectionPlaylistRemoved(This,name);
}
static FORCEINLINE void IWMPEvents3_PlaylistCollectionPlaylistSetAsDeleted(IWMPEvents3* This,BSTR name,VARIANT_BOOL deleted) {
    This->lpVtbl->PlaylistCollectionPlaylistSetAsDeleted(This,name,deleted);
}
static FORCEINLINE void IWMPEvents3_ModeChange(IWMPEvents3* This,BSTR ModeName,VARIANT_BOOL value) {
    This->lpVtbl->ModeChange(This,ModeName,value);
}
static FORCEINLINE void IWMPEvents3_MediaError(IWMPEvents3* This,IDispatch *media) {
    This->lpVtbl->MediaError(This,media);
}
static FORCEINLINE void IWMPEvents3_OpenPlaylistSwitch(IWMPEvents3* This,IDispatch *item) {
    This->lpVtbl->OpenPlaylistSwitch(This,item);
}
static FORCEINLINE void IWMPEvents3_DomainChange(IWMPEvents3* This,BSTR domain) {
    This->lpVtbl->DomainChange(This,domain);
}
static FORCEINLINE void IWMPEvents3_SwitchedToPlayerApplication(IWMPEvents3* This) {
    This->lpVtbl->SwitchedToPlayerApplication(This);
}
static FORCEINLINE void IWMPEvents3_SwitchedToControl(IWMPEvents3* This) {
    This->lpVtbl->SwitchedToControl(This);
}
static FORCEINLINE void IWMPEvents3_PlayerDockedStateChange(IWMPEvents3* This) {
    This->lpVtbl->PlayerDockedStateChange(This);
}
static FORCEINLINE void IWMPEvents3_PlayerReconnect(IWMPEvents3* This) {
    This->lpVtbl->PlayerReconnect(This);
}
static FORCEINLINE void IWMPEvents3_Click(IWMPEvents3* This,short button,short shift_state,LONG x,LONG y) {
    This->lpVtbl->Click(This,button,shift_state,x,y);
}
static FORCEINLINE void IWMPEvents3_DoubleClick(IWMPEvents3* This,short button,short shift_state,LONG fX,LONG fY) {
    This->lpVtbl->DoubleClick(This,button,shift_state,fX,fY);
}
static FORCEINLINE void IWMPEvents3_KeyDown(IWMPEvents3* This,short keycode,short shift_state) {
    This->lpVtbl->KeyDown(This,keycode,shift_state);
}
static FORCEINLINE void IWMPEvents3_KeyPress(IWMPEvents3* This,short ascii) {
    This->lpVtbl->KeyPress(This,ascii);
}
static FORCEINLINE void IWMPEvents3_KeyUp(IWMPEvents3* This,short keycode,short shift_state) {
    This->lpVtbl->KeyUp(This,keycode,shift_state);
}
static FORCEINLINE void IWMPEvents3_MouseDown(IWMPEvents3* This,short button,short nShiftState,LONG x,LONG y) {
    This->lpVtbl->MouseDown(This,button,nShiftState,x,y);
}
static FORCEINLINE void IWMPEvents3_MouseMove(IWMPEvents3* This,short button,short shift_state,LONG x,LONG y) {
    This->lpVtbl->MouseMove(This,button,shift_state,x,y);
}
static FORCEINLINE 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 FORCEINLINE void IWMPEvents3_DeviceConnect(IWMPEvents3* This,IWMPSyncDevice *device) {
    This->lpVtbl->DeviceConnect(This,device);
}
static FORCEINLINE void IWMPEvents3_DeviceDisconnect(IWMPEvents3* This,IWMPSyncDevice *device) {
    This->lpVtbl->DeviceDisconnect(This,device);
}
static FORCEINLINE void IWMPEvents3_DeviceStatusChange(IWMPEvents3* This,IWMPSyncDevice *device,WMPDeviceStatus status) {
    This->lpVtbl->DeviceStatusChange(This,device,status);
}
static FORCEINLINE void IWMPEvents3_DeviceSyncStateChange(IWMPEvents3* This,IWMPSyncDevice *device,WMPSyncState state) {
    This->lpVtbl->DeviceSyncStateChange(This,device,state);
}
static FORCEINLINE void IWMPEvents3_DeviceSyncError(IWMPEvents3* This,IWMPSyncDevice *device,IDispatch *media) {
    This->lpVtbl->DeviceSyncError(This,device,media);
}
static FORCEINLINE void IWMPEvents3_CreatePartnershipComplete(IWMPEvents3* This,IWMPSyncDevice *device,HRESULT result) {
    This->lpVtbl->CreatePartnershipComplete(This,device,result);
}
/*** IWMPEvents3 methods ***/
static FORCEINLINE void IWMPEvents3_CdromRipStateChange(IWMPEvents3* This,IWMPCdromRip *rip,WMPRipState state) {
    This->lpVtbl->CdromRipStateChange(This,rip,state);
}
static FORCEINLINE void IWMPEvents3_CdromRipMediaError(IWMPEvents3* This,IWMPCdromRip *rip,IDispatch *media) {
    This->lpVtbl->CdromRipMediaError(This,rip,media);
}
static FORCEINLINE void IWMPEvents3_CdromBurnStateChange(IWMPEvents3* This,IWMPCdromBurn *burn,WMPBurnState state) {
    This->lpVtbl->CdromBurnStateChange(This,burn,state);
}
static FORCEINLINE void IWMPEvents3_CdromBurnMediaError(IWMPEvents3* This,IWMPCdromBurn *burn,IDispatch *media) {
    This->lpVtbl->CdromBurnMediaError(This,burn,media);
}
static FORCEINLINE void IWMPEvents3_CdromBurnError(IWMPEvents3* This,IWMPCdromBurn *burn,HRESULT error) {
    This->lpVtbl->CdromBurnError(This,burn,error);
}
static FORCEINLINE void IWMPEvents3_LibraryConnect(IWMPEvents3* This,IWMPLibrary *wmplibrary) {
    This->lpVtbl->LibraryConnect(This,wmplibrary);
}
static FORCEINLINE void IWMPEvents3_LibraryDisconnect(IWMPEvents3* This,IWMPLibrary *wmplibrary) {
    This->lpVtbl->LibraryDisconnect(This,wmplibrary);
}
static FORCEINLINE void IWMPEvents3_FolderScanStateChange(IWMPEvents3* This,WMPFolderScanState state) {
    This->lpVtbl->FolderScanStateChange(This,state);
}
static FORCEINLINE void IWMPEvents3_StringCollectionChange(IWMPEvents3* This,IDispatch *collection,WMPStringCollectionChangeEventType change,LONG index) {
    This->lpVtbl->StringCollectionChange(This,collection,change,index);
}
static FORCEINLINE void IWMPEvents3_MediaCollectionMediaAdded(IWMPEvents3* This,IDispatch *media) {
    This->lpVtbl->MediaCollectionMediaAdded(This,media);
}
static FORCEINLINE 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 FORCEINLINE HRESULT IWMPEvents4_QueryInterface(IWMPEvents4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWMPEvents4_AddRef(IWMPEvents4* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWMPEvents4_Release(IWMPEvents4* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMPEvents methods ***/
static FORCEINLINE void IWMPEvents4_OpenStateChange(IWMPEvents4* This,LONG state) {
    This->lpVtbl->OpenStateChange(This,state);
}
static FORCEINLINE void IWMPEvents4_PlayStateChange(IWMPEvents4* This,LONG state) {
    This->lpVtbl->PlayStateChange(This,state);
}
static FORCEINLINE void IWMPEvents4_AudioLanguageChange(IWMPEvents4* This,LONG lang) {
    This->lpVtbl->AudioLanguageChange(This,lang);
}
static FORCEINLINE void IWMPEvents4_StatusChange(IWMPEvents4* This) {
    This->lpVtbl->StatusChange(This);
}
static FORCEINLINE void IWMPEvents4_ScriptCommand(IWMPEvents4* This,BSTR type,BSTR param) {
    This->lpVtbl->ScriptCommand(This,type,param);
}
static FORCEINLINE void IWMPEvents4_NewStream(IWMPEvents4* This) {
    This->lpVtbl->NewStream(This);
}
static FORCEINLINE void IWMPEvents4_Disconnect(IWMPEvents4* This,LONG result) {
    This->lpVtbl->Disconnect(This,result);
}
static FORCEINLINE void IWMPEvents4_Buffering(IWMPEvents4* This,VARIANT_BOOL start) {
    This->lpVtbl->Buffering(This,start);
}
static FORCEINLINE void IWMPEvents4_Error(IWMPEvents4* This) {
    This->lpVtbl->Error(This);
}
static FORCEINLINE void IWMPEvents4_Warning(IWMPEvents4* This,LONG warning,LONG param,BSTR description) {
    This->lpVtbl->Warning(This,warning,param,description);
}
static FORCEINLINE void IWMPEvents4_EndOfStream(IWMPEvents4* This,LONG result) {
    This->lpVtbl->EndOfStream(This,result);
}
static FORCEINLINE void IWMPEvents4_PositionChange(IWMPEvents4* This,double old_position,double new_position) {
    This->lpVtbl->PositionChange(This,old_position,new_position);
}
static FORCEINLINE void IWMPEvents4_MarkerHit(IWMPEvents4* This,LONG marker) {
    This->lpVtbl->MarkerHit(This,marker);
}
static FORCEINLINE void IWMPEvents4_DurationUnitChange(IWMPEvents4* This,LONG duration) {
    This->lpVtbl->DurationUnitChange(This,duration);
}
static FORCEINLINE void IWMPEvents4_CdromMediaChange(IWMPEvents4* This,LONG num) {
    This->lpVtbl->CdromMediaChange(This,num);
}
static FORCEINLINE void IWMPEvents4_PlaylistChange(IWMPEvents4* This,IDispatch *playlist,WMPPlaylistChangeEventType change) {
    This->lpVtbl->PlaylistChange(This,playlist,change);
}
static FORCEINLINE void IWMPEvents4_CurrentPlaylistChange(IWMPEvents4* This,WMPPlaylistChangeEventType change) {
    This->lpVtbl->CurrentPlaylistChange(This,change);
}
static FORCEINLINE void IWMPEvents4_CurrentPlaylistItemAvailable(IWMPEvents4* This,BSTR item) {
    This->lpVtbl->CurrentPlaylistItemAvailable(This,item);
}
static FORCEINLINE void IWMPEvents4_MediaChange(IWMPEvents4* This,IDispatch *item) {
    This->lpVtbl->MediaChange(This,item);
}
static FORCEINLINE void IWMPEvents4_CurrentMediaItemAvailable(IWMPEvents4* This,BSTR name) {
    This->lpVtbl->CurrentMediaItemAvailable(This,name);
}
static FORCEINLINE void IWMPEvents4_CurrentItemChange(IWMPEvents4* This,IDispatch *media) {
    This->lpVtbl->CurrentItemChange(This,media);
}
static FORCEINLINE void IWMPEvents4_MediaCollectionChange(IWMPEvents4* This) {
    This->lpVtbl->MediaCollectionChange(This);
}
static FORCEINLINE void IWMPEvents4_MediaCollectionAttributeStringAdded(IWMPEvents4* This,BSTR name,BSTR val) {
    This->lpVtbl->MediaCollectionAttributeStringAdded(This,name,val);
}
static FORCEINLINE void IWMPEvents4_MediaCollectionAttributeStringRemoved(IWMPEvents4* This,BSTR name,BSTR val) {
    This->lpVtbl->MediaCollectionAttributeStringRemoved(This,name,val);
}
static FORCEINLINE void IWMPEvents4_MediaCollectionAttributeStringChanged(IWMPEvents4* This,BSTR name,BSTR old_val,BSTR new_val) {
    This->lpVtbl->MediaCollectionAttributeStringChanged(This,name,old_val,new_val);
}
static FORCEINLINE void IWMPEvents4_PlaylistCollectionChange(IWMPEvents4* This) {
    This->lpVtbl->PlaylistCollectionChange(This);
}
static FORCEINLINE void IWMPEvents4_PlaylistCollectionPlaylistAdded(IWMPEvents4* This,BSTR name) {
    This->lpVtbl->PlaylistCollectionPlaylistAdded(This,name);
}
static FORCEINLINE void IWMPEvents4_PlaylistCollectionPlaylistRemoved(IWMPEvents4* This,BSTR name) {
    This->lpVtbl->PlaylistCollectionPlaylistRemoved(This,name);
}
static FORCEINLINE void IWMPEvents4_PlaylistCollectionPlaylistSetAsDeleted(IWMPEvents4* This,BSTR name,VARIANT_BOOL deleted) {
    This->lpVtbl->PlaylistCollectionPlaylistSetAsDeleted(This,name,deleted);
}
static FORCEINLINE void IWMPEvents4_ModeChange(IWMPEvents4* This,BSTR ModeName,VARIANT_BOOL value) {
    This->lpVtbl->ModeChange(This,ModeName,value);
}
static FORCEINLINE void IWMPEvents4_MediaError(IWMPEvents4* This,IDispatch *media) {
    This->lpVtbl->MediaError(This,media);
}
static FORCEINLINE void IWMPEvents4_OpenPlaylistSwitch(IWMPEvents4* This,IDispatch *item) {
    This->lpVtbl->OpenPlaylistSwitch(This,item);
}
static FORCEINLINE void IWMPEvents4_DomainChange(IWMPEvents4* This,BSTR domain) {
    This->lpVtbl->DomainChange(This,domain);
}
static FORCEINLINE void IWMPEvents4_SwitchedToPlayerApplication(IWMPEvents4* This) {
    This->lpVtbl->SwitchedToPlayerApplication(This);
}
static FORCEINLINE void IWMPEvents4_SwitchedToControl(IWMPEvents4* This) {
    This->lpVtbl->SwitchedToControl(This);
}
static FORCEINLINE void IWMPEvents4_PlayerDockedStateChange(IWMPEvents4* This) {
    This->lpVtbl->PlayerDockedStateChange(This);
}
static FORCEINLINE void IWMPEvents4_PlayerReconnect(IWMPEvents4* This) {
    This->lpVtbl->PlayerReconnect(This);
}
static FORCEINLINE void IWMPEvents4_Click(IWMPEvents4* This,short button,short shift_state,LONG x,LONG y) {
    This->lpVtbl->Click(This,button,shift_state,x,y);
}
static FORCEINLINE void IWMPEvents4_DoubleClick(IWMPEvents4* This,short button,short shift_state,LONG fX,LONG fY) {
    This->lpVtbl->DoubleClick(This,button,shift_state,fX,fY);
}
static FORCEINLINE void IWMPEvents4_KeyDown(IWMPEvents4* This,short keycode,short shift_state) {
    This->lpVtbl->KeyDown(This,keycode,shift_state);
}
static FORCEINLINE void IWMPEvents4_KeyPress(IWMPEvents4* This,short ascii) {
    This->lpVtbl->KeyPress(This,ascii);
}
static FORCEINLINE void IWMPEvents4_KeyUp(IWMPEvents4* This,short keycode,short shift_state) {
    This->lpVtbl->KeyUp(This,keycode,shift_state);
}
static FORCEINLINE void IWMPEvents4_MouseDown(IWMPEvents4* This,short button,short nShiftState,LONG x,LONG y) {
    This->lpVtbl->MouseDown(This,button,nShiftState,x,y);
}
static FORCEINLINE void IWMPEvents4_MouseMove(IWMPEvents4* This,short button,short shift_state,LONG x,LONG y) {
    This->lpVtbl->MouseMove(This,button,shift_state,x,y);
}
static FORCEINLINE 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 FORCEINLINE void IWMPEvents4_DeviceConnect(IWMPEvents4* This,IWMPSyncDevice *device) {
    This->lpVtbl->DeviceConnect(This,device);
}
static FORCEINLINE void IWMPEvents4_DeviceDisconnect(IWMPEvents4* This,IWMPSyncDevice *device) {
    This->lpVtbl->DeviceDisconnect(This,device);
}
static FORCEINLINE void IWMPEvents4_DeviceStatusChange(IWMPEvents4* This,IWMPSyncDevice *device,WMPDeviceStatus status) {
    This->lpVtbl->DeviceStatusChange(This,device,status);
}
static FORCEINLINE void IWMPEvents4_DeviceSyncStateChange(IWMPEvents4* This,IWMPSyncDevice *device,WMPSyncState state) {
    This->lpVtbl->DeviceSyncStateChange(This,device,state);
}
static FORCEINLINE void IWMPEvents4_DeviceSyncError(IWMPEvents4* This,IWMPSyncDevice *device,IDispatch *media) {
    This->lpVtbl->DeviceSyncError(This,device,media);
}
static FORCEINLINE void IWMPEvents4_CreatePartnershipComplete(IWMPEvents4* This,IWMPSyncDevice *device,HRESULT result) {
    This->lpVtbl->CreatePartnershipComplete(This,device,result);
}
/*** IWMPEvents3 methods ***/
static FORCEINLINE void IWMPEvents4_CdromRipStateChange(IWMPEvents4* This,IWMPCdromRip *rip,WMPRipState state) {
    This->lpVtbl->CdromRipStateChange(This,rip,state);
}
static FORCEINLINE void IWMPEvents4_CdromRipMediaError(IWMPEvents4* This,IWMPCdromRip *rip,IDispatch *media) {
    This->lpVtbl->CdromRipMediaError(This,rip,media);
}
static FORCEINLINE void IWMPEvents4_CdromBurnStateChange(IWMPEvents4* This,IWMPCdromBurn *burn,WMPBurnState state) {
    This->lpVtbl->CdromBurnStateChange(This,burn,state);
}
static FORCEINLINE void IWMPEvents4_CdromBurnMediaError(IWMPEvents4* This,IWMPCdromBurn *burn,IDispatch *media) {
    This->lpVtbl->CdromBurnMediaError(This,burn,media);
}
static FORCEINLINE void IWMPEvents4_CdromBurnError(IWMPEvents4* This,IWMPCdromBurn *burn,HRESULT error) {
    This->lpVtbl->CdromBurnError(This,burn,error);
}
static FORCEINLINE void IWMPEvents4_LibraryConnect(IWMPEvents4* This,IWMPLibrary *wmplibrary) {
    This->lpVtbl->LibraryConnect(This,wmplibrary);
}
static FORCEINLINE void IWMPEvents4_LibraryDisconnect(IWMPEvents4* This,IWMPLibrary *wmplibrary) {
    This->lpVtbl->LibraryDisconnect(This,wmplibrary);
}
static FORCEINLINE void IWMPEvents4_FolderScanStateChange(IWMPEvents4* This,WMPFolderScanState state) {
    This->lpVtbl->FolderScanStateChange(This,state);
}
static FORCEINLINE void IWMPEvents4_StringCollectionChange(IWMPEvents4* This,IDispatch *collection,WMPStringCollectionChangeEventType change,LONG index) {
    This->lpVtbl->StringCollectionChange(This,collection,change,index);
}
static FORCEINLINE void IWMPEvents4_MediaCollectionMediaAdded(IWMPEvents4* This,IDispatch *media) {
    This->lpVtbl->MediaCollectionMediaAdded(This,media);
}
static FORCEINLINE void IWMPEvents4_MediaCollectionMediaRemoved(IWMPEvents4* This,IDispatch *media) {
    This->lpVtbl->MediaCollectionMediaRemoved(This,media);
}
/*** IWMPEvents4 methods ***/
static FORCEINLINE 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 FORCEINLINE HRESULT _WMPOCXEvents_QueryInterface(_WMPOCXEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG _WMPOCXEvents_AddRef(_WMPOCXEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG _WMPOCXEvents_Release(_WMPOCXEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT _WMPOCXEvents_GetTypeInfoCount(_WMPOCXEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT _WMPOCXEvents_GetTypeInfo(_WMPOCXEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE 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 FORCEINLINE 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__ */
