数据传输接口

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

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

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

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

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

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

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

数据传输