CoGetInstanceFromIStorage
Creates a new
object and initializes it from a storage object through an internal call to IPersistStorage::Load.
HRESULT CoGetInstanceFromIStorage(
|
COSERVERINFO * pServerInfo, |
//Pointer to COSERVERINFO struct indicating remote
system |
|
CLSID
* pclsid, |
//Pointer to the CLSID of the object to be created |
|
IUnknown *
punkOuter, |
//If part of an aggregate, pointer to the
controlling IUnknown |
|
DWORD dwClsCtx, |
//Values taken from the CLSCTX enumeration |
|
IStorage *
pstg, |
//Pointer to storage from which object is to be
initialized |
|
ULONG cmq, |
//Number of MULTI_QI structures in rgmqResults |
|
MULTI_QI *
rgmqResults |
//Array of MULTI_QI structures |
|
); |
|
Parameters
pServerInfo
[in] Pointer
to a COSERVERINFO
structure that specifies the machine on which to instantiate the object and the
authentication setting to be used. May be NULL, in which case the object is
either instantiated (1) on the current machine, (2) at the machine specified
under the RemoteServerName
named-value for the class in the registry, or (3) at the machine where the
storage object pointed to by pstg is located if the class is registered
with ActivateAtStorage
specified or has no local registry information.
pclsid
[in] Pointer
to the class identifier (CLSID) of the object to be created. May be NULL, in
which case there is a call to IStorage:Stat to find the class of the object.
punkOuter
[in] When
non-NULL, indicates the instance is being created as part of an aggregate, and punkOuter
is to be used as the pointer to the new instance s controlling IUnknown.
Aggregation is currently not supported cross-process or cross-machine. When
instantiating an object out of process, CLASS_E_NOAGGREGATION will be returned
if punkOuter is non-NULL.
dwClsCtx
Values taken
from the CLSCTX
enumeration.
pstg
Pointer to
storage to initialize the object with using IPersistStorage::Load. May not be NULL.
cmq
Number of
MULTI_QI structures in rgmqResults. Must be greater than zero.
rgmqResults
Array of MULTI_QI structures. Each structure
has three members: the identifier for a requested interface (pIID), the
location to return the interface pointer (pItf) and the return value of
the call to QueryInterface (hr).
Return Values
This function
supports the standard return value E_INVALIDARG, as well as the following:
S_OK
Indicates
success.
CO_S_NOTALLINTERFACES
At least one,
but not all of the interfaces requested in the rgmqResults array were
successfully retrieved. The hr field of each of the MULTI_QI structures
in rgmqResults indicates with S_OK or E_NOINTERFACE whether the specific
interface pointer was retrieved.
E_NOINTERFACE
None of the
interfaces requested in the rgmqResults array were successfully
retrieved.
Remarks
CoGetInstanceFromIStorage creates a new object and initializes it from a
storage object through a call to IPersistStorage::Load. This function is similar
to creating an instance using CoCreateInstanceEx followed by a call to
IPersistStorage::Load, with the following important distinctions:
Fewer network round trips are
required by thisfunction when instantiating remotely.
In the case where dwClsCtx
is set to CLSCTX_REMOTE_SERVER and pServerInfo is NULL, if the class is
registered with the ActivateAtStorage named value or has no associated registry
information, this function will instantiate an object on the same machine where
the storage object pointed to by pstg resides, providing the least
possible network traffic. For example, if pstg were obtained through a
call to StgCreateDocfile,
specifying \\myserver\users\johndo\file , the object would be instantiated on
the myserver machine, and the object would access the storage object
directly.
See Also