/*** Autogenerated by WIDL 11.12 from include/windows.graphics.directx.direct3d11.interop.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 __windows_graphics_directx_direct3d11_interop_h__
#define __windows_graphics_directx_direct3d11_interop_h__

/* Forward declarations */

#ifndef ____x_Windows_CGraphics_CDirectX_CDirect3D11_CIDirect3DDxgiInterfaceAccess_FWD_DEFINED__
#define ____x_Windows_CGraphics_CDirectX_CDirect3D11_CIDirect3DDxgiInterfaceAccess_FWD_DEFINED__
typedef interface __x_Windows_CGraphics_CDirectX_CDirect3D11_CIDirect3DDxgiInterfaceAccess __x_Windows_CGraphics_CDirectX_CDirect3D11_CIDirect3DDxgiInterfaceAccess;
#ifdef __cplusplus
#define __x_Windows_CGraphics_CDirectX_CDirect3D11_CIDirect3DDxgiInterfaceAccess Windows::Graphics::DirectX::Direct3D11::IDirect3DDxgiInterfaceAccess
namespace Windows {
    namespace Graphics {
        namespace DirectX {
            namespace Direct3D11 {
                interface IDirect3DDxgiInterfaceAccess;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <dxgi.h>
#include <inspectable.h>
#include <windows.graphics.directx.direct3d11.h>

#ifdef __cplusplus
extern "C" {
#endif

HRESULT CreateDirect3D11DeviceFromDXGIDevice(IDXGIDevice *dxgiDevice,IInspectable **graphicsDevice);

/*****************************************************************************
 * IDirect3DDxgiInterfaceAccess interface
 */
#ifndef ____x_Windows_CGraphics_CDirectX_CDirect3D11_CIDirect3DDxgiInterfaceAccess_INTERFACE_DEFINED__
#define ____x_Windows_CGraphics_CDirectX_CDirect3D11_CIDirect3DDxgiInterfaceAccess_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_Windows_CGraphics_CDirectX_CDirect3D11_CIDirect3DDxgiInterfaceAccess, 0xa9b3d012, 0x3df2, 0x4ee3, 0xb8,0xd1, 0x86,0x95,0xf4,0x57,0xd3,0xc1);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace Windows {
    namespace Graphics {
        namespace DirectX {
            namespace Direct3D11 {
                MIDL_INTERFACE("a9b3d012-3df2-4ee3-b8d1-8695f457d3c1")
                IDirect3DDxgiInterfaceAccess : public IUnknown
                {
                    virtual HRESULT STDMETHODCALLTYPE GetInterface(
                        REFIID iid,
                        void **object) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_Windows_CGraphics_CDirectX_CDirect3D11_CIDirect3DDxgiInterfaceAccess, 0xa9b3d012, 0x3df2, 0x4ee3, 0xb8,0xd1, 0x86,0x95,0xf4,0x57,0xd3,0xc1)
#endif
#else
typedef struct __x_Windows_CGraphics_CDirectX_CDirect3D11_CIDirect3DDxgiInterfaceAccessVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDirect3DDxgiInterfaceAccess methods ***/
    HRESULT (STDMETHODCALLTYPE *GetInterface)(
        __x_Windows_CGraphics_CDirectX_CDirect3D11_CIDirect3DDxgiInterfaceAccess *This,
        REFIID iid,
        void **object);

    END_INTERFACE
} __x_Windows_CGraphics_CDirectX_CDirect3D11_CIDirect3DDxgiInterfaceAccessVtbl;

interface __x_Windows_CGraphics_CDirectX_CDirect3D11_CIDirect3DDxgiInterfaceAccess {
    CONST_VTBL __x_Windows_CGraphics_CDirectX_CDirect3D11_CIDirect3DDxgiInterfaceAccessVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_Windows_CGraphics_CDirectX_CDirect3D11_CIDirect3DDxgiInterfaceAccess_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_Windows_CGraphics_CDirectX_CDirect3D11_CIDirect3DDxgiInterfaceAccess_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_Windows_CGraphics_CDirectX_CDirect3D11_CIDirect3DDxgiInterfaceAccess_Release(This) (This)->lpVtbl->Release(This)
/*** IDirect3DDxgiInterfaceAccess methods ***/
#define __x_Windows_CGraphics_CDirectX_CDirect3D11_CIDirect3DDxgiInterfaceAccess_GetInterface(This,iid,object) (This)->lpVtbl->GetInterface(This,iid,object)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_Windows_CGraphics_CDirectX_CDirect3D11_CIDirect3DDxgiInterfaceAccess_QueryInterface(__x_Windows_CGraphics_CDirectX_CDirect3D11_CIDirect3DDxgiInterfaceAccess* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_Windows_CGraphics_CDirectX_CDirect3D11_CIDirect3DDxgiInterfaceAccess_AddRef(__x_Windows_CGraphics_CDirectX_CDirect3D11_CIDirect3DDxgiInterfaceAccess* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_Windows_CGraphics_CDirectX_CDirect3D11_CIDirect3DDxgiInterfaceAccess_Release(__x_Windows_CGraphics_CDirectX_CDirect3D11_CIDirect3DDxgiInterfaceAccess* This) {
    return This->lpVtbl->Release(This);
}
/*** IDirect3DDxgiInterfaceAccess methods ***/
static inline HRESULT __x_Windows_CGraphics_CDirectX_CDirect3D11_CIDirect3DDxgiInterfaceAccess_GetInterface(__x_Windows_CGraphics_CDirectX_CDirect3D11_CIDirect3DDxgiInterfaceAccess* This,REFIID iid,void **object) {
    return This->lpVtbl->GetInterface(This,iid,object);
}
#endif
#ifdef WIDL_using_Windows_Graphics_DirectX_Direct3D11
#define IID_IDirect3DDxgiInterfaceAccess IID___x_Windows_CGraphics_CDirectX_CDirect3D11_CIDirect3DDxgiInterfaceAccess
#define IDirect3DDxgiInterfaceAccessVtbl __x_Windows_CGraphics_CDirectX_CDirect3D11_CIDirect3DDxgiInterfaceAccessVtbl
#define IDirect3DDxgiInterfaceAccess __x_Windows_CGraphics_CDirectX_CDirect3D11_CIDirect3DDxgiInterfaceAccess
#define IDirect3DDxgiInterfaceAccess_QueryInterface __x_Windows_CGraphics_CDirectX_CDirect3D11_CIDirect3DDxgiInterfaceAccess_QueryInterface
#define IDirect3DDxgiInterfaceAccess_AddRef __x_Windows_CGraphics_CDirectX_CDirect3D11_CIDirect3DDxgiInterfaceAccess_AddRef
#define IDirect3DDxgiInterfaceAccess_Release __x_Windows_CGraphics_CDirectX_CDirect3D11_CIDirect3DDxgiInterfaceAccess_Release
#define IDirect3DDxgiInterfaceAccess_GetInterface __x_Windows_CGraphics_CDirectX_CDirect3D11_CIDirect3DDxgiInterfaceAccess_GetInterface
#endif /* WIDL_using_Windows_Graphics_DirectX_Direct3D11 */
#endif

#endif

#endif  /* ____x_Windows_CGraphics_CDirectX_CDirect3D11_CIDirect3DDxgiInterfaceAccess_INTERFACE_DEFINED__ */

/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __windows_graphics_directx_direct3d11_interop_h__ */
