OleCreateEx
Extends OleCreate functionality by supporting
more efficient instantiation of objects in containers requiring caching of
multiple presentation formats or data, instead of the single format supported
by OleCreate.
HRESULT OleCreateEx(
|
REFCLSID rclsid, |
//Class of object to create |
|
REFIID riid, |
//Reference to the identifier of the interface of
object to return |
|
DWORD dwFlags, |
//Value from OLECREATE enumeration |
|
DWORD renderopt, |
//Value from OLERENDER enumeration |
|
ULONG cFormats, |
//Number of FORMATETC structures in rgFormatEtc |
|
DWORD rgAdvf, |
//Points to an array of cFormats DWORD
elements |
|
LPFORMATETC rgFormatEtc, |
//Points to an array of cFormats FORMATETC
structures; NULL otherwise |
|
LPADVISESINK pAdviseSink, |
//IAdviseSink pointer (custom caching); NULL (default
caching); NULL otherwise |
|
DWORD* rgdwConnection, |
//Location to return array of dwConnection
values |
|
LPOLECLIENTSITE pClientSite, |
//Pointer to the primary interface the object will
use to request services |
|
LPSTORAGE pStg, |
//Pointer to storage to use for object |
|
LPVOID FAR* ppvObj |
//Indirect pointer to location to return riid
interface |
|
); |
|
Parameters
rclsid
Identifies
the class of the object to create.
riid
Reference to
the identifier of the interface of the object to return.
dwFlags
Value taken
from the OLECREATE enumeration.
renderopt
Value taken
from the RENDEROPT enumeration.
cFormats
When renderopt
is OLERENDER_FORMAT, indicates the number of FORMATETC structures in the
rgFormatEtc array, which must be at least one. In all other cases, this
parameter must be zero.
rgAdvf
When renderopt
is OLERENDER_FORMAT, points to an array of cFormats DWORD elements, each
of which is a combination of values from the ADVF enumeration. Each element
of this array is passed in as the advf parameter to a call to either IOleCache::Cache or IDataObject::DAdvise,
depending on whether pAdviseSink is NULL or non-NULL (see below). In all
other cases, this parameter must be NULL.
rgFormatEtc
When renderopt
is OLERENDER_FORMAT, points to an array of cFormats FORMATETC
structures. When pAdviseSink is NULL, each element of this array is
passed as the pFormatEtc parameter to a call to the object s IOleCache::Cache.
This populates the data and presentation cache managed by the objects
in-process handler (typically the default handler) with presentation or other
cacheable data. When pAdviseSink is non-NULL, each element of this array
is passed as the pFormatEtc parameter to a call to IDataObject::DAdvise. This allows the caller
(typically an OLE Container) to do its own caching or processing of data received
from the object. In all other cases, this parameter must be NULL.
pAdviseSink
When renderopt
is OLERENDER_FORMAT, may be either a valid IAdviseSink pointer,
indicating custom caching or processing of data advises, or NULL, indicating
default caching of data formats. In all other cases, this parameter must be
NULL.
rgdwConnection
Location to
return the array of dwConnection values returned when the pAdviseSink
interface is registered for each advisory connection using IDataObject::DAdvise,
or NULL if the returned advisory connections are not needed. Must be NULL, if pAdviseSink
is NULL.
pClientSite
Pointer to
the primary interface through which the object will request services from its
container. This parameter may be NULL, in which case it is the caller s
responsibility to establish the client site as soon as possible using IOleObject::SetClientSite.
pStg
Pointer to
the storage to use for the object and any default data or presentation caching
established for it. This parameter may not be NULL.
ppvObj
Location to
return the riid interface of the newly created object.
Return Values
This function
supports the standard return value E_INVALIDARG, as well as the following:
S_OK
Success.
E_NOINTERFACE
The object
does not support the riid interface.
Remarks
The
following call to OleCreate:
OleCreate(rclsid, riid, renderopt, pFormatEtc, pClientSite, pStg,
ppvObj);
is equivalent
to the following call to OleCreateEx:
DWORD advf = ADVF_PRIMEFIRST;
OleCreateEx(rclsid, riid, renderopt, 1,
&advf, pFormatEtc, NULL, pClientSite, pStg, ppvObj);
Existing
instantiation functions, (OleCreate, OleCreateFromFile, OleCreateFromData, OleCreateLink, OleCreateLinkToFile, and OleCreateLinkFromData) create only a single
presentation or data format cache in the default cache location (within the
\001OlePresXXX streams of the passed-in IStorage), during instantiation.
Plus, these caches must be created when the object next enters the running
state. Since most applications require caching at least two presentations
(screen and printer) and may require caching data in a different format or
location from the handler, applications must typically launch and shut down the
object server multiple times in order to prime their data caches during object
creation, i.e., Insert Object, Insert Object from File, and Paste Object.
Extended
versions of these creation functions solve this problem. OleCreateEx, OleCreateFromFileEx, OleCreateFromDataEx, OleCreateLinkEx, OleCreateLinkToFileEx, and OleCreateLinkFromDataEx contain the following new
parameters: dwFlags to indicate additional options, cFormats to
indicate how many formats to cache, rgAdvf, from the ADVF enumeration, to specify the
advise flags for each format to be cached, pAdviseSink to indicate
whether presentation (default-handler) or data (non-default-handler) caching is
required, rgdwConnection to return IDataObject::DAdvise cookies,
and pFormatEtc, an array of formats rather than a single format.
Containers
requiring that multiple presentations be cached on their behalf by the object s
handler can simply call these functions and specify the number of formats in cFormats,
the ADVF flags for each format in rgAdvf, and the set of formats
in pFormatEtc. These containers pass NULL for pAdviseSink.
Containers
performing all their own data- or presentation-caching perform these same
steps, but pass a non-NULL pAdviseSink. They perform their own caching
or manipulation of the object or data during IAdviseSink::OnDataChange. Typically such containers
never establish the advisory connections with ADVF_NODATA, although they are not
prevented from doing so.
These new
functions are for OLE Compound Documents. Using these functions, applications
can avoid the repeated launching and initialization steps required by the
current functions. They are targeted at OLE Compound Document container
applications that use default data- and presentation-caching, and also at
applications that provide their own caching and data transfer from the
underlying IDataObject::DAdvise support.
See Also