数据传输接口

IDataObject 接口为数据使用者提供获取和设置对象数据的方法,确定对象支持的格式,并在对象中的数据发生更改时注册和接收通知。 获取数据时,调用方可以指定要在其中呈现数据的格式。 但是,数据源确定存储介质,该存储介质在调用方提供的 out 参数中返回。

IDataObject 提供了在应用程序中实现 Windows 剪贴板传输或复合文档传输所需的所有工具。 如果还希望支持拖放传输,则需要实现 IDropSourceIDropTarget 接口以及 IDataObject

IDataObject 接口与 OLE 剪贴板 API 相结合,可提供 Windows 剪贴板 API 的所有功能。 通常不需要同时使用这两个剪贴板 API。 支持拖放传输或 OLE 复合文档的数据供应商必须实现 IDataObject 接口。 如果应用程序现在仅支持剪贴板传输,但你打算在更高版本中添加拖放文档或复合文档,则你可能希望立即实现 IDataObject 和 OLE 剪贴板 API,以最大程度地减少稍后重新编码和调试所用的时间。 你可能还想要实现 IDataObject,以便利用除全局内存以外的传输媒体。

下表总结了要使用的数据传输类型,具体取决于要支持的数据传输类型:

支持
复合文档
IDataObject
拖放传输
IDataObjectIDropSourceIDropTargetDoDragDrop(或等效项)
以独占方式使用全局内存的剪贴板传输
剪贴板 API
使用全局内存以外的交换介质进行剪贴板传输。
IDataObject
剪贴板现在传输,但稍后拖放或复合文档
IDataObject 以及上面列出的接口和函数,用于“拖放传输”

当用户启动数据传输作时,源应用程序将创建 IDataObject 的实例,并通过它将数据以一个或多个格式提供。 在剪贴板传输中,应用程序调用 OleSetClipboard 函数,以向 OLE 传递数据对象指针。 (OleSetClipboard 还为 OLE 版本 1 和非 OLE 应用程序提供标准剪贴板数据格式。在拖放传输中,应用程序改为调用 DoDragDrop 函数。

在传输的接收端,目标接收 IDataObject 指针作为调用 IDropTarget::D rop 的参数,或通过调用 OleSetClipboard 函数,具体取决于传输是通过拖放还是剪贴板。 获取此指针后,目标调用 IDataObject::EnumFormatEtc,了解哪些格式可用于检索,以及可以获取的媒体类型。 通过此信息,接收应用程序通过调用 IDataObject::GetData请求数据。

数据传输