//+---------------------------------------------------------------------------
//
//  Microsoft Windows
//  Copyright (C) Microsoft Corporation.  All Rights Reserved.
//
//  File:       servprov.idl
//
//  Contents:   IServiceProvider description
//
//----------------------------------------------------------------------------

cpp_quote("//=--------------------------------------------------------------------------=")
cpp_quote("// ServProv.h")
cpp_quote("//=--------------------------------------------------------------------------=")
cpp_quote("// (C) Copyright Microsoft Corporation.  All Rights Reserved.")
cpp_quote("//")
cpp_quote("// THIS CODE AND INFORMATION IS PROVIDED \"AS IS\" WITHOUT WARRANTY OF")
cpp_quote("// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO")
cpp_quote("// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A")
cpp_quote("// PARTICULAR PURPOSE.")
cpp_quote("//=--------------------------------------------------------------------------=")
cpp_quote("")
cpp_quote("#pragma comment(lib,\"uuid.lib\")")
cpp_quote("")
cpp_quote("//---------------------------------------------------------------------------=")
cpp_quote("// IServiceProvider Interfaces.")
cpp_quote("")

import "objidl.idl";
//import "oleidl.idl";

interface IServiceProvider;

[
        object,
        uuid(6d5140c1-7436-11ce-8034-00aa006009fa),
        pointer_default(unique)
]


interface IServiceProvider : IUnknown
{
    typedef [unique] IServiceProvider *LPSERVICEPROVIDER;

cpp_quote("#if (_MSC_VER >= 1100) && defined(__cplusplus) && !defined(CINTERFACE)")
cpp_quote("    EXTERN_C const IID IID_IServiceProvider;")
cpp_quote("    extern \"C++\"")
cpp_quote("    {")
cpp_quote("        MIDL_INTERFACE(\"6d5140c1-7436-11ce-8034-00aa006009fa\")")
cpp_quote("        IServiceProvider : public IUnknown")
cpp_quote("        {")
cpp_quote("        public:")
cpp_quote("            virtual /* [local] */ HRESULT STDMETHODCALLTYPE QueryService( ")
cpp_quote("                /* [in] */ __in REFGUID guidService,")
cpp_quote("                /* [in] */ __in REFIID riid,")
cpp_quote("                /* [out] */ __deref_out void __RPC_FAR *__RPC_FAR *ppvObject) = 0;")
cpp_quote("            ")
cpp_quote("            template <class Q>")
cpp_quote("            HRESULT STDMETHODCALLTYPE QueryService(__in REFGUID guidService, __deref_out Q** pp)")
cpp_quote("            {")
cpp_quote("                return QueryService(guidService, __uuidof(Q), (void **)pp);")
cpp_quote("            }")
cpp_quote("        };")
cpp_quote("    }")
cpp_quote("")
cpp_quote("    /* [call_as] */ HRESULT STDMETHODCALLTYPE IServiceProvider_RemoteQueryService_Proxy( ")
cpp_quote("        __in IServiceProvider __RPC_FAR * This,")
cpp_quote("        /* [in] */ __in REFGUID guidService,")
cpp_quote("        /* [in] */ __in REFIID riid,")
cpp_quote("        /* [iid_is][out] */ __deref_out IUnknown __RPC_FAR *__RPC_FAR *ppvObject);")
cpp_quote("")
cpp_quote("    void __RPC_STUB IServiceProvider_RemoteQueryService_Stub(")
cpp_quote("        IRpcStubBuffer *This,")
cpp_quote("        IRpcChannelBuffer *_pRpcChannelBuffer,")
cpp_quote("        PRPC_MESSAGE _pRpcMessage,")
cpp_quote("        DWORD *_pdwStubPhase);")
cpp_quote("")
cpp_quote("#else // VC6 Hack")
    [local]
    HRESULT QueryService(
        [in, annotation("__in")] REFGUID guidService,
        [in, annotation("__in")] REFIID riid,
        [out, annotation("__deref_out")] void ** ppvObject);

    [call_as(QueryService)]
    HRESULT RemoteQueryService(
        [in] REFGUID guidService,
        [in] REFIID riid,
        [out, iid_is(riid)] IUnknown ** ppvObject);
}
cpp_quote("#endif // VC6 Hack")


