//+-------------------------------------------------------------------------
//
//  Microsoft Windows
//  Copyright (C) Microsoft Corporation, 1996.
//
//  File:      remact.idl
//
//  Synopsis:  Activation interface implemented by object exporters.
//
//  This is the interface that needs to be supported by hosts that support
//  remote connection requests and export objects. Only one instance of this
//  interface can be exported by the host.
//
//  Note that this interface is tied closely to IObjectExporter because
//  RemoteActivation includes information otherwise retrieved from ResolveOXID.
//
//--------------------------------------------------------------------------
[
    uuid(4d9f4ab8-7d1c-11cf-861e-0020af6e7c57),
    pointer_default(unique)
]

interface IActivation
{
    import "obase.idl";

    const unsigned long MODE_GET_CLASS_OBJECT = 0xffffffff;

    //
    // RemoteActivation is called to request interface pointer data for one or
    // more interface IIDs from an object server servicing the given CLSID.
    // This could result in the launching of a new instance of the server, or
    // connection to an already running instance.
    //
    // Note that the ResolveOxid parameters are included as well, to prevent
    // the necessity for a second RPC during a remote activation.  However,
    // the client receives the OXID as an out param since it is not known
    // before connecting to the server.
    //

    error_status_t RemoteActivation(
        [in] handle_t                               hRpc,
        [in] ORPCTHIS                              *ORPCthis,
        [out] ORPCTHAT                             *ORPCthat,
        [in] GUID                                  *Clsid,
        [in, string, unique] WCHAR                 *pwszObjectName,
        [in, unique] MInterfacePointer             *pObjectStorage,
        [in] DWORD                                  ClientImpLevel,
        [in] DWORD                                  Mode,
        [in] DWORD                                  Interfaces,
        [in,unique,size_is(Interfaces)] IID        *pIIDs,
        [in] unsigned short                         cRequestedProtseqs,
        [in, size_is(cRequestedProtseqs)]
               unsigned short                       aRequestedProtseqs[],
        [out] OXID                                 *pOxid,
        [out] DUALSTRINGARRAY                     **ppdsaOxidBindings,
        [out] IPID                                 *pipidRemUnknown,
        [out] DWORD                                *pAuthnHint,
        [out] COMVERSION                           *pServerVersion,
        [out] HRESULT                              *phr,
        [out,size_is(Interfaces)] MInterfacePointer **ppInterfaceData,
        [out,size_is(Interfaces)] HRESULT          *pResults
        );
}


[
    uuid(000001A0-0000-0000-C000-000000000046),
    pointer_default(unique)
]
interface IRemoteSCMActivator // <==> ISystemActivator
{
    HRESULT DummyQueryInterfaceIRemoteSCMActivator(
                                            [in] handle_t rpc,
                                            [in] ORPCTHIS *orpcthis, 
                                            [out] ORPCTHAT *orpcthat,
                                            [in] DWORD dummy ); 
    HRESULT DummyAddRefIRemoteSCMActivator(     
                                            [in] handle_t rpc, 
                                            [in] ORPCTHIS *orpcthis, 
                                            [out] ORPCTHAT *orpcthat,
                                            [in] DWORD dummy ); 
    HRESULT DummyReleaseIRemoteSCMActivator(     
                                            [in] handle_t rpc, 
                                            [in] ORPCTHIS *orpcthis, 
                                            [out] ORPCTHAT *orpcthat,
                                            [in] DWORD dummy );

    HRESULT RemoteGetClassObject(
                    [in] handle_t rpc,
                    [in] ORPCTHIS *orpcthis,
                    [out] ORPCTHAT *orpcthat,
                    [in,unique]  MInterfacePointer *pActProperties,
                    [out] MInterfacePointer **ppActProperties
                    );

    HRESULT RemoteCreateInstance(
                    [in] handle_t rpc,
                    [in] ORPCTHIS *orpcthis,
                    [out] ORPCTHAT *orpcthat,
                    [in,unique]  MInterfacePointer *pUnkOuter,
                    [in,unique]  MInterfacePointer *pActProperties,
                    [out] MInterfacePointer **ppActProperties
                    );
}
