数据对象和数据源:创建和销毁

按照文章 数据对象与数据源 (OLE)说明,数据对象和数据源表示数据传输的两侧。 本文说明何时创建和销毁这些对象与源正确实现数据传输,包括:

  • 创建数据对象

  • 销毁数据对象

  • 创建数据源

  • 销毁的数据源

创建数据对象

目的使用应用数据对象 - 客户端或服务器。 在目标应用的数据对象是连接的源端应用程序和之间目的应用的。 在目标应用的数据对象用于在数据源中数据访问并与之交互。

具有数据对象需要的两种常见的情况。 第一种情况是使用拖放,数据在应用程序删除。 第二种情况是将特定或粘贴从"编辑"菜单中选择。

在拖放一种情况下,您不需要创建数据对象。 为现有的数据对象的指针将传递给 OnDrop 函数。 此数据对象由框架创建作为拖放操作一部分,而且由它还被销毁。 在将由另一方法时,您的完成并非总是它。 有关更多信息,请参见 销毁的数据对象。

如果应用程序执行粘贴或粘贴特殊操作,应该创建 COleDataObject 对象并调用它的 AttachClipboard 成员函数。 这会将数据对象与剪贴板上的数据。 在函数粘贴可使用此数据对象。

有关如何实现此方法的示例。,请参见在是 MFC OLE 示例 OCLIENT的 MAINVIEW.CPP 文件中的 DoPasteItem 函数。 OCLIENT 实现执行粘贴任何操作并从其 OnDropOnPasteOnPasteLink 函数的 DoPasteItem 的函数。 由于 OnDrop 包含一个指向该数据的对象传递给,该指针传递到 DoPasteItemOnPasteOnPasteLinkNULL 传递此参数的,调用 DoPasteItem 创建一个数据对象的并附加到剪贴板。 此方案将粘贴代码,因此您必须只调试它在一个地方,但您可以对两粘贴操作仍使用它。

销毁数据对象

如果您按照 创建对象数据中描述的方案,销毁数据对象是数据传输常用的特性。 在函数粘贴创建的数据对象将由 MFC 销毁,以便粘贴函数返回。

如果您遵守处理粘贴操作其他方法,请确定毁坏数据对象,然后粘贴操作完成后。 在销毁对象数据,则将无法对所有应用程序成功将数据复制到剪贴板。

创建数据源

数据源。数据传输的源使用,可以为客户端或服务器端数据传输。 在目标应用的数据对象是连接的源端应用程序和之间目的应用的。 在目标应用的数据对象用于在数据源中数据访问并与之交互。

当应用程序需要将数据复制到剪贴板时,创建数据源。 一个典型方案运行如下:

  1. 用户选择某数据。

  2. 用户从 编辑 菜单中选择 复制 (或 剪切) 或开始拖放操作。

  3. 根据程序的设计,应用程序创建 COleDataSource 对象或对象从 COleDataSource派生的类。

  4. 选择中的数据将在 COleDataSource::CacheDataCOleDataSource::DelayRenderData 组中插入数据源通过调用函数之一。

  5. 应用程序调用是否拖放操作) 属于对象的 SetClipboard 成员函数 (或 DoDragDrop 成员函数中。这会在步骤 3。

  6. 如果这是 剪切 操作或 DoDragDrop 返回 DROPEFFECT_MOVE,则选择数据的步骤 1。文档删除。

此方案将由 MFC OLE 示例 OCLIENT HIERSVR和实现。 查看源。每应用程序的 CView) 所有,但 GetClipboardDataOnGetClipboardData 函数的派生类。 这两个函数。COleClientItemCOleServerItem派生的类实现。 这些示例应用程序提供一种很好的示例。如何实现这些概念。

您可能需要创建其他 COleDataSource 对象的一种情况时,如果修改拖放操作的默认行为。 有关更多信息,请参见 拖放:自定义 文章。

销毁的数据源

必须由应用程序负责其销毁当前数据源。 在渐进数据源指向 OLE,如调用 COleDataSource::DoDragDrop的情况下,需要调用 pDataSrc-InternalRelease>。 例如:

void CMyListView::OnLvnBegindrag(NMHDR *pNMHDR, LRESULT *pResult)
{
   UNREFERENCED_PARAMETER(pResult);

   LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);

   CMyDataSource* pDataSrc = new CMyDataSource();
   if (NULL != pDataSrc)
   {
      pDataSrc->Initialize(pNMLV, this);
      pDataSrc->DelayRenderData(
         (CLIPFORMAT)RegisterClipboardFormat(_T("TIGroupFiles")));
      pDataSrc->DoDragDrop();
      pDataSrc->InternalRelease();
   }
}

如果您未提供数据源指向 OLE,则就得销毁它,与典型的 C++ 对象。

有关更多信息,请参见、拖放剪贴板操作数据和对象数据源

请参见

参考

COleDataObject 类

COleDataSource 类

概念

数据对象和数据源 (OLE)