/*** Autogenerated by WIDL 10.4 from include/wmprealestate.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 __wmprealestate_h__
#define __wmprealestate_h__

/* Forward declarations */

#ifndef __IWMPVideoRenderConfig_FWD_DEFINED__
#define __IWMPVideoRenderConfig_FWD_DEFINED__
typedef interface IWMPVideoRenderConfig IWMPVideoRenderConfig;
#ifdef __cplusplus
interface IWMPVideoRenderConfig;
#endif /* __cplusplus */
#endif

#ifndef __IWMPRenderConfig_FWD_DEFINED__
#define __IWMPRenderConfig_FWD_DEFINED__
typedef interface IWMPRenderConfig IWMPRenderConfig;
#ifdef __cplusplus
interface IWMPRenderConfig;
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <unknwn.h>
#include <ocidl.h>
#include <mfidl.h>

#ifdef __cplusplus
extern "C" {
#endif

/*****************************************************************************
 * IWMPVideoRenderConfig interface
 */
#ifndef __IWMPVideoRenderConfig_INTERFACE_DEFINED__
#define __IWMPVideoRenderConfig_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMPVideoRenderConfig, 0x6d6cf803, 0x1ec0, 0x4c8d, 0xb3,0xca, 0xf1,0x8e,0x27,0x28,0x20,0x74);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("6d6cf803-1ec0-4c8d-b3ca-f18e27282074")
IWMPVideoRenderConfig : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE put_presenterActivate(
        IMFActivate *activate) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMPVideoRenderConfig, 0x6d6cf803, 0x1ec0, 0x4c8d, 0xb3,0xca, 0xf1,0x8e,0x27,0x28,0x20,0x74)
#endif
#else
typedef struct IWMPVideoRenderConfigVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMPVideoRenderConfig methods ***/
    HRESULT (STDMETHODCALLTYPE *put_presenterActivate)(
        IWMPVideoRenderConfig *This,
        IMFActivate *activate);

    END_INTERFACE
} IWMPVideoRenderConfigVtbl;

interface IWMPVideoRenderConfig {
    CONST_VTBL IWMPVideoRenderConfigVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMPVideoRenderConfig_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMPVideoRenderConfig_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMPVideoRenderConfig_Release(This) (This)->lpVtbl->Release(This)
/*** IWMPVideoRenderConfig methods ***/
#define IWMPVideoRenderConfig_put_presenterActivate(This,activate) (This)->lpVtbl->put_presenterActivate(This,activate)
#else
/*** IUnknown methods ***/
static inline HRESULT IWMPVideoRenderConfig_QueryInterface(IWMPVideoRenderConfig* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IWMPVideoRenderConfig_AddRef(IWMPVideoRenderConfig* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IWMPVideoRenderConfig_Release(IWMPVideoRenderConfig* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMPVideoRenderConfig methods ***/
static inline HRESULT IWMPVideoRenderConfig_put_presenterActivate(IWMPVideoRenderConfig* This,IMFActivate *activate) {
    return This->lpVtbl->put_presenterActivate(This,activate);
}
#endif
#endif

#endif


#endif  /* __IWMPVideoRenderConfig_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWMPRenderConfig interface
 */
#ifndef __IWMPRenderConfig_INTERFACE_DEFINED__
#define __IWMPRenderConfig_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWMPRenderConfig, 0x959506c1, 0x0314, 0x4ec5, 0x9e,0x61, 0x85,0x28,0xdb,0x5e,0x54,0x78);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("959506c1-0314-4ec5-9e61-8528db5e5478")
IWMPRenderConfig : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE put_inProcOnly(
        WINBOOL fInProc) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_inProcOnly(
        WINBOOL *pfInProc) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWMPRenderConfig, 0x959506c1, 0x0314, 0x4ec5, 0x9e,0x61, 0x85,0x28,0xdb,0x5e,0x54,0x78)
#endif
#else
typedef struct IWMPRenderConfigVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IWMPRenderConfig methods ***/
    HRESULT (STDMETHODCALLTYPE *put_inProcOnly)(
        IWMPRenderConfig *This,
        WINBOOL fInProc);

    HRESULT (STDMETHODCALLTYPE *get_inProcOnly)(
        IWMPRenderConfig *This,
        WINBOOL *pfInProc);

    END_INTERFACE
} IWMPRenderConfigVtbl;

interface IWMPRenderConfig {
    CONST_VTBL IWMPRenderConfigVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWMPRenderConfig_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWMPRenderConfig_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWMPRenderConfig_Release(This) (This)->lpVtbl->Release(This)
/*** IWMPRenderConfig methods ***/
#define IWMPRenderConfig_put_inProcOnly(This,fInProc) (This)->lpVtbl->put_inProcOnly(This,fInProc)
#define IWMPRenderConfig_get_inProcOnly(This,pfInProc) (This)->lpVtbl->get_inProcOnly(This,pfInProc)
#else
/*** IUnknown methods ***/
static inline HRESULT IWMPRenderConfig_QueryInterface(IWMPRenderConfig* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IWMPRenderConfig_AddRef(IWMPRenderConfig* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IWMPRenderConfig_Release(IWMPRenderConfig* This) {
    return This->lpVtbl->Release(This);
}
/*** IWMPRenderConfig methods ***/
static inline HRESULT IWMPRenderConfig_put_inProcOnly(IWMPRenderConfig* This,WINBOOL fInProc) {
    return This->lpVtbl->put_inProcOnly(This,fInProc);
}
static inline HRESULT IWMPRenderConfig_get_inProcOnly(IWMPRenderConfig* This,WINBOOL *pfInProc) {
    return This->lpVtbl->get_inProcOnly(This,pfInProc);
}
#endif
#endif

#endif


#endif  /* __IWMPRenderConfig_INTERFACE_DEFINED__ */

/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __wmprealestate_h__ */
