3.1.1.5.6.1.1 IRemUnknown::RemQueryInterface (Opnum 3)

This RemQueryInterface (Opnum 3) method acquires standard object references (see section 2.2.18.1) to additional interfaces on the object.

 HRESULT RemQueryInterface(
   [in] REFIPID ripid,
   [in] unsigned long cRefs,
   [in] unsigned short cIids,
   [in, size_is(cIids)] IID* iids,
   [out, size_is(,cIids)] PREMQIRESULT* ppQIResults
 );

ripid: This MUST specify an IPID that identifies the interface on the object to be queried for more interfaces.

cRefs: This MUST specify the number of public reference counts requested on the new interfaces.

cIids:  This MUST specify the number of IIDs supplied in the iids parameter and returned in the ppQIResults parameter.

iids:  This MUST specify an array of IIDs for which the client requests object references.

ppQIResults: This MUST contain an array of REMQIRESULT structures containing the results of the QueryInterface on the identified object.

When processing this ORPC call, the object exporter MUST do the following:

  • It MUST look up the IPID entry of the interface specified by the ripid parameter. If the IPID entry is not found, it MUST return RPC_E_INVALID_OBJECT as specified in [MS-ERREF] section 2.1.

  • It MUST look up the OID entry for the IPID.

  • It MUST set the last ORPC invocation time in the OID entry to the current time.

  • For each IID requested by the client in the iids array:

    • It MUST find the IPID of the IID in the IPID list in the OID entry.

    • If the entry is found, it MUST increment the public reference counts by cRefs, the number of references requested by the client.

    • If the entry is not found, it MUST use the application-defined state to determine, in an implementation-specific manner, if the object supports the requested IID. If it does not, it MUST set E_NOINTERFACE (as specified in [MS-ERREF] section 2.1) in the hResult field of the corresponding REMQIRESULT array.

      If the object implements the requested IID, the object exporter MUST create an IPID entry as follows:

      • It MUST allocate an IPID and set it in the IPID entry.

      • It MUST set the IID in the entry to the IID specified by the client.

      • It MUST set the OID in the IPID entry to the OID in the OID entry.

      • It MUST set the public reference count to cRefs, the number of references requested by the client.

      • It MUST set the private reference count to 0.

      • It MUST instruct RPC to listen on the interface designated by the IID, as specified in [C706] section 3.1.20 (rpc_server_register_if).

      • It MUST set the object pointer in the entry to the object pointer of the application's state that implements the interface specified by the IID.

      • It MUST add the IPID entry to the IPID list in the OID.

      • It MUST add the IPID entry to the IPID table.

    • The object exporter MUST return the STDOBJREF representing the object reference in the corresponding REMQIRESULT array element as follows:

      • It MUST set the flags field to 0.

      • It MUST set the cPublicRefs field to cRefs.

      • It MUST set the IPID and the OID from the IPID and OID entries.

      • It MUST set the OXID to the OXID of the object exporter.

    • The object exporter MUST set the corresponding HRESULT field to a success code of zero.