/**
 * This file has no copyright assigned and is placed in the Public Domain.
 * This file is part of the w64 mingw-runtime package.
 * No warranty is given; refer to the file DISCLAIMER.PD within this package.
 */

#ifndef DO_NO_IMPORTS
import "wtypes.idl";
#endif

cpp_quote("#ifndef __AsyncIUnknown_FWD_DEFINED__")
cpp_quote("#define __AsyncIUnknown_FWD_DEFINED__")
cpp_quote("typedef struct AsyncIUnknown AsyncIUnknown;")
cpp_quote("#endif")
cpp_quote("  extern RPC_IF_HANDLE __MIDL_itf_unknwn_0000_v0_0_c_ifspec;")
cpp_quote("  extern RPC_IF_HANDLE __MIDL_itf_unknwn_0000_v0_0_s_ifspec;")
cpp_quote("")

cpp_quote("#if defined(__cplusplus) && !defined(CINTERFACE) && !defined(__IUnknown_INTERFACE_DEFINED__)")
cpp_quote("#define __IUnknown_INTERFACE_DEFINED__")
cpp_quote("  typedef IUnknown *LPUNKNOWN;")
cpp_quote("  EXTERN_C const IID IID_IUnknown;")
cpp_quote("  extern \"C++\" {")
cpp_quote("    struct IUnknown {")
cpp_quote("    public:")
cpp_quote("      BEGIN_INTERFACE")
cpp_quote("	virtual HRESULT WINAPI QueryInterface(REFIID riid,void **ppvObject) = 0;")
cpp_quote("	virtual ULONG WINAPI AddRef(void) = 0;")
cpp_quote("	virtual ULONG WINAPI Release(void) = 0;")
cpp_quote("	template<class Q> HRESULT WINAPI QueryInterface(Q **pp) { return QueryInterface(__uuidof(*pp),(void **)pp); }")
cpp_quote("      END_INTERFACE")
cpp_quote("    };")
cpp_quote("  }")
cpp_quote("  HRESULT WINAPI IUnknown_QueryInterface_Proxy(IUnknown *This,REFIID riid,void **ppvObject);")
cpp_quote("  void __RPC_STUB IUnknown_QueryInterface_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);")
cpp_quote("  ULONG WINAPI IUnknown_AddRef_Proxy(IUnknown *This);")
cpp_quote("  void __RPC_STUB IUnknown_AddRef_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);")
cpp_quote("  ULONG WINAPI IUnknown_Release_Proxy(IUnknown *This);")
cpp_quote("  void __RPC_STUB IUnknown_Release_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);")
cpp_quote("__CRT_UUID_DECL(IUnknown, 0x00000000, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46)")
cpp_quote("#else")

[
  local,
  object,
  uuid(00000000-0000-0000-C000-000000000046),
  pointer_default(unique)
]
interface IUnknown
{
    typedef [unique] IUnknown *LPUNKNOWN;

    HRESULT QueryInterface([in] REFIID riid, [out, iid_is(riid)] void **ppvObject);
    ULONG AddRef();
    ULONG Release();
}

cpp_quote("#endif")

cpp_quote("  extern RPC_IF_HANDLE __MIDL_itf_unknwn_0005_v0_0_c_ifspec;")
cpp_quote("  extern RPC_IF_HANDLE __MIDL_itf_unknwn_0005_v0_0_s_ifspec;")
cpp_quote("#ifndef __AsyncIUnknown_INTERFACE_DEFINED__")
cpp_quote("#define __AsyncIUnknown_INTERFACE_DEFINED__")
cpp_quote("  EXTERN_C const IID IID_AsyncIUnknown;")
cpp_quote("#if defined(__cplusplus) && !defined(CINTERFACE)")
cpp_quote("  struct AsyncIUnknown : public IUnknown {")
cpp_quote("  public:")
cpp_quote("    virtual HRESULT WINAPI Begin_QueryInterface(REFIID riid) = 0;")
cpp_quote("    virtual HRESULT WINAPI Finish_QueryInterface(void **ppvObject) = 0;")
cpp_quote("    virtual HRESULT WINAPI Begin_AddRef(void) = 0;")
cpp_quote("    virtual ULONG WINAPI Finish_AddRef(void) = 0;")
cpp_quote("    virtual HRESULT WINAPI Begin_Release(void) = 0;")
cpp_quote("    virtual ULONG WINAPI Finish_Release(void) = 0;")
cpp_quote("  };")
cpp_quote("#else")
cpp_quote("  typedef struct AsyncIUnknownVtbl {")
cpp_quote("    BEGIN_INTERFACE")
cpp_quote("      HRESULT (WINAPI *QueryInterface)(AsyncIUnknown *This,REFIID riid,void **ppvObject);")
cpp_quote("      ULONG (WINAPI *AddRef)(AsyncIUnknown *This);")
cpp_quote("      ULONG (WINAPI *Release)(AsyncIUnknown *This);")
cpp_quote("      HRESULT (WINAPI *Begin_QueryInterface)(AsyncIUnknown *This,REFIID riid);")
cpp_quote("      HRESULT (WINAPI *Finish_QueryInterface)(AsyncIUnknown *This,void **ppvObject);")
cpp_quote("      HRESULT (WINAPI *Begin_AddRef)(AsyncIUnknown *This);")
cpp_quote("      ULONG (WINAPI *Finish_AddRef)(AsyncIUnknown *This);")
cpp_quote("      HRESULT (WINAPI *Begin_Release)(AsyncIUnknown *This);")
cpp_quote("      ULONG (WINAPI *Finish_Release)(AsyncIUnknown *This);")
cpp_quote("    END_INTERFACE")
cpp_quote("  } AsyncIUnknownVtbl;")
cpp_quote("  struct AsyncIUnknown {")
cpp_quote("    CONST_VTBL struct AsyncIUnknownVtbl *lpVtbl;")
cpp_quote("  };")
cpp_quote("#ifdef COBJMACROS")
cpp_quote("#define AsyncIUnknown_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)")
cpp_quote("#define AsyncIUnknown_AddRef(This) (This)->lpVtbl->AddRef(This)")
cpp_quote("#define AsyncIUnknown_Release(This) (This)->lpVtbl->Release(This)")
cpp_quote("#define AsyncIUnknown_Begin_QueryInterface(This,riid) (This)->lpVtbl->Begin_QueryInterface(This,riid)")
cpp_quote("#define AsyncIUnknown_Finish_QueryInterface(This,ppvObject) (This)->lpVtbl->Finish_QueryInterface(This,ppvObject)")
cpp_quote("#define AsyncIUnknown_Begin_AddRef(This) (This)->lpVtbl->Begin_AddRef(This)")
cpp_quote("#define AsyncIUnknown_Finish_AddRef(This) (This)->lpVtbl->Finish_AddRef(This)")
cpp_quote("#define AsyncIUnknown_Begin_Release(This) (This)->lpVtbl->Begin_Release(This)")
cpp_quote("#define AsyncIUnknown_Finish_Release(This) (This)->lpVtbl->Finish_Release(This)")
cpp_quote("#endif")
cpp_quote("#endif")
cpp_quote("  HRESULT WINAPI AsyncIUnknown_Begin_QueryInterface_Proxy(AsyncIUnknown *This,REFIID riid);")
cpp_quote("  void __RPC_STUB AsyncIUnknown_Begin_QueryInterface_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);")
cpp_quote("  HRESULT WINAPI AsyncIUnknown_Finish_QueryInterface_Proxy(AsyncIUnknown *This,void **ppvObject);")
cpp_quote("  void __RPC_STUB AsyncIUnknown_Finish_QueryInterface_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);")
cpp_quote("  HRESULT WINAPI AsyncIUnknown_Begin_AddRef_Proxy(AsyncIUnknown *This);")
cpp_quote("  void __RPC_STUB AsyncIUnknown_Begin_AddRef_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);")
cpp_quote("  ULONG WINAPI AsyncIUnknown_Finish_AddRef_Proxy(AsyncIUnknown *This);")
cpp_quote("  void __RPC_STUB AsyncIUnknown_Finish_AddRef_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);")
cpp_quote("  HRESULT WINAPI AsyncIUnknown_Begin_Release_Proxy(AsyncIUnknown *This);")
cpp_quote("  void __RPC_STUB AsyncIUnknown_Begin_Release_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);")
cpp_quote("  ULONG WINAPI AsyncIUnknown_Finish_Release_Proxy(AsyncIUnknown *This);")
cpp_quote("  void __RPC_STUB AsyncIUnknown_Finish_Release_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);")
cpp_quote("#endif")
cpp_quote("")

[
  object,
  uuid(00000001-0000-0000-C000-000000000046),
  pointer_default(unique)
]
interface IClassFactory : IUnknown
{
    typedef [unique] IClassFactory *LPCLASSFACTORY;

    [local]
    HRESULT CreateInstance(
            [in, unique] IUnknown *pUnkOuter,
            [in] REFIID riid,
            [out, iid_is(riid)] void **ppvObject);

    [call_as(CreateInstance)]
    HRESULT RemoteCreateInstance(
            [in] REFIID riid,
            [out, iid_is(riid)] IUnknown **ppvObject);

    [local] HRESULT LockServer([in] BOOL fLock);
    [call_as(LockServer)] HRESULT RemoteLockServer([in] BOOL fLock);
}
