数据对象和数据源:创建和析构

遵循该文章 数据对象和数据源 (OLE)声明,数据对象和数据源表示传输的两侧。 本文说明何时创建和销毁这些对象和源正确执行数据传输,包括:

  • 创建数据对象

  • 销毁的数据对象

  • 创建数据源

  • 销毁的数据源

创建数据对象

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

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

在拖放情况下,您不需要创建数据对象。 对现有数据对象的指针将传递到您的 OnDrop 功能。 此数据对象由结构创建的作为拖放操作过程中,将它还被销毁。 ,以便粘贴由另一个方法时,完成并不总是用例。 有关更多信息,请参见 销毁的数据对象。

如果应用程序执行粘贴或粘贴具体措施时,应创建 COleDataObject 对象并调用其 AttachClipboard 成员函数。 这会将数据对象与剪贴板上的数据。 您在粘贴功能可使用此数据对象。

有关了如何实现此方法的示例,请参见 " 是 MFC OLE 示例 OCLIENT的 MAINVIEW.CPP 文件的 DoPasteItem 功能。 OCLIENT 实现执行任何粘贴操作并调用从其 OnDropOnPasteOnPasteLink 功能的 DoPasteItem 的函数。 由于 OnDrop 有一个指向该数据对象传递给,它通过指向 DoPasteItemOnPasteOnPasteLink 通过 NULL 此参数,调用 DoPasteItem 创建数据对象并将其附加到剪贴板。 此模式将代码粘贴,因此必须只调试它在一个位置,但是,您可以为和粘贴操作仍使用它。

销毁的数据对象

如果您按照 创建数据对象描述的模式,毁坏数据对象是数据传输的一个重要方面。 在您的粘贴功能创建的数据对象将 MFC 销毁,则粘贴函数返回。

如果您遵循处理粘贴操作另一个方法,请确定毁坏数据对象,在您的操作完成后。 直到毁坏数据对象,将无法才能所有应用程序能够成功将数据复制到剪贴板。

创建数据源

数据源的数据传输的源使用,可以是客户端或数据传输的服务器端。 在源应用程序的数据源是连接的一端源应用程序和用途应用之间的。 在目标应用的数据对象用于将与数据源的数据进行交互。

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

  1. 用户选择某些数据。

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

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

  4. 选定的数据。 COleDataSource::CacheDataCOleDataSource::DelayRenderData 组中插入到数据源中调用一个函数。

  5. 应用程序调用,如果这是拖放操作) 属于对象的 SetClipboard 成员函数 (或 DoDragDrop 成员函数创建在步骤。

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

此方案由 MFC OLE 示例 OCLIENTHIERSVR实现。 查看数据源为每个应用程序的 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)