/*** Autogenerated by WIDL 9.8 from include/systemmediatransportcontrolsinterop.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 __systemmediatransportcontrolsinterop_h__
#define __systemmediatransportcontrolsinterop_h__

#ifndef __WIDL_INLINE
#if defined(__cplusplus) || defined(_MSC_VER)
#define __WIDL_INLINE inline
#elif defined(__GNUC__)
#define __WIDL_INLINE __inline__
#endif
#endif

/* Forward declarations */

#ifndef __ISystemMediaTransportControlsInterop_FWD_DEFINED__
#define __ISystemMediaTransportControlsInterop_FWD_DEFINED__
typedef interface ISystemMediaTransportControlsInterop ISystemMediaTransportControlsInterop;
#ifdef __cplusplus
interface ISystemMediaTransportControlsInterop;
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <inspectable.h>

#ifdef __cplusplus
extern "C" {
#endif

/*****************************************************************************
 * ISystemMediaTransportControlsInterop interface
 */
#ifndef __ISystemMediaTransportControlsInterop_INTERFACE_DEFINED__
#define __ISystemMediaTransportControlsInterop_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISystemMediaTransportControlsInterop, 0xddb0472d, 0xc911, 0x4a1f, 0x86,0xd9, 0xdc,0x3d,0x71,0xa9,0x5f,0x5a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("ddb0472d-c911-4a1f-86d9-dc3d71a95f5a")
ISystemMediaTransportControlsInterop : public IInspectable
{
    virtual HRESULT STDMETHODCALLTYPE GetForWindow(
        HWND appWindow,
        REFIID riid,
        void **mediaTransportControl) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISystemMediaTransportControlsInterop, 0xddb0472d, 0xc911, 0x4a1f, 0x86,0xd9, 0xdc,0x3d,0x71,0xa9,0x5f,0x5a)
#endif
#else
typedef struct ISystemMediaTransportControlsInteropVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        ISystemMediaTransportControlsInterop *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        ISystemMediaTransportControlsInterop *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        ISystemMediaTransportControlsInterop *This,
        TrustLevel *trustLevel);

    /*** ISystemMediaTransportControlsInterop methods ***/
    HRESULT (STDMETHODCALLTYPE *GetForWindow)(
        ISystemMediaTransportControlsInterop *This,
        HWND appWindow,
        REFIID riid,
        void **mediaTransportControl);

    END_INTERFACE
} ISystemMediaTransportControlsInteropVtbl;

interface ISystemMediaTransportControlsInterop {
    CONST_VTBL ISystemMediaTransportControlsInteropVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISystemMediaTransportControlsInterop_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISystemMediaTransportControlsInterop_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISystemMediaTransportControlsInterop_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define ISystemMediaTransportControlsInterop_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define ISystemMediaTransportControlsInterop_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define ISystemMediaTransportControlsInterop_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ISystemMediaTransportControlsInterop methods ***/
#define ISystemMediaTransportControlsInterop_GetForWindow(This,appWindow,riid,mediaTransportControl) (This)->lpVtbl->GetForWindow(This,appWindow,riid,mediaTransportControl)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ISystemMediaTransportControlsInterop_QueryInterface(ISystemMediaTransportControlsInterop* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISystemMediaTransportControlsInterop_AddRef(ISystemMediaTransportControlsInterop* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISystemMediaTransportControlsInterop_Release(ISystemMediaTransportControlsInterop* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT ISystemMediaTransportControlsInterop_GetIids(ISystemMediaTransportControlsInterop* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT ISystemMediaTransportControlsInterop_GetRuntimeClassName(ISystemMediaTransportControlsInterop* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT ISystemMediaTransportControlsInterop_GetTrustLevel(ISystemMediaTransportControlsInterop* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ISystemMediaTransportControlsInterop methods ***/
static __WIDL_INLINE HRESULT ISystemMediaTransportControlsInterop_GetForWindow(ISystemMediaTransportControlsInterop* This,HWND appWindow,REFIID riid,void **mediaTransportControl) {
    return This->lpVtbl->GetForWindow(This,appWindow,riid,mediaTransportControl);
}
#endif
#endif

#endif


#endif  /* __ISystemMediaTransportControlsInterop_INTERFACE_DEFINED__ */

/* Begin additional prototypes for all interfaces */

ULONG           __RPC_USER HWND_UserSize     (ULONG *, ULONG, HWND *);
unsigned char * __RPC_USER HWND_UserMarshal  (ULONG *, unsigned char *, HWND *);
unsigned char * __RPC_USER HWND_UserUnmarshal(ULONG *, unsigned char *, HWND *);
void            __RPC_USER HWND_UserFree     (ULONG *, HWND *);

/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __systemmediatransportcontrolsinterop_h__ */
