OleCreateEx 函数 (ole2.h)

通过支持更高效地实例化需要缓存多种表示格式或数据的容器中的对象,而不是 OleCreate 支持的单个格式,扩展 OleCreate 功能。

语法

HRESULT OleCreateEx(
  [in]  REFCLSID        rclsid,
  [in]  REFIID          riid,
  [in]  DWORD           dwFlags,
  [in]  DWORD           renderopt,
  [in]  ULONG           cFormats,
  [in]  DWORD           *rgAdvf,
  [in]  LPFORMATETC     rgFormatEtc,
  [in]  IAdviseSink     *lpAdviseSink,
  [out] DWORD           *rgdwConnection,
  [in]  LPOLECLIENTSITE pClientSite,
  [in]  LPSTORAGE       pStg,
  [out] LPVOID          *ppvObj
);

参数

[in] rclsid

标识要创建的 对象的类。

[in] riid

对要返回的 对象的接口的标识符的引用。

[in] dwFlags

此值可以是 0 或 OLECREATE_LEAVERUNNING (0x00000001) 。

[in] renderopt

取自 OLERENDER 枚举的值。

[in] cFormats

OLERENDER_FORMAT renderopt 时,指示 rgFormatEtc 数组中 FORMATETC 结构的数目,该结构必须至少为一个。 在所有其他情况下,此参数必须为零。

[in] rgAdvf

OLERENDER_FORMAT renderopt 时,指向 cFormats DWORD 元素的数组,其中每个元素都是 来自 ADVF 枚举的值的组合。 此数组的每个元素作为 advf 参数传递到 对 IOleCache::Cache 或IDataObject::D Advise 的调用中,具体取决于 pAdviseSinkNULL 还是非 NULL (请参阅以下) 。 在所有其他情况下,此参数必须为 NULL

[in] rgFormatEtc

OLERENDER_FORMAT renderopt 时,指向 cFormats FORMATETC 结构的数组。 当 pAdviseSinkNULL 时,此数组的每个元素都将作为 pFormatEtc 参数传递给对象的 IOleCache::Cache 调用。 这会填充由进程内处理程序 (通常默认处理程序) 使用演示文稿或其他可缓存数据管理的数据和演示文稿缓存。 当 pAdviseSink 为非 NULL 时,此数组的每个元素都将作为 pFormatEtc 参数传递给对 IDataObject::D Advise 的调用。 这允许调用方 (通常为 OLE 容器) 对从 对象接收的数据执行自己的缓存或处理。 在所有其他情况下,此参数必须为 NULL

[in] lpAdviseSink

OLERENDER_FORMAT renderopt 时,可以是有效的 IAdviseSink 指针(指示自定义缓存或处理数据建议)或 NULL(表示默认缓存数据格式)。 在所有其他情况下,此参数必须为 NULL

[out] rgdwConnection

使用 IDataObject::D AdviseAdvise 为每个咨询连接注册 pAdviseSink 接口时返回的 dwConnection 值数组的位置;如果不需要返回的咨询连接,则返回 NULL。 如果 pAdviseSinkNULL,则必须为 NULL

[in] pClientSite

指向对象从其容器请求服务的主接口的指针。 此参数可能为 NULL,在这种情况下,调用方负责使用 IOleObject::SetClientSite 尽快建立客户端站点。

[in] pStg

指向要用于对象的存储的指针,以及为其建立的任何默认数据或演示文稿缓存。 此参数可能不是 NULL

[out] ppvObj

接收 riid 中请求的接口指针的输出指针变量的地址。 成功返回后,*ppvObj 在新创建的对象上包含请求的接口指针。

返回值

此函数在成功时返回S_OK。 其他可能的值包括以下内容。

返回代码 说明
E_NOINTERFACE
提供的接口标识符无效。

注解

对 OleCreate 的以下调用:

OleCreate(rclsid, riid, renderopt, pFormatEtc, pClientSite, pStg, ppvObj);

等效于对 OleCreateEx 的以下调用:

DWORD    advf = ADVF_PRIMEFIRST;
    OleCreateEx(rclsid, riid, renderopt, 1, &advf, pFormatEtc, NULL, pClientSite, pStg, ppvObj);

现有的实例化函数, 在实例化期间, (OleCreateOleCreateFromFileOleCreateFromDataOleCreateLinkToFileOleCreateLinkFromData) 在传入 IStorage) 的“\001OlePresXXX”流内的默认缓存位置 (创建单个演示文稿或数据格式缓存。 此外,当对象接下来进入运行状态时,必须创建这些缓存。 由于大多数应用程序需要缓存至少两个演示文稿 (屏幕和打印机) ,并且可能需要缓存处理程序中格式不同的格式或位置的数据,应用程序通常必须多次启动和关闭对象服务器,以便在对象创建期间预配其数据缓存,即插入对象、从文件中插入对象、 和粘贴对象。

这些创建函数的扩展版本可解决此问题。 OleCreateExOleCreateFromFileExOleCreateFromDataExOleCreateLinkExOleCreateLinkToFileExOleCreateLinkFromDataEx 包含以下新参数:用于指示其他选项的 dwFlags、用于指示要缓存的格式的 cFormatsrgAdvf、用于指定要缓存的每种格式的建议标志、pAdviseSink指示是否需要 (默认处理程序) 或数据 (非默认处理程序) 缓存,rgdwConnection 返回 IDataObject::D Advise Cookies 和 pFormatEtc(格式数组而不是单个格式)。

要求由对象的处理程序代表多个演示文稿缓存的容器只需调用这些函数并指定 cFormats 中的格式数、rgAdvf 中每种格式的 ADVF 标志以及 pFormatEtc 中的格式集。 这些容器为 pAdviseSink 传递 NULL

执行所有自己的数据缓存或演示文稿缓存的容器执行上述相同步骤,但会传递非 NULLpAdviseSink。 他们在 IAdviseSink::OnDataChange 期间对对象或数据执行自己的缓存或操作。 通常,此类容器永远不会与ADVF_NODATA建立咨询连接,尽管它们不会阻止这样做。

这些新函数适用于 OLE 复合文档。 使用这些函数,应用程序可以避免当前函数所需的重复启动和初始化步骤。 它们面向使用默认数据和演示文稿缓存的 OLE 复合文档容器应用程序,以及从基础 IDataObject::D Advise 支持提供自己的缓存和数据传输的应用程序。

要求

要求
最低受支持的客户端 Windows 2000 Professional [仅限桌面应用]
最低受支持的服务器 Windows 2000 Server [仅限桌面应用]
目标平台 Windows
标头 ole2.h
Library Ole32.lib
DLL Ole32.dll

另请参阅

ADVF

FORMATETC

IAdviseSink::OnDataChange

IDataObject::D Advise

IOleCache::Cache

IOleObject::SetClientSite

IStorage

OLERENDER

OleCreate