diff --git a/mingw-w64-headers/Makefile.am b/mingw-w64-headers/Makefile.am
index c764699..dedf305 100644
--- a/mingw-w64-headers/Makefile.am
+++ b/mingw-w64-headers/Makefile.am
@@ -229,6 +229,7 @@
   include/wincodec.idl \
   include/wincodecsdk.idl \
   include/wmcontainer.idl \
+  include/wmp.idl \
   include/wmsbuffer.idl \
   include/wmsdkidl.idl \
   include/wsdattachment.idl \
diff --git a/mingw-w64-headers/Makefile.in b/mingw-w64-headers/Makefile.in
index 4c89db7..7221351 100644
--- a/mingw-w64-headers/Makefile.in
+++ b/mingw-w64-headers/Makefile.in
@@ -531,6 +531,7 @@
 @HAVE_WIDL_TRUE@  include/wincodec.idl \
 @HAVE_WIDL_TRUE@  include/wincodecsdk.idl \
 @HAVE_WIDL_TRUE@  include/wmcontainer.idl \
+@HAVE_WIDL_TRUE@  include/wmp.idl \
 @HAVE_WIDL_TRUE@  include/wmsbuffer.idl \
 @HAVE_WIDL_TRUE@  include/wmsdkidl.idl \
 @HAVE_WIDL_TRUE@  include/wsdattachment.idl \
diff --git a/mingw-w64-headers/include/wmp.h b/mingw-w64-headers/include/wmp.h
new file mode 100644
index 0000000..460ca37
--- /dev/null
+++ b/mingw-w64-headers/include/wmp.h
@@ -0,0 +1,10255 @@
+/*** Autogenerated by WIDL 6.1 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__ */
diff --git a/mingw-w64-headers/include/wmp.idl b/mingw-w64-headers/include/wmp.idl
new file mode 100644
index 0000000..ac2fa27
--- /dev/null
+++ b/mingw-w64-headers/include/wmp.idl
@@ -0,0 +1,1514 @@
+/*
+ * Copyright 2014 Jacek Caban for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+import "oaidl.idl";
+import "ocidl.idl";
+
+#ifndef __WIDL__
+#define threading(model)
+#define progid(str)
+#define vi_progid(str)
+#endif
+
+[
+    helpstring("Windows Media Player"),
+    version(1.0),
+    uuid(6bf52a50-394a-11d3-b153-00c04f79Faa6)
+]
+library WMPLib {
+    importlib("stdole2.tlb");
+
+    typedef enum {
+        wmposUndefined,
+        wmposPlaylistChanging,
+        wmposPlaylistLocating,
+        wmposPlaylistConnecting,
+        wmposPlaylistLoading,
+        wmposPlaylistOpening,
+        wmposPlaylistOpenNoMedia,
+        wmposPlaylistChanged,
+        wmposMediaChanging,
+        wmposMediaLocating,
+        wmposMediaConnecting,
+        wmposMediaLoading,
+        wmposMediaOpening,
+        wmposMediaOpen,
+        wmposBeginCodecAcquisition,
+        wmposEndCodecAcquisition,
+        wmposBeginLicenseAcquisition,
+        wmposEndLicenseAcquisition,
+        wmposBeginIndividualization,
+        wmposEndIndividualization,
+        wmposMediaWaiting,
+        wmposOpeningUnknownURL
+    } WMPOpenState;
+
+    typedef enum {
+        wmppsUndefined,
+        wmppsStopped,
+        wmppsPaused,
+        wmppsPlaying,
+        wmppsScanForward,
+        wmppsScanReverse,
+        wmppsBuffering,
+        wmppsWaiting,
+        wmppsMediaEnded,
+        wmppsTransitioning,
+        wmppsReady,
+        wmppsReconnecting,
+        wmppsLast
+    } WMPPlayState;
+
+    typedef enum {
+        wmplcUnknown,
+        wmplcClear,
+        wmplcInfoChange,
+        wmplcMove,
+        wmplcDelete,
+        wmplcInsert,
+        wmplcAppend,
+        wmplcPrivate,
+        wmplcNameChange,
+        wmplcMorph,
+        wmplcSort,
+        wmplcLast
+    } WMPPlaylistChangeEventType;
+
+    typedef enum {
+        wmpdsUnknown,
+        wmpdsPartnershipExists,
+        wmpdsPartnershipDeclined,
+        wmpdsPartnershipAnother,
+        wmpdsManualDevice,
+        wmpdsNewDevice,
+        wmpdsLast
+    } WMPDeviceStatus;
+
+    typedef enum {
+        wmpssUnknown,
+        wmpssSynchronizing,
+        wmpssStopped,
+        wmpssEstimating,
+        wmpssLast
+    } WMPSyncState;
+
+    typedef enum {
+        wmprsUnknown,
+        wmprsRipping,
+        wmprsStopped
+    } WMPRipState;
+
+    typedef enum {
+        wmpbfAudioCD,
+        wmpbfDataCD
+    } WMPBurnFormat;
+
+    typedef enum {
+        wmpbsUnknown,
+        wmpbsBusy,
+        wmpbsReady,
+        wmpbsWaitingForDisc,
+        wmpbsRefreshStatusPending,
+        wmpbsPreparingToBurn,
+        wmpbsBurning,
+        wmpbsStopped,
+        wmpbsErasing,
+        wmpbsDownloading
+    } WMPBurnState;
+
+    typedef enum {
+        wmpltUnknown,
+        wmpltAll,
+        wmpltLocal,
+        wmpltRemote,
+        wmpltDisc,
+        wmpltPortableDevice
+    } WMPLibraryType;
+
+    typedef enum {
+        wmpfssUnknown,
+        wmpfssScanning,
+        wmpfssUpdating,
+        wmpfssStopped
+    } WMPFolderScanState;
+
+    typedef enum {
+        wmpsccetUnknown,
+        wmpsccetInsert,
+        wmpsccetChange,
+        wmpsccetDelete,
+        wmpsccetClear,
+        wmpsccetBeginUpdates,
+        wmpsccetEndUpdates
+    } WMPStringCollectionChangeEventType;
+
+    interface IWMPMedia;
+
+    [
+        odl,
+        uuid(d5f0f4f1-130c-11d3-b14e-00c04f79Faa6),
+        dual,
+        oleautomation
+    ]
+    interface IWMPPlaylist : IDispatch
+    {
+        [id(0x00c9), propget]
+        HRESULT count([out, retval] long *plCount);
+
+        [id(0x00ca), propget]
+        HRESULT name([out, retval] BSTR *pbstrName);
+        [id(0x00ca), propput]
+        HRESULT name([in] BSTR pbstrName);
+
+        [id(0x00d2), propget]
+        HRESULT attributeCount([out, retval] long *plCount);
+
+        [id(0x00d3), propget]
+        HRESULT attributeName(
+            [in] long lIndex,
+            [out, retval] BSTR *pbstrAttributeName);
+
+        [id(0x00d4), propget]
+        HRESULT Item(
+            [in] long lIndex,
+            [out, retval] IWMPMedia** ppIWMPMedia);
+
+        [id(0x00cb)]
+        HRESULT getItemInfo(
+            [in] BSTR bstrName,
+            [out, retval] BSTR *pbstrVal);
+
+        [id(0x00cc)]
+        HRESULT setItemInfo(
+            [in] BSTR bstrName,
+            [in] BSTR bstrValue);
+
+        [id(0x00d5), propget]
+        HRESULT isIdentical(
+            [in] IWMPPlaylist *pIWMPPlaylist,
+            [out, retval] VARIANT_BOOL *pvbool);
+
+        [id(0x00cd)]
+        HRESULT clear();
+
+        [id(0x00ce)]
+        HRESULT insertItem(
+            [in] long lIndex,
+            [in] IWMPMedia *pIWMPMedia);
+
+        [id(0x00cf)]
+        HRESULT appendItem([in] IWMPMedia *pIWMPMedia);
+
+        [id(0x00d0)]
+        HRESULT removeItem([in] IWMPMedia *pIWMPMedia);
+
+        [id(0x00d1)]
+        HRESULT moveItem(
+            long lIndexOld,
+            long lIndexNew);
+    }
+
+    [
+        odl,
+        uuid(94d55e95-3Fac-11d3-b155-00c04f79faa6),
+        dual,
+        oleautomation
+    ]
+    interface IWMPMedia : IDispatch
+    {
+        [id(0x02fb), propget]
+        HRESULT isIdentical(
+            [in] IWMPMedia *pIWMPMedia,
+            [out, retval] VARIANT_BOOL *pvbool);
+
+        [id(0x02ef), propget]
+        HRESULT sourceURL([out, retval] BSTR *pbstrSourceURL);
+
+        [id(0x02fc), propget]
+        HRESULT name([out, retval] BSTR *pbstrName);
+        [id(0x02fc), propput]
+        HRESULT name([in] BSTR pbstrName);
+
+        [id(0x02f0), propget]
+        HRESULT imageSourceWidth([out, retval] long *pWidth);
+
+        [id(0x02f1), propget]
+        HRESULT imageSourceHeight([out, retval] long *pHeight);
+
+        [id(0x02f2), propget]
+        HRESULT markerCount([out, retval] long *pMarkerCount);
+
+        [id(0x02f3)]
+        HRESULT getMarkerTime(
+            [in] long MarkerNum,
+            [out, retval] double *pMarkerTime);
+
+        [id(0x02f4)]
+        HRESULT getMarkerName(
+            [in] long MarkerNum,
+            [out, retval] BSTR *pbstrMarkerName);
+
+        [id(0x02f5), propget]
+        HRESULT duration([out, retval] double *pDuration);
+
+        [id(0x02f6), propget]
+        HRESULT durationString([out, retval] BSTR *pbstrDuration);
+
+        [id(0x02f7), propget]
+        HRESULT attributeCount([out, retval] long *plCount);
+
+        [id(0x02f8)]
+        HRESULT getAttributeName(
+            [in] long lIndex,
+            [out, retval] BSTR *pbstrItemName);
+
+        [id(0x02f9)]
+        HRESULT getItemInfo(
+            [in] BSTR bstrItemName,
+            [out, retval] BSTR *pbstrVal);
+
+        [id(0x02fa)]
+        HRESULT setItemInfo(
+            [in] BSTR bstrItemName,
+            [in] BSTR bstrVal);
+
+        [id(0x02fd)]
+        HRESULT getItemInfoByAtom(
+            [in] long lAtom,
+            [out, retval] BSTR *pbstrVal);
+
+        [id(0x02fe)]
+        HRESULT isMemberOf(
+            [in] IWMPPlaylist *pPlaylist,
+            [out, retval] VARIANT_BOOL *pvarfIsMemberOf);
+
+        [id(0x02ff)]
+        HRESULT isReadOnlyItem(
+            [in] BSTR bstrItemName,
+            [out, retval] VARIANT_BOOL *pvarfIsReadOnly);
+    }
+
+    [
+        odl,
+        uuid(74c09E02-f828-11d2-a74b-00a0c905f36e),
+        dual,
+        oleautomation
+    ]
+    interface IWMPControls : IDispatch {
+        [id(0x003e), propget]
+        HRESULT isAvailable(
+            [in] BSTR bstrItem,
+            [out, retval] VARIANT_BOOL *pIsAvailable);
+
+        [id(0x0033)]
+        HRESULT play();
+
+        [id(0x0034)]
+        HRESULT stop();
+
+        [id(0x0035)]
+        HRESULT pause();
+
+        [id(0x0036)]
+        HRESULT fastForward();
+
+        [id(0x0037)]
+        HRESULT fastReverse();
+
+        [id(0x0038), propget]
+        HRESULT currentPosition([out, retval] double *pdCurrentPosition);
+        [id(0x0038), propput]
+        HRESULT currentPosition([in] double pdCurrentPosition);
+
+        [id(0x0039), propget]
+        HRESULT currentPositionString([out, retval] BSTR *pbstrCurrentPosition);
+
+        [id(0x003a)]
+        HRESULT next();
+
+        [id(0x003b)]
+        HRESULT previous();
+
+        [id(0x003c)]
+        HRESULT currentItem([out, retval] IWMPMedia **ppIWMPMedia);
+
+        [id(0x003c), propput]
+        HRESULT currentItem([in] IWMPMedia *ppIWMPMedia);
+
+        [id(0x003d), propget]
+        HRESULT currentMarker([out, retval] long *plMarker);
+
+        [id(0x003d), propput]
+        HRESULT currentMarker([in] long plMarker);
+
+        [id(0x003f)]
+        HRESULT playItem([in] IWMPMedia *pIWMPMedia);
+    }
+
+    [
+        odl,
+        uuid(6f030d25-0890-480f-9775-1f7e40ab5b8e),
+        dual,
+        oleautomation
+    ]
+    interface IWMPControls2 : IWMPControls
+    {
+        [id(0x0040)]
+        HRESULT step([in] long lStep);
+    }
+
+    [
+        odl,
+        uuid(cbb92747-741f-44fe-ab5b-f1a48f3b2a59),
+        oleautomation
+    ]
+    interface IWMPRemoteMediaServices : IUnknown
+    {
+        HRESULT GetServiceType([out, retval] BSTR *type);
+
+        HRESULT GetApplicationName([out, retval] BSTR *name);
+
+        HRESULT GetScriptableObject([out, retval] BSTR *name, [out, retval] IDispatch **out);
+
+        HRESULT GetCustomUIMode([out, retval] BSTR *file);
+    }
+
+    [
+        odl,
+        uuid(9104d1ab-80c9-4fed-abf0-2e6417a6df14),
+        dual,
+        oleautomation
+    ]
+    interface IWMPSettings : IDispatch
+    {
+        [id(0x0071), propget]
+        HRESULT isAvailable(
+            [in] BSTR bstrItem,
+            [out, retval] VARIANT_BOOL *pIsAvailable);
+
+        [id(0x0065), propget]
+        HRESULT autoStart([out, retval] VARIANT_BOOL *pfAutoStart);
+        [id(0x0065), propput]
+        HRESULT autoStart([in] VARIANT_BOOL pfAutoStart);
+
+        [id(0x006c), propget]
+        HRESULT baseURL([out, retval] BSTR *pbstrBaseURL);
+        [id(0x006c), propput]
+        HRESULT baseURL([in] BSTR pbstrBaseURL);
+
+        [id(0x006d), propget]
+        HRESULT defaultFrame([out, retval] BSTR *pbstrDefaultFrame);
+        [id(0x006d), propput]
+        HRESULT defaultFrame([in] BSTR pbstrDefaultFrame);
+
+        [id(0x0067), propget]
+        HRESULT invokeURLs([out, retval] VARIANT_BOOL *pfInvokeURLs);
+        [id(0x0067), propput]
+        HRESULT invokeURLs([in] VARIANT_BOOL pfInvokeURLs);
+
+        [id(0x0068), propget]
+        HRESULT mute([out, retval] VARIANT_BOOL *pfMute);
+        [id(0x0068), propput]
+        HRESULT mute([in] VARIANT_BOOL pfMute);
+
+        [id(0x0069), propget]
+        HRESULT playCount([out, retval] long *plCount);
+        [id(0x0069), propput]
+        HRESULT playCount([in] long plCount);
+
+        [id(0x006a), propget]
+        HRESULT rate([out, retval] double *pdRate);
+        [id(0x006a), propput]
+        HRESULT rate([in] double pdRate);
+
+        [id(0x0066), propget]
+        HRESULT balance([out, retval] long *plBalance);
+        [id(0x0066), propput]
+        HRESULT balance([in] long plBalance);
+
+        [id(0x006b), propget]
+        HRESULT volume([out, retval] long *plVolume);
+        [id(0x006b), propput]
+        HRESULT volume([in] long plVolume);
+
+        [id(0x006e)]
+        HRESULT getMode(
+            [in] BSTR bstrMode,
+            [out, retval] VARIANT_BOOL *pvarfMode);
+
+        [id(0x006f)]
+        HRESULT setMode(
+            [in] BSTR bstrMode,
+            [in] VARIANT_BOOL varfMode);
+
+        [id(0x0070), propget]
+        HRESULT enableErrorDialogs([out, retval] VARIANT_BOOL *pfEnableErrorDialogs);
+
+        [id(0x0070), propput]
+        HRESULT enableErrorDialogs([in] VARIANT_BOOL pfEnableErrorDialogs);
+    }
+
+    [
+        odl,
+        uuid(4a976298-8c0d-11d3-b389-00c04f68574b),
+        dual,
+        oleautomation
+    ]
+    interface IWMPStringCollection : IDispatch
+    {
+        [id(0x0191), propget]
+        HRESULT count([out, retval] long *plCount);
+
+        [id(0x0192)]
+        HRESULT Item(
+            [in] long lIndex,
+            [out, retval] BSTR *pbstrString);
+    }
+
+    [
+        odl,
+        uuid(8363bc22-b4b4-4b19-989d-1cd765749dd1),
+        dual,
+        oleautomation
+    ]
+    interface IWMPMediaCollection : IDispatch
+    {
+        [id(0x01c4)]
+        HRESULT add(
+            [in] BSTR bstrURL,
+            [out, retval] IWMPMedia **ppItem);
+
+        [id(0x01c5)]
+        HRESULT getAll([out, retval] IWMPPlaylist **ppMediaItems);
+
+        [id(0x01c6)]
+        HRESULT getByName(
+            [in] BSTR bstrName,
+            [out, retval] IWMPPlaylist **ppMediaItems);
+
+        [id(0x01c7)]
+        HRESULT getByGenre(
+            [in] BSTR bstrGenre,
+            [out, retval] IWMPPlaylist **ppMediaItems);
+
+        [id(0x01c8)]
+        HRESULT getByAuthor(
+            [in] BSTR bstrAuthor,
+            [out, retval] IWMPPlaylist **ppMediaItems);
+
+        [id(0x01c9)]
+        HRESULT getByAlbum(
+            [in] BSTR bstrAlbum,
+            [out, retval] IWMPPlaylist **ppMediaItems);
+
+        [id(0x01ca)]
+        HRESULT getByAttribute(
+            [in] BSTR bstrAttribute,
+            [in] BSTR bstrValue,
+            [out, retval] IWMPPlaylist **ppMediaItems);
+
+        [id(0x01cb)]
+        HRESULT remove(
+            [in] IWMPMedia *pItem,
+            [in] VARIANT_BOOL varfDeleteFile);
+
+        [id(0x01cd)]
+        HRESULT getAttributeStringCollection(
+            [in] BSTR bstrAttribute,
+            [in] BSTR bstrMediaType,
+            [out, retval] IWMPStringCollection **ppStringCollection);
+
+        [id(0x01d6)]
+        HRESULT getMediaAtom(
+            [in] BSTR bstrItemName,
+            [out, retval] long *plAtom);
+
+        [id(0x01d7)]
+        HRESULT setDeleted(
+            [in] IWMPMedia *pItem,
+            [in] VARIANT_BOOL varfIsDeleted);
+
+        [id(0x01d8)]
+        HRESULT isDeleted(
+            [in] IWMPMedia *pItem,
+            [out, retval] VARIANT_BOOL *pvarfIsDeleted);
+    }
+
+    [
+        odl,
+        uuid(679409c0-99f7-11d3-9fb7-00105aa620bb),
+        dual,
+        oleautomation
+    ]
+    interface IWMPPlaylistArray : IDispatch
+    {
+        [id(0x01f5), propget]
+        HRESULT count([out, retval] long *plCount);
+
+        [id(0x01f6)]
+        HRESULT Item(
+            [in] long lIndex,
+            [out, retval] IWMPPlaylist **ppItem);
+    }
+
+    [
+        odl,
+        uuid(10a13217-23a7-439b-b1c0-d847c79b7774),
+        dual,
+        oleautomation
+    ]
+    interface IWMPPlaylistCollection : IDispatch
+    {
+        [id(0x0228)]
+        HRESULT newPlaylist(
+            [in] BSTR bstrName,
+            [out, retval] IWMPPlaylist **ppItem);
+
+        [id(0x0229)]
+        HRESULT getAll([out, retval] IWMPPlaylistArray **ppPlaylistArray);
+
+        [id(0x022a)]
+        HRESULT getByName(
+            [in] BSTR bstrName,
+            [out, retval] IWMPPlaylistArray **ppPlaylistArray);
+
+        [id(0x022c)]
+        HRESULT remove([in] IWMPPlaylist *pItem);
+
+        [id(0x0230)]
+        HRESULT setDeleted(
+            [in] IWMPPlaylist *pItem,
+            [in] VARIANT_BOOL varfIsDeleted);
+
+        [id(0x0231)]
+        HRESULT isDeleted(
+            [in] IWMPPlaylist *pItem,
+            [out, retval] VARIANT_BOOL *pvarfIsDeleted);
+
+        [id(0x0232)]
+        HRESULT importPlaylist(
+            [in] IWMPPlaylist *pItem,
+            [out, retval] IWMPPlaylist **ppImportedItem);
+    }
+
+    [
+        odl,
+        uuid(ec21b779-edef-462d-bba4-ad9dde2b29a7),
+        dual,
+        oleautomation
+    ]
+    interface IWMPNetwork : IDispatch
+    {
+        [id(0x0321), propget]
+        HRESULT bandWidth([out, retval] long *plBandwidth);
+
+        [id(0x0322), propget]
+        HRESULT recoveredPackets([out, retval] long *plRecoveredPackets);
+
+        [id(0x0323), propget]
+        HRESULT sourceProtocol([out, retval] BSTR *pbstrSourceProtocol);
+
+        [id(0x0324), propget]
+        HRESULT receivedPackets([out, retval] long *plReceivedPackets);
+
+        [id(0x0325), propget]
+        HRESULT lostPackets([out, retval] long *plLostPackets);
+
+        [id(0x0326), propget]
+        HRESULT receptionQuality([out, retval] long *plReceptionQuality);
+
+        [id(0x0327), propget]
+        HRESULT bufferingCount([out, retval] long *plBufferingCount);
+
+        [id(0x0328), propget]
+        HRESULT bufferingProgress([out, retval] long *plBufferingProgress);
+
+        [id(0x0329), propget]
+        HRESULT bufferingTime([out, retval] long *plBufferingTime);
+
+        [id(0x0329), propput]
+        HRESULT bufferingTime([in] long plBufferingTime);
+
+        [id(0x032a), propget]
+        HRESULT frameRate([out, retval] long *plFrameRate);
+
+        [id(0x032b), propget]
+        HRESULT maxBitRate([out, retval] long *plBitRate);
+
+        [id(0x032c), propget]
+        HRESULT bitRate([out, retval] long *plBitRate);
+
+        [id(0x032d)]
+        HRESULT getProxySettings(
+            [in] BSTR bstrProtocol,
+            [out, retval] long *plProxySetting);
+
+        [id(0x032e)]
+        HRESULT setProxySettings(
+            [in] BSTR bstrProtocol,
+            [in] long lProxySetting);
+
+        [id(0x032f)]
+        HRESULT getProxyName(
+            [in] BSTR bstrProtocol,
+            [out, retval] BSTR *pbstrProxyName);
+
+        [id(0x0330)]
+        HRESULT setProxyName(
+            [in] BSTR bstrProtocol,
+            [in] BSTR bstrProxyName);
+
+        [id(0x0331)]
+        HRESULT getProxyPort(
+            [in] BSTR bstrProtocol,
+            [out, retval] long *lProxyPort);
+
+        [id(0x0332)]
+        HRESULT setProxyPort(
+            [in] BSTR bstrProtocol,
+            [in] long lProxyPort);
+
+        [id(0x0333)]
+        HRESULT getProxyExceptionList(
+            [in] BSTR bstrProtocol,
+            [out, retval] BSTR *pbstrExceptionList);
+
+        [id(0x0334)]
+        HRESULT setProxyExceptionList(
+            [in] BSTR bstrProtocol,
+            [in] BSTR pbstrExceptionList);
+
+        [id(0x0335)]
+        HRESULT getProxyBypassForLocal(
+            [in] BSTR bstrProtocol,
+            [out, retval] VARIANT_BOOL *pfBypassForLocal);
+
+        [id(0x0336)]
+        HRESULT setProxyBypassForLocal(
+            [in] BSTR bstrProtocol,
+            [in] VARIANT_BOOL fBypassForLocal);
+
+        [id(0x0337), propget]
+        HRESULT maxBandwidth([out, retval] long *lMaxBandwidth);
+        [id(0x0337), propput]
+        HRESULT maxBandwidth([in] long lMaxBandwidth);
+
+        [id(0x0338), propget]
+        HRESULT downloadProgress([out, retval] long *plDownloadProgress);
+
+        [id(0x0339), propget]
+        HRESULT encodedFrameRate([out, retval] long *plFrameRate);
+
+        [id(0x033a), propget]
+        HRESULT framesSkipped([out, retval] long *plFrames);
+    }
+
+    [
+        odl,
+        uuid(cfab6e98-8730-11d3-b388-00c04f68574b),
+        dual,
+        oleautomation
+    ]
+    interface IWMPCdrom : IDispatch
+    {
+        [id(0x00fb), propget]
+        HRESULT driveSpecifier([out, retval] BSTR *pbstrDrive);
+
+        [id(0x00fc), propget]
+        HRESULT Playlist([out, retval] IWMPPlaylist **ppPlaylist);
+
+        [id(0x00fd)]
+        HRESULT eject();
+    }
+
+    [
+        odl,
+        uuid(ee4c8fe2-34b2-11d3-a3bf-006097c9b344),
+        dual,
+        oleautomation
+    ]
+    interface IWMPCdromCollection : IDispatch
+    {
+        [id(0x012d), propget]
+        HRESULT count([out, retval] long *plCount);
+
+        [id(0x012e)]
+        HRESULT Item(
+            [in] long lIndex,
+            [out, retval] IWMPCdrom **ppItem);
+
+        [id(0x012f)]
+        HRESULT getByDriveSpecifier(
+            [in] BSTR bstrDriveSpecifier,
+            [out, retval] IWMPCdrom **ppCdrom);
+    }
+
+    [
+        odl,
+        uuid(8da61686-4668-4a5c-ae5d-803193293dbe),
+        dual,
+        oleautomation
+    ]
+    interface IWMPDVD : IDispatch
+    {
+        [id(0x03e9), propget]
+        HRESULT isAvailable(
+            [in] BSTR bstrItem,
+            [out, retval] VARIANT_BOOL *pIsAvailable);
+
+        [id(0x03ea), propget]
+        HRESULT domain([out, retval] BSTR *strDomain);
+
+        [id(0x03eb)]
+        HRESULT topMenu();
+
+        [id(0x03ec)]
+        HRESULT titleMenu();
+
+        [id(0x03ed)]
+        HRESULT back();
+
+        [id(0x03ee)]
+        HRESULT resume();
+    }
+
+    [
+        odl,
+        uuid(4f2df574-c588-11d3-9ed0-00c04fb6e937),
+        dual,
+        oleautomation
+    ]
+    interface IWMPClosedCaption : IDispatch
+    {
+        [id(0x03b7), propget]
+        HRESULT SAMIStyle([out, retval] BSTR *pbstrSAMIStyle);
+        [id(0x03b7), propput]
+        HRESULT SAMIStyle([in] BSTR pbstrSAMIStyle);
+
+        [id(0x03b8), propget]
+        HRESULT SAMILang([out, retval] BSTR *pbstrSAMILang);
+
+        [id(0x03b8), propput]
+        HRESULT SAMILang([in] BSTR pbstrSAMILang);
+
+        [id(0x03b9), propget]
+        HRESULT SAMIFileName([out, retval] BSTR *pbstrSAMIFileName);
+
+        [id(0x03b9), propput]
+        HRESULT SAMIFileName([in] BSTR pbstrSAMIFileName);
+
+        [id(0x03ba), propget]
+        HRESULT captioningId([out, retval] BSTR *pbstrCaptioningID);
+
+        [id(0x03ba), propput]
+        HRESULT captioningId([in] BSTR pbstrCaptioningID);
+    }
+
+    [
+        odl,
+        uuid(3614c646-3b3b-4de7-a81e-930e3f2127b3),
+        dual,
+        oleautomation
+    ]
+    interface IWMPErrorItem : IDispatch
+    {
+        [id(0x0385), propget]
+        HRESULT errorCode([out, retval] long *phr);
+
+        [id(0x0386), propget]
+        HRESULT errorDescription([out, retval] BSTR *pbstrDescription);
+
+        [id(0x0387), propget]
+        HRESULT errorContext([out, retval] VARIANT *pvarContext);
+
+        [id(0x0388), propget]
+        HRESULT remedy([out, retval] long *plRemedy);
+
+        [id(0x0389), propget]
+        HRESULT customUrl([out, retval] BSTR *pbstrCustomUrl);
+    }
+
+    [
+        odl,
+        uuid(ab7c88bb-143e-4ea4-acc3-e4350b2106c3),
+        dual,
+        oleautomation
+    ]
+    interface IWMPMedia2 : IWMPMedia
+    {
+        [id(0x0300), propget]
+        HRESULT error([out, retval] IWMPErrorItem **out);
+    }
+
+    [
+        odl,
+        uuid(f118efc7-f03a-4fb4-99c9-1c02a5c1065b),
+        dual,
+        oleautomation
+    ]
+    interface IWMPMedia3 : IWMPMedia2
+    {
+        [id(0x0301)]
+        HRESULT getAttributeCountByType([in] BSTR type, [in] BSTR language, [out, retval] long *out);
+
+        [id(0x0302)]
+        HRESULT getItemInfoByType([in] BSTR type, [in] BSTR language, [in] long index, [out, retval] VARIANT *out);
+    }
+
+    [
+        odl,
+        uuid(a12dcf7d-14ab-4c1b-a8cd-63909f06025b),
+        dual,
+        oleautomation
+    ]
+    interface IWMPError : IDispatch
+    {
+        [id(0x0353)]
+        HRESULT clearErrorQueue();
+
+        [id(0x0354), propget]
+        HRESULT errorCount([out, retval] long *plNumErrors);
+
+        [id(0x0355), propget]
+        HRESULT Item(
+            [in] long dwIndex,
+            [out, retval] IWMPErrorItem **ppErrorItem);
+
+        [id(0x0356)]
+        HRESULT webHelp();
+    }
+
+    [
+        odl,
+        uuid(40897764-ceab-47be-ad4a-8e28537f9bbf),
+        dual,
+        oleautomation
+    ]
+    interface IWMPPlayerApplication : IDispatch
+    {
+        [id(0x044d)]
+        HRESULT switchToPlayerApplication();
+
+        [id(0x044e)]
+        HRESULT switchToControl();
+
+        [id(0x044f), propget]
+        HRESULT playerDocked([out, retval] VARIANT_BOOL* pbPlayerDocked);
+
+        [id(0x0450), propget]
+        HRESULT hasDisplay([out, retval] VARIANT_BOOL *pbHasDisplay);
+    }
+
+    [
+        odl,
+        uuid(d84cca99-cce2-11d2-9ecc-0000f8085981),
+        dual,
+        oleautomation
+    ]
+    interface IWMPCore : IDispatch
+    {
+        [id(0x0003)]
+        HRESULT close();
+
+        [id(0x0001), propget]
+        HRESULT URL([out, retval] BSTR *pbstrURL);
+        [id(0x0001), propput]
+        HRESULT URL([in] BSTR pbstrURL);
+
+        [id(0x0002), propget]
+        HRESULT openState([out, retval] WMPOpenState *pwmpos);
+
+        [id(0x000a), propget]
+        HRESULT playState([out, retval] WMPPlayState *pwmpps);
+
+        [id(0x0004), propget]
+        HRESULT controls([out, retval] IWMPControls **ppControl);
+
+        [id(0x0005), propget]
+        HRESULT settings([out, retval] IWMPSettings **ppSettings);
+
+        [id(0x0006), propget]
+        HRESULT currentMedia([out, retval] IWMPMedia **ppMedia);
+        [id(0x0006), propput]
+        HRESULT currentMedia([in] IWMPMedia *ppMedia);
+
+        [id(0x0008), propget]
+        HRESULT mediaCollection([out, retval] IWMPMediaCollection **ppMediaCollection);
+
+        [id(0x0009), propget]
+        HRESULT playlistCollection([out, retval] IWMPPlaylistCollection **ppPlaylistCollection);
+
+        [id(0x000b), propget]
+        HRESULT versionInfo([out, retval] BSTR *pbstrVersionInfo);
+
+        [id(0x000c)]
+        HRESULT launchURL([in] BSTR bstrURL);
+
+        [id(0x0007), propget]
+        HRESULT network([out, retval] IWMPNetwork **ppQNI);
+
+        [id(0x000d), propget]
+        HRESULT currentPlaylist([out, retval] IWMPPlaylist **ppPL);
+        [id(0x000d), propput]
+        HRESULT currentPlaylist([in] IWMPPlaylist *ppPL);
+
+        [id(0x000e), propget]
+        HRESULT cdromCollection([out, retval] IWMPCdromCollection **ppCdromCollection);
+
+        [id(0x000f), propget]
+        HRESULT closedCaption([out, retval] IWMPClosedCaption **ppClosedCaption);
+
+        [id(0x0010), propget]
+        HRESULT isOnline([out, retval] VARIANT_BOOL *pfOnline);
+
+        [id(0x0011), propget]
+        HRESULT Error([out, retval] IWMPError **ppError);
+
+        [id(0x0012), propget]
+        HRESULT status([out, retval] BSTR *pbstrStatus);
+    }
+
+    [
+        odl,
+        uuid(bc17e5B7-7561-4c18-bb90-17d485775659),
+        dual,
+        oleautomation
+    ]
+    interface IWMPCore2 : IWMPCore {
+        [id(0x0028), propget]
+        HRESULT dvd([out, retval] IWMPDVD **ppDVD);
+    }
+
+    [
+        odl,
+        uuid(7587c667-628f-499f-88e7-6A6f4e888464),
+        dual,
+        oleautomation
+    ]
+    interface IWMPCore3 : IWMPCore2
+    {
+        [id(0x0029)]
+        HRESULT newPlaylist(
+            [in] BSTR bstrName,
+            [in] BSTR bstrURL,
+            [out, retval] IWMPPlaylist **ppPlaylist);
+
+        [id(0x002a)]
+        HRESULT newMedia(
+            [in] BSTR bstrURL,
+            [out, retval] IWMPMedia **ppMedia);
+    }
+
+    [
+        odl,
+        uuid(6c497d62-8919-413c-82db-e935fb3ec584),
+        dual,
+        oleautomation
+    ]
+    interface IWMPPlayer4 : IWMPCore3
+    {
+        [id(0x0013), propget]
+        HRESULT enabled([out, retval] VARIANT_BOOL *pbEnabled);
+        [id(0x0013), propput]
+        HRESULT enabled([in] VARIANT_BOOL pbEnabled);
+
+        [id(0x0015), propget]
+        HRESULT fullScreen([out, retval] VARIANT_BOOL *pbFullScreen);
+        [id(0x0015), propput]
+        HRESULT fullScreen(VARIANT_BOOL pbFullScreen);
+
+        [id(0x0016), propget]
+        HRESULT enableContextMenu([out, retval] VARIANT_BOOL *pbEnableContextMenu);
+        [id(0x0016), propput]
+        HRESULT enableContextMenu(VARIANT_BOOL pbEnableContextMenu);
+
+        [id(0x0017), propput]
+        HRESULT uiMode([in] BSTR pbstrMode);
+        [id(0x0017), propget]
+        HRESULT uiMode([out, retval] BSTR *pbstrMode);
+
+        [id(0x0018), propget]
+        HRESULT stretchToFit([out, retval] VARIANT_BOOL *pbEnabled);
+        [id(0x0018), propput]
+        HRESULT stretchToFit([in] VARIANT_BOOL pbEnabled);
+
+        [id(0x0019), propget]
+        HRESULT windowlessVideo([out, retval] VARIANT_BOOL *pbEnabled);
+        [id(0x0019), propput]
+        HRESULT windowlessVideo([in] VARIANT_BOOL pbEnabled);
+
+        [id(0x001a), propget]
+        HRESULT isRemote([out, retval] VARIANT_BOOL *pvarfIsRemote);
+
+        [id(0x001b), propget]
+        HRESULT playerApplication([out, retval] IWMPPlayerApplication **ppIWMPPlayerApplication);
+
+        [id(0x001c)]
+        HRESULT openPlayer([in] BSTR bstrURL);
+    }
+
+    [
+      odl,
+      uuid(6BF52A4F-394A-11D3-B153-00C04F79FAA6),
+      dual,
+      oleautomation
+    ]
+    interface IWMPPlayer : IWMPCore {
+        [id(0x00000013), propget]
+        HRESULT enabled([out, retval] VARIANT_BOOL* pbEnabled);
+        [id(0x00000013), propput]
+        HRESULT enabled([in] VARIANT_BOOL pbEnabled);
+        [id(0x00000015), propget]
+        HRESULT fullScreen([out, retval] VARIANT_BOOL* pbFullScreen);
+        [id(0x00000015), propput]
+        HRESULT fullScreen(VARIANT_BOOL pbFullScreen);
+        [id(0x00000016), propget]
+        HRESULT enableContextMenu([out, retval] VARIANT_BOOL* pbEnableContextMenu);
+        [id(0x00000016), propput]
+        HRESULT enableContextMenu(VARIANT_BOOL pbEnableContextMenu);
+        [id(0x00000017), propput]
+        HRESULT uiMode([in] BSTR pbstrMode);
+        [id(0x00000017), propget]
+        HRESULT uiMode([out, retval] BSTR* pbstrMode);
+    };
+
+    [
+        odl,
+        uuid(82a2986c-0293-4fd0-b279-b21b86c058be),
+        oleautomation
+    ]
+    interface IWMPSyncDevice : IUnknown
+    {
+        [propget]
+        HRESULT friendlyName([out, retval] BSTR *name);
+
+        [propput]
+        HRESULT friendlyName([in] BSTR name);
+
+        [propget]
+        HRESULT deviceName([out, retval] BSTR *name);
+
+        [propget]
+        HRESULT deviceId([out, retval] BSTR *device);
+
+        [propget]
+        HRESULT partnershipIndex([out, retval] long *index);
+
+        [propget]
+        HRESULT connected([out, retval] VARIANT_BOOL *connected);
+
+        [propget]
+        HRESULT status([out, retval] WMPDeviceStatus *status);
+
+        [propget]
+        HRESULT syncState([out, retval] WMPSyncState *state);
+
+        [propget]
+        HRESULT progress([out, retval] long *progress);
+
+        HRESULT getItemInfo(
+            [in] BSTR name,
+            [out, retval] BSTR *val);
+
+        HRESULT createPartnership([in] VARIANT_BOOL showui);
+
+        HRESULT deletePartnership();
+
+        HRESULT start();
+
+        HRESULT stop();
+
+        HRESULT showSettings();
+
+        HRESULT isIdentical(
+            [in] IWMPSyncDevice *device,
+            [out, retval] VARIANT_BOOL *ret);
+    }
+
+    [
+        odl,
+        uuid(88afb4b2-140a-44d2-91e6-4543da467cd1),
+        oleautomation
+    ]
+    interface IWMPSyncDevice2 : IWMPSyncDevice
+    {
+        HRESULT setItemInfo(
+            [in] BSTR name,
+            [in] BSTR val);
+    }
+
+    [
+      odl,
+      uuid(56e2294f-69ed-4629-a869-aea72c0dcc2c),
+      oleautomation
+    ]
+    interface IWMPCdromRip : IUnknown
+    {
+        [propget]
+        HRESULT ripState([out, retval] WMPRipState *state);
+
+        [propget]
+        HRESULT ripProgress([out, retval] long *progress);
+
+        HRESULT startRip();
+
+        HRESULT stopRip();
+    }
+
+    [
+        odl,
+        uuid(bd94dbeb-417f-4928-aa06-087d56ed9b59),
+        oleautomation
+    ]
+    interface IWMPCdromBurn : IUnknown
+    {
+        HRESULT isAvailable(
+            [in] BSTR item,
+            [out, retval] VARIANT_BOOL *available);
+
+        HRESULT getItemInfo(
+            [in] BSTR item,
+            [out, retval] BSTR *val);
+
+        [propget]
+        HRESULT label([out, retval] BSTR *label);
+
+        [propput]
+        HRESULT label([in] BSTR label);
+
+        [propget]
+        HRESULT burnFormat([out, retval] WMPBurnFormat *format);
+
+        [propput]
+        HRESULT burnFormat([in] WMPBurnFormat format);
+
+        [propget]
+        HRESULT burnPlaylist([out, retval] IWMPPlaylist **playlist);
+
+        [propput]
+        HRESULT burnPlaylist([in] IWMPPlaylist *playlist);
+
+        HRESULT refreshStatus();
+
+        [propget]
+        HRESULT burnState([out, retval] WMPBurnState *state);
+
+        [propget]
+        HRESULT burnProgress([out, retval] long *progress);
+
+        HRESULT startBurn();
+
+        HRESULT stopBurn();
+
+        HRESULT erase();
+    }
+
+    [
+        odl,
+        uuid(3df47861-7df1-4c1f-a81b-4c26f0f7a7c6),
+        oleautomation
+    ]
+    interface IWMPLibrary : IUnknown
+    {
+        [propget]
+        HRESULT name([out, retval] BSTR *name);
+
+        [propget]
+        HRESULT type([out, retval] WMPLibraryType *type);
+
+        [propget]
+        HRESULT mediaCollection([out, retval] IWMPMediaCollection **collection);
+
+        HRESULT isIdentical(
+            [in] IWMPLibrary *wmplibrary,
+            [out, retval] VARIANT_BOOL *ret);
+    }
+
+    [
+        uuid(19a6627b-da9e-47c1-bb23-00b5e668236a),
+        odl
+    ]
+    interface IWMPEvents : IUnknown
+    {
+        void OpenStateChange([in] long state);
+
+        void PlayStateChange([in] long state);
+
+        void AudioLanguageChange([in] long lang);
+
+        void StatusChange();
+
+        void ScriptCommand(
+            [in] BSTR type,
+            [in] BSTR param);
+
+        void NewStream();
+
+        void Disconnect([in] long result);
+
+        void Buffering([in] VARIANT_BOOL start);
+
+        void Error();
+
+        void Warning(
+            [in] long warning,
+            [in] long param,
+            [in] BSTR description);
+
+        void EndOfStream([in] long result);
+
+        void PositionChange(
+            [in] double old_position,
+            [in] double new_position);
+
+        void MarkerHit([in] long marker);
+
+        void DurationUnitChange([in] long duration);
+
+        void CdromMediaChange([in] long num);
+
+        void PlaylistChange(
+            [in] IDispatch *playlist,
+            [in] WMPPlaylistChangeEventType change);
+
+        void CurrentPlaylistChange([in] WMPPlaylistChangeEventType change);
+
+        void CurrentPlaylistItemAvailable([in] BSTR item);
+
+        void MediaChange([in] IDispatch *item);
+
+        void CurrentMediaItemAvailable([in] BSTR name);
+
+        void CurrentItemChange([in] IDispatch *media);
+
+        void MediaCollectionChange();
+
+        void MediaCollectionAttributeStringAdded(
+            [in] BSTR name,
+            [in] BSTR val);
+
+        void MediaCollectionAttributeStringRemoved(
+            [in] BSTR name,
+            [in] BSTR val);
+
+        void MediaCollectionAttributeStringChanged(
+            [in] BSTR name,
+            [in] BSTR old_val,
+            [in] BSTR new_val);
+
+        void PlaylistCollectionChange();
+
+        void PlaylistCollectionPlaylistAdded([in] BSTR name);
+
+        void PlaylistCollectionPlaylistRemoved([in] BSTR name);
+
+        void PlaylistCollectionPlaylistSetAsDeleted(
+            [in] BSTR name,
+            [in] VARIANT_BOOL deleted);
+
+        void ModeChange(
+            [in] BSTR ModeName,
+            [in] VARIANT_BOOL value);
+
+        void MediaError([in] IDispatch *media);
+
+        void OpenPlaylistSwitch([in] IDispatch *item);
+
+        void DomainChange([in] BSTR domain);
+
+        void SwitchedToPlayerApplication();
+
+        void SwitchedToControl();
+
+        void PlayerDockedStateChange();
+
+        void PlayerReconnect();
+
+        void Click(
+            [in] short button,
+            [in] short shift_state,
+            [in] long x,
+            [in] long y);
+
+        void DoubleClick(
+            [in] short button,
+            [in] short shift_state,
+            [in] long fX,
+            [in] long fY);
+
+        void KeyDown(
+            [in] short keycode,
+            [in] short shift_state);
+
+        void KeyPress([in] short ascii);
+
+        void KeyUp(
+            [in] short keycode,
+            [in] short shift_state);
+
+        void MouseDown(
+            [in] short button,
+            [in] short nShiftState,
+            [in] long x,
+            [in] long y);
+
+        void MouseMove(
+            [in] short button,
+            [in] short shift_state,
+            [in] long x,
+            [in] long y);
+
+        void MouseUp(
+            [in] short button,
+            [in] short shift_state,
+            [in] long x,
+            [in] long y);
+    }
+
+    [
+        uuid(1e7601fa-47ea-4107-9ea9-9004ed9684ff),
+        odl
+    ]
+    interface IWMPEvents2 : IWMPEvents
+    {
+        void DeviceConnect([in] IWMPSyncDevice *device);
+
+        void DeviceDisconnect([in] IWMPSyncDevice *device);
+
+        void DeviceStatusChange(
+            [in] IWMPSyncDevice *device,
+            [in] WMPDeviceStatus status);
+
+        void DeviceSyncStateChange(
+            [in] IWMPSyncDevice *device,
+            [in] WMPSyncState state);
+
+        void DeviceSyncError(
+            [in] IWMPSyncDevice *device,
+            [in] IDispatch *media);
+
+        void CreatePartnershipComplete(
+            [in] IWMPSyncDevice *device,
+            [in] HRESULT result);
+    }
+
+    [
+        uuid(1f504270-a66b-4223-8e96-26a06c63d69f),
+        odl
+    ]
+    interface IWMPEvents3 : IWMPEvents2
+    {
+        void CdromRipStateChange(
+            [in] IWMPCdromRip *rip,
+            [in] WMPRipState state);
+
+        void CdromRipMediaError(
+            [in] IWMPCdromRip *rip,
+            [in] IDispatch *media);
+
+        void CdromBurnStateChange(
+            [in] IWMPCdromBurn *burn,
+            [in] WMPBurnState state);
+
+        void CdromBurnMediaError(
+            [in] IWMPCdromBurn *burn,
+            [in] IDispatch *media);
+
+        void CdromBurnError(
+            [in] IWMPCdromBurn *burn,
+            [in] HRESULT error);
+
+        void LibraryConnect(
+            [in] IWMPLibrary *wmplibrary);
+
+        void LibraryDisconnect(
+            [in] IWMPLibrary *wmplibrary);
+
+        void FolderScanStateChange(
+            [in] WMPFolderScanState state);
+
+        void StringCollectionChange(
+            [in] IDispatch *collection,
+            [in] WMPStringCollectionChangeEventType change,
+            [in] long index);
+
+        void MediaCollectionMediaAdded(
+            [in] IDispatch *media);
+
+        void MediaCollectionMediaRemoved(
+            [in] IDispatch *media);
+    }
+
+    [
+        uuid(26dabcfa-306b-404d-9a6f-630a8405048d),
+        odl
+    ]
+    interface IWMPEvents4 : IWMPEvents3
+    {
+        void DeviceEstimation(
+            [in] IWMPSyncDevice *device,
+            [in] HRESULT result,
+            [in] LONGLONG used_space,
+            [in] LONGLONG estimated_space);
+    }
+
+    [
+        hidden,
+        uuid(6bf52a51-394a-11d3-b153-00c04f79faa6)
+    ]
+    interface _WMPOCXEvents : IDispatch
+    {}
+
+    [
+        helpstring("Windows Media Player"),
+        threading(apartment),
+        progid("WMPlayer.OCX.7"),
+        vi_progid("WMPlayer.OCX"),
+        uuid(6bf52a52-394a-11d3-b153-00c04f79faa6)
+     ]
+     coclass WindowsMediaPlayer
+     {
+        [default] interface IWMPPlayer4;
+        /* interface IWMPPlayer3; */
+        /* interface IWMPPlayer2; */
+        interface IWMPPlayer;
+        interface IWMPControls;
+        interface IWMPSettings;
+        interface IWMPPlaylist;
+        interface IWMPMedia;
+        interface IWMPMediaCollection;
+        interface IWMPPlaylistCollection;
+        interface IWMPCdromCollection;
+        interface IWMPError;
+        interface IWMPErrorItem;
+        /* interface IWMPErrorItem2; */
+        interface IWMPClosedCaption;
+        interface IWMPDVD;
+        interface IWMPControls2;
+        interface IWMPMedia2;
+        interface IWMPMedia3;
+        /* interface IWMPMetadataPicture; */
+        /* interface IWMPMetadataText; */
+        /* interface IWMPSettings2; */
+        /* interface IWMPControls3; */
+        /* interface IWMPClosedCaption2; */
+        /* interface IWMPMediaCollection2; */
+        /* interface IWMPStringCollection2; */
+        [default, source] dispinterface _WMPOCXEvents;
+     }
+}
diff --git a/mingw-w64-headers/wine-import.sh b/mingw-w64-headers/wine-import.sh
index 7847a84..f1859cb 100755
--- a/mingw-w64-headers/wine-import.sh
+++ b/mingw-w64-headers/wine-import.sh
@@ -192,6 +192,7 @@
 	wincodec \
 	wincodecsdk \
 	wmdrmsdk \
+	wmp \
 	wmsbuffer \
 	wmsdkidl \
 	wpcapi \
