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 只能创建静态对象。 |
|
没有可接受的格式可用于创建对象。 |
注解
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) 的接口标识符,以确定是否已创建链接对象。
使用 renderopt 和 pFormatetc 参数控制新创建对象的缓存功能。 有关使用这些参数的交互来确定要缓存的内容的一般信息,请参阅 OLERENDER 枚举。 但是,这些参数对 OleCreateFromData 初始化缓存的方式有一些其他特定影响。
当 OleCreateFromData 使用CF_EMBEDDEDOBJECT或CF_EMBEDSOURCE剪贴板格式创建嵌入对象时,两者之间main区别在于缓存初始化数据的存储位置:
- CF_EMBEDDEDOBJECT指示源是现有的嵌入对象。 它的缓存中已有相应的数据,OLE 使用此数据来初始化新对象的缓存。
- CF_EMBEDSOURCE指示源数据对象包含CF_EMBEDSOURCE以外的格式的缓存初始化信息。 OleCreateFromData 使用这些来初始化新嵌入对象的缓存。
值 | 说明 |
---|---|
OLERENDER_DRAW & OLERENDER_FORMAT | 如果要缓存的表示信息当前存在于相应的缓存初始化池中,则使用它。 (适当位置位于CF_EMBEDDEDOBJECT的源数据对象缓存中,在 CF_EMBEDSOURCE.) 源数据对象中的其他格式中,如果信息不存在,则缓存最初为空,但在首次运行对象时将填充。 没有其他格式缓存在新创建的对象中。 |
OLERENDER_NONE | 不会在新创建的对象中缓存任何内容。 如果源采用CF_EMBEDDEDOBJECT格式,则会删除已复制的任何现有缓存数据。 |
OLERENDER_ASIS | 如果源具有CF_EMBEDDEDOBJECT格式,则新对象的缓存将包含与源对象相同的缓存数据。 对于CF_EMBEDSOURCE,不会在新创建的对象中缓存任何内容。 此选项应由更复杂的容器使用。 在此调用后,此类容器将调用 IOleCache::Cache 和 IOleCache::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 中引入) |