OleCreateFromData 函数 (ole2.h)

从从剪贴板检索的数据传输对象或作为 OLE 拖放操作的一部分,创建嵌入对象。 它旨在用于从 OLE 拖放操作实现粘贴。

语法

HRESULT OleCreateFromData(
  [in]  LPDATAOBJECT    pSrcDataObj,
  [in]  REFIID          riid,
  [in]  DWORD           renderopt,
  [in]  LPFORMATETC     pFormatEtc,
  [in]  LPOLECLIENTSITE pClientSite,
  [in]  LPSTORAGE       pStg,
  [out] LPVOID          *ppvObj
);

参数

[in] pSrcDataObj

指向数据传输对象上的 IDataObject 接口的指针,该对象保存从中创建对象的数据。

[in] riid

对接口标识符的引用,调用方稍后用于与新对象通信 (通常IID_IOleObject,在 OLE 标头中定义为 IOleObject) 的接口标识符。

[in] renderopt

枚举 OLERENDER 中的值,指示新创建的对象要具有的本地缓存绘图或数据检索功能。 以下“备注”部分介绍了其他注意事项。

[in] pFormatEtc

指向枚举 OLERENDER 中的值的指针,该值指示新创建的对象要具有的本地缓存绘图或数据检索功能。 选择的 OLERENDER 值会影响 pFormatEtc 参数的可能值。

[in] pClientSite

指向 IOleClientSite 实例的指针,该实例是对象通过其从其容器请求服务的主接口。 此参数可以为 NULL。

[in] pStg

指向存储对象上的 IStorage 接口的指针。 此参数不能为 NULL

[out] ppvObj

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

返回值

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

返回代码 说明
OLE_E_STATIC
指示 OLE 只能创建静态对象。
DV_E_FORMATETC
没有可接受的格式可用于创建对象。

注解

OleCreateFromData 函数从支持 IDataObject 接口的数据传输对象创建嵌入对象。 在这种情况下,数据对象可以是通过调用 OleGetClipboard 函数从剪贴板检索的类型,或者是 OLE 拖放操作的一部分, (数据对象传递到 对 IDropTarget::D rop) 的调用。

如果数据传输对象中存在 FileName 或 FileNameW 剪贴板格式 (CF_FILENAME) ,并且不存在CF_EMBEDDEDOBJECT或CF_EMBEDSOURCE, 则 OleCreateFromData 将首先尝试创建包含指定文件的包。 通常,它采用第一个可用的格式。

如果 OleCreateFromData 无法创建包,它将尝试使用CF_EMBEDDEDOBJECT格式创建对象。 如果该格式不可用, OleCreateFromData 会尝试使用CF_EMBEDSOURCE格式创建它。 如果这两种格式都不可用,并且数据传输对象支持 IPersistStorage 接口, 则 OleCreateFromData 会调用对象的 IPersistStorage::Save 来保存对象本身。

如果选择并复制现有链接对象,则该对象仅作为另一个可嵌入对象显示在剪贴板上。 因此,调用 OleCreateFromData 的粘贴操作可能会创建链接对象。 执行粘贴操作后,容器应调用 QueryInterface 函数,请求 OLE 标头中定义的IID_IOleLink (作为 IOleLink) 的接口标识符,以确定是否已创建链接对象。

使用 renderoptpFormatetc 参数控制新创建对象的缓存功能。 有关使用这些参数的交互来确定要缓存的内容的一般信息,请参阅 OLERENDER 枚举。 但是,这些参数对 OleCreateFromData 初始化缓存的方式有一些其他特定影响。

OleCreateFromData 使用CF_EMBEDDEDOBJECT或CF_EMBEDSOURCE剪贴板格式创建嵌入对象时,两者之间main区别在于缓存初始化数据的存储位置:

  • CF_EMBEDDEDOBJECT指示源是现有的嵌入对象。 它的缓存中已有相应的数据,OLE 使用此数据来初始化新对象的缓存。
  • CF_EMBEDSOURCE指示源数据对象包含CF_EMBEDSOURCE以外的格式的缓存初始化信息。 OleCreateFromData 使用这些来初始化新嵌入对象的缓存。
renderopt 值影响缓存初始化,如下所示。
说明
OLERENDER_DRAW & OLERENDER_FORMAT 如果要缓存的表示信息当前存在于相应的缓存初始化池中,则使用它。 (适当位置位于CF_EMBEDDEDOBJECT的源数据对象缓存中,在 CF_EMBEDSOURCE.) 源数据对象中的其他格式中,如果信息不存在,则缓存最初为空,但在首次运行对象时将填充。 没有其他格式缓存在新创建的对象中。
OLERENDER_NONE 不会在新创建的对象中缓存任何内容。 如果源采用CF_EMBEDDEDOBJECT格式,则会删除已复制的任何现有缓存数据。
OLERENDER_ASIS 如果源具有CF_EMBEDDEDOBJECT格式,则新对象的缓存将包含与源对象相同的缓存数据。 对于CF_EMBEDSOURCE,不会在新创建的对象中缓存任何内容。 此选项应由更复杂的容器使用。 在此调用后,此类容器将调用 IOleCache::CacheIOleCache::Uncache ,以准确设置要缓存的内容。 对于CF_EMBEDSOURCE,他们还将调用 IOleCache::InitCache

要求

要求
最低受支持的客户端 Windows 2000 Professional [仅限桌面应用]
最低受支持的服务器 Windows 2000 Server [仅限桌面应用]
目标平台 Windows
标头 ole2.h
Library Ole32.lib
DLL Ole32.dll
API 集 ext-ms-win-com-ole32-l1-1-3 (在 Windows 10 版本 10.0.10240 中引入)

另请参阅

IDataObject

OleCreate