OleCreateFromDataEx  CLM6QS

Extends OleCreateFromData2DRR4H5 functionality by supporting more efficient instantiation of objects in containers requiring caching of multiple formats of presentation or data, instead of the single format supported by OleCreateFromData.

HRESULT OleCreateFromDataEx(

    LPDATAOBJECT pSrcDataObj,

//Pointer to data transfer object

    REFIID riid,

//Reference to the identifier of the interface of object to return

    DWORD dwFlags,

//Value from OLECREATE1XEX5_Y enumeration

    DWORD renderopt,

//Value from OLERENDER1W1IE2P enumeration

    ULONG cFormats,

//Number of FORMATETCs8CSQ18 in rgFormatEtc

    DWORD rgAdvf,

//Points to an array of cFormats DWORD elements

    LPFORMATETC rgFormatEtc,

//Points to an array of cFormats FORMATETC structures

    LPADVISESINK pAdviseSink,

//IAdviseSink3F9W.KC pointer, or NULL, indicating default data format caching

    DWORD FAR* rgdwConnection,

//Location to return array of dwConnection values

    LPCLIENTSITE pClientSite,

//Pointer to 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

pSrcDataObj

Pointer to the data transfer object holding the new data used to create the new object. (see OleCreateFromData).

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 ADVFJW0._0 enumeration. Each element of this array is passed in as the advf parameter to a call to either IOleCache::Cache1PQGN_K or IDataObject::DAdvise38JBOZP, 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 object s 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.

pAdviseSink

When renderopt is OLERENDER_FORMAT, may be either a valid IAdviseSink3F9W.KC pointer, indicating custom caching or processing of data advises, or NULL, indicating default caching of data formats.

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::SetClientSite5OQXLV_.

pStg

Pointer to the storage to use for the object and any default data or presentation caching established for it.

ppvObj

Location to return the riid interface of the newly created object.

Return Values

S_OK

Success.

E_NOINTERFACE

The object does not support the riid interface.

E_INVALIDARG

One or more arguments are invalid.

Remarks

The following call to OleCreateFromData:

    OleCreateFromData(lpszFileName, riid, renderopt, pFormatEtc, pClientSite, pStg, ppvObj);

 

is equivalent to the following call to OleCreateFromDataEx:

    DWORD    advf = ADVF_PRIMEFIRST;

    OleCreateFromFileEx(rclsid, lpszFileName, riid, renderopt, 1, &advf, pFormatEtc, NULL, pClientSite, pStg, ppvObj);

 

Existing instantiation functions (OleCreate8VSC_N, OleCreateFromFile1RIH.ST, OleCreateFromData2DRR4H5, OleCreateLinkUY.RGV, OleCreateLinkToFile_BGJ4L, and OleCreateLinkFromDataEIT00_) create only a single presentation or data format cache in the default cache location (within the  \001OlePresXXX  streams of the passed-in IStorageFS1VT1) 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. OleCreateExZ7JM1S, OleCreateFromFileExFQRYOY, OleCreateFromDataEx, OleCreateLinkEx51ZQ_OQ, OleCreateLinkToFileEx184MEL, and OleCreateLinkFromDataEx1AMKRI1, 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::OnDataChangeRBSVUI. 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

OleCreateFromData, IOleCache::Cache, IDataObject::DAdvise, IStorage, IAdviseSink::OnDataChange, IOleObject::SetClientSite, OLECREATE, OLERENDER, FORMATETC, ADVF